am ace8addc: am 2edd6826: Create a new ImeOption that disables fullscreen in landscape, and use it.
Merge commit 'ace8addce47efc03be5038eef48d7fb066b14aae'
* commit 'ace8addce47efc03be5038eef48d7fb066b14aae':
Create a new ImeOption that disables fullscreen in landscape, and use it.
diff --git a/Android.mk b/Android.mk
index f9cf6dd..ded8173 100644
--- a/Android.mk
+++ b/Android.mk
@@ -165,7 +165,6 @@
telephony/java/com/android/internal/telephony/IExtendedNetworkService.aidl \
vpn/java/android/net/vpn/IVpnService.aidl \
-LOCAL_SRC_FILES += core/java/android/content/EventLogTags.logtags
# FRAMEWORKS_BASE_JAVA_SRC_DIRS comes from build/core/pathmap.mk
LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)
@@ -351,6 +350,7 @@
-since ./frameworks/base/api/4.xml 4 \
-since ./frameworks/base/api/5.xml 5 \
-since ./frameworks/base/api/6.xml 6 \
+ -since ./frameworks/base/api/7.xml 7 \
-error 1 -error 2 -warning 3 -error 4 -error 6 -error 8 \
-overview $(LOCAL_PATH)/core/java/overview.html
@@ -361,33 +361,33 @@
web_docs_sample_code_flags := \
-hdf android.hasSamples 1 \
-samplecode $(sample_dir)/ApiDemos \
- guide/samples/ApiDemos "API Demos" \
- -samplecode $(sample_dir)/BluetoothChat \
- guide/samples/BluetoothChat "Bluetooth Chat" \
- -samplecode $(sample_dir)/ContactManager \
- guide/samples/ContactManager "Contact Manager" \
+ resources/samples/ApiDemos "API Demos" \
+ -samplecode $(sample_dir)/BluetoothChat \
+ resources/samples/BluetoothChat "Bluetooth Chat" \
+ -samplecode $(sample_dir)/BusinessCard \
+ resources/samples/BusinessCard "Business Card" \
+ -samplecode $(sample_dir)/ContactManager \
+ resources/samples/ContactManager "Contact Manager" \
-samplecode $(sample_dir)/Home \
- guide/samples/Home "Home" \
+ resources/samples/Home "Home" \
-samplecode $(sample_dir)/JetBoy \
- guide/samples/JetBoy "JetBoy" \
+ resources/samples/JetBoy "JetBoy" \
-samplecode $(sample_dir)/LunarLander \
- guide/samples/LunarLander "Lunar Lander" \
- -samplecode $(sample_dir)/MultiResolution \
- guide/samples/MultiResolution "Multiple Resolutions" \
+ resources/samples/LunarLander "Lunar Lander" \
+ -samplecode $(sample_dir)/MultiResolution \
+ resources/samples/MultiResolution "Multiple Resolutions" \
-samplecode $(sample_dir)/NotePad \
- guide/samples/NotePad "Note Pad" \
+ resources/samples/NotePad "Note Pad" \
-samplecode $(sample_dir)/SearchableDictionary \
- guide/samples/SearchableDictionary "Searchable Dictionary" \
+ resources/samples/SearchableDictionary "Searchable Dictionary" \
-samplecode $(sample_dir)/Snake \
- guide/samples/Snake "Snake" \
+ resources/samples/Snake "Snake" \
-samplecode $(sample_dir)/SoftKeyboard \
- guide/samples/SoftKeyboard "Soft Keyboard" \
- -samplecode $(sample_dir)/Wiktionary \
- guide/samples/Wiktionary "Wiktionary" \
- -samplecode $(sample_dir)/WiktionarySimple \
- guide/samples/WiktionarySimple "Wiktionary (Simplified)"
-
-
+ resources/samples/SoftKeyboard "Soft Keyboard" \
+ -samplecode $(sample_dir)/Wiktionary \
+ resources/samples/Wiktionary "Wiktionary" \
+ -samplecode $(sample_dir)/WiktionarySimple \
+ resources/samples/WiktionarySimple "Wiktionary (Simplified)"
## SDK version identifiers used in the published docs
# major[.minor] version for current SDK. (full releases only)
diff --git a/api/5.xml b/api/5.xml
index 73df0cb..7fddcfb 100644
--- a/api/5.xml
+++ b/api/5.xml
@@ -231049,21 +231049,6 @@
visibility="protected"
>
</method>
-<method name="getOption"
- return="java.lang.Object"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="optID" type="int">
-</parameter>
-<exception name="SocketException" type="java.net.SocketException">
-</exception>
-</method>
<method name="getTTL"
return="byte"
abstract="true"
@@ -231214,23 +231199,6 @@
<exception name="IOException" type="java.io.IOException">
</exception>
</method>
-<method name="setOption"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="optID" type="int">
-</parameter>
-<parameter name="val" type="java.lang.Object">
-</parameter>
-<exception name="SocketException" type="java.net.SocketException">
-</exception>
-</method>
<method name="setTTL"
return="void"
abstract="true"
@@ -300580,8 +300548,6 @@
</parameter>
<parameter name="replacement" type="java.lang.String">
</parameter>
-<exception name="IllegalStateException" type="java.lang.IllegalStateException">
-</exception>
</method>
<method name="appendTail"
return="java.lang.StringBuffer"
@@ -300881,8 +300847,6 @@
>
<parameter name="group" type="int">
</parameter>
-<exception name="IllegalStateException" type="java.lang.IllegalStateException">
-</exception>
</method>
<method name="toMatchResult"
return="java.util.regex.MatchResult"
@@ -300957,8 +300921,6 @@
>
<parameter name="pattern" type="java.lang.String">
</parameter>
-<exception name="PatternSyntaxException" type="java.util.regex.PatternSyntaxException">
-</exception>
</method>
<method name="compile"
return="java.util.regex.Pattern"
diff --git a/api/current.xml b/api/current.xml
index a367f2e..92540b1 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -34,6 +34,17 @@
visibility="public"
>
</constructor>
+<field name="ACCESS_CACHE_FILESYSTEM"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.permission.ACCESS_CACHE_FILESYSTEM""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="ACCESS_CHECKIN_PROPERTIES"
type="java.lang.String"
transient="false"
@@ -595,6 +606,17 @@
visibility="public"
>
</field>
+<field name="KILL_BACKGROUND_PROCESSES"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.permission.KILL_BACKGROUND_PROCESSES""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="MANAGE_ACCOUNTS"
type="java.lang.String"
transient="false"
@@ -899,7 +921,7 @@
value=""android.permission.RESTART_PACKAGES""
static="true"
final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</field>
@@ -3140,7 +3162,7 @@
value="16843395"
static="true"
final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</field>
@@ -3217,7 +3239,7 @@
value="16843362"
static="true"
final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</field>
@@ -5087,7 +5109,7 @@
value="16842997"
static="true"
final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</field>
@@ -5208,7 +5230,7 @@
value="16842996"
static="true"
final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
</field>
@@ -5685,6 +5707,17 @@
visibility="public"
>
</field>
+<field name="neverEncrypt"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843447"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="nextFocusDown"
type="int"
transient="false"
@@ -17523,7 +17556,7 @@
<exception name="SecurityException" type="java.lang.SecurityException">
</exception>
</method>
-<method name="restartPackage"
+<method name="killBackgroundProcesses"
return="void"
abstract="false"
native="false"
@@ -17536,6 +17569,19 @@
<parameter name="packageName" type="java.lang.String">
</parameter>
</method>
+<method name="restartPackage"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+<parameter name="packageName" type="java.lang.String">
+</parameter>
+</method>
<field name="RECENT_WITH_EXCLUDED"
type="int"
transient="false"
@@ -17807,6 +17853,16 @@
visibility="public"
>
</field>
+<field name="stackTrace"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="tag"
type="java.lang.String"
transient="false"
@@ -23683,6 +23739,19 @@
</implements>
<implements name="android.content.DialogInterface.OnDismissListener">
</implements>
+<method name="getSearchableInfo"
+ return="android.app.SearchableInfo"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="componentName" type="android.content.ComponentName">
+</parameter>
+</method>
<method name="getSearchablesInGlobalSearch"
return="java.util.List<android.app.SearchableInfo>"
abstract="false"
@@ -23861,6 +23930,17 @@
visibility="public"
>
</field>
+<field name="INTENT_ACTION_SELECT_SEARCH_SOURCE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.action.SELECT_SEARCH_SOURCE""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="INTENT_ACTION_WEB_SEARCH_SETTINGS"
type="java.lang.String"
transient="false"
@@ -34044,6 +34124,8 @@
deprecated="not deprecated"
visibility="public"
>
+<implements name="java.lang.Cloneable">
+</implements>
<implements name="android.os.Parcelable">
</implements>
<constructor name="Intent"
@@ -74845,6 +74927,75 @@
</exception>
</method>
</class>
+<class name="GeocoderParams"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.os.Parcelable">
+</implements>
+<method name="describeContents"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getClientPackage"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getLocale"
+ return="java.util.Locale"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="writeToParcel"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="parcel" 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>
+</class>
<class name="GpsSatellite"
extends="java.lang.Object"
abstract="false"
@@ -75861,6 +76012,32 @@
<parameter name="enabledOnly" type="boolean">
</parameter>
</method>
+<method name="installGeocodeProvider"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="provider" type="android.location.LocationManager.GeocodeProvider">
+</parameter>
+</method>
+<method name="installLocationProvider"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="provider" type="android.location.LocationProviderImpl">
+</parameter>
+</method>
<method name="isProviderEnabled"
return="boolean"
abstract="false"
@@ -75952,6 +76129,19 @@
<parameter name="intent" type="android.app.PendingIntent">
</parameter>
</method>
+<method name="reportLocation"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="location" type="android.location.Location">
+</parameter>
+</method>
<method name="requestLocationUpdates"
return="void"
abstract="false"
@@ -76144,6 +76334,62 @@
>
</field>
</class>
+<interface name="LocationManager.GeocodeProvider"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="getFromLocation"
+ return="java.lang.String"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="latitude" type="double">
+</parameter>
+<parameter name="longitude" type="double">
+</parameter>
+<parameter name="maxResults" type="int">
+</parameter>
+<parameter name="params" type="android.location.GeocoderParams">
+</parameter>
+<parameter name="addrs" type="java.util.List<android.location.Address>">
+</parameter>
+</method>
+<method name="getFromLocationName"
+ return="java.lang.String"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="locationName" type="java.lang.String">
+</parameter>
+<parameter name="lowerLeftLatitude" type="double">
+</parameter>
+<parameter name="lowerLeftLongitude" type="double">
+</parameter>
+<parameter name="upperRightLatitude" type="double">
+</parameter>
+<parameter name="upperRightLongitude" type="double">
+</parameter>
+<parameter name="maxResults" type="int">
+</parameter>
+<parameter name="params" type="android.location.GeocoderParams">
+</parameter>
+<parameter name="addrs" type="java.util.List<android.location.Address>">
+</parameter>
+</method>
+</interface>
<class name="LocationProvider"
extends="java.lang.Object"
abstract="true"
@@ -76309,6 +76555,177 @@
>
</field>
</class>
+<class name="LocationProviderImpl"
+ extends="android.location.LocationProvider"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="LocationProviderImpl"
+ type="android.location.LocationProviderImpl"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</constructor>
+<method name="addListener"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="uid" type="int">
+</parameter>
+</method>
+<method name="disable"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="enable"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="enableLocationTracking"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enable" type="boolean">
+</parameter>
+</method>
+<method name="getStatus"
+ return="int"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="extras" type="android.os.Bundle">
+</parameter>
+</method>
+<method name="getStatusUpdateTime"
+ return="long"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isEnabled"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeListener"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="uid" type="int">
+</parameter>
+</method>
+<method name="sendExtraCommand"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="command" type="java.lang.String">
+</parameter>
+<parameter name="extras" type="android.os.Bundle">
+</parameter>
+</method>
+<method name="setMinTime"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="minTime" type="long">
+</parameter>
+</method>
+<method name="updateLocation"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="location" type="android.location.Location">
+</parameter>
+</method>
+<method name="updateNetworkState"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="state" type="int">
+</parameter>
+<parameter name="info" type="android.net.NetworkInfo">
+</parameter>
+</method>
+</class>
</package>
<package name="android.media"
>
@@ -88155,6 +88572,401 @@
</package>
<package name="android.opengl"
>
+<class name="ETC1"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="ETC1"
+ type="android.opengl.ETC1"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="decodeBlock"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="in" type="java.nio.Buffer">
+</parameter>
+<parameter name="out" type="java.nio.Buffer">
+</parameter>
+</method>
+<method name="decodeImage"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="in" type="java.nio.Buffer">
+</parameter>
+<parameter name="out" type="java.nio.Buffer">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="pixelSize" type="int">
+</parameter>
+<parameter name="stride" type="int">
+</parameter>
+</method>
+<method name="encodeBlock"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="in" type="java.nio.Buffer">
+</parameter>
+<parameter name="validPixelMask" type="int">
+</parameter>
+<parameter name="out" type="java.nio.Buffer">
+</parameter>
+</method>
+<method name="encodeImage"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="in" type="java.nio.Buffer">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="pixelSize" type="int">
+</parameter>
+<parameter name="stride" type="int">
+</parameter>
+<parameter name="out" type="java.nio.Buffer">
+</parameter>
+</method>
+<method name="formatHeader"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="header" type="java.nio.Buffer">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+</method>
+<method name="getEncodedDataSize"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+</method>
+<method name="getHeight"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="header" type="java.nio.Buffer">
+</parameter>
+</method>
+<method name="getWidth"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="header" type="java.nio.Buffer">
+</parameter>
+</method>
+<method name="isValid"
+ return="boolean"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="header" type="java.nio.Buffer">
+</parameter>
+</method>
+<field name="DECODED_BLOCK_SIZE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="48"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ENCODED_BLOCK_SIZE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="8"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ETC1_RGB8_OES"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="36196"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ETC_PKM_HEADER_SIZE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="ETC1Util"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="ETC1Util"
+ type="android.opengl.ETC1Util"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="compressTexture"
+ return="android.opengl.ETC1Util.ETC1Texture"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="input" type="java.nio.Buffer">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="pixelSize" type="int">
+</parameter>
+<parameter name="stride" type="int">
+</parameter>
+</method>
+<method name="createTexture"
+ return="android.opengl.ETC1Util.ETC1Texture"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="input" type="java.io.InputStream">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="isETC1Supported"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="loadTexture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="target" type="int">
+</parameter>
+<parameter name="level" type="int">
+</parameter>
+<parameter name="border" type="int">
+</parameter>
+<parameter name="fallbackFormat" type="int">
+</parameter>
+<parameter name="fallbackType" type="int">
+</parameter>
+<parameter name="input" type="java.io.InputStream">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="loadTexture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="target" type="int">
+</parameter>
+<parameter name="level" type="int">
+</parameter>
+<parameter name="border" type="int">
+</parameter>
+<parameter name="fallbackFormat" type="int">
+</parameter>
+<parameter name="fallbackType" type="int">
+</parameter>
+<parameter name="texture" type="android.opengl.ETC1Util.ETC1Texture">
+</parameter>
+</method>
+<method name="writeTexture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="texture" type="android.opengl.ETC1Util.ETC1Texture">
+</parameter>
+<parameter name="output" type="java.io.OutputStream">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+</class>
+<class name="ETC1Util.ETC1Texture"
+ extends="java.lang.Object"
+ abstract="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="ETC1Util.ETC1Texture"
+ type="android.opengl.ETC1Util.ETC1Texture"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="data" type="java.nio.ByteBuffer">
+</parameter>
+</constructor>
+<method name="getData"
+ return="java.nio.ByteBuffer"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getHeight"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getWidth"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+</class>
<class name="GLDebugHelper"
extends="java.lang.Object"
abstract="false"
@@ -107356,6 +108168,16 @@
visibility="public"
>
</field>
+<field name="CPU_ABI2"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="DEVICE"
type="java.lang.String"
transient="false"
@@ -107466,6 +108288,17 @@
visibility="public"
>
</field>
+<field name="UNKNOWN"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""unknown""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="USER"
type="java.lang.String"
transient="false"
@@ -114598,6 +115431,97 @@
>
</field>
</class>
+<class name="RecoverySystem"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="RecoverySystem"
+ type="android.os.RecoverySystem"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="installPackage"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="packageFile" type="java.io.File">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="rebootWipeUserData"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="verifyPackage"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="packageFile" type="java.io.File">
+</parameter>
+<parameter name="listener" type="android.os.RecoverySystem.ProgressListener">
+</parameter>
+<parameter name="deviceCertsZipFile" type="java.io.File">
+</parameter>
+<exception name="GeneralSecurityException" type="java.security.GeneralSecurityException">
+</exception>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+</class>
+<interface name="RecoverySystem.ProgressListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onProgress"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="progress" type="int">
+</parameter>
+</method>
+</interface>
<class name="RemoteCallbackList"
extends="java.lang.Object"
abstract="false"
@@ -126032,6 +126956,17 @@
visibility="public"
>
</field>
+<field name="EXTRA_DURATION_LIMIT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.durationLimit""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_FINISH_ON_COMPLETION"
type="java.lang.String"
transient="false"
@@ -126043,6 +126978,17 @@
visibility="public"
>
</field>
+<field name="EXTRA_FULL_SCREEN"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.fullScreen""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_MEDIA_ALBUM"
type="java.lang.String"
transient="false"
@@ -126109,6 +127055,28 @@
visibility="public"
>
</field>
+<field name="EXTRA_SHOW_ACTION_ICONS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.showActionIcons""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_SIZE_LIMIT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.sizeLimit""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_VIDEO_QUALITY"
type="java.lang.String"
transient="false"
@@ -126164,6 +127132,17 @@
visibility="public"
>
</field>
+<field name="UNKNOWN_STRING"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""<unknown>""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<class name="MediaStore.Audio"
extends="java.lang.Object"
@@ -126648,6 +127627,17 @@
visibility="public"
>
</field>
+<field name="BOOKMARK"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""bookmark""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="COMPOSER"
type="java.lang.String"
transient="false"
@@ -126703,6 +127693,17 @@
visibility="public"
>
</field>
+<field name="IS_PODCAST"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""is_podcast""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="IS_RINGTONE"
type="java.lang.String"
transient="false"
@@ -127161,6 +128162,25 @@
<parameter name="playlistId" type="long">
</parameter>
</method>
+<method name="moveItem"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="res" type="android.content.ContentResolver">
+</parameter>
+<parameter name="playlistId" type="long">
+</parameter>
+<parameter name="from" type="int">
+</parameter>
+<parameter name="to" type="int">
+</parameter>
+</method>
<field name="AUDIO_ID"
type="java.lang.String"
transient="false"
@@ -132572,6 +133592,19 @@
<parameter name="params" type="java.util.HashMap<java.lang.String, java.lang.String>">
</parameter>
</method>
+<method name="setEngineByPackageName"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enginePackageName" type="java.lang.String">
+</parameter>
+</method>
<method name="setLanguage"
return="int"
abstract="false"
@@ -156777,7 +157810,7 @@
>
</field>
</class>
-<class name="EventLogTags"
+<class name="EventLog"
extends="java.lang.Object"
abstract="false"
static="false"
@@ -156785,6 +157818,190 @@
deprecated="not deprecated"
visibility="public"
>
+<constructor name="EventLog"
+ type="android.util.EventLog"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="getTagCode"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
+<method name="getTagName"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="int">
+</parameter>
+</method>
+<method name="readEvents"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tags" type="int[]">
+</parameter>
+<parameter name="output" type="java.util.Collection<android.util.EventLog.Event>">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="writeEvent"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="int">
+</parameter>
+<parameter name="value" type="int">
+</parameter>
+</method>
+<method name="writeEvent"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="int">
+</parameter>
+<parameter name="value" type="long">
+</parameter>
+</method>
+<method name="writeEvent"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="int">
+</parameter>
+<parameter name="str" type="java.lang.String">
+</parameter>
+</method>
+<method name="writeEvent"
+ return="int"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="int">
+</parameter>
+<parameter name="list" type="java.lang.Object...">
+</parameter>
+</method>
+</class>
+<class name="EventLog.Event"
+ extends="java.lang.Object"
+ abstract="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="getData"
+ return="java.lang.Object"
+ abstract="false"
+ native="false"
+ synchronized="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getProcessId"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getTag"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getThreadId"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getTimeNanos"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+</class>
+<class name="EventLogTags"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
<constructor name="EventLogTags"
type="android.util.EventLogTags"
static="false"
@@ -157165,6 +158382,53 @@
<parameter name="tr" type="java.lang.Throwable">
</parameter>
</method>
+<method name="wtf"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="java.lang.String">
+</parameter>
+<parameter name="msg" type="java.lang.String">
+</parameter>
+</method>
+<method name="wtf"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="java.lang.String">
+</parameter>
+<parameter name="tr" type="java.lang.Throwable">
+</parameter>
+</method>
+<method name="wtf"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="tag" type="java.lang.String">
+</parameter>
+<parameter name="msg" type="java.lang.String">
+</parameter>
+<parameter name="tr" type="java.lang.Throwable">
+</parameter>
+</method>
<field name="ASSERT"
type="int"
transient="false"
@@ -172800,6 +174064,17 @@
value="-1"
static="true"
final="true"
+ deprecated="deprecated"
+ visibility="public"
+>
+</field>
+<field name="MATCH_PARENT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-1"
+ static="true"
+ final="true"
deprecated="not deprecated"
visibility="public"
>
@@ -186788,6 +188063,17 @@
<parameter name="response" type="android.os.Message">
</parameter>
</method>
+<method name="emulateShiftHeld"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="enablePlatformNotifications"
return="void"
abstract="false"
@@ -187958,7 +189244,7 @@
synchronized="false"
static="false"
final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
visibility="public"
>
<parameter name="view" type="android.webkit.WebView">
@@ -199245,6 +200531,23 @@
<parameter name="value" type="boolean">
</parameter>
</method>
+<method name="setBundle"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="viewId" type="int">
+</parameter>
+<parameter name="methodName" type="java.lang.String">
+</parameter>
+<parameter name="value" type="android.os.Bundle">
+</parameter>
+</method>
<method name="setByte"
return="void"
abstract="false"
@@ -206769,6 +208072,17 @@
visibility="public"
>
</field>
+<field name="OP_BREAKPOINT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="236"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="OP_CHECK_CAST"
type="int"
transient="false"
@@ -207110,6 +208424,17 @@
visibility="public"
>
</field>
+<field name="OP_EXECUTE_INLINE_RANGE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="239"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="OP_FILLED_NEW_ARRAY"
type="int"
transient="false"
@@ -208837,6 +210162,17 @@
visibility="public"
>
</field>
+<field name="OP_THROW_VERIFICATION_ERROR"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="237"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="OP_USHR_INT"
type="int"
transient="false"
@@ -217553,7 +218889,7 @@
return="void"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -217581,7 +218917,7 @@
return="int"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -217648,7 +218984,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="stream" type="java.io.PipedReader">
+<parameter name="reader" type="java.io.PipedReader">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -218816,7 +220152,7 @@
</parameter>
<parameter name="offset" type="int">
</parameter>
-<parameter name="count" type="int">
+<parameter name="length" type="int">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -227766,7 +229102,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="value" type="int">
+<parameter name="i" type="int">
</parameter>
</method>
<method name="toString"
@@ -228015,7 +229351,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="compareTo"
@@ -228121,7 +229457,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="intValue"
@@ -228156,7 +229492,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="numberOfLeadingZeros"
@@ -228169,7 +229505,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="numberOfTrailingZeros"
@@ -228182,7 +229518,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="parseLong"
@@ -228227,7 +229563,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="reverseBytes"
@@ -228240,7 +229576,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="rotateLeft"
@@ -228253,7 +229589,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
<parameter name="distance" type="int">
</parameter>
@@ -228268,7 +229604,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
<parameter name="distance" type="int">
</parameter>
@@ -228283,7 +229619,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="toBinaryString"
@@ -228296,7 +229632,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="l" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="toHexString"
@@ -228309,7 +229645,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="l" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="toOctalString"
@@ -228322,7 +229658,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="l" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<method name="toString"
@@ -228335,7 +229671,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="l" type="long">
+<parameter name="n" type="long">
</parameter>
</method>
<method name="toString"
@@ -228348,7 +229684,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="l" type="long">
+<parameter name="v" type="long">
</parameter>
<parameter name="radix" type="int">
</parameter>
@@ -228395,7 +229731,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="lng" type="long">
+<parameter name="v" type="long">
</parameter>
</method>
<field name="MAX_VALUE"
@@ -241778,21 +243114,6 @@
visibility="protected"
>
</method>
-<method name="getOption"
- return="java.lang.Object"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="optID" type="int">
-</parameter>
-<exception name="SocketException" type="java.net.SocketException">
-</exception>
-</method>
<method name="getTTL"
return="byte"
abstract="true"
@@ -241943,23 +243264,6 @@
<exception name="IOException" type="java.io.IOException">
</exception>
</method>
-<method name="setOption"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="optID" type="int">
-</parameter>
-<parameter name="val" type="java.lang.Object">
-</parameter>
-<exception name="SocketException" type="java.net.SocketException">
-</exception>
-</method>
<method name="setTTL"
return="void"
abstract="true"
@@ -245896,7 +247200,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="o" type="java.lang.Object">
+<parameter name="other" type="java.lang.Object">
</parameter>
</method>
<method name="getActions"
@@ -253530,7 +254834,7 @@
return="void"
abstract="false"
native="false"
- synchronized="true"
+ synchronized="false"
static="false"
final="true"
deprecated="not deprecated"
@@ -253763,8 +255067,6 @@
</parameter>
<parameter name="aliases" type="java.lang.String[]">
</parameter>
-<exception name="IllegalCharsetNameException" type="java.nio.charset.IllegalCharsetNameException">
-</exception>
</constructor>
<method name="aliases"
return="java.util.Set<java.lang.String>"
@@ -253877,7 +255179,7 @@
return="java.nio.ByteBuffer"
abstract="false"
native="false"
- synchronized="true"
+ synchronized="false"
static="false"
final="true"
deprecated="not deprecated"
@@ -253924,10 +255226,6 @@
>
<parameter name="charsetName" type="java.lang.String">
</parameter>
-<exception name="IllegalCharsetNameException" type="java.nio.charset.IllegalCharsetNameException">
-</exception>
-<exception name="UnsupportedCharsetException" type="java.nio.charset.UnsupportedCharsetException">
-</exception>
</method>
<method name="hashCode"
return="int"
@@ -253955,7 +255253,7 @@
return="boolean"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="true"
final="false"
deprecated="not deprecated"
@@ -253963,8 +255261,6 @@
>
<parameter name="charsetName" type="java.lang.String">
</parameter>
-<exception name="IllegalCharsetNameException" type="java.nio.charset.IllegalCharsetNameException">
-</exception>
</method>
<method name="name"
return="java.lang.String"
@@ -286065,8 +287361,6 @@
>
<implements name="java.lang.Cloneable">
</implements>
-<implements name="java.util.List">
-</implements>
<implements name="java.util.RandomAccess">
</implements>
<implements name="java.io.Serializable">
@@ -286078,6 +287372,8 @@
deprecated="not deprecated"
visibility="public"
>
+<parameter name="capacity" type="int">
+</parameter>
</constructor>
<constructor name="ArrayList"
type="java.util.ArrayList"
@@ -286086,8 +287382,6 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="capacity" type="int">
-</parameter>
</constructor>
<constructor name="ArrayList"
type="java.util.ArrayList"
@@ -286133,7 +287427,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="location" type="int">
+<parameter name="index" type="int">
</parameter>
</method>
<method name="size"
@@ -286282,7 +287576,7 @@
>
<parameter name="array" type="java.lang.Object[]">
</parameter>
-<parameter name="object" type="java.lang.Object">
+<parameter name="value" type="java.lang.Object">
</parameter>
</method>
<method name="binarySearch"
@@ -286297,7 +287591,7 @@
>
<parameter name="array" type="T[]">
</parameter>
-<parameter name="object" type="T">
+<parameter name="value" type="T">
</parameter>
<parameter name="comparator" type="java.util.Comparator<? super T>">
</parameter>
@@ -287106,6 +288400,36 @@
deprecated="not deprecated"
visibility="public"
>
+<parameter name="array" type="short[]">
+</parameter>
+</method>
+<method name="sort"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="array" type="short[]">
+</parameter>
+<parameter name="start" type="int">
+</parameter>
+<parameter name="end" type="int">
+</parameter>
+</method>
+<method name="sort"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
<parameter name="array" type="java.lang.Object[]">
</parameter>
</method>
@@ -287160,36 +288484,6 @@
<parameter name="comparator" type="java.util.Comparator<? super T>">
</parameter>
</method>
-<method name="sort"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="array" type="short[]">
-</parameter>
-</method>
-<method name="sort"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="array" type="short[]">
-</parameter>
-<parameter name="start" type="int">
-</parameter>
-<parameter name="end" type="int">
-</parameter>
-</method>
<method name="toString"
return="java.lang.String"
abstract="false"
@@ -291457,8 +292751,6 @@
>
<implements name="java.lang.Cloneable">
</implements>
-<implements name="java.util.Map">
-</implements>
<implements name="java.io.Serializable">
</implements>
<constructor name="HashMap"
@@ -308286,7 +309578,7 @@
return="void"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -311309,8 +312601,6 @@
</parameter>
<parameter name="replacement" type="java.lang.String">
</parameter>
-<exception name="IllegalStateException" type="java.lang.IllegalStateException">
-</exception>
</method>
<method name="appendTail"
return="java.lang.StringBuffer"
@@ -311335,22 +312625,11 @@
deprecated="not deprecated"
visibility="public"
>
-</method>
-<method name="end"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
<parameter name="group" type="int">
</parameter>
</method>
-<method name="find"
- return="boolean"
+<method name="end"
+ return="int"
abstract="false"
native="false"
synchronized="false"
@@ -311373,8 +312652,8 @@
<parameter name="start" type="int">
</parameter>
</method>
-<method name="group"
- return="java.lang.String"
+<method name="find"
+ return="boolean"
abstract="false"
native="false"
synchronized="false"
@@ -311397,6 +312676,17 @@
<parameter name="group" type="int">
</parameter>
</method>
+<method name="group"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="groupCount"
return="int"
abstract="false"
@@ -311571,6 +312861,8 @@
deprecated="not deprecated"
visibility="public"
>
+<parameter name="input" type="java.lang.CharSequence">
+</parameter>
</method>
<method name="reset"
return="java.util.regex.Matcher"
@@ -311582,21 +312874,6 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="input" type="java.lang.CharSequence">
-</parameter>
-</method>
-<method name="start"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="IllegalStateException" type="java.lang.IllegalStateException">
-</exception>
</method>
<method name="start"
return="int"
@@ -311613,6 +312890,17 @@
<exception name="IllegalStateException" type="java.lang.IllegalStateException">
</exception>
</method>
+<method name="start"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="toMatchResult"
return="java.util.regex.MatchResult"
abstract="false"
@@ -311686,6 +312974,8 @@
>
<parameter name="pattern" type="java.lang.String">
</parameter>
+<parameter name="flags" type="int">
+</parameter>
<exception name="PatternSyntaxException" type="java.util.regex.PatternSyntaxException">
</exception>
</method>
@@ -311701,10 +312991,6 @@
>
<parameter name="pattern" type="java.lang.String">
</parameter>
-<parameter name="flags" type="int">
-</parameter>
-<exception name="PatternSyntaxException" type="java.util.regex.PatternSyntaxException">
-</exception>
</method>
<method name="flags"
return="int"
@@ -311779,7 +313065,9 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="input" type="java.lang.CharSequence">
+<parameter name="inputSeq" type="java.lang.CharSequence">
+</parameter>
+<parameter name="limit" type="int">
</parameter>
</method>
<method name="split"
@@ -311792,9 +313080,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="inputSeq" type="java.lang.CharSequence">
-</parameter>
-<parameter name="limit" type="int">
+<parameter name="input" type="java.lang.CharSequence">
</parameter>
</method>
<field name="CANON_EQ"
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp
index 6419a5c..fae1f26 100644
--- a/camera/libcameraservice/CameraService.cpp
+++ b/camera/libcameraservice/CameraService.cpp
@@ -16,7 +16,6 @@
** limitations under the License.
*/
-//#define LOG_NDEBUG 0
#define LOG_TAG "CameraService"
#include <utils/Log.h>
@@ -95,7 +94,7 @@
sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient)
{
int callingPid = getCallingPid();
- LOGD("CameraService::connect E (pid %d, client %p)", callingPid,
+ LOGV("CameraService::connect E (pid %d, client %p)", callingPid,
cameraClient->asBinder().get());
Mutex::Autolock lock(mServiceLock);
@@ -106,30 +105,30 @@
sp<ICameraClient> currentCameraClient(currentClient->getCameraClient());
if (cameraClient->asBinder() == currentCameraClient->asBinder()) {
// This is the same client reconnecting...
- LOGD("CameraService::connect X (pid %d, same client %p) is reconnecting...",
+ LOGV("CameraService::connect X (pid %d, same client %p) is reconnecting...",
callingPid, cameraClient->asBinder().get());
return currentClient;
} else {
// It's another client... reject it
- LOGD("CameraService::connect X (pid %d, new client %p) rejected. "
+ LOGV("CameraService::connect X (pid %d, new client %p) rejected. "
"(old pid %d, old client %p)",
callingPid, cameraClient->asBinder().get(),
currentClient->mClientPid, currentCameraClient->asBinder().get());
if (kill(currentClient->mClientPid, 0) == -1 && errno == ESRCH) {
- LOGD("The old client is dead!");
+ LOGV("The old client is dead!");
}
return client;
}
} else {
// can't promote, the previous client has died...
- LOGD("New client (pid %d) connecting, old reference was dangling...",
+ LOGV("New client (pid %d) connecting, old reference was dangling...",
callingPid);
mClient.clear();
}
}
if (mUsers > 0) {
- LOGD("Still have client, rejected");
+ LOGV("Still have client, rejected");
return client;
}
@@ -141,7 +140,7 @@
// the refcount.
client->trackMe(true, true);
#endif
- LOGD("CameraService::connect X");
+ LOGV("CameraService::connect X");
return client;
}
@@ -157,7 +156,7 @@
if (mClient == 0) {
// This happens when we have already disconnected.
- LOGD("removeClient (pid %d): already disconnected", callingPid);
+ LOGV("removeClient (pid %d): already disconnected", callingPid);
return;
}
@@ -165,7 +164,7 @@
// Client::~Client() -> disconnect() -> removeClient().
client = mClient.promote();
if (client == 0) {
- LOGD("removeClient (pid %d): no more strong reference", callingPid);
+ LOGV("removeClient (pid %d): no more strong reference", callingPid);
mClient.clear();
return;
}
@@ -178,7 +177,7 @@
mClient.clear();
}
- LOGD("removeClient (pid %d) done", callingPid);
+ LOGV("removeClient (pid %d) done", callingPid);
}
// The reason we need this count is a new CameraService::connect() request may
@@ -212,7 +211,7 @@
const sp<ICameraClient>& cameraClient, pid_t clientPid)
{
int callingPid = getCallingPid();
- LOGD("Client::Client E (pid %d)", callingPid);
+ LOGV("Client::Client E (pid %d)", callingPid);
mCameraService = cameraService;
mCameraClient = cameraClient;
mClientPid = clientPid;
@@ -237,7 +236,7 @@
// Callback is disabled by default
mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
cameraService->incUsers();
- LOGD("Client::Client X (pid %d)", callingPid);
+ LOGV("Client::Client X (pid %d)", callingPid);
}
status_t CameraService::Client::checkPid()
@@ -253,7 +252,7 @@
status_t CameraService::Client::lock()
{
int callingPid = getCallingPid();
- LOGD("lock from pid %d (mClientPid %d)", callingPid, mClientPid);
+ LOGV("lock from pid %d (mClientPid %d)", callingPid, mClientPid);
Mutex::Autolock _l(mLock);
// lock camera to this client if the the camera is unlocked
if (mClientPid == 0) {
@@ -267,13 +266,13 @@
status_t CameraService::Client::unlock()
{
int callingPid = getCallingPid();
- LOGD("unlock from pid %d (mClientPid %d)", callingPid, mClientPid);
+ LOGV("unlock from pid %d (mClientPid %d)", callingPid, mClientPid);
Mutex::Autolock _l(mLock);
// allow anyone to use camera
status_t result = checkPid();
if (result == NO_ERROR) {
mClientPid = 0;
- LOGD("clear mCameraClient (pid %d)", callingPid);
+ LOGV("clear mCameraClient (pid %d)", callingPid);
// we need to remove the reference so that when app goes
// away, the reference count goes to 0.
mCameraClient.clear();
@@ -286,7 +285,7 @@
int callingPid = getCallingPid();
// connect a new process to the camera
- LOGD("Client::connect E (pid %d, client %p)", callingPid, client->asBinder().get());
+ LOGV("Client::connect E (pid %d, client %p)", callingPid, client->asBinder().get());
// I hate this hack, but things get really ugly when the media recorder
// service is handing back the camera to the app. The ICameraClient
@@ -310,14 +309,14 @@
// did the client actually change?
if ((mCameraClient != NULL) && (client->asBinder() == mCameraClient->asBinder())) {
- LOGD("Connect to the same client");
+ LOGV("Connect to the same client");
return NO_ERROR;
}
mCameraClient = client;
mClientPid = -1;
mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
- LOGD("Connect to the new client (pid %d, client %p)",
+ LOGV("Connect to the new client (pid %d, client %p)",
callingPid, mCameraClient->asBinder().get());
}
@@ -344,7 +343,7 @@
int callingPid = getCallingPid();
// tear down client
- LOGD("Client::~Client E (pid %d, client %p)",
+ LOGV("Client::~Client E (pid %d, client %p)",
callingPid, getCameraClient()->asBinder().get());
if (mSurface != 0 && !mUseOverlay) {
#if HAVE_ANDROID_OS
@@ -373,23 +372,23 @@
// make sure we tear down the hardware
mClientPid = callingPid;
disconnect();
- LOGD("Client::~Client X (pid %d)", mClientPid);
+ LOGV("Client::~Client X (pid %d)", mClientPid);
}
void CameraService::Client::disconnect()
{
int callingPid = getCallingPid();
- LOGD("Client::disconnect() E (pid %d client %p)",
+ LOGV("Client::disconnect() E (pid %d client %p)",
callingPid, getCameraClient()->asBinder().get());
Mutex::Autolock lock(mLock);
if (mClientPid <= 0) {
- LOGD("camera is unlocked (mClientPid = %d), don't tear down hardware", mClientPid);
+ LOGV("camera is unlocked (mClientPid = %d), don't tear down hardware", mClientPid);
return;
}
if (checkPid() != NO_ERROR) {
- LOGD("Different client - don't disconnect");
+ LOGV("Different client - don't disconnect");
return;
}
@@ -397,7 +396,7 @@
// from the user directly, or called by the destructor.
if (mHardware == 0) return;
- LOGD("hardware teardown");
+ LOGV("hardware teardown");
// Before destroying mHardware, we must make sure it's in the
// idle state.
mHardware->stopPreview();
@@ -421,13 +420,13 @@
mCameraService->removeClient(mCameraClient);
mCameraService->decUsers();
- LOGD("Client::disconnect() X (pid %d)", callingPid);
+ LOGV("Client::disconnect() X (pid %d)", callingPid);
}
// pass the buffered ISurface to the camera service
status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface)
{
- LOGD("setPreviewDisplay(%p) (pid %d)",
+ LOGV("setPreviewDisplay(%p) (pid %d)",
((surface == NULL) ? NULL : surface.get()), getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
@@ -438,7 +437,7 @@
// asBinder() is safe on NULL (returns NULL)
if (surface->asBinder() != mSurface->asBinder()) {
if (mSurface != 0) {
- LOGD("clearing old preview surface %p", mSurface.get());
+ LOGV("clearing old preview surface %p", mSurface.get());
if ( !mUseOverlay)
{
mSurface->unregisterBuffers();
@@ -487,7 +486,7 @@
{
int callingPid = getCallingPid();
- LOGD("startCameraMode(%d) (pid %d)", mode, callingPid);
+ LOGV("startCameraMode(%d) (pid %d)", mode, callingPid);
/* we cannot call into mHardware with mLock held because
* mHardware has callbacks onto us which acquire this lock
@@ -512,7 +511,7 @@
default: // CAMERA_PREVIEW_MODE
if (mSurface == 0) {
- LOGD("mSurface is not set yet.");
+ LOGV("mSurface is not set yet.");
}
return startPreviewMode();
}
@@ -520,7 +519,7 @@
status_t CameraService::Client::startRecordingMode()
{
- LOGD("startRecordingMode (pid %d)", getCallingPid());
+ LOGV("startRecordingMode (pid %d)", getCallingPid());
status_t ret = UNKNOWN_ERROR;
@@ -547,7 +546,7 @@
status_t CameraService::Client::setOverlay()
{
- LOGD("setOverlay");
+ LOGV("setOverlay");
int w, h;
CameraParameters params(mHardware->getParameters());
params.getPreviewSize(&w, &h);
@@ -573,7 +572,7 @@
for (int retry = 0; retry < 50; ++retry) {
mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT);
if (mOverlayRef != NULL) break;
- LOGD("Overlay create failed - retrying");
+ LOGW("Overlay create failed - retrying");
usleep(20000);
}
if ( mOverlayRef.get() == NULL )
@@ -623,7 +622,7 @@
status_t CameraService::Client::startPreviewMode()
{
- LOGD("startPreviewMode (pid %d)", getCallingPid());
+ LOGV("startPreviewMode (pid %d)", getCallingPid());
// if preview has been enabled, nothing needs to be done
if (mHardware->previewEnabled()) {
@@ -659,14 +658,14 @@
status_t CameraService::Client::startPreview()
{
- LOGD("startPreview (pid %d)", getCallingPid());
+ LOGV("startPreview (pid %d)", getCallingPid());
return startCameraMode(CAMERA_PREVIEW_MODE);
}
status_t CameraService::Client::startRecording()
{
- LOGD("startRecording (pid %d)", getCallingPid());
+ LOGV("startRecording (pid %d)", getCallingPid());
if (mMediaPlayerBeep.get() != NULL) {
// do not play record jingle if stream volume is 0
@@ -687,7 +686,7 @@
// stop preview mode
void CameraService::Client::stopPreview()
{
- LOGD("stopPreview (pid %d)", getCallingPid());
+ LOGV("stopPreview (pid %d)", getCallingPid());
// hold main lock during state transition
{
@@ -701,7 +700,7 @@
mHardware->stopPreview();
mHardware->disableMsgType(CAMERA_MSG_PREVIEW_FRAME);
- LOGD("stopPreview(), hardware stopped OK");
+ LOGV("stopPreview(), hardware stopped OK");
if (mSurface != 0 && !mUseOverlay) {
mSurface->unregisterBuffers();
@@ -718,7 +717,7 @@
// stop recording mode
void CameraService::Client::stopRecording()
{
- LOGD("stopRecording (pid %d)", getCallingPid());
+ LOGV("stopRecording (pid %d)", getCallingPid());
// hold main lock during state transition
{
@@ -737,7 +736,7 @@
mHardware->stopRecording();
mHardware->disableMsgType(CAMERA_MSG_VIDEO_FRAME);
- LOGD("stopRecording(), hardware stopped OK");
+ LOGV("stopRecording(), hardware stopped OK");
}
// hold preview buffer lock
@@ -805,14 +804,14 @@
int nw, cnt = 0;
uint32_t written = 0;
- LOGD("opening file [%s]\n", fname);
+ LOGV("opening file [%s]\n", fname);
int fd = open(fname, O_RDWR | O_CREAT);
if (fd < 0) {
LOGE("failed to create file [%s]: %s", fname, strerror(errno));
return;
}
- LOGD("writing %d bytes to file [%s]\n", size, fname);
+ LOGV("writing %d bytes to file [%s]\n", size, fname);
while (written < size) {
nw = ::write(fd,
buf + written,
@@ -825,7 +824,7 @@
written += nw;
cnt++;
}
- LOGD("done writing %d bytes to file [%s] in %d passes\n",
+ LOGV("done writing %d bytes to file [%s] in %d passes\n",
size, fname, cnt);
::close(fd);
}
@@ -833,7 +832,7 @@
status_t CameraService::Client::autoFocus()
{
- LOGD("autoFocus (pid %d)", getCallingPid());
+ LOGV("autoFocus (pid %d)", getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
@@ -849,7 +848,7 @@
status_t CameraService::Client::cancelAutoFocus()
{
- LOGD("cancelAutoFocus (pid %d)", getCallingPid());
+ LOGV("cancelAutoFocus (pid %d)", getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
@@ -866,7 +865,7 @@
// take a picture - image is returned in callback
status_t CameraService::Client::takePicture()
{
- LOGD("takePicture (pid %d)", getCallingPid());
+ LOGV("takePicture (pid %d)", getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
@@ -933,7 +932,7 @@
h = size->height;
w &= ~1;
h &= ~1;
- LOGD("Snapshot image width=%d, height=%d", w, h);
+ LOGV("Snapshot image width=%d, height=%d", w, h);
}
ISurface::BufferHeap buffers(w, h, w, h,
PIXEL_FORMAT_YCbCr_420_SP, transform, 0, mHardware->getRawHeap());
@@ -952,7 +951,7 @@
#if DEBUG_HEAP_LEAKS && 0 // debugging
if (gWeakHeap == NULL) {
if (gWeakHeap != heap) {
- LOGD("SETTING PREVIEW HEAP");
+ LOGV("SETTING PREVIEW HEAP");
heap->trackMe(true, true);
gWeakHeap = heap;
}
@@ -1189,7 +1188,7 @@
// set preview/capture parameters - key/value pairs
status_t CameraService::Client::setParameters(const String8& params)
{
- LOGD("setParameters(%s)", params.string());
+ LOGV("setParameters(%s)", params.string());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
@@ -1215,13 +1214,13 @@
}
String8 params(mHardware->getParameters().flatten());
- LOGD("getParameters(%s)", params.string());
+ LOGV("getParameters(%s)", params.string());
return params;
}
status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
{
- LOGD("sendCommand (pid %d)", getCallingPid());
+ LOGV("sendCommand (pid %d)", getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
if (result != NO_ERROR) return result;
@@ -1327,7 +1326,7 @@
status_t err = BnCameraService::onTransact(code, data, reply, flags);
#if DEBUG_HEAP_LEAKS
- LOGD("+++ onTransact err %d code %d", err, code);
+ LOGV("+++ onTransact err %d code %d", err, code);
if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
// the 'service' command interrogates this binder for its name, and then supplies it
@@ -1335,7 +1334,7 @@
// ISurfaceComposer (since we delegated the INTERFACE_TRANSACTION handling to
// BnSurfaceComposer before falling through to this code).
- LOGD("+++ onTransact code %d", code);
+ LOGV("+++ onTransact code %d", code);
CHECK_INTERFACE(ICameraService, data, reply);
@@ -1345,13 +1344,13 @@
if (gWeakHeap != 0) {
sp<IMemoryHeap> h = gWeakHeap.promote();
IMemoryHeap *p = gWeakHeap.unsafe_get();
- LOGD("CHECKING WEAK REFERENCE %p (%p)", h.get(), p);
+ LOGV("CHECKING WEAK REFERENCE %p (%p)", h.get(), p);
if (h != 0)
h->printRefs();
bool attempt_to_delete = data.readInt32() == 1;
if (attempt_to_delete) {
// NOT SAFE!
- LOGD("DELETING WEAK REFERENCE %p (%p)", h.get(), p);
+ LOGV("DELETING WEAK REFERENCE %p (%p)", h.get(), p);
if (p) delete p;
}
return NO_ERROR;
diff --git a/camera/tests/CameraServiceTest/Android.mk b/camera/tests/CameraServiceTest/Android.mk
index c2a02bb..8da7c1f 100644
--- a/camera/tests/CameraServiceTest/Android.mk
+++ b/camera/tests/CameraServiceTest/Android.mk
@@ -14,6 +14,7 @@
LOCAL_CFLAGS :=
LOCAL_SHARED_LIBRARIES += \
+ libbinder \
libcutils \
libutils \
libui
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk
index a33f5cc..2391b72 100644
--- a/cmds/app_process/Android.mk
+++ b/cmds/app_process/Android.mk
@@ -7,6 +7,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
+ libbinder \
libandroid_runtime
LOCAL_MODULE:= app_process
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 3449de1..939b63f 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -17,6 +17,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
+ libbinder \
libui \
libskia \
libEGL \
diff --git a/cmds/dumpstate/Android.mk b/cmds/dumpstate/Android.mk
index f8b37a8..27891ec 100644
--- a/cmds/dumpstate/Android.mk
+++ b/cmds/dumpstate/Android.mk
@@ -3,9 +3,13 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES:= dumpstate.c utils.c
+ifdef BOARD_WLAN_DEVICE
+LOCAL_CFLAGS := -DFWDUMP_$(BOARD_WLAN_DEVICE)
+endif
-LOCAL_MODULE:= dumpstate
+LOCAL_SRC_FILES := dumpstate.c utils.c
+
+LOCAL_MODULE := dumpstate
LOCAL_SHARED_LIBRARIES := libcutils
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index 5a485e4b..a2b5d8d 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -28,7 +28,7 @@
#include <cutils/sockets.h>
#include "private/android_filesystem_config.h"
-#define LOG_NDEBUG 0
+
#define LOG_TAG "dumpstate"
#include <utils/Log.h>
@@ -78,6 +78,10 @@
PRINT("");
PRINT("Routes:");
DUMP("/proc/net/route");
+#ifdef FWDUMP_bcm4329
+ PRINT("Dump wlan FW log");
+ EXEC_XBIN6("su", "root","dhdutil","-i","eth0","upload","/data/local/tmp/wlan_crash.dump");
+#endif
PRINT("------ SYSTEM PROPERTIES ------");
print_properties();
PRINT("------ KERNEL LOG ------");
diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h
index b99b6d7..ed1f005 100644
--- a/cmds/dumpstate/dumpstate.h
+++ b/cmds/dumpstate/dumpstate.h
@@ -124,6 +124,15 @@
run_command(&c, TIMEOUT); \
}
+#define EXEC_XBIN6(cmd, a1, a2, a3, a4, a5, a6) \
+{ \
+ static struct Command c = { \
+ "/system/xbin/" cmd, \
+ { cmd, a1, a2, a3, a4, a5, a6, 0 } \
+ }; \
+ run_command(&c, TIMEOUT); \
+}
+
#define PROPERTY(name) print_property(name)
struct Command {
diff --git a/cmds/dumpsys/dumpsys.cpp b/cmds/dumpsys/dumpsys.cpp
index 945a690..fdc5d5d 100644
--- a/cmds/dumpsys/dumpsys.cpp
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -51,22 +51,26 @@
const size_t N = services.size();
- // first print a list of the current services
- aout << "Currently running services:" << endl;
-
- for (size_t i=0; i<N; i++) {
- sp<IBinder> service = sm->checkService(services[i]);
- if (service != NULL) {
- aout << " " << services[i] << endl;
+ if (N > 1) {
+ // first print a list of the current services
+ aout << "Currently running services:" << endl;
+
+ for (size_t i=0; i<N; i++) {
+ sp<IBinder> service = sm->checkService(services[i]);
+ if (service != NULL) {
+ aout << " " << services[i] << endl;
+ }
}
}
for (size_t i=0; i<N; i++) {
sp<IBinder> service = sm->checkService(services[i]);
if (service != NULL) {
- aout << "------------------------------------------------------------"
- "-------------------" << endl;
- aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
+ if (N > 1) {
+ aout << "------------------------------------------------------------"
+ "-------------------" << endl;
+ aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
+ }
int err = service->dump(STDOUT_FILENO, args);
if (err != 0) {
aerr << "Error dumping service info: (" << strerror(err)
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index 70a1206..dcae0c7 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -16,7 +16,7 @@
#include "installd.h"
-int install(const char *pkgname, uid_t uid, gid_t gid)
+int install(const char *pkgname, int encrypted_fs_flag, uid_t uid, gid_t gid)
{
char pkgdir[PKG_PATH_MAX];
char libdir[PKG_PATH_MAX];
@@ -26,10 +26,18 @@
return -1;
}
- if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
- return -1;
- if (create_pkg_path(libdir, PKG_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX))
- return -1;
+
+ if (encrypted_fs_flag == USE_UNENCRYPTED_FS) {
+ if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ if (create_pkg_path(libdir, PKG_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX))
+ return -1;
+ } else {
+ if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ if (create_pkg_path(libdir, PKG_SEC_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX))
+ return -1;
+ }
if (mkdir(pkgdir, 0755) < 0) {
LOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
@@ -54,41 +62,58 @@
return 0;
}
-int uninstall(const char *pkgname)
+int uninstall(const char *pkgname, int encrypted_fs_flag)
{
char pkgdir[PKG_PATH_MAX];
- if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
- return -1;
+ if (encrypted_fs_flag == USE_UNENCRYPTED_FS) {
+ if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ } else {
+ if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ }
/* delete contents AND directory, no exceptions */
return delete_dir_contents(pkgdir, 1, 0);
}
-int delete_user_data(const char *pkgname)
+int delete_user_data(const char *pkgname, int encrypted_fs_flag)
{
char pkgdir[PKG_PATH_MAX];
- if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
- return -1;
+ if (encrypted_fs_flag == USE_UNENCRYPTED_FS) {
+ if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ } else {
+ if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))
+ return -1;
+ }
/* delete contents, excluding "lib", but not the directory itself */
return delete_dir_contents(pkgdir, 0, "lib");
}
-int delete_cache(const char *pkgname)
+int delete_cache(const char *pkgname, int encrypted_fs_flag)
{
char cachedir[PKG_PATH_MAX];
- if (create_pkg_path(cachedir, CACHE_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX))
- return -1;
+ if (encrypted_fs_flag == USE_UNENCRYPTED_FS) {
+ if (create_pkg_path(cachedir, CACHE_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX))
+ return -1;
+ } else {
+ if (create_pkg_path(cachedir, CACHE_SEC_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX))
+ return -1;
+ }
/* delete contents, not the directory, no exceptions */
return delete_dir_contents(cachedir, 0, 0);
}
-
-static int disk_free(void)
+/* TODO(oam): depending on use case (ecryptfs or dmcrypt)
+ * change implementation
+ */
+static int disk_free()
{
struct statfs sfs;
if (statfs(PKG_DIR_PREFIX, &sfs) == 0) {
@@ -98,7 +123,6 @@
}
}
-
/* Try to ensure free_size bytes of storage are available.
* Returns 0 on success.
* This is rather simple-minded because doing a full LRU would
@@ -120,6 +144,39 @@
LOGI("free_cache(%d) avail %d\n", free_size, avail);
if (avail >= free_size) return 0;
+ /* First try encrypted dir */
+ d = opendir(PKG_SEC_DIR_PREFIX);
+ if (d == NULL) {
+ LOGE("cannot open %s\n", PKG_SEC_DIR_PREFIX);
+ } else {
+ dfd = dirfd(d);
+
+ while ((de = readdir(d))) {
+ if (de->d_type != DT_DIR) continue;
+ name = de->d_name;
+
+ /* always skip "." and ".." */
+ if (name[0] == '.') {
+ if (name[1] == 0) continue;
+ if ((name[1] == '.') && (name[2] == 0)) continue;
+ }
+
+ subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY);
+ if (subfd < 0) continue;
+
+ delete_dir_contents_fd(subfd, "cache");
+ close(subfd);
+
+ avail = disk_free();
+ if (avail >= free_size) {
+ closedir(d);
+ return 0;
+ }
+ }
+ closedir(d);
+ }
+
+ /* Next try unencrypted dir... */
d = opendir(PKG_DIR_PREFIX);
if (d == NULL) {
LOGE("cannot open %s\n", PKG_DIR_PREFIX);
@@ -131,7 +188,7 @@
if (de->d_type != DT_DIR) continue;
name = de->d_name;
- /* always skip "." and ".." */
+ /* always skip "." and ".." */
if (name[0] == '.') {
if (name[1] == 0) continue;
if ((name[1] == '.') && (name[2] == 0)) continue;
@@ -150,10 +207,11 @@
}
}
closedir(d);
+
+ /* Fail case - not possible to free space */
return -1;
}
-
/* used by move_dex, rm_dex, etc to ensure that the provided paths
* don't point anywhere other than at the APK_DIR_PREFIX
*/
@@ -288,7 +346,7 @@
int get_size(const char *pkgname, const char *apkpath,
const char *fwdlock_apkpath,
- int *_codesize, int *_datasize, int *_cachesize)
+ int *_codesize, int *_datasize, int *_cachesize, int encrypted_fs_flag)
{
DIR *d;
int dfd;
@@ -324,8 +382,14 @@
}
}
- if (create_pkg_path(path, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) {
- goto done;
+ if (encrypted_fs_flag == 0) {
+ if (create_pkg_path(path, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) {
+ goto done;
+ }
+ } else {
+ if (create_pkg_path(path, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) {
+ goto done;
+ }
}
d = opendir(path);
diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c
index 7c7441f..5bc6c86 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -29,7 +29,7 @@
static int do_install(char **arg, char reply[REPLY_MAX])
{
- return install(arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, gid */
+ return install(arg[0], atoi(arg[1]), atoi(arg[2]), atoi(arg[3])); /* pkgname, uid, gid */
}
static int do_dexopt(char **arg, char reply[REPLY_MAX])
@@ -50,7 +50,7 @@
static int do_remove(char **arg, char reply[REPLY_MAX])
{
- return uninstall(arg[0]); /* pkgname */
+ return uninstall(arg[0], atoi(arg[1])); /* pkgname */
}
static int do_free_cache(char **arg, char reply[REPLY_MAX]) /* TODO int:free_size */
@@ -60,7 +60,7 @@
static int do_rm_cache(char **arg, char reply[REPLY_MAX])
{
- return delete_cache(arg[0]); /* pkgname */
+ return delete_cache(arg[0], atoi(arg[1])); /* pkgname */
}
static int do_protect(char **arg, char reply[REPLY_MAX])
@@ -76,7 +76,7 @@
int res = 0;
/* pkgdir, apkpath */
- res = get_size(arg[0], arg[1], arg[2], &codesize, &datasize, &cachesize);
+ res = get_size(arg[0], arg[1], arg[2], &codesize, &datasize, &cachesize, atoi(arg[3]));
sprintf(reply,"%d %d %d", codesize, datasize, cachesize);
return res;
@@ -84,7 +84,7 @@
static int do_rm_user_data(char **arg, char reply[REPLY_MAX])
{
- return delete_user_data(arg[0]); /* pkgname */
+ return delete_user_data(arg[0], atoi(arg[1])); /* pkgname */
}
struct cmdinfo {
@@ -95,16 +95,16 @@
struct cmdinfo cmds[] = {
{ "ping", 0, do_ping },
- { "install", 3, do_install },
+ { "install", 4, do_install },
{ "dexopt", 3, do_dexopt },
{ "movedex", 2, do_move_dex },
{ "rmdex", 1, do_rm_dex },
- { "remove", 1, do_remove },
+ { "remove", 2, do_remove },
{ "freecache", 1, do_free_cache },
- { "rmcache", 1, do_rm_cache },
+ { "rmcache", 2, do_rm_cache },
{ "protect", 2, do_protect },
- { "getsize", 3, do_get_size },
- { "rmuserdata", 1, do_rm_user_data },
+ { "getsize", 4, do_get_size },
+ { "rmuserdata", 2, do_rm_user_data },
};
static int readx(int s, void *_buf, int count)
diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
index db3badd..1679d14 100644
--- a/cmds/installd/installd.h
+++ b/cmds/installd/installd.h
@@ -48,16 +48,23 @@
/* elements combined with a valid package name to form paths */
#define PKG_DIR_PREFIX "/data/data/"
+#define PKG_SEC_DIR_PREFIX "/data/secure/data/"
#define PKG_DIR_POSTFIX ""
#define PKG_LIB_PREFIX "/data/data/"
+#define PKG_SEC_LIB_PREFIX "/data/secure/data/"
#define PKG_LIB_POSTFIX "/lib"
#define CACHE_DIR_PREFIX "/data/data/"
+#define CACHE_SEC_DIR_PREFIX "/data/secure/data/"
#define CACHE_DIR_POSTFIX "/cache"
#define APK_DIR_PREFIX "/data/app/"
+/* Encrypted File SYstems constants */
+#define USE_ENCRYPTED_FS 1
+#define USE_UNENCRYPTED_FS 0
+
/* other handy constants */
#define PROTECTED_DIR_PREFIX "/data/app-private/"
@@ -87,14 +94,14 @@
/* commands.c */
-int install(const char *pkgname, uid_t uid, gid_t gid);
-int uninstall(const char *pkgname);
-int delete_user_data(const char *pkgname);
-int delete_cache(const char *pkgname);
+int install(const char *pkgname, int encrypted_fs_flag, uid_t uid, gid_t gid);
+int uninstall(const char *pkgname, int encrypted_fs_flag);
+int delete_user_data(const char *pkgname, int encrypted_fs_flag);
+int delete_cache(const char *pkgname, int encrypted_fs_flag);
int move_dex(const char *src, const char *dst);
int rm_dex(const char *path);
int protect(char *pkgname, gid_t gid);
int get_size(const char *pkgname, const char *apkpath, const char *fwdlock_apkpath,
- int *codesize, int *datasize, int *cachesize);
+ int *codesize, int *datasize, int *cachesize, int encrypted_fs_flag);
int free_cache(int free_size);
int dexopt(const char *apk_path, uid_t uid, int is_public);
diff --git a/cmds/keystore/keystore.c b/cmds/keystore/keystore.c
index ba74c78..4426874 100644
--- a/cmds/keystore/keystore.c
+++ b/cmds/keystore/keystore.c
@@ -163,19 +163,19 @@
static int8_t encrypt_blob(char *name, AES_KEY *aes_key)
{
uint8_t vector[AES_BLOCK_SIZE];
- int length = blob.length;
+ int length;
int fd;
if (read(the_entropy, vector, AES_BLOCK_SIZE) != AES_BLOCK_SIZE) {
return SYSTEM_ERROR;
}
- length += blob.value - blob.digested;
- blob.length = htonl(blob.length);
- MD5(blob.digested, length, blob.digest);
-
- length += blob.digested - blob.encrypted;
+ length = blob.length + blob.value - blob.encrypted;
length = (length + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE * AES_BLOCK_SIZE;
+
+ blob.length = htonl(blob.length);
+ MD5(blob.digested, length - (blob.digested - blob.encrypted), blob.digest);
+
memcpy(vector, blob.vector, AES_BLOCK_SIZE);
AES_cbc_encrypt(blob.encrypted, blob.encrypted, length, aes_key, vector,
AES_ENCRYPT);
@@ -184,11 +184,9 @@
length += blob.encrypted - (uint8_t *)&blob;
fd = open(".tmp", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
- if (fd == -1 || write(fd, &blob, length) != length) {
- return SYSTEM_ERROR;
- }
+ length -= write(fd, &blob, length);
close(fd);
- return rename(".tmp", name) ? SYSTEM_ERROR : NO_ERROR;
+ return (length || rename(".tmp", name)) ? SYSTEM_ERROR : NO_ERROR;
}
static int8_t decrypt_blob(char *name, AES_KEY *aes_key)
@@ -210,14 +208,15 @@
AES_cbc_encrypt(blob.encrypted, blob.encrypted, length, aes_key,
blob.vector, AES_DECRYPT);
length -= blob.digested - blob.encrypted;
- if (!memcmp(blob.digest, MD5(blob.digested, length, NULL),
- MD5_DIGEST_LENGTH)) {
+ if (memcmp(blob.digest, MD5(blob.digested, length, NULL),
+ MD5_DIGEST_LENGTH)) {
return VALUE_CORRUPTED;
}
length -= blob.value - blob.digested;
blob.length = ntohl(blob.length);
- return (length < blob.length) ? VALUE_CORRUPTED : NO_ERROR;
+ return (blob.length < 0 || blob.length > length) ? VALUE_CORRUPTED :
+ NO_ERROR;
}
/* Here are the actions. Each of them is a function without arguments. All
diff --git a/cmds/stagefright/Android.mk b/cmds/stagefright/Android.mk
index 100af89..68d8bb0 100644
--- a/cmds/stagefright/Android.mk
+++ b/cmds/stagefright/Android.mk
@@ -8,7 +8,7 @@
stagefright.cpp
LOCAL_SHARED_LIBRARIES := \
- libstagefright
+ libstagefright libmedia libutils libbinder
LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE) \
@@ -30,7 +30,7 @@
record.cpp
LOCAL_SHARED_LIBRARIES := \
- libstagefright
+ libstagefright liblog libutils libbinder
LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE) \
@@ -52,7 +52,7 @@
audioloop.cpp
LOCAL_SHARED_LIBRARIES := \
- libstagefright
+ libstagefright liblog libutils libbinder
LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE) \
diff --git a/common/java/com/android/common/AndroidHttpClient.java b/common/java/com/android/common/AndroidHttpClient.java
index 6fa6da1..99faf6e 100644
--- a/common/java/com/android/common/AndroidHttpClient.java
+++ b/common/java/com/android/common/AndroidHttpClient.java
@@ -339,19 +339,9 @@
* Shorter data will not be compressed.
*/
public static long getMinGzipSize(ContentResolver resolver) {
- String sMinGzipBytes = Settings.Gservices.getString(resolver,
- Settings.Gservices.SYNC_MIN_GZIP_BYTES);
-
- if (!TextUtils.isEmpty(sMinGzipBytes)) {
- try {
- return Long.parseLong(sMinGzipBytes);
- } catch (NumberFormatException nfe) {
- Log.w(TAG, "Unable to parse " +
- Settings.Gservices.SYNC_MIN_GZIP_BYTES + " " +
- sMinGzipBytes, nfe);
- }
- }
- return DEFAULT_SYNC_MIN_GZIP_BYTES;
+ return Settings.Secure.getLong(resolver,
+ Settings.Secure.SYNC_MIN_GZIP_BYTES,
+ DEFAULT_SYNC_MIN_GZIP_BYTES);
}
/* cURL logging support. */
diff --git a/common/java/com/android/common/DNParser.java b/common/java/com/android/common/DNParser.java
new file mode 100644
index 0000000..32d57c0
--- /dev/null
+++ b/common/java/com/android/common/DNParser.java
@@ -0,0 +1,447 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.common;
+
+import android.util.Log;
+
+import java.io.IOException;
+
+import javax.security.auth.x500.X500Principal;
+
+/**
+ * A simple distinguished name(DN) parser.
+ *
+ * <p>This class is based on org.apache.harmony.security.x509.DNParser. It's customized to remove
+ * external references which are unnecessary for our requirements.
+ *
+ * <p>This class is only meant for extracting a string value from a DN. e.g. it doesn't support
+ * values in the hex-string style.
+ *
+ * <p>This class is used by {@link DomainNameValidator} only. However, in order to make this
+ * class visible from unit tests, it's made public.
+ */
+public final class DNParser {
+ private static final String TAG = "DNParser";
+
+ /** DN to be parsed. */
+ private final String dn;
+
+ // length of distinguished name string
+ private final int length;
+
+ private int pos, beg, end;
+
+ // tmp vars to store positions of the currently parsed item
+ private int cur;
+
+ // distinguished name chars
+ private char[] chars;
+
+ /**
+ * Exception message thrown when we failed to parse DN, which shouldn't happen because we
+ * only handle DNs that {@link X500Principal#getName} returns, which shouldn't be malformed.
+ */
+ private static final String ERROR_PARSE_ERROR = "Failed to parse DN";
+
+ /**
+ * Constructor.
+ *
+ * @param principal - {@link X500Principal} to be parsed
+ */
+ public DNParser(X500Principal principal) {
+ this.dn = principal.getName(X500Principal.RFC2253);
+ this.length = dn.length();
+ }
+
+ // gets next attribute type: (ALPHA 1*keychar) / oid
+ private String nextAT() throws IOException {
+
+ // skip preceding space chars, they can present after
+ // comma or semicolon (compatibility with RFC 1779)
+ for (; pos < length && chars[pos] == ' '; pos++) {
+ }
+ if (pos == length) {
+ return null; // reached the end of DN
+ }
+
+ // mark the beginning of attribute type
+ beg = pos;
+
+ // attribute type chars
+ pos++;
+ for (; pos < length && chars[pos] != '=' && chars[pos] != ' '; pos++) {
+ // we don't follow exact BNF syntax here:
+ // accept any char except space and '='
+ }
+ if (pos >= length) {
+ // unexpected end of DN
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ // mark the end of attribute type
+ end = pos;
+
+ // skip trailing space chars between attribute type and '='
+ // (compatibility with RFC 1779)
+ if (chars[pos] == ' ') {
+ for (; pos < length && chars[pos] != '=' && chars[pos] == ' '; pos++) {
+ }
+
+ if (chars[pos] != '=' || pos == length) {
+ // unexpected end of DN
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+ }
+
+ pos++; //skip '=' char
+
+ // skip space chars between '=' and attribute value
+ // (compatibility with RFC 1779)
+ for (; pos < length && chars[pos] == ' '; pos++) {
+ }
+
+ // in case of oid attribute type skip its prefix: "oid." or "OID."
+ // (compatibility with RFC 1779)
+ if ((end - beg > 4) && (chars[beg + 3] == '.')
+ && (chars[beg] == 'O' || chars[beg] == 'o')
+ && (chars[beg + 1] == 'I' || chars[beg + 1] == 'i')
+ && (chars[beg + 2] == 'D' || chars[beg + 2] == 'd')) {
+ beg += 4;
+ }
+
+ return new String(chars, beg, end - beg);
+ }
+
+ // gets quoted attribute value: QUOTATION *( quotechar / pair ) QUOTATION
+ private String quotedAV() throws IOException {
+
+ pos++;
+ beg = pos;
+ end = beg;
+ while (true) {
+
+ if (pos == length) {
+ // unexpected end of DN
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ if (chars[pos] == '"') {
+ // enclosing quotation was found
+ pos++;
+ break;
+ } else if (chars[pos] == '\\') {
+ chars[end] = getEscaped();
+ } else {
+ // shift char: required for string with escaped chars
+ chars[end] = chars[pos];
+ }
+ pos++;
+ end++;
+ }
+
+ // skip trailing space chars before comma or semicolon.
+ // (compatibility with RFC 1779)
+ for (; pos < length && chars[pos] == ' '; pos++) {
+ }
+
+ return new String(chars, beg, end - beg);
+ }
+
+ // gets hex string attribute value: "#" hexstring
+ private String hexAV() throws IOException {
+
+ if (pos + 4 >= length) {
+ // encoded byte array must be not less then 4 c
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ beg = pos; // store '#' position
+ pos++;
+ while (true) {
+
+ // check for end of attribute value
+ // looks for space and component separators
+ if (pos == length || chars[pos] == '+' || chars[pos] == ','
+ || chars[pos] == ';') {
+ end = pos;
+ break;
+ }
+
+ if (chars[pos] == ' ') {
+ end = pos;
+ pos++;
+ // skip trailing space chars before comma or semicolon.
+ // (compatibility with RFC 1779)
+ for (; pos < length && chars[pos] == ' '; pos++) {
+ }
+ break;
+ } else if (chars[pos] >= 'A' && chars[pos] <= 'F') {
+ chars[pos] += 32; //to low case
+ }
+
+ pos++;
+ }
+
+ // verify length of hex string
+ // encoded byte array must be not less then 4 and must be even number
+ int hexLen = end - beg; // skip first '#' char
+ if (hexLen < 5 || (hexLen & 1) == 0) {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ // get byte encoding from string representation
+ byte[] encoded = new byte[hexLen / 2];
+ for (int i = 0, p = beg + 1; i < encoded.length; p += 2, i++) {
+ encoded[i] = (byte) getByte(p);
+ }
+
+ return new String(chars, beg, hexLen);
+ }
+
+ // gets string attribute value: *( stringchar / pair )
+ private String escapedAV() throws IOException {
+
+ beg = pos;
+ end = pos;
+ while (true) {
+
+ if (pos >= length) {
+ // the end of DN has been found
+ return new String(chars, beg, end - beg);
+ }
+
+ switch (chars[pos]) {
+ case '+':
+ case ',':
+ case ';':
+ // separator char has beed found
+ return new String(chars, beg, end - beg);
+ case '\\':
+ // escaped char
+ chars[end++] = getEscaped();
+ pos++;
+ break;
+ case ' ':
+ // need to figure out whether space defines
+ // the end of attribute value or not
+ cur = end;
+
+ pos++;
+ chars[end++] = ' ';
+
+ for (; pos < length && chars[pos] == ' '; pos++) {
+ chars[end++] = ' ';
+ }
+ if (pos == length || chars[pos] == ',' || chars[pos] == '+'
+ || chars[pos] == ';') {
+ // separator char or the end of DN has beed found
+ return new String(chars, beg, cur - beg);
+ }
+ break;
+ default:
+ chars[end++] = chars[pos];
+ pos++;
+ }
+ }
+ }
+
+ // returns escaped char
+ private char getEscaped() throws IOException {
+
+ pos++;
+ if (pos == length) {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ switch (chars[pos]) {
+ case '"':
+ case '\\':
+ case ',':
+ case '=':
+ case '+':
+ case '<':
+ case '>':
+ case '#':
+ case ';':
+ case ' ':
+ case '*':
+ case '%':
+ case '_':
+ //FIXME: escaping is allowed only for leading or trailing space char
+ return chars[pos];
+ default:
+ // RFC doesn't explicitly say that escaped hex pair is
+ // interpreted as UTF-8 char. It only contains an example of such DN.
+ return getUTF8();
+ }
+ }
+
+ // decodes UTF-8 char
+ // see http://www.unicode.org for UTF-8 bit distribution table
+ private char getUTF8() throws IOException {
+
+ int res = getByte(pos);
+ pos++; //FIXME tmp
+
+ if (res < 128) { // one byte: 0-7F
+ return (char) res;
+ } else if (res >= 192 && res <= 247) {
+
+ int count;
+ if (res <= 223) { // two bytes: C0-DF
+ count = 1;
+ res = res & 0x1F;
+ } else if (res <= 239) { // three bytes: E0-EF
+ count = 2;
+ res = res & 0x0F;
+ } else { // four bytes: F0-F7
+ count = 3;
+ res = res & 0x07;
+ }
+
+ int b;
+ for (int i = 0; i < count; i++) {
+ pos++;
+ if (pos == length || chars[pos] != '\\') {
+ return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
+ }
+ pos++;
+
+ b = getByte(pos);
+ pos++; //FIXME tmp
+ if ((b & 0xC0) != 0x80) {
+ return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
+ }
+
+ res = (res << 6) + (b & 0x3F);
+ }
+ return (char) res;
+ } else {
+ return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
+ }
+ }
+
+ // Returns byte representation of a char pair
+ // The char pair is composed of DN char in
+ // specified 'position' and the next char
+ // According to BNF syntax:
+ // hexchar = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
+ // / "a" / "b" / "c" / "d" / "e" / "f"
+ private int getByte(int position) throws IOException {
+
+ if ((position + 1) >= length) {
+ // to avoid ArrayIndexOutOfBoundsException
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ int b1, b2;
+
+ b1 = chars[position];
+ if (b1 >= '0' && b1 <= '9') {
+ b1 = b1 - '0';
+ } else if (b1 >= 'a' && b1 <= 'f') {
+ b1 = b1 - 87; // 87 = 'a' - 10
+ } else if (b1 >= 'A' && b1 <= 'F') {
+ b1 = b1 - 55; // 55 = 'A' - 10
+ } else {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ b2 = chars[position + 1];
+ if (b2 >= '0' && b2 <= '9') {
+ b2 = b2 - '0';
+ } else if (b2 >= 'a' && b2 <= 'f') {
+ b2 = b2 - 87; // 87 = 'a' - 10
+ } else if (b2 >= 'A' && b2 <= 'F') {
+ b2 = b2 - 55; // 55 = 'A' - 10
+ } else {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ return (b1 << 4) + b2;
+ }
+
+ /**
+ * Parses the DN and returns the attribute value for an attribute type.
+ *
+ * @param attributeType attribute type to look for (e.g. "ca")
+ * @return value of the attribute that first found, or null if none found
+ */
+ public String find(String attributeType) {
+ try {
+ // Initialize internal state.
+ pos = 0;
+ beg = 0;
+ end = 0;
+ cur = 0;
+ chars = dn.toCharArray();
+
+ String attType = nextAT();
+ if (attType == null) {
+ return null;
+ }
+ while (true) {
+ String attValue = "";
+
+ if (pos == length) {
+ return null;
+ }
+
+ switch (chars[pos]) {
+ case '"':
+ attValue = quotedAV();
+ break;
+ case '#':
+ attValue = hexAV();
+ break;
+ case '+':
+ case ',':
+ case ';': // compatibility with RFC 1779: semicolon can separate RDNs
+ //empty attribute value
+ break;
+ default:
+ attValue = escapedAV();
+ }
+
+ if (attributeType.equalsIgnoreCase(attType)) {
+ return attValue;
+ }
+
+ if (pos >= length) {
+ return null;
+ }
+
+ if (chars[pos] == ',' || chars[pos] == ';') {
+ } else if (chars[pos] != '+') {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+
+ pos++;
+ attType = nextAT();
+ if (attType == null) {
+ throw new IOException(ERROR_PARSE_ERROR);
+ }
+ }
+ } catch (IOException e) {
+ // Parse error shouldn't happen, because we only handle DNs that
+ // X500Principal.getName() returns, which shouldn't be malformed.
+ Log.e(TAG, "Failed to parse DN: " + dn);
+ return null;
+ }
+ }
+}
diff --git a/core/java/android/net/http/DomainNameChecker.java b/common/java/com/android/common/DomainNameValidator.java
similarity index 85%
rename from core/java/android/net/http/DomainNameChecker.java
rename to common/java/com/android/common/DomainNameValidator.java
index 3e01d2c..ad44a7d 100644
--- a/core/java/android/net/http/DomainNameChecker.java
+++ b/common/java/com/android/common/DomainNameValidator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2010 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.
@@ -13,29 +13,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.common;
-package android.net.http;
-
-import org.bouncycastle.asn1.x509.X509Name;
+import android.util.Config;
+import android.util.Log;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.security.cert.X509Certificate;
import java.security.cert.CertificateParsingException;
+import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import java.util.Vector;
-/**
- * Implements basic domain-name validation as specified by RFC2818.
- *
- * {@hide}
- */
-public class DomainNameChecker {
+import javax.security.auth.x500.X500Principal;
+
+public class DomainNameValidator {
+ private final static String TAG = "DomainNameValidator";
+
+ private static final boolean DEBUG = false;
+ private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
+
private static Pattern QUICK_IP_PATTERN;
static {
try {
@@ -84,8 +84,8 @@
errorMessage = "unknown host exception";
}
- if (HttpLog.LOGV) {
- HttpLog.v("DomainNameChecker.isIpAddress(): " + errorMessage);
+ if (LOG_ENABLED) {
+ Log.v(TAG, "DomainNameValidator.isIpAddress(): " + errorMessage);
}
rval = false;
@@ -102,8 +102,8 @@
* @return True iff if there is a domain match as specified by RFC2818
*/
private static boolean matchIpAddress(X509Certificate certificate, String thisDomain) {
- if (HttpLog.LOGV) {
- HttpLog.v("DomainNameChecker.matchIpAddress(): this domain: " + thisDomain);
+ if (LOG_ENABLED) {
+ Log.v(TAG, "DomainNameValidator.matchIpAddress(): this domain: " + thisDomain);
}
try {
@@ -118,8 +118,8 @@
if (altNameType.intValue() == ALT_IPA_NAME) {
String altName = (String)(altNameEntry.get(1));
if (altName != null) {
- if (HttpLog.LOGV) {
- HttpLog.v("alternative IP: " + altName);
+ if (LOG_ENABLED) {
+ Log.v(TAG, "alternative IP: " + altName);
}
if (thisDomain.equalsIgnoreCase(altName)) {
return true;
@@ -171,26 +171,26 @@
// spec (a valid DNS name must start with a letter); there is no
// good way around this, and in order to be compatible we proceed
// to check the common name (ie, ignore alternative names)
- if (HttpLog.LOGV) {
+ if (LOG_ENABLED) {
String errorMessage = e.getMessage();
if (errorMessage == null) {
errorMessage = "failed to parse certificate";
}
- if (HttpLog.LOGV) {
- HttpLog.v("DomainNameChecker.matchDns(): " + errorMessage);
- }
+ Log.v(TAG, "DomainNameValidator.matchDns(): " + errorMessage);
}
}
if (!hasDns) {
- X509Name xName = new X509Name(certificate.getSubjectDN().getName());
- Vector val = xName.getValues();
- Vector oid = xName.getOIDs();
- for (int i = 0; i < oid.size(); i++) {
- if (oid.elementAt(i).equals(X509Name.CN)) {
- return matchDns(thisDomain, (String)(val.elementAt(i)));
- }
+ final String cn = new DNParser(certificate.getSubjectX500Principal())
+ .find("cn");
+ if (LOG_ENABLED) {
+ Log.v(TAG, "Validating subject: DN:"
+ + certificate.getSubjectX500Principal().getName(X500Principal.CANONICAL)
+ + " CN:" + cn);
+ }
+ if (cn != null) {
+ return matchDns(thisDomain, cn);
}
}
@@ -202,9 +202,10 @@
* @param thatDomain The domain name from the certificate
* @return True iff thisDomain matches thatDomain as specified by RFC2818
*/
- private static boolean matchDns(String thisDomain, String thatDomain) {
- if (HttpLog.LOGV) {
- HttpLog.v("DomainNameChecker.matchDns():" +
+ // not private for testing
+ public static boolean matchDns(String thisDomain, String thatDomain) {
+ if (LOG_ENABLED) {
+ Log.v(TAG, "DomainNameValidator.matchDns():" +
" this domain: " + thisDomain +
" that domain: " + thatDomain);
}
diff --git a/common/tests/src/com/android/common/DNParserTest.java b/common/tests/src/com/android/common/DNParserTest.java
new file mode 100644
index 0000000..34b140a
--- /dev/null
+++ b/common/tests/src/com/android/common/DNParserTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 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.common;
+
+import javax.security.auth.x500.X500Principal;
+
+import junit.framework.TestCase;
+
+public class DNParserTest extends TestCase {
+ public void testFind() {
+ checkFind("", "cn", null);
+ checkFind("ou=xxx", "cn", null);
+ checkFind("ou=xxx,cn=xxx", "cn", "xxx");
+ checkFind("ou=xxx+cn=yyy,cn=zzz+cn=abc", "cn", "yyy");
+ checkFind("2.5.4.3=a,ou=xxx", "cn", "a"); // OID
+ checkFind("cn=a,cn=b", "cn", "a");
+ checkFind("ou=Cc,ou=Bb,ou=Aa", "ou", "Cc");
+ checkFind("cn=imap.gmail.com", "cn", "imap.gmail.com");
+
+ // Quoted string (see http://www.ietf.org/rfc/rfc2253.txt)
+ checkFind("o=\"\\\" a ,=<>#;\"", "o", "\" a ,=<>#;");
+ checkFind("o=abc\\,def", "o", "abc,def");
+
+ // UTF-8 (example in rfc 2253)
+ checkFind("cn=Lu\\C4\\8Di\\C4\\87", "cn", "\u004c\u0075\u010d\u0069\u0107");
+
+ // whitespaces
+ checkFind("ou=a, o= a b ,cn=x", "o", "a b");
+ checkFind("o=\" a b \" ,cn=x", "o", " a b ");
+ }
+
+ private void checkFind(String dn, String attrType, String expected) {
+ String actual = new DNParser(new X500Principal(dn)).find(attrType);
+ assertEquals("dn:" + dn + " attr:" + attrType, expected, actual);
+ }
+}
diff --git a/common/tests/src/com/android/common/DomainNameValidatorTest.java b/common/tests/src/com/android/common/DomainNameValidatorTest.java
new file mode 100644
index 0000000..4fdd4cdc
--- /dev/null
+++ b/common/tests/src/com/android/common/DomainNameValidatorTest.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2010 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.common;
+
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Principal;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.CertificateParsingException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.security.auth.x500.X500Principal;
+
+import junit.framework.TestCase;
+
+public class DomainNameValidatorTest extends TestCase {
+ private static final int ALT_UNKNOWN = 0;
+ private static final int ALT_DNS_NAME = 2;
+ private static final int ALT_IPA_NAME = 7;
+
+ /**
+ * Tests {@link DomainNameValidator#match}
+ */
+ public void testMatch() {
+ // TODO Use actual X509Certificate objects, instead of StubX509Certificate.
+ // Comment in DomainNameValidator suggests X509Certificate fails to parse a certificate
+ // if subject alternative names contain a domain name that begins with '*'.
+ // This test won't cover this kind of errors.
+
+ checkMatch("11", new StubX509Certificate("cn=imap.g.com"), "imap.g.com", true);
+ checkMatch("12", new StubX509Certificate("cn=imap2.g.com"), "imap.g.com", false);
+ checkMatch("13", new StubX509Certificate("cn=sub.imap.g.com"), "imap.g.com", false);
+
+ // If a subjectAltName extension of type dNSName is present, that MUST
+ // be used as the identity
+ checkMatch("21", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.y.com")
+ , "imap.g.com", false);
+ checkMatch("22", new StubX509Certificate("cn=imap.g.com") // This cn should be ignored
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.y.com")
+ , "imap.g.com", false);
+ checkMatch("23", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com")
+ , "imap.g.com", true);
+
+ // With wildcards
+ checkMatch("24", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "*.g.com")
+ , "imap.g.com", true);
+
+
+ // host name is ip address
+ checkMatch("31", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4")
+ , "1.2.3.4", true);
+ checkMatch("32", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4")
+ , "1.2.3.5", false);
+ checkMatch("32", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "192.168.100.1")
+ , "192.168.100.1", true);
+
+ // Has unknown subject alternative names
+ checkMatch("41", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3")
+ , "imap.g.com", true);
+
+ checkMatch("42", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3")
+ , "2.33.44.55", true);
+
+ checkMatch("43", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3")
+ , "g.com", false);
+
+ checkMatch("44", new StubX509Certificate("")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com")
+ .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com")
+ .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55")
+ .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3")
+ , "2.33.44.1", false);
+ }
+
+ private void checkMatch(String message, X509Certificate certificate, String thisDomain,
+ boolean expected) {
+ Boolean actual = DomainNameValidator.match(certificate, thisDomain);
+ assertEquals(message, (Object) expected, (Object) actual);
+ }
+
+ /**
+ * Tests {@link DomainNameValidator#matchDns}
+ */
+ public void testMatchDns() {
+ checkMatchDns("11", "a.b.c.d", "a.b.c.d", true);
+ checkMatchDns("12", "a.b.c.d", "*.b.c.d", true);
+ checkMatchDns("13", "b.c.d", "*.b.c.d", true);
+ checkMatchDns("14", "b.c.d", "b*.c.d", true);
+
+ checkMatchDns("15", "a.b.c.d", "*.*.c.d", false);
+ checkMatchDns("16", "a.b.c.d", "*.c.d", false);
+
+ checkMatchDns("21", "imap.google.com", "imap.google.com", true);
+ checkMatchDns("22", "imap2.google.com", "imap.google.com", false);
+ checkMatchDns("23", "imap.google.com", "*.google.com", true);
+ checkMatchDns("24", "imap2.google.com", "*.google.com", true);
+ checkMatchDns("25", "imap.google.com", "*.googl.com", false);
+ checkMatchDns("26", "imap2.google2.com", "*.google3.com", false);
+ checkMatchDns("27", "imap.google.com", "ima*.google.com", true);
+ checkMatchDns("28", "imap.google.com", "imap*.google.com", true);
+ checkMatchDns("29", "imap.google.com", "*.imap.google.com", true);
+
+ checkMatchDns("41", "imap.google.com", "a*.google.com", false);
+ checkMatchDns("42", "imap.google.com", "ix*.google.com", false);
+
+ checkMatchDns("51", "imap.google.com", "iMap.Google.Com", true);
+ }
+
+ private void checkMatchDns(String message, String thisDomain, String thatDomain,
+ boolean expected) {
+ boolean actual = DomainNameValidator.matchDns(thisDomain, thatDomain);
+ assertEquals(message, expected, actual);
+ }
+
+ /**
+ * Minimal {@link X509Certificate} implementation for {@link DomainNameValidator}.
+ */
+ private static class StubX509Certificate extends X509Certificate {
+ private final X500Principal subjectX500Principal;
+ private Collection<List<?>> subjectAlternativeNames;
+
+ public StubX509Certificate(String subjectDn) {
+ subjectX500Principal = new X500Principal(subjectDn);
+ subjectAlternativeNames = null;
+ }
+
+ public StubX509Certificate addSubjectAlternativeName(int type, String name) {
+ if (subjectAlternativeNames == null) {
+ subjectAlternativeNames = new ArrayList<List<?>>();
+ }
+ LinkedList<Object> entry = new LinkedList<Object>();
+ entry.add(type);
+ entry.add(name);
+ subjectAlternativeNames.add(entry);
+ return this;
+ }
+
+ @Override
+ public Collection<List<?>> getSubjectAlternativeNames() throws CertificateParsingException {
+ return subjectAlternativeNames;
+ }
+
+ @Override
+ public X500Principal getSubjectX500Principal() {
+ return subjectX500Principal;
+ }
+
+ @Override
+ public void checkValidity() throws CertificateExpiredException,
+ CertificateNotYetValidException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public void checkValidity(Date date) throws CertificateExpiredException,
+ CertificateNotYetValidException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public int getBasicConstraints() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public Principal getIssuerDN() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public boolean[] getIssuerUniqueID() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public boolean[] getKeyUsage() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public Date getNotAfter() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public Date getNotBefore() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public BigInteger getSerialNumber() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public String getSigAlgName() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public String getSigAlgOID() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public byte[] getSigAlgParams() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public byte[] getSignature() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public Principal getSubjectDN() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public boolean[] getSubjectUniqueID() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public byte[] getTBSCertificate() throws CertificateEncodingException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public int getVersion() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public byte[] getEncoded() throws CertificateEncodingException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public PublicKey getPublicKey() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public String toString() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException,
+ InvalidKeyException, NoSuchProviderException, SignatureException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public void verify(PublicKey key, String sigProvider) throws CertificateException,
+ NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException,
+ SignatureException {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Set<String> getCriticalExtensionOIDs() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public byte[] getExtensionValue(String oid) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Set<String> getNonCriticalExtensionOIDs() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public boolean hasUnsupportedCriticalExtension() {
+ throw new RuntimeException("Method not implemented");
+ }
+ }
+}
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index de01153..d5a9b02 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -38,6 +38,7 @@
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -52,6 +53,7 @@
import android.util.Log;
import android.util.Pair;
+import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -153,8 +155,7 @@
new AtomicReference<AccountManagerService>();
private static final boolean isDebuggableMonkeyBuild =
- SystemProperties.getBoolean("ro.monkey", false)
- && SystemProperties.getBoolean("ro.debuggable", false);
+ SystemProperties.getBoolean("ro.monkey", false);
private static final Account[] EMPTY_ACCOUNT_ARRAY = new Account[]{};
static {
@@ -1351,9 +1352,20 @@
}
}
+ private static String getDatabaseName() {
+ if(Environment.isEncryptedFilesystemEnabled()) {
+ // Hard-coded path in case of encrypted file system
+ return Environment.getSystemSecureDirectory().getPath() + File.separator + DATABASE_NAME;
+ } else {
+ // Regular path in case of non-encrypted file system
+ return DATABASE_NAME;
+ }
+ }
+
private class DatabaseHelper extends SQLiteOpenHelper {
+
public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ super(context, AccountManagerService.getDatabaseName(), null, DATABASE_VERSION);
}
@Override
diff --git a/core/java/android/annotation/SdkConstant.java b/core/java/android/annotation/SdkConstant.java
index 6ac70f0..0a53186 100644
--- a/core/java/android/annotation/SdkConstant.java
+++ b/core/java/android/annotation/SdkConstant.java
@@ -29,7 +29,7 @@
@Retention(RetentionPolicy.SOURCE)
public @interface SdkConstant {
public static enum SdkConstantType {
- ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY;
+ ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
}
SdkConstantType value();
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 49ebce3..1c3414d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2087,8 +2087,8 @@
event.setPackageName(getPackageName());
LayoutParams params = getWindow().getAttributes();
- boolean isFullScreen = (params.width == LayoutParams.FILL_PARENT) &&
- (params.height == LayoutParams.FILL_PARENT);
+ boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
+ (params.height == LayoutParams.MATCH_PARENT);
event.setFullScreen(isFullScreen);
CharSequence title = getTitle();
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 676d6d56..932ad53 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -606,7 +606,7 @@
public int uid;
/**
- * The tag that was provided when the process crashed.
+ * The activity name associated with the error, if known. May be null.
*/
public String tag;
@@ -622,7 +622,6 @@
/**
* The stack trace where the error originated. May be null.
- * @pending
*/
public String stackTrace;
@@ -891,6 +890,38 @@
}
/**
+ * @deprecated This is now just a wrapper for
+ * {@link #killBackgroundProcesses(String)}; the previous behavior here
+ * is no longer available to applications because it allows them to
+ * break other applications by removing their alarms, stopping their
+ * services, etc.
+ */
+ @Deprecated
+ public void restartPackage(String packageName) {
+ killBackgroundProcesses(packageName);
+ }
+
+ /**
+ * Have the system immediately kill all background processes associated
+ * with the given package. This is the same as the kernel killing those
+ * processes to reclaim memory; the system will take care of restarting
+ * these processes in the future as needed.
+ *
+ * <p>You must hold the permission
+ * {@link android.Manifest.permission#KILL_BACKGROUND_PROCESSES} to be able to
+ * call this method.
+ *
+ * @param packageName The name of the package whose processes are to
+ * be killed.
+ */
+ public void killBackgroundProcesses(String packageName) {
+ try {
+ ActivityManagerNative.getDefault().killBackgroundProcesses(packageName);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
* Have the system perform a force stop of everything associated with
* the given application package. All processes that share its uid
* will be killed, all services it has running stopped, all activities
@@ -899,14 +930,18 @@
* be stopped, notifications removed, etc.
*
* <p>You must hold the permission
- * {@link android.Manifest.permission#RESTART_PACKAGES} to be able to
+ * {@link android.Manifest.permission#FORCE_STOP_PACKAGES} to be able to
* call this method.
*
* @param packageName The name of the package to be stopped.
+ *
+ * @hide This is not available to third party applications due to
+ * it allowing them to break other applications by stopping their
+ * services, removing their alarms, etc.
*/
- public void restartPackage(String packageName) {
+ public void forceStopPackage(String packageName) {
try {
- ActivityManagerNative.getDefault().restartPackage(packageName);
+ ActivityManagerNative.getDefault().forceStopPackage(packageName);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index a0498aa..09b88ee 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -979,13 +979,23 @@
return true;
}
- case HANDLE_APPLICATION_ERROR_TRANSACTION: {
+ case HANDLE_APPLICATION_CRASH_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IBinder app = data.readStrongBinder();
+ ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
+ handleApplicationCrash(app, ci);
+ reply.writeNoException();
+ return true;
+ }
+
+ case HANDLE_APPLICATION_WTF_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder app = data.readStrongBinder();
String tag = data.readString();
ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
- handleApplicationError(app, tag, ci);
+ boolean res = handleApplicationWtf(app, tag, ci);
reply.writeNoException();
+ reply.writeInt(res ? 1 : 0);
return true;
}
@@ -997,10 +1007,18 @@
return true;
}
- case RESTART_PACKAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
+ case KILL_BACKGROUND_PROCESSES_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
String packageName = data.readString();
- restartPackage(packageName);
+ killBackgroundProcesses(packageName);
+ reply.writeNoException();
+ return true;
+ }
+
+ case FORCE_STOP_PACKAGE_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ String packageName = data.readString();
+ forceStopPackage(packageName);
reply.writeNoException();
return true;
}
@@ -2337,7 +2355,20 @@
/* this base class version is never called */
return true;
}
- public void handleApplicationError(IBinder app, String tag,
+ public void handleApplicationCrash(IBinder app,
+ ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException
+ {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(app);
+ crashInfo.writeToParcel(data, 0);
+ mRemote.transact(HANDLE_APPLICATION_CRASH_TRANSACTION, data, reply, 0);
+ reply.readException();
+ reply.recycle();
+ data.recycle();
+ }
+ public boolean handleApplicationWtf(IBinder app, String tag,
ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException
{
Parcel data = Parcel.obtain();
@@ -2346,10 +2377,12 @@
data.writeStrongBinder(app);
data.writeString(tag);
crashInfo.writeToParcel(data, 0);
- mRemote.transact(HANDLE_APPLICATION_ERROR_TRANSACTION, data, reply, 0);
+ mRemote.transact(HANDLE_APPLICATION_WTF_TRANSACTION, data, reply, 0);
reply.readException();
+ boolean res = reply.readInt() != 0;
reply.recycle();
data.recycle();
+ return res;
}
public void signalPersistentProcesses(int sig) throws RemoteException {
@@ -2363,12 +2396,23 @@
reply.recycle();
}
- public void restartPackage(String packageName) throws RemoteException {
+ public void killBackgroundProcesses(String packageName) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
- mRemote.transact(RESTART_PACKAGE_TRANSACTION, data, reply, 0);
+ mRemote.transact(KILL_BACKGROUND_PROCESSES_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
+ public void forceStopPackage(String packageName) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeString(packageName);
+ mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index 20a579a..2603579 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -40,7 +40,7 @@
*
* <pre>
* FrameLayout fl = (FrameLayout) findViewById(R.id.body);
- * fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
+ * fl.add(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
* </pre>
*
* <p>The AlertDialog class takes care of automatically setting
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index de370d2..d89b877 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -466,14 +466,7 @@
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
- File dir = getDatabasesDir();
- if (!dir.isDirectory() && dir.mkdir()) {
- FileUtils.setPermissions(dir.getPath(),
- FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
- -1, -1);
- }
-
- File f = makeFilename(dir, name);
+ File f = validateFilePath(name, true);
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
setFilePermissionsFromMode(f.getPath(), mode, 0);
return db;
@@ -482,7 +475,7 @@
@Override
public boolean deleteDatabase(String name) {
try {
- File f = makeFilename(getDatabasesDir(), name);
+ File f = validateFilePath(name, false);
return f.delete();
} catch (Exception e) {
}
@@ -491,7 +484,7 @@
@Override
public File getDatabasePath(String name) {
- return makeFilename(getDatabasesDir(), name);
+ return validateFilePath(name, false);
}
@Override
@@ -1454,12 +1447,35 @@
FileUtils.setPermissions(name, perms, -1, -1);
}
+ private File validateFilePath(String name, boolean createDirectory) {
+ File dir;
+ File f;
+
+ if (name.charAt(0) == File.separatorChar) {
+ String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
+ dir = new File(dirPath);
+ name = name.substring(name.lastIndexOf(File.separatorChar));
+ f = new File(dir, name);
+ } else {
+ dir = getDatabasesDir();
+ f = makeFilename(dir, name);
+ }
+
+ if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
+ FileUtils.setPermissions(dir.getPath(),
+ FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
+ -1, -1);
+ }
+
+ return f;
+ }
+
private File makeFilename(File base, String name) {
if (name.indexOf(File.separatorChar) < 0) {
return new File(base, name);
}
throw new IllegalArgumentException(
- "File " + name + " contains a path separator");
+ "File " + name + " contains a path separator");
}
// ----------------------------------------------------------------------
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index e89b3ad0..a4b692f 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -195,6 +195,7 @@
StringWriter sw = new StringWriter();
tr.printStackTrace(new PrintWriter(sw));
stackTrace = sw.toString();
+ exceptionMessage = tr.getMessage();
// Populate fields with the "root cause" exception
while (tr.getCause() != null) {
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 58e8b32..fa5d4a88 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -668,8 +668,8 @@
event.setPackageName(mContext.getPackageName());
LayoutParams params = getWindow().getAttributes();
- boolean isFullScreen = (params.width == LayoutParams.FILL_PARENT) &&
- (params.height == LayoutParams.FILL_PARENT);
+ boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT) &&
+ (params.height == LayoutParams.MATCH_PARENT);
event.setFullScreen(isFullScreen);
return false;
diff --git a/core/java/android/app/ExpandableListActivity.java b/core/java/android/app/ExpandableListActivity.java
index a2e048f..9651078 100644
--- a/core/java/android/app/ExpandableListActivity.java
+++ b/core/java/android/app/ExpandableListActivity.java
@@ -65,21 +65,21 @@
* <?xml version="1.0" encoding="UTF-8"?>
* <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
* android:orientation="vertical"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:paddingLeft="8dp"
* android:paddingRight="8dp">
*
* <ExpandableListView android:id="@id/android:list"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:background="#00FF00"
* android:layout_weight="1"
* android:drawSelectorOnTop="false"/>
*
* <TextView android:id="@id/android:empty"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:background="#FF0000"
* android:text="No data"/>
* </LinearLayout>
@@ -114,19 +114,19 @@
* <pre>
* <?xml version="1.0" encoding="utf-8"?>
* <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"
* android:orientation="vertical">
*
* <TextView android:id="@+id/text1"
* android:textSize="16sp"
* android:textStyle="bold"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"/>
*
* <TextView android:id="@+id/text2"
* android:textSize="16sp"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"/>
* </LinearLayout>
* </pre>
diff --git a/core/java/android/app/IActivityController.aidl b/core/java/android/app/IActivityController.aidl
index 804dd61..c76a517 100644
--- a/core/java/android/app/IActivityController.aidl
+++ b/core/java/android/app/IActivityController.aidl
@@ -44,7 +44,7 @@
* it immediately.
*/
boolean appCrashed(String processName, int pid,
- String tag, String shortMsg, String longMsg,
+ String shortMsg, String longMsg,
long timeMillis, String stackTrace);
/**
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index c890c4c..016d465 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -216,7 +216,8 @@
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) throws RemoteException;
- public void restartPackage(final String packageName) throws RemoteException;
+ public void killBackgroundProcesses(final String packageName) throws RemoteException;
+ public void forceStopPackage(final String packageName) throws RemoteException;
// Note: probably don't want to allow applications access to these.
public void goingToSleep() throws RemoteException;
@@ -242,8 +243,9 @@
// Special low-level communication with activity manager.
public void startRunning(String pkg, String cls, String action,
String data) throws RemoteException;
-
- public void handleApplicationError(IBinder app, String tag,
+ public void handleApplicationCrash(IBinder app,
+ ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException;
+ public boolean handleApplicationWtf(IBinder app, String tag,
ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException;
/*
@@ -349,7 +351,7 @@
// Please keep these transaction codes the same -- they are also
// sent by C++ code.
int START_RUNNING_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
- int HANDLE_APPLICATION_ERROR_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
+ int HANDLE_APPLICATION_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
int UNHANDLED_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
int OPEN_CONTENT_URI_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
@@ -423,7 +425,7 @@
int GET_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+75;
int GET_PROCESSES_IN_ERROR_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+76;
int CLEAR_APP_DATA_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+77;
- int RESTART_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+78;
+ int FORCE_STOP_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+78;
int KILL_PIDS_FOR_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+79;
int GET_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+80;
int REPORT_PSS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+81;
@@ -446,4 +448,6 @@
int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
int START_ACTIVITY_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+99;
int OVERRIDE_PENDING_TRANSITION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+100;
+ int HANDLE_APPLICATION_WTF_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+101;
+ int KILL_BACKGROUND_PROCESSES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+102;
}
diff --git a/core/java/android/app/ListActivity.java b/core/java/android/app/ListActivity.java
index 19b99c8..4b4cc05 100644
--- a/core/java/android/app/ListActivity.java
+++ b/core/java/android/app/ListActivity.java
@@ -56,21 +56,21 @@
* <?xml version="1.0" encoding="utf-8"?>
* <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
* android:orientation="vertical"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:paddingLeft="8dp"
* android:paddingRight="8dp">
*
* <ListView android:id="@id/android:list"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:background="#00FF00"
* android:layout_weight="1"
* android:drawSelectorOnTop="false"/>
*
* <TextView id="@id/android:empty"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
* android:background="#FF0000"
* android:text="No data"/>
* </LinearLayout>
@@ -100,19 +100,19 @@
* <pre>
* <?xml version="1.0" encoding="utf-8"?>
* <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"
* android:orientation="vertical">
*
* <TextView android:id="@+id/text1"
* android:textSize="16sp"
* android:textStyle="bold"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"/>
*
* <TextView android:id="@+id/text2"
* android:textSize="16sp"
- * android:layout_width="fill_parent"
+ * android:layout_width="match_parent"
* android:layout_height="wrap_content"/>
* </LinearLayout>
* </pre>
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index b204c79..b396396 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -60,7 +60,6 @@
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageButton;
-import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
@@ -106,7 +105,7 @@
// views & widgets
private TextView mBadgeLabel;
- private ImageView mAppIcon;
+ private SearchSourceSelector mSourceSelector;
private SearchAutoComplete mSearchAutoComplete;
private Button mGoButton;
private ImageButton mVoiceButton;
@@ -182,11 +181,11 @@
Window theWindow = getWindow();
WindowManager.LayoutParams lp = theWindow.getAttributes();
lp.type = WindowManager.LayoutParams.TYPE_SEARCH_BAR;
- lp.width = ViewGroup.LayoutParams.FILL_PARENT;
+ lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
// taking up the whole window (even when transparent) is less than ideal,
// but necessary to show the popup window until the window manager supports
// having windows anchored by their parent but not clipped by them.
- lp.height = ViewGroup.LayoutParams.FILL_PARENT;
+ lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
theWindow.setAttributes(lp);
@@ -209,7 +208,8 @@
mBadgeLabel = (TextView) findViewById(com.android.internal.R.id.search_badge);
mSearchAutoComplete = (SearchAutoComplete)
findViewById(com.android.internal.R.id.search_src_text);
- mAppIcon = (ImageView) findViewById(com.android.internal.R.id.search_app_icon);
+ mSourceSelector = new SearchSourceSelector(
+ findViewById(com.android.internal.R.id.search_source_selector));
mGoButton = (Button) findViewById(com.android.internal.R.id.search_go_btn);
mVoiceButton = (ImageButton) findViewById(com.android.internal.R.id.search_voice_btn);
mSearchPlate = findViewById(com.android.internal.R.id.search_plate);
@@ -606,13 +606,16 @@
}
private void updateSearchAppIcon() {
+ mSourceSelector.setSource(mSearchable.getSearchActivity());
+ mSourceSelector.setAppSearchData(mAppSearchData);
+
// In Donut, we special-case the case of the browser to hide the app icon as if it were
// global search, for extra space for url entry.
//
// TODO: Remove this special case once the issue has been reconciled in Eclair.
if (mGlobalSearchMode || isBrowserSearch()) {
- mAppIcon.setImageResource(0);
- mAppIcon.setVisibility(View.GONE);
+ mSourceSelector.setSourceIcon(null);
+ mSourceSelector.setVisibility(View.GONE);
mSearchPlate.setPadding(SEARCH_PLATE_LEFT_PADDING_GLOBAL,
mSearchPlate.getPaddingTop(),
mSearchPlate.getPaddingRight(),
@@ -628,8 +631,8 @@
icon = pm.getDefaultActivityIcon();
Log.w(LOG_TAG, mLaunchComponent + " not found, using generic app icon");
}
- mAppIcon.setImageDrawable(icon);
- mAppIcon.setVisibility(View.VISIBLE);
+ mSourceSelector.setSourceIcon(icon);
+ mSourceSelector.setVisibility(View.VISIBLE);
mSearchPlate.setPadding(SEARCH_PLATE_LEFT_PADDING_NON_GLOBAL,
mSearchPlate.getPaddingTop(),
mSearchPlate.getPaddingRight(),
@@ -812,6 +815,7 @@
if (!mSearchAutoComplete.isPerformingCompletion()) {
// The user changed the query, remember it.
mUserQuery = s == null ? "" : s.toString();
+ mSourceSelector.setQuery(mUserQuery);
}
}
@@ -1927,6 +1931,7 @@
query = "";
}
mUserQuery = query;
+ mSourceSelector.setQuery(query);
mSearchAutoComplete.setText(query);
mSearchAutoComplete.setSelection(query.length());
}
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 5d9034b..a75e8dc 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1346,6 +1346,7 @@
* @hide Pending API council approval
*/
public final static String SELECT_INITIAL_QUERY = "select_initial_query";
+
/**
* Defines the constants used in the communication between {@link android.app.SearchDialog} and
* the global search provider via {@link Cursor#respond(android.os.Bundle)}.
@@ -1612,6 +1613,15 @@
public final static String SUGGEST_PARAMETER_LIMIT = "limit";
/**
+ * Intent action for opening the search source selection activity.
+ * The intent may include these extra values:
+ * {@link #QUERY},
+ * {@link #APP_DATA}.
+ */
+ public static final String INTENT_ACTION_SELECT_SEARCH_SOURCE
+ = "android.intent.action.SELECT_SEARCH_SOURCE";
+
+ /**
* If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
* the search dialog will switch to a different suggestion source when the
* suggestion is clicked.
@@ -2020,8 +2030,23 @@
}
/**
- * Gets information about a searchable activity. This method is static so that it can
- * be used from non-Activity contexts.
+ * Gets information about a searchable activity.
+ *
+ * @param componentName The activity to get searchable information for.
+ * @return Searchable information, or <code>null</code> if the activity does not
+ * exist, or is not searchable.
+ */
+ public SearchableInfo getSearchableInfo(ComponentName componentName) {
+ try {
+ return mService.getSearchableInfo(componentName, false);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "getSearchableInfo() failed: " + ex);
+ return null;
+ }
+ }
+
+ /**
+ * Gets information about a searchable activity.
*
* @param componentName The activity to get searchable information for.
* @param globalSearch If <code>false</code>, return information about the given activity.
diff --git a/core/java/android/app/SearchSourceSelector.java b/core/java/android/app/SearchSourceSelector.java
new file mode 100644
index 0000000..fabf858a
--- /dev/null
+++ b/core/java/android/app/SearchSourceSelector.java
@@ -0,0 +1,197 @@
+/*
+ * 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 android.app;
+
+import com.android.internal.R;
+
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageButton;
+
+import java.util.List;
+
+/**
+ * Utilities for setting up the search source selector.
+ *
+ * This class has two copies:
+ * android.app.SearchSourceSelector
+ * com.android.quicksearchbox.ui.SearchSourceSelector
+ *
+ * They should keep the same look and feel as much as possible,
+ * but only the intent details must absolutely stay in sync.
+ *
+ * @hide
+ */
+public class SearchSourceSelector implements View.OnClickListener {
+
+ private static final String TAG = "SearchSourceSelector";
+
+ // TODO: This should be defined in android.provider.Applications,
+ // and have a less made-up value.
+ private static final String APPLICATION_TYPE = "application/vnd.android.application";
+
+ public static final int ICON_VIEW_ID = R.id.search_source_selector_icon;
+
+ private final View mView;
+
+ private final ImageButton mIconView;
+
+ private ComponentName mSource;
+
+ private Bundle mAppSearchData;
+
+ private String mQuery;
+
+ public SearchSourceSelector(View view) {
+ mView = view;
+ mIconView = (ImageButton) view.findViewById(ICON_VIEW_ID);
+ mIconView.setOnClickListener(this);
+ }
+
+ /**
+ * Sets the icon displayed in the search source selector.
+ */
+ public void setSourceIcon(Drawable icon) {
+ mIconView.setImageDrawable(icon);
+ }
+
+ /**
+ * Sets the current search source.
+ */
+ public void setSource(ComponentName source) {
+ mSource = source;
+ }
+
+ /**
+ * Sets the app-specific data that will be passed to the search activity if
+ * the user opens the source selector and chooses a source.
+ */
+ public void setAppSearchData(Bundle appSearchData) {
+ mAppSearchData = appSearchData;
+ }
+
+ /**
+ * Sets the initial query that will be passed to the search activity if
+ * the user opens the source selector and chooses a source.
+ */
+ public void setQuery(String query) {
+ mQuery = query;
+ }
+
+ public void setVisibility(int visibility) {
+ mView.setVisibility(visibility);
+ }
+
+ /**
+ * Creates an intent for opening the search source selector activity.
+ *
+ * @param source The current search source.
+ * @param query The initial query that will be passed to the search activity if
+ * the user opens the source selector and chooses a source.
+ * @param appSearchData The app-specific data that will be passed to the search
+ * activity if the user opens the source selector and chooses a source.
+ */
+ public static Intent createIntent(ComponentName source, String query, Bundle appSearchData) {
+ Intent intent = new Intent(SearchManager.INTENT_ACTION_SELECT_SEARCH_SOURCE);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ Uri sourceUri = componentNameToUri(source);
+ if (sourceUri != null) {
+ intent.setDataAndType(sourceUri, APPLICATION_TYPE);
+ }
+ if (query != null) {
+ intent.putExtra(SearchManager.QUERY, query);
+ }
+ if (query != null) {
+ intent.putExtra(SearchManager.APP_DATA, appSearchData);
+ }
+ return intent;
+ }
+
+ /**
+ * Gets the search source from which the given
+ * {@link SearchManager.INTENT_ACTION_SELECT_SEARCH_SOURCE} intent was sent.
+ */
+ public static ComponentName getSource(Intent intent) {
+ return uriToComponentName(intent.getData());
+ }
+
+ private static Uri componentNameToUri(ComponentName name) {
+ if (name == null) return null;
+ // TODO: This URI format is specificed in android.provider.Applications which is @hidden
+ return new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority("applications")
+ .appendEncodedPath("applications")
+ .appendPath(name.getPackageName())
+ .appendPath(name.getClassName())
+ .build();
+ }
+
+ private static ComponentName uriToComponentName(Uri uri) {
+ if (uri == null) return null;
+ List<String> path = uri.getPathSegments();
+ if (path == null || path.size() != 3) return null;
+ String pkg = path.get(1);
+ String cls = path.get(2);
+ if (TextUtils.isEmpty(pkg) || TextUtils.isEmpty(cls)) return null;
+ return new ComponentName(pkg, cls);
+ }
+
+ public void onClick(View v) {
+ trigger();
+ }
+
+ private void trigger() {
+ try {
+ Intent intent = createIntent(mSource, mQuery, mAppSearchData);
+ intent.setSourceBounds(getOnScreenRect(mIconView));
+ mIconView.getContext().startActivity(intent);
+ } catch (ActivityNotFoundException ex) {
+ Log.e(TAG, "No source selector activity found", ex);
+ }
+ }
+
+ // TODO: This code is replicated in lots of places:
+ // - android.provider.ContactsContract.QuickContact.showQuickContact()
+ // - android.widget.RemoteViews.setOnClickPendingIntent()
+ // - com.android.launcher2.Launcher.onClick()
+ // - com.android.launcher.Launcher.onClick()
+ // - com.android.server.status.StatusBarService.Launcher.onClick()
+ private static Rect getOnScreenRect(View v) {
+ final float appScale = v.getResources().getCompatibilityInfo().applicationScale;
+ final int[] pos = new int[2];
+ v.getLocationOnScreen(pos);
+ final Rect rect = new Rect();
+ rect.left = (int) (pos[0] * appScale + 0.5f);
+ rect.top = (int) (pos[1] * appScale + 0.5f);
+ rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f);
+ rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f);
+ return rect;
+ }
+
+}
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index 2f719f3..792b289 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -311,8 +311,8 @@
// Take requested dimensions from child, but apply default gravity.
FrameLayout.LayoutParams requested = (FrameLayout.LayoutParams)view.getLayoutParams();
if (requested == null) {
- requested = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.FILL_PARENT);
+ requested = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT);
}
requested.gravity = Gravity.CENTER;
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index fda9b81..7e5f858 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -83,6 +83,8 @@
/** Default priority for a2dp devices that should not allow incoming
* connections */
public static final int PRIORITY_OFF = 0;
+ /** Default priority when not set or when the device is unpaired */
+ public static final int PRIORITY_UNDEFINED = -1;
private final IBluetoothA2dp mService;
private final Context mContext;
diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java
index 5eb655a..b792965 100644
--- a/core/java/android/bluetooth/BluetoothHeadset.java
+++ b/core/java/android/bluetooth/BluetoothHeadset.java
@@ -109,6 +109,8 @@
/** Default priority for headsets that should not be auto-connected
* and not allow incoming connections. */
public static final int PRIORITY_OFF = 0;
+ /** Default priority when not set or when the device is unpaired */
+ public static final int PRIORITY_UNDEFINED = -1;
/** The voice dialer 'works' but the user experience is poor. The voice
* recognizer has trouble dealing with the 8kHz SCO signal, and it still
diff --git a/core/java/android/bluetooth/package.html b/core/java/android/bluetooth/package.html
index 4f0755e..5ff240c 100644
--- a/core/java/android/bluetooth/package.html
+++ b/core/java/android/bluetooth/package.html
@@ -12,96 +12,16 @@
<li>Transfer data to and from other devices</li>
</ul>
-<p class="note"><strong>Note:</strong>
+<p>
To perform Bluetooth communication using these APIs, an application must
declare the {@link android.Manifest.permission#BLUETOOTH} permission. Some
-additional functionality, such as requesting device discovery and
-pairing also requires the {@link android.Manifest.permission#BLUETOOTH_ADMIN}
+additional functionality, such as requesting device discovery,
+also requires the {@link android.Manifest.permission#BLUETOOTH_ADMIN}
permission.
</p>
-<h3>Overview</h3>
-
-<p>Here's a basic introduction to the Bluetooth classes:</p>
-<dl>
- <dt>{@link android.bluetooth.BluetoothAdapter}</dt>
- <dd>This represents the local Bluetooth adapter, which is essentially the
- entry-point to performing any interaction with Bluetooth. With it, you can
- discover other Bluetooth devices, query a list of bonded (paired) devices,
- initialize a {@link android.bluetooth.BluetoothDevice} using a known MAC
- address, and create a {@link android.bluetooth.BluetoothServerSocket} to
- listen for communications from other devices.</dd>
-
- <dt>{@link android.bluetooth.BluetoothDevice}</dt>
- <dd>This represents a remote Bluetooth device. Use this to request a
- connection with a remote device through a
- {@link android.bluetooth.BluetoothSocket}
- or query information about the device such as its name, address, class, and
- bonding state.</dd>
-
- <dt>{@link android.bluetooth.BluetoothSocket}</dt>
- <dd>This represents the interface for a Bluetooth socket
- (similar to a TCP client-side {@link java.net.Socket}). This is the
- connection point that allows an app to transfer data with another Bluetooth
- device via {@link java.io.InputStream} and {@link java.io.OutputStream}.</dd>
- <dt>{@link android.bluetooth.BluetoothServerSocket}</dt>
-
- <dd>This represents an open server socket that listens for incoming requests
- (similar to a TCP server-side {@link java.net.ServerSocket}).
- When attempting to connect two Android devices, one device will need to open
- a server socket with this class. When a connection is accepted, a new
- {@link android.bluetooth.BluetoothSocket} will be returned,
- which can be used to manage the connection and transfer data.</dd>
-
- <dt>{@link android.bluetooth.BluetoothClass}</dt>
- <dd>This represents the Bluetooth class for a device which describes general
- characteristics and capabilities of a device. This class and its subclasses
- don't provide any actual functionality. The sub-classes are entirely composed
- of constants for the device and service class definitions.</dd>
-</dl>
-
-
-<h3>Example Procedure</h3>
-
-<p>For example, here's an pseudo-code procedure for discovering and
-connecting a remote device, and transfering data:</p>
-
-<ol>
- <li>Register a {@link android.content.BroadcastReceiver} that accepts the
- {@link android.bluetooth.BluetoothDevice#ACTION_FOUND} Intent.</li>
- <li>Call {@link android.bluetooth.BluetoothAdapter#getDefaultAdapter} to
- retrieve the Android system's local
- {@link android.bluetooth.BluetoothAdapter}.</li>
- <li>Call {@link android.bluetooth.BluetoothAdapter#startDiscovery()
- BluetoothAdapter.startDiscovery()} to scan for local devices. This is where
- the BroadcastReceiver comes in; Android now scans for devices and will
- broadcast the {@link android.bluetooth.BluetoothDevice#ACTION_FOUND} Intent
- for each remote device discovered. The
- {@link android.content.BroadcastReceiver}
- you created will receive each Intent.</li>
- <li>The {@link android.bluetooth.BluetoothDevice#ACTION_FOUND} Intent
- includes the {@link android.bluetooth.BluetoothDevice#EXTRA_DEVICE}
- Parcelable extra, which is a {@link android.bluetooth.BluetoothDevice}
- object. Extract this from the Intent and call
- {@link android.bluetooth.BluetoothDevice#createRfcommSocketToServiceRecord(java.util.UUID)
- BluetoothDevice.createRfcommSocketToServiceRecord()}
- to open a {@link android.bluetooth.BluetoothSocket} with a chosen
- remote device.</li>
- <li>Call {@link android.bluetooth.BluetoothSocket#connect()
- BluetoothSocket.connect()} to connect with the remote device.</li>
- <li>When successfully connected, call
- {@link android.bluetooth.BluetoothSocket#getInputStream()
- BluetoothSocket.getInputStream()} and/or
- {@link android.bluetooth.BluetoothSocket#getOutputStream()
- BluetoothSocket.getOutputStream()} to retreive an
- {@link java.io.InputStream} and {@link java.io.OutputStream}, respectively,
- which are hooked into the socket.</li>
- <li>Use {@link java.io.InputStream#read(byte[]) InputStream.read()} and
- {@link java.io.OutputStream#write(byte[]) OutputStream.write()} to transfer
- data.</li>
-</ol>
-
-
+<p>For a detailed guide to using the Bluetooth APIs, see the <a
+href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth Dev Guide topic</a>.</p>
<p class="note"><strong>Note:</strong>
Not all Android devices are guaranteed to have Bluetooth functionality.</p>
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 6e7e6d7f..eb2d7b1 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -88,11 +88,11 @@
* <code>content://com.company.provider.imap/inbox/1</code> for a particular
* message in the inbox, whose MIME type would be reported as
* <code>CURSOR_ITEM_BASE_TYPE + "/vnd.company.imap-msg"</code>
- *
+ *
* <p>Compare with {@link #CURSOR_DIR_BASE_TYPE}.
*/
public static final String CURSOR_ITEM_BASE_TYPE = "vnd.android.cursor.item";
-
+
/**
* This is the Android platform's base MIME type for a content: URI
* containing a Cursor of zero or more items. Applications should use this
@@ -102,7 +102,7 @@
* <code>content://com.company.provider.imap/inbox</code> for all of the
* messages in its inbox, whose MIME type would be reported as
* <code>CURSOR_DIR_BASE_TYPE + "/vnd.company.imap-msg"</code>
- *
+ *
* <p>Note how the base MIME type varies between this and
* {@link #CURSOR_ITEM_BASE_TYPE} depending on whether there is
* one single item or multiple items in the data set, while the sub-type
@@ -173,13 +173,25 @@
}
/**
+ * <p>
* Query the given URI, returning a {@link Cursor} over the result set.
+ * </p>
+ * <p>
+ * For best performance, the caller should follow these guidelines:
+ * <ul>
+ * <li>Provide an explicit projection, to prevent
+ * reading data from storage that aren't going to be used.</li>
+ * <li>Use question mark parameter markers such as 'phone=?' instead of
+ * explicit values in the {@code selection} parameter, so that queries
+ * that differ only by those values will be recognized as the same
+ * for caching purposes.</li>
+ * </ul>
+ * </p>
*
* @param uri The URI, using the content:// scheme, for the content to
* retrieve.
* @param projection A list of which columns to return. Passing null will
- * return all columns, which is discouraged to prevent reading data
- * from storage that isn't going to be used.
+ * return all columns, which is inefficient.
* @param selection A filter declaring which rows to return, formatted as an
* SQL WHERE clause (excluding the WHERE itself). Passing null will
* return all rows for the given URI.
@@ -225,10 +237,10 @@
* <li>android.resource ({@link #SCHEME_ANDROID_RESOURCE})</li>
* <li>file ({@link #SCHEME_FILE})</li>
* </ul>
- *
+ *
* <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information
* on these schemes.
- *
+ *
* @param uri The desired URI.
* @return InputStream
* @throws FileNotFoundException if the provided URI could not be opened.
@@ -283,7 +295,7 @@
*
* <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information
* on these schemes.
- *
+ *
* @param uri The desired URI.
* @param mode May be "w", "wa", "rw", or "rwt".
* @return OutputStream
@@ -318,7 +330,7 @@
*
* <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information
* on these schemes.
- *
+ *
* @param uri The desired URI to open.
* @param mode The file mode to use, as per {@link ContentProvider#openFile
* ContentProvider.openFile}.
@@ -334,19 +346,19 @@
if (afd == null) {
return null;
}
-
+
if (afd.getDeclaredLength() < 0) {
// This is a full file!
return afd.getParcelFileDescriptor();
}
-
+
// Client can't handle a sub-section of a file, so close what
// we got and bail with an exception.
try {
afd.close();
} catch (IOException e) {
}
-
+
throw new FileNotFoundException("Not a whole file");
}
@@ -491,7 +503,7 @@
res.id = id;
return res;
}
-
+
/** @hide */
static public int modeToMode(Uri uri, String mode) throws FileNotFoundException {
int modeBits;
@@ -518,7 +530,7 @@
}
return modeBits;
}
-
+
/**
* Inserts a row into a table at the given URL.
*
@@ -1146,7 +1158,7 @@
/** @hide */
public static final String CONTENT_SERVICE_NAME = "content";
-
+
/** @hide */
public static IContentService getContentService() {
if (sContentService != null) {
@@ -1158,7 +1170,7 @@
if (Config.LOGV) Log.v("ContentService", "default service = " + sContentService);
return sContentService;
}
-
+
private static IContentService sContentService;
private final Context mContext;
private static final String TAG = "ContentResolver";
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 2ab5357..0fafe5d 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1314,7 +1314,7 @@
/**
* Use with {@link #getSystemService} to retrieve a
- * {@blink android.appwidget.AppWidgetManager} for accessing AppWidgets.
+ * {@link android.appwidget.AppWidgetManager} for accessing AppWidgets.
*
* @hide
* @see #getSystemService
@@ -1323,7 +1323,7 @@
/**
* Use with {@link #getSystemService} to retrieve an
- * {@blink android.backup.IBackupManager IBackupManager} for communicating
+ * {@link android.backup.IBackupManager IBackupManager} for communicating
* with the backup mechanism.
* @hide
*
@@ -1333,7 +1333,7 @@
/**
* Use with {@link #getSystemService} to retrieve a
- * {@blink android.os.DropBox DropBox} instance for recording
+ * {@link android.os.DropBoxManager} instance for recording
* diagnostic logs.
* @see #getSystemService
*/
diff --git a/core/java/android/content/EventLogTags.logtags b/core/java/android/content/EventLogTags.logtags
deleted file mode 100644
index af50a3c..0000000
--- a/core/java/android/content/EventLogTags.logtags
+++ /dev/null
@@ -1,10 +0,0 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
-
-option java_package android.content
-
-# ---------------------------
-# SyncAdapter.java
-# ---------------------------
-# What happens in a sync operation (bytes sent and received, and
-# operation details)
-2743 sync_details (authority|3),(send|1|2),(recv|1|2),(details|3)
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index ec1252a..bf37b62 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -575,7 +575,7 @@
* {@link #setFlags} and {@link #addFlags}. See {@link #setFlags} for a list
* of all possible flags.
*/
-public class Intent implements Parcelable {
+public class Intent implements Parcelable, Cloneable {
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Standard intent activity actions (see action variable).
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index d436365..a9c61dc 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -859,8 +859,8 @@
}
// Cap the delay
- long maxSyncRetryTimeInSeconds = Settings.Gservices.getLong(mContext.getContentResolver(),
- Settings.Gservices.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
+ long maxSyncRetryTimeInSeconds = Settings.Secure.getLong(mContext.getContentResolver(),
+ Settings.Secure.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
DEFAULT_MAX_SYNC_RETRY_TIME_IN_SECONDS);
if (newDelayInMs > maxSyncRetryTimeInSeconds * 1000) {
newDelayInMs = maxSyncRetryTimeInSeconds * 1000;
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index d1fdfaf..4c53201 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -25,7 +25,6 @@
import org.xmlpull.v1.XmlSerializer;
import android.accounts.Account;
-import android.backup.IBackupManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@@ -37,7 +36,7 @@
import android.os.Parcel;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.util.Log;
import android.util.SparseArray;
import android.util.Xml;
@@ -258,7 +257,9 @@
mCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0"));
- File dataDir = Environment.getDataDirectory();
+ // This call will return the correct directory whether Encrypted File Systems is
+ // enabled or not.
+ File dataDir = Environment.getSecureDataDirectory();
File systemDir = new File(dataDir, "system");
File syncDir = new File(systemDir, "sync");
mAccountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
@@ -511,7 +512,7 @@
SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
status.pending = true;
- status.initialize = op.extras != null &&
+ status.initialize = op.extras != null &&
op.extras.containsKey(ContentResolver.SYNC_EXTRAS_INITIALIZE) &&
op.extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE);
}
diff --git a/core/java/android/content/package.html b/core/java/android/content/package.html
index dd5360f..eac679d 100644
--- a/core/java/android/content/package.html
+++ b/core/java/android/content/package.html
@@ -421,7 +421,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
<b>android:textSize="18" android:textColor="#008"</b>
android:text="Hello, World!" />
</root>
@@ -447,7 +447,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
<b>android:textColor="@color/opaque_red"</b>
android:text="Hello, World!" />
</root>
@@ -463,7 +463,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
android:textColor="@<b>android:</b>color/opaque_red"
android:text="Hello, World!" />
</root>
@@ -476,7 +476,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
android:textColor="@android:color/opaque_red"
android:text="@string/hello_world" />
</root>
@@ -509,7 +509,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
<b>android:textColor="?android:textDisabledColor"</b>
android:text="@string/hello_world" />
</root>
@@ -637,10 +637,10 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<EditText id="text1" <b>style="@style/SpecialText"</b>
- android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:layout_width="match_parent" android:layout_height="wrap_content"
android:text="Hello, World!" />
<EditText id="text2" <b>style="@style/SpecialText"</b>
- android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:layout_width="match_parent" android:layout_height="wrap_content"
android:text="I love you all." />
</root></pre>
<h4> </h4>
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 1800c30..3dea286 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -208,6 +208,16 @@
public static final int FLAG_RESTORE_NEEDS_APPLICATION = 1<<16;
/**
+ * Value for {@link #flags}: this is true if the application has set
+ * its android:neverEncrypt to true, false otherwise. It is used to specify
+ * that this package specifically "opts-out" of a secured file system solution,
+ * and will always store its data in-the-clear.
+ *
+ * {@hide}
+ */
+ public static final int FLAG_NEVER_ENCRYPT = 1<<17;
+
+ /**
* Flags associated with the application. Any combination of
* {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
* {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 03d2a6d..53a966d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -16,6 +16,8 @@
package android.content.pm;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -518,30 +520,35 @@
* {@link #hasSystemFeature}: The device has a camera facing away
* from the screen.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA = "android.hardware.camera";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's camera supports auto-focus.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's camera supports flash.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a light sensor.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_LIGHT = "android.hardware.sensor.light";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a proximity sensor.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_PROXIMITY = "android.hardware.sensor.proximity";
/**
@@ -549,30 +556,35 @@
* {@link #hasSystemFeature}: The device has a telephony radio with data
* communication support.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY = "android.hardware.telephony";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a CDMA telephony stack.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a GSM telephony stack.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's touch screen supports multitouch.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports live wallpapers.
*/
+ @SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 0754cbf..ad99f54 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1399,6 +1399,12 @@
ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
}
+ if (sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt,
+ false)) {
+ ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT;
+ }
+
String str;
str = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestApplication_permission);
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index 453a83d3..70baaef 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -44,7 +44,7 @@
* <selector xmlns:android="http://schemas.android.com/apk/res/android">
* <item android:state_focused="true" android:color="@color/testcolor1"/>
* <item android:state_pressed="true" android:state_enabled="false" android:color="@color/testcolor2" />
- * <item android:state_enabled="false" android:colore="@color/testcolor3" />
+ * <item android:state_enabled="false" android:color="@color/testcolor3" />
* <item android:state_active="true" android:color="@color/testcolor4" />
* <item android:color="@color/testcolor5"/>
* </selector>
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index 70b9b83..b178d4f 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -582,21 +582,23 @@
@Override
protected void finalize() {
try {
+ // if the cursor hasn't been closed yet, close it first
if (mWindow != null) {
close();
- String message = "Finalizing cursor " + this + " on " + mEditTable
- + " that has not been deactivated or closed";
+ Log.e(TAG, "Finalizing cursor that has not been deactivated or closed."
+ + " database = " + mDatabase.getPath() + ", table = " + mEditTable
+ + ", query = " + mQuery.mSql);
if (SQLiteDebug.DEBUG_ACTIVE_CURSOR_FINALIZATION) {
- Log.d(TAG, message + "\nThis cursor was created in:");
+ Log.d(TAG, "This cursor was created in:");
for (StackTraceElement ste : mStackTraceElements) {
Log.d(TAG, " " + ste);
}
}
SQLiteDebug.notifyActiveCursorFinalized();
- throw new IllegalStateException(message);
} else {
if (Config.LOGV) {
- Log.v(TAG, "Finalizing cursor " + this + " on " + mEditTable);
+ Log.v(TAG, "Finalizing cursor on database = " + mDatabase.getPath() +
+ ", table = " + mEditTable + ", query = " + mQuery.mSql);
}
}
} finally {
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 657bbcc..f310586 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -323,6 +323,7 @@
close();
} finally {
Log.e(TAG, "Removing corrupt database: " + mPath);
+ EventLog.writeEvent(EVENT_DB_CORRUPT, mPath);
// Delete the corrupt file. Don't re-create it now -- that would just confuse people
// -- but the next time someone tries to open it, they can set it up from scratch.
new File(mPath).delete();
diff --git a/core/java/android/ddm/DdmHandleHello.java b/core/java/android/ddm/DdmHandleHello.java
index c5d591f..0603ca5 100644
--- a/core/java/android/ddm/DdmHandleHello.java
+++ b/core/java/android/ddm/DdmHandleHello.java
@@ -152,8 +152,8 @@
"hprof-heap-dump", "method-trace-profiling"
};
- if (Config.LOGD)
- Log.d("ddm-heap", "Got feature list request");
+ if (Config.LOGV)
+ Log.v("ddm-heap", "Got feature list request");
int size = 4 + 4 * features.length;
for (int i = features.length-1; i >= 0; i--)
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 271f973..0c6bb1a 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -364,7 +364,7 @@
final float[] values = new float[3];
final int[] status = new int[1];
final long timestamp[] = new long[1];
- Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY);
+ Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
if (!open()) {
return;
@@ -545,8 +545,8 @@
i = sensors_module_get_next_sensor(sensor, i);
if (i>=0) {
- Log.d(TAG, "found sensor: " + sensor.getName() +
- ", handle=" + sensor.getHandle());
+ //Log.d(TAG, "found sensor: " + sensor.getName() +
+ // ", handle=" + sensor.getHandle());
sensor.setLegacyType(getLegacySensorType(sensor.getType()));
fullList.add(sensor);
sHandleToSensor.append(sensor.getHandle(), sensor);
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 6978974..5d5bd9c 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -16,7 +16,7 @@
package android.inputmethodservice;
-import static android.view.ViewGroup.LayoutParams.FILL_PARENT;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.app.Dialog;
@@ -556,7 +556,7 @@
Context.LAYOUT_INFLATER_SERVICE);
mWindow = new SoftInputWindow(this, mTheme, mDispatcherState);
initViews();
- mWindow.getWindow().setLayout(FILL_PARENT, WRAP_CONTENT);
+ mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
}
/**
@@ -803,8 +803,8 @@
* candidates only mode changes.
*
* <p>The default implementation makes the layout for the window
- * FILL_PARENT x FILL_PARENT when in fullscreen mode, and
- * FILL_PARENT x WRAP_CONTENT when in non-fullscreen mode.
+ * MATCH_PARENT x MATCH_PARENT when in fullscreen mode, and
+ * MATCH_PARENT x WRAP_CONTENT when in non-fullscreen mode.
*
* @param win The input method's window.
* @param isFullscreen If true, the window is running in fullscreen mode
@@ -816,9 +816,9 @@
public void onConfigureWindow(Window win, boolean isFullscreen,
boolean isCandidatesOnly) {
if (isFullscreen) {
- mWindow.getWindow().setLayout(FILL_PARENT, FILL_PARENT);
+ mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT);
} else {
- mWindow.getWindow().setLayout(FILL_PARENT, WRAP_CONTENT);
+ mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
}
}
@@ -1056,8 +1056,8 @@
public void setExtractView(View view) {
mExtractFrame.removeAllViews();
mExtractFrame.addView(view, new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mExtractView = view;
if (view != null) {
mExtractEditText = (ExtractEditText)view.findViewById(
@@ -1086,7 +1086,7 @@
public void setCandidatesView(View view) {
mCandidatesFrame.removeAllViews();
mCandidatesFrame.addView(view, new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
}
@@ -1099,7 +1099,7 @@
public void setInputView(View view) {
mInputFrame.removeAllViews();
mInputFrame.addView(view, new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mInputView = view;
}
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index 76131fc..b0c3909 100755
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -1118,6 +1118,11 @@
if (action == MotionEvent.ACTION_DOWN) mSwipeTracker.clear();
mSwipeTracker.addMovement(me);
+ // Ignore all motion events until a DOWN.
+ if (mAbortKey && action != MotionEvent.ACTION_DOWN) {
+ return true;
+ }
+
if (mGestureDetector.onTouchEvent(me)) {
showPreview(NOT_A_KEY);
mHandler.removeMessages(MSG_REPEAT);
@@ -1150,9 +1155,14 @@
mKeys[keyIndex].codes[0] : 0);
if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) {
mRepeatKeyIndex = mCurrentKey;
- repeatKey();
Message msg = mHandler.obtainMessage(MSG_REPEAT);
mHandler.sendMessageDelayed(msg, REPEAT_START_DELAY);
+ repeatKey();
+ // Delivering the key could have caused an abort
+ if (mAbortKey) {
+ mRepeatKeyIndex = NOT_A_KEY;
+ break;
+ }
}
if (mCurrentKey != NOT_A_KEY) {
Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me);
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index 538e51a..b254961 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -60,12 +60,11 @@
* @param apnType the Phone apnType
* @param tag the name of this network
*/
- public MobileDataStateTracker(Context context, Handler target,
- int netType, String apnType, String tag) {
+ public MobileDataStateTracker(Context context, Handler target, int netType, String tag) {
super(context, target, netType,
TelephonyManager.getDefault().getNetworkType(), tag,
TelephonyManager.getDefault().getNetworkTypeName());
- mApnType = apnType;
+ mApnType = networkTypeToApnType(netType);
mPhoneService = null;
if(netType == ConnectivityManager.TYPE_MOBILE) {
mEnabled = true;
@@ -501,4 +500,22 @@
+ " APN type \"" + apnType + "\"");
return Phone.APN_REQUEST_FAILED;
}
+
+ public static String networkTypeToApnType(int netType) {
+ switch(netType) {
+ case ConnectivityManager.TYPE_MOBILE:
+ return Phone.APN_TYPE_DEFAULT; // TODO - use just one of these
+ case ConnectivityManager.TYPE_MOBILE_MMS:
+ return Phone.APN_TYPE_MMS;
+ case ConnectivityManager.TYPE_MOBILE_SUPL:
+ return Phone.APN_TYPE_SUPL;
+ case ConnectivityManager.TYPE_MOBILE_DUN:
+ return Phone.APN_TYPE_DUN;
+ case ConnectivityManager.TYPE_MOBILE_HIPRI:
+ return Phone.APN_TYPE_HIPRI;
+ default:
+ Log.e(TAG, "Error mapping networkType " + netType + " to apnType.");
+ return null;
+ }
+ }
}
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index a97b9e5..e40f1b8 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -16,11 +16,12 @@
package android.net;
-import android.net.http.DomainNameChecker;
import android.os.SystemProperties;
import android.util.Config;
import android.util.Log;
+import com.android.common.DomainNameValidator;
+
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
@@ -200,7 +201,7 @@
X509Certificate lastChainCert = (X509Certificate) certs[0];
- if (!DomainNameChecker.match(lastChainCert, destHost)) {
+ if (!DomainNameValidator.match(lastChainCert, destHost)) {
if (Config.LOGD) {
Log.d(LOG_TAG,"validateSocket(): domain name check failed");
}
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 9a1b65d..f2ea539 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -1567,51 +1567,40 @@
if (isOpaque()) {
throw new UnsupportedOperationException(NOT_HIERARCHICAL);
}
+ if (key == null) {
+ throw new NullPointerException("key");
+ }
- String query = getEncodedQuery();
-
+ final String query = getEncodedQuery();
if (query == null) {
return null;
}
- String encodedKey;
- try {
- encodedKey = URLEncoder.encode(key, DEFAULT_ENCODING);
- } catch (UnsupportedEncodingException e) {
- throw new AssertionError(e);
- }
+ final String encodedKey = encode(key, null);
+ final int encodedKeyLength = encodedKey.length();
- String prefix = encodedKey + "=";
+ int encodedKeySearchIndex = 0;
+ final int encodedKeySearchEnd = query.length() - (encodedKeyLength + 1);
- if (query.length() < prefix.length()) {
- return null;
- }
-
- int start;
- if (query.startsWith(prefix)) {
- // It's the first parameter.
- start = prefix.length();
- } else {
- // It must be later in the query string.
- prefix = "&" + prefix;
- start = query.indexOf(prefix);
-
- if (start == -1) {
- // Not found.
- return null;
+ while (encodedKeySearchIndex <= encodedKeySearchEnd) {
+ int keyIndex = query.indexOf(encodedKey, encodedKeySearchIndex);
+ if (keyIndex == -1) {
+ break;
}
-
- start += prefix.length();
+ final int equalsIndex = keyIndex + encodedKeyLength;
+ if (query.charAt(equalsIndex) != '=') {
+ encodedKeySearchIndex = equalsIndex + 1;
+ continue;
+ }
+ if (keyIndex == 0 || query.charAt(keyIndex - 1) == '&') {
+ int end = query.indexOf('&', equalsIndex);
+ if (end == -1) {
+ end = query.length();
+ }
+ return decode(query.substring(equalsIndex + 1, end));
+ }
}
-
- // Find end of value.
- int end = query.indexOf('&', start);
- if (end == -1) {
- end = query.length();
- }
-
- String value = query.substring(start, end);
- return decode(value);
+ return null;
}
/** Identifies a null parcelled Uri. */
diff --git a/core/java/android/net/http/CertificateChainValidator.java b/core/java/android/net/http/CertificateChainValidator.java
index ed6b4c2..da6af9d 100644
--- a/core/java/android/net/http/CertificateChainValidator.java
+++ b/core/java/android/net/http/CertificateChainValidator.java
@@ -16,6 +16,8 @@
package android.net.http;
+import com.android.common.DomainNameValidator;
+
import org.apache.harmony.xnet.provider.jsse.SSLParameters;
import java.io.IOException;
@@ -112,7 +114,7 @@
closeSocketThrowException(
sslSocket, "certificate for this site is null");
} else {
- if (!DomainNameChecker.match(currCertificate, domain)) {
+ if (!DomainNameValidator.match(currCertificate, domain)) {
String errorMessage = "certificate not for this host: " + domain;
if (HttpLog.LOGV) {
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index 7d2c698..d28148c 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -82,7 +82,7 @@
* <li><code>Result</code>, the type of the result of the background
* computation.</li>
* </ol>
- * <p>Not all types are always used by am asynchronous task. To mark a type as unused,
+ * <p>Not all types are always used by an asynchronous task. To mark a type as unused,
* simply use the type {@link Void}:</p>
* <pre>
* private class MyTask extends AsyncTask<Void, Void, Void> { ... }
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index e9353d8..fcd8f38 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -21,7 +21,7 @@
*/
public class Build {
/** Value used for when a build property is unknown. */
- private static final String UNKNOWN = "unknown";
+ public static final String UNKNOWN = "unknown";
/** Either a changelist number, or a label like "M4-rc20". */
public static final String ID = getString("ro.build.id");
@@ -41,6 +41,9 @@
/** The name of the instruction set (CPU type + ABI convention) of native code. */
public static final String CPU_ABI = getString("ro.product.cpu.abi");
+ /** The name of the second instruction set (CPU type + ABI convention) of native code. */
+ public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");
+
/** The manufacturer of the product/hardware. */
public static final String MANUFACTURER = getString("ro.product.manufacturer");
@@ -50,6 +53,15 @@
/** The end-user-visible name for the end product. */
public static final String MODEL = getString("ro.product.model");
+ /** @pending The system bootloader version number. */
+ public static final String BOOTLOADER = getString("ro.bootloader");
+
+ /** @pending The radio firmware version number. */
+ public static final String RADIO = getString("gsm.version.baseband");
+
+ /** @pending The device serial number. */
+ public static final String SERIAL = getString("ro.serialno");
+
/** Various version strings. */
public static class VERSION {
/**
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index b4f64b6..b33e8be 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -753,6 +753,16 @@
}
/**
+ * Dumps the contents of VM reference tables (e.g. JNI locals and
+ * globals) to the log file.
+ *
+ * @hide
+ */
+ public static final void dumpReferenceTables() {
+ VMDebug.dumpReferenceTables();
+ }
+
+ /**
* API for gathering and querying instruction counts.
*
* Example usage:
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index f761e8e..9491bd4 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -18,6 +18,8 @@
import java.io.File;
+import android.os.IMountService;
+
/**
* Provides access to environment variables.
*/
@@ -26,6 +28,10 @@
private static final File ROOT_DIRECTORY
= getDirectory("ANDROID_ROOT", "/system");
+ private static final String SYSTEM_PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
+
+ private static IMountService mMntSvc = null;
+
/**
* Gets the Android root directory.
*/
@@ -33,9 +39,55 @@
return ROOT_DIRECTORY;
}
+ /**
+ * Gets the system directory available for secure storage.
+ * If Encrypted File system is enabled, it returns an encrypted directory (/data/secure/system).
+ * Otherwise, it returns the unencrypted /data/system directory.
+ * @return File object representing the secure storage system directory.
+ * @hide
+ */
+ public static File getSystemSecureDirectory() {
+ if (isEncryptedFilesystemEnabled()) {
+ return new File(SECURE_DATA_DIRECTORY, "system");
+ } else {
+ return new File(DATA_DIRECTORY, "system");
+ }
+ }
+
+ /**
+ * Gets the data directory for secure storage.
+ * If Encrypted File system is enabled, it returns an encrypted directory (/data/secure).
+ * Otherwise, it returns the unencrypted /data directory.
+ * @return File object representing the data directory for secure storage.
+ * @hide
+ */
+ public static File getSecureDataDirectory() {
+ if (isEncryptedFilesystemEnabled()) {
+ return SECURE_DATA_DIRECTORY;
+ } else {
+ return DATA_DIRECTORY;
+ }
+ }
+
+ /**
+ * Returns whether the Encrypted File System feature is enabled on the device or not.
+ * @return <code>true</code> if Encrypted File System feature is enabled, <code>false</code>
+ * if disabled.
+ * @hide
+ */
+ public static boolean isEncryptedFilesystemEnabled() {
+ return SystemProperties.getBoolean(SYSTEM_PROPERTY_EFS_ENABLED, false);
+ }
+
private static final File DATA_DIRECTORY
= getDirectory("ANDROID_DATA", "/data");
+ /**
+ * @hide
+ */
+ private static final File SECURE_DATA_DIRECTORY
+ = getDirectory("ANDROID_SECURE_DATA", "/data/secure");
+
private static final File EXTERNAL_STORAGE_DIRECTORY
= getDirectory("EXTERNAL_STORAGE", "/sdcard");
@@ -119,9 +171,19 @@
/**
* Gets the current state of the external storage device.
+ * Note: This call should be deprecated as it doesn't support
+ * multiple volumes.
*/
public static String getExternalStorageState() {
- return SystemProperties.get("EXTERNAL_STORAGE_STATE", MEDIA_REMOVED);
+ try {
+ if (mMntSvc == null) {
+ mMntSvc = IMountService.Stub.asInterface(ServiceManager
+ .getService("mount"));
+ }
+ return mMntSvc.getVolumeState(getExternalStorageDirectory().toString());
+ } catch (Exception rex) {
+ return Environment.MEDIA_REMOVED;
+ }
}
static File getDirectory(String variableName, String defaultPath) {
diff --git a/core/java/android/os/FileObserver.java b/core/java/android/os/FileObserver.java
index 38d252e..3457815 100644
--- a/core/java/android/os/FileObserver.java
+++ b/core/java/android/os/FileObserver.java
@@ -103,9 +103,7 @@
try {
observer.onEvent(mask, path);
} catch (Throwable throwable) {
- Log.e(LOG_TAG, "Unhandled throwable " + throwable.toString() +
- " (returned by observer " + observer + ")", throwable);
- RuntimeInit.crash("FileObserver", throwable);
+ Log.wtf(LOG_TAG, "Unhandled exception in FileObserver " + observer, throwable);
}
}
}
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 51dfb5b..4780cf3 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -153,14 +153,16 @@
public static String readTextFile(File file, int max, String ellipsis) throws IOException {
InputStream input = new FileInputStream(file);
try {
- if (max > 0) { // "head" mode: read the first N bytes
+ long size = file.length();
+ if (max > 0 || (size > 0 && max == 0)) { // "head" mode: read the first N bytes
+ if (size > 0 && (max == 0 || size < max)) max = (int) size;
byte[] data = new byte[max + 1];
int length = input.read(data);
if (length <= 0) return "";
if (length <= max) return new String(data, 0, length);
if (ellipsis == null) return new String(data, 0, max);
return new String(data, 0, max) + ellipsis;
- } else if (max < 0) { // "tail" mode: read it all, keep the last N
+ } else if (max < 0) { // "tail" mode: keep the last N
int len;
boolean rolled = false;
byte[] last = null, data = null;
@@ -180,7 +182,7 @@
}
if (ellipsis == null || !rolled) return new String(last);
return ellipsis + new String(last);
- } else { // "cat" mode: read it all
+ } else { // "cat" mode: size unknown, read it all in streaming fashion
ByteArrayOutputStream contents = new ByteArrayOutputStream();
int len;
byte[] data = new byte[1024];
diff --git a/core/java/android/os/ICheckinService.aidl b/core/java/android/os/ICheckinService.aidl
index 619079a..e5609b0 100644
--- a/core/java/android/os/ICheckinService.aidl
+++ b/core/java/android/os/ICheckinService.aidl
@@ -29,6 +29,9 @@
/** Reboot into the recovery system and wipe all user data. */
void masterClear();
+ /** Reboot into the recovery system, wipe all user data and enable Encrypted File Systems. */
+ void masterClearAndToggleEFS(boolean efsEnabled);
+
/**
* Determine if the device is under parental control. Return null if
* we are unable to check the parental control status.
diff --git a/core/java/android/os/IMountService.aidl b/core/java/android/os/IMountService.aidl
index 96d44b6..e73569a 100644
--- a/core/java/android/os/IMountService.aidl
+++ b/core/java/android/os/IMountService.aidl
@@ -42,17 +42,17 @@
/**
* Mount external storage at given mount point.
*/
- void mountMedia(String mountPoint);
+ void mountVolume(String mountPoint);
/**
* Safely unmount external storage at given mount point.
*/
- void unmountMedia(String mountPoint);
+ void unmountVolume(String mountPoint);
/**
* Format external storage given a mount point.
*/
- void formatMedia(String mountPoint);
+ void formatVolume(String mountPoint);
/**
* Returns true if media notification sounds are enabled.
@@ -65,14 +65,46 @@
void setPlayNotificationSounds(boolean value);
/**
- * Returns true if USB Mass Storage is automatically started
- * when a UMS host is detected.
+ * Gets the state of an volume via it's mountpoint.
*/
- boolean getAutoStartUms();
+ String getVolumeState(String mountPoint);
+
+ /*
+ * Creates a secure container with the specified parameters.
+ * On success, the filesystem container-path is returned.
+ */
+ String createSecureContainer(String id, int sizeMb, String fstype, String key, int ownerUid);
+
+ /*
+ * Finalize a container which has just been created and populated.
+ * After finalization, the container is immutable.
+ */
+ void finalizeSecureContainer(String id);
+
+ /*
+ * Destroy a secure container, and free up all resources associated with it.
+ * NOTE: Ensure all references are released prior to deleting.
+ */
+ void destroySecureContainer(String id);
+
+ /*
+ * Mount a secure container with the specified key and owner UID.
+ * On success, the filesystem container-path is returned.
+ */
+ String mountSecureContainer(String id, String key, int ownerUid);
+
+ /*
+ * Returns the filesystem path of a mounted secure container.
+ */
+ String getSecureContainerPath(String id);
/**
- * Sets whether or not USB Mass Storage is automatically started
- * when a UMS host is detected.
+ * Gets an Array of currently known secure container IDs
*/
- void setAutoStartUms(boolean value);
+ String[] getSecureContainerList();
+
+ /**
+ * Shuts down the MountService and gracefully unmounts all external media.
+ */
+ void shutdown();
}
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 0afc537..23762ca 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -31,6 +31,7 @@
void preventScreenOn(boolean prevent);
boolean isScreenOn();
void reboot(String reason);
+ void crash(String message);
// sets the brightness of the backlights (screen, keyboard, button) 0-255
void setBacklightBrightness(int brightness);
diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java
index 03542dd..9742b05 100644
--- a/core/java/android/os/MemoryFile.java
+++ b/core/java/android/os/MemoryFile.java
@@ -52,7 +52,7 @@
private static native void native_write(FileDescriptor fd, int address, byte[] buffer,
int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException;
private static native void native_pin(FileDescriptor fd, boolean pin) throws IOException;
- private static native int native_get_mapped_size(FileDescriptor fd) throws IOException;
+ private static native int native_get_size(FileDescriptor fd) throws IOException;
private FileDescriptor mFD; // ashmem file descriptor
private int mAddress; // address of ashmem memory
@@ -300,20 +300,19 @@
* @hide
*/
public static boolean isMemoryFile(FileDescriptor fd) throws IOException {
- return (native_get_mapped_size(fd) >= 0);
+ return (native_get_size(fd) >= 0);
}
/**
- * Returns the size of the memory file, rounded up to a page boundary, that
- * the file descriptor refers to, or -1 if the file descriptor does not
- * refer to a memory file.
+ * Returns the size of the memory file that the file descriptor refers to,
+ * or -1 if the file descriptor does not refer to a memory file.
*
* @throws IOException If <code>fd</code> is not a valid file descriptor.
*
* @hide
*/
- public static int getMappedSize(FileDescriptor fd) throws IOException {
- return native_get_mapped_size(fd);
+ public static int getSize(FileDescriptor fd) throws IOException {
+ return native_get_size(fd);
}
/**
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index caf0923..bc653d6 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -115,9 +115,7 @@
didIdle = true;
keep = ((IdleHandler)idler).queueIdle();
} catch (Throwable t) {
- Log.e("MessageQueue",
- "IdleHandler threw exception", t);
- RuntimeInit.crash("MessageQueue", t);
+ Log.wtf("MessageQueue", "IdleHandler threw exception", t);
}
if (!keep) {
diff --git a/core/java/android/os/Power.java b/core/java/android/os/Power.java
index 3679e47..bc76180 100644
--- a/core/java/android/os/Power.java
+++ b/core/java/android/os/Power.java
@@ -17,6 +17,8 @@
package android.os;
import java.io.IOException;
+import android.os.ServiceManager;
+import android.os.IMountService;
/**
* Class that provides access to some of the power management functions.
@@ -97,5 +99,19 @@
* @throws IOException if reboot fails for some reason (eg, lack of
* permission)
*/
- public static native void reboot(String reason) throws IOException;
+ public static void reboot(String reason) throws IOException
+ {
+ IMountService mSvc = IMountService.Stub.asInterface(
+ ServiceManager.getService("mount"));
+
+ if (mSvc != null) {
+ try {
+ mSvc.shutdown();
+ } catch (Exception e) {
+ }
+ }
+ rebootNative(reason);
+ }
+
+ private static native void rebootNative(String reason) throws IOException ;
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 293dabc..e4eaf45b 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -326,12 +326,11 @@
{
synchronized (mToken) {
if (mHeld) {
+ Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
try {
mService.releaseWakeLock(mToken, 0);
} catch (RemoteException e) {
}
- RuntimeInit.crash(TAG, new Exception(
- "WakeLock finalized while still held: "+mTag));
}
}
}
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
new file mode 100644
index 0000000..3dd3918
--- /dev/null
+++ b/core/java/android/os/RecoverySystem.java
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2010 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 android.os;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.security.GeneralSecurityException;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import android.content.Context;
+import android.util.Log;
+
+import org.apache.harmony.security.asn1.BerInputStream;
+import org.apache.harmony.security.pkcs7.ContentInfo;
+import org.apache.harmony.security.pkcs7.SignedData;
+import org.apache.harmony.security.pkcs7.SignerInfo;
+import org.apache.harmony.security.provider.cert.X509CertImpl;
+
+/**
+ * RecoverySystem contains methods for interacting with the Android
+ * recovery system (the separate partition that can be used to install
+ * system updates, wipe user data, etc.)
+ */
+public class RecoverySystem {
+ private static final String TAG = "RecoverySystem";
+
+ /**
+ * Default location of zip file containing public keys (X509
+ * certs) authorized to sign OTA updates.
+ */
+ private static final File DEFAULT_KEYSTORE =
+ new File("/system/etc/security/otacerts.zip");
+
+ /** Send progress to listeners no more often than this (in ms). */
+ private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500;
+
+ /** Used to communicate with recovery. See bootable/recovery/recovery.c. */
+ private static File RECOVERY_DIR = new File("/cache/recovery");
+ private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
+ private static File LOG_FILE = new File(RECOVERY_DIR, "log");
+
+ // Length limits for reading files.
+ private static int LOG_FILE_MAX_LENGTH = 8 * 1024;
+
+ /**
+ * Interface definition for a callback to be invoked regularly as
+ * verification proceeds.
+ */
+ public interface ProgressListener {
+ /**
+ * Called periodically as the verification progresses.
+ *
+ * @param progress the approximate percentage of the
+ * verification that has been completed, ranging from 0
+ * to 100 (inclusive).
+ */
+ public void onProgress(int progress);
+ }
+
+ /** @return the set of certs that can be used to sign an OTA package. */
+ private static HashSet<Certificate> getTrustedCerts(File keystore)
+ throws IOException, GeneralSecurityException {
+ HashSet<Certificate> trusted = new HashSet<Certificate>();
+ if (keystore == null) {
+ keystore = DEFAULT_KEYSTORE;
+ }
+ ZipFile zip = new ZipFile(keystore);
+ try {
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ Enumeration<? extends ZipEntry> entries = zip.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ trusted.add(cf.generateCertificate(zip.getInputStream(entry)));
+ }
+ } finally {
+ zip.close();
+ }
+ return trusted;
+ }
+
+ /**
+ * Verify the cryptographic signature of a system update package
+ * before installing it. Note that the package is also verified
+ * separately by the installer once the device is rebooted into
+ * the recovery system. This function will return only if the
+ * package was successfully verified; otherwise it will throw an
+ * exception.
+ *
+ * Verification of a package can take significant time, so this
+ * function should not be called from a UI thread.
+ *
+ * @param packageFile the package to be verified
+ * @param listener an object to receive periodic progress
+ * updates as verification proceeds. May be null.
+ * @param deviceCertsZipFile the zip file of certificates whose
+ * public keys we will accept. Verification succeeds if the
+ * package is signed by the private key corresponding to any
+ * public key in this file. May be null to use the system default
+ * file (currently "/system/etc/security/otacerts.zip").
+ *
+ * @throws IOException if there were any errors reading the
+ * package or certs files.
+ * @throws GeneralSecurityException if verification failed
+ */
+ public static void verifyPackage(File packageFile,
+ ProgressListener listener,
+ File deviceCertsZipFile)
+ throws IOException, GeneralSecurityException {
+ long fileLen = packageFile.length();
+
+ RandomAccessFile raf = new RandomAccessFile(packageFile, "r");
+ try {
+ int lastPercent = 0;
+ long lastPublishTime = System.currentTimeMillis();
+ if (listener != null) {
+ listener.onProgress(lastPercent);
+ }
+
+ raf.seek(fileLen - 6);
+ byte[] footer = new byte[6];
+ raf.readFully(footer);
+
+ if (footer[2] != (byte)0xff || footer[3] != (byte)0xff) {
+ throw new SignatureException("no signature in file (no footer)");
+ }
+
+ int commentSize = (footer[4] & 0xff) | ((footer[5] & 0xff) << 8);
+ int signatureStart = (footer[0] & 0xff) | ((footer[1] & 0xff) << 8);
+ Log.v(TAG, String.format("comment size %d; signature start %d",
+ commentSize, signatureStart));
+
+ byte[] eocd = new byte[commentSize + 22];
+ raf.seek(fileLen - (commentSize + 22));
+ raf.readFully(eocd);
+
+ // Check that we have found the start of the
+ // end-of-central-directory record.
+ if (eocd[0] != (byte)0x50 || eocd[1] != (byte)0x4b ||
+ eocd[2] != (byte)0x05 || eocd[3] != (byte)0x06) {
+ throw new SignatureException("no signature in file (bad footer)");
+ }
+
+ for (int i = 4; i < eocd.length-3; ++i) {
+ if (eocd[i ] == (byte)0x50 && eocd[i+1] == (byte)0x4b &&
+ eocd[i+2] == (byte)0x05 && eocd[i+3] == (byte)0x06) {
+ throw new SignatureException("EOCD marker found after start of EOCD");
+ }
+ }
+
+ // The following code is largely copied from
+ // JarUtils.verifySignature(). We could just *call* that
+ // method here if that function didn't read the entire
+ // input (ie, the whole OTA package) into memory just to
+ // compute its message digest.
+
+ BerInputStream bis = new BerInputStream(
+ new ByteArrayInputStream(eocd, commentSize+22-signatureStart, signatureStart));
+ ContentInfo info = (ContentInfo)ContentInfo.ASN1.decode(bis);
+ SignedData signedData = info.getSignedData();
+ if (signedData == null) {
+ throw new IOException("signedData is null");
+ }
+ Collection encCerts = signedData.getCertificates();
+ if (encCerts.isEmpty()) {
+ throw new IOException("encCerts is empty");
+ }
+ // Take the first certificate from the signature (packages
+ // should contain only one).
+ Iterator it = encCerts.iterator();
+ X509Certificate cert = null;
+ if (it.hasNext()) {
+ cert = new X509CertImpl((org.apache.harmony.security.x509.Certificate)it.next());
+ } else {
+ throw new SignatureException("signature contains no certificates");
+ }
+
+ List sigInfos = signedData.getSignerInfos();
+ SignerInfo sigInfo;
+ if (!sigInfos.isEmpty()) {
+ sigInfo = (SignerInfo)sigInfos.get(0);
+ } else {
+ throw new IOException("no signer infos!");
+ }
+
+ // Check that the public key of the certificate contained
+ // in the package equals one of our trusted public keys.
+
+ HashSet<Certificate> trusted = getTrustedCerts(
+ deviceCertsZipFile == null ? DEFAULT_KEYSTORE : deviceCertsZipFile);
+
+ PublicKey signatureKey = cert.getPublicKey();
+ boolean verified = false;
+ for (Certificate c : trusted) {
+ if (c.getPublicKey().equals(signatureKey)) {
+ verified = true;
+ break;
+ }
+ }
+ if (!verified) {
+ throw new SignatureException("signature doesn't match any trusted key");
+ }
+
+ // The signature cert matches a trusted key. Now verify that
+ // the digest in the cert matches the actual file data.
+
+ // The verifier in recovery *only* handles SHA1withRSA
+ // signatures. SignApk.java always uses SHA1withRSA, no
+ // matter what the cert says to use. Ignore
+ // cert.getSigAlgName(), and instead use whatever
+ // algorithm is used by the signature (which should be
+ // SHA1withRSA).
+
+ String da = sigInfo.getdigestAlgorithm();
+ String dea = sigInfo.getDigestEncryptionAlgorithm();
+ String alg = null;
+ if (da == null || dea == null) {
+ // fall back to the cert algorithm if the sig one
+ // doesn't look right.
+ alg = cert.getSigAlgName();
+ } else {
+ alg = da + "with" + dea;
+ }
+ Signature sig = Signature.getInstance(alg);
+ sig.initVerify(cert);
+
+ // The signature covers all of the OTA package except the
+ // archive comment and its 2-byte length.
+ long toRead = fileLen - commentSize - 2;
+ long soFar = 0;
+ raf.seek(0);
+ byte[] buffer = new byte[4096];
+ while (soFar < toRead) {
+ int size = buffer.length;
+ if (soFar + size > toRead) {
+ size = (int)(toRead - soFar);
+ }
+ int read = raf.read(buffer, 0, size);
+ sig.update(buffer, 0, read);
+ soFar += read;
+
+ if (listener != null) {
+ long now = System.currentTimeMillis();
+ int p = (int)(soFar * 100 / toRead);
+ if (p > lastPercent &&
+ now - lastPublishTime > PUBLISH_PROGRESS_INTERVAL_MS) {
+ lastPercent = p;
+ lastPublishTime = now;
+ listener.onProgress(lastPercent);
+ }
+ }
+ }
+ if (listener != null) {
+ listener.onProgress(100);
+ }
+
+ if (!sig.verify(sigInfo.getEncryptedDigest())) {
+ throw new SignatureException("signature digest verification failed");
+ }
+ } finally {
+ raf.close();
+ }
+ }
+
+ /**
+ * Reboots the device in order to install the given update
+ * package.
+ * Requires the {@link android.Manifest.permission#REBOOT}
+ * and {@link android.Manifest.permission#ACCESS_CACHE_FILESYSTEM}
+ * permissions.
+ *
+ * @param context the Context to use
+ * @param packageFile the update package to install. Currently
+ * must be on the /cache or /data partitions.
+ *
+ * @throws IOException if writing the recovery command file
+ * fails, or if the reboot itself fails.
+ */
+ public static void installPackage(Context context, File packageFile)
+ throws IOException {
+ String filename = packageFile.getCanonicalPath();
+
+ if (filename.startsWith("/cache/")) {
+ filename = "CACHE:" + filename.substring(7);
+ } else if (filename.startsWith("/data/")) {
+ filename = "DATA:" + filename.substring(6);
+ } else {
+ throw new IllegalArgumentException(
+ "Must start with /cache or /data: " + filename);
+ }
+ Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");
+ String arg = "--update_package=" + filename;
+ bootCommand(context, arg);
+ }
+
+ /**
+ * Reboots the device and wipes the user data partition. This is
+ * sometimes called a "factory reset", which is something of a
+ * misnomer because the system partition is not restored to its
+ * factory state.
+ * Requires the {@link android.Manifest.permission#REBOOT}
+ * and {@link android.Manifest.permission#ACCESS_CACHE_FILESYSTEM}
+ * permissions.
+ *
+ * @param context the Context to use
+ *
+ * @throws IOException if writing the recovery command file
+ * fails, or if the reboot itself fails.
+ */
+ public static void rebootWipeUserData(Context context)
+ throws IOException {
+ bootCommand(context, "--wipe_data");
+ }
+
+ /**
+ * Reboot into the recovery system to wipe the /data partition and toggle
+ * Encrypted File Systems on/off.
+ * @param extras to add to the RECOVERY_COMPLETED intent after rebooting.
+ * @throws IOException if something goes wrong.
+ *
+ * @hide
+ */
+ public static void rebootToggleEFS(Context context, boolean efsEnabled)
+ throws IOException {
+ if (efsEnabled) {
+ bootCommand(context, "--set_encrypted_filesystem=on");
+ } else {
+ bootCommand(context, "--set_encrypted_filesystem=off");
+ }
+ }
+
+ /**
+ * Reboot into the recovery system with the supplied argument.
+ * @param arg to pass to the recovery utility.
+ * @throws IOException if something goes wrong.
+ */
+ private static void bootCommand(Context context, String arg) throws IOException {
+ RECOVERY_DIR.mkdirs(); // In case we need it
+ COMMAND_FILE.delete(); // In case it's not writable
+ LOG_FILE.delete();
+
+ FileWriter command = new FileWriter(COMMAND_FILE);
+ try {
+ command.write(arg);
+ command.write("\n");
+ } finally {
+ command.close();
+ }
+
+ // Having written the command file, go ahead and reboot
+ PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ pm.reboot("recovery");
+
+ throw new IOException("Reboot failed (no permissions?)");
+ }
+
+ /**
+ * Called after booting to process and remove recovery-related files.
+ * @return the log file from recovery, or null if none was found.
+ *
+ * @hide
+ */
+ public static String handleAftermath() {
+ // Record the tail of the LOG_FILE
+ String log = null;
+ try {
+ log = FileUtils.readTextFile(LOG_FILE, -LOG_FILE_MAX_LENGTH, "...\n");
+ } catch (FileNotFoundException e) {
+ Log.i(TAG, "No recovery log file");
+ } catch (IOException e) {
+ Log.e(TAG, "Error reading recovery log", e);
+ }
+
+ // Delete everything in RECOVERY_DIR
+ String[] names = RECOVERY_DIR.list();
+ for (int i = 0; names != null && i < names.length; i++) {
+ File f = new File(RECOVERY_DIR, names[i]);
+ if (!f.delete()) {
+ Log.e(TAG, "Can't delete: " + f);
+ } else {
+ Log.i(TAG, "Deleted: " + f);
+ }
+ }
+
+ return log;
+ }
+
+ private void RecoverySystem() { } // Do not instantiate
+}
diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java
index 4eaea6a..389c9f4 100644
--- a/core/java/android/pim/vcard/VCardComposer.java
+++ b/core/java/android/pim/vcard/VCardComposer.java
@@ -54,6 +54,7 @@
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
+import java.lang.reflect.Method;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -197,7 +198,7 @@
if (mIsDoCoMo) {
try {
// Create one empty entry.
- mWriter.write(createOneEntryInternal("-1"));
+ mWriter.write(createOneEntryInternal("-1", null));
} catch (IOException e) {
Log.e(LOG_TAG,
"IOException occurred during exportOneContactData: "
@@ -428,6 +429,14 @@
}
public boolean createOneEntry() {
+ return createOneEntry(null);
+ }
+
+ /**
+ * @param getEntityIteratorMethod For Dependency Injection.
+ * @hide just for testing.
+ */
+ public boolean createOneEntry(Method getEntityIteratorMethod) {
if (mCursor == null || mCursor.isAfterLast()) {
mErrorReason = FAILURE_REASON_NOT_INITIALIZED;
return false;
@@ -439,7 +448,8 @@
vcard = createOneCallLogEntryInternal();
} else {
if (mIdColumn >= 0) {
- vcard = createOneEntryInternal(mCursor.getString(mIdColumn));
+ vcard = createOneEntryInternal(mCursor.getString(mIdColumn),
+ getEntityIteratorMethod);
} else {
Log.e(LOG_TAG, "Incorrect mIdColumn: " + mIdColumn);
return true;
@@ -475,7 +485,8 @@
return true;
}
- private String createOneEntryInternal(final String contactId) {
+ private String createOneEntryInternal(final String contactId,
+ Method getEntityIteratorMethod) {
final Map<String, List<ContentValues>> contentValuesListMap =
new HashMap<String, List<ContentValues>>();
// The resolver may return the entity iterator with no data. It is possiible.
@@ -484,13 +495,34 @@
boolean dataExists = false;
EntityIterator entityIterator = null;
try {
- final Uri uri = RawContacts.CONTENT_URI.buildUpon()
- .appendEncodedPath(contactId)
- .appendEncodedPath(RawContacts.Entity.CONTENT_DIRECTORY)
- .appendQueryParameter(Data.FOR_EXPORT_ONLY, "1")
- .build();
- entityIterator = RawContacts.newEntityIterator(mContentResolver.query(
- uri, null, null, null, null));
+
+ if (getEntityIteratorMethod != null) {
+ try {
+ final Uri uri = RawContacts.CONTENT_URI.buildUpon()
+ .appendQueryParameter(Data.FOR_EXPORT_ONLY, "1")
+ .build();
+ final String selection = Data.CONTACT_ID + "=?";
+ final String[] selectionArgs = new String[] {contactId};
+ entityIterator = (EntityIterator)getEntityIteratorMethod.invoke(null,
+ mContentResolver, uri, selection, selectionArgs, null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ final Uri uri = RawContacts.CONTENT_URI.buildUpon()
+ .appendEncodedPath(contactId)
+ .appendEncodedPath(RawContacts.Entity.CONTENT_DIRECTORY)
+ .appendQueryParameter(Data.FOR_EXPORT_ONLY, "1")
+ .build();
+ entityIterator = RawContacts.newEntityIterator(mContentResolver.query(
+ uri, null, null, null, null));
+ }
+
+ if (entityIterator == null) {
+ Log.e(LOG_TAG, "EntityIterator is null");
+ return "";
+ }
+
dataExists = entityIterator.hasNext();
while (entityIterator.hasNext()) {
Entity entity = entityIterator.next();
diff --git a/core/java/android/pim/vcard/VCardParser_V21.java b/core/java/android/pim/vcard/VCardParser_V21.java
index e7c19cf..c2928cb 100644
--- a/core/java/android/pim/vcard/VCardParser_V21.java
+++ b/core/java/android/pim/vcard/VCardParser_V21.java
@@ -110,11 +110,11 @@
private long mTimeHandleBase64;
public VCardParser_V21() {
- this(VCardConfig.PARSE_TYPE_UNKNOWN);
+ this(null);
}
public VCardParser_V21(VCardSourceDetector detector) {
- this(detector.getEstimatedType());
+ this(detector != null ? detector.getEstimatedType() : VCardConfig.PARSE_TYPE_UNKNOWN);
}
public VCardParser_V21(int parseType) {
diff --git a/core/java/android/preference/EditTextPreference.java b/core/java/android/preference/EditTextPreference.java
index 84ee950..aa27627 100644
--- a/core/java/android/preference/EditTextPreference.java
+++ b/core/java/android/preference/EditTextPreference.java
@@ -28,7 +28,6 @@
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.EditText;
-import android.widget.LinearLayout;
/**
* A {@link Preference} that allows for string
@@ -128,7 +127,7 @@
ViewGroup container = (ViewGroup) dialogView
.findViewById(com.android.internal.R.id.edittext_container);
if (container != null) {
- container.addView(editText, ViewGroup.LayoutParams.FILL_PARENT,
+ container.addView(editText, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
diff --git a/core/java/android/provider/Calendar.java b/core/java/android/provider/Calendar.java
index b74564a..509aac5 100644
--- a/core/java/android/provider/Calendar.java
+++ b/core/java/android/provider/Calendar.java
@@ -583,14 +583,14 @@
* {@link #ACCOUNT_TYPE} identifies a specific account.
* <P>Type: TEXT</P>
*/
- public static final String ACCOUNT_NAME = "account_name";
+ public static final String ACCOUNT_NAME = "_sync_account";
/**
* The type of account to which this row belongs, which when paired with
* {@link #ACCOUNT_NAME} identifies a specific account.
* <P>Type: TEXT</P>
*/
- public static final String ACCOUNT_TYPE = "account_type";
+ public static final String ACCOUNT_TYPE = "_sync_account_type";
public static EntityIterator newEntityIterator(Cursor cursor, ContentResolver resolver) {
return new EntityIteratorImpl(cursor, resolver);
@@ -1049,58 +1049,39 @@
public static final String MAX_INSTANCE = "maxInstance";
/**
- * The minimum Julian day in the BusyBits table.
+ * The minimum Julian day in the EventDays table.
* <P>Type: INTEGER</P>
*/
- public static final String MIN_BUSYBITS = "minBusyBits";
+ public static final String MIN_EVENTDAYS = "minEventDays";
/**
- * The maximum Julian day in the BusyBits table.
+ * The maximum Julian day in the EventDays table.
* <P>Type: INTEGER</P>
*/
- public static final String MAX_BUSYBITS = "maxBusyBits";
+ public static final String MAX_EVENTDAYS = "maxEventDays";
}
public static final class CalendarMetaData implements CalendarMetaDataColumns {
}
- public interface BusyBitsColumns {
+ public interface EventDaysColumns {
/**
- * The Julian day number.
+ * The Julian starting day number.
* <P>Type: INTEGER (int)</P>
*/
- public static final String DAY = "day";
+ public static final String STARTDAY = "startDay";
+ public static final String ENDDAY = "endDay";
- /**
- * The 24 bits representing the 24 1-hour time slots in a day.
- * If an event in the Instances table overlaps part of a 1-hour
- * time slot then the corresponding bit is set. The first time slot
- * (12am to 1am) is bit 0. The last time slot (11pm to midnight)
- * is bit 23.
- * <P>Type: INTEGER (int)</P>
- */
- public static final String BUSYBITS = "busyBits";
-
- /**
- * The number of all-day events that occur on this day.
- * <P>Type: INTEGER (int)</P>
- */
- public static final String ALL_DAY_COUNT = "allDayCount";
}
- public static final class BusyBits implements BusyBitsColumns {
- public static final Uri CONTENT_URI = Uri.parse("content://calendar/busybits/when");
+ public static final class EventDays implements EventDaysColumns {
+ public static final Uri CONTENT_URI = Uri.parse("content://calendar/instances/groupbyday");
- public static final String[] PROJECTION = { DAY, BUSYBITS, ALL_DAY_COUNT };
-
- // The number of minutes represented by one busy bit
- public static final int MINUTES_PER_BUSY_INTERVAL = 60;
-
- // The number of intervals in a day
- public static final int INTERVALS_PER_DAY = 24 * 60 / MINUTES_PER_BUSY_INTERVAL;
+ public static final String[] PROJECTION = { STARTDAY, ENDDAY };
+ public static final String SELECTION = "selected==1";
/**
- * Retrieves the busy bits for the Julian days starting at "startDay"
+ * Retrieves the days with events for the Julian days starting at "startDay"
* for "numDays".
*
* @param cr the ContentResolver
@@ -1116,8 +1097,8 @@
Uri.Builder builder = CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startDay);
ContentUris.appendId(builder, endDay);
- return cr.query(builder.build(), PROJECTION, null /* selection */,
- null /* selection args */, DAY);
+ return cr.query(builder.build(), PROJECTION, SELECTION,
+ null /* selection args */, STARTDAY);
}
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index ed9198e..7fb9daf 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -23,10 +23,10 @@
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.Intent;
import android.content.CursorEntityIterator;
-import android.content.EntityIterator;
import android.content.Entity;
+import android.content.EntityIterator;
+import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.DatabaseUtils;
@@ -35,6 +35,7 @@
import android.net.Uri;
import android.os.RemoteException;
import android.text.TextUtils;
+import android.util.DisplayMetrics;
import android.util.Pair;
import android.view.View;
@@ -52,49 +53,50 @@
* ContactsContract defines an extensible database of contact-related
* information. Contact information is stored in a three-tier data model:
* </p>
- * <blockquote>
- * <p>
+ * <ul>
+ * <li>
* The {@link Data} table contains all kinds of personal data: phone numbers,
* email addresses etc. The list of data kinds that can be stored in this table
* is open-ended. There is a predefined set of common kinds, but any application
* can add its own data kinds.
- * </p>
- * <p>
+ * </li>
+ * <li>
* A row in the {@link RawContacts} table represents a set of Data describing a
- * person and associated with a single account.
- * </p>
- * <p>
+ * person and associated with a single account (for example, a single Gmail
+ * account).
+ * </li>
+ * <li>
* A row in the {@link Contacts} table represents an aggregate of one or more
* RawContacts presumably describing the same person.
- * </p>
- * </blockquote>
+ * </li>
+ * </ul>
* <p>
* Other tables include:
* </p>
- * <blockquote>
- * <p>
+ * <ul>
+ * <li>
* {@link Groups}, which contains information about raw contact groups - the
* current API does not support the notion of groups spanning multiple accounts.
- * </p>
- * <p>
+ * </li>
+ * <li>
* {@link StatusUpdates}, which contains social status updates including IM
* availability.
- * </p>
- * <p>
+ * </li>
+ * <li>
* {@link AggregationExceptions}, which is used for manual aggregation and
* disaggregation of raw contacts
- * </p>
- * <p>
+ * </li>
+ * <li>
* {@link Settings}, which contains visibility and sync settings for accounts
* and groups.
- * </p>
- * <p>
+ * </li>
+ * <li>
* {@link SyncState}, which contains free-form data maintained on behalf of sync
* adapters
- * </p>
- * <p>
- * {@link PhoneLookup}, which is used for quick caller-ID lookup</id>
- * </blockquote>
+ * </li>
+ * <li>
+ * {@link PhoneLookup}, which is used for quick caller-ID lookup</li>
+ * </ul>
*/
@SuppressWarnings("unused")
public final class ContactsContract {
@@ -244,6 +246,9 @@
}
/**
+ * Columns of {@link ContactsContract.Contacts} that track the user's
+ * preferences for, or interactions with, the contact.
+ *
* @see Contacts
* @see RawContacts
* @see ContactsContract.Data
@@ -270,20 +275,25 @@
public static final String STARRED = "starred";
/**
- * A custom ringtone associated with a contact. Not always present.
+ * URI for a custom ringtone associated with the contact. If null or missing,
+ * the default ringtone is used.
* <P>Type: TEXT (URI to the ringtone)</P>
*/
public static final String CUSTOM_RINGTONE = "custom_ringtone";
/**
- * Whether the contact should always be sent to voicemail. Not always
- * present.
+ * Whether the contact should always be sent to voicemail. If missing,
+ * defaults to false.
* <P>Type: INTEGER (0 for false, 1 for true)</P>
*/
public static final String SEND_TO_VOICEMAIL = "send_to_voicemail";
}
/**
+ * Columns of {@link ContactsContract.Contacts} that refer to intrinsic
+ * properties of the contact, as opposed to the user-specified options
+ * found in {@link ContactOptionsColumns}.
+ *
* @see Contacts
* @see ContactsContract.Data
* @see PhoneLookup
@@ -294,7 +304,7 @@
* The display name for the contact.
* <P>Type: TEXT</P>
*/
- public static final String DISPLAY_NAME = "display_name";
+ public static final String DISPLAY_NAME = ContactNameColumns.DISPLAY_NAME_PRIMARY;
/**
* Reference to the row in the RawContacts table holding the contact name.
@@ -440,6 +450,8 @@
}
/**
+ * Contact name and contact name metadata columns in the RawContacts table.
+ *
* @see Contacts
* @see RawContacts
* @hide
@@ -456,13 +468,13 @@
* The default text shown as the contact's display name. It is based on
* available data, see {@link #DISPLAY_NAME_SOURCE}.
*/
- public static final String DISPLAY_NAME = "display_name";
+ public static final String DISPLAY_NAME_PRIMARY = "display_name";
/**
* Alternative representation of the display name. If display name is
* based on the structured name and the structured name follows
* the Western full name style, then this field contains the "family name first"
- * version of the full name. Otherwise, it is the same as {@link #DISPLAY_NAME}.
+ * version of the full name. Otherwise, it is the same as DISPLAY_NAME_PRIMARY.
*/
public static final String DISPLAY_NAME_ALTERNATIVE = "display_name_alt";
@@ -483,7 +495,7 @@
* the sort key is the name's Pinyin spelling; for Japanese names
* it is the Hiragana version of the phonetic name.
*/
- public static final String SORT_KEY = "sort_key";
+ public static final String SORT_KEY_PRIMARY = "sort_key";
/**
* Sort key based on the alternative representation of the full name,
@@ -562,7 +574,7 @@
* </tr>
* <tr>
* <td>String</td>
- * <td>{@link #DISPLAY_NAME}</td>
+ * <td>DISPLAY_NAME_PRIMARY</td>
* <td>read-only</td>
* <td>The display name for the contact. It is the display name
* contributed by the raw contact referred to by the NAME_RAW_CONTACT_ID
@@ -692,7 +704,7 @@
* </table>
*/
public static class Contacts implements BaseColumns, ContactsColumns,
- ContactOptionsColumns, ContactStatusColumns {
+ ContactOptionsColumns, ContactNameColumns, ContactStatusColumns {
/**
* This utility class cannot be instantiated
*/
@@ -1519,6 +1531,7 @@
super(cursor);
}
+ @Override
public android.content.Entity getEntityAndIncrementCursor(Cursor cursor)
throws RemoteException {
final int columnRawContactId = cursor.getColumnIndexOrThrow(RawContacts._ID);
@@ -1614,14 +1627,34 @@
@Deprecated
public static final String PRESENCE_STATUS = PRESENCE;
- /*
- * Presence Status definition
+ /**
+ * An allowed value of {@link #PRESENCE}.
*/
int OFFLINE = 0;
+
+ /**
+ * An allowed value of {@link #PRESENCE}.
+ */
int INVISIBLE = 1;
+
+ /**
+ * An allowed value of {@link #PRESENCE}.
+ */
int AWAY = 2;
+
+ /**
+ * An allowed value of {@link #PRESENCE}.
+ */
int IDLE = 3;
+
+ /**
+ * An allowed value of {@link #PRESENCE}.
+ */
int DO_NOT_DISTURB = 4;
+
+ /**
+ * An allowed value of {@link #PRESENCE}.
+ */
int AVAILABLE = 5;
/**
@@ -1633,6 +1666,7 @@
/**
* @deprecated use {@link #STATUS}
*/
+ @Deprecated
public static final String PRESENCE_CUSTOM_STATUS = STATUS;
/**
@@ -1689,7 +1723,7 @@
public static final String RAW_CONTACT_ID = "raw_contact_id";
/**
- * Whether this is the primary entry of its kind for the raw contact it belongs to
+ * Whether this is the primary entry of its kind for the raw contact it belongs to.
* <P>Type: INTEGER (if set, non-0 means true)</P>
*/
public static final String IS_PRIMARY = "is_primary";
@@ -1738,7 +1772,10 @@
public static final String DATA13 = "data13";
/** Generic data column, the meaning is {@link #MIMETYPE} specific */
public static final String DATA14 = "data14";
- /** Generic data column, the meaning is {@link #MIMETYPE} specific */
+ /**
+ * Generic data column, the meaning is {@link #MIMETYPE} specific. By convention,
+ * this field is used to store BLOBs (binary data).
+ */
public static final String DATA15 = "data15";
/** Generic column for use by sync adapters. */
@@ -1757,30 +1794,35 @@
* @see ContactsContract.Data
*/
protected interface DataColumnsWithJoins extends BaseColumns, DataColumns, StatusColumns,
- RawContactsColumns, ContactsColumns, ContactOptionsColumns, ContactStatusColumns {
-
+ RawContactsColumns, ContactsColumns, ContactNameColumns, ContactOptionsColumns,
+ ContactStatusColumns {
}
/**
* <p>
* Constants for the data table, which contains data points tied to a raw
- * contact. For example, a phone number or email address.
+ * contact. Each row of the data table is typically used to store a single
+ * piece of contact
+ * information (such as a phone number) and its
+ * associated metadata (such as whether it is a work or home number).
* </p>
* <h3>Data kinds</h3>
* <p>
- * Data is a generic table that can hold all kinds of data. Sync adapters
- * and applications can introduce their own data kinds. The kind of data
- * stored in a particular row is determined by the mime type in the row.
- * Fields from {@link #DATA1} through {@link #DATA15} are generic columns
- * whose specific use is determined by the kind of data stored in the row.
+ * Data is a generic table that can hold any kind of contact data.
+ * The kind of data stored in a given row is specified by the row's
+ * {@link #MIMETYPE} value, which determines the meaning of the
+ * generic columns {@link #DATA1} through
+ * {@link #DATA15}.
* For example, if the data kind is
- * {@link CommonDataKinds.Phone Phone.CONTENT_ITEM_TYPE}, then DATA1 stores the
+ * {@link CommonDataKinds.Phone Phone.CONTENT_ITEM_TYPE}, then the column
+ * {@link #DATA1} stores the
* phone number, but if the data kind is
- * {@link CommonDataKinds.Email Email.CONTENT_ITEM_TYPE}, then DATA1 stores the
- * email address.
+ * {@link CommonDataKinds.Email Email.CONTENT_ITEM_TYPE}, then {@link #DATA1}
+ * stores the email address.
+ * Sync adapters and applications can introduce their own data kinds.
* </p>
* <p>
- * ContactsContract defines a small number of common data kinds, e.g.
+ * ContactsContract defines a small number of pre-defined data kinds, e.g.
* {@link CommonDataKinds.Phone}, {@link CommonDataKinds.Email} etc. As a
* convenience, these classes define data kind specific aliases for DATA1 etc.
* For example, {@link CommonDataKinds.Phone Phone.NUMBER} is the same as
@@ -1797,8 +1839,8 @@
* By convention, {@link #DATA15} is used for storing BLOBs (binary data).
* </p>
* <p>
- * Typically you should refrain from introducing new kinds of data for 3rd
- * party account types. For example, if you add a data row for
+ * Typically you should refrain from introducing new kinds of data for an other
+ * party's account types. For example, if you add a data row for
* "favorite song" to a raw contact owned by a Google account, it will not
* get synced to the server, because the Google sync adapter does not know
* how to handle this data kind. Thus new data kinds are typically
@@ -1935,6 +1977,10 @@
* </dd>
* </dl>
* <h2>Columns</h2>
+ * <p>
+ * Many columns are available via a {@link Data#CONTENT_URI} query. For best performance you
+ * should explicitly specify a projection to only those columns that you need.
+ * </p>
* <table class="jd-sumtable">
* <tr>
* <th colspan='4'>Data</th>
@@ -1944,7 +1990,7 @@
* <td style="width: 20em;">{@link #_ID}</td>
* <td style="width: 5em;">read-only</td>
* <td>Row ID. Sync adapter should try to preserve row IDs during updates. In other words,
- * it would be a bad idea to delete and reinsert a data rows. A sync adapter should
+ * it would be a bad idea to delete and reinsert a data row. A sync adapter should
* always do an update instead.</td>
* </tr>
* <tr>
@@ -1976,21 +2022,15 @@
* <td>long</td>
* <td>{@link #RAW_CONTACT_ID}</td>
* <td>read/write-once</td>
- * <td>A reference to the {@link RawContacts#_ID} that this data belongs to.</td>
- * </tr>
- * <tr>
- * <td>long</td>
- * <td>{@link #CONTACT_ID}</td>
- * <td>read-only</td>
- * <td>A reference to the {@link ContactsContract.Contacts#_ID} that this data row belongs
- * to. It is obtained through a join with RawContacts.</td>
+ * <td>The id of the row in the {@link RawContacts} table that this data belongs to.</td>
* </tr>
* <tr>
* <td>int</td>
* <td>{@link #IS_PRIMARY}</td>
* <td>read/write</td>
* <td>Whether this is the primary entry of its kind for the raw contact it belongs to.
- * "1" if true, "0" if false.</td>
+ * "1" if true, "0" if false.
+ * </td>
* </tr>
* <tr>
* <td>int</td>
@@ -1998,7 +2038,9 @@
* <td>read/write</td>
* <td>Whether this is the primary entry of its kind for the aggregate
* contact it belongs to. Any data record that is "super primary" must
- * also be "primary".</td>
+ * also be "primary". For example, the super-primary entry may be
+ * interpreted as the default contact value of its kind (for example,
+ * the default phone number to use for the contact).</td>
* </tr>
* <tr>
* <td>int</td>
@@ -2027,7 +2069,19 @@
* {@link #DATA15}
* </td>
* <td>read/write</td>
- * <td>Generic data columns, the meaning is {@link #MIMETYPE} specific.</td>
+ * <td>
+ * <p>
+ * Generic data columns. The meaning of each column is determined by the
+ * {@link #MIMETYPE}. By convention, {@link #DATA15} is used for storing
+ * BLOBs (binary data).
+ * </p>
+ * <p>
+ * Data columns whose meaning is not explicitly defined for a given MIMETYPE
+ * should not be used. There is no guarantee that any sync adapter will
+ * preserve them. Sync adapters themselves should not use such columns either,
+ * but should instead use {@link #SYNC1}-{@link #SYNC4}.
+ * </p>
+ * </td>
* </tr>
* <tr>
* <td>Any type</td>
@@ -2044,6 +2098,10 @@
* </tr>
* </table>
*
+ * <p>
+ * Some columns from the most recent associated status update are also available
+ * through an implicit join.
+ * </p>
* <table class="jd-sumtable">
* <tr>
* <th colspan='4'>Join with {@link StatusUpdates}</th>
@@ -2096,18 +2154,26 @@
* </table>
*
* <p>
- * Columns from the associated raw contact are also available through an
- * implicit join.
+ * Some columns from the associated raw contact are also available through an
+ * implicit join. The other columns are excluded as uninteresting in this
+ * context.
* </p>
*
* <table class="jd-sumtable">
* <tr>
- * <th colspan='4'>Join with {@link RawContacts}</th>
+ * <th colspan='4'>Join with {@link ContactsContract.RawContacts}</th>
* </tr>
* <tr>
- * <td style="width: 7em;">int</td>
- * <td style="width: 20em;">{@link #AGGREGATION_MODE}</td>
+ * <td style="width: 7em;">long</td>
+ * <td style="width: 20em;">{@link #CONTACT_ID}</td>
* <td style="width: 5em;">read-only</td>
+ * <td>The id of the row in the {@link Contacts} table that this data belongs
+ * to.</td>
+ * </tr>
+ * <tr>
+ * <td>int</td>
+ * <td>{@link #AGGREGATION_MODE}</td>
+ * <td>read-only</td>
* <td>See {@link RawContacts}.</td>
* </tr>
* <tr>
@@ -2119,13 +2185,18 @@
* </table>
*
* <p>
- * Columns from the associated aggregated contact are also available through an
- * implicit join.
+ * The ID column for the associated aggregated contact table
+ * {@link ContactsContract.Contacts} is available
+ * via the implicit join to the {@link RawContacts} table, see above.
+ * The remaining columns from this table are also
+ * available, through an implicit join. This
+ * facilitates lookup by
+ * the value of a single data element, such as the email address.
* </p>
*
* <table class="jd-sumtable">
* <tr>
- * <th colspan='4'>Join with {@link Contacts}</th>
+ * <th colspan='4'>Join with {@link ContactsContract.Contacts}</th>
* </tr>
* <tr>
* <td style="width: 7em;">String</td>
@@ -2232,24 +2303,30 @@
private Data() {}
/**
- * The content:// style URI for this table
+ * The content:// style URI for this table, which requests a directory
+ * of data rows matching the selection criteria.
*/
public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "data");
/**
- * The MIME type of {@link #CONTENT_URI} providing a directory of data.
+ * The MIME type of the results from {@link #CONTENT_URI}.
*/
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/data";
/**
+ * <p>
* If {@link #FOR_EXPORT_ONLY} is explicitly set to "1", returned Cursor toward
* Data.CONTENT_URI contains only exportable data.
- *
+ * </p>
+ * <p>
* This flag is useful (currently) only for vCard exporter in Contacts app, which
* needs to exclude "un-exportable" data from available data to export, while
* Contacts app itself has priviledge to access all data including "un-exportable"
* ones and providers return all of them regardless of the callers' intention.
- * <P>Type: INTEGER</p>
+ * </p>
+ * <p>
+ * Type: INTEGER
+ * </p>
*
* @hide Maybe available only in Eclair and not really ready for public use.
* TODO: remove, or implement this feature completely. As of now (Eclair),
@@ -2258,9 +2335,17 @@
public static final String FOR_EXPORT_ONLY = "for_export_only";
/**
+ * <p>
* Build a {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}
* style {@link Uri} for the parent {@link android.provider.ContactsContract.Contacts}
* entry of the given {@link ContactsContract.Data} entry.
+ * </p>
+ * <p>
+ * Returns the Uri for the contact in the first entry returned by
+ * {@link ContentResolver#query(Uri, String[], String, String[], String)}
+ * for the provided {@code dataUri}. If the query returns null or empty
+ * results, silently returns null.
+ * </p>
*/
public static Uri getContactLookupUri(ContentResolver resolver, Uri dataUri) {
final Cursor cursor = resolver.query(dataUri, new String[] {
@@ -2283,7 +2368,7 @@
/**
* <p>
- * Constants for the raw contacts entities table, which can be though of as
+ * Constants for the raw contacts entities table, which can be thought of as
* an outer join of the raw_contacts table with the data table. It is a strictly
* read-only table.
* </p>
@@ -3039,7 +3124,7 @@
/**
* The alphabet used for capturing the phonetic name.
- * See {@link ContactsContract.PhoneticNameStyle}.
+ * See ContactsContract.PhoneticNameStyle.
* @hide
*/
public static final String PHONETIC_NAME_STYLE = DATA11;
@@ -3922,6 +4007,12 @@
* <td>{@link #DATA9}</td>
* <td></td>
* </tr>
+ * <tr>
+ * <td>String</td>
+ * <td>PHONETIC_NAME_STYLE</td>
+ * <td>{@link #DATA10}</td>
+ * <td></td>
+ * </tr>
* </table>
*/
public static final class Organization implements DataColumnsWithJoins, CommonColumns {
@@ -3979,6 +4070,13 @@
public static final String OFFICE_LOCATION = DATA9;
/**
+ * The alphabet used for capturing the phonetic name.
+ * See {@link ContactsContract.PhoneticNameStyle}.
+ * @hide
+ */
+ public static final String PHONETIC_NAME_STYLE = DATA10;
+
+ /**
* Return the string resource that best describes the given
* {@link #TYPE}. Will always return a valid resource.
*/
@@ -4599,6 +4697,7 @@
super(cursor);
}
+ @Override
public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
// we expect the cursor is already at the row we need to read from
final ContentValues values = new ContentValues();
@@ -4881,8 +4980,10 @@
/**
* Extra used to specify pivot dialog location in screen coordinates.
+ * @deprecated Use {@link Intent#setSourceBounds(Rect)} instead.
* @hide
*/
+ @Deprecated
public static final String EXTRA_TARGET_RECT = "target_rect";
/**
@@ -4942,15 +5043,17 @@
*/
public static void showQuickContact(Context context, View target, Uri lookupUri, int mode,
String[] excludeMimes) {
- // Find location and bounds of target view
- final int[] location = new int[2];
- target.getLocationOnScreen(location);
+ // Find location and bounds of target view, adjusting based on the
+ // assumed local density.
+ final float appScale = context.getResources().getCompatibilityInfo().applicationScale;
+ final int[] pos = new int[2];
+ target.getLocationOnScreen(pos);
final Rect rect = new Rect();
- rect.left = location[0];
- rect.top = location[1];
- rect.right = rect.left + target.getWidth();
- rect.bottom = rect.top + target.getHeight();
+ rect.left = (int) (pos[0] * appScale + 0.5f);
+ rect.top = (int) (pos[1] * appScale + 0.5f);
+ rect.right = (int) ((pos[0] + target.getWidth()) * appScale + 0.5f);
+ rect.bottom = (int) ((pos[1] + target.getHeight()) * appScale + 0.5f);
// Trigger with obtained rectangle
showQuickContact(context, rect, lookupUri, mode, excludeMimes);
@@ -4967,8 +5070,11 @@
* @param target Specific {@link Rect} that this dialog should be
* centered around, in screen coordinates. In particular, if
* the dialog has a "callout" arrow, it will be pointed and
- * centered around this {@link Rect}.
- * @param lookupUri A {@link ContactsContract.Contacts#CONTENT_LOOKUP_URI} style
+ * centered around this {@link Rect}. If you are running at a
+ * non-native density, you need to manually adjust using
+ * {@link DisplayMetrics#density} before calling.
+ * @param lookupUri A
+ * {@link ContactsContract.Contacts#CONTENT_LOOKUP_URI} style
* {@link Uri} that describes a specific contact to feature
* in this dialog.
* @param mode Any of {@link #MODE_SMALL}, {@link #MODE_MEDIUM}, or
@@ -4987,7 +5093,7 @@
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.setData(lookupUri);
- intent.putExtra(EXTRA_TARGET_RECT, target);
+ intent.setSourceBounds(target);
intent.putExtra(EXTRA_MODE, mode);
intent.putExtra(EXTRA_EXCLUDE_MIMES, excludeMimes);
context.startActivity(intent);
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index ae53dbe2..1b938ee 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -96,14 +96,12 @@
/**
* The name of an Intent-extra used to control the UI of a ViewImage.
* This is a boolean property that overrides the activity's default fullscreen state.
- * @hide
*/
public static final String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
/**
* The name of an Intent-extra used to control the UI of a ViewImage.
* This is a boolean property that specifies whether or not to show action icons.
- * @hide
*/
public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
@@ -162,13 +160,11 @@
/**
* Specify the maximum allowed size.
- * @hide
*/
public final static String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit";
/**
* Specify the maximum allowed recording duration in seconds.
- * @hide
*/
public final static String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
@@ -179,6 +175,13 @@
public final static String EXTRA_OUTPUT = "output";
/**
+ * The string that is used when a media attribute is not known. For example,
+ * if an audio file does not have any meta data, the artist and album columns
+ * will be set to this value.
+ */
+ public static final String UNKNOWN_STRING = "<unknown>";
+
+ /**
* Common fields for most MediaProvider tables
*/
@@ -844,7 +847,6 @@
* The position, in ms, playback was at when playback for this file
* was last stopped.
* <P>Type: INTEGER (long)</P>
- * @hide
*/
public static final String BOOKMARK = "bookmark";
@@ -923,7 +925,6 @@
/**
* Non-zero if the audio file is a podcast
* <P>Type: INTEGER (boolean)</P>
- * @hide
*/
public static final String IS_PODCAST = "is_podcast";
@@ -964,7 +965,7 @@
public static String keyFor(String name) {
if (name != null) {
boolean sortfirst = false;
- if (name.equals(android.media.MediaFile.UNKNOWN_STRING)) {
+ if (name.equals(UNKNOWN_STRING)) {
return "\001";
}
// Check if the first character is \001. We use this to
@@ -1258,7 +1259,6 @@
* @param from The position of the item to move
* @param to The position to move the item to
* @return true on success
- * @hide
*/
public static final boolean moveItem(ContentResolver res,
long playlistId, int from, int to) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 8dc7a55..7db9fdc 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1453,7 +1453,6 @@
*/
public static final String[] SETTINGS_TO_BACKUP = {
STAY_ON_WHILE_PLUGGED_IN,
- END_BUTTON_BEHAVIOR,
WIFI_SLEEP_POLICY,
WIFI_USE_STATIC_IP,
WIFI_STATIC_IP,
@@ -2453,6 +2452,504 @@
public static final String LAST_SETUP_SHOWN = "last_setup_shown";
/**
+ * How frequently (in seconds) to check the memory status of the
+ * device.
+ * @hide
+ */
+ public static final String MEMCHECK_INTERVAL = "memcheck_interval";
+
+ /**
+ * Max frequency (in seconds) to log memory check stats, in realtime
+ * seconds. This allows for throttling of logs when the device is
+ * running for large amounts of time.
+ * @hide
+ */
+ public static final String MEMCHECK_LOG_REALTIME_INTERVAL =
+ "memcheck_log_realtime_interval";
+
+ /**
+ * Boolean indicating whether rebooting due to system memory checks
+ * is enabled.
+ * @hide
+ */
+ public static final String MEMCHECK_SYSTEM_ENABLED = "memcheck_system_enabled";
+
+ /**
+ * How many bytes the system process must be below to avoid scheduling
+ * a soft reboot. This reboot will happen when it is next determined
+ * to be a good time.
+ * @hide
+ */
+ public static final String MEMCHECK_SYSTEM_SOFT_THRESHOLD = "memcheck_system_soft";
+
+ /**
+ * How many bytes the system process must be below to avoid scheduling
+ * a hard reboot. This reboot will happen immediately.
+ * @hide
+ */
+ public static final String MEMCHECK_SYSTEM_HARD_THRESHOLD = "memcheck_system_hard";
+
+ /**
+ * How many bytes the phone process must be below to avoid scheduling
+ * a soft restart. This restart will happen when it is next determined
+ * to be a good time.
+ * @hide
+ */
+ public static final String MEMCHECK_PHONE_SOFT_THRESHOLD = "memcheck_phone_soft";
+
+ /**
+ * How many bytes the phone process must be below to avoid scheduling
+ * a hard restart. This restart will happen immediately.
+ * @hide
+ */
+ public static final String MEMCHECK_PHONE_HARD_THRESHOLD = "memcheck_phone_hard";
+
+ /**
+ * Boolean indicating whether restarting the phone process due to
+ * memory checks is enabled.
+ * @hide
+ */
+ public static final String MEMCHECK_PHONE_ENABLED = "memcheck_phone_enabled";
+
+ /**
+ * First time during the day it is okay to kill processes
+ * or reboot the device due to low memory situations. This number is
+ * in seconds since midnight.
+ * @hide
+ */
+ public static final String MEMCHECK_EXEC_START_TIME = "memcheck_exec_start_time";
+
+ /**
+ * Last time during the day it is okay to kill processes
+ * or reboot the device due to low memory situations. This number is
+ * in seconds since midnight.
+ * @hide
+ */
+ public static final String MEMCHECK_EXEC_END_TIME = "memcheck_exec_end_time";
+
+ /**
+ * How long the screen must have been off in order to kill processes
+ * or reboot. This number is in seconds. A value of -1 means to
+ * entirely disregard whether the screen is on.
+ * @hide
+ */
+ public static final String MEMCHECK_MIN_SCREEN_OFF = "memcheck_min_screen_off";
+
+ /**
+ * How much time there must be until the next alarm in order to kill processes
+ * or reboot. This number is in seconds. Note: this value must be
+ * smaller than {@link #MEMCHECK_RECHECK_INTERVAL} or else it will
+ * always see an alarm scheduled within its time.
+ * @hide
+ */
+ public static final String MEMCHECK_MIN_ALARM = "memcheck_min_alarm";
+
+ /**
+ * How frequently to check whether it is a good time to restart things,
+ * if the device is in a bad state. This number is in seconds. Note:
+ * this value must be larger than {@link #MEMCHECK_MIN_ALARM} or else
+ * the alarm to schedule the recheck will always appear within the
+ * minimum "do not execute now" time.
+ * @hide
+ */
+ public static final String MEMCHECK_RECHECK_INTERVAL = "memcheck_recheck_interval";
+
+ /**
+ * How frequently (in DAYS) to reboot the device. If 0, no reboots
+ * will occur.
+ * @hide
+ */
+ public static final String REBOOT_INTERVAL = "reboot_interval";
+
+ /**
+ * First time during the day it is okay to force a reboot of the
+ * device (if REBOOT_INTERVAL is set). This number is
+ * in seconds since midnight.
+ * @hide
+ */
+ public static final String REBOOT_START_TIME = "reboot_start_time";
+
+ /**
+ * The window of time (in seconds) after each REBOOT_INTERVAL in which
+ * a reboot can be executed. If 0, a reboot will always be executed at
+ * exactly the given time. Otherwise, it will only be executed if
+ * the device is idle within the window.
+ * @hide
+ */
+ public static final String REBOOT_WINDOW = "reboot_window";
+
+ /**
+ * Threshold values for the duration and level of a discharge cycle, under
+ * which we log discharge cycle info.
+ * @hide
+ */
+ public static final String BATTERY_DISCHARGE_DURATION_THRESHOLD =
+ "battery_discharge_duration_threshold";
+ /** @hide */
+ public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
+
+ /**
+ * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
+ * on application crashes and ANRs. If this is disabled, the crash/ANR dialog
+ * will never display the "Report" button.
+ * Type: int ( 0 = disallow, 1 = allow )
+ * @hide
+ */
+ public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
+
+ /**
+ * Nonzero causes Log.wtf() to crash.
+ * @hide
+ */
+ public static final String WTF_IS_FATAL = "wtf_is_fatal";
+
+ /**
+ * Maximum age of entries kept by {@link android.os.IDropBox}.
+ * @hide
+ */
+ public static final String DROPBOX_AGE_SECONDS =
+ "dropbox_age_seconds";
+ /**
+ * Maximum amount of disk space used by {@link android.os.IDropBox} no matter what.
+ * @hide
+ */
+ public static final String DROPBOX_QUOTA_KB =
+ "dropbox_quota_kb";
+ /**
+ * Percent of free disk (excluding reserve) which {@link android.os.IDropBox} will use.
+ * @hide
+ */
+ public static final String DROPBOX_QUOTA_PERCENT =
+ "dropbox_quota_percent";
+ /**
+ * Percent of total disk which {@link android.os.IDropBox} will never dip into.
+ * @hide
+ */
+ public static final String DROPBOX_RESERVE_PERCENT =
+ "dropbox_reserve_percent";
+ /**
+ * Prefix for per-tag dropbox disable/enable settings.
+ * @hide
+ */
+ public static final String DROPBOX_TAG_PREFIX =
+ "dropbox:";
+
+
+ /**
+ * Screen timeout in milliseconds corresponding to the
+ * PowerManager's POKE_LOCK_SHORT_TIMEOUT flag (i.e. the fastest
+ * possible screen timeout behavior.)
+ * @hide
+ */
+ public static final String SHORT_KEYLIGHT_DELAY_MS =
+ "short_keylight_delay_ms";
+
+ /**
+ * The interval in minutes after which the amount of free storage left on the
+ * device is logged to the event log
+ * @hide
+ */
+ public static final String SYS_FREE_STORAGE_LOG_INTERVAL =
+ "sys_free_storage_log_interval";
+
+ /**
+ * Threshold for the amount of change in disk free space required to report the amount of
+ * free space. Used to prevent spamming the logs when the disk free space isn't changing
+ * frequently.
+ * @hide
+ */
+ public static final String DISK_FREE_CHANGE_REPORTING_THRESHOLD =
+ "disk_free_change_reporting_threshold";
+
+
+ /**
+ * Minimum percentage of free storage on the device that is used to determine if
+ * the device is running low on storage.
+ * Say this value is set to 10, the device is considered running low on storage
+ * if 90% or more of the device storage is filled up.
+ * @hide
+ */
+ public static final String SYS_STORAGE_THRESHOLD_PERCENTAGE =
+ "sys_storage_threshold_percentage";
+
+ /**
+ * The interval in milliseconds after which Wi-Fi is considered idle.
+ * When idle, it is possible for the device to be switched from Wi-Fi to
+ * the mobile data network.
+ * @hide
+ */
+ public static final String WIFI_IDLE_MS = "wifi_idle_ms";
+
+ /**
+ * The interval in milliseconds at which to check packet counts on the
+ * mobile data interface when screen is on, to detect possible data
+ * connection problems.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_POLL_INTERVAL_MS =
+ "pdp_watchdog_poll_interval_ms";
+
+ /**
+ * The interval in milliseconds at which to check packet counts on the
+ * mobile data interface when screen is off, to detect possible data
+ * connection problems.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_LONG_POLL_INTERVAL_MS =
+ "pdp_watchdog_long_poll_interval_ms";
+
+ /**
+ * The interval in milliseconds at which to check packet counts on the
+ * mobile data interface after {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT}
+ * outgoing packets has been reached without incoming packets.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS =
+ "pdp_watchdog_error_poll_interval_ms";
+
+ /**
+ * The number of outgoing packets sent without seeing an incoming packet
+ * that triggers a countdown (of {@link #PDP_WATCHDOG_ERROR_POLL_COUNT}
+ * device is logged to the event log
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_TRIGGER_PACKET_COUNT =
+ "pdp_watchdog_trigger_packet_count";
+
+ /**
+ * The number of polls to perform (at {@link #PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS})
+ * after hitting {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT} before
+ * attempting data connection recovery.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_ERROR_POLL_COUNT =
+ "pdp_watchdog_error_poll_count";
+
+ /**
+ * The number of failed PDP reset attempts before moving to something more
+ * drastic: re-registering to the network.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT =
+ "pdp_watchdog_max_pdp_reset_fail_count";
+
+ /**
+ * Address to ping as a last sanity check before attempting any recovery.
+ * Unset or set to "0.0.0.0" to skip this check.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_PING_ADDRESS = "pdp_watchdog_ping_address";
+
+ /**
+ * The "-w deadline" parameter for the ping, ie, the max time in
+ * seconds to spend pinging.
+ * @hide
+ */
+ public static final String PDP_WATCHDOG_PING_DEADLINE = "pdp_watchdog_ping_deadline";
+
+ /**
+ * The interval in milliseconds at which to check gprs registration
+ * after the first registration mismatch of gprs and voice service,
+ * to detect possible data network registration problems.
+ *
+ * @hide
+ */
+ public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
+ "gprs_register_check_period_ms";
+
+ /**
+ * The length of time in milli-seconds that automatic small adjustments to
+ * SystemClock are ignored if NITZ_UPDATE_DIFF is not exceeded.
+ * @hide
+ */
+ public static final String NITZ_UPDATE_SPACING = "nitz_update_spacing";
+
+ /**
+ * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
+ * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
+ * exceeded.
+ * @hide
+ */
+ public static final String NITZ_UPDATE_DIFF = "nitz_update_diff";
+
+ /**
+ * The maximum reconnect delay for short network outages or when the network is suspended
+ * due to phone use.
+ * @hide
+ */
+ public static final String SYNC_MAX_RETRY_DELAY_IN_SECONDS =
+ "sync_max_retry_delay_in_seconds";
+
+ /**
+ * The interval in milliseconds at which to check the number of SMS sent
+ * out without asking for use permit, to limit the un-authorized SMS
+ * usage.
+ * @hide
+ */
+ public static final String SMS_OUTGOING_CHECK_INTERVAL_MS =
+ "sms_outgoing_check_interval_ms";
+
+ /**
+ * The number of outgoing SMS sent without asking for user permit
+ * (of {@link #SMS_OUTGOING_CHECK_INTERVAL_MS}
+ * @hide
+ */
+ public static final String SMS_OUTGOING_CHECK_MAX_COUNT =
+ "sms_outgoing_check_max_count";
+
+ /**
+ * Enable use of ssl session caching.
+ * 'db' - save each session in a (per process) database
+ * 'file' - save each session in a (per process) file
+ * not set or any other value - normal java in-memory caching
+ * @hide
+ */
+ public static final String SSL_SESSION_CACHE = "ssl_session_cache";
+
+ /**
+ * How many bytes long a message has to be, in order to be gzipped.
+ * @hide
+ */
+ public static final String SYNC_MIN_GZIP_BYTES =
+ "sync_min_gzip_bytes";
+
+ /**
+ * The number of promoted sources in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
+ /**
+ * The maximum number of suggestions returned by GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MAX_RESULTS_TO_DISPLAY = "search_max_results_to_display";
+ /**
+ * The number of suggestions GlobalSearch will ask each non-web search source for.
+ * @hide
+ */
+ public static final String SEARCH_MAX_RESULTS_PER_SOURCE = "search_max_results_per_source";
+ /**
+ * The number of suggestions the GlobalSearch will ask the web search source for.
+ * @hide
+ */
+ public static final String SEARCH_WEB_RESULTS_OVERRIDE_LIMIT =
+ "search_web_results_override_limit";
+ /**
+ * The number of milliseconds that GlobalSearch will wait for suggestions from
+ * promoted sources before continuing with all other sources.
+ * @hide
+ */
+ public static final String SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS =
+ "search_promoted_source_deadline_millis";
+ /**
+ * The number of milliseconds before GlobalSearch aborts search suggesiton queries.
+ * @hide
+ */
+ public static final String SEARCH_SOURCE_TIMEOUT_MILLIS = "search_source_timeout_millis";
+ /**
+ * The maximum number of milliseconds that GlobalSearch shows the previous results
+ * after receiving a new query.
+ * @hide
+ */
+ public static final String SEARCH_PREFILL_MILLIS = "search_prefill_millis";
+ /**
+ * The maximum age of log data used for shortcuts in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MAX_STAT_AGE_MILLIS = "search_max_stat_age_millis";
+ /**
+ * The maximum age of log data used for source ranking in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS =
+ "search_max_source_event_age_millis";
+ /**
+ * The minimum number of impressions needed to rank a source in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING =
+ "search_min_impressions_for_source_ranking";
+ /**
+ * The minimum number of clicks needed to rank a source in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING =
+ "search_min_clicks_for_source_ranking";
+ /**
+ * The maximum number of shortcuts shown by GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_MAX_SHORTCUTS_RETURNED = "search_max_shortcuts_returned";
+ /**
+ * The size of the core thread pool for suggestion queries in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_QUERY_THREAD_CORE_POOL_SIZE =
+ "search_query_thread_core_pool_size";
+ /**
+ * The maximum size of the thread pool for suggestion queries in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_QUERY_THREAD_MAX_POOL_SIZE =
+ "search_query_thread_max_pool_size";
+ /**
+ * The size of the core thread pool for shortcut refreshing in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE =
+ "search_shortcut_refresh_core_pool_size";
+ /**
+ * The maximum size of the thread pool for shortcut refreshing in GlobalSearch.
+ * @hide
+ */
+ public static final String SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE =
+ "search_shortcut_refresh_max_pool_size";
+ /**
+ * The maximun time that excess threads in the GlobalSeach thread pools will
+ * wait before terminating.
+ * @hide
+ */
+ public static final String SEARCH_THREAD_KEEPALIVE_SECONDS =
+ "search_thread_keepalive_seconds";
+ /**
+ * The maximum number of concurrent suggestion queries to each source.
+ * @hide
+ */
+ public static final String SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT =
+ "search_per_source_concurrent_query_limit";
+
+ /**
+ * Whether or not alert sounds are played on MountService events. (0 = false, 1 = true)
+ * @hide
+ */
+ public static final String MOUNT_PLAY_NOTIFICATION_SND = "mount_play_not_snd";
+
+ /**
+ * Whether or not UMS auto-starts on UMS host detection. (0 = false, 1 = true)
+ * @hide
+ */
+ public static final String MOUNT_UMS_AUTOSTART = "mount_ums_autostart";
+
+ /**
+ * Whether or not a notification is displayed on UMS host detection. (0 = false, 1 = true)
+ * @hide
+ */
+ public static final String MOUNT_UMS_PROMPT = "mount_ums_prompt";
+
+ /**
+ * Whether or not a notification is displayed while UMS is enabled. (0 = false, 1 = true)
+ * @hide
+ */
+ public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled";
+
+ /**
+ * If nonzero, ANRs in invisible background processes bring up a dialog.
+ * Otherwise, the process will be silently killed.
+ * @hide
+ */
+ public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
+
+ /**
* @hide
*/
public static final String[] SETTINGS_TO_BACKUP = {
@@ -2473,6 +2970,10 @@
WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
WIFI_NUM_ALLOWED_CHANNELS,
WIFI_NUM_OPEN_NETWORKS_KEPT,
+ MOUNT_PLAY_NOTIFICATION_SND,
+ MOUNT_UMS_AUTOSTART,
+ MOUNT_UMS_PROMPT,
+ MOUNT_UMS_NOTIFY_ENABLED
};
/**
@@ -2517,1249 +3018,6 @@
}
/**
- * Gservices settings, containing the network names for Google's
- * various services. This table holds simple name/addr pairs.
- * Addresses can be accessed through the getString() method.
- *
- * TODO: This should move to partner/google/... somewhere.
- *
- * @hide
- */
- public static final class Gservices extends NameValueTable {
- public static final String SYS_PROP_SETTING_VERSION = "sys.settings_gservices_version";
-
- /**
- * Intent action broadcast when the Gservices table is updated by the server.
- * This is broadcast once after settings change (so many values may have been updated).
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String CHANGED_ACTION =
- "com.google.gservices.intent.action.GSERVICES_CHANGED";
-
- /**
- * Intent action to override Gservices for testing. (Requires WRITE_GSERVICES permission.)
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String OVERRIDE_ACTION =
- "com.google.gservices.intent.action.GSERVICES_OVERRIDE";
-
- /**
- * Intent action to set Gservices with new values. (Requires WRITE_GSERVICES permission.)
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String UPDATE_ACTION =
- "com.google.gservices.intent.action.GSERVICES_UPDATE";
-
- private static volatile NameValueCache mNameValueCache = null;
- private static final Object mNameValueCacheLock = new Object();
-
- /**
- * Look up a name in the database.
- * @param resolver to access the database with
- * @param name to look up in the table
- * @return the corresponding value, or null if not present
- */
- public static String getString(ContentResolver resolver, String name) {
- synchronized (mNameValueCacheLock) {
- if (mNameValueCache == null) {
- mNameValueCache = new NameValueCache(SYS_PROP_SETTING_VERSION, CONTENT_URI);
- }
- return mNameValueCache.getString(resolver, name);
- }
- }
-
- /**
- * Store a name/value pair into the database.
- * @param resolver to access the database with
- * @param name to store
- * @param value to associate with the name
- * @return true if the value was set, false on database errors
- */
- public static boolean putString(ContentResolver resolver,
- String name, String value) {
- return putString(resolver, CONTENT_URI, name, value);
- }
-
- /**
- * Look up the value for name in the database, convert it to an int using Integer.parseInt
- * and return it. If it is null or if a NumberFormatException is caught during the
- * conversion then return defValue.
- */
- public static int getInt(ContentResolver resolver, String name, int defValue) {
- String valString = getString(resolver, name);
- int value;
- try {
- value = valString != null ? Integer.parseInt(valString) : defValue;
- } catch (NumberFormatException e) {
- value = defValue;
- }
- return value;
- }
-
- /**
- * Look up the value for name in the database, convert it to a long using Long.parseLong
- * and return it. If it is null or if a NumberFormatException is caught during the
- * conversion then return defValue.
- */
- public static long getLong(ContentResolver resolver, String name, long defValue) {
- String valString = getString(resolver, name);
- long value;
- try {
- value = valString != null ? Long.parseLong(valString) : defValue;
- } catch (NumberFormatException e) {
- value = defValue;
- }
- return value;
- }
-
- /**
- * Construct the content URI for a particular name/value pair,
- * useful for monitoring changes with a ContentObserver.
- * @param name to look up in the table
- * @return the corresponding content URI, or null if not present
- */
- public static Uri getUriFor(String name) {
- return getUriFor(CONTENT_URI, name);
- }
-
- /**
- * The content:// style URL for this table
- */
- public static final Uri CONTENT_URI =
- Uri.parse("content://" + AUTHORITY + "/gservices");
-
- /**
- * MMS - URL to use for HTTP "x-wap-profile" header
- */
- public static final String MMS_X_WAP_PROFILE_URL
- = "mms_x_wap_profile_url";
-
- /**
- * YouTube - the flag to indicate whether to use proxy
- */
- public static final String YOUTUBE_USE_PROXY
- = "youtube_use_proxy";
-
- /**
- * MMS - maximum message size in bytes for a MMS message.
- */
- public static final String MMS_MAXIMUM_MESSAGE_SIZE
- = "mms_maximum_message_size";
-
- /**
- * Event tags from the kernel event log to upload during checkin.
- */
- public static final String CHECKIN_EVENTS = "checkin_events";
-
- /**
- * Comma-separated list of service names to dump and upload during checkin.
- */
- public static final String CHECKIN_DUMPSYS_LIST = "checkin_dumpsys_list";
-
- /**
- * Comma-separated list of packages to specify for each service that is
- * dumped (currently only meaningful for user activity).
- */
- public static final String CHECKIN_PACKAGE_LIST = "checkin_package_list";
-
- /**
- * The interval (in seconds) between periodic checkin attempts.
- */
- public static final String CHECKIN_INTERVAL = "checkin_interval";
-
- /**
- * The interval (in seconds) between event log aggregation runs.
- */
- public static final String AGGREGATION_INTERVAL_SECONDS = "aggregation_interval_seconds";
-
- /**
- * Boolean indicating if the market app should force market only checkins on
- * install/uninstall. Any non-0 value is considered true.
- */
- public static final String MARKET_FORCE_CHECKIN = "market_force_checkin";
-
- /**
- * How frequently (in seconds) to check the memory status of the
- * device.
- */
- public static final String MEMCHECK_INTERVAL = "memcheck_interval";
-
- /**
- * Max frequency (in seconds) to log memory check stats, in realtime
- * seconds. This allows for throttling of logs when the device is
- * running for large amounts of time.
- */
- public static final String MEMCHECK_LOG_REALTIME_INTERVAL =
- "memcheck_log_realtime_interval";
-
- /**
- * Boolean indicating whether rebooting due to system memory checks
- * is enabled.
- */
- public static final String MEMCHECK_SYSTEM_ENABLED = "memcheck_system_enabled";
-
- /**
- * How many bytes the system process must be below to avoid scheduling
- * a soft reboot. This reboot will happen when it is next determined
- * to be a good time.
- */
- public static final String MEMCHECK_SYSTEM_SOFT_THRESHOLD = "memcheck_system_soft";
-
- /**
- * How many bytes the system process must be below to avoid scheduling
- * a hard reboot. This reboot will happen immediately.
- */
- public static final String MEMCHECK_SYSTEM_HARD_THRESHOLD = "memcheck_system_hard";
-
- /**
- * How many bytes the phone process must be below to avoid scheduling
- * a soft restart. This restart will happen when it is next determined
- * to be a good time.
- */
- public static final String MEMCHECK_PHONE_SOFT_THRESHOLD = "memcheck_phone_soft";
-
- /**
- * How many bytes the phone process must be below to avoid scheduling
- * a hard restart. This restart will happen immediately.
- */
- public static final String MEMCHECK_PHONE_HARD_THRESHOLD = "memcheck_phone_hard";
-
- /**
- * Boolean indicating whether restarting the phone process due to
- * memory checks is enabled.
- */
- public static final String MEMCHECK_PHONE_ENABLED = "memcheck_phone_enabled";
-
- /**
- * First time during the day it is okay to kill processes
- * or reboot the device due to low memory situations. This number is
- * in seconds since midnight.
- */
- public static final String MEMCHECK_EXEC_START_TIME = "memcheck_exec_start_time";
-
- /**
- * Last time during the day it is okay to kill processes
- * or reboot the device due to low memory situations. This number is
- * in seconds since midnight.
- */
- public static final String MEMCHECK_EXEC_END_TIME = "memcheck_exec_end_time";
-
- /**
- * How long the screen must have been off in order to kill processes
- * or reboot. This number is in seconds. A value of -1 means to
- * entirely disregard whether the screen is on.
- */
- public static final String MEMCHECK_MIN_SCREEN_OFF = "memcheck_min_screen_off";
-
- /**
- * How much time there must be until the next alarm in order to kill processes
- * or reboot. This number is in seconds. Note: this value must be
- * smaller than {@link #MEMCHECK_RECHECK_INTERVAL} or else it will
- * always see an alarm scheduled within its time.
- */
- public static final String MEMCHECK_MIN_ALARM = "memcheck_min_alarm";
-
- /**
- * How frequently to check whether it is a good time to restart things,
- * if the device is in a bad state. This number is in seconds. Note:
- * this value must be larger than {@link #MEMCHECK_MIN_ALARM} or else
- * the alarm to schedule the recheck will always appear within the
- * minimum "do not execute now" time.
- */
- public static final String MEMCHECK_RECHECK_INTERVAL = "memcheck_recheck_interval";
-
- /**
- * How frequently (in DAYS) to reboot the device. If 0, no reboots
- * will occur.
- */
- public static final String REBOOT_INTERVAL = "reboot_interval";
-
- /**
- * First time during the day it is okay to force a reboot of the
- * device (if REBOOT_INTERVAL is set). This number is
- * in seconds since midnight.
- */
- public static final String REBOOT_START_TIME = "reboot_start_time";
-
- /**
- * The window of time (in seconds) after each REBOOT_INTERVAL in which
- * a reboot can be executed. If 0, a reboot will always be executed at
- * exactly the given time. Otherwise, it will only be executed if
- * the device is idle within the window.
- */
- public static final String REBOOT_WINDOW = "reboot_window";
-
- /**
- * The minimum version of the server that is required in order for the device to accept
- * the server's recommendations about the initial sync settings to use. When this is unset,
- * blank or can't be interpreted as an integer then we will not ask the server for a
- * recommendation.
- */
- public static final String GMAIL_CONFIG_INFO_MIN_SERVER_VERSION =
- "gmail_config_info_min_server_version";
-
- /**
- * Controls whether Gmail offers a preview button for images.
- */
- public static final String GMAIL_DISALLOW_IMAGE_PREVIEWS = "gmail_disallow_image_previews";
-
- /**
- * The maximal size in bytes allowed for attachments when composing messages in Gmail
- */
- public static final String GMAIL_MAX_ATTACHMENT_SIZE = "gmail_max_attachment_size_bytes";
-
- /**
- * The timeout in milliseconds that Gmail uses when opening a connection and reading
- * from it. A missing value or a value of -1 instructs Gmail to use the defaults provided
- * by GoogleHttpClient.
- */
- public static final String GMAIL_TIMEOUT_MS = "gmail_timeout_ms";
-
- /**
- * Controls whether Gmail will request an expedited sync when a message is sent. Value must
- * be an integer where non-zero means true. Defaults to 1.
- */
- public static final String GMAIL_SEND_IMMEDIATELY = "gmail_send_immediately";
-
- /**
- * Controls whether gmail buffers server responses. Possible values are "memory", for a
- * memory-based buffer, or "file", for a temp-file-based buffer. All other values
- * (including not set) disable buffering.
- */
- public static final String GMAIL_BUFFER_SERVER_RESPONSE = "gmail_buffer_server_response";
-
- /**
- * The maximum size in bytes allowed for the provider to gzip a protocol buffer uploaded to
- * the server.
- */
- public static final String GMAIL_MAX_GZIP_SIZE = "gmail_max_gzip_size_bytes";
-
- /**
- * Controls whether Gmail will discard uphill operations that repeatedly fail. Value must be
- * an integer where non-zero means true. Defaults to 1. This flag controls Donut devices.
- */
- public static final String GMAIL_DISCARD_ERROR_UPHILL_OP = "gmail_discard_error_uphill_op";
-
- /**
- * Controls whether Gmail will discard uphill operations that repeatedly fail. Value must be
- * an integer where non-zero means true. Defaults to 1. This flag controls Eclair and
- * future devices.
- */
- public static final String GMAIL_DISCARD_ERROR_UPHILL_OP_NEW =
- "gmail_discard_error_uphill_op_new";
-
- /**
- * Controls how many attempts Gmail will try to upload an uphill operations before it
- * abandons the operation. Defaults to 20.
- */
- public static final String GMAIL_NUM_RETRY_UPHILL_OP = "gmail_num_retry_uphill_op";
-
- /**
- * How much time in seconds Gmail will try to upload an uphill operations before it
- * abandons the operation. Defaults to 36400 (one day).
- */
- public static final String GMAIL_WAIT_TIME_RETRY_UPHILL_OP =
- "gmail_wait_time_retry_uphill_op";
-
- /**
- * Controls if Gmail should delay sending operations that have previously failed.
- */
- public static final String GMAIL_DELAY_BAD_OP = "gmail_delay_bad_op";
-
- /**
- * Controls if the protocol buffer version of the protocol will use a multipart request for
- * attachment uploads. Value must be an integer where non-zero means true. Defaults to 0.
- */
- public static final String GMAIL_USE_MULTIPART_PROTOBUF = "gmail_use_multipart_protobuf";
-
- /**
- * the transcoder URL for mobile devices.
- */
- public static final String TRANSCODER_URL = "mobile_transcoder_url";
-
- /**
- * URL that points to the privacy terms of the Google Talk service.
- */
- public static final String GTALK_TERMS_OF_SERVICE_URL = "gtalk_terms_of_service_url";
-
- /**
- * Hostname of the GTalk server.
- */
- public static final String GTALK_SERVICE_HOSTNAME = "gtalk_hostname";
-
- /**
- * Secure port of the GTalk server.
- */
- public static final String GTALK_SERVICE_SECURE_PORT = "gtalk_secure_port";
-
- /**
- * The server configurable RMQ acking interval
- */
- public static final String GTALK_SERVICE_RMQ_ACK_INTERVAL = "gtalk_rmq_ack_interval";
-
- /**
- * The minimum reconnect delay for short network outages or when the network is suspended
- * due to phone use.
- */
- public static final String GTALK_SERVICE_MIN_RECONNECT_DELAY_SHORT =
- "gtalk_min_reconnect_delay_short";
-
- /**
- * The reconnect variant range for short network outages or when the network is suspended
- * due to phone use. A random number between 0 and this constant is computed and
- * added to {@link #GTALK_SERVICE_MIN_RECONNECT_DELAY_SHORT} to form the initial reconnect
- * delay.
- */
- public static final String GTALK_SERVICE_RECONNECT_VARIANT_SHORT =
- "gtalk_reconnect_variant_short";
-
- /**
- * The minimum reconnect delay for long network outages
- */
- public static final String GTALK_SERVICE_MIN_RECONNECT_DELAY_LONG =
- "gtalk_min_reconnect_delay_long";
-
- /**
- * The reconnect variant range for long network outages. A random number between 0 and this
- * constant is computed and added to {@link #GTALK_SERVICE_MIN_RECONNECT_DELAY_LONG} to
- * form the initial reconnect delay.
- */
- public static final String GTALK_SERVICE_RECONNECT_VARIANT_LONG =
- "gtalk_reconnect_variant_long";
-
- /**
- * The maximum reconnect delay time, in milliseconds.
- */
- public static final String GTALK_SERVICE_MAX_RECONNECT_DELAY =
- "gtalk_max_reconnect_delay";
-
- /**
- * The network downtime that is considered "short" for the above calculations,
- * in milliseconds.
- */
- public static final String GTALK_SERVICE_SHORT_NETWORK_DOWNTIME =
- "gtalk_short_network_downtime";
-
- /**
- * How frequently we send heartbeat pings to the GTalk server. Receiving a server packet
- * will reset the heartbeat timer. The away heartbeat should be used when the user is
- * logged into the GTalk app, but not actively using it.
- */
- public static final String GTALK_SERVICE_AWAY_HEARTBEAT_INTERVAL_MS =
- "gtalk_heartbeat_ping_interval_ms"; // keep the string backward compatible
-
- /**
- * How frequently we send heartbeat pings to the GTalk server. Receiving a server packet
- * will reset the heartbeat timer. The active heartbeat should be used when the user is
- * actively using the GTalk app.
- */
- public static final String GTALK_SERVICE_ACTIVE_HEARTBEAT_INTERVAL_MS =
- "gtalk_active_heartbeat_ping_interval_ms";
-
- /**
- * How frequently we send heartbeat pings to the GTalk server. Receiving a server packet
- * will reset the heartbeat timer. The sync heartbeat should be used when the user isn't
- * logged into the GTalk app, but auto-sync is enabled.
- */
- public static final String GTALK_SERVICE_SYNC_HEARTBEAT_INTERVAL_MS =
- "gtalk_sync_heartbeat_ping_interval_ms";
-
- /**
- * How frequently we send heartbeat pings to the GTalk server. Receiving a server packet
- * will reset the heartbeat timer. The no sync heartbeat should be used when the user isn't
- * logged into the GTalk app, and auto-sync is not enabled.
- */
- public static final String GTALK_SERVICE_NOSYNC_HEARTBEAT_INTERVAL_MS =
- "gtalk_nosync_heartbeat_ping_interval_ms";
-
- /**
- * The maximum heartbeat interval used while on the WIFI network.
- */
- public static final String GTALK_SERVICE_WIFI_MAX_HEARTBEAT_INTERVAL_MS =
- "gtalk_wifi_max_heartbeat_ping_interval_ms";
-
- /**
- * How long we wait to receive a heartbeat ping acknowledgement (or another packet)
- * from the GTalk server, before deeming the connection dead.
- */
- public static final String GTALK_SERVICE_HEARTBEAT_ACK_TIMEOUT_MS =
- "gtalk_heartbeat_ack_timeout_ms";
-
- /**
- * How long after screen is turned off before we consider the user to be idle.
- */
- public static final String GTALK_SERVICE_IDLE_TIMEOUT_MS =
- "gtalk_idle_timeout_ms";
-
- /**
- * By default, GTalkService will always connect to the server regardless of the auto-sync
- * setting. However, if this parameter is true, then GTalkService will only connect
- * if auto-sync is enabled. Using the GTalk app will trigger the connection too.
- */
- public static final String GTALK_SERVICE_CONNECT_ON_AUTO_SYNC =
- "gtalk_connect_on_auto_sync";
-
- /**
- * GTalkService holds a wakelock while broadcasting the intent for data message received.
- * It then automatically release the wakelock after a timeout. This setting controls what
- * the timeout should be.
- */
- public static final String GTALK_DATA_MESSAGE_WAKELOCK_MS =
- "gtalk_data_message_wakelock_ms";
-
- /**
- * The socket read timeout used to control how long ssl handshake wait for reads before
- * timing out. This is needed so the ssl handshake doesn't hang for a long time in some
- * circumstances.
- */
- public static final String GTALK_SSL_HANDSHAKE_TIMEOUT_MS =
- "gtalk_ssl_handshake_timeout_ms";
-
- /**
- * Compress the gtalk stream.
- */
- public static final String GTALK_COMPRESS = "gtalk_compress";
-
- /**
- * This is the timeout for which Google Talk will send the message using bareJID. In a
- * established chat between two XMPP endpoints, Google Talk uses fullJID in the format
- * of user@domain/resource in order to send the message to the specific client. However,
- * if Google Talk hasn't received a message from that client after some time, it would
- * fall back to use the bareJID, which would broadcast the message to all clients for
- * the other user.
- */
- public static final String GTALK_USE_BARE_JID_TIMEOUT_MS = "gtalk_use_barejid_timeout_ms";
-
- /**
- * This is the threshold of retry number when there is an authentication expired failure
- * for Google Talk. In some situation, e.g. when a Google Apps account is disabled chat
- * service, the connection keeps failing. This threshold controls when we should stop
- * the retrying.
- */
- public static final String GTALK_MAX_RETRIES_FOR_AUTH_EXPIRED =
- "gtalk_max_retries_for_auth_expired";
-
- /**
- * a boolean setting indicating whether the GTalkService should use RMQ2 protocol or not.
- */
- public static final String GTALK_USE_RMQ2_PROTOCOL =
- "gtalk_use_rmq2";
-
- /**
- * a boolean setting indicating whether the GTalkService should support both RMQ and
- * RMQ2 protocols. This setting is true for the transitional period when we need to
- * support both protocols.
- */
- public static final String GTALK_SUPPORT_RMQ_AND_RMQ2_PROTOCOLS =
- "gtalk_support_rmq_and_rmq2";
-
- /**
- * a boolean setting controlling whether the rmq2 protocol will include stream ids in
- * the protobufs. This is used for debugging.
- */
- public static final String GTALK_RMQ2_INCLUDE_STREAM_ID =
- "gtalk_rmq2_include_stream_id";
-
- /**
- * when receiving a chat message from the server, the message could be an older message
- * whose "time sent" is x seconds from now. If x is significant enough, we want to flag
- * it so the UI can give it some special treatment when displaying the "time sent" for
- * it. This setting is to control what x is.
- */
- public static final String GTALK_OLD_CHAT_MESSAGE_THRESHOLD_IN_SEC =
- "gtalk_old_chat_msg_threshold_in_sec";
-
- /**
- * a setting to control the max connection history record GTalkService stores.
- */
- public static final String GTALK_MAX_CONNECTION_HISTORY_RECORDS =
- "gtalk_max_conn_history_records";
-
- /**
- * 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. 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";
-
- /**
- * This is the url to lookup an actual picture from flickr.
- */
- public static final String GTALK_FLICKR_PHOTO_URL =
- "gtalk_flickr_photo_url";
-
- /**
- * 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 =
- "gtalk_chat_message_lifetime";
-
- /**
- * OTR message lifetime (for pruning old otr messages).
- */
- public static final String GTALK_OTR_MESSAGE_LIFETIME =
- "gtalk_otr_message_lifetime";
-
- /**
- * Chat expiration time, i.e., time since last message in the chat (for pruning old chats).
- */
- public static final String GTALK_CHAT_EXPIRATION_TIME =
- "gtalk_chat_expiration_time";
-
- /**
- * This is the url for getting the app token for server-to-device push messaging.
- */
- public static final String PUSH_MESSAGING_REGISTRATION_URL =
- "push_messaging_registration_url";
-
- /**
- * Use android://<it> routing infos for Google Sync Server subcriptions.
- */
- public static final String GSYNC_USE_RMQ2_ROUTING_INFO = "gsync_use_rmq2_routing_info";
-
- /**
- * Enable use of ssl session caching.
- * 'db' - save each session in a (per process) database
- * 'file' - save each session in a (per process) file
- * not set or any other value - normal java in-memory caching
- */
- public static final String SSL_SESSION_CACHE = "ssl_session_cache";
-
- /**
- * How many bytes long a message has to be, in order to be gzipped.
- */
- public static final String SYNC_MIN_GZIP_BYTES =
- "sync_min_gzip_bytes";
-
- /**
- * The hash value of the current provisioning settings
- */
- public static final String PROVISIONING_DIGEST = "digest";
-
- /**
- * Provisioning keys to block from server update
- */
- public static final String PROVISIONING_OVERRIDE = "override";
-
- /**
- * "Generic" service name for authentication requests.
- */
- public static final String GOOGLE_LOGIN_GENERIC_AUTH_SERVICE
- = "google_login_generic_auth_service";
-
- /**
- * Duration in milliseconds after setup at which market does not reconcile applications
- * which are installed during restore.
- */
- public static final String VENDING_RESTORE_WINDOW_MS = "vending_restore_window_ms";
-
-
- /**
- * Frequency in milliseconds at which we should sync the locally installed Vending Machine
- * content with the server.
- */
- public static final String VENDING_SYNC_FREQUENCY_MS = "vending_sync_frequency_ms";
-
- /**
- * Support URL that is opened in a browser when user clicks on 'Help and Info' in Vending
- * Machine.
- */
- public static final String VENDING_SUPPORT_URL = "vending_support_url";
-
- /**
- * Indicates if Vending Machine requires a SIM to be in the phone to allow a purchase.
- *
- * true = SIM is required
- * false = SIM is not required
- */
- public static final String VENDING_REQUIRE_SIM_FOR_PURCHASE =
- "vending_require_sim_for_purchase";
-
- /**
- * Indicates the Vending Machine backup state. It is set if the
- * Vending application has been backed up at least once.
- */
- public static final String VENDING_BACKUP_STATE = "vending_backup_state";
-
- /**
- * The current version id of the Vending Machine terms of service.
- */
- public static final String VENDING_TOS_VERSION = "vending_tos_version";
-
- /**
- * URL that points to the terms of service for Vending Machine.
- */
- public static final String VENDING_TOS_URL = "vending_tos_url";
-
- /**
- * URL to navigate to in browser (not Market) when the terms of service
- * for Vending Machine could not be accessed due to bad network
- * connection.
- */
- public static final String VENDING_TOS_MISSING_URL = "vending_tos_missing_url";
-
- /**
- * Whether to use sierraqa instead of sierra tokens for the purchase flow in
- * Vending Machine.
- *
- * true = use sierraqa
- * false = use sierra (default)
- */
- public static final String VENDING_USE_CHECKOUT_QA_SERVICE =
- "vending_use_checkout_qa_service";
-
- /**
- * Default value to use for all/free/priced filter in Market.
- * Valid values: ALL, FREE, PAID (case insensitive)
- */
- public static final String VENDING_DEFAULT_FILTER = "vending_default_filter";
- /**
- * Ranking type value to use for the first category tab (currently popular)
- */
- public static final String VENDING_TAB_1_RANKING_TYPE = "vending_tab_1_ranking_type";
-
- /**
- * Title string to use for first category tab.
- */
- public static final String VENDING_TAB_1_TITLE = "vending_tab_1_title";
-
- /**
- * Ranking type value to use for the second category tab (currently newest)
- */
- public static final String VENDING_TAB_2_RANKING_TYPE = "vending_tab_2_ranking_type";
-
- /**
- * Title string to use for second category tab.
- */
- public static final String VENDING_TAB_2_TITLE = "vending_tab_2_title";
-
- /**
- * Frequency in milliseconds at which we should request MCS heartbeats
- * from the Vending Machine client.
- */
- public static final String VENDING_HEARTBEAT_FREQUENCY_MS =
- "vending_heartbeat_frequency_ms";
-
- /**
- * Frequency in milliseconds at which we should resend pending download
- * requests to the API Server from the Vending Machine client.
- */
- public static final String VENDING_PENDING_DOWNLOAD_RESEND_FREQUENCY_MS =
- "vending_pd_resend_frequency_ms";
-
- /**
- * Time before an asset in the 'DOWNLOADING' state is considered ready
- * for an install kick on the client.
- */
- public static final String VENDING_DOWNLOADING_KICK_TIMEOUT_MS =
- "vending_downloading_kick_ms";
-
- /**
- * Size of buffer in bytes for Vending to use when reading cache files.
- */
- public static final String VENDING_DISK_INPUT_BUFFER_BYTES =
- "vending_disk_input_buffer_bytes";
-
- /**
- * Size of buffer in bytes for Vending to use when writing cache files.
- */
- public static final String VENDING_DISK_OUTPUT_BUFFER_BYTES =
- "vending_disk_output_buffer_bytes";
-
- /**
- * Frequency in milliseconds at which we should cycle through the promoted applications
- * on the home screen or the categories page.
- */
- public static final String VENDING_PROMO_REFRESH_FREQUENCY_MS =
- "vending_promo_refresh_freq_ms";
-
- /**
- * Frequency in milliseconds when we should refresh the provisioning information from
- * the carrier backend.
- */
- public static final String VENDING_CARRIER_PROVISIONING_REFRESH_FREQUENCY_MS =
- "vending_carrier_ref_freq_ms";
-
- /**
- * Interval in milliseconds after which a failed provisioning request should be retried.
- */
- public static final String VENDING_CARRIER_PROVISIONING_RETRY_MS =
- "vending_carrier_prov_retry_ms";
-
- /**
- * Buffer in milliseconds for carrier credentials to be considered valid.
- */
- public static final String VENDING_CARRIER_CREDENTIALS_BUFFER_MS =
- "vending_carrier_cred_buf_ms";
-
- /**
- * Whether to turn on performance logging in the Market client.
- */
- public static final String VENDING_LOG_PERFORMANCE =
- "vending_log_perf";
-
- /**
- * URL that points to the legal terms of service to display in Settings.
- * <p>
- * This should be a https URL. For a pretty user-friendly URL, use
- * {@link #SETTINGS_TOS_PRETTY_URL}.
- */
- public static final String SETTINGS_TOS_URL = "settings_tos_url";
-
- /**
- * URL that points to the legal terms of service to display in Settings.
- * <p>
- * This should be a pretty http URL. For the URL the device will access
- * via Settings, use {@link #SETTINGS_TOS_URL}.
- */
- public static final String SETTINGS_TOS_PRETTY_URL = "settings_tos_pretty_url";
-
- /**
- * URL that points to the contributors to display in Settings.
- * <p>
- * This should be a https URL. For a pretty user-friendly URL, use
- * {@link #SETTINGS_CONTRIBUTORS_PRETTY_URL}.
- */
- public static final String SETTINGS_CONTRIBUTORS_URL = "settings_contributors_url";
-
- /**
- * URL that points to the contributors to display in Settings.
- * <p>
- * This should be a pretty http URL. For the URL the device will access
- * via Settings, use {@link #SETTINGS_CONTRIBUTORS_URL}.
- */
- public static final String SETTINGS_CONTRIBUTORS_PRETTY_URL =
- "settings_contributors_pretty_url";
-
- /**
- * URL that points to the Terms Of Service for the device.
- * <p>
- * This should be a pretty http URL.
- */
- public static final String SETUP_GOOGLE_TOS_URL = "setup_google_tos_url";
-
- /**
- * URL that points to the Android privacy policy for the device.
- * <p>
- * This should be a pretty http URL.
- */
- public static final String SETUP_ANDROID_PRIVACY_URL = "setup_android_privacy_url";
-
- /**
- * URL that points to the Google privacy policy for the device.
- * <p>
- * This should be a pretty http URL.
- */
- public static final String SETUP_GOOGLE_PRIVACY_URL = "setup_google_privacy_url";
-
- /**
- * Request an MSISDN token for various Google services.
- */
- public static final String USE_MSISDN_TOKEN = "use_msisdn_token";
-
- /**
- * RSA public key used to encrypt passwords stored in the database.
- */
- public static final String GLS_PUBLIC_KEY = "google_login_public_key";
-
- /**
- * Only check parental control status if this is set to "true".
- */
- public static final String PARENTAL_CONTROL_CHECK_ENABLED =
- "parental_control_check_enabled";
-
- /**
- * The list of applications we need to block if parental control is
- * enabled.
- */
- public static final String PARENTAL_CONTROL_APPS_LIST =
- "parental_control_apps_list";
-
- /**
- * Duration in which parental control status is valid.
- */
- public static final String PARENTAL_CONTROL_TIMEOUT_IN_MS =
- "parental_control_timeout_in_ms";
-
- /**
- * When parental control is off, we expect to get this string from the
- * litmus url.
- */
- public static final String PARENTAL_CONTROL_EXPECTED_RESPONSE =
- "parental_control_expected_response";
-
- /**
- * When the litmus url returns a 302, declare parental control to be on
- * only if the redirect url matches this regular expression.
- */
- public static final String PARENTAL_CONTROL_REDIRECT_REGEX =
- "parental_control_redirect_regex";
-
- /**
- * Threshold for the amount of change in disk free space required to report the amount of
- * free space. Used to prevent spamming the logs when the disk free space isn't changing
- * frequently.
- */
- public static final String DISK_FREE_CHANGE_REPORTING_THRESHOLD =
- "disk_free_change_reporting_threshold";
-
- /**
- * Prefix for new Google services published by the checkin
- * server.
- */
- public static final String GOOGLE_SERVICES_PREFIX
- = "google_services:";
-
- /**
- * The maximum reconnect delay for short network outages or when the network is suspended
- * due to phone use.
- */
- public static final String SYNC_MAX_RETRY_DELAY_IN_SECONDS =
- "sync_max_retry_delay_in_seconds";
-
- /**
- * Minimum percentage of free storage on the device that is used to determine if
- * the device is running low on storage.
- * Say this value is set to 10, the device is considered running low on storage
- * if 90% or more of the device storage is filled up.
- */
- public static final String SYS_STORAGE_THRESHOLD_PERCENTAGE =
- "sys_storage_threshold_percentage";
-
- /**
- * The interval in minutes after which the amount of free storage left on the
- * device is logged to the event log
- */
- public static final String SYS_FREE_STORAGE_LOG_INTERVAL =
- "sys_free_storage_log_interval";
-
- /**
- * The interval in milliseconds at which to check the number of SMS sent
- * out without asking for use permit, to limit the un-authorized SMS
- * usage.
- */
- public static final String SMS_OUTGOING_CHECK_INTERVAL_MS =
- "sms_outgoing_check_interval_ms";
-
- /**
- * The number of outgoing SMS sent without asking for user permit
- * (of {@link #SMS_OUTGOING_CHECK_INTERVAL_MS}
- */
- public static final String SMS_OUTGOING_CEHCK_MAX_COUNT =
- "sms_outgoing_check_max_count";
-
- /**
- * The interval in milliseconds at which to check packet counts on the
- * mobile data interface when screen is on, to detect possible data
- * connection problems.
- */
- public static final String PDP_WATCHDOG_POLL_INTERVAL_MS =
- "pdp_watchdog_poll_interval_ms";
-
- /**
- * The interval in milliseconds at which to check packet counts on the
- * mobile data interface when screen is off, to detect possible data
- * connection problems.
- */
- public static final String PDP_WATCHDOG_LONG_POLL_INTERVAL_MS =
- "pdp_watchdog_long_poll_interval_ms";
-
- /**
- * The interval in milliseconds at which to check packet counts on the
- * mobile data interface after {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT}
- * outgoing packets has been reached without incoming packets.
- */
- public static final String PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS =
- "pdp_watchdog_error_poll_interval_ms";
-
- /**
- * The number of outgoing packets sent without seeing an incoming packet
- * that triggers a countdown (of {@link #PDP_WATCHDOG_ERROR_POLL_COUNT}
- * device is logged to the event log
- */
- public static final String PDP_WATCHDOG_TRIGGER_PACKET_COUNT =
- "pdp_watchdog_trigger_packet_count";
-
- /**
- * The number of polls to perform (at {@link #PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS})
- * after hitting {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT} before
- * attempting data connection recovery.
- */
- public static final String PDP_WATCHDOG_ERROR_POLL_COUNT =
- "pdp_watchdog_error_poll_count";
-
- /**
- * The number of failed PDP reset attempts before moving to something more
- * drastic: re-registering to the network.
- */
- public static final String PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT =
- "pdp_watchdog_max_pdp_reset_fail_count";
-
- /**
- * Address to ping as a last sanity check before attempting any recovery.
- * Unset or set to "0.0.0.0" to skip this check.
- */
- public static final String PDP_WATCHDOG_PING_ADDRESS = "pdp_watchdog_ping_address";
-
- /**
- * The "-w deadline" parameter for the ping, ie, the max time in
- * seconds to spend pinging.
- */
- public static final String PDP_WATCHDOG_PING_DEADLINE = "pdp_watchdog_ping_deadline";
-
- /**
- * The interval in milliseconds at which to check gprs registration
- * after the first registration mismatch of gprs and voice service,
- * to detect possible data network registration problems.
- *
- */
- public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
- "gprs_register_check_period_ms";
-
- /**
- * The interval in milliseconds after which Wi-Fi is considered idle.
- * When idle, it is possible for the device to be switched from Wi-Fi to
- * the mobile data network.
- */
- public static final String WIFI_IDLE_MS = "wifi_idle_ms";
-
- /**
- * Screen timeout in milliseconds corresponding to the
- * PowerManager's POKE_LOCK_SHORT_TIMEOUT flag (i.e. the fastest
- * possible screen timeout behavior.)
- */
- public static final String SHORT_KEYLIGHT_DELAY_MS =
- "short_keylight_delay_ms";
-
- /**
- * List of test suites (local disk filename) for the automatic instrumentation test runner.
- * The file format is similar to automated_suites.xml, see AutoTesterService.
- * If this setting is missing or empty, the automatic test runner will not start.
- */
- public static final String AUTOTEST_SUITES_FILE = "autotest_suites_file";
-
- /**
- * Interval between synchronous checkins forced by the automatic test runner.
- * If you set this to a value smaller than CHECKIN_INTERVAL, then the test runner's
- * frequent checkins will prevent asynchronous background checkins from interfering
- * with any performance measurements.
- */
- public static final String AUTOTEST_CHECKIN_SECONDS = "autotest_checkin_seconds";
-
- /**
- * Interval between reboots forced by the automatic test runner.
- */
- public static final String AUTOTEST_REBOOT_SECONDS = "autotest_reboot_seconds";
-
-
- /**
- * Threshold values for the duration and level of a discharge cycle, under
- * which we log discharge cycle info.
- */
- public static final String BATTERY_DISCHARGE_DURATION_THRESHOLD =
- "battery_discharge_duration_threshold";
- public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
-
- /**
- * An email address that anr bugreports should be sent to.
- */
- public static final String ANR_BUGREPORT_RECIPIENT = "anr_bugreport_recipient";
-
- /**
- * Flag for allowing service provider to use location information to improve products and
- * services.
- * Type: int ( 0 = disallow, 1 = allow )
- * @deprecated
- */
- public static final String USE_LOCATION_FOR_SERVICES = "use_location";
-
- /**
- * The number of promoted sources in GlobalSearch.
- */
- public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
- /**
- * The maximum number of suggestions returned by GlobalSearch.
- */
- public static final String SEARCH_MAX_RESULTS_TO_DISPLAY = "search_max_results_to_display";
- /**
- * The number of suggestions GlobalSearch will ask each non-web search source for.
- */
- public static final String SEARCH_MAX_RESULTS_PER_SOURCE = "search_max_results_per_source";
- /**
- * The number of suggestions the GlobalSearch will ask the web search source for.
- */
- public static final String SEARCH_WEB_RESULTS_OVERRIDE_LIMIT =
- "search_web_results_override_limit";
- /**
- * The number of milliseconds that GlobalSearch will wait for suggestions from
- * promoted sources before continuing with all other sources.
- */
- public static final String SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS =
- "search_promoted_source_deadline_millis";
- /**
- * The number of milliseconds before GlobalSearch aborts search suggesiton queries.
- */
- public static final String SEARCH_SOURCE_TIMEOUT_MILLIS = "search_source_timeout_millis";
- /**
- * The maximum number of milliseconds that GlobalSearch shows the previous results
- * after receiving a new query.
- */
- public static final String SEARCH_PREFILL_MILLIS = "search_prefill_millis";
- /**
- * The maximum age of log data used for shortcuts in GlobalSearch.
- */
- public static final String SEARCH_MAX_STAT_AGE_MILLIS = "search_max_stat_age_millis";
- /**
- * The maximum age of log data used for source ranking in GlobalSearch.
- */
- public static final String SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS =
- "search_max_source_event_age_millis";
- /**
- * The minimum number of impressions needed to rank a source in GlobalSearch.
- */
- public static final String SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING =
- "search_min_impressions_for_source_ranking";
- /**
- * The minimum number of clicks needed to rank a source in GlobalSearch.
- */
- public static final String SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING =
- "search_min_clicks_for_source_ranking";
- /**
- * The maximum number of shortcuts shown by GlobalSearch.
- */
- public static final String SEARCH_MAX_SHORTCUTS_RETURNED = "search_max_shortcuts_returned";
- /**
- * The size of the core thread pool for suggestion queries in GlobalSearch.
- */
- public static final String SEARCH_QUERY_THREAD_CORE_POOL_SIZE =
- "search_query_thread_core_pool_size";
- /**
- * The maximum size of the thread pool for suggestion queries in GlobalSearch.
- */
- public static final String SEARCH_QUERY_THREAD_MAX_POOL_SIZE =
- "search_query_thread_max_pool_size";
- /**
- * The size of the core thread pool for shortcut refreshing in GlobalSearch.
- */
- public static final String SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE =
- "search_shortcut_refresh_core_pool_size";
- /**
- * The maximum size of the thread pool for shortcut refreshing in GlobalSearch.
- */
- public static final String SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE =
- "search_shortcut_refresh_max_pool_size";
- /**
- * The maximun time that excess threads in the GlobalSeach thread pools will
- * wait before terminating.
- */
- public static final String SEARCH_THREAD_KEEPALIVE_SECONDS =
- "search_thread_keepalive_seconds";
- /**
- * The maximum number of concurrent suggestion queries to each source.
- */
- public static final String SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT =
- "search_per_source_concurrent_query_limit";
- /**
- * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
- * on application crashes and ANRs. If this is disabled, the crash/ANR dialog
- * will never display the "Report" button.
- * Type: int ( 0 = disallow, 1 = allow )
- */
- public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
-
- /**
- * Maximum size of /proc/last_kmsg content to upload after reboot.
- */
- public static final String LAST_KMSG_KB = "last_kmsg_kb";
-
- /**
- * Maximum age of entries kept by {@link android.os.IDropBox}.
- */
- public static final String DROPBOX_AGE_SECONDS =
- "dropbox_age_seconds";
- /**
- * Maximum amount of disk space used by {@link android.os.IDropBox} no matter what.
- */
- public static final String DROPBOX_QUOTA_KB =
- "dropbox_quota_kb";
- /**
- * Percent of free disk (excluding reserve) which {@link android.os.IDropBox} will use.
- */
- public static final String DROPBOX_QUOTA_PERCENT =
- "dropbox_quota_percent";
- /**
- * Percent of total disk which {@link android.os.IDropBox} will never dip into.
- */
- public static final String DROPBOX_RESERVE_PERCENT =
- "dropbox_reserve_percent";
- /**
- * Prefix for per-tag dropbox disable/enable settings.
- */
- public static final String DROPBOX_TAG_PREFIX =
- "dropbox:";
-
- /**
- * The length of time in milli-seconds that automatic small adjustments to
- * SystemClock are ignored if NITZ_UPDATE_DIFF is not exceeded.
- */
- public static final String NITZ_UPDATE_SPACING = "nitz_update_spacing";
-
- /**
- * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
- * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
- * exceeded.
- */
- public static final String NITZ_UPDATE_DIFF = "nitz_update_diff";
-
- /**
- * @deprecated
- * @hide
- */
- @Deprecated // Obviated by NameValueCache: just fetch the value directly.
- public static class QueryMap extends ContentQueryMap {
-
- public QueryMap(ContentResolver contentResolver, Cursor cursor, boolean keepUpdated,
- Handler handlerForUpdateNotifications) {
- super(cursor, NAME, keepUpdated, handlerForUpdateNotifications);
- }
-
- public QueryMap(ContentResolver contentResolver, boolean keepUpdated,
- Handler handlerForUpdateNotifications) {
- this(contentResolver,
- contentResolver.query(CONTENT_URI, null, null, null, null),
- keepUpdated, handlerForUpdateNotifications);
- }
-
- public String getString(String name) {
- ContentValues cv = getValues(name);
- if (cv == null) return null;
- return cv.getAsString(VALUE);
- }
- }
-
- }
-
- /**
* User-defined bookmarks and shortcuts. The target of each bookmark is an
* Intent URL, allowing it to be either a web page or a particular
* application activity.
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java
index 03dcf00..22bb43c 100644
--- a/core/java/android/server/BluetoothA2dpService.java
+++ b/core/java/android/server/BluetoothA2dpService.java
@@ -96,11 +96,12 @@
BluetoothDevice.ERROR);
switch(bondState) {
case BluetoothDevice.BOND_BONDED:
- setSinkPriority(device, BluetoothA2dp.PRIORITY_ON);
+ if (getSinkPriority(device) == BluetoothA2dp.PRIORITY_UNDEFINED) {
+ setSinkPriority(device, BluetoothA2dp.PRIORITY_ON);
+ }
break;
- case BluetoothDevice.BOND_BONDING:
case BluetoothDevice.BOND_NONE:
- setSinkPriority(device, BluetoothA2dp.PRIORITY_OFF);
+ setSinkPriority(device, BluetoothA2dp.PRIORITY_UNDEFINED);
break;
}
} else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
@@ -405,7 +406,7 @@
mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
return Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.getBluetoothA2dpSinkPriorityKey(device.getAddress()),
- BluetoothA2dp.PRIORITY_OFF);
+ BluetoothA2dp.PRIORITY_UNDEFINED);
}
public synchronized boolean setSinkPriority(BluetoothDevice device, int priority) {
@@ -464,11 +465,8 @@
checkSinkSuspendState(state);
mTargetA2dpState = -1;
- if (state == BluetoothA2dp.STATE_CONNECTING) {
- mAudioManager.setParameters("A2dpSuspended=false");
- }
-
- if (state == BluetoothA2dp.STATE_CONNECTING ||
+ if (getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF &&
+ state == BluetoothA2dp.STATE_CONNECTING ||
state == BluetoothA2dp.STATE_CONNECTED) {
// We have connected or attempting to connect.
// Bump priority
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index 0d0d245..b28cf43 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -21,14 +21,15 @@
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
+import android.os.ParcelUuid;
import android.util.Log;
import java.util.HashMap;
+import java.util.Set;
/**
* TODO: Move this to
@@ -553,7 +554,7 @@
if (mBluetoothService.isEnabled() &&
(BluetoothUuid.isAudioSource(uuid) || BluetoothUuid.isAvrcpTarget(uuid)
|| BluetoothUuid.isAdvAudioDist(uuid)) &&
- (a2dp.getNonDisconnectedSinks().size() == 0)) {
+ !isOtherSinkInNonDisconnectingState(address)) {
BluetoothDevice device = mAdapter.getRemoteDevice(address);
authorized = a2dp.getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF;
if (authorized) {
@@ -568,6 +569,16 @@
return authorized;
}
+ boolean isOtherSinkInNonDisconnectingState(String address) {
+ BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
+ Set<BluetoothDevice> devices = a2dp.getNonDisconnectedSinks();
+ if (devices.size() == 0) return false;
+ for(BluetoothDevice dev: devices) {
+ if (!dev.getAddress().equals(address)) return true;
+ }
+ return false;
+ }
+
private void onAgentCancel() {
Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_CANCEL);
mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM);
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index b590449..dfb775f 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -74,6 +74,7 @@
private int mNativeData;
private BluetoothEventLoop mEventLoop;
private boolean mIsAirplaneSensitive;
+ private boolean mIsAirplaneToggleable;
private int mBluetoothState;
private boolean mRestart = false; // need to call enable() after disable()
private boolean mIsDiscovering;
@@ -370,7 +371,7 @@
"Need BLUETOOTH_ADMIN permission");
// Airplane mode can prevent Bluetooth radio from being turned on.
- if (mIsAirplaneSensitive && isAirplaneModeOn()) {
+ if (mIsAirplaneSensitive && isAirplaneModeOn() && !mIsAirplaneToggleable) {
return false;
}
if (mBluetoothState != BluetoothAdapter.STATE_OFF) {
@@ -545,7 +546,7 @@
mEventLoop.onPropertyChanged(propVal);
}
- if (mIsAirplaneSensitive && isAirplaneModeOn()) {
+ if (mIsAirplaneSensitive && isAirplaneModeOn() && !mIsAirplaneToggleable) {
disable(false);
}
@@ -1597,10 +1598,17 @@
};
private void registerForAirplaneMode(IntentFilter filter) {
- String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
+ final ContentResolver resolver = mContext.getContentResolver();
+ final String airplaneModeRadios = Settings.System.getString(resolver,
Settings.System.AIRPLANE_MODE_RADIOS);
- mIsAirplaneSensitive = airplaneModeRadios == null
- ? true : airplaneModeRadios.contains(Settings.System.RADIO_BLUETOOTH);
+ final String toggleableRadios = Settings.System.getString(resolver,
+ Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+
+ mIsAirplaneSensitive = airplaneModeRadios == null ? true :
+ airplaneModeRadios.contains(Settings.System.RADIO_BLUETOOTH);
+ mIsAirplaneToggleable = toggleableRadios == null ? false :
+ toggleableRadios.contains(Settings.System.RADIO_BLUETOOTH);
+
if (mIsAirplaneSensitive) {
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
}
@@ -1661,6 +1669,7 @@
}
pw.println("mIsAirplaneSensitive = " + mIsAirplaneSensitive);
+ pw.println("mIsAirplaneToggleable = " + mIsAirplaneToggleable);
pw.println("Local address = " + getAddress());
pw.println("Local name = " + getName());
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 45719e4..fe3b149 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -434,9 +434,9 @@
}
int myWidth = mSurfaceHolder.getRequestedWidth();
- if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.FILL_PARENT;
+ if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.MATCH_PARENT;
int myHeight = mSurfaceHolder.getRequestedHeight();
- if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.FILL_PARENT;
+ if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT;
final boolean creating = !mCreated;
final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat();
diff --git a/core/java/android/speech/tts/ITts.aidl b/core/java/android/speech/tts/ITts.aidl
index 1812188..2ed660a 100755
--- a/core/java/android/speech/tts/ITts.aidl
+++ b/core/java/android/speech/tts/ITts.aidl
@@ -59,5 +59,7 @@
int unregisterCallback(in String callingApp, ITtsCallback cb);
- int playSilence(in String callingApp, in long duration, in int queueMode, in String[] params);
+ int playSilence(in String callingApp, in long duration, in int queueMode, in String[] params);
+
+ int setEngineByPackageName(in String enginePackageName);
}
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 3f369dd..bbbeb3f 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -129,8 +129,8 @@
* {@link TextToSpeech#synthesizeToFile(String, HashMap, String)} with the
* {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID} key.
* @param utteranceId the identifier of the utterance.
- */
- public void onUtteranceCompleted(String utteranceId);
+ */
+ public void onUtteranceCompleted(String utteranceId);
}
@@ -286,6 +286,10 @@
*/
public static final String KEY_PARAM_VARIANT = "variant";
/**
+ * {@hide}
+ */
+ public static final String KEY_PARAM_ENGINE = "engine";
+ /**
* Parameter key to specify the audio stream type to be used when speaking text
* or playing back a file.
* @see TextToSpeech#speak(String, int, HashMap)
@@ -327,10 +331,16 @@
* {@hide}
*/
protected static final int PARAM_POSITION_UTTERANCE_ID = 10;
+
/**
* {@hide}
*/
- protected static final int NB_CACHED_PARAMS = 6;
+ protected static final int PARAM_POSITION_ENGINE = 12;
+
+ /**
+ * {@hide}
+ */
+ protected static final int NB_CACHED_PARAMS = 7;
}
/**
@@ -373,6 +383,7 @@
mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT;
mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM;
mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID;
+ mCachedParams[Engine.PARAM_POSITION_ENGINE] = Engine.KEY_PARAM_ENGINE;
mCachedParams[Engine.PARAM_POSITION_RATE + 1] =
String.valueOf(Engine.DEFAULT_RATE);
@@ -381,10 +392,10 @@
mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language();
mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country();
mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant();
-
mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
String.valueOf(Engine.DEFAULT_STREAM);
mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
+ mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = Engine.DEFAULT_SYNTH;
initTts();
}
@@ -684,6 +695,10 @@
if (extra != null) {
mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
}
+ extra = params.get(Engine.KEY_PARAM_ENGINE);
+ if (extra != null) {
+ mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra;
+ }
}
result = mITts.speak(mPackageName, text, queueMode, mCachedParams);
} catch (RemoteException e) {
@@ -819,7 +834,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -894,7 +909,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -943,7 +958,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -990,7 +1005,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -1046,7 +1061,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -1064,7 +1079,7 @@
return null;
}
try {
- String[] locStrings = mITts.getLanguage();
+ String[] locStrings = mITts.getLanguage();
if ((locStrings != null) && (locStrings.length == 3)) {
return new Locale(locStrings[0], locStrings[1], locStrings[2]);
} else {
@@ -1131,7 +1146,7 @@
mStarted = false;
initTts();
} finally {
- return result;
+ return result;
}
}
}
@@ -1166,6 +1181,10 @@
if (extra != null) {
mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
}
+ extra = params.get(Engine.KEY_PARAM_ENGINE);
+ if (extra != null) {
+ mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra;
+ }
}
if (mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename)){
result = SUCCESS;
@@ -1214,19 +1233,19 @@
*
* @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
*/
- public int setOnUtteranceCompletedListener(
- final OnUtteranceCompletedListener listener) {
+ public int setOnUtteranceCompletedListener(
+ final OnUtteranceCompletedListener listener) {
synchronized (mStartLock) {
int result = ERROR;
if (!mStarted) {
return result;
}
mITtscallback = new ITtsCallback.Stub() {
- public void utteranceCompleted(String utteranceId) throws RemoteException {
- if (listener != null) {
- listener.onUtteranceCompleted(utteranceId);
- }
- }
+ public void utteranceCompleted(String utteranceId) throws RemoteException {
+ if (listener != null) {
+ listener.onUtteranceCompleted(utteranceId);
+ }
+ }
};
try {
result = mITts.registerCallback(mPackageName, mITtscallback);
@@ -1251,7 +1270,50 @@
} finally {
return result;
}
- }
+ }
+ }
+
+ /**
+ * Sets the speech synthesis engine to be used by its packagename.
+ *
+ * @param enginePackageName
+ * The packagename for the synthesis engine (ie, "com.svox.pico")
+ *
+ * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
+ */
+ public int setEngineByPackageName(String enginePackageName) {
+ synchronized (mStartLock) {
+ int result = TextToSpeech.ERROR;
+ if (!mStarted) {
+ return result;
+ }
+ try {
+ result = mITts.setEngineByPackageName(enginePackageName);
+ if (result == TextToSpeech.SUCCESS){
+ mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = enginePackageName;
+ }
+ } catch (RemoteException e) {
+ // TTS died; restart it.
+ Log.e("TextToSpeech.java - setEngineByPackageName", "RemoteException");
+ e.printStackTrace();
+ mStarted = false;
+ initTts();
+ } catch (NullPointerException e) {
+ // TTS died; restart it.
+ Log.e("TextToSpeech.java - setEngineByPackageName", "NullPointerException");
+ e.printStackTrace();
+ mStarted = false;
+ initTts();
+ } catch (IllegalStateException e) {
+ // TTS died; restart it.
+ Log.e("TextToSpeech.java - setEngineByPackageName", "IllegalStateException");
+ e.printStackTrace();
+ mStarted = false;
+ initTts();
+ } finally {
+ return result;
+ }
+ }
}
}
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index 0d04b13..7b307f8 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -247,10 +247,11 @@
KeyEvent.META_SHIFT_ON) == 1) ||
(MetaKeyKeyListener.getMetaState(buffer,
MetaKeyKeyListener.META_SELECTING) != 0);
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+ int offset = getOffset(x, y, widget);
+
if (cap) {
- int x = (int) event.getX();
- int y = (int) event.getY();
- int offset = getOffset(x, y, widget);
buffer.setSpan(LAST_TAP_DOWN, offset, offset,
Spannable.SPAN_POINT_POINT);
@@ -260,6 +261,30 @@
// without this, users would get booted out of select
// mode once the view detected it needed to scroll.
widget.getParent().requestDisallowInterceptTouchEvent(true);
+ } else {
+ OnePointFiveTapState[] tap = buffer.getSpans(0, buffer.length(),
+ OnePointFiveTapState.class);
+
+ if (tap.length > 0) {
+ if (event.getEventTime() - tap[0].mWhen <=
+ ViewConfiguration.getDoubleTapTimeout() &&
+ sameWord(buffer, offset, Selection.getSelectionEnd(buffer))) {
+
+ tap[0].active = true;
+ MetaKeyKeyListener.startSelecting(widget, buffer);
+ widget.getParent().requestDisallowInterceptTouchEvent(true);
+ buffer.setSpan(LAST_TAP_DOWN, offset, offset,
+ Spannable.SPAN_POINT_POINT);
+ }
+
+ tap[0].mWhen = event.getEventTime();
+ } else {
+ OnePointFiveTapState newtap = new OnePointFiveTapState();
+ newtap.mWhen = event.getEventTime();
+ newtap.active = false;
+ buffer.setSpan(newtap, 0, buffer.length(),
+ Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ }
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE ) {
boolean cap = (MetaKeyKeyListener.getMetaState(buffer,
@@ -287,7 +312,7 @@
// user started the selection)
int lastDownOffset = buffer.getSpanStart(LAST_TAP_DOWN);
- // Compute the selection boundries
+ // Compute the selection boundaries
int spanstart;
int spanend;
if (offset >= lastDownOffset) {
@@ -324,6 +349,19 @@
// XXX should do the same adjust for x as we do for the line.
+ OnePointFiveTapState[] onepointfivetap = buffer.getSpans(0, buffer.length(),
+ OnePointFiveTapState.class);
+ if (onepointfivetap.length > 0 && onepointfivetap[0].active &&
+ Selection.getSelectionStart(buffer) == Selection.getSelectionEnd(buffer)) {
+ // If we've set select mode, because there was a onepointfivetap,
+ // but there was no ensuing swipe gesture, undo the select mode
+ // and remove reference to the last onepointfivetap.
+ MetaKeyKeyListener.stopSelecting(widget, buffer);
+ for (int i=0; i < onepointfivetap.length; i++) {
+ buffer.removeSpan(onepointfivetap[i]);
+ }
+ buffer.removeSpan(LAST_TAP_DOWN);
+ }
boolean cap = (MetaKeyKeyListener.getMetaState(buffer,
KeyEvent.META_SHIFT_ON) == 1) ||
(MetaKeyKeyListener.getMetaState(buffer,
@@ -335,10 +373,10 @@
if (tap.length > 0) {
if (event.getEventTime() - tap[0].mWhen <=
- ViewConfiguration.getDoubleTapTimeout()) {
- if (sameWord(buffer, off, Selection.getSelectionEnd(buffer))) {
- doubletap = true;
- }
+ ViewConfiguration.getDoubleTapTimeout() &&
+ sameWord(buffer, off, Selection.getSelectionEnd(buffer))) {
+
+ doubletap = true;
}
tap[0].mWhen = event.getEventTime();
@@ -351,6 +389,11 @@
if (cap) {
buffer.removeSpan(LAST_TAP_DOWN);
+ if (onepointfivetap.length > 0 && onepointfivetap[0].active) {
+ // If we selecting something with the onepointfivetap-and
+ // swipe gesture, stop it on finger up.
+ MetaKeyKeyListener.stopSelecting(widget, buffer);
+ }
} else if (doubletap) {
Selection.setSelection(buffer,
findWordStart(buffer, off),
@@ -373,6 +416,19 @@
long mWhen;
}
+ /* We check for a onepointfive tap. This is similar to
+ * doubletap gesture (where a finger goes down, up, down, up, in a short
+ * time period), except in the onepointfive tap, a users finger only needs
+ * to go down, up, down in a short time period. We detect this type of tap
+ * to implement the onepointfivetap-and-swipe selection gesture.
+ * This gesture allows users to select a segment of text without going
+ * through the "select text" option in the context menu.
+ */
+ private static class OnePointFiveTapState implements NoCopySpan {
+ long mWhen;
+ boolean active;
+ }
+
private static boolean sameWord(CharSequence text, int one, int two) {
int start = findWordStart(text, one);
int end = findWordEnd(text, one);
diff --git a/core/java/android/util/EventLog.java b/core/java/android/util/EventLog.java
index 81dd96e..b596d32 100644
--- a/core/java/android/util/EventLog.java
+++ b/core/java/android/util/EventLog.java
@@ -16,134 +16,41 @@
package android.util;
-import com.google.android.collect.Lists;
-
+import java.io.BufferedReader;
+import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
+import java.util.HashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
- * {@hide}
- * Dynamically defined (in terms of event types), space efficient (i.e. "tight") event logging
- * to help instrument code for large scale stability and performance monitoring.
+ * Access to the system diagnostic event record. System diagnostic events are
+ * used to record certain system-level events (such as garbage collection,
+ * activity manager state, system watchdogs, and other low level activity),
+ * which may be automatically collected and analyzed during system development.
*
- * Note that this class contains all static methods. This is done for efficiency reasons.
+ * <p>This is <b>not</b> the main "logcat" debugging log ({@link android.util.Log})!
+ * These diagnostic events are for system integrators, not application authors.
*
- * Events for the event log are self-describing binary data structures. They start with a 20 byte
- * header (generated automatically) which contains all of the following in order:
- *
- * <ul>
- * <li> Payload length: 2 bytes - length of the non-header portion </li>
- * <li> Padding: 2 bytes - no meaning at this time </li>
- * <li> Timestamp:
- * <ul>
- * <li> Seconds: 4 bytes - seconds since Epoch </li>
- * <li> Nanoseconds: 4 bytes - plus extra nanoseconds </li>
- * </ul></li>
- * <li> Process ID: 4 bytes - matching {@link android.os.Process#myPid} </li>
- * <li> Thread ID: 4 bytes - matching {@link android.os.Process#myTid} </li>
- * </li>
- * </ul>
- *
- * The above is followed by a payload, comprised of the following:
- * <ul>
- * <li> Tag: 4 bytes - unique integer used to identify a particular event. This number is also
- * used as a key to map to a string that can be displayed by log reading tools.
- * </li>
- * <li> Type: 1 byte - can be either {@link #INT}, {@link #LONG}, {@link #STRING},
- * or {@link #LIST}. </li>
- * <li> Event log value: the size and format of which is one of:
- * <ul>
- * <li> INT: 4 bytes </li>
- * <li> LONG: 8 bytes </li>
- * <li> STRING:
- * <ul>
- * <li> Size of STRING: 4 bytes </li>
- * <li> The string: n bytes as specified in the size fields above. </li>
- * </ul></li>
- * <li> {@link List LIST}:
- * <ul>
- * <li> Num items: 1 byte </li>
- * <li> N value payloads, where N is the number of items specified above. </li>
- * </ul></li>
- * </ul>
- * </li>
- * <li> '\n': 1 byte - an automatically generated newline, used to help detect and recover from log
- * corruption and enable standard unix tools like grep, tail and wc to operate
- * on event logs. </li>
- * </ul>
- *
- * Note that all output is done in the endian-ness of the device (as determined
- * by {@link ByteOrder#nativeOrder()}).
+ * <p>Events use integer tag codes corresponding to /system/etc/event-log-tags.
+ * They carry a payload of one or more int, long, or String values. The
+ * event-log-tags file defines the payload contents for each type code.
*/
-
public class EventLog {
+ private static final String TAG = "EventLog";
- // Value types
- public static final byte INT = 0;
- public static final byte LONG = 1;
- public static final byte STRING = 2;
- public static final byte LIST = 3;
+ private static final String TAGS_FILE = "/system/etc/event-log-tags";
+ private static final String COMMENT_PATTERN = "^\\s*(#.*)?$";
+ private static final String TAG_PATTERN = "^\\s*(\\d+)\\s+(\\w+)\\s*(\\(.*\\))?\\s*$";
+ private static HashMap<String, Integer> sTagCodes = null;
+ private static HashMap<Integer, String> sTagNames = null;
- /**
- * An immutable tuple used to log a heterogeneous set of loggable items.
- * The items can be Integer, Long, String, or {@link List}.
- * The maximum number of items is 127
- */
- public static final class List {
- private Object[] mItems;
-
- /**
- * Get a particular tuple item
- * @param pos The position of the item in the tuple
- */
- public final Object getItem(int pos) {
- return mItems[pos];
- }
-
- /**
- * Get the number of items in the tuple.
- */
- public final byte getNumItems() {
- return (byte) mItems.length;
- }
-
- /**
- * Create a new tuple.
- * @param items The items to create the tuple with, as varargs.
- * @throws IllegalArgumentException if the arguments are too few (0),
- * too many, or aren't loggable types.
- */
- public List(Object... items) throws IllegalArgumentException {
- if (items.length > Byte.MAX_VALUE) {
- throw new IllegalArgumentException(
- "A List must have fewer than "
- + Byte.MAX_VALUE + " items in it.");
- }
- for (int i = 0; i < items.length; i++) {
- final Object item = items[i];
- if (item == null) {
- // Would be nice to be able to write null strings...
- items[i] = "";
- } else if (!(item instanceof List ||
- item instanceof String ||
- item instanceof Integer ||
- item instanceof Long)) {
- throw new IllegalArgumentException(
- "Attempt to create a List with illegal item type.");
- }
- }
- this.mItems = items;
- }
- }
-
- /**
- * A previously logged event read from the logs.
- */
+ /** A previously logged event read from the logs. */
public static final class Event {
private final ByteBuffer mBuffer;
@@ -158,77 +65,84 @@
private static final int TAG_OFFSET = 20;
private static final int DATA_START = 24;
+ // Value types
+ private static final byte INT_TYPE = 0;
+ private static final byte LONG_TYPE = 1;
+ private static final byte STRING_TYPE = 2;
+ private static final byte LIST_TYPE = 3;
+
/** @param data containing event, read from the system */
- public Event(byte[] data) {
+ /*package*/ Event(byte[] data) {
mBuffer = ByteBuffer.wrap(data);
mBuffer.order(ByteOrder.nativeOrder());
}
+ /** @return the process ID which wrote the log entry */
public int getProcessId() {
return mBuffer.getInt(PROCESS_OFFSET);
}
+ /** @return the thread ID which wrote the log entry */
public int getThreadId() {
return mBuffer.getInt(THREAD_OFFSET);
}
+ /** @return the wall clock time when the entry was written */
public long getTimeNanos() {
return mBuffer.getInt(SECONDS_OFFSET) * 1000000000l
+ mBuffer.getInt(NANOSECONDS_OFFSET);
}
+ /** @return the type tag code of the entry */
public int getTag() {
return mBuffer.getInt(TAG_OFFSET);
}
- /** @return one of Integer, Long, String, or List. */
+ /** @return one of Integer, Long, String, null, or Object[] of same. */
public synchronized Object getData() {
- mBuffer.limit(PAYLOAD_START + mBuffer.getShort(LENGTH_OFFSET));
- mBuffer.position(DATA_START); // Just after the tag.
- return decodeObject();
- }
-
- public byte[] getRawData() {
- return mBuffer.array();
+ try {
+ mBuffer.limit(PAYLOAD_START + mBuffer.getShort(LENGTH_OFFSET));
+ mBuffer.position(DATA_START); // Just after the tag.
+ return decodeObject();
+ } catch (IllegalArgumentException e) {
+ Log.wtf(TAG, "Illegal entry payload: tag=" + getTag(), e);
+ return null;
+ } catch (BufferUnderflowException e) {
+ Log.wtf(TAG, "Truncated entry payload: tag=" + getTag(), e);
+ return null;
+ }
}
/** @return the loggable item at the current position in mBuffer. */
private Object decodeObject() {
- if (mBuffer.remaining() < 1) return null;
- switch (mBuffer.get()) {
- case INT:
- if (mBuffer.remaining() < 4) return null;
+ byte type = mBuffer.get();
+ switch (type) {
+ case INT_TYPE:
return (Integer) mBuffer.getInt();
- case LONG:
- if (mBuffer.remaining() < 8) return null;
+ case LONG_TYPE:
return (Long) mBuffer.getLong();
- case STRING:
+ case STRING_TYPE:
try {
- if (mBuffer.remaining() < 4) return null;
int length = mBuffer.getInt();
- if (length < 0 || mBuffer.remaining() < length) return null;
int start = mBuffer.position();
mBuffer.position(start + length);
return new String(mBuffer.array(), start, length, "UTF-8");
} catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e); // UTF-8 is guaranteed.
+ Log.wtf(TAG, "UTF-8 is not supported", e);
+ return null;
}
- case LIST:
- if (mBuffer.remaining() < 1) return null;
+ case LIST_TYPE:
int length = mBuffer.get();
- if (length < 0) return null;
+ if (length < 0) length += 256; // treat as signed byte
Object[] array = new Object[length];
- for (int i = 0; i < length; ++i) {
- array[i] = decodeObject();
- if (array[i] == null) return null;
- }
- return new List(array);
+ for (int i = 0; i < length; ++i) array[i] = decodeObject();
+ return array;
default:
- return null;
+ throw new IllegalArgumentException("Unknown entry type: " + type);
}
}
}
@@ -236,46 +150,36 @@
// We assume that the native methods deal with any concurrency issues.
/**
- * Send an event log message.
- * @param tag An event identifer
+ * Record an event log message.
+ * @param tag The event type tag code
* @param value A value to log
* @return The number of bytes written
*/
public static native int writeEvent(int tag, int value);
/**
- * Send an event log message.
- * @param tag An event identifer
+ * Record an event log message.
+ * @param tag The event type tag code
* @param value A value to log
* @return The number of bytes written
*/
public static native int writeEvent(int tag, long value);
/**
- * Send an event log message.
- * @param tag An event identifer
+ * Record an event log message.
+ * @param tag The event type tag code
* @param str A value to log
* @return The number of bytes written
*/
public static native int writeEvent(int tag, String str);
/**
- * Send an event log message.
- * @param tag An event identifer
- * @param list A {@link List} to log
- * @return The number of bytes written
- */
- public static native int writeEvent(int tag, List list);
-
- /**
- * Send an event log message.
- * @param tag An event identifer
+ * Record an event log message.
+ * @param tag The event type tag code
* @param list A list of values to log
* @return The number of bytes written
*/
- public static int writeEvent(int tag, Object... list) {
- return writeEvent(tag, new List(list));
- }
+ public static native int writeEvent(int tag, Object... list);
/**
* Read events from the log, filtered by type.
@@ -287,11 +191,65 @@
throws IOException;
/**
- * Read events from a file.
- * @param path to read from
- * @param output container to add events into
- * @throws IOException if something goes wrong reading events
+ * Get the name associated with an event type tag code.
+ * @param tag code to look up
+ * @return the name of the tag, or null if no tag has that number
*/
- public static native void readEvents(String path, Collection<Event> output)
- throws IOException;
+ public static String getTagName(int tag) {
+ readTagsFile();
+ return sTagNames.get(tag);
+ }
+
+ /**
+ * Get the event type tag code associated with an event name.
+ * @param name of event to look up
+ * @return the tag code, or -1 if no tag has that name
+ */
+ public static int getTagCode(String name) {
+ readTagsFile();
+ Integer code = sTagCodes.get(name);
+ return code != null ? code : -1;
+ }
+
+ /**
+ * Read TAGS_FILE, populating sTagCodes and sTagNames, if not already done.
+ */
+ private static synchronized void readTagsFile() {
+ if (sTagCodes != null && sTagNames != null) return;
+
+ sTagCodes = new HashMap<String, Integer>();
+ sTagNames = new HashMap<Integer, String>();
+
+ Pattern comment = Pattern.compile(COMMENT_PATTERN);
+ Pattern tag = Pattern.compile(TAG_PATTERN);
+ BufferedReader reader = null;
+ String line;
+
+ try {
+ reader = new BufferedReader(new FileReader(TAGS_FILE), 256);
+ while ((line = reader.readLine()) != null) {
+ if (comment.matcher(line).matches()) continue;
+
+ Matcher m = tag.matcher(line);
+ if (!m.matches()) {
+ Log.wtf(TAG, "Bad entry in " + TAGS_FILE + ": " + line);
+ continue;
+ }
+
+ try {
+ int num = Integer.parseInt(m.group(1));
+ String name = m.group(2);
+ sTagCodes.put(name, num);
+ sTagNames.put(num, name);
+ } catch (NumberFormatException e) {
+ Log.wtf(TAG, "Error in " + TAGS_FILE + ": " + line, e);
+ }
+ }
+ } catch (IOException e) {
+ Log.wtf(TAG, "Error reading " + TAGS_FILE, e);
+ // Leave the maps existing but unpopulated
+ } finally {
+ try { if (reader != null) reader.close(); } catch (IOException e) {}
+ }
+ }
}
diff --git a/core/java/android/util/EventLogTags.java b/core/java/android/util/EventLogTags.java
index be905e3..5cf5332 100644
--- a/core/java/android/util/EventLogTags.java
+++ b/core/java/android/util/EventLogTags.java
@@ -25,16 +25,14 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-/** Parsed representation of /etc/event-log-tags. */
+/**
+ * @deprecated This class is no longer functional.
+ * Use {@link android.util.EventLog} instead.
+ */
public class EventLogTags {
- private final static String TAG = "EventLogTags";
-
- private final static String TAGS_FILE = "/etc/event-log-tags";
-
public static class Description {
public final int mTag;
public final String mName;
- // TODO: Parse parameter descriptions when anyone has a use for them.
Description(int tag, String name) {
mTag = tag;
@@ -42,49 +40,11 @@
}
}
- private final static Pattern COMMENT_PATTERN = Pattern.compile(
- "^\\s*(#.*)?$");
+ public EventLogTags() throws IOException {}
- private final static Pattern TAG_PATTERN = Pattern.compile(
- "^\\s*(\\d+)\\s+(\\w+)\\s*(\\(.*\\))?\\s*$");
+ public EventLogTags(BufferedReader input) throws IOException {}
- private final HashMap<String, Description> mNameMap =
- new HashMap<String, Description>();
+ public Description get(String name) { return null; }
- private final HashMap<Integer, Description> mTagMap =
- new HashMap<Integer, Description>();
-
- public EventLogTags() throws IOException {
- this(new BufferedReader(new FileReader(TAGS_FILE), 256));
- }
-
- public EventLogTags(BufferedReader input) throws IOException {
- String line;
- while ((line = input.readLine()) != null) {
- Matcher m = COMMENT_PATTERN.matcher(line);
- if (m.matches()) continue;
-
- m = TAG_PATTERN.matcher(line);
- if (m.matches()) {
- try {
- int tag = Integer.parseInt(m.group(1));
- Description d = new Description(tag, m.group(2));
- mNameMap.put(d.mName, d);
- mTagMap.put(d.mTag, d);
- } catch (NumberFormatException e) {
- Log.e(TAG, "Error in event log tags entry: " + line, e);
- }
- } else {
- Log.e(TAG, "Can't parse event log tags entry: " + line);
- }
- }
- }
-
- public Description get(String name) {
- return mNameMap.get(name);
- }
-
- public Description get(int tag) {
- return mTagMap.get(tag);
- }
+ public Description get(int tag) { return null; }
}
diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java
index e95d0be..75b1b90 100644
--- a/core/java/android/util/Log.java
+++ b/core/java/android/util/Log.java
@@ -81,6 +81,13 @@
*/
public static final int ASSERT = 7;
+ /**
+ * Exception class used to capture a stack trace in {@link #wtf()}.
+ */
+ private static class TerribleFailure extends Exception {
+ TerribleFailure(String msg, Throwable cause) { super(msg, cause); }
+ }
+
private Log() {
}
@@ -170,24 +177,24 @@
/**
* Checks to see whether or not a log for the specified tag is loggable at the specified level.
- *
+ *
* The default level of any tag is set to INFO. This means that any level above and including
* INFO will be logged. Before you make any calls to a logging method you should check to see
* if your tag should be logged. You can change the default level by setting a system property:
* 'setprop log.tag.<YOUR_LOG_TAG> <LEVEL>'
- * Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPRESS will
+ * Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPPRESS will
* turn off all logging for your tag. You can also create a local.prop file that with the
* following in it:
* 'log.tag.<YOUR_LOG_TAG>=<LEVEL>'
* and place that in /data/local.prop.
- *
+ *
* @param tag The tag to check.
* @param level The level to check.
* @return Whether or not that this is allowed to be logged.
* @throws IllegalArgumentException is thrown if the tag.length() > 23.
*/
public static native boolean isLoggable(String tag, int level);
-
+
/*
* Send a {@link #WARN} log message and log the exception.
* @param tag Used to identify the source of a log message. It usually identifies
@@ -220,6 +227,43 @@
}
/**
+ * What a Terrible Failure: Report a condition that should never happen.
+ * The error will always be logged at level ASSERT with the call stack.
+ * Depending on system configuration, a report may be added to the
+ * {@link android.os.DropBoxManager} and/or the process may be terminated
+ * immediately with an error dialog.
+ * @param tag Used to identify the source of a log message.
+ * @param msg The message you would like logged.
+ */
+ public static int wtf(String tag, String msg) {
+ return wtf(tag, msg, null);
+ }
+
+ /**
+ * What a Terrible Failure: Report an exception that should never happen.
+ * Similar to {@link #wtf(String, String)}, with an exception to log.
+ * @param tag Used to identify the source of a log message.
+ * @param tr An exception to log.
+ */
+ public static int wtf(String tag, Throwable tr) {
+ return wtf(tag, tr.getMessage(), tr);
+ }
+
+ /**
+ * What a Terrible Failure: Report an exception that should never happen.
+ * Similar to {@link #wtf(String, Throwable)}, with a message as well.
+ * @param tag Used to identify the source of a log message.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log. May be null.
+ */
+ public static int wtf(String tag, String msg, Throwable tr) {
+ tr = new TerribleFailure(msg, tr);
+ int bytes = println(ASSERT, tag, getStackTraceString(tr));
+ RuntimeInit.wtf(tag, tr);
+ return bytes;
+ }
+
+ /**
* Handy function to get a loggable stack trace from a Throwable
* @param tr An exception to log
*/
diff --git a/core/java/android/view/TransformGestureDetector.java b/core/java/android/view/TransformGestureDetector.java
new file mode 100644
index 0000000..196716a
--- /dev/null
+++ b/core/java/android/view/TransformGestureDetector.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2010 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 android.view;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.GestureDetector.SimpleOnGestureListener;
+
+/**
+ * Detects transformation gestures involving more than one pointer ("multitouch")
+ * using the supplied {@link MotionEvent}s. The {@link OnGestureListener} callback
+ * will notify users when a particular gesture event has occurred. This class
+ * should only be used with {@link MotionEvent}s reported via touch.
+ *
+ * To use this class:
+ * <ul>
+ * <li>Create an instance of the {@code TransformGestureDetector} for your
+ * {@link View}
+ * <li>In the {@link View#onTouchEvent(MotionEvent)} method ensure you call
+ * {@link #onTouchEvent(MotionEvent)}. The methods defined in your
+ * callback will be executed when the events occur.
+ * </ul>
+ * @hide Pending API approval
+ */
+public class TransformGestureDetector {
+ /**
+ * The listener for receiving notifications when gestures occur.
+ * If you want to listen for all the different gestures then implement
+ * this interface. If you only want to listen for a subset it might
+ * be easier to extend {@link SimpleOnGestureListener}.
+ *
+ * An application will receive events in the following order:
+ * One onTransformBegin()
+ * Zero or more onTransform()
+ * One onTransformEnd() or onTransformFling()
+ */
+ public interface OnTransformGestureListener {
+ /**
+ * Responds to transformation events for a gesture in progress.
+ * Reported by pointer motion.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return true if the event was handled, false otherwise.
+ */
+ public boolean onTransform(TransformGestureDetector detector);
+
+ /**
+ * Responds to the beginning of a transformation gesture. Reported by
+ * new pointers going down.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return true if the event was handled, false otherwise.
+ */
+ public boolean onTransformBegin(TransformGestureDetector detector);
+
+ /**
+ * Responds to the end of a transformation gesture. Reported by existing
+ * pointers going up. If the end of a gesture would result in a fling,
+ * onTransformFling is called instead.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return true if the event was handled, false otherwise.
+ */
+ public boolean onTransformEnd(TransformGestureDetector detector);
+
+ /**
+ * Responds to the end of a transformation gesture that begins a fling.
+ * Reported by existing pointers going up. If the end of a gesture
+ * would not result in a fling, onTransformEnd is called instead.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return true if the event was handled, false otherwise.
+ */
+ public boolean onTransformFling(TransformGestureDetector detector);
+ }
+
+ private static final boolean DEBUG = false;
+
+ private static final int INITIAL_EVENT_IGNORES = 2;
+
+ private Context mContext;
+ private float mTouchSizeScale;
+ private OnTransformGestureListener mListener;
+ private int mVelocityTimeUnits;
+ private MotionEvent mInitialEvent;
+
+ private MotionEvent mPrevEvent;
+ private MotionEvent mCurrEvent;
+ private VelocityTracker mVelocityTracker;
+
+ private float mCenterX;
+ private float mCenterY;
+ private float mTransX;
+ private float mTransY;
+ private float mPrevFingerDiffX;
+ private float mPrevFingerDiffY;
+ private float mCurrFingerDiffX;
+ private float mCurrFingerDiffY;
+ private float mRotateDegrees;
+ private float mCurrLen;
+ private float mPrevLen;
+ private float mScaleFactor;
+
+ // Units in pixels. Current value is pulled out of thin air for debugging only.
+ private float mPointerJumpLimit = 30;
+
+ private int mEventIgnoreCount;
+
+ public TransformGestureDetector(Context context, OnTransformGestureListener listener,
+ int velocityTimeUnits) {
+ mContext = context;
+ mListener = listener;
+ mTouchSizeScale = context.getResources().getDisplayMetrics().widthPixels/3;
+ mVelocityTimeUnits = velocityTimeUnits;
+ mEventIgnoreCount = INITIAL_EVENT_IGNORES;
+ }
+
+ public TransformGestureDetector(Context context, OnTransformGestureListener listener) {
+ this(context, listener, 1000);
+ }
+
+ public boolean onTouchEvent(MotionEvent event) {
+ final int action = event.getAction();
+ boolean handled = true;
+
+ if (mInitialEvent == null) {
+ // No transform gesture in progress
+ if ((action == MotionEvent.ACTION_POINTER_1_DOWN ||
+ action == MotionEvent.ACTION_POINTER_2_DOWN) &&
+ event.getPointerCount() >= 2) {
+ // We have a new multi-finger gesture
+ mInitialEvent = MotionEvent.obtain(event);
+ mPrevEvent = MotionEvent.obtain(event);
+ mVelocityTracker = VelocityTracker.obtain();
+ handled = mListener.onTransformBegin(this);
+ }
+ } else {
+ // Transform gesture in progress - attempt to handle it
+ switch (action) {
+ case MotionEvent.ACTION_POINTER_1_UP:
+ case MotionEvent.ACTION_POINTER_2_UP:
+ // Gesture ended
+ handled = mListener.onTransformEnd(this);
+
+ reset();
+ break;
+
+ case MotionEvent.ACTION_CANCEL:
+ handled = mListener.onTransformEnd(this);
+
+ reset();
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ setContext(event);
+
+ // Our first few events can be crazy from some touchscreens - drop them.
+ if (mEventIgnoreCount == 0) {
+ mVelocityTracker.addMovement(event);
+ handled = mListener.onTransform(this);
+ } else {
+ mEventIgnoreCount--;
+ }
+
+ mPrevEvent.recycle();
+ mPrevEvent = MotionEvent.obtain(event);
+ break;
+ }
+ }
+ return handled;
+ }
+
+ private void setContext(MotionEvent curr) {
+ mCurrEvent = MotionEvent.obtain(curr);
+
+ mRotateDegrees = -1;
+ mCurrLen = -1;
+ mPrevLen = -1;
+ mScaleFactor = -1;
+
+ final MotionEvent prev = mPrevEvent;
+
+ float px0 = prev.getX(0);
+ float py0 = prev.getY(0);
+ float px1 = prev.getX(1);
+ float py1 = prev.getY(1);
+ float cx0 = curr.getX(0);
+ float cy0 = curr.getY(0);
+ float cx1 = curr.getX(1);
+ float cy1 = curr.getY(1);
+
+ // Some touchscreens do weird things with pointer values where points are
+ // too close along one axis. Try to detect this here and smooth things out.
+ // The main indicator is that we get the X or Y value from the other pointer.
+ final float dx0 = cx0 - px0;
+ final float dy0 = cy0 - py0;
+ final float dx1 = cx1 - px1;
+ final float dy1 = cy1 - py1;
+
+ if (cx0 == cx1) {
+ if (Math.abs(dx0) > mPointerJumpLimit) {
+ cx0 = px0;
+ } else if (Math.abs(dx1) > mPointerJumpLimit) {
+ cx1 = px1;
+ }
+ } else if (cy0 == cy1) {
+ if (Math.abs(dy0) > mPointerJumpLimit) {
+ cy0 = py0;
+ } else if (Math.abs(dy1) > mPointerJumpLimit) {
+ cy1 = py1;
+ }
+ }
+
+ final float pvx = px1 - px0;
+ final float pvy = py1 - py0;
+ final float cvx = cx1 - cx0;
+ final float cvy = cy1 - cy0;
+ mPrevFingerDiffX = pvx;
+ mPrevFingerDiffY = pvy;
+ mCurrFingerDiffX = cvx;
+ mCurrFingerDiffY = cvy;
+
+ final float pmidx = px0 + pvx * 0.5f;
+ final float pmidy = py0 + pvy * 0.5f;
+ final float cmidx = cx0 + cvx * 0.5f;
+ final float cmidy = cy0 + cvy * 0.5f;
+
+ mCenterX = cmidx;
+ mCenterY = cmidy;
+ mTransX = cmidx - pmidx;
+ mTransY = cmidy - pmidy;
+ }
+
+ private void reset() {
+ if (mInitialEvent != null) {
+ mInitialEvent.recycle();
+ mInitialEvent = null;
+ }
+ if (mPrevEvent != null) {
+ mPrevEvent.recycle();
+ mPrevEvent = null;
+ }
+ if (mCurrEvent != null) {
+ mCurrEvent.recycle();
+ mCurrEvent = null;
+ }
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ mEventIgnoreCount = INITIAL_EVENT_IGNORES;
+ }
+
+ public float getCenterX() {
+ return mCenterX;
+ }
+
+ public float getCenterY() {
+ return mCenterY;
+ }
+
+ public float getTranslateX() {
+ return mTransX;
+ }
+
+ public float getTranslateY() {
+ return mTransY;
+ }
+
+ public float getCurrentSpan() {
+ if (mCurrLen == -1) {
+ final float cvx = mCurrFingerDiffX;
+ final float cvy = mCurrFingerDiffY;
+ mCurrLen = (float)Math.sqrt(cvx*cvx + cvy*cvy);
+ }
+ return mCurrLen;
+ }
+
+ public float getPreviousSpan() {
+ if (mPrevLen == -1) {
+ final float pvx = mPrevFingerDiffX;
+ final float pvy = mPrevFingerDiffY;
+ mPrevLen = (float)Math.sqrt(pvx*pvx + pvy*pvy);
+ }
+ return mPrevLen;
+ }
+
+ public float getScaleFactor() {
+ if (mScaleFactor == -1) {
+ mScaleFactor = getCurrentSpan() / getPreviousSpan();
+ }
+ return mScaleFactor;
+ }
+
+ public float getRotation() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index 5d89c46..9581080 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -55,12 +55,12 @@
}
}, 2));
- final float mPastX[] = new float[NUM_PAST];
- final float mPastY[] = new float[NUM_PAST];
- final long mPastTime[] = new long[NUM_PAST];
+ final float mPastX[][] = new float[MotionEvent.BASE_AVAIL_POINTERS][NUM_PAST];
+ final float mPastY[][] = new float[MotionEvent.BASE_AVAIL_POINTERS][NUM_PAST];
+ final long mPastTime[][] = new long[MotionEvent.BASE_AVAIL_POINTERS][NUM_PAST];
- float mYVelocity;
- float mXVelocity;
+ float mYVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS];
+ float mXVelocity[] = new float[MotionEvent.BASE_AVAIL_POINTERS];
private VelocityTracker mNext;
@@ -105,7 +105,9 @@
* Reset the velocity tracker back to its initial state.
*/
public void clear() {
- mPastTime[0] = 0;
+ for (int i = 0; i < MotionEvent.BASE_AVAIL_POINTERS; i++) {
+ mPastTime[i][0] = 0;
+ }
}
/**
@@ -120,18 +122,21 @@
public void addMovement(MotionEvent ev) {
long time = ev.getEventTime();
final int N = ev.getHistorySize();
- for (int i=0; i<N; i++) {
- addPoint(ev.getHistoricalX(i), ev.getHistoricalY(i),
- ev.getHistoricalEventTime(i));
+ final int pointerCount = ev.getPointerCount();
+ for (int p = 0; p < pointerCount; p++) {
+ for (int i=0; i<N; i++) {
+ addPoint(p, ev.getHistoricalX(p, i), ev.getHistoricalY(p, i),
+ ev.getHistoricalEventTime(i));
+ }
+ addPoint(p, ev.getX(p), ev.getY(p), time);
}
- addPoint(ev.getX(), ev.getY(), time);
}
- private void addPoint(float x, float y, long time) {
+ private void addPoint(int pos, float x, float y, long time) {
int drop = -1;
int i;
if (localLOGV) Log.v(TAG, "Adding past y=" + y + " time=" + time);
- final long[] pastTime = mPastTime;
+ final long[] pastTime = mPastTime[pos];
for (i=0; i<NUM_PAST; i++) {
if (pastTime[i] == 0) {
break;
@@ -146,8 +151,8 @@
drop = 0;
}
if (drop == i) drop--;
- final float[] pastX = mPastX;
- final float[] pastY = mPastY;
+ final float[] pastX = mPastX[pos];
+ final float[] pastY = mPastY[pos];
if (drop >= 0) {
if (localLOGV) Log.v(TAG, "Dropping up to #" + drop);
final int start = drop+1;
@@ -190,44 +195,48 @@
* must be positive.
*/
public void computeCurrentVelocity(int units, float maxVelocity) {
- final float[] pastX = mPastX;
- final float[] pastY = mPastY;
- final long[] pastTime = mPastTime;
-
- // Kind-of stupid.
- final float oldestX = pastX[0];
- final float oldestY = pastY[0];
- final long oldestTime = pastTime[0];
- float accumX = 0;
- float accumY = 0;
- int N=0;
- while (N < NUM_PAST) {
- if (pastTime[N] == 0) {
- break;
+ for (int pos = 0; pos < MotionEvent.BASE_AVAIL_POINTERS; pos++) {
+ final float[] pastX = mPastX[pos];
+ final float[] pastY = mPastY[pos];
+ final long[] pastTime = mPastTime[pos];
+
+ // Kind-of stupid.
+ final float oldestX = pastX[0];
+ final float oldestY = pastY[0];
+ final long oldestTime = pastTime[0];
+ float accumX = 0;
+ float accumY = 0;
+ int N=0;
+ while (N < NUM_PAST) {
+ if (pastTime[N] == 0) {
+ break;
+ }
+ N++;
}
- N++;
+ // Skip the last received event, since it is probably pretty noisy.
+ if (N > 3) N--;
+
+ for (int i=1; i < N; i++) {
+ final int dur = (int)(pastTime[i] - oldestTime);
+ if (dur == 0) continue;
+ float dist = pastX[i] - oldestX;
+ float vel = (dist/dur) * units; // pixels/frame.
+ if (accumX == 0) accumX = vel;
+ else accumX = (accumX + vel) * .5f;
+
+ dist = pastY[i] - oldestY;
+ vel = (dist/dur) * units; // pixels/frame.
+ if (accumY == 0) accumY = vel;
+ else accumY = (accumY + vel) * .5f;
+ }
+ mXVelocity[pos] = accumX < 0.0f ? Math.max(accumX, -maxVelocity)
+ : Math.min(accumX, maxVelocity);
+ mYVelocity[pos] = accumY < 0.0f ? Math.max(accumY, -maxVelocity)
+ : Math.min(accumY, maxVelocity);
+
+ if (localLOGV) Log.v(TAG, "Y velocity=" + mYVelocity +" X velocity="
+ + mXVelocity + " N=" + N);
}
- // Skip the last received event, since it is probably pretty noisy.
- if (N > 3) N--;
-
- for (int i=1; i < N; i++) {
- final int dur = (int)(pastTime[i] - oldestTime);
- if (dur == 0) continue;
- float dist = pastX[i] - oldestX;
- float vel = (dist/dur) * units; // pixels/frame.
- if (accumX == 0) accumX = vel;
- else accumX = (accumX + vel) * .5f;
-
- dist = pastY[i] - oldestY;
- vel = (dist/dur) * units; // pixels/frame.
- if (accumY == 0) accumY = vel;
- else accumY = (accumY + vel) * .5f;
- }
- mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity) : Math.min(accumX, maxVelocity);
- mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity) : Math.min(accumY, maxVelocity);
-
- if (localLOGV) Log.v(TAG, "Y velocity=" + mYVelocity +" X velocity="
- + mXVelocity + " N=" + N);
}
/**
@@ -237,7 +246,7 @@
* @return The previously computed X velocity.
*/
public float getXVelocity() {
- return mXVelocity;
+ return mXVelocity[0];
}
/**
@@ -247,6 +256,32 @@
* @return The previously computed Y velocity.
*/
public float getYVelocity() {
- return mYVelocity;
+ return mYVelocity[0];
+ }
+
+ /**
+ * Retrieve the last computed X velocity. You must first call
+ * {@link #computeCurrentVelocity(int)} before calling this function.
+ *
+ * @param pos Which pointer's velocity to return.
+ * @return The previously computed X velocity.
+ *
+ * @hide Pending API approval
+ */
+ public float getXVelocity(int pos) {
+ return mXVelocity[pos];
+ }
+
+ /**
+ * Retrieve the last computed Y velocity. You must first call
+ * {@link #computeCurrentVelocity(int)} before calling this function.
+ *
+ * @param pos Which pointer's velocity to return.
+ * @return The previously computed Y velocity.
+ *
+ * @hide Pending API approval
+ */
+ public float getYVelocity(int pos) {
+ return mYVelocity[pos];
}
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 788f04a..df4cab0 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -379,7 +379,7 @@
* dimension, it can specify one of:
* <ul>
* <li> an exact number
- * <li>FILL_PARENT, which means the view wants to be as big as its parent
+ * <li>MATCH_PARENT, which means the view wants to be as big as its parent
* (minus padding)
* <li> WRAP_CONTENT, which means that the view wants to be just big enough to
* enclose its content (plus padding).
@@ -1494,6 +1494,16 @@
* @hide
*/
static final int OPAQUE_MASK = 0x01800000;
+
+ /**
+ * Indicates a prepressed state;
+ * the short time between ACTION_DOWN and recognizing
+ * a 'real' press. Prepressed is used to recognize quick taps
+ * even when they are shorter than ViewConfiguration.getTapTimeout().
+ *
+ * @hide
+ */
+ private static final int PREPRESSED = 0x02000000;
/**
* The parent this view is attached to.
@@ -1722,6 +1732,8 @@
private int mNextFocusDownId = View.NO_ID;
private CheckForLongPress mPendingCheckForLongPress;
+ private CheckForTap mPendingCheckForTap = null;
+
private UnsetPressedState mUnsetPressedState;
/**
@@ -1762,6 +1774,11 @@
* Special tree observer used when mAttachInfo is null.
*/
private ViewTreeObserver mFloatingTreeObserver;
+
+ /**
+ * Cache the touch slop from the context that created the view.
+ */
+ private int mTouchSlop;
// Used for debug only
static long sInstanceCount = 0;
@@ -1777,6 +1794,7 @@
mResources = context != null ? context.getResources() : null;
mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED;
++sInstanceCount;
+ mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
/**
@@ -2726,7 +2744,7 @@
setPressed(false);
if (!mHasPerformedLongPress) {
- cancelLongPress();
+ removeLongPressCallback();
}
}
}
@@ -3748,7 +3766,7 @@
if (imm != null && (mPrivateFlags & FOCUSED) != 0) {
imm.focusOut(this);
}
- cancelLongPress();
+ removeLongPressCallback();
onFocusLost();
} else if (imm != null && (mPrivateFlags & FOCUSED) != 0) {
imm.focusIn(this);
@@ -3951,7 +3969,7 @@
(event.getRepeatCount() == 0)) {
setPressed(true);
if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
- postCheckForLongClick();
+ postCheckForLongClick(0);
}
return true;
}
@@ -3994,7 +4012,7 @@
if (!mHasPerformedLongPress) {
// This is a tap, so remove the longpress check
- cancelLongPress();
+ removeLongPressCallback();
result = performClick();
}
@@ -4174,7 +4192,8 @@
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
- if ((mPrivateFlags & PRESSED) != 0) {
+ boolean prepressed = (mPrivateFlags & PREPRESSED) != 0;
+ if ((mPrivateFlags & PRESSED) != 0 || prepressed) {
// take focus if we don't have it already and we should in
// touch mode.
boolean focusTaken = false;
@@ -4184,7 +4203,7 @@
if (!mHasPerformedLongPress) {
// This is a tap, so remove the longpress check
- cancelLongPress();
+ removeLongPressCallback();
// Only perform take click actions if we were in the pressed state
if (!focusTaken) {
@@ -4196,24 +4215,31 @@
mUnsetPressedState = new UnsetPressedState();
}
- if (!post(mUnsetPressedState)) {
+ if (prepressed) {
+ mPrivateFlags |= PRESSED;
+ refreshDrawableState();
+ postDelayed(mUnsetPressedState,
+ ViewConfiguration.getPressedStateDuration());
+ } else if (!post(mUnsetPressedState)) {
// If the post failed, unpress right now
mUnsetPressedState.run();
}
+ removeTapCallback();
}
break;
case MotionEvent.ACTION_DOWN:
- mPrivateFlags |= PRESSED;
- refreshDrawableState();
- if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
- postCheckForLongClick();
+ if (mPendingCheckForTap == null) {
+ mPendingCheckForTap = new CheckForTap();
}
+ mPrivateFlags |= PREPRESSED;
+ postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
break;
case MotionEvent.ACTION_CANCEL:
mPrivateFlags &= ~PRESSED;
refreshDrawableState();
+ removeTapCallback();
break;
case MotionEvent.ACTION_MOVE:
@@ -4221,25 +4247,19 @@
final int y = (int) event.getY();
// Be lenient about moving outside of buttons
- int slop = ViewConfiguration.get(mContext).getScaledTouchSlop();
+ int slop = mTouchSlop;
if ((x < 0 - slop) || (x >= getWidth() + slop) ||
(y < 0 - slop) || (y >= getHeight() + slop)) {
// Outside button
+ removeTapCallback();
if ((mPrivateFlags & PRESSED) != 0) {
- // Remove any future long press checks
- cancelLongPress();
+ // Remove any future long press/tap checks
+ removeLongPressCallback();
// Need to switch from pressed to not pressed
mPrivateFlags &= ~PRESSED;
refreshDrawableState();
}
- } else {
- // Inside button
- if ((mPrivateFlags & PRESSED) == 0) {
- // Need to switch from not pressed to pressed
- mPrivateFlags |= PRESSED;
- refreshDrawableState();
- }
}
break;
}
@@ -4250,15 +4270,32 @@
}
/**
+ * Remove the longpress detection timer.
+ */
+ private void removeLongPressCallback() {
+ if (mPendingCheckForLongPress != null) {
+ removeCallbacks(mPendingCheckForLongPress);
+ }
+ }
+
+ /**
+ * Remove the tap detection timer.
+ */
+ private void removeTapCallback() {
+ if (mPendingCheckForTap != null) {
+ mPrivateFlags &= ~PREPRESSED;
+ removeCallbacks(mPendingCheckForTap);
+ }
+ }
+
+ /**
* Cancels a pending long press. Your subclass can use this if you
* want the context menu to come up if the user presses and holds
* at the same place, but you don't want it to come up if they press
* and then move around enough to cause scrolling.
*/
public void cancelLongPress() {
- if (mPendingCheckForLongPress != null) {
- removeCallbacks(mPendingCheckForLongPress);
- }
+ removeLongPressCallback();
}
/**
@@ -5759,7 +5796,7 @@
* @see #onAttachedToWindow()
*/
protected void onDetachedFromWindow() {
- cancelLongPress();
+ removeLongPressCallback();
destroyDrawingCache();
}
@@ -8420,14 +8457,15 @@
}
}
- private void postCheckForLongClick() {
+ private void postCheckForLongClick(int delayOffset) {
mHasPerformedLongPress = false;
if (mPendingCheckForLongPress == null) {
mPendingCheckForLongPress = new CheckForLongPress();
}
mPendingCheckForLongPress.rememberWindowAttachCount();
- postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
+ postDelayed(mPendingCheckForLongPress,
+ ViewConfiguration.getLongPressTimeout() - delayOffset);
}
private static int[] stateSetUnion(final int[] stateSet1,
@@ -8604,6 +8642,17 @@
mOriginalWindowAttachCount = mWindowAttachCount;
}
}
+
+ private final class CheckForTap implements Runnable {
+ public void run() {
+ mPrivateFlags &= ~PREPRESSED;
+ mPrivateFlags |= PRESSED;
+ refreshDrawableState();
+ if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
+ postCheckForLongClick(ViewConfiguration.getTapTimeout());
+ }
+ }
+ }
/**
* Interface definition for a callback to be invoked when a key event is
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 993048f..2344c42 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -49,7 +49,7 @@
* Defines the duration in milliseconds of the pressed state in child
* components.
*/
- private static final int PRESSED_STATE_DURATION = 85;
+ private static final int PRESSED_STATE_DURATION = 125;
/**
* Defines the duration in milliseconds before a press turns into
@@ -69,7 +69,7 @@
* is a tap or a scroll. If the user does not move within this interval, it is
* considered to be a tap.
*/
- private static final int TAP_TIMEOUT = 100;
+ private static final int TAP_TIMEOUT = 115;
/**
* Defines the duration in milliseconds we will wait to see if a touch event
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 2fd974e..3ebe1c2 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -702,7 +702,7 @@
if (parameter.indexOf('@') != -1) {
final String[] ids = parameter.split("@");
final String className = ids[0];
- final int hashCode = Integer.parseInt(ids[1], 16);
+ final int hashCode = (int) Long.parseLong(ids[1], 16);
View view = root.getRootView();
if (view instanceof ViewGroup) {
@@ -910,7 +910,7 @@
private static void dump(View root, OutputStream clientStream) throws IOException {
BufferedWriter out = null;
try {
- out = new BufferedWriter(new OutputStreamWriter(clientStream), 32 * 1024);
+ out = new BufferedWriter(new OutputStreamWriter(clientStream, "utf-8"), 32 * 1024);
View view = root.getRootView();
if (view instanceof ViewGroup) {
ViewGroup group = (ViewGroup) view;
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 6646136..763f273 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3070,7 +3070,7 @@
if (childDimension >= 0) {
resultSize = childDimension;
resultMode = MeasureSpec.EXACTLY;
- } else if (childDimension == LayoutParams.FILL_PARENT) {
+ } else if (childDimension == LayoutParams.MATCH_PARENT) {
// Child wants to be our size. So be it.
resultSize = size;
resultMode = MeasureSpec.EXACTLY;
@@ -3088,7 +3088,7 @@
// Child wants a specific size... so be it
resultSize = childDimension;
resultMode = MeasureSpec.EXACTLY;
- } else if (childDimension == LayoutParams.FILL_PARENT) {
+ } else if (childDimension == LayoutParams.MATCH_PARENT) {
// Child wants to be our size, but our size is not fixed.
// Constrain child to not be bigger than us.
resultSize = size;
@@ -3107,7 +3107,7 @@
// Child wants a specific size... let him have it
resultSize = childDimension;
resultMode = MeasureSpec.EXACTLY;
- } else if (childDimension == LayoutParams.FILL_PARENT) {
+ } else if (childDimension == LayoutParams.MATCH_PARENT) {
// Child wants to be our size... find out how big it should
// be
resultSize = 0;
@@ -3362,7 +3362,7 @@
* for both width and height. For each dimension, it can specify one of:
* <ul>
* <li> an exact number
- * <li>FILL_PARENT, which means the view wants to be as big as its parent
+ * <li>MATCH_PARENT, which means the view wants to be as big as its parent
* (minus padding)
* <li> WRAP_CONTENT, which means that the view wants to be just big enough
* to enclose its content (plus padding)
@@ -3376,14 +3376,22 @@
*/
public static class LayoutParams {
/**
- * Special value for the height or width requested by a View.
- * FILL_PARENT means that the view wants to fill the available space
- * within the parent, taking the parent's padding into account.
+ * This value has the same meaning as {@link #MATCH_PARENT} but has
+ * been deprecated.
*/
+ @SuppressWarnings({"UnusedDeclaration"})
+ @Deprecated
public static final int FILL_PARENT = -1;
/**
* Special value for the height or width requested by a View.
+ * MATCH_PARENT means that the view wants to be as bigas its parent,
+ * minus the parent's padding, if any.
+ */
+ public static final int MATCH_PARENT = -1;
+
+ /**
+ * Special value for the height or width requested by a View.
* WRAP_CONTENT means that the view wants to be just large enough to fit
* its own internal content, taking its own padding into account.
*/
@@ -3391,20 +3399,20 @@
/**
* Information about how wide the view wants to be. Can be an exact
- * size, or one of the constants FILL_PARENT or WRAP_CONTENT.
+ * size, or one of the constants MATCH_PARENT or WRAP_CONTENT.
*/
@ViewDebug.ExportedProperty(mapping = {
- @ViewDebug.IntToString(from = FILL_PARENT, to = "FILL_PARENT"),
+ @ViewDebug.IntToString(from = MATCH_PARENT, to = "MATCH_PARENT"),
@ViewDebug.IntToString(from = WRAP_CONTENT, to = "WRAP_CONTENT")
})
public int width;
/**
* Information about how tall the view wants to be. Can be an exact
- * size, or one of the constants FILL_PARENT or WRAP_CONTENT.
+ * size, or one of the constants MATCH_PARENT or WRAP_CONTENT.
*/
@ViewDebug.ExportedProperty(mapping = {
- @ViewDebug.IntToString(from = FILL_PARENT, to = "FILL_PARENT"),
+ @ViewDebug.IntToString(from = MATCH_PARENT, to = "MATCH_PARENT"),
@ViewDebug.IntToString(from = WRAP_CONTENT, to = "WRAP_CONTENT")
})
public int height;
@@ -3421,9 +3429,9 @@
*
* <ul>
* <li><code>layout_width</code>: the width, either an exact value,
- * {@link #WRAP_CONTENT} or {@link #FILL_PARENT}</li>
+ * {@link #WRAP_CONTENT} or {@link #MATCH_PARENT}</li>
* <li><code>layout_height</code>: the height, either an exact value,
- * {@link #WRAP_CONTENT} or {@link #FILL_PARENT}</li>
+ * {@link #WRAP_CONTENT} or {@link #MATCH_PARENT}</li>
* </ul>
*
* @param c the application environment
@@ -3442,9 +3450,9 @@
* Creates a new set of layout parameters with the specified width
* and height.
*
- * @param width the width, either {@link #FILL_PARENT},
+ * @param width the width, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
- * @param height the height, either {@link #FILL_PARENT},
+ * @param height the height, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
*/
public LayoutParams(int width, int height) {
@@ -3507,8 +3515,8 @@
if (size == WRAP_CONTENT) {
return "wrap-content";
}
- if (size == FILL_PARENT) {
- return "fill-parent";
+ if (size == MATCH_PARENT) {
+ return "match-parent";
}
return String.valueOf(size);
}
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 47b976b..094b7dd 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -1167,7 +1167,7 @@
int measureSpec;
switch (rootDimension) {
- case ViewGroup.LayoutParams.FILL_PARENT:
+ case ViewGroup.LayoutParams.MATCH_PARENT:
// Window can't resize. Force root view to be windowSize.
measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
break;
diff --git a/core/java/android/view/ViewStub.java b/core/java/android/view/ViewStub.java
index 703a38f..d5e9af4 100644
--- a/core/java/android/view/ViewStub.java
+++ b/core/java/android/view/ViewStub.java
@@ -207,9 +207,11 @@
} else {
throw new IllegalStateException("setVisibility called on un-referenced view");
}
- } else if (visibility == VISIBLE || visibility == INVISIBLE) {
+ } else {
super.setVisibility(visibility);
- inflate();
+ if (visibility == VISIBLE || visibility == INVISIBLE) {
+ inflate();
+ }
}
}
@@ -244,7 +246,7 @@
parent.addView(view, index);
}
- mInflatedViewRef = new WeakReference(view);
+ mInflatedViewRef = new WeakReference<View>(view);
if (mInflateListener != null) {
mInflateListener.onInflate(this, view);
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 1932765..7dd5085 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -484,7 +484,7 @@
/**
* Set the width and height layout parameters of the window. The default
- * for both of these is FILL_PARENT; you can change them to WRAP_CONTENT to
+ * for both of these is MATCH_PARENT; you can change them to WRAP_CONTENT to
* make a window that is not full-screen.
*
* @param width The desired layout width of the window.
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index fe329f2..8e15f89 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -771,26 +771,26 @@
public LayoutParams() {
- super(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = TYPE_APPLICATION;
format = PixelFormat.OPAQUE;
}
public LayoutParams(int _type) {
- super(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = _type;
format = PixelFormat.OPAQUE;
}
public LayoutParams(int _type, int _flags) {
- super(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = _type;
flags = _flags;
format = PixelFormat.OPAQUE;
}
public LayoutParams(int _type, int _flags, int _format) {
- super(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = _type;
flags = _flags;
format = _format;
@@ -1036,9 +1036,9 @@
sb.append(',');
sb.append(y);
sb.append(")(");
- sb.append((width==FILL_PARENT?"fill":(width==WRAP_CONTENT?"wrap":width)));
+ sb.append((width== MATCH_PARENT ?"fill":(width==WRAP_CONTENT?"wrap":width)));
sb.append('x');
- sb.append((height==FILL_PARENT?"fill":(height==WRAP_CONTENT?"wrap":height)));
+ sb.append((height== MATCH_PARENT ?"fill":(height==WRAP_CONTENT?"wrap":height)));
sb.append(")");
if (softInputMode != 0) {
sb.append(" sim=#");
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 5d3840a..bbe9c1f 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -662,6 +662,14 @@
public boolean finishAnimationLw();
/**
+ * Return true if it is okay to perform animations for an app transition
+ * that is about to occur. You may return false for this if, for example,
+ * the lock screen is currently displayed so the switch should happen
+ * immediately.
+ */
+ public boolean allowAppAnimationsLw();
+
+ /**
* Called after the screen turns off.
*
* @param why {@link #OFF_BECAUSE_OF_USER} or
@@ -675,6 +683,11 @@
public void screenTurnedOn();
/**
+ * Return whether the screen is currently on.
+ */
+ public boolean isScreenOn();
+
+ /**
* Perform any initial processing of a low-level input event before the
* window manager handles special keys and generates a high-level event
* that is dispatched to the application.
diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java
index 13606e7..2aba60b 100755
--- a/core/java/android/view/WindowOrientationListener.java
+++ b/core/java/android/view/WindowOrientationListener.java
@@ -33,13 +33,12 @@
public abstract class WindowOrientationListener {
private static final String TAG = "WindowOrientationListener";
private static final boolean DEBUG = false;
- private static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV;
+ private static final boolean localLOGV = DEBUG || Config.DEBUG;
private SensorManager mSensorManager;
private boolean mEnabled = false;
private int mRate;
private Sensor mSensor;
- private SensorEventListener mSensorEventListener;
- private int mSensorRotation = -1;
+ private SensorEventListenerImpl mSensorEventListener;
/**
* Creates a new WindowOrientationListener.
@@ -80,7 +79,6 @@
}
if (mEnabled == false) {
if (localLOGV) Log.d(TAG, "WindowOrientationListener enabled");
- mSensorRotation = -1;
mSensorManager.registerListener(mSensorEventListener, mSensor, mRate);
mEnabled = true;
}
@@ -96,23 +94,22 @@
}
if (mEnabled == true) {
if (localLOGV) Log.d(TAG, "WindowOrientationListener disabled");
- mSensorRotation = -1;
mSensorManager.unregisterListener(mSensorEventListener);
mEnabled = false;
}
}
public int getCurrentRotation() {
- return mSensorRotation;
+ if (mEnabled) {
+ return mSensorEventListener.getCurrentRotation();
+ }
+ return -1;
}
class SensorEventListenerImpl implements SensorEventListener {
private static final int _DATA_X = 0;
private static final int _DATA_Y = 1;
private static final int _DATA_Z = 2;
- // Angle around x-axis thats considered almost perfect vertical to hold
- // the device
- private static final int PIVOT = 20;
// Angle around x-asis that's considered almost too vertical. Beyond
// this angle will not result in any orientation changes. f phone faces uses,
// the device is leaning backward.
@@ -121,30 +118,61 @@
// angle will not result in any orientation changes. If phone faces uses,
// the device is leaning forward.
private static final int PIVOT_LOWER = -10;
- // Upper threshold limit for switching from portrait to landscape
- private static final int PL_UPPER = 295;
- // Lower threshold limit for switching from landscape to portrait
- private static final int LP_LOWER = 320;
- // Lower threshold limt for switching from portrait to landscape
- private static final int PL_LOWER = 270;
- // Upper threshold limit for switching from landscape to portrait
- private static final int LP_UPPER = 359;
- // Minimum angle which is considered landscape
- private static final int LANDSCAPE_LOWER = 235;
- // Minimum angle which is considered portrait
- private static final int PORTRAIT_LOWER = 60;
+ static final int ROTATION_0 = 0;
+ static final int ROTATION_90 = 1;
+ static final int ROTATION_180 = 2;
+ static final int ROTATION_270 = 3;
+ int mRotation = ROTATION_0;
+
+ // Threshold values defined for device rotation positions
+ // follow order ROTATION_0 .. ROTATION_270
+ final int THRESHOLDS[][][] = new int[][][] {
+ {{60, 135}, {135, 225}, {225, 300}},
+ {{0, 45}, {45, 135}, {135, 210}, {330, 360}},
+ {{0, 45}, {45, 120}, {240, 315}, {315, 360}},
+ {{0, 30}, {150, 225}, {225, 315}, {315, 360}}
+ };
+
+ // Transform rotation ranges based on THRESHOLDS. This
+ // has to be in step with THESHOLDS
+ final int ROTATE_TO[][] = new int[][] {
+ {ROTATION_270, ROTATION_180, ROTATION_90},
+ {ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0},
+ {ROTATION_0, ROTATION_270, ROTATION_90, ROTATION_0},
+ {ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0}
+ };
+
+ // Mapping into actual Surface rotation values
+ final int TRANSFORM_ROTATIONS[] = new int[]{Surface.ROTATION_0,
+ Surface.ROTATION_90, Surface.ROTATION_180, Surface.ROTATION_270};
+
+ int getCurrentRotation() {
+ return TRANSFORM_ROTATIONS[mRotation];
+ }
- // Internal value used for calculating linear variant
- private static final float PL_LF_UPPER =
- ((float)(PL_UPPER-PL_LOWER))/((float)(PIVOT_UPPER-PIVOT));
- private static final float PL_LF_LOWER =
- ((float)(PL_UPPER-PL_LOWER))/((float)(PIVOT-PIVOT_LOWER));
- // Internal value used for calculating linear variant
- private static final float LP_LF_UPPER =
- ((float)(LP_UPPER - LP_LOWER))/((float)(PIVOT_UPPER-PIVOT));
- private static final float LP_LF_LOWER =
- ((float)(LP_UPPER - LP_LOWER))/((float)(PIVOT-PIVOT_LOWER));
-
+ private void calculateNewRotation(int orientation, int zyangle) {
+ if (localLOGV) Log.i(TAG, orientation + ", " + zyangle + ", " + mRotation);
+ int rangeArr[][] = THRESHOLDS[mRotation];
+ int row = -1;
+ for (int i = 0; i < rangeArr.length; i++) {
+ if ((orientation >= rangeArr[i][0]) && (orientation < rangeArr[i][1])) {
+ row = i;
+ break;
+ }
+ }
+ if (row != -1) {
+ // Find new rotation based on current rotation value.
+ // This also takes care of irregular rotations as well.
+ int rotation = ROTATE_TO[mRotation][row];
+ if (localLOGV) Log.i(TAG, " new rotation = " + rotation);
+ if (rotation != mRotation) {
+ mRotation = rotation;
+ // Trigger orientation change
+ onOrientationChanged(TRANSFORM_ROTATIONS[rotation]);
+ }
+ }
+ }
+
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
float X = values[_DATA_X];
@@ -153,53 +181,19 @@
float OneEightyOverPi = 57.29577957855f;
float gravity = (float) Math.sqrt(X*X+Y*Y+Z*Z);
float zyangle = (float)Math.asin(Z/gravity)*OneEightyOverPi;
- int rotation = -1;
if ((zyangle <= PIVOT_UPPER) && (zyangle >= PIVOT_LOWER)) {
// Check orientation only if the phone is flat enough
// Don't trust the angle if the magnitude is small compared to the y value
float angle = (float)Math.atan2(Y, -X) * OneEightyOverPi;
- int orientation = 90 - (int)Math.round(angle);
+ int orientation = 90 - Math.round(angle);
// normalize to 0 - 359 range
while (orientation >= 360) {
orientation -= 360;
- }
+ }
while (orientation < 0) {
orientation += 360;
}
- // Orientation values between LANDSCAPE_LOWER and PL_LOWER
- // are considered landscape.
- // Ignore orientation values between 0 and LANDSCAPE_LOWER
- // For orientation values between LP_UPPER and PL_LOWER,
- // the threshold gets set linearly around PIVOT.
- if ((orientation >= PL_LOWER) && (orientation <= LP_UPPER)) {
- float threshold;
- float delta = zyangle - PIVOT;
- if (mSensorRotation == Surface.ROTATION_90) {
- if (delta < 0) {
- // Delta is negative
- threshold = LP_LOWER - (LP_LF_LOWER * delta);
- } else {
- threshold = LP_LOWER + (LP_LF_UPPER * delta);
- }
- rotation = (orientation >= threshold) ? Surface.ROTATION_0 : Surface.ROTATION_90;
- } else {
- if (delta < 0) {
- // Delta is negative
- threshold = PL_UPPER+(PL_LF_LOWER * delta);
- } else {
- threshold = PL_UPPER-(PL_LF_UPPER * delta);
- }
- rotation = (orientation <= threshold) ? Surface.ROTATION_90: Surface.ROTATION_0;
- }
- } else if ((orientation >= LANDSCAPE_LOWER) && (orientation < LP_LOWER)) {
- rotation = Surface.ROTATION_90;
- } else if ((orientation >= PL_UPPER) || (orientation <= PORTRAIT_LOWER)) {
- rotation = Surface.ROTATION_0;
- }
- if ((rotation != -1) && (rotation != mSensorRotation)) {
- mSensorRotation = rotation;
- onOrientationChanged(mSensorRotation);
- }
+ calculateNewRotation(orientation, Math.round(zyangle));
}
}
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index fb369d3..6790c5d 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -90,7 +90,6 @@
private static final int JS_PROMPT = 114;
private static final int JS_UNLOAD = 115;
private static final int ASYNC_KEYEVENTS = 116;
- private static final int TOO_MANY_REDIRECTS = 117;
private static final int DOWNLOAD_FILE = 118;
private static final int REPORT_ERROR = 119;
private static final int RESEND_POST_DATA = 120;
@@ -276,19 +275,6 @@
}
break;
- case TOO_MANY_REDIRECTS:
- Message cancelMsg =
- (Message) msg.getData().getParcelable("cancelMsg");
- Message continueMsg =
- (Message) msg.getData().getParcelable("continueMsg");
- if (mWebViewClient != null) {
- mWebViewClient.onTooManyRedirects(mWebView, cancelMsg,
- continueMsg);
- } else {
- cancelMsg.sendToTarget();
- }
- break;
-
case REPORT_ERROR:
if (mWebViewClient != null) {
int reasonCode = msg.arg1;
@@ -790,19 +776,10 @@
sendMessage(msg);
}
+ // Because this method is public and because CallbackProxy is mistakenly
+ // party of the public classes, we cannot remove this method.
public void onTooManyRedirects(Message cancelMsg, Message continueMsg) {
- // Do an unsynchronized quick check to avoid posting if no callback has
- // been set.
- if (mWebViewClient == null) {
- cancelMsg.sendToTarget();
- return;
- }
-
- Message msg = obtainMessage(TOO_MANY_REDIRECTS);
- Bundle bundle = msg.getData();
- bundle.putParcelable("cancelMsg", cancelMsg);
- bundle.putParcelable("continueMsg", continueMsg);
- sendMessage(msg);
+ // deprecated.
}
public void onReceivedError(int errorCode, String description,
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index 3e0be1c..429b335 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -48,6 +48,8 @@
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
/**
* <p>Proxy for HTML5 video views.
@@ -71,6 +73,9 @@
private static final int ENDED = 201;
private static final int POSTER_FETCHED = 202;
+ // Timer thread -> UI thread
+ private static final int TIMEUPDATE = 300;
+
// The C++ MediaPlayerPrivateAndroid object.
int mNativePointer;
// The handler for WebCore thread messages;
@@ -95,6 +100,22 @@
private static View mProgressView;
// The container for the progress view and video view
private static FrameLayout mLayout;
+ // The timer for timeupate events.
+ // See http://www.whatwg.org/specs/web-apps/current-work/#event-media-timeupdate
+ private static Timer mTimer;
+ private static final class TimeupdateTask extends TimerTask {
+ private HTML5VideoViewProxy mProxy;
+
+ public TimeupdateTask(HTML5VideoViewProxy proxy) {
+ mProxy = proxy;
+ }
+
+ public void run() {
+ mProxy.onTimeupdate();
+ }
+ }
+ // The spec says the timer should fire every 250 ms or less.
+ private static final int TIMEUPDATE_PERIOD = 250; // ms
private static final WebChromeClient.CustomViewCallback mCallback =
new WebChromeClient.CustomViewCallback() {
@@ -104,6 +125,8 @@
// which happens when the video view is detached from its parent
// view. This happens in the WebChromeClient before this method
// is invoked.
+ mTimer.cancel();
+ mTimer = null;
mCurrentProxy.playbackEnded();
mCurrentProxy = null;
mLayout.removeView(mVideoView);
@@ -118,11 +141,19 @@
public static void play(String url, int time, HTML5VideoViewProxy proxy,
WebChromeClient client) {
+ if (mCurrentProxy == proxy) {
+ if (!mVideoView.isPlaying()) {
+ mVideoView.start();
+ }
+ return;
+ }
+
if (mCurrentProxy != null) {
// Some other video is already playing. Notify the caller that its playback ended.
proxy.playbackEnded();
return;
}
+
mCurrentProxy = proxy;
// Create a FrameLayout that will contain the VideoView and the
// progress view (if any).
@@ -146,10 +177,23 @@
mProgressView.setVisibility(View.VISIBLE);
}
mLayout.setVisibility(View.VISIBLE);
+ mTimer = new Timer();
mVideoView.start();
client.onShowCustomView(mLayout, mCallback);
}
+ public static boolean isPlaying(HTML5VideoViewProxy proxy) {
+ return (mCurrentProxy == proxy && mVideoView != null && mVideoView.isPlaying());
+ }
+
+ public static int getCurrentPosition() {
+ int currentPosMs = 0;
+ if (mVideoView != null) {
+ currentPosMs = mVideoView.getCurrentPosition();
+ }
+ return currentPosMs;
+ }
+
public static void seek(int time, HTML5VideoViewProxy proxy) {
if (mCurrentProxy == proxy && time >= 0 && mVideoView != null) {
mVideoView.seekTo(time);
@@ -159,10 +203,13 @@
public static void pause(HTML5VideoViewProxy proxy) {
if (mCurrentProxy == proxy && mVideoView != null) {
mVideoView.pause();
+ mTimer.purge();
}
}
public static void onPrepared() {
+ mTimer.schedule(new TimeupdateTask(mCurrentProxy), TIMEUPDATE_PERIOD, TIMEUPDATE_PERIOD);
+
if (mProgressView == null || mLayout == null) {
return;
}
@@ -203,7 +250,11 @@
sendMessage(obtainMessage(ENDED));
}
- // Handler for the messages from WebCore thread to the UI thread.
+ public void onTimeupdate() {
+ sendMessage(obtainMessage(TIMEUPDATE));
+ }
+
+ // Handler for the messages from WebCore or Timer thread to the UI thread.
@Override
public void handleMessage(Message msg) {
// This executes on the UI thread.
@@ -241,6 +292,12 @@
}
break;
}
+ case TIMEUPDATE: {
+ if (VideoPlayer.isPlaying(this)) {
+ sendTimeupdate();
+ }
+ break;
+ }
}
}
@@ -410,6 +467,9 @@
Bitmap poster = (Bitmap) msg.obj;
nativeOnPosterFetched(poster, mNativePointer);
break;
+ case TIMEUPDATE:
+ nativeOnTimeupdate(msg.arg1, mNativePointer);
+ break;
}
}
};
@@ -426,6 +486,12 @@
mWebCoreHandler.sendMessage(msg);
}
+ private void sendTimeupdate() {
+ Message msg = Message.obtain(mWebCoreHandler, TIMEUPDATE);
+ msg.arg1 = VideoPlayer.getCurrentPosition();
+ mWebCoreHandler.sendMessage(msg);
+ }
+
public Context getContext() {
return mWebView.getContext();
}
@@ -506,4 +572,5 @@
private native void nativeOnPrepared(int duration, int width, int height, int nativePointer);
private native void nativeOnEnded(int nativePointer);
private native void nativeOnPosterFetched(Bitmap poster, int nativePointer);
+ private native void nativeOnTimeupdate(int position, int nativePointer);
}
diff --git a/core/java/android/webkit/WebStorage.java b/core/java/android/webkit/WebStorage.java
index a182287..cf71a84 100644
--- a/core/java/android/webkit/WebStorage.java
+++ b/core/java/android/webkit/WebStorage.java
@@ -389,8 +389,8 @@
mOrigins = new HashMap<String, Origin>();
for (String origin : tmp) {
Origin website = new Origin(origin,
- nativeGetUsageForOrigin(origin),
- nativeGetQuotaForOrigin(origin));
+ nativeGetQuotaForOrigin(origin),
+ nativeGetUsageForOrigin(origin));
mOrigins.put(origin, website);
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6368dac..c349606 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -25,11 +25,9 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.Paint;
import android.graphics.Picture;
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;
@@ -55,7 +53,6 @@
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
-import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.animation.AlphaAnimation;
import android.view.inputmethod.InputMethodManager;
@@ -203,6 +200,8 @@
implements ViewTreeObserver.OnGlobalFocusChangeListener,
ViewGroup.OnHierarchyChangeListener {
+ // enable debug output for drag trackers
+ private static final boolean DEBUG_DRAG_TRACKER = false;
// if AUTO_REDRAW_HACK is true, then the CALL key will toggle redrawing
// the screen all-the-time. Good for profiling our drawing code
static private final boolean AUTO_REDRAW_HACK = false;
@@ -486,7 +485,7 @@
static final int MOVE_OUT_OF_PLUGIN = 19;
static final int CLEAR_TEXT_ENTRY = 20;
static final int UPDATE_TEXT_SELECTION_MSG_ID = 21;
- static final int UPDATE_CLIPBOARD = 22;
+
static final int LONG_PRESS_CENTER = 23;
static final int PREVENT_TOUCH_ID = 24;
static final int WEBCORE_NEED_TOUCH_EVENTS = 25;
@@ -523,7 +522,7 @@
"MOVE_OUT_OF_PLUGIN", // = 19;
"CLEAR_TEXT_ENTRY", // = 20;
"UPDATE_TEXT_SELECTION_MSG_ID", // = 21;
- "UPDATE_CLIPBOARD", // = 22;
+ "22", // = 22;
"LONG_PRESS_CENTER", // = 23;
"PREVENT_TOUCH_ID", // = 24;
"WEBCORE_NEED_TOUCH_EVENTS", // = 25;
@@ -1847,7 +1846,7 @@
}
if (null != v) {
addView(v, new AbsoluteLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0));
if (mTitleShadow == null) {
mTitleShadow = (Drawable) mContext.getResources().getDrawable(
@@ -3666,9 +3665,6 @@
nativeHideCursor();
}
- /**
- * @hide
- */
public void emulateShiftHeld() {
if (0 == mNativeClass) return; // client isn't initialized
setUpSelectXY();
@@ -3677,14 +3673,22 @@
private boolean commitCopy() {
boolean copiedSomething = false;
if (mExtendSelection) {
- // copy region so core operates on copy without touching orig.
- Region selection = new Region(nativeGetSelection());
- if (selection.isEmpty() == false) {
+ String selection = nativeGetSelection();
+ if (selection != "") {
+ if (DebugFlags.WEB_VIEW) {
+ Log.v(LOGTAG, "commitCopy \"" + selection + "\"");
+ }
Toast.makeText(mContext
, com.android.internal.R.string.text_copied
, Toast.LENGTH_SHORT).show();
- mWebViewCore.sendMessage(EventHub.GET_SELECTION, selection);
copiedSomething = true;
+ try {
+ IClipboard clip = IClipboard.Stub.asInterface(
+ ServiceManager.getService("clipboard"));
+ clip.setClipboardText(selection);
+ } catch (android.os.RemoteException e) {
+ Log.e(LOGTAG, "Clipboard failed", e);
+ }
}
mExtendSelection = false;
}
@@ -3888,7 +3892,9 @@
public void run() {
// we always force, in case our height changed, in which case we
// still want to send the notification over to webkit
- setNewZoomScale(mActualScale, true);
+ if (mWebViewCore != null) {
+ setNewZoomScale(mActualScale, true);
+ }
}
});
}
@@ -3965,7 +3971,7 @@
mMinDY = -viewTop;
mMaxDY = docBottom - viewBottom;
- if (DebugFlags.DRAG_TRACKER) {
+ if (DebugFlags.DRAG_TRACKER || DEBUG_DRAG_TRACKER) {
Log.d(DebugFlags.DRAG_TRACKER_LOGTAG, " dragtracker y= " + y +
" up/down= " + mMinDY + " " + mMaxDY);
}
@@ -4002,7 +4008,7 @@
if (mCurrStretchX != sx || mCurrStretchY != sy) {
mCurrStretchX = sx;
mCurrStretchY = sy;
- if (DebugFlags.DRAG_TRACKER) {
+ if (DebugFlags.DRAG_TRACKER || DEBUG_DRAG_TRACKER) {
Log.d(DebugFlags.DRAG_TRACKER_LOGTAG, "---- stretch " + sx +
" " + sy);
}
@@ -4013,7 +4019,7 @@
}
public void stopDrag() {
- if (DebugFlags.DRAG_TRACKER) {
+ if (DebugFlags.DRAG_TRACKER || DEBUG_DRAG_TRACKER) {
Log.d(DebugFlags.DRAG_TRACKER_LOGTAG, "----- stopDrag");
}
mProxy.onStopDrag();
@@ -4050,7 +4056,7 @@
canvas.restoreToCount(count);
return true;
}
- if (DebugFlags.DRAG_TRACKER) {
+ if (DebugFlags.DRAG_TRACKER || DEBUG_DRAG_TRACKER) {
Log.d(DebugFlags.DRAG_TRACKER_LOGTAG, " -- draw false " +
mCurrStretchX + " " + mCurrStretchY);
}
@@ -4065,7 +4071,7 @@
canvas.translate(-sx, -sy);
drawContent(canvas);
- if (DebugFlags.DRAG_TRACKER) {
+ if (DebugFlags.DRAG_TRACKER || DEBUG_DRAG_TRACKER) {
Log.d(DebugFlags.DRAG_TRACKER_LOGTAG, "--- buildBitmap " + sx +
" " + sy + " " + w + " " + h);
}
@@ -5123,12 +5129,12 @@
mWebViewCore.sendMessageAtFrontOfQueue(EventHub.VALID_NODE_BOUNDS,
motionUpData);
} else {
- doMotionUp(contentX, contentY, false);
+ doMotionUp(contentX, contentY);
}
}
- private void doMotionUp(int contentX, int contentY, boolean useNavCache) {
- if (nativeMotionUp(contentX, contentY, useNavCache ? mNavSlop : 0)) {
+ private void doMotionUp(int contentX, int contentY) {
+ if (nativeMotionUp(contentX, contentY, mNavSlop)) {
if (mLogEvent) {
Checkin.updateStats(mContext.getContentResolver(),
Checkin.Stats.Tag.BROWSER_SNAP_CENTER, 1, 0.0);
@@ -5681,19 +5687,6 @@
mWebTextView.setAdapterCustom(adapter);
}
break;
- case UPDATE_CLIPBOARD:
- String str = (String) msg.obj;
- if (DebugFlags.WEB_VIEW) {
- Log.v(LOGTAG, "UPDATE_CLIPBOARD " + str);
- }
- try {
- IClipboard clip = IClipboard.Stub.asInterface(
- ServiceManager.getService("clipboard"));
- clip.setClipboardText(str);
- } catch (android.os.RemoteException e) {
- Log.e(LOGTAG, "Clipboard failed", e);
- }
- break;
case RESUME_WEBCORE_UPDATE:
WebViewCore.resumeUpdate(mWebViewCore);
break;
@@ -5770,7 +5763,7 @@
break;
case DO_MOTION_UP:
- doMotionUp(msg.arg1, msg.arg2, (Boolean) msg.obj);
+ doMotionUp(msg.arg1, msg.arg2);
break;
case SHOW_FULLSCREEN:
@@ -6388,7 +6381,7 @@
private native boolean nativeFocusIsPlugin();
/* package */ native int nativeFocusNodePointer();
private native Rect nativeGetCursorRingBounds();
- private native Region nativeGetSelection();
+ private native String nativeGetSelection();
private native boolean nativeHasCursorNode();
private native boolean nativeHasFocusNode();
private native void nativeHideCursor();
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 032295d..02c7210 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -86,6 +86,8 @@
* @param view The WebView that is initiating the callback.
* @param cancelMsg The message to send if the host wants to cancel
* @param continueMsg The message to send if the host wants to continue
+ * @deprecated This method is no longer called. When the WebView encounters
+ * a redirect loop, it will cancel the load.
*/
public void onTooManyRedirects(WebView view, Message cancelMsg,
Message continueMsg) {
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 885dda9..949b318 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -545,8 +545,6 @@
*/
private native void nativeSetSelection(int start, int end);
- private native String nativeGetSelection(Region sel);
-
// Register a scheme to be treated as local scheme so that it can access
// local asset files for resources
private native void nativeRegisterURLSchemeAsLocal(String scheme);
@@ -776,7 +774,7 @@
"SET_BACKGROUND_COLOR", // = 126;
"SET_MOVE_FOCUS", // = 127
"SAVE_DOCUMENT_STATE", // = 128;
- "GET_SELECTION", // = 129;
+ "129", // = 129;
"WEBKIT_DRAW", // = 130;
"SYNC_SCROLL", // = 131;
"POST_URL", // = 132;
@@ -829,7 +827,7 @@
static final int SET_BACKGROUND_COLOR = 126;
static final int SET_MOVE_FOCUS = 127;
static final int SAVE_DOCUMENT_STATE = 128;
- static final int GET_SELECTION = 129;
+
static final int WEBKIT_DRAW = 130;
static final int SYNC_SCROLL = 131;
static final int POST_URL = 132;
@@ -1266,13 +1264,6 @@
nativeSetBackgroundColor(msg.arg1);
break;
- case GET_SELECTION:
- String str = nativeGetSelection((Region) msg.obj);
- Message.obtain(mWebView.mPrivateHandler
- , WebView.UPDATE_CLIPBOARD, str)
- .sendToTarget();
- break;
-
case DUMP_DOMTREE:
nativeDumpDomTree(msg.arg1 == 1);
break;
@@ -1325,13 +1316,14 @@
case VALID_NODE_BOUNDS: {
MotionUpData motionUpData = (MotionUpData) msg.obj;
- boolean result = nativeValidNodeAndBounds(
+ if (!nativeValidNodeAndBounds(
motionUpData.mFrame, motionUpData.mNode,
- motionUpData.mBounds);
+ motionUpData.mBounds)) {
+ nativeUpdateFrameCache();
+ }
Message message = mWebView.mPrivateHandler
.obtainMessage(WebView.DO_MOTION_UP,
- motionUpData.mX, motionUpData.mY,
- new Boolean(result));
+ motionUpData.mX, motionUpData.mY);
mWebView.mPrivateHandler.sendMessageAtFrontOfQueue(
message);
break;
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 92ff315..e241c77 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -127,11 +127,6 @@
static final int TOUCH_MODE_FLING = 4;
/**
- * Indicates that the user is currently dragging the fast scroll thumb
- */
- static final int TOUCH_MODE_FAST_SCROLL = 5;
-
- /**
* Regular layout - usually an unsolicited layout from the view system
*/
static final int LAYOUT_NORMAL = 0;
@@ -440,6 +435,8 @@
private Runnable mClearScrollingCache;
private int mMinimumVelocity;
private int mMaximumVelocity;
+
+ final boolean[] mIsScrap = new boolean[1];
/**
* Interface definition for a callback to be invoked when the list or grid
@@ -1239,9 +1236,13 @@
* converting an old view or making a new one.
*
* @param position The position to display
+ * @param isScrap Array of at least 1 boolean, the first entry will become true if
+ * the returned view was taken from the scrap heap, false if otherwise.
+ *
* @return A view displaying the data associated with the specified position
*/
- View obtainView(int position) {
+ View obtainView(int position, boolean[] isScrap) {
+ isScrap[0] = false;
View scrapView;
scrapView = mRecycler.getScrapView(position);
@@ -1269,6 +1270,8 @@
ViewDebug.trace(scrapView, ViewDebug.RecyclerTraceType.MOVE_TO_SCRAP_HEAP,
position, -1);
}
+ } else {
+ isScrap[0] = true;
}
} else {
child = mAdapter.getView(position, null, this);
@@ -1543,6 +1546,9 @@
// Dismiss the popup in case onSaveInstanceState() was not invoked
dismissPopup();
+ // Detach any view left in the scrap heap
+ mRecycler.clear();
+
final ViewTreeObserver treeObserver = getViewTreeObserver();
if (treeObserver != null) {
treeObserver.removeOnTouchModeChangeListener(this);
@@ -1636,6 +1642,7 @@
if (mDataChanged) return;
if (mAdapter != null && mItemCount > 0 &&
+ mClickMotionPosition != INVALID_POSITION &&
mClickMotionPosition < mAdapter.getCount() && sameWindow()) {
performItemClick(mChild, mClickMotionPosition, getAdapter().getItemId(
mClickMotionPosition));
@@ -2969,7 +2976,7 @@
break;
case KeyEvent.KEYCODE_SPACE:
// Only send spaces once we are filtered
- okToSend = mFiltered = true;
+ okToSend = mFiltered;
break;
}
@@ -3594,12 +3601,12 @@
for (int i = 0; i < count; ++i) {
final View victim = activeViews[i];
if (victim != null) {
- int whichScrap = ((AbsListView.LayoutParams)
- victim.getLayoutParams()).viewType;
+ int whichScrap = ((AbsListView.LayoutParams) victim.getLayoutParams()).viewType;
activeViews[i] = null;
if (whichScrap == AdapterView.ITEM_VIEW_TYPE_IGNORE) {
+ removeDetachedView(victim, false);
// Do not move views that should be ignored
continue;
}
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index d25530b..d6dd872 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -26,7 +26,6 @@
import android.view.MotionEvent;
public abstract class AbsSeekBar extends ProgressBar {
-
private Drawable mThumb;
private int mThumbOffset;
@@ -66,8 +65,9 @@
Drawable thumb = a.getDrawable(com.android.internal.R.styleable.SeekBar_thumb);
setThumb(thumb); // will guess mThumbOffset if thumb != null...
// ...but allow layout to override this
- int thumbOffset =
- a.getDimensionPixelOffset(com.android.internal.R.styleable.SeekBar_thumbOffset, getThumbOffset());
+ int thumbOffset = a.getDimensionPixelOffset(
+ com.android.internal.R.styleable.SeekBar_thumbOffset, getThumbOffset());
+ setThumbOffset(thumbOffset);
a.recycle();
a = context.obtainStyledAttributes(attrs,
@@ -91,7 +91,7 @@
// Assuming the thumb drawable is symmetric, set the thumb offset
// such that the thumb will hang halfway off either edge of the
// progress bar.
- mThumbOffset = (int)thumb.getIntrinsicWidth() / 2;
+ mThumbOffset = thumb.getIntrinsicWidth() / 2;
}
mThumb = thumb;
invalidate();
@@ -368,20 +368,21 @@
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- int progress = getProgress();
-
- switch (keyCode) {
- case KeyEvent.KEYCODE_DPAD_LEFT:
- if (progress <= 0) break;
- setProgress(progress - mKeyProgressIncrement, true);
- onKeyChange();
- return true;
-
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- if (progress >= getMax()) break;
- setProgress(progress + mKeyProgressIncrement, true);
- onKeyChange();
- return true;
+ if (isEnabled()) {
+ int progress = getProgress();
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ if (progress <= 0) break;
+ setProgress(progress - mKeyProgressIncrement, true);
+ onKeyChange();
+ return true;
+
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ if (progress >= getMax()) break;
+ setProgress(progress + mKeyProgressIncrement, true);
+ onKeyChange();
+ return true;
+ }
}
return super.onKeyDown(keyCode, event);
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index 424a936..c939e3f 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -249,7 +249,7 @@
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
diff --git a/core/java/android/widget/AbsoluteLayout.java b/core/java/android/widget/AbsoluteLayout.java
index c77f7ae..b829655 100644
--- a/core/java/android/widget/AbsoluteLayout.java
+++ b/core/java/android/widget/AbsoluteLayout.java
@@ -161,9 +161,9 @@
* Creates a new set of layout parameters with the specified width,
* height and location.
*
- * @param width the width, either {@link #FILL_PARENT},
+ * @param width the width, either {@link #MATCH_PARENT},
{@link #WRAP_CONTENT} or a fixed size in pixels
- * @param height the height, either {@link #FILL_PARENT},
+ * @param height the height, either {@link #MATCH_PARENT},
{@link #WRAP_CONTENT} or a fixed size in pixels
* @param x the X location of the child
* @param y the Y location of the child
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index ce985e3..bb9a672 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -172,7 +172,7 @@
mDropDownAnchorId = a.getResourceId(R.styleable.AutoCompleteTextView_dropDownAnchor,
View.NO_ID);
- // For dropdown width, the developer can specify a specific width, or FILL_PARENT
+ // For dropdown width, the developer can specify a specific width, or MATCH_PARENT
// (for full screen width) or WRAP_CONTENT (to match the width of the anchored view).
mDropDownWidth = a.getLayoutDimension(R.styleable.AutoCompleteTextView_dropDownWidth,
ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -240,7 +240,7 @@
/**
* <p>Returns the current width for the auto-complete drop down list. This can
- * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or
+ * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or
* {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p>
*
* @return the width for the drop down list
@@ -253,7 +253,7 @@
/**
* <p>Sets the current width for the auto-complete drop down list. This can
- * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or
+ * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or
* {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p>
*
* @param width the width to use
@@ -266,7 +266,7 @@
/**
* <p>Returns the current height for the auto-complete drop down list. This can
- * be a fixed height, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill
+ * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill
* the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height
* of the drop down's content.</p>
*
@@ -280,7 +280,7 @@
/**
* <p>Sets the current height for the auto-complete drop down list. This can
- * be a fixed height, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill
+ * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill
* the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height
* of the drop down's content.</p>
*
@@ -1129,7 +1129,7 @@
boolean noInputMethod = isInputMethodNotNeeded();
if (mPopup.isShowing()) {
- if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) {
+ if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
// The call to PopupWindow's update method below can accept -1 for any
// value you do not want to update.
widthSpec = -1;
@@ -1139,19 +1139,19 @@
widthSpec = mDropDownWidth;
}
- if (mDropDownHeight == ViewGroup.LayoutParams.FILL_PARENT) {
+ if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
// The call to PopupWindow's update method below can accept -1 for any
// value you do not want to update.
- heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.FILL_PARENT;
+ heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.MATCH_PARENT;
if (noInputMethod) {
mPopup.setWindowLayoutMode(
- mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT ?
- ViewGroup.LayoutParams.FILL_PARENT : 0, 0);
+ mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ?
+ ViewGroup.LayoutParams.MATCH_PARENT : 0, 0);
} else {
mPopup.setWindowLayoutMode(
- mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT ?
- ViewGroup.LayoutParams.FILL_PARENT : 0,
- ViewGroup.LayoutParams.FILL_PARENT);
+ mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ?
+ ViewGroup.LayoutParams.MATCH_PARENT : 0,
+ ViewGroup.LayoutParams.MATCH_PARENT);
}
} else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
heightSpec = height;
@@ -1164,8 +1164,8 @@
mPopup.update(getDropDownAnchorView(), mDropDownHorizontalOffset,
mDropDownVerticalOffset, widthSpec, heightSpec);
} else {
- if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) {
- widthSpec = ViewGroup.LayoutParams.FILL_PARENT;
+ if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
+ widthSpec = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
mPopup.setWidth(getDropDownAnchorView().getWidth());
@@ -1174,8 +1174,8 @@
}
}
- if (mDropDownHeight == ViewGroup.LayoutParams.FILL_PARENT) {
- heightSpec = ViewGroup.LayoutParams.FILL_PARENT;
+ if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
+ heightSpec = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
mPopup.setHeight(height);
@@ -1295,7 +1295,7 @@
hintContainer.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, 0, 1.0f
+ ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f
);
hintContainer.addView(dropDownView, hintParams);
hintContainer.addView(hintView);
@@ -1331,7 +1331,7 @@
final int maxHeight = mPopup.getMaxAvailableHeight(
getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations);
- if (mDropDownAlwaysVisible || mDropDownHeight == ViewGroup.LayoutParams.FILL_PARENT) {
+ if (mDropDownAlwaysVisible || mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
// getMaxAvailableHeight() subtracts the padding, so we put it back,
// to get the available height for the whole window
int padding = 0;
@@ -1485,8 +1485,8 @@
* @return the view for the specified item
*/
@Override
- protected View obtainView(int position) {
- View view = super.obtainView(position);
+ View obtainView(int position, boolean[] isScrap) {
+ View view = super.obtainView(position, isScrap);
if (view instanceof TextView) {
((TextView) view).setHorizontallyScrolling(true);
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index 3afd5d4..65a4673 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -164,12 +164,12 @@
/**
* Returns a set of layout parameters with a width of
- * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT},
- * and a height of {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}.
+ * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT},
+ * and a height of {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}.
*/
@Override
protected LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
/**
@@ -467,9 +467,9 @@
* Creates a new set of layout parameters with the specified width, height
* and weight.
*
- * @param width the width, either {@link #FILL_PARENT},
+ * @param width the width, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
- * @param height the height, either {@link #FILL_PARENT},
+ * @param height the height, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
* @param gravity the gravity
*
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index ffe9908..30a38df 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -931,11 +931,11 @@
mItemCount = mAdapter == null ? 0 : mAdapter.getCount();
final int count = mItemCount;
if (count > 0) {
- final View child = obtainView(0);
+ final View child = obtainView(0, mIsScrap);
AbsListView.LayoutParams p = (AbsListView.LayoutParams)child.getLayoutParams();
if (p == null) {
- p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
child.setLayoutParams(p);
}
@@ -1203,7 +1203,7 @@
View child;
if (!mDataChanged) {
- // Try to use an exsiting view for this position
+ // Try to use an existing view for this position
child = mRecycler.getActiveView(position);
if (child != null) {
// Found it -- we're using an existing child
@@ -1215,10 +1215,10 @@
// Make a new view for this position, or convert an unused view if
// possible
- child = obtainView(position);
+ child = obtainView(position, mIsScrap);
// This needs to be positioned and measured
- setupChild(child, position, y, flow, childrenLeft, selected, false, where);
+ setupChild(child, position, y, flow, childrenLeft, selected, mIsScrap[0], where);
return child;
}
@@ -1254,7 +1254,7 @@
// some up...
AbsListView.LayoutParams p = (AbsListView.LayoutParams)child.getLayoutParams();
if (p == null) {
- p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
}
p.viewType = mAdapter.getItemViewType(position);
diff --git a/core/java/android/widget/ImageButton.java b/core/java/android/widget/ImageButton.java
index d417e40..5c05170 100644
--- a/core/java/android/widget/ImageButton.java
+++ b/core/java/android/widget/ImageButton.java
@@ -44,11 +44,11 @@
* <pre>
* <?xml version="1.0" encoding="utf-8"?>
* <selector xmlns:android="http://schemas.android.com/apk/res/android">
- * <item android:drawable="@drawable/button_normal" /> <!-- default -->
* <item android:state_pressed="true"
* android:drawable="@drawable/button_pressed" /> <!-- pressed -->
* <item android:state_focused="true"
* android:drawable="@drawable/button_focused" /> <!-- focused -->
+ * <item android:drawable="@drawable/button_normal" /> <!-- default -->
* </selector></pre>
*
* <p>Save the XML file in your project {@code res/drawable/} folder and then
@@ -57,6 +57,11 @@
* based on the state of the button and the corresponding images
* defined in the XML.</p>
*
+ * <p>The order of the {@code <item>} elements is important because they are
+ * evaluated in order. This is why the "normal" button image comes last, because
+ * it will only be applied after {@code android:state_pressed} and {@code
+ * android:state_focused} have both evaluated false.</p>
+ *
* <p><strong>XML attributes</strong></p>
* <p>
* See {@link android.R.styleable#ImageView Button Attributes},
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 8f24041..3853359 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -491,8 +491,16 @@
}
} else if (mUri != null) {
String scheme = mUri.getScheme();
- if (ContentResolver.SCHEME_CONTENT.equals(scheme)
- || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)
+ if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
+ try {
+ // Load drawable through Resources, to get the source density information
+ ContentResolver.OpenResourceIdResult r =
+ mContext.getContentResolver().getResourceId(mUri);
+ d = r.r.getDrawable(r.id);
+ } catch (Exception e) {
+ Log.w("ImageView", "Unable to open content: " + mUri, e);
+ }
+ } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)
|| ContentResolver.SCHEME_FILE.equals(scheme)) {
try {
d = Drawable.createFromStream(
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 6cc794b..37372c5 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -378,7 +378,7 @@
}
boolean matchWidthLocally = false;
- if (widthMode != MeasureSpec.EXACTLY && lp.width == LayoutParams.FILL_PARENT) {
+ if (widthMode != MeasureSpec.EXACTLY && lp.width == LayoutParams.MATCH_PARENT) {
// The width of the linear layout will scale, and at least one
// child said it wanted to match our width. Set a flag
// indicating that we need to remeasure at least that view when
@@ -391,7 +391,7 @@
final int measuredWidth = child.getMeasuredWidth() + margin;
maxWidth = Math.max(maxWidth, measuredWidth);
- allFillParent = allFillParent && lp.width == LayoutParams.FILL_PARENT;
+ allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT;
if (lp.weight > 0) {
/*
* Widths of weighted Views are bogus if we end up
@@ -472,12 +472,12 @@
maxWidth = Math.max(maxWidth, measuredWidth);
boolean matchWidthLocally = widthMode != MeasureSpec.EXACTLY &&
- lp.width == LayoutParams.FILL_PARENT;
+ lp.width == LayoutParams.MATCH_PARENT;
alternativeMaxWidth = Math.max(alternativeMaxWidth,
matchWidthLocally ? margin : measuredWidth);
- allFillParent = allFillParent && lp.width == LayoutParams.FILL_PARENT;
+ allFillParent = allFillParent && lp.width == LayoutParams.MATCH_PARENT;
mTotalLength += child.getMeasuredHeight() + lp.topMargin +
lp.bottomMargin + getNextLocationOffset(child);
@@ -515,7 +515,7 @@
if (child.getVisibility() != GONE) {
LinearLayout.LayoutParams lp = ((LinearLayout.LayoutParams)child.getLayoutParams());
- if (lp.width == LayoutParams.FILL_PARENT) {
+ if (lp.width == LayoutParams.MATCH_PARENT) {
// Temporarily force children to reuse their old measured height
// FIXME: this may not be right for something like wrapping text?
int oldHeight = lp.height;
@@ -629,7 +629,7 @@
}
boolean matchHeightLocally = false;
- if (heightMode != MeasureSpec.EXACTLY && lp.height == LayoutParams.FILL_PARENT) {
+ if (heightMode != MeasureSpec.EXACTLY && lp.height == LayoutParams.MATCH_PARENT) {
// The height of the linear layout will scale, and at least one
// child said it wanted to match our height. Set a flag indicating that
// we need to remeasure at least that view when we know our height.
@@ -657,7 +657,7 @@
maxHeight = Math.max(maxHeight, childHeight);
- allFillParent = allFillParent && lp.height == LayoutParams.FILL_PARENT;
+ allFillParent = allFillParent && lp.height == LayoutParams.MATCH_PARENT;
if (lp.weight > 0) {
/*
* Heights of weighted Views are bogus if we end up
@@ -758,7 +758,7 @@
lp.rightMargin + getNextLocationOffset(child);
boolean matchHeightLocally = heightMode != MeasureSpec.EXACTLY &&
- lp.height == LayoutParams.FILL_PARENT;
+ lp.height == LayoutParams.MATCH_PARENT;
final int margin = lp.topMargin + lp .bottomMargin;
int childHeight = child.getMeasuredHeight() + margin;
@@ -766,7 +766,7 @@
alternativeMaxHeight = Math.max(alternativeMaxHeight,
matchHeightLocally ? margin : childHeight);
- allFillParent = allFillParent && lp.height == LayoutParams.FILL_PARENT;
+ allFillParent = allFillParent && lp.height == LayoutParams.MATCH_PARENT;
if (baselineAligned) {
final int childBaseline = child.getBaseline();
@@ -832,7 +832,7 @@
if (child.getVisibility() != GONE) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
- if (lp.height == LayoutParams.FILL_PARENT) {
+ if (lp.height == LayoutParams.MATCH_PARENT) {
// Temporarily force children to reuse their old measured width
// FIXME: this may not be right for something like wrapping text?
int oldWidth = lp.width;
@@ -991,6 +991,9 @@
case Gravity.RIGHT:
childLeft = childRight - childWidth - lp.rightMargin;
break;
+ default:
+ childLeft = paddingLeft;
+ break;
}
@@ -1062,7 +1065,7 @@
final LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) child.getLayoutParams();
- if (baselineAligned && lp.height != LayoutParams.FILL_PARENT) {
+ if (baselineAligned && lp.height != LayoutParams.MATCH_PARENT) {
childBaseline = child.getBaseline();
}
@@ -1102,6 +1105,9 @@
childTop -= (maxDescent[INDEX_BOTTOM] - descent);
}
break;
+ default:
+ childTop = paddingTop;
+ break;
}
childLeft += lp.leftMargin;
@@ -1193,7 +1199,7 @@
/**
* Returns a set of layout parameters with a width of
- * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}
+ * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}
* and a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}
* when the layout's orientation is {@link #VERTICAL}. When the orientation is
* {@link #HORIZONTAL}, the width is set to {@link LayoutParams#WRAP_CONTENT}
@@ -1204,7 +1210,7 @@
if (mOrientation == HORIZONTAL) {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
} else if (mOrientation == VERTICAL) {
- return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
+ return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
return null;
}
@@ -1284,9 +1290,9 @@
* Creates a new set of layout parameters with the specified width, height
* and weight.
*
- * @param width the width, either {@link #FILL_PARENT},
+ * @param width the width, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
- * @param height the height, either {@link #FILL_PARENT},
+ * @param height the height, either {@link #MATCH_PARENT},
* {@link #WRAP_CONTENT} or a fixed size in pixels
* @param weight the weight
*/
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index b574d45..c63774a 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -1033,7 +1033,7 @@
mItemCount = mAdapter == null ? 0 : mAdapter.getCount();
if (mItemCount > 0 && (widthMode == MeasureSpec.UNSPECIFIED ||
heightMode == MeasureSpec.UNSPECIFIED)) {
- final View child = obtainView(0);
+ final View child = obtainView(0, mIsScrap);
measureScrapChild(child, 0, widthMeasureSpec);
@@ -1067,7 +1067,7 @@
private void measureScrapChild(View child, int position, int widthMeasureSpec) {
LayoutParams p = (LayoutParams) child.getLayoutParams();
if (p == null) {
- p = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ p = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
child.setLayoutParams(p);
}
@@ -1142,9 +1142,10 @@
endPosition = (endPosition == NO_POSITION) ? adapter.getCount() - 1 : endPosition;
final AbsListView.RecycleBin recycleBin = mRecycler;
final boolean recyle = recycleOnMeasure();
+ final boolean[] isScrap = mIsScrap;
for (i = startPosition; i <= endPosition; ++i) {
- child = obtainView(i);
+ child = obtainView(i, isScrap);
measureScrapChild(child, i, widthMeasureSpec);
@@ -1665,10 +1666,10 @@
}
// Make a new view for this position, or convert an unused view if possible
- child = obtainView(position);
+ child = obtainView(position, mIsScrap);
// This needs to be positioned and measured
- setupChild(child, position, y, flow, childrenLeft, selected, false);
+ setupChild(child, position, y, flow, childrenLeft, selected, mIsScrap[0]);
return child;
}
@@ -1701,7 +1702,7 @@
// noinspection unchecked
AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
- p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ p = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
}
p.viewType = mAdapter.getItemViewType(position);
@@ -2387,7 +2388,7 @@
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
@@ -2823,17 +2824,19 @@
private View addViewAbove(View theView, int position) {
int abovePosition = position - 1;
- View view = obtainView(abovePosition);
+ View view = obtainView(abovePosition, mIsScrap);
int edgeOfNewChild = theView.getTop() - mDividerHeight;
- setupChild(view, abovePosition, edgeOfNewChild, false, mListPadding.left, false, false);
+ setupChild(view, abovePosition, edgeOfNewChild, false, mListPadding.left,
+ false, mIsScrap[0]);
return view;
}
private View addViewBelow(View theView, int position) {
int belowPosition = position + 1;
- View view = obtainView(belowPosition);
+ View view = obtainView(belowPosition, mIsScrap);
int edgeOfNewChild = theView.getBottom() + mDividerHeight;
- setupChild(view, belowPosition, edgeOfNewChild, true, mListPadding.left, false, false);
+ setupChild(view, belowPosition, edgeOfNewChild, true, mListPadding.left,
+ false, mIsScrap[0]);
return view;
}
@@ -3080,13 +3083,19 @@
if (gainFocus && previouslyFocusedRect != null) {
previouslyFocusedRect.offset(mScrollX, mScrollY);
+ final ListAdapter adapter = mAdapter;
+ final int firstPosition = mFirstPosition;
+ // Don't cache the result of getChildCount here, it could change in layoutChildren.
+ if (adapter.getCount() < getChildCount() + firstPosition) {
+ mLayoutMode = LAYOUT_NORMAL;
+ layoutChildren();
+ }
+
// figure out which item should be selected based on previously
// focused rect
Rect otherRect = mTempRect;
int minDistance = Integer.MAX_VALUE;
final int childCount = getChildCount();
- final int firstPosition = mFirstPosition;
- final ListAdapter adapter = mAdapter;
for (int i = 0; i < childCount; i++) {
// only consider selectable views
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index 446a992..c246c247 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -167,8 +167,8 @@
mAnchor = view;
FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
);
removeAllViews();
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index e4cc609..d20ab3b 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -569,7 +569,7 @@
* the current width or height is requested as an explicit size from
* the window manager. You can supply
* {@link ViewGroup.LayoutParams#WRAP_CONTENT} or
- * {@link ViewGroup.LayoutParams#FILL_PARENT} to have that measure
+ * {@link ViewGroup.LayoutParams#MATCH_PARENT} to have that measure
* spec supplied instead, replacing the absolute width and height that
* has been set in the popup.</p>
*
@@ -578,11 +578,11 @@
*
* @param widthSpec an explicit width measure spec mode, either
* {@link ViewGroup.LayoutParams#WRAP_CONTENT},
- * {@link ViewGroup.LayoutParams#FILL_PARENT}, or 0 to use the absolute
+ * {@link ViewGroup.LayoutParams#MATCH_PARENT}, or 0 to use the absolute
* width.
* @param heightSpec an explicit height measure spec mode, either
* {@link ViewGroup.LayoutParams#WRAP_CONTENT},
- * {@link ViewGroup.LayoutParams#FILL_PARENT}, or 0 to use the absolute
+ * {@link ViewGroup.LayoutParams#MATCH_PARENT}, or 0 to use the absolute
* height.
*/
public void setWindowLayoutMode(int widthSpec, int heightSpec) {
@@ -785,7 +785,7 @@
if (mBackground != null) {
final ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams();
- int height = ViewGroup.LayoutParams.FILL_PARENT;
+ int height = ViewGroup.LayoutParams.MATCH_PARENT;
if (layoutParams != null &&
layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
height = ViewGroup.LayoutParams.WRAP_CONTENT;
@@ -795,7 +795,7 @@
// within another view that owns the background drawable
PopupViewContainer popupViewContainer = new PopupViewContainer(mContext);
PopupViewContainer.LayoutParams listParams = new PopupViewContainer.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, height
+ ViewGroup.LayoutParams.MATCH_PARENT, height
);
popupViewContainer.setBackgroundDrawable(mBackground);
popupViewContainer.addView(mContentView, listParams);
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e19a93d..1aa1df3 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -45,8 +45,7 @@
/**
* A Layout where the positions of the children can be described in relation to each other or to the
- * parent. For the sake of efficiency, the relations between views are evaluated in one pass, so if
- * view Y is dependent on the position of view X, make sure the view X comes first in the layout.
+ * parent.
*
* <p>
* Note that you cannot have a circular dependency between the size of the RelativeLayout and the
@@ -292,6 +291,8 @@
}
}
+ // TODO: we need to find another way to implement RelativeLayout
+ // This implementation cannot handle every case
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mDirtyHierarchy) {
@@ -439,6 +440,10 @@
final int[] rules = params.getRules();
if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {
centerHorizontal(child, params, width);
+ } else if (rules[ALIGN_PARENT_RIGHT] != 0) {
+ final int childWidth = child.getMeasuredWidth();
+ params.mLeft = width - mPaddingRight - childWidth;
+ params.mRight = params.mLeft + childWidth;
}
}
}
@@ -465,6 +470,10 @@
final int[] rules = params.getRules();
if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_VERTICAL] != 0) {
centerVertical(child, params, height);
+ } else if (rules[ALIGN_PARENT_BOTTOM] != 0) {
+ final int childHeight = child.getMeasuredHeight();
+ params.mTop = height - mPaddingBottom - childHeight;
+ params.mBottom = params.mTop + childHeight;
}
}
}
@@ -561,7 +570,7 @@
mPaddingLeft, mPaddingRight,
myWidth);
int childHeightMeasureSpec;
- if (params.width == LayoutParams.FILL_PARENT) {
+ if (params.width == LayoutParams.MATCH_PARENT) {
childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.EXACTLY);
} else {
childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.AT_MOST);
@@ -623,7 +632,7 @@
// We can grow in this dimension.
childSpecSize = childSize;
}
- } else if (childSize == LayoutParams.FILL_PARENT) {
+ } else if (childSize == LayoutParams.MATCH_PARENT) {
// Child wanted to be as big as possible. Give all availble
// space
childSpecMode = MeasureSpec.EXACTLY;
@@ -674,7 +683,7 @@
params.mRight = params.mLeft + child.getMeasuredWidth();
}
}
- return false;
+ return rules[ALIGN_PARENT_RIGHT] != 0;
}
private boolean positionChildVertical(View child, LayoutParams params, int myHeight,
@@ -703,7 +712,7 @@
params.mBottom = params.mTop + child.getMeasuredHeight();
}
}
- return false;
+ return rules[ALIGN_PARENT_BOTTOM] != 0;
}
private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth) {
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index b847e57..3003580 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -26,6 +26,7 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -37,7 +38,6 @@
import android.view.LayoutInflater.Filter;
import android.view.View.OnClickListener;
-import java.lang.Class;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -137,11 +137,21 @@
if (target != null && pendingIntent != null) {
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
- int[] pos = new int[2];
+ // Find target view location in screen coordinates and
+ // fill into PendingIntent before sending.
+ final float appScale = v.getContext().getResources()
+ .getCompatibilityInfo().applicationScale;
+ final int[] pos = new int[2];
v.getLocationOnScreen(pos);
- Intent intent = new Intent();
- intent.setSourceBounds(new Rect(pos[0], pos[1],
- pos[0]+v.getWidth(), pos[1]+v.getHeight()));
+
+ final Rect rect = new Rect();
+ rect.left = (int) (pos[0] * appScale + 0.5f);
+ rect.top = (int) (pos[1] * appScale + 0.5f);
+ rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f);
+ rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f);
+
+ final Intent intent = new Intent();
+ intent.setSourceBounds(rect);
try {
// TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
v.getContext().startIntentSender(
@@ -273,6 +283,7 @@
static final int CHAR_SEQUENCE = 10;
static final int URI = 11;
static final int BITMAP = 12;
+ static final int BUNDLE = 13;
int viewId;
String methodName;
@@ -332,6 +343,9 @@
case BITMAP:
this.value = Bitmap.CREATOR.createFromParcel(in);
break;
+ case BUNDLE:
+ this.value = in.readBundle();
+ break;
default:
break;
}
@@ -384,6 +398,9 @@
case BITMAP:
((Bitmap)this.value).writeToParcel(out, flags);
break;
+ case BUNDLE:
+ out.writeBundle((Bundle) this.value);
+ break;
default:
break;
}
@@ -415,6 +432,8 @@
return Uri.class;
case BITMAP:
return Bitmap.class;
+ case BUNDLE:
+ return Bundle.class;
default:
return null;
}
@@ -876,6 +895,17 @@
}
/**
+ * Call a method taking one Bundle on a view in the layout for this RemoteViews.
+ *
+ * @param viewId The id of the view whose text should change
+ * @param methodName The name of the method to call.
+ * @param value The value to pass to the method.
+ */
+ public void setBundle(int viewId, String methodName, Bundle value) {
+ addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value));
+ }
+
+ /**
* Inflates the view hierarchy represented by this object and applies
* all of the actions.
*
diff --git a/core/java/android/widget/SimpleAdapter.java b/core/java/android/widget/SimpleAdapter.java
index 9dd4d15..479965a 100644
--- a/core/java/android/widget/SimpleAdapter.java
+++ b/core/java/android/widget/SimpleAdapter.java
@@ -25,7 +25,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.WeakHashMap;
/**
* An easy adapter to map static data to views defined in an XML file. You can specify the data
@@ -58,7 +57,6 @@
private int mResource;
private int mDropDownResource;
private LayoutInflater mInflater;
- private final WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>();
private SimpleFilter mFilter;
private ArrayList<Map<String, ?>> mUnfilteredData;
@@ -121,16 +119,6 @@
View v;
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
-
- final int[] to = mTo;
- final int count = to.length;
- final View[] holder = new View[count];
-
- for (int i = 0; i < count; i++) {
- holder[i] = v.findViewById(to[i]);
- }
-
- mHolders.put(v, holder);
} else {
v = convertView;
}
@@ -162,13 +150,12 @@
}
final ViewBinder binder = mViewBinder;
- final View[] holder = mHolders.get(view);
final String[] from = mFrom;
final int[] to = mTo;
final int count = to.length;
for (int i = 0; i < count; i++) {
- final View v = holder[i];
+ final View v = view.findViewById(to[i]);
if (v != null) {
final Object data = dataSet.get(from[i]);
String text = data == null ? "" : data.toString();
@@ -187,7 +174,8 @@
((Checkable) v).setChecked((Boolean) data);
} else {
throw new IllegalStateException(v.getClass().getName() +
- " should be bound to a Boolean, not a " + data.getClass());
+ " should be bound to a Boolean, not a " +
+ (data == null ? "<unknown type>" : data.getClass()));
}
} else if (v instanceof TextView) {
// Note: keep the instanceof TextView check at the bottom of these
diff --git a/core/java/android/widget/SimpleCursorAdapter.java b/core/java/android/widget/SimpleCursorAdapter.java
index 436b79b..7d3459e 100644
--- a/core/java/android/widget/SimpleCursorAdapter.java
+++ b/core/java/android/widget/SimpleCursorAdapter.java
@@ -20,9 +20,6 @@
import android.database.Cursor;
import android.net.Uri;
import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.WeakHashMap;
/**
* An easy adapter to map columns from a cursor to TextViews or ImageViews
@@ -66,7 +63,6 @@
private CursorToStringConverter mCursorToStringConverter;
private ViewBinder mViewBinder;
private String[] mOriginalFrom;
- private final WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>();
/**
* Constructor.
@@ -91,29 +87,6 @@
findColumns(from);
}
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return generateViewHolder(super.newView(context, cursor, parent));
- }
-
- @Override
- public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {
- return generateViewHolder(super.newDropDownView(context, cursor, parent));
- }
-
- private View generateViewHolder(View v) {
- final int[] to = mTo;
- final int count = to.length;
- final View[] holder = new View[count];
-
- for (int i = 0; i < count; i++) {
- holder[i] = v.findViewById(to[i]);
- }
- mHolders.put(v, holder);
-
- return v;
- }
-
/**
* Binds all of the field names passed into the "to" parameter of the
* constructor with their corresponding cursor columns as specified in the
@@ -140,13 +113,13 @@
*/
@Override
public void bindView(View view, Context context, Cursor cursor) {
- final View[] holder = mHolders.get(view);
final ViewBinder binder = mViewBinder;
final int count = mTo.length;
final int[] from = mFrom;
+ final int[] to = mTo;
for (int i = 0; i < count; i++) {
- final View v = holder[i];
+ final View v = view.findViewById(to[i]);
if (v != null) {
boolean bound = false;
if (binder != null) {
diff --git a/core/java/android/widget/SlidingDrawer.java b/core/java/android/widget/SlidingDrawer.java
index f706744..11d72de 100644
--- a/core/java/android/widget/SlidingDrawer.java
+++ b/core/java/android/widget/SlidingDrawer.java
@@ -43,7 +43,7 @@
* SlidingDrawer should be used as an overlay inside layouts. This means SlidingDrawer
* should only be used inside of a FrameLayout or a RelativeLayout for instance. The
* size of the SlidingDrawer defines how much space the content will occupy once slid
- * out so SlidingDrawer should usually use fill_parent for both its dimensions.
+ * out so SlidingDrawer should usually use match_parent for both its dimensions.
*
* Inside an XML layout, SlidingDrawer must define the id of the handle and of the
* content:
@@ -51,8 +51,8 @@
* <pre class="prettyprint">
* <SlidingDrawer
* android:id="@+id/drawer"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
*
* android:handle="@+id/handle"
* android:content="@+id/content">
@@ -64,8 +64,8 @@
*
* <GridView
* android:id="@id/content"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent" />
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent" />
*
* </SlidingDrawer>
* </pre>
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 412f817..78e2fee 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -327,8 +327,8 @@
.addView(
mCurrentView,
new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
}
if (!mTabWidget.hasFocus()) {
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index c12d098..aa47e6d 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -26,7 +24,6 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnFocusChangeListener;
@@ -313,7 +310,7 @@
if (child.getLayoutParams() == null) {
final LinearLayout.LayoutParams lp = new LayoutParams(
0,
- ViewGroup.LayoutParams.FILL_PARENT, 1.0f);
+ ViewGroup.LayoutParams.MATCH_PARENT, 1.0f);
lp.setMargins(0, 0, 0, 0);
child.setLayoutParams(lp);
}
@@ -328,7 +325,7 @@
ImageView divider = new ImageView(mContext);
final LinearLayout.LayoutParams lp = new LayoutParams(
mDividerDrawable.getIntrinsicWidth(),
- LayoutParams.FILL_PARENT);
+ LayoutParams.MATCH_PARENT);
lp.setMargins(0, 0, 0, 0);
divider.setLayoutParams(lp);
divider.setBackgroundDrawable(mDividerDrawable);
diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java
index afa2f3b..66500a3 100644
--- a/core/java/android/widget/TableLayout.java
+++ b/core/java/android/widget/TableLayout.java
@@ -52,7 +52,7 @@
* {@link #setColumnCollapsed(int,boolean) setColumnCollapsed()}.</p>
*
* <p>The children of a TableLayout cannot specify the <code>layout_width</code>
- * attribute. Width is always <code>FILL_PARENT</code>. However, the
+ * attribute. Width is always <code>MATCH_PARENT</code>. However, the
* <code>layout_height</code> attribute can be defined by a child; default value
* is {@link android.widget.TableLayout.LayoutParams#WRAP_CONTENT}. If the child
* is a {@link android.widget.TableRow}, then the height is always
@@ -621,7 +621,7 @@
/**
* Returns a set of layout parameters with a width of
- * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT},
+ * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT},
* and a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.
*/
@Override
@@ -647,7 +647,7 @@
/**
* <p>This set of layout parameters enforces the width of each child to be
- * {@link #FILL_PARENT} and the height of each child to be
+ * {@link #MATCH_PARENT} and the height of each child to be
* {@link #WRAP_CONTENT}, but only if the height is not specified.</p>
*/
@SuppressWarnings({"UnusedDeclaration"})
@@ -663,14 +663,14 @@
* {@inheritDoc}
*/
public LayoutParams(int w, int h) {
- super(FILL_PARENT, h);
+ super(MATCH_PARENT, h);
}
/**
* {@inheritDoc}
*/
public LayoutParams(int w, int h, float initWeight) {
- super(FILL_PARENT, h, initWeight);
+ super(MATCH_PARENT, h, initWeight);
}
/**
@@ -679,7 +679,7 @@
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p>
*/
public LayoutParams() {
- super(FILL_PARENT, WRAP_CONTENT);
+ super(MATCH_PARENT, WRAP_CONTENT);
}
/**
@@ -698,7 +698,7 @@
/**
* <p>Fixes the row's width to
- * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}; the row's
+ * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}; the row's
* height is fixed to
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} if no layout
* height is specified.</p>
@@ -710,7 +710,7 @@
@Override
protected void setBaseAttributes(TypedArray a,
int widthAttr, int heightAttr) {
- this.width = FILL_PARENT;
+ this.width = MATCH_PARENT;
if (a.hasValue(heightAttr)) {
this.height = a.getLayoutDimension(heightAttr, "layout_height");
} else {
diff --git a/core/java/android/widget/TableRow.java b/core/java/android/widget/TableRow.java
index 5628cab..abf08bf 100644
--- a/core/java/android/widget/TableRow.java
+++ b/core/java/android/widget/TableRow.java
@@ -35,7 +35,7 @@
* <p>The children of a TableRow do not need to specify the
* <code>layout_width</code> and <code>layout_height</code> attributes in the
* XML file. TableRow always enforces those values to be respectively
- * {@link android.widget.TableLayout.LayoutParams#FILL_PARENT} and
+ * {@link android.widget.TableLayout.LayoutParams#MATCH_PARENT} and
* {@link android.widget.TableLayout.LayoutParams#WRAP_CONTENT}.</p>
*
* <p>
@@ -299,7 +299,7 @@
case LayoutParams.WRAP_CONTENT:
spec = getChildMeasureSpec(widthMeasureSpec, 0, LayoutParams.WRAP_CONTENT);
break;
- case LayoutParams.FILL_PARENT:
+ case LayoutParams.MATCH_PARENT:
spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
break;
default:
@@ -351,7 +351,7 @@
/**
* Returns a set of layout parameters with a width of
- * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT},
+ * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT},
* a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and no spanning.
*/
@Override
@@ -451,7 +451,7 @@
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p>
*/
public LayoutParams() {
- super(FILL_PARENT, WRAP_CONTENT);
+ super(MATCH_PARENT, WRAP_CONTENT);
column = -1;
span = 1;
}
@@ -459,7 +459,7 @@
/**
* <p>Puts the view in the specified column.</p>
*
- * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}
+ * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}
* and the child height to
* {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p>
*
@@ -490,7 +490,7 @@
if (a.hasValue(widthAttr)) {
width = a.getLayoutDimension(widthAttr, "layout_width");
} else {
- width = FILL_PARENT;
+ width = MATCH_PARENT;
}
// We don't want to force users to specify a layout_height
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 201cc0c..12e8e29 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -4531,6 +4531,11 @@
// Now use the delta to determine the actual amount of text
// we need.
partialEndOffset += delta;
+ if (partialStartOffset > N) {
+ partialStartOffset = N;
+ } else if (partialStartOffset < 0) {
+ partialStartOffset = 0;
+ }
if (partialEndOffset > N) {
partialEndOffset = N;
} else if (partialEndOffset < 0) {
@@ -4987,7 +4992,7 @@
final int height = mLayoutParams.height;
// If the size of the view does not depend on the size of the text, try to
// start the marquee immediately
- if (height != LayoutParams.WRAP_CONTENT && height != LayoutParams.FILL_PARENT) {
+ if (height != LayoutParams.WRAP_CONTENT && height != LayoutParams.MATCH_PARENT) {
startMarquee();
} else {
// Defer the start of the marquee until we know our width (see setFrame())
@@ -5302,7 +5307,7 @@
if (desiredHeight != this.getHeight()) {
sizeChanged = true;
}
- } else if (mLayoutParams.height == LayoutParams.FILL_PARENT) {
+ } else if (mLayoutParams.height == LayoutParams.MATCH_PARENT) {
if (mDesiredHeightAtMeasure >= 0) {
int desiredHeight = getDesiredHeight();
@@ -5349,7 +5354,7 @@
if (mEllipsize != TextUtils.TruncateAt.MARQUEE) {
// In a fixed-height view, so use our new text layout.
if (mLayoutParams.height != LayoutParams.WRAP_CONTENT &&
- mLayoutParams.height != LayoutParams.FILL_PARENT) {
+ mLayoutParams.height != LayoutParams.MATCH_PARENT) {
invalidate();
return;
}
diff --git a/core/java/android/widget/ViewSwitcher.java b/core/java/android/widget/ViewSwitcher.java
index 0dcaf95..71ae624 100644
--- a/core/java/android/widget/ViewSwitcher.java
+++ b/core/java/android/widget/ViewSwitcher.java
@@ -80,7 +80,7 @@
View child = mFactory.makeView();
LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp == null) {
- lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
+ lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
addView(child, lp);
return child;
diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java
index e55fbb8..bea009c0 100644
--- a/core/java/android/widget/ZoomButtonsController.java
+++ b/core/java/android/widget/ZoomButtonsController.java
@@ -247,7 +247,7 @@
LayoutParams.FLAG_LAYOUT_NO_LIMITS |
LayoutParams.FLAG_ALT_FOCUSABLE_IM;
lp.height = LayoutParams.WRAP_CONTENT;
- lp.width = LayoutParams.FILL_PARENT;
+ lp.width = LayoutParams.MATCH_PARENT;
lp.type = LayoutParams.TYPE_APPLICATION_PANEL;
lp.format = PixelFormat.TRANSLUCENT;
lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons;
diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java
index 57dbb44..f56b15c 100644
--- a/core/java/com/android/internal/app/AlertController.java
+++ b/core/java/com/android/internal/app/AlertController.java
@@ -16,7 +16,7 @@
package com.android.internal.app;
-import static android.view.ViewGroup.LayoutParams.FILL_PARENT;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -361,7 +361,7 @@
if (mView != null) {
customPanel = (FrameLayout) mWindow.findViewById(R.id.customPanel);
FrameLayout custom = (FrameLayout) mWindow.findViewById(R.id.custom);
- custom.addView(mView, new LayoutParams(FILL_PARENT, FILL_PARENT));
+ custom.addView(mView, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
if (mViewSpacingSpecified) {
custom.setPadding(mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight,
mViewSpacingBottom);
@@ -391,7 +391,7 @@
if (mCustomTitleView != null) {
// Add the custom title view directly to the topPanel layout
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
+ LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
topPanel.addView(mCustomTitleView, lp);
@@ -460,8 +460,8 @@
if (mListView != null) {
contentPanel.removeView(mWindow.findViewById(R.id.scrollView));
contentPanel.addView(mListView,
- new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT));
- contentPanel.setLayoutParams(new LinearLayout.LayoutParams(FILL_PARENT, 0, 1.0f));
+ new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
+ contentPanel.setLayoutParams(new LinearLayout.LayoutParams(MATCH_PARENT, 0, 1.0f));
} else {
contentPanel.setVisibility(View.GONE);
}
@@ -657,8 +657,8 @@
ViewGroup parent = (ViewGroup) mWindow.findViewById(R.id.parentPanel);
parent.removeView(buttonPanel);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
- AbsListView.LayoutParams.FILL_PARENT,
- AbsListView.LayoutParams.FILL_PARENT);
+ AbsListView.LayoutParams.MATCH_PARENT,
+ AbsListView.LayoutParams.MATCH_PARENT);
buttonPanel.setLayoutParams(params);
mListView.addFooterView(buttonPanel);
*/
diff --git a/core/java/com/android/internal/app/ExternalMediaFormatActivity.java b/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
index 000f6c4..2b07ae6 100644
--- a/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
+++ b/core/java/com/android/internal/app/ExternalMediaFormatActivity.java
@@ -102,7 +102,7 @@
.getService("mount"));
if (mountService != null) {
try {
- mountService.formatMedia(Environment.getExternalStorageDirectory().toString());
+ mountService.formatVolume(Environment.getExternalStorageDirectory().toString());
} catch (RemoteException e) {
}
}
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java
index 2060cf8..c110f95 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/core/java/com/android/internal/app/ShutdownThread.java
@@ -32,6 +32,7 @@
import android.os.Power;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.IMountService;
import com.android.internal.telephony.ITelephony;
import android.util.Log;
@@ -189,6 +190,10 @@
final IBluetooth bluetooth =
IBluetooth.Stub.asInterface(ServiceManager.checkService(
BluetoothAdapter.BLUETOOTH_SERVICE));
+
+ final IMountService mount =
+ IMountService.Stub.asInterface(
+ ServiceManager.checkService("mount"));
try {
bluetoothOff = bluetooth == null ||
@@ -241,6 +246,17 @@
SystemClock.sleep(PHONE_STATE_POLL_SLEEP_MSEC);
}
+ // Shutdown MountService to ensure media is in a safe state
+ try {
+ if (mount != null) {
+ mount.shutdown();
+ } else {
+ Log.w(TAG, "MountService unavailable for shutdown");
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Exception during MountService shutdown", e);
+ }
+
//shutdown power
Log.i(TAG, "Performing low-level shutdown...");
Power.shutdown();
diff --git a/core/java/com/android/internal/logging/AndroidHandler.java b/core/java/com/android/internal/logging/AndroidHandler.java
index c4a1479..12f6a4f 100644
--- a/core/java/com/android/internal/logging/AndroidHandler.java
+++ b/core/java/com/android/internal/logging/AndroidHandler.java
@@ -17,12 +17,16 @@
package com.android.internal.logging;
import android.util.Log;
+import dalvik.system.DalvikLogging;
+import dalvik.system.DalvikLogHandler;
-import java.util.logging.*;
-import java.util.Date;
-import java.text.MessageFormat;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
/**
* Implements a {@link java.util.logging.Logger} handler that writes to the Android log. The
@@ -77,7 +81,7 @@
* </tr>
* </table>
*/
-public class AndroidHandler extends Handler {
+public class AndroidHandler extends Handler implements DalvikLogHandler {
/**
* Holds the formatter for all Android log handlers.
*/
@@ -118,33 +122,13 @@
@Override
public void publish(LogRecord record) {
+ int level = getAndroidLevel(record.getLevel());
+ String tag = DalvikLogging.loggerNameToTag(record.getLoggerName());
+ if (!Log.isLoggable(tag, level)) {
+ return;
+ }
+
try {
- int level = getAndroidLevel(record.getLevel());
- String tag = record.getLoggerName();
-
- if (tag == null) {
- // Anonymous logger.
- tag = "null";
- } else {
- // Tags must be <= 23 characters.
- int length = tag.length();
- if (length > 23) {
- // Most loggers use the full class name. Try dropping the
- // package.
- int lastPeriod = tag.lastIndexOf(".");
- if (length - lastPeriod - 1 <= 23) {
- tag = tag.substring(lastPeriod + 1);
- } else {
- // Use last 23 chars.
- tag = tag.substring(tag.length() - 23);
- }
- }
- }
-
- if (!Log.isLoggable(tag, level)) {
- return;
- }
-
String message = getFormatter().format(record);
Log.println(level, tag, message);
} catch (RuntimeException e) {
@@ -152,12 +136,26 @@
}
}
+ public void publish(Logger source, String tag, Level level, String message) {
+ // TODO: avoid ducking into native 2x; we aren't saving any formatter calls
+ int priority = getAndroidLevel(level);
+ if (!Log.isLoggable(tag, priority)) {
+ return;
+ }
+
+ try {
+ Log.println(priority, tag, message);
+ } catch (RuntimeException e) {
+ Log.e("AndroidHandler", "Error logging message.", e);
+ }
+ }
+
/**
* Converts a {@link java.util.logging.Logger} logging level into an Android one.
- *
+ *
* @param level The {@link java.util.logging.Logger} logging level.
- *
- * @return The resulting Android logging level.
+ *
+ * @return The resulting Android logging level.
*/
static int getAndroidLevel(Level level) {
int value = level.intValue();
@@ -171,5 +169,4 @@
return Log.DEBUG;
}
}
-
}
diff --git a/core/java/com/android/internal/net/DbSSLSessionCache.java b/core/java/com/android/internal/net/DbSSLSessionCache.java
deleted file mode 100644
index 842d40b..0000000
--- a/core/java/com/android/internal/net/DbSSLSessionCache.java
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2009 The Android Open Source Project
-
-package com.android.internal.net;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.net.ssl.SSLSession;
-
-/**
- * Hook into harmony SSL cache to persist the SSL sessions.
- *
- * Current implementation is suitable for saving a small number of hosts -
- * like google services. It can be extended with expiration and more features
- * to support more hosts.
- *
- * {@hide}
- */
-public class DbSSLSessionCache implements SSLClientSessionCache {
- private static final String TAG = "DbSSLSessionCache";
-
- /**
- * Table where sessions are stored.
- */
- public static final String SSL_CACHE_TABLE = "ssl_sessions";
-
- private static final String SSL_CACHE_ID = "_id";
-
- /**
- * Key is host:port - port is not optional.
- */
- private static final String SSL_CACHE_HOSTPORT = "hostport";
-
- /**
- * Base64-encoded DER value of the session.
- */
- private static final String SSL_CACHE_SESSION = "session";
-
- /**
- * Time when the record was added - should be close to the time
- * of the initial session negotiation.
- */
- private static final String SSL_CACHE_TIME_SEC = "time_sec";
-
- public static final String DATABASE_NAME = "ssl_sessions.db";
-
- public static final int DATABASE_VERSION = 2;
-
- /** public for testing
- */
- public static final int SSL_CACHE_ID_COL = 0;
- public static final int SSL_CACHE_HOSTPORT_COL = 1;
- public static final int SSL_CACHE_SESSION_COL = 2;
- public static final int SSL_CACHE_TIME_SEC_COL = 3;
-
- public static final int MAX_CACHE_SIZE = 256;
-
- private final Map<String, byte[]> mExternalCache =
- new HashMap<String, byte[]>();
-
-
- private DatabaseHelper mDatabaseHelper;
-
- private boolean mNeedsCacheLoad = true;
-
- public static final String[] PROJECTION = new String[] {
- SSL_CACHE_ID,
- SSL_CACHE_HOSTPORT,
- SSL_CACHE_SESSION,
- SSL_CACHE_TIME_SEC
- };
-
- private static final Map<String,DbSSLSessionCache> sInstances =
- new HashMap<String,DbSSLSessionCache>();
-
- /**
- * Returns a singleton instance of the DbSSLSessionCache that should be used for this
- * context's package.
- *
- * @param context The context that should be used for getting/creating the singleton instance.
- * @return The singleton instance for the context's package.
- */
- public static synchronized DbSSLSessionCache getInstanceForPackage(Context context) {
- String packageName = context.getPackageName();
- if (sInstances.containsKey(packageName)) {
- return sInstances.get(packageName);
- }
- DbSSLSessionCache cache = new DbSSLSessionCache(context);
- sInstances.put(packageName, cache);
- return cache;
- }
-
- /**
- * Create a SslSessionCache instance, using the specified context to
- * initialize the database.
- *
- * This constructor will use the default database - created for the application
- * context.
- *
- * @param activityContext
- */
- private DbSSLSessionCache(Context activityContext) {
- Context appContext = activityContext.getApplicationContext();
- mDatabaseHelper = new DatabaseHelper(appContext);
- }
-
- /**
- * Create a SslSessionCache that uses a specific database.
- *
- *
- * @param database
- */
- public DbSSLSessionCache(DatabaseHelper database) {
- this.mDatabaseHelper = database;
- }
-
- public void putSessionData(SSLSession session, byte[] der) {
- if (mDatabaseHelper == null) {
- return;
- }
- synchronized (this.getClass()) {
- SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
- if (mExternalCache.size() == MAX_CACHE_SIZE) {
- // remove oldest.
- // TODO: check if the new one is in cached already ( i.e. update ).
- Cursor byTime = mDatabaseHelper.getReadableDatabase().query(SSL_CACHE_TABLE,
- PROJECTION, null, null, null, null, SSL_CACHE_TIME_SEC);
- if (byTime.moveToFirst()) {
- // TODO: can I do byTime.deleteRow() ?
- String hostPort = byTime.getString(SSL_CACHE_HOSTPORT_COL);
- db.delete(SSL_CACHE_TABLE,
- SSL_CACHE_HOSTPORT + "= ?" , new String[] { hostPort });
- mExternalCache.remove(hostPort);
- } else {
- Log.w(TAG, "No rows found");
- // something is wrong, clear it
- clear();
- }
- }
- // Serialize native session to standard DER encoding
- long t0 = System.currentTimeMillis();
-
- String b64 = new String(Base64.encodeBase64(der));
- String key = session.getPeerHost() + ":" + session.getPeerPort();
-
- ContentValues values = new ContentValues();
- values.put(SSL_CACHE_HOSTPORT, key);
- values.put(SSL_CACHE_SESSION, b64);
- values.put(SSL_CACHE_TIME_SEC, System.currentTimeMillis() / 1000);
-
- mExternalCache.put(key, der);
-
- try {
- db.insert(SSL_CACHE_TABLE, null /*nullColumnHack */ , values);
- } catch(SQLException ex) {
- // Ignore - nothing we can do to recover, and caller shouldn't
- // be affected.
- Log.w(TAG, "Ignoring SQL exception when caching session", ex);
- }
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- long t1 = System.currentTimeMillis();
- Log.d(TAG, "New SSL session " + session.getPeerHost() +
- " DER len: " + der.length + " " + (t1 - t0));
- }
- }
-
- }
-
- public byte[] getSessionData(String host, int port) {
- // Current (simple) implementation does a single lookup to DB, then saves
- // all entries to the cache.
-
- // This works for google services - i.e. small number of certs.
- // If we extend this to all processes - we should hold a separate cache
- // or do lookups to DB each time.
- if (mDatabaseHelper == null) {
- return null;
- }
- synchronized(this.getClass()) {
- if (mNeedsCacheLoad) {
- // Don't try to load again, if something is wrong on the first
- // request it'll likely be wrong each time.
- mNeedsCacheLoad = false;
- long t0 = System.currentTimeMillis();
-
- Cursor cur = null;
- try {
- cur = mDatabaseHelper.getReadableDatabase().query(SSL_CACHE_TABLE,
- PROJECTION, null, null, null, null, null);
- if (cur.moveToFirst()) {
- do {
- String hostPort = cur.getString(SSL_CACHE_HOSTPORT_COL);
- String value = cur.getString(SSL_CACHE_SESSION_COL);
-
- if (hostPort == null || value == null) {
- continue;
- }
- // TODO: blob support ?
- byte[] der = Base64.decodeBase64(value.getBytes());
- mExternalCache.put(hostPort, der);
- } while (cur.moveToNext());
-
- }
- } catch (SQLException ex) {
- Log.d(TAG, "Error loading SSL cached entries ", ex);
- } finally {
- if (cur != null) {
- cur.close();
- }
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- long t1 = System.currentTimeMillis();
- Log.d(TAG, "LOADED CACHED SSL " + (t1 - t0) + " ms");
- }
- }
- }
-
- String key = host + ":" + port;
-
- return mExternalCache.get(key);
- }
- }
-
- /**
- * Reset the database and internal state.
- * Used for testing or to free space.
- */
- public void clear() {
- synchronized(this) {
- try {
- mExternalCache.clear();
- mNeedsCacheLoad = true;
- mDatabaseHelper.getWritableDatabase().delete(SSL_CACHE_TABLE,
- null, null);
- } catch (SQLException ex) {
- Log.d(TAG, "Error removing SSL cached entries ", ex);
- // ignore - nothing we can do about it
- }
- }
- }
-
- public byte[] getSessionData(byte[] id) {
- // We support client side only - the cache will do nothing for
- // server-side sessions.
- return null;
- }
-
- /** Visible for testing.
- */
- public static class DatabaseHelper extends SQLiteOpenHelper {
-
- public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null /* factory */, DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("CREATE TABLE " + SSL_CACHE_TABLE + " (" +
- SSL_CACHE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- SSL_CACHE_HOSTPORT + " TEXT UNIQUE ON CONFLICT REPLACE," +
- SSL_CACHE_SESSION + " TEXT," +
- SSL_CACHE_TIME_SEC + " INTEGER" +
- ");");
-
- // No index - we load on startup, index would slow down inserts.
- // If we want to scale this to lots of rows - we could use
- // index, but then we'll hit DB a bit too often ( including
- // negative hits )
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- db.execSQL("DROP TABLE IF EXISTS " + SSL_CACHE_TABLE );
- onCreate(db);
- }
-
- }
-
-}
diff --git a/core/java/com/android/internal/os/LoggingPrintStream.java b/core/java/com/android/internal/os/LoggingPrintStream.java
index b3d6f20..451340b 100644
--- a/core/java/com/android/internal/os/LoggingPrintStream.java
+++ b/core/java/com/android/internal/os/LoggingPrintStream.java
@@ -16,11 +16,17 @@
package com.android.internal.os;
-import java.io.PrintStream;
-import java.io.OutputStream;
import java.io.IOException;
-import java.util.Locale;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
+import java.nio.charset.CodingErrorAction;
import java.util.Formatter;
+import java.util.Locale;
/**
* A print stream which logs output line by line.
@@ -31,6 +37,27 @@
private final StringBuilder builder = new StringBuilder();
+ /**
+ * A buffer that is initialized when raw bytes are first written to this
+ * stream. It may contain the leading bytes of multi-byte characters.
+ * Between writes this buffer is always ready to receive data; ie. the
+ * position is at the first unassigned byte and the limit is the capacity.
+ */
+ private ByteBuffer encodedBytes;
+
+ /**
+ * A buffer that is initialized when raw bytes are first written to this
+ * stream. Between writes this buffer is always clear; ie. the position is
+ * zero and the limit is the capacity.
+ */
+ private CharBuffer decodedChars;
+
+ /**
+ * Decodes bytes to characters using the system default charset. Initialized
+ * when raw bytes are first written to this stream.
+ */
+ private CharsetDecoder decoder;
+
protected LoggingPrintStream() {
super(new OutputStream() {
public void write(int oneByte) throws IOException {
@@ -80,20 +107,48 @@
}
}
- /*
- * We have no idea of how these bytes are encoded, so just ignore them.
- */
+ public void write(int oneByte) {
+ write(new byte[] { (byte) oneByte }, 0, 1);
+ }
- /** Ignored. */
- public void write(int oneByte) {}
-
- /** Ignored. */
@Override
- public void write(byte buffer[]) {}
+ public void write(byte[] buffer) {
+ write(buffer, 0, buffer.length);
+ }
- /** Ignored. */
@Override
- public void write(byte bytes[], int start, int count) {}
+ public synchronized void write(byte bytes[], int start, int count) {
+ if (decoder == null) {
+ encodedBytes = ByteBuffer.allocate(80);
+ decodedChars = CharBuffer.allocate(80);
+ decoder = Charset.defaultCharset().newDecoder()
+ .onMalformedInput(CodingErrorAction.REPLACE)
+ .onUnmappableCharacter(CodingErrorAction.REPLACE);
+ }
+
+ int end = start + count;
+ while (start < end) {
+ // copy some bytes from the array to the long-lived buffer. This
+ // way, if we end with a partial character we don't lose it.
+ int numBytes = Math.min(encodedBytes.remaining(), end - start);
+ encodedBytes.put(bytes, start, numBytes);
+ start += numBytes;
+
+ encodedBytes.flip();
+ CoderResult coderResult;
+ do {
+ // decode bytes from the byte buffer into the char buffer
+ coderResult = decoder.decode(encodedBytes, decodedChars, false);
+
+ // copy chars from the char buffer into our string builder
+ decodedChars.flip();
+ builder.append(decodedChars);
+ decodedChars.clear();
+ } while (coderResult.isOverflow());
+ encodedBytes.compact();
+ }
+ flush(false);
+ }
/** Always returns false. */
@Override
diff --git a/core/java/com/android/internal/os/RecoverySystem.java b/core/java/com/android/internal/os/RecoverySystem.java
deleted file mode 100644
index c938610..0000000
--- a/core/java/com/android/internal/os/RecoverySystem.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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 com.android.internal.os;
-
-import android.os.FileUtils;
-import android.os.Power;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Utility class for interacting with the Android recovery partition.
- * The recovery partition is a small standalone system which can perform
- * operations that are difficult while the main system is running, like
- * upgrading system software or reformatting the data partition.
- * Note that most of these operations must be run as root.
- *
- * @hide
- */
-public class RecoverySystem {
- private static final String TAG = "RecoverySystem"; // for logging
-
- // Used to communicate with recovery. See commands/recovery/recovery.c.
- private static File RECOVERY_DIR = new File("/cache/recovery");
- private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
- private static File LOG_FILE = new File(RECOVERY_DIR, "log");
-
- // Length limits for reading files.
- private static int LOG_FILE_MAX_LENGTH = 8 * 1024;
-
- /**
- * Reboot into the recovery system to install a system update.
- * @param update package to install (must be in /cache or /data).
- * @throws IOException if something goes wrong.
- */
- public static void rebootAndUpdate(File update) throws IOException {
- String path = update.getCanonicalPath();
- if (path.startsWith("/cache/")) {
- path = "CACHE:" + path.substring(7);
- } else if (path.startsWith("/data/")) {
- path = "DATA:" + path.substring(6);
- } else {
- throw new IllegalArgumentException(
- "Must start with /cache or /data: " + path);
- }
- bootCommand("--update_package=" + path);
- }
-
- /**
- * Reboot into the recovery system to wipe the /data partition.
- * @param extras to add to the RECOVERY_COMPLETED intent after rebooting.
- * @throws IOException if something goes wrong.
- */
- public static void rebootAndWipe() throws IOException {
- bootCommand("--wipe_data");
- }
-
- /**
- * Reboot into the recovery system with the supplied argument.
- * @param arg to pass to the recovery utility.
- * @throws IOException if something goes wrong.
- */
- private static void bootCommand(String arg) throws IOException {
- RECOVERY_DIR.mkdirs(); // In case we need it
- COMMAND_FILE.delete(); // In case it's not writable
- LOG_FILE.delete();
-
- FileWriter command = new FileWriter(COMMAND_FILE);
- try {
- command.write(arg);
- command.write("\n");
- } finally {
- command.close();
- }
-
- // Having written the command file, go ahead and reboot
- Power.reboot("recovery");
- throw new IOException("Reboot failed (no permissions?)");
- }
-
- /**
- * Called after booting to process and remove recovery-related files.
- * @return the log file from recovery, or null if none was found.
- */
- public static String handleAftermath() {
- // Record the tail of the LOG_FILE
- String log = null;
- try {
- log = FileUtils.readTextFile(LOG_FILE, -LOG_FILE_MAX_LENGTH, "...\n");
- } catch (FileNotFoundException e) {
- Log.i(TAG, "No recovery log file");
- } catch (IOException e) {
- Log.e(TAG, "Error reading recovery log", e);
- }
-
- // Delete everything in RECOVERY_DIR
- String[] names = RECOVERY_DIR.list();
- for (int i = 0; names != null && i < names.length; i++) {
- File f = new File(RECOVERY_DIR, names[i]);
- if (!f.delete()) {
- Log.e(TAG, "Can't delete: " + f);
- } else {
- Log.i(TAG, "Deleted: " + f);
- }
- }
-
- return log;
- }
-}
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index b7bb72d..57a28e6 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -58,6 +58,10 @@
/** true if commonInit() has been called */
private static boolean initialized;
+ private static IBinder mApplicationObject;
+
+ private static volatile boolean mCrashing = false;
+
/**
* Use this to log a message when a thread exits due to an uncaught
* exception. The framework catches these for the main threads, so
@@ -66,14 +70,30 @@
private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
try {
- Log.e(TAG, "Uncaught handler: thread " + t.getName()
- + " exiting due to uncaught exception");
- } catch (Throwable error) {
- // Ignore the throwable, since we're in the process of crashing anyway.
- // If we don't, the crash won't happen properly and the process will
- // be left around in a bad state.
+ // Don't re-enter -- avoid infinite loops if crash-reporting crashes.
+ if (mCrashing) return;
+ mCrashing = true;
+
+ if (mApplicationObject == null) {
+ Log.e(TAG, "*** FATAL EXCEPTION IN SYSTEM PROCESS: " + t.getName(), e);
+ } else {
+ Log.e(TAG, "FATAL EXCEPTION: " + t.getName(), e);
+ }
+
+ // Bring up crash dialog, wait for it to be dismissed
+ ActivityManagerNative.getDefault().handleApplicationCrash(
+ mApplicationObject, new ApplicationErrorReport.CrashInfo(e));
+ } catch (Throwable t2) {
+ try {
+ Log.e(TAG, "Error reporting crash", t2);
+ } catch (Throwable t3) {
+ // Even Log.e() fails! Oh well.
+ }
+ } finally {
+ // Try everything to make sure this process goes away.
+ Process.killProcess(Process.myPid());
+ System.exit(10);
}
- crash(TAG, e);
}
}
@@ -300,46 +320,22 @@
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.
+ * Report a serious error in the current process. May or may not cause
+ * the process to terminate (depends on system settings).
*
- * @param tag to use when logging the error
- * @param t exception that was generated by the error
+ * @param tag to record with the error
+ * @param t exception describing the error site and conditions
*/
- public static void crash(String tag, Throwable t) {
- if (mApplicationObject != null) {
- try {
- // Log exception.
- Log.e(TAG, Log.getStackTraceString(t));
-
- // Show a message to the user.
- IActivityManager am = ActivityManagerNative.getDefault();
- am.handleApplicationError(mApplicationObject, tag,
- new ApplicationErrorReport.CrashInfo(t));
- } catch (Throwable t2) {
- try {
- // Log exception as a string so we don't get in an infinite loop.
- Log.e(TAG, "Error reporting crash: " + Log.getStackTraceString(t2));
- } catch (Throwable t3) {
- // Do nothing, must be OOM so we can't format the message
- }
- } finally {
- // Try everything to make sure this process goes away.
+ public static void wtf(String tag, Throwable t) {
+ try {
+ if (ActivityManagerNative.getDefault().handleApplicationWtf(
+ mApplicationObject, tag, new ApplicationErrorReport.CrashInfo(t))) {
+ // The Activity Manager has already written us off -- now exit.
Process.killProcess(Process.myPid());
System.exit(10);
}
- } else {
- try {
- Log.e(TAG, "*** EXCEPTION IN SYSTEM PROCESS. System will crash.");
- Log.e(tag, Log.getStackTraceString(t));
- } catch (Throwable t2) {
- // Do nothing, must be OOM so we can't format the message
- } finally {
- // Try everything to make sure this process goes away.
- Process.killProcess(Process.myPid());
- System.exit(10);
- }
+ } catch (Throwable t2) {
+ Log.e(TAG, "Error reporting WTF", t2);
}
}
@@ -361,6 +357,4 @@
// Register handlers for DDM messages.
android.ddm.DdmRegister.registerHandlers();
}
-
- private static IBinder mApplicationObject;
}
diff --git a/core/java/com/android/internal/util/HanziToPinyin.java b/core/java/com/android/internal/util/HanziToPinyin.java
new file mode 100644
index 0000000..4368e98
--- /dev/null
+++ b/core/java/com/android/internal/util/HanziToPinyin.java
@@ -0,0 +1,455 @@
+/*
+ * 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.util;
+
+import com.google.android.util.AbstractMessageParser.Token;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Locale;
+
+/**
+ * An object to convert Chinese character to its corresponding pinyin string.
+ * For characters with multiple possible pinyin string, only one is selected
+ * according to collator. Polyphone is not supported in this implementation.
+ * This class is implemented to achieve the best runtime performance and minimum
+ * runtime resources with tolerable sacrifice of accuracy. This implementation
+ * highly depends on zh_CN ICU collation data and must be always synchronized with
+ * ICU.
+ */
+public class HanziToPinyin {
+ private static final String TAG = "HanziToPinyin";
+
+ private static final char[] UNIHANS = {
+ '\u5416', '\u54ce', '\u5b89', '\u80ae', '\u51f9', '\u516b', '\u63b0', '\u6273',
+ '\u90a6', '\u52f9', '\u9642', '\u5954', '\u4f3b', '\u7680', '\u782d', '\u706c',
+ '\u618b', '\u6c43', '\u51ab', '\u7676', '\u5cec', '\u5693', '\u5072', '\u53c2',
+ '\u4ed3', '\u64a1', '\u518a', '\u5d7e', '\u564c', '\u6260', '\u62c6', '\u8fbf',
+ '\u4f25', '\u6284', '\u8f66', '\u62bb', '\u9637', '\u5403', '\u5145', '\u62bd',
+ '\u51fa', '\u640b', '\u5ddb', '\u5205', '\u5439', '\u65fe', '\u8e14', '\u5472',
+ '\u4ece', '\u51d1', '\u7c97', '\u6c46', '\u5d14', '\u90a8', '\u6413', '\u5491',
+ '\u5446', '\u4e39', '\u5f53', '\u5200', '\u6074', '\u6265', '\u706f', '\u4efe',
+ '\u55f2', '\u6541', '\u5201', '\u7239', '\u4e01', '\u4e1f', '\u4e1c', '\u543a',
+ '\u5262', '\u8011', '\u5796', '\u5428', '\u591a', '\u59b8', '\u5940', '\u97a5',
+ '\u800c', '\u53d1', '\u5e06', '\u531a', '\u98de', '\u5206', '\u4e30', '\u8985',
+ '\u4ecf', '\u57ba', '\u7d11', '\u592b', '\u7324', '\u65ee', '\u4f85', '\u5e72',
+ '\u5188', '\u768b', '\u6208', '\u7ed9', '\u6839', '\u63ef', '\u55bc', '\u55f0',
+ '\u5de5', '\u52fe', '\u4f30', '\u9e39', '\u4e56', '\u5173', '\u5149', '\u5f52',
+ '\u4e28', '\u8b34', '\u5459', '\u598e', '\u548d', '\u4f44', '\u592f', '\u8320',
+ '\u8bc3', '\u9ed2', '\u62eb', '\u4ea8', '\u53ff', '\u9f41', '\u4e4e', '\u82b1',
+ '\u6000', '\u6b22', '\u5ddf', '\u7070', '\u660f', '\u5419', '\u4e0c', '\u52a0',
+ '\u620b', '\u6c5f', '\u827d', '\u9636', '\u5dfe', '\u5755', '\u5182', '\u4e29',
+ '\u51e5', '\u59e2', '\u5658', '\u519b', '\u5494', '\u5f00', '\u938e', '\u5ffc',
+ '\u5c3b', '\u533c', '\u808e', '\u52a5', '\u7a7a', '\u62a0', '\u625d', '\u5938',
+ '\u84af', '\u5bbd', '\u5321', '\u4e8f', '\u5764', '\u6269', '\u62c9', '\u4f86',
+ '\u5170', '\u5577', '\u635e', '\u4ec2', '\u96f7', '\u8137', '\u68f1', '\u695e',
+ '\u550e', '\u4fe9', '\u5afe', '\u826f', '\u8e7d', '\u57d3', '\u53b8', '\u62ce',
+ '\u6e9c', '\u9f99', '\u5a04', '\u565c', '\u5b6a', '\u62a1', '\u9831', '\u5988',
+ '\u57cb', '\u989f', '\u7264', '\u732b', '\u5445', '\u95e8', '\u6c13', '\u54aa',
+ '\u5b80', '\u55b5', '\u4e5c', '\u6c11', '\u540d', '\u8c2c', '\u6478', '\u725f',
+ '\u6bcd', '\u62cf', '\u8149', '\u56e1', '\u56d4', '\u5b6c', '\u8bb7', '\u5a1e',
+ '\u5ae9', '\u80fd', '\u92b0', '\u62c8', '\u5a18', '\u9e1f', '\u634f', '\u56dc',
+ '\u5b81', '\u599e', '\u519c', '\u7fba', '\u5974', '\u597b', '\u9ec1', '\u90cd',
+ '\u5662', '\u8bb4', '\u5991', '\u62cd', '\u7705', '\u6c78', '\u629b', '\u5478',
+ '\u55b7', '\u5309', '\u4e76', '\u7247', '\u527d', '\u6c15', '\u59d8', '\u4e52',
+ '\u948b', '\u5256', '\u4ec6', '\u4e03', '\u6390', '\u5343', '\u545b', '\u6084',
+ '\u5207', '\u4eb2', '\u9751', '\u5b86', '\u74d7', '\u533a', '\u5cd1', '\u7094',
+ '\u590b', '\u5465', '\u7a63', '\u835b', '\u60f9', '\u4eba', '\u6254', '\u65e5',
+ '\u620e', '\u53b9', '\u909a', '\u5827', '\u6875', '\u95f0', '\u633c', '\u4ee8',
+ '\u6be2', '\u4e09', '\u6852', '\u63bb', '\u8272', '\u68ee', '\u50e7', '\u6740',
+ '\u7b5b', '\u5c71', '\u4f24', '\u5f30', '\u5962', '\u7533', '\u5347', '\u5c38',
+ '\u53ce', '\u4e66', '\u5237', '\u8870', '\u95e9', '\u53cc', '\u8c01', '\u542e',
+ '\u8bf4', '\u53b6', '\u5fea', '\u51c1', '\u82cf', '\u72fb', '\u590a', '\u5b59',
+ '\u5506', '\u4ed6', '\u5b61', '\u574d', '\u6c64', '\u5932', '\u5fd1', '\u81af',
+ '\u5254', '\u5929', '\u65eb', '\u6017', '\u5385', '\u70b5', '\u5077', '\u51f8',
+ '\u6e4d', '\u63a8', '\u541e', '\u8bac', '\u52b8', '\u6b6a', '\u5f2f', '\u5c23',
+ '\u5371', '\u6637', '\u7fc1', '\u631d', '\u4e4c', '\u5915', '\u5477', '\u4ed9',
+ '\u4e61', '\u7071', '\u4e9b', '\u5fc3', '\u5174', '\u51f6', '\u4f11', '\u620c',
+ '\u5405', '\u75b6', '\u7025', '\u4e2b', '\u54bd', '\u592e', '\u5e7a', '\u503b',
+ '\u4e00', '\u4e5a', '\u5e94', '\u5537', '\u4f63', '\u4f18', '\u7ea1', '\u56e6',
+ '\u66f0', '\u8480', '\u5e00', '\u707d', '\u5142', '\u7242', '\u50ae', '\u556b',
+ '\u9c61', '\u600e', '\u66fd', '\u5412', '\u635a', '\u6cbe', '\u5f20', '\u4f4b',
+ '\u8707', '\u8d1e', '\u9eee', '\u4e4b', '\u4e2d', '\u5dde', '\u6731', '\u6293',
+ '\u62fd', '\u4e13', '\u5986', '\u96b9', '\u5b92', '\u5353', '\u4ed4', '\u5b97',
+ '\u90b9', '\u79df', '\u5297', '\u55fa', '\u5c0a', '\u6628',
+ };
+ private final static byte[][] PINYINS = {
+ {65, 00, 00, 00, 00, 00, }, {65, 73, 00, 00, 00, 00, },
+ {65, 78, 00, 00, 00, 00, }, {65, 78, 71, 00, 00, 00, },
+ {65, 79, 00, 00, 00, 00, }, {66, 65, 00, 00, 00, 00, },
+ {66, 65, 73, 00, 00, 00, }, {66, 65, 78, 00, 00, 00, },
+ {66, 65, 78, 71, 00, 00, }, {66, 65, 79, 00, 00, 00, },
+ {66, 69, 73, 00, 00, 00, }, {66, 69, 78, 00, 00, 00, },
+ {66, 69, 78, 71, 00, 00, }, {66, 73, 00, 00, 00, 00, },
+ {66, 73, 65, 78, 00, 00, }, {66, 73, 65, 79, 00, 00, },
+ {66, 73, 69, 00, 00, 00, }, {66, 73, 78, 00, 00, 00, },
+ {66, 73, 78, 71, 00, 00, }, {66, 79, 00, 00, 00, 00, },
+ {66, 85, 00, 00, 00, 00, }, {67, 65, 00, 00, 00, 00, },
+ {67, 65, 73, 00, 00, 00, }, {67, 65, 78, 00, 00, 00, },
+ {67, 65, 78, 71, 00, 00, }, {67, 65, 79, 00, 00, 00, },
+ {67, 69, 00, 00, 00, 00, }, {67, 69, 78, 00, 00, 00, },
+ {67, 69, 78, 71, 00, 00, }, {67, 72, 65, 00, 00, 00, },
+ {67, 72, 65, 73, 00, 00, }, {67, 72, 65, 78, 00, 00, },
+ {67, 72, 65, 78, 71, 00, }, {67, 72, 65, 79, 00, 00, },
+ {67, 72, 69, 00, 00, 00, }, {67, 72, 69, 78, 00, 00, },
+ {67, 72, 69, 78, 71, 00, }, {67, 72, 73, 00, 00, 00, },
+ {67, 72, 79, 78, 71, 00, }, {67, 72, 79, 85, 00, 00, },
+ {67, 72, 85, 00, 00, 00, }, {67, 72, 85, 65, 73, 00, },
+ {67, 72, 85, 65, 78, 00, }, {67, 72, 85, 65, 78, 71, },
+ {67, 72, 85, 73, 00, 00, }, {67, 72, 85, 78, 00, 00, },
+ {67, 72, 85, 79, 00, 00, }, {67, 73, 00, 00, 00, 00, },
+ {67, 79, 78, 71, 00, 00, }, {67, 79, 85, 00, 00, 00, },
+ {67, 85, 00, 00, 00, 00, }, {67, 85, 65, 78, 00, 00, },
+ {67, 85, 73, 00, 00, 00, }, {67, 85, 78, 00, 00, 00, },
+ {67, 85, 79, 00, 00, 00, }, {68, 65, 00, 00, 00, 00, },
+ {68, 65, 73, 00, 00, 00, }, {68, 65, 78, 00, 00, 00, },
+ {68, 65, 78, 71, 00, 00, }, {68, 65, 79, 00, 00, 00, },
+ {68, 69, 00, 00, 00, 00, }, {68, 69, 78, 00, 00, 00, },
+ {68, 69, 78, 71, 00, 00, }, {68, 73, 00, 00, 00, 00, },
+ {68, 73, 65, 00, 00, 00, }, {68, 73, 65, 78, 00, 00, },
+ {68, 73, 65, 79, 00, 00, }, {68, 73, 69, 00, 00, 00, },
+ {68, 73, 78, 71, 00, 00, }, {68, 73, 85, 00, 00, 00, },
+ {68, 79, 78, 71, 00, 00, }, {68, 79, 85, 00, 00, 00, },
+ {68, 85, 00, 00, 00, 00, }, {68, 85, 65, 78, 00, 00, },
+ {68, 85, 73, 00, 00, 00, }, {68, 85, 78, 00, 00, 00, },
+ {68, 85, 79, 00, 00, 00, }, {69, 00, 00, 00, 00, 00, },
+ {69, 78, 00, 00, 00, 00, }, {69, 78, 71, 00, 00, 00, },
+ {69, 82, 00, 00, 00, 00, }, {70, 65, 00, 00, 00, 00, },
+ {70, 65, 78, 00, 00, 00, }, {70, 65, 78, 71, 00, 00, },
+ {70, 69, 73, 00, 00, 00, }, {70, 69, 78, 00, 00, 00, },
+ {70, 69, 78, 71, 00, 00, }, {70, 73, 65, 79, 00, 00, },
+ {70, 79, 00, 00, 00, 00, }, {70, 85, 00, 00, 00, 00, },
+ {70, 79, 85, 00, 00, 00, }, {70, 85, 00, 00, 00, 00, },
+ {71, 85, 73, 00, 00, 00, }, {71, 65, 00, 00, 00, 00, },
+ {71, 65, 73, 00, 00, 00, }, {71, 65, 78, 00, 00, 00, },
+ {71, 65, 78, 71, 00, 00, }, {71, 65, 79, 00, 00, 00, },
+ {71, 69, 00, 00, 00, 00, }, {71, 69, 73, 00, 00, 00, },
+ {71, 69, 78, 00, 00, 00, }, {71, 69, 78, 71, 00, 00, },
+ {74, 73, 69, 00, 00, 00, }, {71, 69, 00, 00, 00, 00, },
+ {71, 79, 78, 71, 00, 00, }, {71, 79, 85, 00, 00, 00, },
+ {71, 85, 00, 00, 00, 00, }, {71, 85, 65, 00, 00, 00, },
+ {71, 85, 65, 73, 00, 00, }, {71, 85, 65, 78, 00, 00, },
+ {71, 85, 65, 78, 71, 00, }, {71, 85, 73, 00, 00, 00, },
+ {71, 85, 78, 00, 00, 00, }, {71, 85, 65, 78, 00, 00, },
+ {71, 85, 79, 00, 00, 00, }, {72, 65, 00, 00, 00, 00, },
+ {72, 65, 73, 00, 00, 00, }, {72, 65, 78, 00, 00, 00, },
+ {72, 65, 78, 71, 00, 00, }, {72, 65, 79, 00, 00, 00, },
+ {72, 69, 00, 00, 00, 00, }, {72, 69, 73, 00, 00, 00, },
+ {72, 69, 78, 00, 00, 00, }, {72, 69, 78, 71, 00, 00, },
+ {72, 79, 78, 71, 00, 00, }, {72, 79, 85, 00, 00, 00, },
+ {72, 85, 00, 00, 00, 00, }, {72, 85, 65, 00, 00, 00, },
+ {72, 85, 65, 73, 00, 00, }, {72, 85, 65, 78, 00, 00, },
+ {72, 85, 65, 78, 71, 00, }, {72, 85, 73, 00, 00, 00, },
+ {72, 85, 78, 00, 00, 00, }, {72, 85, 79, 00, 00, 00, },
+ {74, 73, 00, 00, 00, 00, }, {74, 73, 65, 00, 00, 00, },
+ {74, 73, 65, 78, 00, 00, }, {74, 73, 65, 78, 71, 00, },
+ {74, 73, 65, 79, 00, 00, }, {74, 73, 69, 00, 00, 00, },
+ {74, 73, 78, 00, 00, 00, }, {74, 73, 78, 71, 00, 00, },
+ {74, 73, 79, 78, 71, 00, }, {74, 73, 85, 00, 00, 00, },
+ {74, 85, 00, 00, 00, 00, }, {74, 85, 65, 78, 00, 00, },
+ {74, 85, 69, 00, 00, 00, }, {74, 85, 78, 00, 00, 00, },
+ {75, 65, 00, 00, 00, 00, }, {75, 65, 73, 00, 00, 00, },
+ {75, 65, 78, 00, 00, 00, }, {75, 65, 78, 71, 00, 00, },
+ {75, 65, 79, 00, 00, 00, }, {75, 69, 00, 00, 00, 00, },
+ {75, 69, 78, 00, 00, 00, }, {75, 69, 78, 71, 00, 00, },
+ {75, 79, 78, 71, 00, 00, }, {75, 79, 85, 00, 00, 00, },
+ {75, 85, 00, 00, 00, 00, }, {75, 85, 65, 00, 00, 00, },
+ {75, 85, 65, 73, 00, 00, }, {75, 85, 65, 78, 00, 00, },
+ {75, 85, 65, 78, 71, 00, }, {75, 85, 73, 00, 00, 00, },
+ {75, 85, 78, 00, 00, 00, }, {75, 85, 79, 00, 00, 00, },
+ {76, 65, 00, 00, 00, 00, }, {76, 65, 73, 00, 00, 00, },
+ {76, 65, 78, 00, 00, 00, }, {76, 65, 78, 71, 00, 00, },
+ {76, 65, 79, 00, 00, 00, }, {76, 69, 00, 00, 00, 00, },
+ {76, 69, 73, 00, 00, 00, }, {76, 73, 00, 00, 00, 00, },
+ {76, 73, 78, 71, 00, 00, }, {76, 69, 78, 71, 00, 00, },
+ {76, 73, 00, 00, 00, 00, }, {76, 73, 65, 00, 00, 00, },
+ {76, 73, 65, 78, 00, 00, }, {76, 73, 65, 78, 71, 00, },
+ {76, 73, 65, 79, 00, 00, }, {76, 73, 69, 00, 00, 00, },
+ {76, 73, 78, 00, 00, 00, }, {76, 73, 78, 71, 00, 00, },
+ {76, 73, 85, 00, 00, 00, }, {76, 79, 78, 71, 00, 00, },
+ {76, 79, 85, 00, 00, 00, }, {76, 85, 00, 00, 00, 00, },
+ {76, 85, 65, 78, 00, 00, }, {76, 85, 78, 00, 00, 00, },
+ {76, 85, 79, 00, 00, 00, }, {77, 65, 00, 00, 00, 00, },
+ {77, 65, 73, 00, 00, 00, }, {77, 65, 78, 00, 00, 00, },
+ {77, 65, 78, 71, 00, 00, }, {77, 65, 79, 00, 00, 00, },
+ {77, 69, 73, 00, 00, 00, }, {77, 69, 78, 00, 00, 00, },
+ {77, 69, 78, 71, 00, 00, }, {77, 73, 00, 00, 00, 00, },
+ {77, 73, 65, 78, 00, 00, }, {77, 73, 65, 79, 00, 00, },
+ {77, 73, 69, 00, 00, 00, }, {77, 73, 78, 00, 00, 00, },
+ {77, 73, 78, 71, 00, 00, }, {77, 73, 85, 00, 00, 00, },
+ {77, 79, 00, 00, 00, 00, }, {77, 79, 85, 00, 00, 00, },
+ {77, 85, 00, 00, 00, 00, }, {78, 65, 00, 00, 00, 00, },
+ {78, 65, 73, 00, 00, 00, }, {78, 65, 78, 00, 00, 00, },
+ {78, 65, 78, 71, 00, 00, }, {78, 65, 79, 00, 00, 00, },
+ {78, 69, 00, 00, 00, 00, }, {78, 69, 73, 00, 00, 00, },
+ {78, 69, 78, 00, 00, 00, }, {78, 69, 78, 71, 00, 00, },
+ {78, 73, 00, 00, 00, 00, }, {78, 73, 65, 78, 00, 00, },
+ {78, 73, 65, 78, 71, 00, }, {78, 73, 65, 79, 00, 00, },
+ {78, 73, 69, 00, 00, 00, }, {78, 73, 78, 00, 00, 00, },
+ {78, 73, 78, 71, 00, 00, }, {78, 73, 85, 00, 00, 00, },
+ {78, 79, 78, 71, 00, 00, }, {78, 79, 85, 00, 00, 00, },
+ {78, 85, 00, 00, 00, 00, }, {78, 85, 65, 78, 00, 00, },
+ {78, 85, 78, 00, 00, 00, }, {78, 85, 79, 00, 00, 00, },
+ {79, 00, 00, 00, 00, 00, }, {79, 85, 00, 00, 00, 00, },
+ {80, 65, 00, 00, 00, 00, }, {80, 65, 73, 00, 00, 00, },
+ {80, 65, 78, 00, 00, 00, }, {80, 65, 78, 71, 00, 00, },
+ {80, 65, 79, 00, 00, 00, }, {80, 69, 73, 00, 00, 00, },
+ {80, 69, 78, 00, 00, 00, }, {80, 69, 78, 71, 00, 00, },
+ {80, 73, 00, 00, 00, 00, }, {80, 73, 65, 78, 00, 00, },
+ {80, 73, 65, 79, 00, 00, }, {80, 73, 69, 00, 00, 00, },
+ {80, 73, 78, 00, 00, 00, }, {80, 73, 78, 71, 00, 00, },
+ {80, 79, 00, 00, 00, 00, }, {80, 79, 85, 00, 00, 00, },
+ {80, 85, 00, 00, 00, 00, }, {81, 73, 00, 00, 00, 00, },
+ {81, 73, 65, 00, 00, 00, }, {81, 73, 65, 78, 00, 00, },
+ {81, 73, 65, 78, 71, 00, }, {81, 73, 65, 79, 00, 00, },
+ {81, 73, 69, 00, 00, 00, }, {81, 73, 78, 00, 00, 00, },
+ {81, 73, 78, 71, 00, 00, }, {81, 73, 79, 78, 71, 00, },
+ {81, 73, 85, 00, 00, 00, }, {81, 85, 00, 00, 00, 00, },
+ {81, 85, 65, 78, 00, 00, }, {81, 85, 69, 00, 00, 00, },
+ {81, 85, 78, 00, 00, 00, }, {82, 65, 78, 00, 00, 00, },
+ {82, 65, 78, 71, 00, 00, }, {82, 65, 79, 00, 00, 00, },
+ {82, 69, 00, 00, 00, 00, }, {82, 69, 78, 00, 00, 00, },
+ {82, 69, 78, 71, 00, 00, }, {82, 73, 00, 00, 00, 00, },
+ {82, 79, 78, 71, 00, 00, }, {82, 79, 85, 00, 00, 00, },
+ {82, 85, 00, 00, 00, 00, }, {82, 85, 65, 78, 00, 00, },
+ {82, 85, 73, 00, 00, 00, }, {82, 85, 78, 00, 00, 00, },
+ {82, 85, 79, 00, 00, 00, }, {83, 65, 00, 00, 00, 00, },
+ {83, 65, 73, 00, 00, 00, }, {83, 65, 78, 00, 00, 00, },
+ {83, 65, 78, 71, 00, 00, }, {83, 65, 79, 00, 00, 00, },
+ {83, 69, 00, 00, 00, 00, }, {83, 69, 78, 00, 00, 00, },
+ {83, 69, 78, 71, 00, 00, }, {83, 72, 65, 00, 00, 00, },
+ {83, 72, 65, 73, 00, 00, }, {83, 72, 65, 78, 00, 00, },
+ {83, 72, 65, 78, 71, 00, }, {83, 72, 65, 79, 00, 00, },
+ {83, 72, 69, 00, 00, 00, }, {83, 72, 69, 78, 00, 00, },
+ {83, 72, 69, 78, 71, 00, }, {83, 72, 73, 00, 00, 00, },
+ {83, 72, 79, 85, 00, 00, }, {83, 72, 85, 00, 00, 00, },
+ {83, 72, 85, 65, 00, 00, }, {83, 72, 85, 65, 73, 00, },
+ {83, 72, 85, 65, 78, 00, }, {83, 72, 85, 65, 78, 71, },
+ {83, 72, 85, 73, 00, 00, }, {83, 72, 85, 78, 00, 00, },
+ {83, 72, 85, 79, 00, 00, }, {83, 73, 00, 00, 00, 00, },
+ {83, 79, 78, 71, 00, 00, }, {83, 79, 85, 00, 00, 00, },
+ {83, 85, 00, 00, 00, 00, }, {83, 85, 65, 78, 00, 00, },
+ {83, 85, 73, 00, 00, 00, }, {83, 85, 78, 00, 00, 00, },
+ {83, 85, 79, 00, 00, 00, }, {84, 65, 00, 00, 00, 00, },
+ {84, 65, 73, 00, 00, 00, }, {84, 65, 78, 00, 00, 00, },
+ {84, 65, 78, 71, 00, 00, }, {84, 65, 79, 00, 00, 00, },
+ {84, 69, 00, 00, 00, 00, }, {84, 69, 78, 71, 00, 00, },
+ {84, 73, 00, 00, 00, 00, }, {84, 73, 65, 78, 00, 00, },
+ {84, 73, 65, 79, 00, 00, }, {84, 73, 69, 00, 00, 00, },
+ {84, 73, 78, 71, 00, 00, }, {84, 79, 78, 71, 00, 00, },
+ {84, 79, 85, 00, 00, 00, }, {84, 85, 00, 00, 00, 00, },
+ {84, 85, 65, 78, 00, 00, }, {84, 85, 73, 00, 00, 00, },
+ {84, 85, 78, 00, 00, 00, }, {84, 85, 79, 00, 00, 00, },
+ {87, 65, 00, 00, 00, 00, }, {87, 65, 73, 00, 00, 00, },
+ {87, 65, 78, 00, 00, 00, }, {87, 65, 78, 71, 00, 00, },
+ {87, 69, 73, 00, 00, 00, }, {87, 69, 78, 00, 00, 00, },
+ {87, 69, 78, 71, 00, 00, }, {87, 79, 00, 00, 00, 00, },
+ {87, 85, 00, 00, 00, 00, }, {88, 73, 00, 00, 00, 00, },
+ {88, 73, 65, 00, 00, 00, }, {88, 73, 65, 78, 00, 00, },
+ {88, 73, 65, 78, 71, 00, }, {88, 73, 65, 79, 00, 00, },
+ {88, 73, 69, 00, 00, 00, }, {88, 73, 78, 00, 00, 00, },
+ {88, 73, 78, 71, 00, 00, }, {88, 73, 79, 78, 71, 00, },
+ {88, 73, 85, 00, 00, 00, }, {88, 85, 00, 00, 00, 00, },
+ {88, 85, 65, 78, 00, 00, }, {88, 85, 69, 00, 00, 00, },
+ {88, 85, 78, 00, 00, 00, }, {89, 65, 00, 00, 00, 00, },
+ {89, 65, 78, 00, 00, 00, }, {89, 65, 78, 71, 00, 00, },
+ {89, 65, 79, 00, 00, 00, }, {89, 69, 00, 00, 00, 00, },
+ {89, 73, 00, 00, 00, 00, }, {89, 73, 78, 00, 00, 00, },
+ {89, 73, 78, 71, 00, 00, }, {89, 79, 00, 00, 00, 00, },
+ {89, 79, 78, 71, 00, 00, }, {89, 79, 85, 00, 00, 00, },
+ {89, 85, 00, 00, 00, 00, }, {89, 85, 65, 78, 00, 00, },
+ {89, 85, 69, 00, 00, 00, }, {89, 85, 78, 00, 00, 00, },
+ {90, 65, 00, 00, 00, 00, }, {90, 65, 73, 00, 00, 00, },
+ {90, 65, 78, 00, 00, 00, }, {90, 65, 78, 71, 00, 00, },
+ {90, 65, 79, 00, 00, 00, }, {90, 69, 00, 00, 00, 00, },
+ {90, 69, 73, 00, 00, 00, }, {90, 69, 78, 00, 00, 00, },
+ {90, 69, 78, 71, 00, 00, }, {90, 72, 65, 00, 00, 00, },
+ {90, 72, 65, 73, 00, 00, }, {90, 72, 65, 78, 00, 00, },
+ {90, 72, 65, 78, 71, 00, }, {90, 72, 65, 79, 00, 00, },
+ {90, 72, 69, 00, 00, 00, }, {90, 72, 69, 78, 00, 00, },
+ {90, 72, 69, 78, 71, 00, }, {90, 72, 73, 00, 00, 00, },
+ {90, 72, 79, 78, 71, 00, }, {90, 72, 79, 85, 00, 00, },
+ {90, 72, 85, 00, 00, 00, }, {90, 72, 85, 65, 00, 00, },
+ {90, 72, 85, 65, 73, 00, }, {90, 72, 85, 65, 78, 00, },
+ {90, 72, 85, 65, 78, 71, }, {90, 72, 85, 73, 00, 00, },
+ {90, 72, 85, 78, 00, 00, }, {90, 72, 85, 79, 00, 00, },
+ {90, 73, 00, 00, 00, 00, }, {90, 79, 78, 71, 00, 00, },
+ {90, 79, 85, 00, 00, 00, }, {90, 85, 00, 00, 00, 00, },
+ {90, 85, 65, 78, 00, 00, }, {90, 85, 73, 00, 00, 00, },
+ {90, 85, 78, 00, 00, 00, }, {90, 85, 79, 00, 00, 00, },
+
+ };
+
+ /** First and last Chinese character with known Pinyin according to zh collation */
+ private static final String FIRST_UNIHAN = "\u5416";
+ private static final String LAST_UNIHAN = "\u5497";
+ private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA);
+
+ private static HanziToPinyin sInstance;
+ private final boolean mHasChinaCollator;
+
+ public static class Token {
+ /**
+ * Separator between target string for each source char
+ */
+ public static final String SEPARATOR = " ";
+
+ public static final int ASCII = 1;
+ public static final int PINYIN = 2;
+ public static final int UNKNOWN = 3;
+
+ /**
+ * Type of this token, ASCII, PINYIN or UNKNOWN.
+ */
+ public int type;
+ /**
+ * Original string before translation.
+ */
+ public String source;
+ /**
+ * Translated string of source. For Han, target is corresponding Pinyin.
+ * Otherwise target is original string in source.
+ */
+ public String target;
+ }
+
+ protected HanziToPinyin(boolean hasChinaCollator) {
+ mHasChinaCollator = hasChinaCollator;
+ }
+
+ public static HanziToPinyin getInstance() {
+ synchronized(HanziToPinyin.class) {
+ if (sInstance != null) {
+ return sInstance;
+ }
+ // Check if zh_CN collation data is available
+ final Locale locale[] = Collator.getAvailableLocales();
+ for (int i = 0; i < locale.length; i++) {
+ if (locale[i].equals(Locale.CHINA)) {
+ sInstance = new HanziToPinyin(true);
+ return sInstance;
+ }
+ }
+ sInstance = new HanziToPinyin(false);
+ return sInstance;
+ }
+ }
+
+ private Token getToken(char character) {
+ Token token = new Token();
+ final String letter = Character.toString(character);
+ token.source = letter;
+ int offset = -1;
+ int cmp;
+ if (character < 256) {
+ token.type = Token.ASCII;
+ token.target = letter;
+ return token;
+ } else {
+ cmp = COLLATOR.compare(letter, FIRST_UNIHAN);
+ if (cmp < 0) {
+ token.type = Token.UNKNOWN;
+ token.target = letter;
+ return token;
+ } else if (cmp == 0) {
+ token.type = Token.PINYIN;
+ offset = 0;
+ } else {
+ cmp = COLLATOR.compare(letter, LAST_UNIHAN);
+ if (cmp > 0) {
+ token.type = Token.UNKNOWN;
+ token.target = letter;
+ return token;
+ } else if (cmp == 0) {
+ token.type = Token.PINYIN;
+ offset = UNIHANS.length - 1;
+ }
+ }
+ }
+
+ token.type = Token.PINYIN;
+ if (offset < 0) {
+ int begin = 0;
+ int end = UNIHANS.length - 1;
+ while (begin <= end) {
+ offset = (begin + end) / 2;
+ final String unihan = Character.toString(UNIHANS[offset]);
+ cmp = COLLATOR.compare(letter, unihan);
+ if (cmp == 0) {
+ break;
+ } else if (cmp > 0) {
+ begin = offset + 1;
+ } else {
+ end = offset - 1;
+ }
+ }
+ }
+ if (cmp < 0) {
+ offset--;
+ }
+ StringBuilder pinyin = new StringBuilder();
+ for (int j = 0; j < PINYINS[offset].length && PINYINS[offset][j] != 0; j++) {
+ pinyin.append((char)PINYINS[offset][j]);
+ }
+ token.target = pinyin.toString();
+ return token;
+ }
+
+ public ArrayList<Token> get(final String input) {
+ if (!mHasChinaCollator || TextUtils.isEmpty(input)) {
+ return null;
+ }
+
+ ArrayList<Token> tokens = new ArrayList<Token>();
+ Token currentToken;
+
+ final int inputLength = input.length();
+
+ currentToken = getToken(input.charAt(0));
+
+ for (int i = 1; i < inputLength; i++) {
+ final char character = input.charAt(i);
+ Token token = getToken(character);
+
+ if (token.type != currentToken.type) {
+ currentToken.target = currentToken.target.trim();
+ tokens.add(currentToken);
+ currentToken = token;
+ } else {
+ switch (token.type) {
+ case Token.ASCII:
+ case Token.UNKNOWN:
+ currentToken.source += token.source;
+ currentToken.target += token.target;
+ break;
+ case Token.PINYIN:
+ currentToken.source += token.source;
+ currentToken.target += " " + token.target;
+ break;
+ }
+ }
+ }
+
+ currentToken.target = currentToken.target.trim();
+ tokens.add(currentToken);
+
+ return tokens;
+ }
+}
diff --git a/core/java/com/android/internal/view/menu/IconMenuItemView.java b/core/java/com/android/internal/view/menu/IconMenuItemView.java
index 66e15c1..3c5b422 100644
--- a/core/java/com/android/internal/view/menu/IconMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/IconMenuItemView.java
@@ -254,7 +254,7 @@
if (lp == null) {
// Default layout parameters
lp = new IconMenuView.LayoutParams(
- IconMenuView.LayoutParams.FILL_PARENT, IconMenuView.LayoutParams.FILL_PARENT);
+ IconMenuView.LayoutParams.MATCH_PARENT, IconMenuView.LayoutParams.MATCH_PARENT);
}
// Set the desired width of item
diff --git a/core/java/com/android/internal/widget/ContactHeaderWidget.java b/core/java/com/android/internal/widget/ContactHeaderWidget.java
index 19debec..33fd936 100644
--- a/core/java/com/android/internal/widget/ContactHeaderWidget.java
+++ b/core/java/com/android/internal/widget/ContactHeaderWidget.java
@@ -119,12 +119,12 @@
int CONTACT_STATUS_RES_PACKAGE = 8;
int CONTACT_STATUS_LABEL = 9;
}
-
+
private interface PhotoQuery {
String[] COLUMNS = new String[] {
Photo.PHOTO
};
-
+
int PHOTO = 0;
}
@@ -241,13 +241,13 @@
case TOKEN_PHOTO_QUERY: {
//Set the photo
Bitmap photoBitmap = null;
- if (cursor != null && cursor.moveToFirst()
+ if (cursor != null && cursor.moveToFirst()
&& !cursor.isNull(PhotoQuery.PHOTO)) {
byte[] photoData = cursor.getBlob(PhotoQuery.PHOTO);
photoBitmap = BitmapFactory.decodeByteArray(photoData, 0,
photoData.length, null);
}
-
+
if (photoBitmap == null) {
photoBitmap = loadPlaceholderPhoto(null);
}
@@ -261,7 +261,7 @@
case TOKEN_CONTACT_INFO: {
if (cursor != null && cursor.moveToFirst()) {
bindContactInfo(cursor);
- Uri lookupUri = Contacts.getLookupUri(cursor.getLong(ContactQuery._ID),
+ Uri lookupUri = Contacts.getLookupUri(cursor.getLong(ContactQuery._ID),
cursor.getString(ContactQuery.LOOKUP_KEY));
startPhotoQuery(cursor.getLong(ContactQuery.PHOTO_ID), lookupUri);
invalidate();
@@ -277,6 +277,7 @@
} else {
String phoneNumber = (String) cookie;
setDisplayName(phoneNumber, null);
+ setSocialSnippet(null);
mPhotoView.assignContactFromPhone(phoneNumber, true);
}
break;
@@ -290,6 +291,7 @@
} else {
String emailAddress = (String) cookie;
setDisplayName(emailAddress, null);
+ setSocialSnippet(null);
mPhotoView.assignContactFromEmail(emailAddress, true);
}
break;
@@ -374,6 +376,7 @@
public void setSocialSnippet(CharSequence snippet) {
if (snippet == null) {
mStatusView.setVisibility(View.GONE);
+ mStatusAttributionView.setVisibility(View.GONE);
} else {
mStatusView.setText(snippet);
mStatusView.setVisibility(View.VISIBLE);
@@ -446,7 +449,9 @@
*
*/
public void wipeClean() {
+ setDisplayName(null, null);
setPhoto(null);
+ setSocialSnippet(null);
mContactUri = null;
mExcludeMimes = null;
}
@@ -457,11 +462,11 @@
}
protected void startPhotoQuery(long photoId, Uri lookupKey) {
- mQueryHandler.startQuery(TOKEN_PHOTO_QUERY, lookupKey,
+ mQueryHandler.startQuery(TOKEN_PHOTO_QUERY, lookupKey,
ContentUris.withAppendedId(Data.CONTENT_URI, photoId), PhotoQuery.COLUMNS,
null, null, null);
}
-
+
/**
* Bind the contact details provided by the given {@link Cursor}.
*/
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 58056bd..3c5a753 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -38,8 +38,9 @@
public class LockPatternUtils {
private static final String TAG = "LockPatternUtils";
-
+
private static final String LOCK_PATTERN_FILE = "/system/gesture.key";
+ private static final String LOCK_PASSWORD_FILE = "/system/password.key";
/**
* The maximum number of incorrect attempts before the user is prevented
@@ -70,20 +71,32 @@
public static final int MIN_LOCK_PATTERN_SIZE = 4;
/**
+ * Type of password being stored.
+ * pattern = pattern screen
+ * pin = digit-only password
+ * password = alphanumeric password
+ */
+ public static final int MODE_PATTERN = 0;
+ public static final int MODE_PIN = 1;
+ public static final int MODE_PASSWORD = 2;
+
+ /**
* The minimum number of dots the user must include in a wrong pattern
* attempt for it to be counted against the counts that affect
* {@link #FAILED_ATTEMPTS_BEFORE_TIMEOUT} and {@link #FAILED_ATTEMPTS_BEFORE_RESET}
*/
- public static final int MIN_PATTERN_REGISTER_FAIL = 3;
+ public static final int MIN_PATTERN_REGISTER_FAIL = 3;
private final static String LOCKOUT_PERMANENT_KEY = "lockscreen.lockedoutpermanently";
private final static String LOCKOUT_ATTEMPT_DEADLINE = "lockscreen.lockoutattemptdeadline";
- private final static String PATTERN_EVER_CHOSEN = "lockscreen.patterneverchosen";
+ private final static String PATTERN_EVER_CHOSEN_KEY = "lockscreen.patterneverchosen";
+ public final static String PASSWORD_TYPE_KEY = "lockscreen.password_type";
private final ContentResolver mContentResolver;
private static String sLockPatternFilename;
-
+ private static String sLockPasswordFilename;
+
/**
* @param contentResolver Used to look up and save settings.
*/
@@ -91,16 +104,19 @@
mContentResolver = contentResolver;
// Initialize the location of gesture lock file
if (sLockPatternFilename == null) {
- sLockPatternFilename = android.os.Environment.getDataDirectory()
+ sLockPatternFilename = android.os.Environment.getDataDirectory()
.getAbsolutePath() + LOCK_PATTERN_FILE;
+ sLockPasswordFilename = android.os.Environment.getDataDirectory()
+ .getAbsolutePath() + LOCK_PASSWORD_FILE;
}
+
}
/**
* Check to see if a pattern matches the saved pattern. If no pattern exists,
* always returns true.
* @param pattern The pattern to check.
- * @return Whether the pattern matchees the stored one.
+ * @return Whether the pattern matches the stored one.
*/
public boolean checkPattern(List<LockPatternView.Cell> pattern) {
try {
@@ -122,13 +138,40 @@
}
/**
- * Check to see if the user has stored a lock pattern.
- * @return Whether a saved pattern exists.
+ * Check to see if a password matches the saved password. If no password exists,
+ * always returns true.
+ * @param password The password to check.
+ * @return Whether the password matches the stored one.
*/
- public boolean savedPatternExists() {
+ public boolean checkPassword(String password) {
+ try {
+ // Read all the bytes from the file
+ RandomAccessFile raf = new RandomAccessFile(sLockPasswordFilename, "r");
+ final byte[] stored = new byte[(int) raf.length()];
+ int got = raf.read(stored, 0, stored.length);
+ raf.close();
+ if (got <= 0) {
+ return true;
+ }
+ // Compare the hash from the file with the entered password's hash
+ return Arrays.equals(stored, LockPatternUtils.passwordToHash(password));
+ } catch (FileNotFoundException fnfe) {
+ return true;
+ } catch (IOException ioe) {
+ return true;
+ }
+ }
+
+ /**
+ * Checks to see if the given file exists and contains any data. Returns true if it does,
+ * false otherwise.
+ * @param filename
+ * @return true if file exists and is non-empty.
+ */
+ private boolean nonEmptyFileExists(String filename) {
try {
// Check if we can read a byte from the file
- RandomAccessFile raf = new RandomAccessFile(sLockPatternFilename, "r");
+ RandomAccessFile raf = new RandomAccessFile(filename, "r");
byte first = raf.readByte();
raf.close();
return true;
@@ -140,13 +183,29 @@
}
/**
+ * Check to see if the user has stored a lock pattern.
+ * @return Whether a saved pattern exists.
+ */
+ public boolean savedPatternExists() {
+ return nonEmptyFileExists(sLockPatternFilename);
+ }
+
+ /**
+ * Check to see if the user has stored a lock pattern.
+ * @return Whether a saved pattern exists.
+ */
+ public boolean savedPasswordExists() {
+ return nonEmptyFileExists(sLockPasswordFilename);
+ }
+
+ /**
* Return true if the user has ever chosen a pattern. This is true even if the pattern is
* currently cleared.
*
* @return True if the user has ever chosen a pattern.
*/
public boolean isPatternEverChosen() {
- return getBoolean(PATTERN_EVER_CHOSEN);
+ return getBoolean(PATTERN_EVER_CHOSEN_KEY);
}
/**
@@ -166,7 +225,8 @@
raf.write(hash, 0, hash.length);
}
raf.close();
- setBoolean(PATTERN_EVER_CHOSEN, true);
+ setBoolean(PATTERN_EVER_CHOSEN_KEY, true);
+ setLong(PASSWORD_TYPE_KEY, MODE_PATTERN);
} catch (FileNotFoundException fnfe) {
// Cant do much, unless we want to fail over to using the settings provider
Log.e(TAG, "Unable to save lock pattern to " + sLockPatternFilename);
@@ -177,6 +237,38 @@
}
/**
+ * Save a lock password.
+ * @param password The password to save
+ */
+ public void saveLockPassword(String password) {
+ // Compute the hash
+ boolean numericHint = password != null ? TextUtils.isDigitsOnly(password) : false;
+ final byte[] hash = LockPatternUtils.passwordToHash(password);
+ try {
+ // Write the hash to file
+ RandomAccessFile raf = new RandomAccessFile(sLockPasswordFilename, "rw");
+ // Truncate the file if pattern is null, to clear the lock
+ if (password == null) {
+ raf.setLength(0);
+ } else {
+ raf.write(hash, 0, hash.length);
+ }
+ raf.close();
+ setLong(PASSWORD_TYPE_KEY, numericHint ? MODE_PIN : MODE_PASSWORD);
+ } catch (FileNotFoundException fnfe) {
+ // Cant do much, unless we want to fail over to using the settings provider
+ Log.e(TAG, "Unable to save lock pattern to " + sLockPasswordFilename);
+ } catch (IOException ioe) {
+ // Cant do much
+ Log.e(TAG, "Unable to save lock pattern to " + sLockPasswordFilename);
+ }
+ }
+
+ public int getPasswordMode() {
+ return (int) getLong(PASSWORD_TYPE_KEY, MODE_PATTERN);
+ }
+
+ /**
* Deserialize a pattern.
* @param string The pattern serialized with {@link #patternToString}
* @return The pattern.
@@ -210,7 +302,7 @@
}
return new String(res);
}
-
+
/*
* Generate an SHA-1 hash for the pattern. Not the most secure, but it is
* at least a second level of protection. First level is that the file
@@ -218,11 +310,11 @@
* @param pattern the gesture pattern.
* @return the hash of the pattern in a byte array.
*/
- static byte[] patternToHash(List<LockPatternView.Cell> pattern) {
+ private static byte[] patternToHash(List<LockPatternView.Cell> pattern) {
if (pattern == null) {
return null;
}
-
+
final int patternSize = pattern.size();
byte[] res = new byte[patternSize];
for (int i = 0; i < patternSize; i++) {
@@ -238,11 +330,55 @@
}
}
+ /*
+ * Generate a hash for the given password. To avoid brute force attacks, we use a salted hash.
+ * Not the most secure, but it is at least a second level of protection. First level is that
+ * the file is in a location only readable by the system process.
+ * @param password the gesture pattern.
+ * @return the hash of the pattern in a byte array.
+ */
+ public static byte[] passwordToHash(String password) {
+ if (password == null) {
+ return null;
+ }
+ String algo = null;
+ byte[] hashed = null;
+ try {
+ long salt = 0x2374868151054924L; // TODO: make this unique to device
+ byte[] saltedPassword = (password + Long.toString(salt)).getBytes();
+ byte[] sha1 = MessageDigest.getInstance(algo = "SHA-1").digest(saltedPassword);
+ byte[] md5 = MessageDigest.getInstance(algo = "MD5").digest(saltedPassword);
+ hashed = (toHex(sha1) + toHex(md5)).getBytes();
+ } catch (NoSuchAlgorithmException e) {
+ Log.w(TAG, "Failed to encode string because of missing algorithm: " + algo);
+ }
+ return hashed;
+ }
+
+ private static String toHex(byte[] ary) {
+ final String hex = "0123456789ABCDEF";
+ String ret = "";
+ for (int i = 0; i < ary.length; i++) {
+ ret += hex.charAt((ary[i] >> 4) & 0xf);
+ ret += hex.charAt(ary[i] & 0xf);
+ }
+ return ret;
+ }
+
+ /**
+ * @return Whether the lock password is enabled.
+ */
+ public boolean isLockPasswordEnabled() {
+ long mode = getLong(PASSWORD_TYPE_KEY, 0);
+ return savedPasswordExists() && (mode == MODE_PASSWORD || mode == MODE_PIN);
+ }
+
/**
* @return Whether the lock pattern is enabled.
*/
public boolean isLockPatternEnabled() {
- return getBoolean(Settings.System.LOCK_PATTERN_ENABLED);
+ return getBoolean(Settings.System.LOCK_PATTERN_ENABLED)
+ && getLong(PASSWORD_TYPE_KEY, MODE_PATTERN) == MODE_PATTERN;
}
/**
@@ -361,5 +497,10 @@
android.provider.Settings.System.putLong(mContentResolver, systemSettingKey, value);
}
-
+ public boolean isSecure() {
+ long mode = getPasswordMode();
+ boolean secure = mode == MODE_PATTERN && isLockPatternEnabled() && savedPatternExists()
+ || (mode == MODE_PIN || mode == MODE_PASSWORD) && savedPasswordExists();
+ return secure;
+ }
}
diff --git a/core/java/com/android/internal/widget/SlidingTab.java b/core/java/com/android/internal/widget/SlidingTab.java
index f07b2f1..adafbb4 100644
--- a/core/java/com/android/internal/widget/SlidingTab.java
+++ b/core/java/com/android/internal/widget/SlidingTab.java
@@ -23,8 +23,6 @@
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
@@ -34,7 +32,6 @@
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
@@ -214,7 +211,7 @@
// Create hint TextView
text = new TextView(parent.getContext());
text.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.FILL_PARENT));
+ LayoutParams.MATCH_PARENT));
text.setBackgroundResource(barId);
text.setTextAppearance(parent.getContext(), R.style.TextAppearance_SlidingTabNormal);
// hint.setSingleLine(); // Hmm.. this causes the text to disappear off-screen
diff --git a/core/java/com/android/internal/widget/VerticalTextSpinner.java b/core/java/com/android/internal/widget/VerticalTextSpinner.java
deleted file mode 100644
index 50c528c..0000000
--- a/core/java/com/android/internal/widget/VerticalTextSpinner.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * 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 com.android.internal.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.text.TextPaint;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-
-
-public class VerticalTextSpinner extends View {
-
- private static final int SELECTOR_ARROW_HEIGHT = 15;
-
- private static final int TEXT_SPACING = 18;
- private static final int TEXT_MARGIN_RIGHT = 25;
- private static final int TEXT_SIZE = 22;
-
- /* Keep the calculations as this is really a for loop from
- * -2 to 2 but precalculated so we don't have to do in the onDraw.
- */
- private static final int TEXT1_Y = (TEXT_SIZE * (-2 + 2)) + (TEXT_SPACING * (-2 + 1));
- private static final int TEXT2_Y = (TEXT_SIZE * (-1 + 2)) + (TEXT_SPACING * (-1 + 1));
- private static final int TEXT3_Y = (TEXT_SIZE * (0 + 2)) + (TEXT_SPACING * (0 + 1));
- private static final int TEXT4_Y = (TEXT_SIZE * (1 + 2)) + (TEXT_SPACING * (1 + 1));
- private static final int TEXT5_Y = (TEXT_SIZE * (2 + 2)) + (TEXT_SPACING * (2 + 1));
-
- private static final int SCROLL_MODE_NONE = 0;
- private static final int SCROLL_MODE_UP = 1;
- private static final int SCROLL_MODE_DOWN = 2;
-
- private static final long DEFAULT_SCROLL_INTERVAL_MS = 400;
- private static final int SCROLL_DISTANCE = TEXT_SIZE + TEXT_SPACING;
- private static final int MIN_ANIMATIONS = 4;
-
- private final Drawable mBackgroundFocused;
- private final Drawable mSelectorFocused;
- private final Drawable mSelectorNormal;
- private final int mSelectorDefaultY;
- private final int mSelectorMinY;
- private final int mSelectorMaxY;
- private final int mSelectorHeight;
- private final TextPaint mTextPaintDark;
- private final TextPaint mTextPaintLight;
-
- private int mSelectorY;
- private Drawable mSelector;
- private int mDownY;
- private boolean isDraggingSelector;
- private int mScrollMode;
- private long mScrollInterval;
- private boolean mIsAnimationRunning;
- private boolean mStopAnimation;
- private boolean mWrapAround = true;
-
- private int mTotalAnimatedDistance;
- private int mNumberOfAnimations;
- private long mDelayBetweenAnimations;
- private int mDistanceOfEachAnimation;
-
- private String[] mTextList;
- private int mCurrentSelectedPos;
- private OnChangedListener mListener;
-
- private String mText1;
- private String mText2;
- private String mText3;
- private String mText4;
- private String mText5;
-
- public interface OnChangedListener {
- void onChanged(
- VerticalTextSpinner spinner, int oldPos, int newPos, String[] items);
- }
-
- public VerticalTextSpinner(Context context) {
- this(context, null);
- }
-
- public VerticalTextSpinner(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public VerticalTextSpinner(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
-
- mBackgroundFocused = context.getResources().getDrawable(com.android.internal.R.drawable.pickerbox_background);
- mSelectorFocused = context.getResources().getDrawable(com.android.internal.R.drawable.pickerbox_selected);
- mSelectorNormal = context.getResources().getDrawable(com.android.internal.R.drawable.pickerbox_unselected);
-
- mSelectorHeight = mSelectorFocused.getIntrinsicHeight();
- mSelectorDefaultY = (mBackgroundFocused.getIntrinsicHeight() - mSelectorHeight) / 2;
- mSelectorMinY = 0;
- mSelectorMaxY = mBackgroundFocused.getIntrinsicHeight() - mSelectorHeight;
-
- mSelector = mSelectorNormal;
- mSelectorY = mSelectorDefaultY;
-
- mTextPaintDark = new TextPaint(Paint.ANTI_ALIAS_FLAG);
- mTextPaintDark.setTextSize(TEXT_SIZE);
- mTextPaintDark.setColor(context.getResources().getColor(com.android.internal.R.color.primary_text_light));
-
- mTextPaintLight = new TextPaint(Paint.ANTI_ALIAS_FLAG);
- mTextPaintLight.setTextSize(TEXT_SIZE);
- mTextPaintLight.setColor(context.getResources().getColor(com.android.internal.R.color.secondary_text_dark));
-
- mScrollMode = SCROLL_MODE_NONE;
- mScrollInterval = DEFAULT_SCROLL_INTERVAL_MS;
- calculateAnimationValues();
- }
-
- public void setOnChangeListener(OnChangedListener listener) {
- mListener = listener;
- }
-
- public void setItems(String[] textList) {
- mTextList = textList;
- calculateTextPositions();
- }
-
- public void setSelectedPos(int selectedPos) {
- mCurrentSelectedPos = selectedPos;
- calculateTextPositions();
- postInvalidate();
- }
-
- public void setScrollInterval(long interval) {
- mScrollInterval = interval;
- calculateAnimationValues();
- }
-
- public void setWrapAround(boolean wrap) {
- mWrapAround = wrap;
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
-
- /* This is a bit confusing, when we get the key event
- * DPAD_DOWN we actually roll the spinner up. When the
- * key event is DPAD_UP we roll the spinner down.
- */
- if ((keyCode == KeyEvent.KEYCODE_DPAD_UP) && canScrollDown()) {
- mScrollMode = SCROLL_MODE_DOWN;
- scroll();
- mStopAnimation = true;
- return true;
- } else if ((keyCode == KeyEvent.KEYCODE_DPAD_DOWN) && canScrollUp()) {
- mScrollMode = SCROLL_MODE_UP;
- scroll();
- mStopAnimation = true;
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- private boolean canScrollDown() {
- return (mCurrentSelectedPos > 0) || mWrapAround;
- }
-
- private boolean canScrollUp() {
- return ((mCurrentSelectedPos < (mTextList.length - 1)) || mWrapAround);
- }
-
- @Override
- protected void onFocusChanged(boolean gainFocus, int direction,
- Rect previouslyFocusedRect) {
- if (gainFocus) {
- setBackgroundDrawable(mBackgroundFocused);
- mSelector = mSelectorFocused;
- } else {
- setBackgroundDrawable(null);
- mSelector = mSelectorNormal;
- mSelectorY = mSelectorDefaultY;
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- final int action = event.getAction();
- final int y = (int) event.getY();
-
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- requestFocus();
- mDownY = y;
- isDraggingSelector = (y >= mSelectorY) && (y <= (mSelectorY + mSelector.getIntrinsicHeight()));
- break;
-
- case MotionEvent.ACTION_MOVE:
- if (isDraggingSelector) {
- int top = mSelectorDefaultY + (y - mDownY);
- if (top <= mSelectorMinY && canScrollDown()) {
- mSelectorY = mSelectorMinY;
- mStopAnimation = false;
- if (mScrollMode != SCROLL_MODE_DOWN) {
- mScrollMode = SCROLL_MODE_DOWN;
- scroll();
- }
- } else if (top >= mSelectorMaxY && canScrollUp()) {
- mSelectorY = mSelectorMaxY;
- mStopAnimation = false;
- if (mScrollMode != SCROLL_MODE_UP) {
- mScrollMode = SCROLL_MODE_UP;
- scroll();
- }
- } else {
- mSelectorY = top;
- mStopAnimation = true;
- }
- }
- break;
-
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- default:
- mSelectorY = mSelectorDefaultY;
- mStopAnimation = true;
- invalidate();
- break;
- }
- return true;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
-
- /* The bounds of the selector */
- final int selectorLeft = 0;
- final int selectorTop = mSelectorY;
- final int selectorRight = mMeasuredWidth;
- final int selectorBottom = mSelectorY + mSelectorHeight;
-
- /* Draw the selector */
- mSelector.setBounds(selectorLeft, selectorTop, selectorRight, selectorBottom);
- mSelector.draw(canvas);
-
- if (mTextList == null) {
-
- /* We're not setup with values so don't draw anything else */
- return;
- }
-
- final TextPaint textPaintDark = mTextPaintDark;
- if (hasFocus()) {
-
- /* The bounds of the top area where the text should be light */
- final int topLeft = 0;
- final int topTop = 0;
- final int topRight = selectorRight;
- final int topBottom = selectorTop + SELECTOR_ARROW_HEIGHT;
-
- /* Assign a bunch of local finals for performance */
- final String text1 = mText1;
- final String text2 = mText2;
- final String text3 = mText3;
- final String text4 = mText4;
- final String text5 = mText5;
- final TextPaint textPaintLight = mTextPaintLight;
-
- /*
- * Draw the 1st, 2nd and 3rd item in light only, clip it so it only
- * draws in the area above the selector
- */
- canvas.save();
- canvas.clipRect(topLeft, topTop, topRight, topBottom);
- drawText(canvas, text1, TEXT1_Y
- + mTotalAnimatedDistance, textPaintLight);
- drawText(canvas, text2, TEXT2_Y
- + mTotalAnimatedDistance, textPaintLight);
- drawText(canvas, text3,
- TEXT3_Y + mTotalAnimatedDistance, textPaintLight);
- canvas.restore();
-
- /*
- * Draw the 2nd, 3rd and 4th clipped to the selector bounds in dark
- * paint
- */
- canvas.save();
- canvas.clipRect(selectorLeft, selectorTop + SELECTOR_ARROW_HEIGHT,
- selectorRight, selectorBottom - SELECTOR_ARROW_HEIGHT);
- drawText(canvas, text2, TEXT2_Y
- + mTotalAnimatedDistance, textPaintDark);
- drawText(canvas, text3,
- TEXT3_Y + mTotalAnimatedDistance, textPaintDark);
- drawText(canvas, text4,
- TEXT4_Y + mTotalAnimatedDistance, textPaintDark);
- canvas.restore();
-
- /* The bounds of the bottom area where the text should be light */
- final int bottomLeft = 0;
- final int bottomTop = selectorBottom - SELECTOR_ARROW_HEIGHT;
- final int bottomRight = selectorRight;
- final int bottomBottom = mMeasuredHeight;
-
- /*
- * Draw the 3rd, 4th and 5th in white text, clip it so it only draws
- * in the area below the selector.
- */
- canvas.save();
- canvas.clipRect(bottomLeft, bottomTop, bottomRight, bottomBottom);
- drawText(canvas, text3,
- TEXT3_Y + mTotalAnimatedDistance, textPaintLight);
- drawText(canvas, text4,
- TEXT4_Y + mTotalAnimatedDistance, textPaintLight);
- drawText(canvas, text5,
- TEXT5_Y + mTotalAnimatedDistance, textPaintLight);
- canvas.restore();
-
- } else {
- drawText(canvas, mText3, TEXT3_Y, textPaintDark);
- }
- if (mIsAnimationRunning) {
- if ((Math.abs(mTotalAnimatedDistance) + mDistanceOfEachAnimation) > SCROLL_DISTANCE) {
- mTotalAnimatedDistance = 0;
- if (mScrollMode == SCROLL_MODE_UP) {
- int oldPos = mCurrentSelectedPos;
- int newPos = getNewIndex(1);
- if (newPos >= 0) {
- mCurrentSelectedPos = newPos;
- if (mListener != null) {
- mListener.onChanged(this, oldPos, mCurrentSelectedPos, mTextList);
- }
- }
- if (newPos < 0 || ((newPos >= mTextList.length - 1) && !mWrapAround)) {
- mStopAnimation = true;
- }
- calculateTextPositions();
- } else if (mScrollMode == SCROLL_MODE_DOWN) {
- int oldPos = mCurrentSelectedPos;
- int newPos = getNewIndex(-1);
- if (newPos >= 0) {
- mCurrentSelectedPos = newPos;
- if (mListener != null) {
- mListener.onChanged(this, oldPos, mCurrentSelectedPos, mTextList);
- }
- }
- if (newPos < 0 || (newPos == 0 && !mWrapAround)) {
- mStopAnimation = true;
- }
- calculateTextPositions();
- }
- if (mStopAnimation) {
- final int previousScrollMode = mScrollMode;
-
- /* No longer scrolling, we wait till the current animation
- * completes then we stop.
- */
- mIsAnimationRunning = false;
- mStopAnimation = false;
- mScrollMode = SCROLL_MODE_NONE;
-
- /* If the current selected item is an empty string
- * scroll past it.
- */
- if ("".equals(mTextList[mCurrentSelectedPos])) {
- mScrollMode = previousScrollMode;
- scroll();
- mStopAnimation = true;
- }
- }
- } else {
- if (mScrollMode == SCROLL_MODE_UP) {
- mTotalAnimatedDistance -= mDistanceOfEachAnimation;
- } else if (mScrollMode == SCROLL_MODE_DOWN) {
- mTotalAnimatedDistance += mDistanceOfEachAnimation;
- }
- }
- if (mDelayBetweenAnimations > 0) {
- postInvalidateDelayed(mDelayBetweenAnimations);
- } else {
- invalidate();
- }
- }
- }
-
- /**
- * Called every time the text items or current position
- * changes. We calculate store we don't have to calculate
- * onDraw.
- */
- private void calculateTextPositions() {
- mText1 = getTextToDraw(-2);
- mText2 = getTextToDraw(-1);
- mText3 = getTextToDraw(0);
- mText4 = getTextToDraw(1);
- mText5 = getTextToDraw(2);
- }
-
- private String getTextToDraw(int offset) {
- int index = getNewIndex(offset);
- if (index < 0) {
- return "";
- }
- return mTextList[index];
- }
-
- private int getNewIndex(int offset) {
- int index = mCurrentSelectedPos + offset;
- if (index < 0) {
- if (mWrapAround) {
- index += mTextList.length;
- } else {
- return -1;
- }
- } else if (index >= mTextList.length) {
- if (mWrapAround) {
- index -= mTextList.length;
- } else {
- return -1;
- }
- }
- return index;
- }
-
- private void scroll() {
- if (mIsAnimationRunning) {
- return;
- }
- mTotalAnimatedDistance = 0;
- mIsAnimationRunning = true;
- invalidate();
- }
-
- private void calculateAnimationValues() {
- mNumberOfAnimations = (int) mScrollInterval / SCROLL_DISTANCE;
- if (mNumberOfAnimations < MIN_ANIMATIONS) {
- mNumberOfAnimations = MIN_ANIMATIONS;
- mDistanceOfEachAnimation = SCROLL_DISTANCE / mNumberOfAnimations;
- mDelayBetweenAnimations = 0;
- } else {
- mDistanceOfEachAnimation = SCROLL_DISTANCE / mNumberOfAnimations;
- mDelayBetweenAnimations = mScrollInterval / mNumberOfAnimations;
- }
- }
-
- private void drawText(Canvas canvas, String text, int y, TextPaint paint) {
- int width = (int) paint.measureText(text);
- int x = getMeasuredWidth() - width - TEXT_MARGIN_RIGHT;
- canvas.drawText(text, x, y, paint);
- }
-
- public int getCurrentSelectedPos() {
- return mCurrentSelectedPos;
- }
-}
diff --git a/core/java/com/google/android/net/GoogleHttpClient.java b/core/java/com/google/android/net/GoogleHttpClient.java
deleted file mode 100644
index 0337672..0000000
--- a/core/java/com/google/android/net/GoogleHttpClient.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * 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 com.google.android.net;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.net.TrafficStats;
-import android.os.Build;
-import android.os.SystemClock;
-import android.provider.Checkin;
-import android.util.Config;
-import android.util.Log;
-import com.android.common.AndroidHttpClient;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolException;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.scheme.LayeredSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.conn.scheme.SocketFactory;
-import org.apache.http.impl.client.EntityEnclosingRequestWrapper;
-import org.apache.http.impl.client.RequestWrapper;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * {@link AndroidHttpClient} wrapper that uses {@link UrlRules} to rewrite URLs
- * and otherwise tweak HTTP requests.
- */
-public class GoogleHttpClient implements HttpClient {
- private static final String TAG = "GoogleHttpClient";
- private static final boolean LOCAL_LOGV = Config.LOGV || false;
-
- /** Exception thrown when a request is blocked by the URL rules. */
- public static class BlockedRequestException extends IOException {
- private final UrlRules.Rule mRule;
- BlockedRequestException(UrlRules.Rule rule) {
- super("Blocked by rule: " + rule.mName);
- mRule = rule;
- }
- }
-
- private final AndroidHttpClient mClient;
- private final ContentResolver mResolver;
- private final String mAppName, mUserAgent;
- private final ThreadLocal<Boolean> mConnectionAllocated = new ThreadLocal<Boolean>();
-
- /**
- * Create an HTTP client without SSL session persistence.
- * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)}
- */
- public GoogleHttpClient(ContentResolver resolver, String userAgent) {
- mClient = AndroidHttpClient.newInstance(userAgent);
- mResolver = resolver;
- mUserAgent = mAppName = userAgent;
- }
-
- /**
- * Create an HTTP client without SSL session persistence.
- * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)}
- */
- public GoogleHttpClient(ContentResolver resolver, String appAndVersion,
- boolean gzipCapable) {
- this(resolver, null /* cache */, appAndVersion, gzipCapable);
- }
-
- /**
- * Create an HTTP client. Normaly this client is shared throughout an app.
- * The HTTP client will construct its User-Agent as follows:
- *
- * <appAndVersion> (<build device> <build id>)
- * or
- * <appAndVersion> (<build device> <build id>); gzip
- * (if gzip capable)
- *
- * The context has settings for URL rewriting rules and is used to enable
- * SSL session persistence.
- *
- * @param context application context.
- * @param appAndVersion Base app and version to use in the User-Agent.
- * e.g., "MyApp/1.0"
- * @param gzipCapable Whether or not this client is able to consume gzip'd
- * responses. Only used to modify the User-Agent, not other request
- * headers. Needed because Google servers require gzip in the User-Agent
- * in order to return gzip'd content.
- */
- public GoogleHttpClient(Context context, String appAndVersion, boolean gzipCapable) {
- this(context.getContentResolver(),
- SSLClientSessionCacheFactory.getCache(context),
- appAndVersion, gzipCapable);
- }
-
- private GoogleHttpClient(ContentResolver resolver,
- SSLClientSessionCache cache,
- String appAndVersion, boolean gzipCapable) {
- String userAgent = appAndVersion + " (" + Build.DEVICE + " " + Build.ID + ")";
- if (gzipCapable) {
- userAgent = userAgent + "; gzip";
- }
-
- mClient = AndroidHttpClient.newInstance(userAgent, cache);
- mResolver = resolver;
- mAppName = appAndVersion;
- mUserAgent = userAgent;
-
- // Wrap all the socket factories with the appropriate wrapper. (Apache
- // HTTP, curse its black and stupid heart, inspects the SocketFactory to
- // see if it's a LayeredSocketFactory, so we need two wrapper classes.)
- SchemeRegistry registry = getConnectionManager().getSchemeRegistry();
- for (String name : registry.getSchemeNames()) {
- Scheme scheme = registry.unregister(name);
- SocketFactory sf = scheme.getSocketFactory();
- if (sf instanceof LayeredSocketFactory) {
- sf = new WrappedLayeredSocketFactory((LayeredSocketFactory) sf);
- } else {
- sf = new WrappedSocketFactory(sf);
- }
- registry.register(new Scheme(name, sf, scheme.getDefaultPort()));
- }
- }
-
- /**
- * Delegating wrapper for SocketFactory records when sockets are connected.
- * We use this to know whether a connection was created vs reused, to
- * gather per-app statistics about connection reuse rates.
- * (Note, we record only *connection*, not *creation* of sockets --
- * what we care about is the network overhead of an actual TCP connect.)
- */
- private class WrappedSocketFactory implements SocketFactory {
- private SocketFactory mDelegate;
- private WrappedSocketFactory(SocketFactory delegate) { mDelegate = delegate; }
- public final Socket createSocket() throws IOException { return mDelegate.createSocket(); }
- public final boolean isSecure(Socket s) { return mDelegate.isSecure(s); }
-
- public final Socket connectSocket(
- Socket s, String h, int p,
- InetAddress la, int lp, HttpParams params) throws IOException {
- mConnectionAllocated.set(Boolean.TRUE);
- return mDelegate.connectSocket(s, h, p, la, lp, params);
- }
- }
-
- /** Like WrappedSocketFactory, but for the LayeredSocketFactory subclass. */
- private class WrappedLayeredSocketFactory
- extends WrappedSocketFactory implements LayeredSocketFactory {
- private LayeredSocketFactory mDelegate;
- private WrappedLayeredSocketFactory(LayeredSocketFactory sf) { super(sf); mDelegate = sf; }
-
- public final Socket createSocket(Socket s, String host, int port, boolean autoClose)
- throws IOException {
- return mDelegate.createSocket(s, host, port, autoClose);
- }
- }
-
- /**
- * Release resources associated with this client. You must call this,
- * or significant resources (sockets and memory) may be leaked.
- */
- public void close() {
- mClient.close();
- }
-
- /** Execute a request without applying and rewrite rules. */
- public HttpResponse executeWithoutRewriting(
- HttpUriRequest request, HttpContext context)
- throws IOException {
- int code = -1;
- long start = SystemClock.elapsedRealtime();
- try {
- HttpResponse response;
- mConnectionAllocated.set(null);
-
- if (NetworkStatsEntity.shouldLogNetworkStats()) {
- // TODO: if we're logging network stats, and if the apache library is configured
- // to follow redirects, count each redirect as an additional round trip.
-
- int uid = android.os.Process.myUid();
- long startTx = TrafficStats.getUidTxBytes(uid);
- long startRx = TrafficStats.getUidRxBytes(uid);
-
- response = mClient.execute(request, context);
- HttpEntity origEntity = response == null ? null : response.getEntity();
- if (origEntity != null) {
- // yeah, we compute the same thing below. we do need to compute this here
- // so we can wrap the HttpEntity in the response.
- long now = SystemClock.elapsedRealtime();
- long elapsed = now - start;
- NetworkStatsEntity entity = new NetworkStatsEntity(origEntity,
- mAppName, uid, startTx, startRx,
- elapsed /* response latency */, now /* processing start time */);
- response.setEntity(entity);
- }
- } else {
- response = mClient.execute(request, context);
- }
-
- code = response.getStatusLine().getStatusCode();
- return response;
- } finally {
- // Record some statistics to the checkin service about the outcome.
- // Note that this is only describing execute(), not body download.
- // We assume the database writes are much faster than network I/O,
- // and not worth running in a background thread or anything.
- try {
- long elapsed = SystemClock.elapsedRealtime() - start;
- ContentValues values = new ContentValues();
- values.put(Checkin.Stats.COUNT, 1);
- values.put(Checkin.Stats.SUM, elapsed / 1000.0);
-
- values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REQUEST + ":" + mAppName);
- mResolver.insert(Checkin.Stats.CONTENT_URI, values);
-
- // No sockets and no exceptions means we successfully reused a connection
- if (mConnectionAllocated.get() == null && code >= 0) {
- values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REUSED + ":" + mAppName);
- mResolver.insert(Checkin.Stats.CONTENT_URI, values);
- }
-
- String status = code < 0 ? "IOException" : Integer.toString(code);
- values.put(Checkin.Stats.TAG,
- Checkin.Stats.Tag.HTTP_STATUS + ":" + mAppName + ":" + status);
- mResolver.insert(Checkin.Stats.CONTENT_URI, values);
- } catch (Exception e) {
- Log.e(TAG, "Error recording stats", e);
- }
- }
- }
-
- public String rewriteURI(String original) {
- UrlRules rules = UrlRules.getRules(mResolver);
- UrlRules.Rule rule = rules.matchRule(original);
- return rule.apply(original);
- }
-
- public HttpResponse execute(HttpUriRequest request, HttpContext context)
- throws IOException {
- // Rewrite the supplied URL...
- URI uri = request.getURI();
- String original = uri.toString();
- UrlRules rules = UrlRules.getRules(mResolver);
- UrlRules.Rule rule = rules.matchRule(original);
- String rewritten = rule.apply(original);
-
- if (rewritten == null) {
- Log.w(TAG, "Blocked by " + rule.mName + ": " + original);
- throw new BlockedRequestException(rule);
- } else if (rewritten == original) {
- return executeWithoutRewriting(request, context); // Pass through
- }
-
- try {
- uri = new URI(rewritten);
- } catch (URISyntaxException e) {
- throw new RuntimeException("Bad URL from rule: " + rule.mName, e);
- }
-
- // Wrap request so we can replace the URI.
- RequestWrapper wrapper = wrapRequest(request);
- wrapper.setURI(uri);
- request = wrapper;
-
- if (LOCAL_LOGV) Log.v(TAG, "Rule " + rule.mName + ": " + original + " -> " + rewritten);
- return executeWithoutRewriting(request, context);
- }
-
- /**
- * Wraps the request making it mutable.
- */
- private static RequestWrapper wrapRequest(HttpUriRequest request)
- throws IOException {
- try {
- // We have to wrap it with the right type. Some code performs
- // instanceof checks.
- RequestWrapper wrapped;
- if (request instanceof HttpEntityEnclosingRequest) {
- wrapped = new EntityEnclosingRequestWrapper(
- (HttpEntityEnclosingRequest) request);
- } else {
- wrapped = new RequestWrapper(request);
- }
-
- // Copy the headers from the original request into the wrapper.
- wrapped.resetHeaders();
-
- return wrapped;
- } catch (ProtocolException e) {
- throw new ClientProtocolException(e);
- }
- }
-
- /**
- * Mark a user agent as one Google will trust to handle gzipped content.
- * {@link AndroidHttpClient#modifyRequestToAcceptGzipResponse} is (also)
- * necessary but not sufficient -- many browsers claim to accept gzip but
- * have broken handling, so Google checks the user agent as well.
- *
- * @param originalUserAgent to modify (however you identify yourself)
- * @return user agent with a "yes, I really can handle gzip" token added.
- * @deprecated Use {@link #GoogleHttpClient(android.content.ContentResolver, String, boolean)}
- */
- public static String getGzipCapableUserAgent(String originalUserAgent) {
- return originalUserAgent + "; gzip";
- }
-
- // HttpClient wrapper methods.
-
- public HttpParams getParams() {
- return mClient.getParams();
- }
-
- public ClientConnectionManager getConnectionManager() {
- return mClient.getConnectionManager();
- }
-
- public HttpResponse execute(HttpUriRequest request) throws IOException {
- return execute(request, (HttpContext) null);
- }
-
- public HttpResponse execute(HttpHost target, HttpRequest request)
- throws IOException {
- return mClient.execute(target, request);
- }
-
- public HttpResponse execute(HttpHost target, HttpRequest request,
- HttpContext context) throws IOException {
- return mClient.execute(target, request, context);
- }
-
- public <T> T execute(HttpUriRequest request,
- ResponseHandler<? extends T> responseHandler)
- throws IOException, ClientProtocolException {
- return mClient.execute(request, responseHandler);
- }
-
- public <T> T execute(HttpUriRequest request,
- ResponseHandler<? extends T> responseHandler, HttpContext context)
- throws IOException, ClientProtocolException {
- return mClient.execute(request, responseHandler, context);
- }
-
- public <T> T execute(HttpHost target, HttpRequest request,
- ResponseHandler<? extends T> responseHandler) throws IOException,
- ClientProtocolException {
- return mClient.execute(target, request, responseHandler);
- }
-
- public <T> T execute(HttpHost target, HttpRequest request,
- ResponseHandler<? extends T> responseHandler, HttpContext context)
- throws IOException, ClientProtocolException {
- return mClient.execute(target, request, responseHandler, context);
- }
-
- /**
- * Enables cURL request logging for this client.
- *
- * @param name to log messages with
- * @param level at which to log messages (see {@link android.util.Log})
- */
- public void enableCurlLogging(String name, int level) {
- mClient.enableCurlLogging(name, level);
- }
-
- /**
- * Disables cURL logging for this client.
- */
- public void disableCurlLogging() {
- mClient.disableCurlLogging();
- }
-}
diff --git a/core/java/com/google/android/net/NetworkStatsEntity.java b/core/java/com/google/android/net/NetworkStatsEntity.java
deleted file mode 100644
index a22fa1e..0000000
--- a/core/java/com/google/android/net/NetworkStatsEntity.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.google.android.net;
-
-import android.net.TrafficStats;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.util.EventLog;
-import org.apache.http.HttpEntity;
-import org.apache.http.entity.HttpEntityWrapper;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-public class NetworkStatsEntity extends HttpEntityWrapper {
-
- private static final int HTTP_STATS_EVENT = 52001;
-
- private class NetworkStatsInputStream extends FilterInputStream {
-
- public NetworkStatsInputStream(InputStream wrapped) {
- super(wrapped);
- }
-
- @Override
- public void close() throws IOException {
- try {
- super.close();
- } finally {
- long processingTime = SystemClock.elapsedRealtime() - mProcessingStartTime;
- long tx = TrafficStats.getUidTxBytes(mUid);
- long rx = TrafficStats.getUidRxBytes(mUid);
-
- EventLog.writeEvent(HTTP_STATS_EVENT, mUa, mResponseLatency, processingTime,
- tx - mStartTx, rx - mStartRx);
- }
- }
- }
-
- private final String mUa;
- private final int mUid;
- private final long mStartTx;
- private final long mStartRx;
- private final long mResponseLatency;
- private final long mProcessingStartTime;
-
- public NetworkStatsEntity(HttpEntity orig, String ua,
- int uid, long startTx, long startRx, long responseLatency,
- long processingStartTime) {
- super(orig);
- this.mUa = ua;
- this.mUid = uid;
- this.mStartTx = startTx;
- this.mStartRx = startRx;
- this.mResponseLatency = responseLatency;
- this.mProcessingStartTime = processingStartTime;
- }
-
- public static boolean shouldLogNetworkStats() {
- return "1".equals(SystemProperties.get("googlehttpclient.logstats"));
- }
-
- @Override
- public InputStream getContent() throws IOException {
- InputStream orig = super.getContent();
- return new NetworkStatsInputStream(orig);
- }
-}
diff --git a/core/java/com/google/android/net/SSLClientSessionCacheFactory.java b/core/java/com/google/android/net/SSLClientSessionCacheFactory.java
deleted file mode 100644
index 6570a9bd..0000000
--- a/core/java/com/google/android/net/SSLClientSessionCacheFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.google.android.net;
-
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
-import android.content.Context;
-import android.provider.Settings;
-import android.util.Log;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.android.internal.net.DbSSLSessionCache;
-
-/**
- * Factory that returns the appropriate implementation of a {@link SSLClientSessionCache} based
- * on gservices.
- *
- * @hide
- */
-// TODO: return a proxied implementation that is updated as the gservices value changes.
-public final class SSLClientSessionCacheFactory {
-
- private static final String TAG = "SSLClientSessionCacheFactory";
-
- public static final String DB = "db";
- public static final String FILE = "file";
-
- // utility class
- private SSLClientSessionCacheFactory() {}
-
- /**
- * Returns a new {@link SSLClientSessionCache} based on the persistent cache that's specified,
- * if any, in gservices. If no cache is specified, returns null.
- * @param context The application context used for the per-process persistent cache.
- * @return A new {@link SSLClientSessionCache}, or null if no persistent cache is configured.
- */
- public static SSLClientSessionCache getCache(Context context) {
- String type = Settings.Gservices.getString(context.getContentResolver(),
- Settings.Gservices.SSL_SESSION_CACHE);
-
- if (type != null) {
- if (DB.equals(type)) {
- return DbSSLSessionCache.getInstanceForPackage(context);
- } else if (FILE.equals(type)) {
- File dir = context.getFilesDir();
- File cacheDir = new File(dir, "sslcache");
- if (!cacheDir.exists()) {
- cacheDir.mkdir();
- }
- try {
- return FileClientSessionCache.usingDirectory(cacheDir);
- } catch (IOException ioe) {
- Log.w(TAG, "Unable to create FileClientSessionCache in " + cacheDir.getName(), ioe);
- return null;
- }
- } else {
- Log.w(TAG, "Ignoring unrecognized type: '" + type + "'");
- }
- }
- return null;
- }
-}
diff --git a/core/java/com/google/android/net/UrlRules.java b/core/java/com/google/android/net/UrlRules.java
deleted file mode 100644
index 54d139d..0000000
--- a/core/java/com/google/android/net/UrlRules.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * 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 com.google.android.net;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.provider.Checkin;
-import android.provider.Settings;
-import android.util.Config;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A set of rules rewriting and blocking URLs. Used to offer a point of
- * control for redirecting HTTP requests, often to the Android proxy server.
- *
- * <p>Each rule has the following format:
- *
- * <pre><em>url-prefix</em> [REWRITE <em>new-prefix</em>] [BLOCK]</pre>
- *
- * <p>Any URL which starts with <em>url-prefix</em> will trigger the rule.
- * If BLOCK is specified, requests to that URL will be blocked and fail.
- * If REWRITE is specified, the matching prefix will be removed and replaced
- * with <em>new-prefix</em>. (If both are specified, BLOCK wins.) Case is
- * insensitive for the REWRITE and BLOCK keywords, but sensitive for URLs.
- *
- * <p>In Gservices, the value of any key that starts with "url:" will be
- * interpreted as a rule. The full name of the key is unimportant (but can
- * be used to document the intent of the rule, and must be unique).
- * Example gservices keys:
- *
- * <pre>
- * url:use_proxy_for_calendar = "http://www.google.com/calendar/ REWRITE http://android.clients.google.com/proxy/calendar/"
- * url:stop_crash_reports = "http://android.clients.google.com/crash/ BLOCK"
- * url:use_ssl_for_contacts = "http://www.google.com/m8/ REWRITE https://www.google.com/m8/"
- * </pre>
- */
-public class UrlRules {
- public static final String TAG = "UrlRules";
- public static final boolean LOCAL_LOGV = Config.LOGV || false;
-
- /** Thrown when the rewrite rules can't be parsed. */
- public static class RuleFormatException extends Exception {
- public RuleFormatException(String msg) { super(msg); }
- }
-
- /** A single rule specifying actions for URLs matching a certain prefix. */
- public static class Rule implements Comparable {
- /** Name assigned to the rule (for logging and debugging). */
- public final String mName;
-
- /** Prefix required to match this rule. */
- public final String mPrefix;
-
- /** Text to replace mPrefix with (null to leave alone). */
- public final String mRewrite;
-
- /** True if matching URLs should be blocked. */
- public final boolean mBlock;
-
- /** Default rule that does nothing. */
- public static final Rule DEFAULT = new Rule();
-
- /** Parse a rewrite rule as given in a Gservices value. */
- public Rule(String name, String rule) throws RuleFormatException {
- mName = name;
- String[] words = PATTERN_SPACE_PLUS.split(rule);
- if (words.length == 0) throw new RuleFormatException("Empty rule");
-
- mPrefix = words[0];
- String rewrite = null;
- boolean block = false;
- for (int pos = 1; pos < words.length; ) {
- String word = words[pos].toLowerCase();
- if (word.equals("rewrite") && pos + 1 < words.length) {
- rewrite = words[pos + 1];
- pos += 2;
- } else if (word.equals("block")) {
- block = true;
- pos += 1;
- } else {
- throw new RuleFormatException("Illegal rule: " + rule);
- }
- // TODO: Parse timeout specifications, etc.
- }
-
- mRewrite = rewrite;
- mBlock = block;
- }
-
- /** Create the default Rule. */
- private Rule() {
- mName = "DEFAULT";
- mPrefix = "";
- mRewrite = null;
- mBlock = false;
- }
-
- /**
- * Apply the rule to a particular URL (assumed to match the rule).
- * @param url to rewrite or modify.
- * @return modified URL, or null if the URL is blocked.
- */
- public String apply(String url) {
- if (mBlock) {
- return null;
- } else if (mRewrite != null) {
- return mRewrite + url.substring(mPrefix.length());
- } else {
- return url;
- }
- }
-
- /** More generic rules are greater than more specific rules. */
- public int compareTo(Object o) {
- return ((Rule) o).mPrefix.compareTo(mPrefix);
- }
- }
-
- /** Cached rule set from Gservices. */
- private static UrlRules sCachedRules = new UrlRules(new Rule[] {});
-
- private static final Pattern PATTERN_SPACE_PLUS = Pattern.compile(" +");
- private static final Pattern RULE_PATTERN = Pattern.compile("\\W");
-
- /** Gservices digest when sCachedRules was cached. */
- private static String sCachedDigest = null;
-
- /** Currently active set of Rules. */
- private final Rule[] mRules;
-
- /** Regular expression with one capturing group for each Rule. */
- private final Pattern mPattern;
-
- /**
- * Create a rewriter from an array of Rules. Normally used only for
- * testing. Instead, use {@link #getRules} to get rules from Gservices.
- * @param rules to use.
- */
- public UrlRules(Rule[] rules) {
- // Sort the rules to put the most specific rules first.
- Arrays.sort(rules);
-
- // Construct a regular expression, escaping all the prefix strings.
- StringBuilder pattern = new StringBuilder("(");
- for (int i = 0; i < rules.length; ++i) {
- if (i > 0) pattern.append(")|(");
- pattern.append(RULE_PATTERN.matcher(rules[i].mPrefix).replaceAll("\\\\$0"));
- }
- mPattern = Pattern.compile(pattern.append(")").toString());
- mRules = rules;
- }
-
- /**
- * Match a string against every Rule and find one that matches.
- * @param uri to match against the Rules in the rewriter.
- * @return the most specific matching Rule, or Rule.DEFAULT if none match.
- */
- public Rule matchRule(String url) {
- Matcher matcher = mPattern.matcher(url);
- if (matcher.lookingAt()) {
- for (int i = 0; i < mRules.length; ++i) {
- if (matcher.group(i + 1) != null) {
- return mRules[i]; // Rules are sorted most specific first.
- }
- }
- }
- return Rule.DEFAULT;
- }
-
- /**
- * Get the (possibly cached) UrlRules based on the rules in Gservices.
- * @param resolver to use for accessing the Gservices database.
- * @return an updated UrlRules instance
- */
- public static synchronized UrlRules getRules(ContentResolver resolver) {
- String digest = Settings.Gservices.getString(resolver,
- Settings.Gservices.PROVISIONING_DIGEST);
- if (sCachedDigest != null && sCachedDigest.equals(digest)) {
- // The digest is the same, so the rules are the same.
- if (LOCAL_LOGV) Log.v(TAG, "Using cached rules for digest: " + digest);
- return sCachedRules;
- }
-
- if (LOCAL_LOGV) Log.v(TAG, "Scanning for Gservices \"url:*\" rules");
- Cursor cursor = resolver.query(Settings.Gservices.CONTENT_URI,
- new String[] {
- Settings.Gservices.NAME,
- Settings.Gservices.VALUE
- },
- Settings.Gservices.NAME + " like \"url:%\"", null,
- Settings.Gservices.NAME);
- try {
- ArrayList<Rule> rules = new ArrayList<Rule>();
- while (cursor.moveToNext()) {
- try {
- String name = cursor.getString(0).substring(4); // "url:X"
- String value = cursor.getString(1);
- if (value == null || value.length() == 0) continue;
- if (LOCAL_LOGV) Log.v(TAG, " Rule " + name + ": " + value);
- rules.add(new Rule(name, value));
- } catch (RuleFormatException e) {
- // Oops, Gservices has an invalid rule! Skip it.
- Log.e(TAG, "Invalid rule from Gservices", e);
- Checkin.logEvent(resolver,
- Checkin.Events.Tag.GSERVICES_ERROR, e.toString());
- }
- }
- sCachedRules = new UrlRules(rules.toArray(new Rule[rules.size()]));
- sCachedDigest = digest;
- if (LOCAL_LOGV) Log.v(TAG, "New rules stored for digest: " + digest);
- } finally {
- cursor.close();
- }
-
- return sCachedRules;
- }
-}
diff --git a/core/java/com/google/android/util/GoogleWebContentHelper.java b/core/java/com/google/android/util/GoogleWebContentHelper.java
deleted file mode 100644
index 8291e29..0000000
--- a/core/java/com/google/android/util/GoogleWebContentHelper.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * 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 com.google.android.util;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.http.SslError;
-import android.os.Message;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.HttpAuthHandler;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.TextView;
-
-import java.util.Locale;
-
-/**
- * Helper to display Google web content, and fallback on a static message if the
- * web content is unreachable. For example, this can be used to display
- * "Legal terms".
- * <p>
- * The typical usage pattern is to have two Gservices settings defined:
- * <ul>
- * <li>A secure URL that will be displayed on the device. This should be HTTPS
- * so hotspots won't intercept it giving us a false positive that the page
- * loaded successfully.
- * <li>A pretty human-readable URL that will be displayed to the user in case we
- * cannot reach the above URL.
- * </ul>
- * <p>
- * The typical call sequence is {@link #setUrlsFromGservices(String, String)},
- * {@link #setUnsuccessfulMessage(String)}, and {@link #loadUrl()}. At some
- * point, you'll want to display the layout via {@link #getLayout()}.
- */
-public class GoogleWebContentHelper {
-
- private Context mContext;
-
- private String mSecureUrl;
- private String mPrettyUrl;
-
- private String mUnsuccessfulMessage;
-
- private ViewGroup mLayout;
- private WebView mWebView;
- private View mProgressBar;
- private TextView mTextView;
-
- private boolean mReceivedResponse;
-
- public GoogleWebContentHelper(Context context) {
- mContext = context;
- }
-
- /**
- * Fetches the URLs from Gservices.
- *
- * @param secureSetting The setting key whose value contains the HTTPS URL.
- * @param prettySetting The setting key whose value contains the pretty URL.
- * @return This {@link GoogleWebContentHelper} so methods can be chained.
- */
- public GoogleWebContentHelper setUrlsFromGservices(String secureSetting, String prettySetting) {
- ContentResolver contentResolver = mContext.getContentResolver();
- mSecureUrl = fillUrl(Settings.Gservices.getString(contentResolver, secureSetting),
- mContext);
- mPrettyUrl = fillUrl(Settings.Gservices.getString(contentResolver, prettySetting),
- mContext);
- return this;
- }
-
- /**
- * Fetch directly from provided urls.
- *
- * @param secureUrl The HTTPS URL.
- * @param prettyUrl The pretty URL.
- * @return This {@link GoogleWebContentHelper} so methods can be chained.
- */
- public GoogleWebContentHelper setUrls(String secureUrl, String prettyUrl) {
- mSecureUrl = fillUrl(secureUrl, mContext);
- mPrettyUrl = fillUrl(prettyUrl, mContext);
- return this;
- }
-
-
- /**
- * Sets the message that will be shown if we are unable to load the page.
- * <p>
- * This should be called after {@link #setUrlsFromGservices(String, String)}
- * .
- *
- * @param message The message to load. The first argument, according to
- * {@link java.util.Formatter}, will be substituted with the pretty
- * URL.
- * @return This {@link GoogleWebContentHelper} so methods can be chained.
- */
- public GoogleWebContentHelper setUnsuccessfulMessage(String message) {
- Locale locale = mContext.getResources().getConfiguration().locale;
- mUnsuccessfulMessage = String.format(locale, message, mPrettyUrl);
- return this;
- }
-
- /**
- * Begins loading the secure URL.
- *
- * @return This {@link GoogleWebContentHelper} so methods can be chained.
- */
- public GoogleWebContentHelper loadUrl() {
- ensureViews();
- mWebView.loadUrl(mSecureUrl);
- return this;
- }
-
- /**
- * Loads data into the webview and also provides a failback url
- * @return This {@link GoogleWebContentHelper} so methods can be chained.
- */
- public GoogleWebContentHelper loadDataWithFailUrl(String base, String data,
- String mimeType, String encoding, String failUrl) {
- ensureViews();
- mWebView.loadDataWithBaseURL(base, data, mimeType, encoding, failUrl);
- return this;
- }
-
- /**
- * Helper to handle the back key. Returns true if the back key was handled,
- * otherwise returns false.
- * @param event the key event sent to {@link Activity#dispatchKeyEvent()}
- */
- public boolean handleKey(KeyEvent event) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- if (mWebView.canGoBack()) {
- mWebView.goBack();
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns the layout containing the web view, progress bar, and text view.
- * This class takes care of setting each one's visibility based on current
- * state.
- *
- * @return The layout you should display.
- */
- public ViewGroup getLayout() {
- ensureViews();
- return mLayout;
- }
-
- private synchronized void ensureViews() {
- if (mLayout == null) {
- initializeViews();
- }
- }
-
- /**
- * Fills the URL with the locale.
- *
- * @param url The URL in Formatter style for the extra info to be filled in.
- * @return The filled URL.
- */
- private static String fillUrl(String url, Context context) {
-
- if (TextUtils.isEmpty(url)) {
- return "";
- }
-
- /* We add another layer of indirection here to allow mcc's to fill
- * in Locales for TOS. TODO - REMOVE when needed locales supported
- * natively (when not shipping devices to country X without support
- * for their locale).
- */
- String localeReplacement = context.
- getString(com.android.internal.R.string.locale_replacement);
- if (localeReplacement != null && localeReplacement.length() != 0) {
- url = String.format(url, localeReplacement);
- }
-
- Locale locale = Locale.getDefault();
- String tmp = locale.getLanguage() + "_" + locale.getCountry().toLowerCase();
- return String.format(url, tmp);
- }
-
- private void initializeViews() {
-
- LayoutInflater inflater =
- (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- mLayout = (ViewGroup) inflater.inflate(
- com.android.internal.R.layout.google_web_content_helper_layout, null);
-
- mWebView = (WebView) mLayout.findViewById(com.android.internal.R.id.web);
- mWebView.setWebViewClient(new MyWebViewClient());
- WebSettings settings = mWebView.getSettings();
- settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
-
- mProgressBar = mLayout.findViewById(com.android.internal.R.id.progressContainer);
- TextView message = (TextView) mProgressBar.findViewById(com.android.internal.R.id.message);
- message.setText(com.android.internal.R.string.googlewebcontenthelper_loading);
-
- mTextView = (TextView) mLayout.findViewById(com.android.internal.R.id.text);
- mTextView.setText(mUnsuccessfulMessage);
- }
-
- private synchronized void handleWebViewCompletion(boolean success) {
-
- if (mReceivedResponse) {
- return;
- } else {
- mReceivedResponse = true;
- }
-
- // In both cases, remove the progress bar
- ((ViewGroup) mProgressBar.getParent()).removeView(mProgressBar);
-
- // Remove the view that isn't relevant
- View goneView = success ? mTextView : mWebView;
- ((ViewGroup) goneView.getParent()).removeView(goneView);
-
- // Show the next view, which depends on success
- View visibleView = success ? mWebView : mTextView;
- visibleView.setVisibility(View.VISIBLE);
- }
-
- private class MyWebViewClient extends WebViewClient {
-
- @Override
- public void onPageFinished(WebView view, String url) {
- handleWebViewCompletion(true);
- }
-
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- handleWebViewCompletion(false);
- }
-
- @Override
- public void onReceivedHttpAuthRequest(WebView view,
- HttpAuthHandler handler, String host, String realm) {
- handleWebViewCompletion(false);
- }
-
- @Override
- public void onReceivedSslError(WebView view, SslErrorHandler handler,
- SslError error) {
- handleWebViewCompletion(false);
- }
-
- @Override
- public void onTooManyRedirects(WebView view, Message cancelMsg,
- Message continueMsg) {
- handleWebViewCompletion(false);
- }
-
- }
-
-}
diff --git a/core/java/com/google/android/util/SimplePullParser.java b/core/java/com/google/android/util/SimplePullParser.java
deleted file mode 100644
index 031790b..0000000
--- a/core/java/com/google/android/util/SimplePullParser.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * 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 com.google.android.util;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.io.Reader;
-import java.io.Closeable;
-
-import android.util.Xml;
-import android.util.Log;
-
-/**
- * This is an abstraction of a pull parser that provides several benefits:<ul>
- * <li>it is easier to use robustly because it makes it trivial to handle unexpected tags (which
- * might have children)</li>
- * <li>it makes the handling of text (cdata) blocks more convenient</li>
- * <li>it provides convenient methods for getting a mandatory attribute (and throwing an exception
- * if it is missing) or an optional attribute (and using a default value if it is missing)
- * </ul>
- */
-public class SimplePullParser {
- public static final String TEXT_TAG = "![CDATA[";
-
- private String mLogTag = null;
- private final XmlPullParser mParser;
- private Closeable source;
- private String mCurrentStartTag;
-
- /**
- * Constructs a new SimplePullParser to parse the stream
- * @param stream stream to parse
- * @param encoding the encoding to use
- */
- public SimplePullParser(InputStream stream, String encoding)
- throws ParseException, IOException {
- try {
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(stream, encoding);
- moveToStartDocument(parser);
- mParser = parser;
- mCurrentStartTag = null;
- source = stream;
- } catch (XmlPullParserException e) {
- throw new ParseException(e);
- }
- }
-
- /**
- * Constructs a new SimplePullParser to parse the xml
- * @param parser the underlying parser to use
- */
- public SimplePullParser(XmlPullParser parser) {
- mParser = parser;
- mCurrentStartTag = null;
- source = null;
- }
-
- /**
- * Constructs a new SimplePullParser to parse the xml
- * @param xml the xml to parse
- */
- public SimplePullParser(String xml) throws IOException, ParseException {
- this(new StringReader(xml));
- }
-
- /**
- * Constructs a new SimplePullParser to parse the xml
- * @param reader a reader containing the xml
- */
- public SimplePullParser(Reader reader) throws IOException, ParseException {
- try {
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(reader);
- moveToStartDocument(parser);
- mParser = parser;
- mCurrentStartTag = null;
- source = reader;
- } catch (XmlPullParserException e) {
- throw new ParseException(e);
- }
- }
-
- private static void moveToStartDocument(XmlPullParser parser)
- throws XmlPullParserException, IOException {
- int eventType;
- eventType = parser.getEventType();
- if (eventType != XmlPullParser.START_DOCUMENT) {
- throw new XmlPullParserException("Not at start of response");
- }
- }
-
- /**
- * Enables logging to the provided log tag. A basic representation of the xml will be logged as
- * the xml is parsed. No logging is done unless this is called.
- *
- * @param logTag the log tag to use when logging
- */
- public void setLogTag(String logTag) {
- mLogTag = logTag;
- }
-
- /**
- * Returns the tag of the next element whose depth is parentDepth plus one
- * or null if there are no more such elements before the next start tag. When this returns,
- * getDepth() and all methods relating to attributes will refer to the element whose tag is
- * returned.
- *
- * @param parentDepth the depth of the parrent of the item to be returned
- * @param textBuilder if null then text blocks will be ignored. If
- * non-null then text blocks will be added to the builder and TEXT_TAG
- * will be returned when one is found
- * @return the next of the next child element's tag, TEXT_TAG if a text block is found, or null
- * if there are no more child elements or DATA blocks
- * @throws IOException propogated from the underlying parser
- * @throws ParseException if there was an error parsing the xml.
- */
- public String nextTagOrText(int parentDepth, StringBuilder textBuilder)
- throws IOException, ParseException {
- while (true) {
- int eventType = 0;
- try {
- eventType = mParser.next();
- } catch (XmlPullParserException e) {
- throw new ParseException(e);
- }
- int depth = mParser.getDepth();
- mCurrentStartTag = null;
-
- if (eventType == XmlPullParser.START_TAG && depth == parentDepth + 1) {
- mCurrentStartTag = mParser.getName();
- if (mLogTag != null && Log.isLoggable(mLogTag, Log.DEBUG)) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < depth; i++) sb.append(" ");
- sb.append("<").append(mParser.getName());
- int count = mParser.getAttributeCount();
- for (int i = 0; i < count; i++) {
- sb.append(" ");
- sb.append(mParser.getAttributeName(i));
- sb.append("=\"");
- sb.append(mParser.getAttributeValue(i));
- sb.append("\"");
- }
- sb.append(">");
- Log.d(mLogTag, sb.toString());
- }
- return mParser.getName();
- }
-
- if (eventType == XmlPullParser.END_TAG && depth == parentDepth) {
- if (mLogTag != null && Log.isLoggable(mLogTag, Log.DEBUG)) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < depth; i++) sb.append(" ");
- sb.append("</>"); // Not quite valid xml but it gets the job done.
- Log.d(mLogTag, sb.toString());
- }
- return null;
- }
-
- if (eventType == XmlPullParser.END_DOCUMENT && parentDepth == 0) {
- // we could just rely on the caller calling close(), which it should, but try
- // to auto-close for clients that might have missed doing so.
- if (source != null) {
- source.close();
- source = null;
- }
- return null;
- }
-
- if (eventType == XmlPullParser.TEXT && depth == parentDepth) {
- if (textBuilder == null) {
- continue;
- }
- String text = mParser.getText();
- textBuilder.append(text);
- return TEXT_TAG;
- }
- }
- }
-
- /**
- * The same as nextTagOrTexxt(int, StringBuilder) but ignores text blocks.
- */
- public String nextTag(int parentDepth) throws IOException, ParseException {
- return nextTagOrText(parentDepth, null /* ignore text */);
- }
-
- /**
- * Returns the depth of the current element. The depth is 0 before the first
- * element has been returned, 1 after that, etc.
- *
- * @return the depth of the current element
- */
- public int getDepth() {
- return mParser.getDepth();
- }
-
- /**
- * Consumes the rest of the children, accumulating any text at this level into the builder.
- *
- * @param textBuilder the builder to contain any text
- * @throws IOException propogated from the XmlPullParser
- * @throws ParseException if there was an error parsing the xml.
- */
- public void readRemainingText(int parentDepth, StringBuilder textBuilder)
- throws IOException, ParseException {
- while (nextTagOrText(parentDepth, textBuilder) != null) {
- }
- }
-
- /**
- * Returns the number of attributes on the current element.
- *
- * @return the number of attributes on the current element
- */
- public int numAttributes() {
- return mParser.getAttributeCount();
- }
-
- /**
- * Returns the name of the nth attribute on the current element.
- *
- * @return the name of the nth attribute on the current element
- */
- public String getAttributeName(int i) {
- return mParser.getAttributeName(i);
- }
-
- /**
- * Returns the namespace of the nth attribute on the current element.
- *
- * @return the namespace of the nth attribute on the current element
- */
- public String getAttributeNamespace(int i) {
- return mParser.getAttributeNamespace(i);
- }
-
- /**
- * Returns the string value of the named attribute.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute
- * @param defaultValue the value to return if the attribute is not specified
- * @return the value of the attribute
- */
- public String getStringAttribute(
- String namespace, String name, String defaultValue) {
- String value = mParser.getAttributeValue(namespace, name);
- if (null == value) return defaultValue;
- return value;
- }
-
- /**
- * Returns the string value of the named attribute. An exception will
- * be thrown if the attribute is not present.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute @return the value of the attribute
- * @throws ParseException thrown if the attribute is missing
- */
- public String getStringAttribute(String namespace, String name) throws ParseException {
- String value = mParser.getAttributeValue(namespace, name);
- if (null == value) {
- throw new ParseException(
- "missing '" + name + "' attribute on '" + mCurrentStartTag + "' element");
- }
- return value;
- }
-
- /**
- * Returns the string value of the named attribute. An exception will
- * be thrown if the attribute is not a valid integer.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute
- * @param defaultValue the value to return if the attribute is not specified
- * @return the value of the attribute
- * @throws ParseException thrown if the attribute not a valid integer.
- */
- public int getIntAttribute(String namespace, String name, int defaultValue)
- throws ParseException {
- String value = mParser.getAttributeValue(namespace, name);
- if (null == value) return defaultValue;
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- throw new ParseException("Cannot parse '" + value + "' as an integer");
- }
- }
-
- /**
- * Returns the string value of the named attribute. An exception will
- * be thrown if the attribute is not present or is not a valid integer.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute @return the value of the attribute
- * @throws ParseException thrown if the attribute is missing or not a valid integer.
- */
- public int getIntAttribute(String namespace, String name)
- throws ParseException {
- String value = getStringAttribute(namespace, name);
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- throw new ParseException("Cannot parse '" + value + "' as an integer");
- }
- }
-
- /**
- * Returns the string value of the named attribute. An exception will
- * be thrown if the attribute is not a valid long.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute @return the value of the attribute
- * @throws ParseException thrown if the attribute is not a valid long.
- */
- public long getLongAttribute(String namespace, String name, long defaultValue)
- throws ParseException {
- String value = mParser.getAttributeValue(namespace, name);
- if (null == value) return defaultValue;
- try {
- return Long.parseLong(value);
- } catch (NumberFormatException e) {
- throw new ParseException("Cannot parse '" + value + "' as a long");
- }
- }
-
- /**
- * Close this SimplePullParser and any underlying resources (e.g., its InputStream or
- * Reader source) used by this SimplePullParser.
- */
- public void close() {
- if (source != null) {
- try {
- source.close();
- } catch (IOException ioe) {
- // ignore
- }
- }
- }
-
- /**
- * Returns the string value of the named attribute. An exception will
- * be thrown if the attribute is not present or is not a valid long.
- *
- * @param namespace the namespace of the attribute
- * @param name the name of the attribute @return the value of the attribute
- * @throws ParseException thrown if the attribute is missing or not a valid long.
- */
- public long getLongAttribute(String namespace, String name)
- throws ParseException {
- String value = getStringAttribute(namespace, name);
- try {
- return Long.parseLong(value);
- } catch (NumberFormatException e) {
- throw new ParseException("Cannot parse '" + value + "' as a long");
- }
- }
-
- public static final class ParseException extends Exception {
- public ParseException(String message) {
- super(message);
- }
-
- public ParseException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public ParseException(Throwable cause) {
- super(cause);
- }
- }
-}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index c92a86c..67a0bda 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -165,6 +165,7 @@
libEGL \
libGLESv1_CM \
libGLESv2 \
+ libETC1 \
libhardware \
libhardware_legacy \
libsonivox \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 974f65c..8364838 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -751,6 +751,18 @@
opt.optionString = "-Xjitprofile";
mOptions.add(opt);
}
+
+ /*
+ * Disable optimizations by setting the corresponding bit to 1.
+ */
+ char jitOptBuf[sizeof("-Xjitdisableopt:") + PROPERTY_VALUE_MAX];
+ property_get("dalvik.vm.jit.disableopt", propBuf, "");
+ if (strlen(propBuf) > 0) {
+ strcpy(jitOptBuf, "-Xjitdisableopt:");
+ strcat(jitOptBuf, propBuf);
+ opt.optionString = jitOptBuf;
+ mOptions.add(opt);
+ }
#endif
if (executionMode == kEMIntPortable) {
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 4041346..589b255 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -23,6 +23,7 @@
#include <dlfcn.h>
#include <GLES/gl.h>
+#include <ETC1/etc1.h>
#include <core/SkBitmap.h>
@@ -39,6 +40,7 @@
static jclass gIAEClass;
static jclass gUOEClass;
+static jclass gAIOOBEClass;
static inline
void mx4transform(float x, float y, float z, float w, const float* pM, float* pDest) {
@@ -712,6 +714,297 @@
}
/*
+ * ETC1 methods.
+ */
+
+static jclass nioAccessClass;
+static jclass bufferClass;
+static jmethodID getBasePointerID;
+static jmethodID getBaseArrayID;
+static jmethodID getBaseArrayOffsetID;
+static jfieldID positionID;
+static jfieldID limitID;
+static jfieldID elementSizeShiftID;
+
+/* Cache method IDs each time the class is loaded. */
+
+static void
+nativeClassInitBuffer(JNIEnv *_env)
+{
+ jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
+ nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
+
+ jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
+ bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
+
+ getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
+ "getBasePointer", "(Ljava/nio/Buffer;)J");
+ getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
+ "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
+ getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
+ "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
+ positionID = _env->GetFieldID(bufferClass, "position", "I");
+ limitID = _env->GetFieldID(bufferClass, "limit", "I");
+ elementSizeShiftID =
+ _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
+}
+
+static void *
+getPointer(JNIEnv *_env, jobject buffer, jint *remaining)
+{
+ jint position;
+ jint limit;
+ jint elementSizeShift;
+ jlong pointer;
+ jint offset;
+ void *data;
+
+ position = _env->GetIntField(buffer, positionID);
+ limit = _env->GetIntField(buffer, limitID);
+ elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
+ *remaining = (limit - position) << elementSizeShift;
+ pointer = _env->CallStaticLongMethod(nioAccessClass,
+ getBasePointerID, buffer);
+ if (pointer != 0L) {
+ return (void *) (jint) pointer;
+ }
+ return NULL;
+}
+
+class BufferHelper {
+public:
+ BufferHelper(JNIEnv *env, jobject buffer) {
+ mEnv = env;
+ mBuffer = buffer;
+ mData = NULL;
+ mRemaining = 0;
+ }
+
+ bool checkPointer(const char* errorMessage) {
+ if (mBuffer) {
+ mData = getPointer(mEnv, mBuffer, &mRemaining);
+ if (mData == NULL) {
+ mEnv->ThrowNew(gIAEClass, errorMessage);
+ }
+ return mData != NULL;
+ } else {
+ mEnv->ThrowNew(gIAEClass, errorMessage);
+ return false;
+ }
+ }
+
+ inline void* getData() {
+ return mData;
+ }
+
+ inline jint remaining() {
+ return mRemaining;
+ }
+
+private:
+ JNIEnv* mEnv;
+ jobject mBuffer;
+ void* mData;
+ jint mRemaining;
+};
+
+/**
+ * Encode a block of pixels.
+ *
+ * @param in a pointer to a ETC1_DECODED_BLOCK_SIZE array of bytes that represent a
+ * 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+ * value of pixel (x, y).
+ *
+ * @param validPixelMask is a 16-bit mask where bit (1 << (x + y * 4)) indicates whether
+ * the corresponding (x,y) pixel is valid. Invalid pixel color values are ignored when compressing.
+ *
+ * @param out an ETC1 compressed version of the data.
+ *
+ */
+static void etc1_encodeBlock(JNIEnv *env, jclass clazz,
+ jobject in, jint validPixelMask, jobject out) {
+ if (validPixelMask < 0 || validPixelMask > 15) {
+ env->ThrowNew(gIAEClass, "validPixelMask");
+ return;
+ }
+ BufferHelper inB(env, in);
+ BufferHelper outB(env, out);
+ if (inB.checkPointer("in") && outB.checkPointer("out")) {
+ if (inB.remaining() < ETC1_DECODED_BLOCK_SIZE) {
+ env->ThrowNew(gIAEClass, "in's remaining data < DECODED_BLOCK_SIZE");
+ } else if (outB.remaining() < ETC1_ENCODED_BLOCK_SIZE) {
+ env->ThrowNew(gIAEClass, "out's remaining data < ENCODED_BLOCK_SIZE");
+ } else {
+ etc1_encode_block((etc1_byte*) inB.getData(), validPixelMask,
+ (etc1_byte*) outB.getData());
+ }
+ }
+}
+
+/**
+ * Decode a block of pixels.
+ *
+ * @param in an ETC1 compressed version of the data.
+ *
+ * @param out a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
+ * 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+ * value of pixel (x, y).
+ */
+static void etc1_decodeBlock(JNIEnv *env, jclass clazz,
+ jobject in, jobject out){
+ BufferHelper inB(env, in);
+ BufferHelper outB(env, out);
+ if (inB.checkPointer("in") && outB.checkPointer("out")) {
+ if (inB.remaining() < ETC1_ENCODED_BLOCK_SIZE) {
+ env->ThrowNew(gIAEClass, "in's remaining data < ENCODED_BLOCK_SIZE");
+ } else if (outB.remaining() < ETC1_DECODED_BLOCK_SIZE) {
+ env->ThrowNew(gIAEClass, "out's remaining data < DECODED_BLOCK_SIZE");
+ } else {
+ etc1_decode_block((etc1_byte*) inB.getData(),
+ (etc1_byte*) outB.getData());
+ }
+ }
+}
+
+/**
+ * Return the size of the encoded image data (does not include size of PKM header).
+ */
+static jint etc1_getEncodedDataSize(JNIEnv *env, jclass clazz,
+ jint width, jint height) {
+ return etc1_get_encoded_data_size(width, height);
+}
+
+/**
+ * Encode an entire image.
+ * @param in pointer to the image data. Formatted such that
+ * pixel (x,y) is at pIn + pixelSize * x + stride * y + redOffset;
+ * @param out pointer to encoded data. Must be large enough to store entire encoded image.
+ */
+static void etc1_encodeImage(JNIEnv *env, jclass clazz,
+ jobject in, jint width, jint height,
+ jint pixelSize, jint stride, jobject out) {
+ if (pixelSize < 2 || pixelSize > 3) {
+ env->ThrowNew(gIAEClass, "pixelSize must be 2 or 3");
+ return;
+ }
+ BufferHelper inB(env, in);
+ BufferHelper outB(env, out);
+ if (inB.checkPointer("in") && outB.checkPointer("out")) {
+ jint imageSize = stride * height;
+ jint encodedImageSize = etc1_get_encoded_data_size(width, height);
+ if (inB.remaining() < imageSize) {
+ env->ThrowNew(gIAEClass, "in's remaining data < image size");
+ } else if (outB.remaining() < encodedImageSize) {
+ env->ThrowNew(gIAEClass, "out's remaining data < encoded image size");
+ } else {
+ int result = etc1_encode_image((etc1_byte*) inB.getData(),
+ width, height, pixelSize,
+ stride,
+ (etc1_byte*) outB.getData());
+ }
+ }
+}
+
+/**
+ * Decode an entire image.
+ * @param in the encoded data.
+ * @param out pointer to the image data. Will be written such that
+ * pixel (x,y) is at pIn + pixelSize * x + stride * y. Must be
+ * large enough to store entire image.
+ */
+static void etc1_decodeImage(JNIEnv *env, jclass clazz,
+ jobject in, jobject out,
+ jint width, jint height,
+ jint pixelSize, jint stride) {
+ if (pixelSize < 2 || pixelSize > 3) {
+ env->ThrowNew(gIAEClass, "pixelSize must be 2 or 3");
+ return;
+ }
+ BufferHelper inB(env, in);
+ BufferHelper outB(env, out);
+ if (inB.checkPointer("in") && outB.checkPointer("out")) {
+ jint imageSize = stride * height;
+ jint encodedImageSize = etc1_get_encoded_data_size(width, height);
+ if (inB.remaining() < encodedImageSize) {
+ env->ThrowNew(gIAEClass, "in's remaining data < encoded image size");
+ } else if (outB.remaining() < imageSize) {
+ env->ThrowNew(gIAEClass, "out's remaining data < image size");
+ } else {
+ int result = etc1_decode_image((etc1_byte*) inB.getData(),
+ (etc1_byte*) outB.getData(),
+ width, height, pixelSize,
+ stride);
+ }
+ }
+}
+
+/**
+ * Format a PKM header
+ */
+static void etc1_formatHeader(JNIEnv *env, jclass clazz,
+ jobject header, jint width, jint height) {
+ BufferHelper headerB(env, header);
+ if (headerB.checkPointer("header") ){
+ if (headerB.remaining() < ETC_PKM_HEADER_SIZE) {
+ env->ThrowNew(gIAEClass, "header's remaining data < ETC_PKM_HEADER_SIZE");
+ } else {
+ etc1_pkm_format_header((etc1_byte*) headerB.getData(), width, height);
+ }
+ }
+}
+
+/**
+ * Check if a PKM header is correctly formatted.
+ */
+static jboolean etc1_isValid(JNIEnv *env, jclass clazz,
+ jobject header) {
+ jboolean result = false;
+ BufferHelper headerB(env, header);
+ if (headerB.checkPointer("header") ){
+ if (headerB.remaining() < ETC_PKM_HEADER_SIZE) {
+ env->ThrowNew(gIAEClass, "header's remaining data < ETC_PKM_HEADER_SIZE");
+ } else {
+ result = etc1_pkm_is_valid((etc1_byte*) headerB.getData());
+ }
+ }
+ return result;
+}
+
+/**
+ * Read the image width from a PKM header
+ */
+static jint etc1_getWidth(JNIEnv *env, jclass clazz,
+ jobject header) {
+ jint result = 0;
+ BufferHelper headerB(env, header);
+ if (headerB.checkPointer("header") ){
+ if (headerB.remaining() < ETC_PKM_HEADER_SIZE) {
+ env->ThrowNew(gIAEClass, "header's remaining data < ETC_PKM_HEADER_SIZE");
+ } else {
+ result = etc1_pkm_get_width((etc1_byte*) headerB.getData());
+ }
+ }
+ return result;
+}
+
+/**
+ * Read the image height from a PKM header
+ */
+static int etc1_getHeight(JNIEnv *env, jclass clazz,
+ jobject header) {
+ jint result = 0;
+ BufferHelper headerB(env, header);
+ if (headerB.checkPointer("header") ){
+ if (headerB.remaining() < ETC_PKM_HEADER_SIZE) {
+ env->ThrowNew(gIAEClass, "header's remaining data < ETC_PKM_HEADER_SIZE");
+ } else {
+ result = etc1_pkm_get_height((etc1_byte*) headerB.getData());
+ }
+ }
+ return result;
+}
+
+/*
* JNI registration
*/
@@ -721,6 +1014,8 @@
env->FindClass("java/lang/IllegalArgumentException"));
gUOEClass = (jclass) env->NewGlobalRef(
env->FindClass("java/lang/UnsupportedOperationException"));
+ gAIOOBEClass = (jclass) env->NewGlobalRef(
+ env->FindClass("java/lang/ArrayIndexOutOfBoundsException"));
}
static JNINativeMethod gMatrixMethods[] = {
@@ -742,6 +1037,18 @@
{ "native_texSubImage2D", "(IIIILandroid/graphics/Bitmap;II)I", (void*)util_texSubImage2D },
};
+static JNINativeMethod gEtc1Methods[] = {
+ { "encodeBlock", "(Ljava/nio/Buffer;ILjava/nio/Buffer;)V", (void*) etc1_encodeBlock },
+ { "decodeBlock", "(Ljava/nio/Buffer;Ljava/nio/Buffer;)V", (void*) etc1_decodeBlock },
+ { "getEncodedDataSize", "(II)I", (void*) etc1_getEncodedDataSize },
+ { "encodeImage", "(Ljava/nio/Buffer;IIIILjava/nio/Buffer;)V", (void*) etc1_encodeImage },
+ { "decodeImage", "(Ljava/nio/Buffer;Ljava/nio/Buffer;IIII)V", (void*) etc1_decodeImage },
+ { "formatHeader", "(Ljava/nio/Buffer;II)V", (void*) etc1_formatHeader },
+ { "isValid", "(Ljava/nio/Buffer;)Z", (void*) etc1_isValid },
+ { "getWidth", "(Ljava/nio/Buffer;)I", (void*) etc1_getWidth },
+ { "getHeight", "(Ljava/nio/Buffer;)I", (void*) etc1_getHeight },
+};
+
typedef struct _ClassRegistrationInfo {
const char* classPath;
JNINativeMethod* methods;
@@ -752,11 +1059,13 @@
{"android/opengl/Matrix", gMatrixMethods, NELEM(gMatrixMethods)},
{"android/opengl/Visibility", gVisiblityMethods, NELEM(gVisiblityMethods)},
{"android/opengl/GLUtils", gUtilsMethods, NELEM(gUtilsMethods)},
+ {"android/opengl/ETC1", gEtc1Methods, NELEM(gEtc1Methods)},
};
int register_android_opengl_classes(JNIEnv* env)
{
lookupClasses(env);
+ nativeClassInitBuffer(env);
int result = 0;
for (int i = 0; i < NELEM(gClasses); i++) {
ClassRegistrationInfo* cri = &gClasses[i];
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index d57e526..64ee4f0 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -220,7 +220,7 @@
break;
default:
// TODO: Change to LOGV
- LOGD("dataCallback(%d, %p)", msgType, dataPtr.get());
+ LOGV("dataCallback(%d, %p)", msgType, dataPtr.get());
copyAndPost(env, dataPtr, msgType);
break;
}
@@ -328,7 +328,7 @@
static void android_hardware_Camera_release(JNIEnv *env, jobject thiz)
{
// TODO: Change to LOGV
- LOGD("release camera");
+ LOGV("release camera");
JNICameraContext* context = NULL;
sp<Camera> camera;
{
@@ -526,7 +526,7 @@
static void android_hardware_Camera_startSmoothZoom(JNIEnv *env, jobject thiz, jint value)
{
- LOGD("startSmoothZoom");
+ LOGV("startSmoothZoom");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
@@ -537,7 +537,7 @@
static void android_hardware_Camera_stopSmoothZoom(JNIEnv *env, jobject thiz)
{
- LOGD("stopSmoothZoom");
+ LOGV("stopSmoothZoom");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index 3e27978..9a90b72 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -16,7 +16,6 @@
#define LOG_TAG "SensorManager"
-#define LOG_NDEBUG 0
#include "utils/Log.h"
#include <hardware/sensors.h>
diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp
index f14b9fa..e58794bc 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -35,8 +35,6 @@
#include <cutils/sockets.h>
#include <netinet/tcp.h>
-#include <cutils/properties.h>
-#include <cutils/adb_networking.h>
namespace android {
diff --git a/core/jni/android_os_MemoryFile.cpp b/core/jni/android_os_MemoryFile.cpp
index 1ae3ec7..ee8d836 100644
--- a/core/jni/android_os_MemoryFile.cpp
+++ b/core/jni/android_os_MemoryFile.cpp
@@ -30,8 +30,6 @@
{
const char* namestr = (name ? env->GetStringUTFChars(name, NULL) : NULL);
- // round up length to page boundary
- length = (((length - 1) / getpagesize()) + 1) * getpagesize();
int result = ashmem_create_region(namestr, length);
if (name)
@@ -118,7 +116,7 @@
}
}
-static jint android_os_MemoryFile_get_mapped_size(JNIEnv* env, jobject clazz,
+static jint android_os_MemoryFile_get_size(JNIEnv* env, jobject clazz,
jobject fileDescriptor) {
int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
// Use ASHMEM_GET_SIZE to find out if the fd refers to an ashmem region.
@@ -146,8 +144,8 @@
{"native_read", "(Ljava/io/FileDescriptor;I[BIIIZ)I", (void*)android_os_MemoryFile_read},
{"native_write", "(Ljava/io/FileDescriptor;I[BIIIZ)V", (void*)android_os_MemoryFile_write},
{"native_pin", "(Ljava/io/FileDescriptor;Z)V", (void*)android_os_MemoryFile_pin},
- {"native_get_mapped_size", "(Ljava/io/FileDescriptor;)I",
- (void*)android_os_MemoryFile_get_mapped_size}
+ {"native_get_size", "(Ljava/io/FileDescriptor;)I",
+ (void*)android_os_MemoryFile_get_size}
};
static const char* const kClassPathName = "android/os/MemoryFile";
diff --git a/core/jni/android_os_Power.cpp b/core/jni/android_os_Power.cpp
index df5edba..a46c2dd 100644
--- a/core/jni/android_os_Power.cpp
+++ b/core/jni/android_os_Power.cpp
@@ -105,7 +105,7 @@
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
- { "reboot", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
+ { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
};
int register_android_os_Power(JNIEnv *env)
diff --git a/core/jni/android_text_format_Time.cpp b/core/jni/android_text_format_Time.cpp
index fde6ca6..d89a7e6 100644
--- a/core/jni/android_text_format_Time.cpp
+++ b/core/jni/android_text_format_Time.cpp
@@ -382,7 +382,7 @@
jchar c = s[spos];
if (c != expected) {
char msg[100];
- sprintf(msg, "Unexpected %c at pos=%d. Expected %c.", c, spos,
+ sprintf(msg, "Unexpected character 0x%02x at pos=%d. Expected %c.", c, spos,
expected);
jniThrowException(env, "android/util/TimeFormatException", msg);
return false;
@@ -483,6 +483,12 @@
int n;
jboolean inUtc = false;
+ if (len < 10) {
+ jniThrowException(env, "android/util/TimeFormatException",
+ "Time input is too short; must be at least 10 characters");
+ return false;
+ }
+
// year
n = get_char(env, s, 0, 1000, &thrown);
n += get_char(env, s, 1, 100, &thrown);
@@ -510,7 +516,7 @@
if (thrown) return false;
env->SetIntField(This, g_mdayField, n);
- if (len >= 17) {
+ if (len >= 19) {
// T
if (!check_char(env, s, 10, 'T')) return false;
@@ -541,10 +547,19 @@
if (thrown) return false;
env->SetIntField(This, g_secField, n);
- // skip the '.XYZ' -- we don't care about subsecond precision.
+ // skip the '.XYZ' -- we don't care about subsecond precision.
+ int tz_index = 19;
+ if (tz_index < len && s[tz_index] == '.') {
+ do {
+ tz_index++;
+ } while (tz_index < len
+ && s[tz_index] >= '0'
+ && s[tz_index] <= '9');
+ }
+
int offset = 0;
- if (len >= 23) {
- char c = s[23];
+ if (len > tz_index) {
+ char c = s[tz_index];
// NOTE: the offset is meant to be subtracted to get from local time
// to UTC. we therefore use 1 for '-' and -1 for '+'.
@@ -561,27 +576,34 @@
break;
default:
char msg[100];
- sprintf(msg, "Unexpected %c at position 19. Expected + or -",
- c);
+ sprintf(msg, "Unexpected character 0x%02x at position %d. Expected + or -",
+ c, tz_index);
jniThrowException(env, "android/util/TimeFormatException", msg);
return false;
}
inUtc = true;
if (offset != 0) {
+ if (len < tz_index + 5) {
+ char msg[100];
+ sprintf(msg, "Unexpected length; should be %d characters", tz_index + 5);
+ jniThrowException(env, "android/util/TimeFormatException", msg);
+ return false;
+ }
+
// hour
- n = get_char(env, s, 24, 10, &thrown);
- n += get_char(env, s, 25, 1, &thrown);
+ n = get_char(env, s, tz_index + 1, 10, &thrown);
+ n += get_char(env, s, tz_index + 2, 1, &thrown);
if (thrown) return false;
n *= offset;
hour += n;
// :
- if (!check_char(env, s, 26, ':')) return false;
+ if (!check_char(env, s, tz_index + 3, ':')) return false;
// minute
- n = get_char(env, s, 27, 10, &thrown);
- n += get_char(env, s, 28, 1, &thrown);
+ n = get_char(env, s, tz_index + 4, 10, &thrown);
+ n += get_char(env, s, tz_index + 5, 1, &thrown);
if (thrown) return false;
n *= offset;
minute += n;
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index e83d2e2..2fff727 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -524,7 +524,6 @@
}
for (int i=0; i<N; i++) {
- LOGD("locale %2d: '%s'", i, locales[i].string());
env->SetObjectArrayElement(result, i, env->NewStringUTF(locales[i].string()));
}
diff --git a/core/jni/android_util_EventLog.cpp b/core/jni/android_util_EventLog.cpp
index 34b7c89..75f6cb24 100644
--- a/core/jni/android_util_EventLog.cpp
+++ b/core/jni/android_util_EventLog.cpp
@@ -21,12 +21,8 @@
#include "jni.h"
#include "cutils/logger.h"
-#define END_DELIMITER '\n'
-#define INT_BUFFER_SIZE (sizeof(jbyte)+sizeof(jint)+sizeof(END_DELIMITER))
-#define LONG_BUFFER_SIZE (sizeof(jbyte)+sizeof(jlong)+sizeof(END_DELIMITER))
-#define INITAL_BUFFER_CAPACITY 256
-
-#define MAX(a,b) ((a>b)?a:b)
+// The size of the tag number comes out of the payload size.
+#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t))
namespace android {
@@ -47,107 +43,6 @@
static jclass gStringClass;
-struct ByteBuf {
- size_t len;
- size_t capacity;
- uint8_t* buf;
-
- ByteBuf(size_t initSize) {
- buf = (uint8_t*)malloc(initSize);
- len = 0;
- capacity = initSize;
- }
-
- ~ByteBuf() {
- free(buf);
- }
-
- bool ensureExtraCapacity(size_t extra) {
- size_t spaceNeeded = len + extra;
- if (spaceNeeded > capacity) {
- size_t newCapacity = MAX(spaceNeeded, 2 * capacity);
- void* newBuf = realloc(buf, newCapacity);
- if (newBuf == NULL) {
- return false;
- }
- capacity = newCapacity;
- buf = (uint8_t*)newBuf;
- return true;
- } else {
- return true;
- }
- }
-
- void putIntEvent(jint value) {
- bool succeeded = ensureExtraCapacity(INT_BUFFER_SIZE);
- buf[len++] = EVENT_TYPE_INT;
- memcpy(buf+len, &value, sizeof(jint));
- len += sizeof(jint);
- }
-
- void putByte(uint8_t value) {
- bool succeeded = ensureExtraCapacity(sizeof(uint8_t));
- buf[len++] = value;
- }
-
- void putLongEvent(jlong value) {
- bool succeeded = ensureExtraCapacity(LONG_BUFFER_SIZE);
- buf[len++] = EVENT_TYPE_LONG;
- memcpy(buf+len, &value, sizeof(jlong));
- len += sizeof(jlong);
- }
-
-
- void putStringEvent(JNIEnv* env, jstring value) {
- const char* strValue = env->GetStringUTFChars(value, NULL);
- uint32_t strLen = strlen(strValue); //env->GetStringUTFLength(value);
- bool succeeded = ensureExtraCapacity(1 + sizeof(uint32_t) + strLen);
- buf[len++] = EVENT_TYPE_STRING;
- memcpy(buf+len, &strLen, sizeof(uint32_t));
- len += sizeof(uint32_t);
- memcpy(buf+len, strValue, strLen);
- env->ReleaseStringUTFChars(value, strValue);
- len += strLen;
- }
-
- void putList(JNIEnv* env, jobject list) {
- jobjectArray items = (jobjectArray) env->GetObjectField(list, gListItemsID);
- if (items == NULL) {
- jniThrowException(env, "java/lang/NullPointerException", NULL);
- return;
- }
-
- jsize numItems = env->GetArrayLength(items);
- putByte(EVENT_TYPE_LIST);
- putByte(numItems);
- // We'd like to call GetPrimitveArrayCritical() but that might
- // not be safe since we're going to be doing some I/O
- for (int i = 0; i < numItems; i++) {
- jobject item = env->GetObjectArrayElement(items, i);
- if (env->IsInstanceOf(item, gIntegerClass)) {
- jint intVal = env->GetIntField(item, gIntegerValueID);
- putIntEvent(intVal);
- } else if (env->IsInstanceOf(item, gLongClass)) {
- jlong longVal = env->GetLongField(item, gLongValueID);
- putLongEvent(longVal);
- } else if (env->IsInstanceOf(item, gStringClass)) {
- putStringEvent(env, (jstring)item);
- } else if (env->IsInstanceOf(item, gListClass)) {
- putList(env, item);
- } else {
- jniThrowException(
- env,
- "java/lang/IllegalArgumentException",
- "Attempt to log an illegal item type.");
- return;
- }
- env->DeleteLocalRef(item);
- }
-
- env->DeleteLocalRef(items);
- }
-};
-
/*
* In class android.util.EventLog:
* static native int writeEvent(int tag, int value)
@@ -170,41 +65,80 @@
/*
* In class android.util.EventLog:
- * static native int writeEvent(long tag, List value)
- */
-static jint android_util_EventLog_writeEvent_List(JNIEnv* env, jobject clazz,
- jint tag, jobject value) {
- if (value == NULL) {
- jclass clazz = env->FindClass("java/lang/IllegalArgumentException");
- env->ThrowNew(clazz, "writeEvent needs a value.");
- return -1;
- }
- ByteBuf byteBuf(INITAL_BUFFER_CAPACITY);
- byteBuf.putList(env, value);
- byteBuf.putByte((uint8_t)END_DELIMITER);
- int numBytesPut = byteBuf.len;
- int bytesWritten = android_bWriteLog(tag, byteBuf.buf, numBytesPut);
- return bytesWritten;
-}
-
-/*
- * In class android.util.EventLog:
* static native int writeEvent(int tag, String value)
*/
static jint android_util_EventLog_writeEvent_String(JNIEnv* env, jobject clazz,
jint tag, jstring value) {
+ uint8_t buf[MAX_EVENT_PAYLOAD];
+
+ // Don't throw NPE -- I feel like it's sort of mean for a logging function
+ // to be all crashy if you pass in NULL -- but make the NULL value explicit.
+ const char *str = value != NULL ? env->GetStringUTFChars(value, NULL) : "NULL";
+ jint len = strlen(str);
+ const int max = sizeof(buf) - sizeof(len) - 2; // Type byte, final newline
+ if (len > max) len = max;
+
+ buf[0] = EVENT_TYPE_STRING;
+ memcpy(&buf[1], &len, sizeof(len));
+ memcpy(&buf[1 + sizeof(len)], str, len);
+ buf[1 + sizeof(len) + len] = '\n';
+
+ if (value != NULL) env->ReleaseStringUTFChars(value, str);
+ return android_bWriteLog(tag, buf, 2 + sizeof(len) + len);
+}
+
+/*
+ * In class android.util.EventLog:
+ * static native int writeEvent(long tag, Object... value)
+ */
+static jint android_util_EventLog_writeEvent_Array(JNIEnv* env, jobject clazz,
+ jint tag, jobjectArray value) {
if (value == NULL) {
- jclass clazz = env->FindClass("java/lang/IllegalArgumentException");
- env->ThrowNew(clazz, "logEvent needs a value.");
- return -1;
+ return android_util_EventLog_writeEvent_String(env, clazz, tag, NULL);
}
- ByteBuf byteBuf(INITAL_BUFFER_CAPACITY);
- byteBuf.putStringEvent(env, value);
- byteBuf.putByte((uint8_t)END_DELIMITER);
- int numBytesPut = byteBuf.len;
- int bytesWritten = android_bWriteLog(tag, byteBuf.buf, numBytesPut);
- return bytesWritten;
+ uint8_t buf[MAX_EVENT_PAYLOAD];
+ const size_t max = sizeof(buf) - 1; // leave room for final newline
+ size_t pos = 2; // Save room for type tag & array count
+
+ jsize copied = 0, num = env->GetArrayLength(value);
+ for (; copied < num && copied < 255; ++copied) {
+ jobject item = env->GetObjectArrayElement(value, copied);
+ if (item == NULL || env->IsInstanceOf(item, gStringClass)) {
+ if (pos + 1 + sizeof(jint) > max) break;
+ const char *str = item != NULL ? env->GetStringUTFChars((jstring) item, NULL) : "NULL";
+ jint len = strlen(str);
+ if (pos + 1 + sizeof(len) + len > max) len = max - pos - 1 - sizeof(len);
+ buf[pos++] = EVENT_TYPE_STRING;
+ memcpy(&buf[pos], &len, sizeof(len));
+ memcpy(&buf[pos + sizeof(len)], str, len);
+ pos += sizeof(len) + len;
+ if (item != NULL) env->ReleaseStringUTFChars((jstring) item, str);
+ } else if (env->IsInstanceOf(item, gIntegerClass)) {
+ jint intVal = env->GetIntField(item, gIntegerValueID);
+ if (pos + 1 + sizeof(intVal) > max) break;
+ buf[pos++] = EVENT_TYPE_INT;
+ memcpy(&buf[pos], &intVal, sizeof(intVal));
+ pos += sizeof(intVal);
+ } else if (env->IsInstanceOf(item, gLongClass)) {
+ jlong longVal = env->GetLongField(item, gLongValueID);
+ if (pos + 1 + sizeof(longVal) > max) break;
+ buf[pos++] = EVENT_TYPE_LONG;
+ memcpy(&buf[pos], &longVal, sizeof(longVal));
+ pos += sizeof(longVal);
+ } else {
+ jniThrowException(env,
+ "java/lang/IllegalArgumentException",
+ "Invalid payload item type");
+ return -1;
+ }
+ env->DeleteLocalRef(item);
+ }
+
+ buf[0] = EVENT_TYPE_LIST;
+ buf[1] = copied;
+ buf[pos++] = '\n';
+ return android_bWriteLog(tag, buf, pos);
}
/*
@@ -276,81 +210,6 @@
}
/*
- * In class android.util.EventLog:
- * static native void readEvents(String path, Collection<Event> output)
- *
- * Reads events from a file (See Checkin.Aggregation). Events are stored in
- * native raw format (logger_entry + payload).
- */
-static void android_util_EventLog_readEventsFile(JNIEnv* env, jobject clazz, jstring path,
- jobject out) {
- if (path == NULL || out == NULL) {
- jniThrowException(env, "java/lang/NullPointerException", NULL);
- return;
- }
-
- const char *pathString = env->GetStringUTFChars(path, 0);
- int fd = open(pathString, O_RDONLY | O_NONBLOCK);
- env->ReleaseStringUTFChars(path, pathString);
-
- if (fd < 0) {
- jniThrowIOException(env, errno);
- return;
- }
-
- uint8_t buf[LOGGER_ENTRY_MAX_LEN];
- for (;;) {
- // read log entry structure from file
- int len = read(fd, buf, sizeof(logger_entry));
- if (len == 0) {
- break; // end of file
- } else if (len < 0) {
- jniThrowIOException(env, errno);
- } else if ((size_t) len < sizeof(logger_entry)) {
- jniThrowException(env, "java/io/IOException", "Event header too short");
- break;
- }
-
- // read event payload
- logger_entry* entry = (logger_entry*) buf;
- if (entry->len > LOGGER_ENTRY_MAX_PAYLOAD) {
- jniThrowException(env,
- "java/lang/IllegalArgumentException",
- "Too much data for event payload. Corrupt file?");
- break;
- }
-
- len = read(fd, buf + sizeof(logger_entry), entry->len);
- if (len == 0) {
- break; // end of file
- } else if (len < 0) {
- jniThrowIOException(env, errno);
- } else if ((size_t) len < entry->len) {
- jniThrowException(env, "java/io/IOException", "Event payload too short");
- break;
- }
-
- // create EventLog$Event and add it to the collection
- int buffer_size = sizeof(logger_entry) + entry->len;
- jbyteArray array = env->NewByteArray(buffer_size);
- if (array == NULL) break;
-
- jbyte *bytes = env->GetByteArrayElements(array, NULL);
- memcpy(bytes, buf, buffer_size);
- env->ReleaseByteArrayElements(array, bytes, 0);
-
- jobject event = env->NewObject(gEventClass, gEventInitID, array);
- if (event == NULL) break;
-
- env->CallBooleanMethod(out, gCollectionAddID, event);
- env->DeleteLocalRef(event);
- env->DeleteLocalRef(array);
- }
-
- close(fd);
-}
-
-/*
* JNI registration.
*/
static JNINativeMethod gRegisterMethods[] = {
@@ -362,22 +221,17 @@
(void*) android_util_EventLog_writeEvent_String
},
{ "writeEvent",
- "(ILandroid/util/EventLog$List;)I",
- (void*) android_util_EventLog_writeEvent_List
+ "(I[Ljava/lang/Object;)I",
+ (void*) android_util_EventLog_writeEvent_Array
},
{ "readEvents",
"([ILjava/util/Collection;)V",
(void*) android_util_EventLog_readEvents
},
- { "readEvents",
- "(Ljava/lang/String;Ljava/util/Collection;)V",
- (void*) android_util_EventLog_readEventsFile
- }
};
static struct { const char *name; jclass *clazz; } gClasses[] = {
{ "android/util/EventLog$Event", &gEventClass },
- { "android/util/EventLog$List", &gListClass },
{ "java/lang/Integer", &gIntegerClass },
{ "java/lang/Long", &gLongClass },
{ "java/lang/String", &gStringClass },
@@ -386,7 +240,6 @@
static struct { jclass *c; const char *name, *ft; jfieldID *id; } gFields[] = {
{ &gIntegerClass, "value", "I", &gIntegerValueID },
- { &gListClass, "mItems", "[Ljava/lang/Object;", &gListItemsID },
{ &gLongClass, "value", "J", &gLongValueID },
};
@@ -430,4 +283,3 @@
}
}; // namespace android
-
diff --git a/core/res/Android.mk b/core/res/Android.mk
index 78cb86d..7d11148 100644
--- a/core/res/Android.mk
+++ b/core/res/Android.mk
@@ -24,7 +24,7 @@
# since these resources will be used by many apps.
LOCAL_AAPT_FLAGS := -x
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
# Install this alongside the libraries.
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 4a7adcc..c49a86a 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -403,7 +403,13 @@
android:label="@string/permlab_recordAudio"
android:description="@string/permdesc_recordAudio" />
- <!-- Required to be able to access the camera device. -->
+ <!-- Required to be able to access the camera device.
+ <p>This will automatically enforce the <a
+ href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code
+ <uses-feature>}</a> manifest element for <em>all</em> camera features.
+ If you do not require all camera features or can properly operate if a camera
+ is not available, then you must modify your manifest as appropriate in order to
+ install on devices that don't support all camera features.</p> -->
<permission android:name="android.permission.CAMERA"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="dangerous"
@@ -550,12 +556,30 @@
android:label="@string/permlab_changeConfiguration"
android:description="@string/permdesc_changeConfiguration" />
- <!-- Allows an application to restart other applications. -->
+ <!-- @deprecated The {@link android.app.ActivityManager#restartPackage}
+ API is no longer supported. -->
<permission android:name="android.permission.RESTART_PACKAGES"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
- android:protectionLevel="dangerous"
- android:label="@string/permlab_restartPackages"
- android:description="@string/permdesc_restartPackages" />
+ android:protectionLevel="normal"
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses" />
+
+ <!-- Allows an application to call
+ {@link android.app.ActivityManager#killBackgroundProcesses}. -->
+ <permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"
+ android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+ android:protectionLevel="normal"
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses" />
+
+ <!-- Allows an application to call
+ {@link android.app.ActivityManager#forceStopPackage}.
+ @hide -->
+ <permission android:name="android.permission.FORCE_STOP_PACKAGES"
+ android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+ android:protectionLevel="signature"
+ android:label="@string/permlab_forceStopPackages"
+ android:description="@string/permdesc_forceStopPackages" />
<!-- Allows an application to retrieve state dump information from system
services. -->
@@ -1126,6 +1150,12 @@
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signatureOrSystem" />
+ <!-- Allow an application to read and write the cache partition. -->
+ <permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM"
+ android:label="@string/permlab_cache_filesystem"
+ android:description="@string/permdesc_cache_filesystem"
+ android:protectionLevel="signatureOrSystem" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
diff --git a/core/res/res/anim/lock_screen_enter.xml b/core/res/res/anim/lock_screen_enter.xml
new file mode 100644
index 0000000..dd47ff8
--- /dev/null
+++ b/core/res/res/anim/lock_screen_enter.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@anim/decelerate_interpolator">
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_mediumAnimTime" />
+</set>
diff --git a/core/res/res/anim/lock_screen_exit.xml b/core/res/res/anim/lock_screen_exit.xml
index 58bc6db..077fc6b 100644
--- a/core/res/res/anim/lock_screen_exit.xml
+++ b/core/res/res/anim/lock_screen_exit.xml
@@ -17,7 +17,8 @@
*/
-->
-<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/accelerate_interpolator">
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@anim/accelerate_interpolator">
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_longAnimTime" />
</set>
diff --git a/core/res/res/drawable-hdpi/pickerbox_background.png b/core/res/res/drawable-hdpi/pickerbox_background.png
deleted file mode 100644
index 9315a31..0000000
--- a/core/res/res/drawable-hdpi/pickerbox_background.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pickerbox_selected.9.png b/core/res/res/drawable-hdpi/pickerbox_selected.9.png
deleted file mode 100644
index a88ec63..0000000
--- a/core/res/res/drawable-hdpi/pickerbox_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/pickerbox_unselected.9.png b/core/res/res/drawable-hdpi/pickerbox_unselected.9.png
deleted file mode 100644
index 9f6b7cb..0000000
--- a/core/res/res/drawable-hdpi/pickerbox_unselected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/search_source_selector_indicator.png b/core/res/res/drawable-hdpi/search_source_selector_indicator.png
new file mode 100644
index 0000000..b93a0c0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/search_source_selector_indicator.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pickerbox_background.png b/core/res/res/drawable-mdpi/pickerbox_background.png
deleted file mode 100644
index 6494cd8..0000000
--- a/core/res/res/drawable-mdpi/pickerbox_background.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pickerbox_selected.9.png b/core/res/res/drawable-mdpi/pickerbox_selected.9.png
deleted file mode 100644
index d986a31..0000000
--- a/core/res/res/drawable-mdpi/pickerbox_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/pickerbox_unselected.9.png b/core/res/res/drawable-mdpi/pickerbox_unselected.9.png
deleted file mode 100644
index 27ec6b9..0000000
--- a/core/res/res/drawable-mdpi/pickerbox_unselected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/search_source_selector_indicator.png b/core/res/res/drawable-mdpi/search_source_selector_indicator.png
new file mode 100644
index 0000000..26bf18a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/search_source_selector_indicator.png
Binary files differ
diff --git a/core/res/res/drawable/pickerbox.xml b/core/res/res/drawable/search_source_selector_background.xml
similarity index 74%
rename from core/res/res/drawable/pickerbox.xml
rename to core/res/res/drawable/search_source_selector_background.xml
index 9cb2436..fcacd89 100644
--- a/core/res/res/drawable/pickerbox.xml
+++ b/core/res/res/drawable/search_source_selector_background.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- 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.
@@ -15,7 +15,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pickerbox_selected" />
- <item android:drawable="@drawable/pickerbox_unselected" />
-</selector>
+ <!-- TODO: Need focused and pressed backgrounds -->
+
+</selector>
diff --git a/core/res/res/layout-ja/contact_header_name.xml b/core/res/res/layout-ja/contact_header_name.xml
index 7c0f63e..39d5593 100644
--- a/core/res/res/layout-ja/contact_header_name.xml
+++ b/core/res/res/layout-ja/contact_header_name.xml
@@ -20,11 +20,11 @@
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
- android:layout_height="fill_parent">
+ android:layout_height="match_parent">
<TextView android:id="@+id/name"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:singleLine="true"
android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceMedium"
diff --git a/core/res/res/layout-land/icon_menu_layout.xml b/core/res/res/layout-land/icon_menu_layout.xml
index d1b25d91..58f7bfb 100644
--- a/core/res/res/layout-land/icon_menu_layout.xml
+++ b/core/res/res/layout-land/icon_menu_layout.xml
@@ -16,7 +16,7 @@
<com.android.internal.view.menu.IconMenuView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/icon_menu"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:rowHeight="65dip"
android:maxItems="6"
diff --git a/core/res/res/layout-port/icon_menu_layout.xml b/core/res/res/layout-port/icon_menu_layout.xml
index 08edfcc..c84f7d2 100644
--- a/core/res/res/layout-port/icon_menu_layout.xml
+++ b/core/res/res/layout-port/icon_menu_layout.xml
@@ -16,7 +16,7 @@
<com.android.internal.view.menu.IconMenuView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/icon_menu"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:rowHeight="65dip"
android:maxItems="6"
diff --git a/core/res/res/layout/activity_list.xml b/core/res/res/layout/activity_list.xml
index 2967f0f..f489ab7 100644
--- a/core/res/res/layout/activity_list.xml
+++ b/core/res/res/layout/activity_list.xml
@@ -15,20 +15,20 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<ListView
android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
/>
<TextView
android:id="@android:id/empty"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:gravity="center"
android:text="@string/activity_list_empty"
android:visibility="gone"
diff --git a/core/res/res/layout/activity_list_item.xml b/core/res/res/layout/activity_list_item.xml
index 7a2a0e2..25d95fd 100644
--- a/core/res/res/layout/activity_list_item.xml
+++ b/core/res/res/layout/activity_list_item.xml
@@ -18,7 +18,7 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="1dip"
android:paddingBottom="1dip"
diff --git a/core/res/res/layout/activity_list_item_2.xml b/core/res/res/layout/activity_list_item_2.xml
index 78eca02..e937d7b 100644
--- a/core/res/res/layout/activity_list_item_2.xml
+++ b/core/res/res/layout/activity_list_item_2.xml
@@ -15,7 +15,7 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
diff --git a/core/res/res/layout/alert_dialog.xml b/core/res/res/layout/alert_dialog.xml
index 40e3f42..409dcd3 100644
--- a/core/res/res/layout/alert_dialog.xml
+++ b/core/res/res/layout/alert_dialog.xml
@@ -20,7 +20,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="9dip"
@@ -30,12 +30,12 @@
>
<LinearLayout android:id="@+id/topPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="54dip"
android:orientation="vertical">
<LinearLayout android:id="@+id/title_template"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
@@ -54,11 +54,11 @@
style="?android:attr/textAppearanceLarge"
android:singleLine="true"
android:ellipsize="end"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView android:id="@+id/titleDivider"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:visibility="gone"
android:scaleType="fitXY"
@@ -68,12 +68,12 @@
</LinearLayout>
<LinearLayout android:id="@+id/contentPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ScrollView android:id="@+id/scrollView"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="2dip"
android:paddingBottom="12dip"
@@ -81,30 +81,30 @@
android:paddingRight="10dip">
<TextView android:id="@+id/message"
style="?android:attr/textAppearanceMedium"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dip" />
</ScrollView>
</LinearLayout>
<FrameLayout android:id="@+id/customPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<FrameLayout android:id="@+android:id/custom"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dip"
android:paddingBottom="5dip" />
</FrameLayout>
<LinearLayout android:id="@+id/buttonPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="54dip"
android:orientation="vertical" >
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="4dip"
diff --git a/core/res/res/layout/alert_dialog_progress.xml b/core/res/res/layout/alert_dialog_progress.xml
index d2bb691..c519692 100644
--- a/core/res/res/layout/alert_dialog_progress.xml
+++ b/core/res/res/layout/alert_dialog_progress.xml
@@ -15,10 +15,10 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content" android:layout_height="fill_parent">
+ android:layout_width="wrap_content" android:layout_height="match_parent">
<ProgressBar android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dip"
android:layout_marginBottom="1dip"
diff --git a/core/res/res/layout/always_use_checkbox.xml b/core/res/res/layout/always_use_checkbox.xml
index 1f8d256..baa4bee 100644
--- a/core/res/res/layout/always_use_checkbox.xml
+++ b/core/res/res/layout/always_use_checkbox.xml
@@ -18,7 +18,7 @@
to make their selection the preferred activity. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="14dip"
android:paddingRight="15dip"
diff --git a/core/res/res/layout/app_permission_item.xml b/core/res/res/layout/app_permission_item.xml
index 8db4dd7..1bd267f 100644
--- a/core/res/res/layout/app_permission_item.xml
+++ b/core/res/res/layout/app_permission_item.xml
@@ -21,7 +21,7 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
diff --git a/core/res/res/layout/app_perms_summary.xml b/core/res/res/layout/app_perms_summary.xml
index 009eb8f..7160743 100755
--- a/core/res/res/layout/app_perms_summary.xml
+++ b/core/res/res/layout/app_perms_summary.xml
@@ -18,8 +18,8 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical">
<TextView
@@ -36,7 +36,7 @@
<LinearLayout
android:id="@+id/dangerous_perms_list"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:paddingLeft="16dip"
android:paddingRight="12dip"
android:layout_height="wrap_content" />
@@ -45,20 +45,20 @@
<LinearLayout
android:id="@+id/show_more"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginTop="12dip"
android:layout_marginBottom="16dip">
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:background="?android:attr/listDivider" />
<LinearLayout
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dip"
android:layout_marginBottom="12dip"
@@ -77,13 +77,13 @@
android:layout_alignTop="@id/show_more_icon"
android:layout_gravity="center_vertical"
android:paddingLeft="6dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:background="?android:attr/listDivider" />
@@ -95,7 +95,7 @@
android:orientation="vertical"
android:paddingLeft="16dip"
android:paddingRight="12dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/core/res/res/layout/auto_complete_list.xml b/core/res/res/layout/auto_complete_list.xml
index addda11..8ad5dbb 100644
--- a/core/res/res/layout/auto_complete_list.xml
+++ b/core/res/res/layout/auto_complete_list.xml
@@ -17,7 +17,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
android:divider="@android:drawable/divider_horizontal_textfield"
@@ -25,14 +25,14 @@
<LinearLayout android:id="@+id/container"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="0dip"
/>
<AutoCompleteTextView android:id="@+id/edit"
android:completionThreshold="1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_gravity="center_vertical"
diff --git a/core/res/res/layout/battery_low.xml b/core/res/res/layout/battery_low.xml
index 116eae7..3b62fb0 100644
--- a/core/res/res/layout/battery_low.xml
+++ b/core/res/res/layout/battery_low.xml
@@ -25,7 +25,7 @@
>
<TextView android:id="@+id/subtitle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18dp"
android:paddingLeft="19dp"
@@ -35,7 +35,7 @@
/>
<TextView android:id="@+id/level_percent"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18dp"
android:textColor="#ffffffff"
diff --git a/core/res/res/layout/battery_status.xml b/core/res/res/layout/battery_status.xml
index 8b9828c..7cfec05 100644
--- a/core/res/res/layout/battery_status.xml
+++ b/core/res/res/layout/battery_status.xml
@@ -32,13 +32,13 @@
<LinearLayout
android:id="@+id/meter"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
>
<ImageView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="15dip"
/>
<ImageView
@@ -55,8 +55,8 @@
</LinearLayout>
<TextView android:id="@+id/level_percent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:textStyle="bold"
android:textSize="48dp"
android:textColor="#ffffffff"
diff --git a/core/res/res/layout/character_picker.xml b/core/res/res/layout/character_picker.xml
index 70867d0..2508f72 100644
--- a/core/res/res/layout/character_picker.xml
+++ b/core/res/res/layout/character_picker.xml
@@ -17,7 +17,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="304dp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:background="@drawable/keyboard_popup_panel_trans_background">
<GridView
diff --git a/core/res/res/layout/contact_header.xml b/core/res/res/layout/contact_header.xml
index d551a26..128adc5 100644
--- a/core/res/res/layout/contact_header.xml
+++ b/core/res/res/layout/contact_header.xml
@@ -16,8 +16,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/banner"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@drawable/title_bar_medium"
android:paddingRight="5dip">
@@ -37,7 +37,7 @@
android:layout_gravity="center_vertical" >
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
@@ -56,7 +56,7 @@
</LinearLayout>
<TextView android:id="@+id/status"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:singleLine="true"
@@ -65,7 +65,7 @@
/>
<TextView android:id="@+id/status_date"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceSmall"
diff --git a/core/res/res/layout/contact_header_name.xml b/core/res/res/layout/contact_header_name.xml
index 4a53252..24db2f2 100644
--- a/core/res/res/layout/contact_header_name.xml
+++ b/core/res/res/layout/contact_header_name.xml
@@ -17,7 +17,7 @@
<!-- In the default locale, the "Name" field is a single TextView -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/name"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
diff --git a/core/res/res/layout/dialog_custom_title.xml b/core/res/res/layout/dialog_custom_title.xml
index 68578f5..e52fba6 100644
--- a/core/res/res/layout/dialog_custom_title.xml
+++ b/core/res/res/layout/dialog_custom_title.xml
@@ -22,19 +22,19 @@
android:orientation="vertical"
android:fitsSystemWindows="true">
<FrameLayout android:id="@android:id/title_container"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="24dip"
android:layout_weight="0"
style="?android:attr/windowTitleBackgroundStyle">
</FrameLayout>
<FrameLayout
- android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:foreground="?android:attr/windowContentOverlay">
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:paddingTop="6dip"
android:paddingBottom="10dip"
android:paddingLeft="10dip"
diff --git a/core/res/res/layout/dialog_title.xml b/core/res/res/layout/dialog_title.xml
index 8cfc716..949f86e 100644
--- a/core/res/res/layout/dialog_title.xml
+++ b/core/res/res/layout/dialog_title.xml
@@ -25,7 +25,7 @@
android:orientation="vertical"
android:fitsSystemWindows="true">
<TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="53dip"
android:paddingTop="9dip"
@@ -33,13 +33,13 @@
android:paddingLeft="10dip"
android:paddingRight="10dip" />
<FrameLayout
- android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:foreground="?android:attr/windowContentOverlay">
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
diff --git a/core/res/res/layout/dialog_title_icons.xml b/core/res/res/layout/dialog_title_icons.xml
index 7c3f274..0ca6706 100644
--- a/core/res/res/layout/dialog_title_icons.xml
+++ b/core/res/res/layout/dialog_title_icons.xml
@@ -24,7 +24,7 @@
android:fitsSystemWindows="true">
<LinearLayout android:id="@+id/title_container"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
@@ -57,13 +57,13 @@
</LinearLayout>
<FrameLayout
- android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:foreground="?android:attr/windowContentOverlay">
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
diff --git a/core/res/res/layout/expandable_list_content.xml b/core/res/res/layout/expandable_list_content.xml
index 05d74a6..4ed905c 100644
--- a/core/res/res/layout/expandable_list_content.xml
+++ b/core/res/res/layout/expandable_list_content.xml
@@ -19,6 +19,6 @@
-->
<ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:drawSelectorOnTop="false" />
diff --git a/core/res/res/layout/global_actions_item.xml b/core/res/res/layout/global_actions_item.xml
index 63bb0f4..68fe960 100644
--- a/core/res/res/layout/global_actions_item.xml
+++ b/core/res/res/layout/global_actions_item.xml
@@ -15,7 +15,7 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="11dip"
@@ -25,7 +25,7 @@
<ImageView android:id="@+id/icon"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="9dip"
@@ -33,7 +33,7 @@
<TextView android:id="@+id/status"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="26dip"
android:layout_toRightOf="@id/icon"
@@ -45,7 +45,7 @@
<TextView android:id="@+id/message"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon"
diff --git a/core/res/res/layout/google_web_content_helper_layout.xml b/core/res/res/layout/google_web_content_helper_layout.xml
index 546c458..f16ffc9 100644
--- a/core/res/res/layout/google_web_content_helper_layout.xml
+++ b/core/res/res/layout/google_web_content_helper_layout.xml
@@ -43,8 +43,8 @@
<WebView
android:id="@+id/web"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:visibility="invisible"
/>
diff --git a/core/res/res/layout/grant_credentials_permission.xml b/core/res/res/layout/grant_credentials_permission.xml
index 84b66230..4133ea9 100644
--- a/core/res/res/layout/grant_credentials_permission.xml
+++ b/core/res/res/layout/grant_credentials_permission.xml
@@ -20,13 +20,13 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<!-- The header -->
<TextView
android:id="@+id/header_text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/white"
@@ -43,7 +43,7 @@
<!-- The list of packages that correspond to the requesting UID
and the account/authtokenType that is being requested -->
<ScrollView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:layout_weight="1"
@@ -51,8 +51,8 @@
android:foreground="@drawable/title_bar_shadow">
<LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:paddingTop="14dip"
android:orientation="vertical">
@@ -70,13 +70,13 @@
android:orientation="vertical"
android:paddingLeft="16dip"
android:paddingRight="12dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:paddingLeft="16dip"
android:paddingRight="12dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
@@ -137,7 +137,7 @@
<!-- The buttons to allow or deny -->
<LinearLayout
android:id="@+id/buttons"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="52dip"
android:background="@drawable/bottom_bar"
android:paddingTop="4dip"
diff --git a/core/res/res/layout/icon_menu_item_layout.xml b/core/res/res/layout/icon_menu_item_layout.xml
index c6d9496..a73dccc 100644
--- a/core/res/res/layout/icon_menu_item_layout.xml
+++ b/core/res/res/layout/icon_menu_item_layout.xml
@@ -16,8 +16,8 @@
<com.android.internal.view.menu.IconMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:paddingBottom="1dip"
android:paddingLeft="3dip"
android:paddingRight="3dip"
diff --git a/core/res/res/layout/input_method.xml b/core/res/res/layout/input_method.xml
index 1a701e9..f80d628 100644
--- a/core/res/res/layout/input_method.xml
+++ b/core/res/res/layout/input_method.xml
@@ -20,27 +20,27 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentPanel"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/fullscreenArea"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<FrameLayout android:id="@android:id/extractArea"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:visibility="gone">
</FrameLayout>
<FrameLayout android:id="@android:id/candidatesArea"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible">
</FrameLayout>
@@ -48,7 +48,7 @@
</LinearLayout>
<FrameLayout android:id="@android:id/inputArea"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone">
</FrameLayout>
diff --git a/core/res/res/layout/input_method_extract_view.xml b/core/res/res/layout/input_method_extract_view.xml
index 1244c1d..689ba7b 100644
--- a/core/res/res/layout/input_method_extract_view.xml
+++ b/core/res/res/layout/input_method_extract_view.xml
@@ -25,7 +25,7 @@
<android.inputmethodservice.ExtractEditText
android:id="@+id/inputExtractEditText"
android:layout_width="0px"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:scrollbars="vertical"
android:gravity="top"
@@ -38,7 +38,7 @@
<FrameLayout
android:id="@+id/inputExtractAccessories"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:background="@android:drawable/keyboard_accessory_bg_landscape"
diff --git a/core/res/res/layout/js_prompt.xml b/core/res/res/layout/js_prompt.xml
index 86974ba..d80fbc8 100644
--- a/core/res/res/layout/js_prompt.xml
+++ b/core/res/res/layout/js_prompt.xml
@@ -16,18 +16,18 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
>
<TextView android:id="@+id/message"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<EditText android:id="@+id/value"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:inputType="text"
diff --git a/core/res/res/layout/keyboard_popup_keyboard.xml b/core/res/res/layout/keyboard_popup_keyboard.xml
index 1092cc0..5eb2732 100644
--- a/core/res/res/layout/keyboard_popup_keyboard.xml
+++ b/core/res/res/layout/keyboard_popup_keyboard.xml
@@ -19,7 +19,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@android:drawable/keyboard_popup_panel_background"
@@ -29,7 +29,7 @@
android:id="@android:id/keyboardView"
android:background="@android:color/transparent"
android:layout_alignParentBottom="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:keyPreviewLayout="@layout/keyboard_key_preview"
android:popupLayout="@layout/keyboard_popup_keyboard"
diff --git a/core/res/res/layout/keyguard_screen_glogin_unlock.xml b/core/res/res/layout/keyguard_screen_glogin_unlock.xml
index 6e00d11..8a46546 100644
--- a/core/res/res/layout/keyguard_screen_glogin_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_glogin_unlock.xml
@@ -17,24 +17,24 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/background_dark"
>
<ScrollView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:layout_above="@+id/emergencyCall">
<RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<TextView
android:id="@+id/topHeader"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="64dip"
android:layout_alignParentTop="true"
android:layout_marginLeft="4dip"
@@ -47,14 +47,14 @@
<!-- spacer below header -->
<View
android:id="@+id/spacerTop"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_below="@id/topHeader"
android:background="@drawable/divider_horizontal_dark"/>
<TextView
android:id="@+id/instructions"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/spacerTop"
android:layout_marginTop="8dip"
@@ -65,7 +65,7 @@
<EditText
android:id="@+id/login"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/instructions"
android:layout_marginTop="8dip"
@@ -77,7 +77,7 @@
<EditText
android:id="@+id/password"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/login"
android:layout_marginTop="15dip"
@@ -106,7 +106,7 @@
<!-- spacer above emergency call -->
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginBottom="4dip"
diff --git a/core/res/res/layout/keyguard_screen_lock.xml b/core/res/res/layout/keyguard_screen_lock.xml
index b5fbace..6e4fa7d 100644
--- a/core/res/res/layout/keyguard_screen_lock.xml
+++ b/core/res/res/layout/keyguard_screen_lock.xml
@@ -24,13 +24,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="bottom"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<LinearLayout
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="15dip"
@@ -43,25 +43,25 @@
<!-- when sim is present -->
<TextView android:id="@+id/headerSimOk1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="34sp"/>
<TextView android:id="@+id/headerSimOk2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="34sp"/>
<!-- when sim is missing / locked -->
<TextView android:id="@+id/headerSimBad1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@android:string/lockscreen_missing_sim_message"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView android:id="@+id/headerSimBad2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="7dip"
android:layout_marginBottom="7dip"
@@ -71,27 +71,27 @@
<!-- spacer after carrier info / sim messages -->
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginTop="8dip"
android:background="@android:drawable/divider_horizontal_dark"/>
<!-- time and date -->
<TextView android:id="@+id/time"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="34sp"/>
<TextView android:id="@+id/date"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="18sp"/>
<!-- spacer after time and date -->
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginBottom="8dip"
android:background="@android:drawable/divider_horizontal_dark"
@@ -100,7 +100,7 @@
<!-- battery info -->
<LinearLayout android:id="@+id/batteryInfo"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
>
@@ -124,7 +124,7 @@
<!-- spacer after battery info -->
<View android:id="@+id/batteryInfoSpacer"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginTop="8dip"
android:layout_marginBottom="8dip"
@@ -135,7 +135,7 @@
<LinearLayout android:id="@+id/nextAlarmInfo"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
>
@@ -159,7 +159,7 @@
<!-- spacer after alarm info -->
<View android:id="@+id/nextAlarmSpacer"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginTop="8dip"
android:layout_marginBottom="8dip"
@@ -169,7 +169,7 @@
(shown when SIM card is present) -->
<LinearLayout android:id="@+id/screenLockedInfo"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
>
@@ -195,7 +195,7 @@
<!-- message about how to unlock
(shown when SIM card is present) -->
<TextView android:id="@+id/lockInstructions"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dip"
android:gravity="center"
diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml
new file mode 100644
index 0000000..5bc034b
--- /dev/null
+++ b/core/res/res/layout/keyguard_screen_password_landscape.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** 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.
+*/
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@android:color/background_dark">
+
+ <!-- displays dots as user enters pin -->
+ <LinearLayout android:id="@+id/pinDisplayGroup"
+ android:orientation="horizontal"
+ android:layout_centerInParent="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:addStatesFromChildren="true"
+ android:gravity="center_vertical"
+ android:baselineAligned="false"
+ android:paddingRight="0dip"
+ android:layout_marginRight="30dip"
+ android:layout_marginLeft="30dip"
+ android:layout_marginTop="6dip"
+ android:background="@android:drawable/edit_text">
+
+ <EditText android:id="@+id/pinDisplay"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:maxLines="1"
+ android:background="@null"
+ android:textSize="32sp"
+ android:inputType="textPassword"
+ />
+
+ <ImageButton android:id="@+id/backspace"
+ android:src="@android:drawable/ic_input_delete"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginTop="2dip"
+ android:layout_marginRight="2dip"
+ android:layout_marginBottom="2dip"
+ android:gravity="center"
+ />
+
+ </LinearLayout>
+
+ <!-- header text ('Enter Pin Code') -->
+ <TextView android:id="@+id/headerText"
+ android:layout_above="@id/pinDisplayGroup"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="30dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="24sp"
+ />
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dip"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip">
+
+ <Button android:id="@+id/ok"
+ android:text="@android:string/ok"
+ android:layout_alignParentBottom="true"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1.0"
+ android:layout_marginBottom="8dip"
+ android:layout_marginRight="8dip"
+ android:textSize="18sp"
+ />
+
+ <Button android:id="@+id/emergencyCall"
+ android:text="@android:string/lockscreen_emergency_call"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1.0"
+ android:layout_marginBottom="8dip"
+ android:layout_marginLeft="8dip"
+ android:textSize="18sp"
+ android:drawableLeft="@drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ />
+ </LinearLayout>
+
+ <!-- Not currently visible on this screen -->
+ <TextView
+ android:id="@+id/carrier"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_marginTop="6dip"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:visibility="gone"
+ />
+
+</RelativeLayout>
diff --git a/core/res/res/layout/keyguard_screen_password_portrait.xml b/core/res/res/layout/keyguard_screen_password_portrait.xml
new file mode 100644
index 0000000..a7814af
--- /dev/null
+++ b/core/res/res/layout/keyguard_screen_password_portrait.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** 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.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:background="#70000000"
+ android:gravity="center_horizontal">
+
+ <LinearLayout android:id="@+id/topDisplayGroup"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <com.android.internal.widget.DigitalClock android:id="@+id/time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="6dip"
+ android:layout_marginLeft="6dip"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true">
+
+ <TextView android:id="@+id/timeDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="bottom"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="56sp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ android:layout_marginBottom="6dip"
+ />
+
+ <TextView android:id="@+id/am_pm"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:gravity="bottom"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="18sp"
+ android:layout_marginLeft="4dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ />
+
+ </com.android.internal.widget.DigitalClock>
+
+ <TextView android:id="@+id/carrier"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_marginTop="6dip"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ </RelativeLayout>
+
+ <!-- password entry -->
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginRight="6dip"
+ android:layout_marginLeft="6dip"
+ android:gravity="center_vertical"
+ android:hint="@android:string/keyguard_password_enter_password_code"
+ android:background="@android:drawable/edit_text">
+
+ <!-- displays dots as user enters pin -->
+ <TextView android:id="@+id/pinDisplay"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:maxLines="1"
+ android:textAppearance="?android:attr/textAppearanceLargeInverse"
+ android:textStyle="bold"
+ android:inputType="textPassword"
+ />
+
+ <ImageButton android:id="@+id/backspace"
+ android:src="@android:drawable/ic_input_delete"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="-3dip"
+ android:layout_marginBottom="-3dip"
+ />
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <include
+ android:id="@+id/keyPad"
+ layout="@android:layout/twelve_key_entry"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/topDisplayGroup"
+ android:layout_marginTop="10dip"
+ />
+
+ <!-- spacer below keypad -->
+ <View
+ android:id="@+id/spacerBottom"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_marginTop="6dip"
+ android:layout_above="@id/emergencyCall"
+ android:background="@android:drawable/divider_horizontal_dark"
+ />
+
+ <!-- The emergency button should take the rest of the space and be centered vertically -->
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <!-- emergency call button -->
+ <Button
+ android:id="@+id/emergencyCall"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:drawableLeft="@android:drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ android:text="@android:string/lockscreen_emergency_call"
+ />
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/core/res/res/layout/keyguard_screen_rotary_unlock.xml b/core/res/res/layout/keyguard_screen_rotary_unlock.xml
deleted file mode 100644
index 59b69cd..0000000
--- a/core/res/res/layout/keyguard_screen_rotary_unlock.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 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.
-*/
--->
-
-<!-- This is the general lock screen which shows information about the
- state of the device, as well as instructions on how to get past it
- depending on the state of the device. It is the same for landscape
- and portrait.-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/root"
- >
-
-<RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#70000000"
- >
-
- <TextView
- android:id="@+id/carrier"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="20dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- />
-
- <TextView
- android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/carrier"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="25dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="55sp"
- />
-
- <TextView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/time"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="-12dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
-
- <View
- android:id="@+id/divider"
- android:layout_width="fill_parent"
- android:layout_height="1dip"
- android:layout_marginTop="10dip"
- android:layout_below="@id/date"
- android:background="@android:drawable/divider_horizontal_dark"
- />
-
- <TextView
- android:id="@+id/status1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/divider"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="6dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:drawablePadding="4dip"
- />
-
- <TextView
- android:id="@+id/status2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/status1"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="6dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:drawablePadding="4dip"
- />
-
- <TextView
- android:id="@+id/screenLocked"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/status2"
- android:layout_centerHorizontal="true"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:gravity="center"
- android:layout_marginTop="12dip"
- />
-
- <!-- By having the rotary selector hang from the top, we get a layout more
- robust for different screen sizes. On hvga, the widget should be flush with the bottom.-->
- <com.android.internal.widget.RotarySelector
- android:id="@+id/rotary"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_alignParentTop="true"
- android:layout_marginTop="286dip"
- />
-
- <!-- emergency call button shown when sim is missing or PUKd -->
- <Button
- android:id="@+id/emergencyCallButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/screenLocked"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="24dip"
- android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
- />
-
-</RelativeLayout>
-
-</FrameLayout>
diff --git a/core/res/res/layout/keyguard_screen_rotary_unlock_land.xml b/core/res/res/layout/keyguard_screen_rotary_unlock_land.xml
deleted file mode 100644
index c503455..0000000
--- a/core/res/res/layout/keyguard_screen_rotary_unlock_land.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 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.
-*/
--->
-
-<!-- This is the general lock screen which shows information about the
- state of the device, as well as instructions on how to get past it
- depending on the state of the device.-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:rotaryunlock="http://schemas.android.com/apk/res/com.android.rotaryunlock"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/root"
- >
-<LinearLayout
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#70000000"
- >
-
- <!-- left side -->
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1.0"
- android:gravity="center_horizontal"
- >
-
- <TextView
- android:id="@+id/carrier"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="20dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- />
-
- <TextView
- android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/carrier"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="25dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="55sp"
- />
-
- <TextView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/time"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="-12dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
-
- <View
- android:id="@+id/divider"
- android:layout_width="fill_parent"
- android:layout_height="1dip"
- android:layout_marginTop="10dip"
- android:layout_below="@id/date"
- android:background="@android:drawable/divider_horizontal_dark"
- />
-
- <TextView
- android:id="@+id/status1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/divider"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="6dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:drawablePadding="4dip"
- />
-
- <TextView
- android:id="@+id/status2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/status1"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="6dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:drawablePadding="4dip"
- />
-
- <TextView
- android:id="@+id/screenLocked"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/status2"
- android:layout_centerHorizontal="true"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorSecondary"
- android:gravity="center"
- android:layout_marginTop="12dip"
- />
- <!-- emergency call button shown when sim is missing or PUKd -->
- <Button
- android:id="@+id/emergencyCallButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/screenLocked"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="24dip"
- android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
- />
- </RelativeLayout>
-
-
- <!-- right side -->
- <com.android.internal.widget.RotarySelector
- android:id="@+id/rotary"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- />
-
-
-</LinearLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
index 4c583d8..2fa7aaa 100644
--- a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
@@ -18,8 +18,8 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="@android:color/background_dark"
>
@@ -27,7 +27,7 @@
<LinearLayout android:id="@+id/pinDisplayGroup"
android:orientation="horizontal"
android:layout_centerInParent="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:addStatesFromChildren="true"
android:gravity="center_vertical"
@@ -41,7 +41,7 @@
<EditText android:id="@+id/pinDisplay"
android:layout_width="0dip"
android:layout_weight="1"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:maxLines="1"
android:background="@null"
android:textSize="32sp"
@@ -51,7 +51,7 @@
<ImageButton android:id="@+id/backspace"
android:src="@android:drawable/ic_input_delete"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_marginTop="2dip"
android:layout_marginRight="2dip"
android:layout_marginBottom="2dip"
@@ -73,7 +73,7 @@
<LinearLayout
android:orientation="horizontal"
android:layout_alignParentBottom="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dip"
android:layout_marginLeft="8dip"
diff --git a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
index 2a23ada..1f7f8f7 100644
--- a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
@@ -17,20 +17,20 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/background_dark"
android:gravity="center_horizontal">
<LinearLayout android:id="@+id/topDisplayGroup"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- header text ('Enter Pin Code') -->
<TextView android:id="@+id/headerText"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:lines="2"
@@ -38,7 +38,7 @@
<!-- password entry -->
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginRight="6dip"
@@ -68,175 +68,19 @@
</LinearLayout>
- <!-- Keypad section -->
- <LinearLayout android:id="@+id/keyPad"
+ <include
+ android:id="@+id/keyPad"
+ layout="@android:layout/twelve_key_entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/topDisplayGroup"
android:layout_marginTop="10dip"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="64dip"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:orientation="horizontal">
-
- <Button android:id="@+id/one"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/two"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/three"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="64dip"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:orientation="horizontal">
-
- <Button android:id="@+id/four"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/five"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/six"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="64dip"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:orientation="horizontal">
-
- <Button android:id="@+id/seven"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/eight"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/nine"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="64dip"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:orientation="horizontal">
-
- <Button android:id="@+id/ok"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textStyle="bold"
- android:text="@android:string/ok"
- />
-
- <Button android:id="@+id/zero"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textStyle="bold"
- />
-
- <Button android:id="@+id/cancel"
- android:layout_width="0sp"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textStyle="bold"
- android:text="@android:string/cancel"
- />
- </LinearLayout>
-
- <!-- end keypad -->
- </LinearLayout>
+ />
<!-- spacer below keypad -->
<View
android:id="@+id/spacerBottom"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginTop="6dip"
android:layout_above="@id/emergencyCall"
@@ -245,7 +89,7 @@
<!-- The emergency button should take the rest of the space and be centered vertically -->
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center"
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml
index 7e365fc..f9566d8 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml
@@ -23,8 +23,8 @@
and portrait.-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tabunlock="http://schemas.android.com/apk/res/com.android.tabunlock"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="#70000000"
android:gravity="center_horizontal"
android:id="@+id/root">
@@ -81,7 +81,7 @@
<TextView android:id="@+id/am_pm"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="bottom"
android:singleLine="true"
android:ellipsize="none"
@@ -141,7 +141,7 @@
<com.android.internal.widget.SlidingTab
android:id="@+id/tab_selector"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="80dip"
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
index 33afe93..9965554 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
@@ -22,8 +22,8 @@
depending on the state of the device.-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tabunlock="http://schemas.android.com/apk/res/com.android.tabunlock"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#70000000"
android:id="@+id/root">
@@ -31,7 +31,7 @@
<!-- left side -->
<RelativeLayout
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1.0"
android:layout_marginLeft="24dip"
android:gravity="left">
@@ -82,7 +82,7 @@
<TextView android:id="@+id/am_pm"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="bottom"
android:singleLine="true"
android:ellipsize="none"
@@ -144,7 +144,7 @@
android:id="@+id/tab_selector"
android:orientation="vertical"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_marginRight="80dip"
/>
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index f8f326a..58f36ed 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -24,8 +24,8 @@
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="#70000000"
>
@@ -33,7 +33,7 @@
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1.0"
android:layout_marginLeft="24dip"
android:gravity="left"
@@ -81,7 +81,7 @@
<TextView android:id="@+id/am_pm"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="bottom"
android:singleLine="true"
android:ellipsize="none"
@@ -136,20 +136,20 @@
<!-- fill space between header and button below -->
<View
android:layout_weight="1.0"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
/>
<!-- footer -->
<FrameLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dip"
>
<!-- option 1: a single emergency call button -->
<RelativeLayout android:id="@+id/footerNormal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
>
@@ -166,18 +166,18 @@
<!-- option 2: an emergency call button, and a 'forgot pattern?' button -->
<LinearLayout android:id="@+id/footerForgotPattern"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
>
<Button android:id="@+id/forgotPattern"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.Button.Transparent"
android:visibility="invisible"
/>
<Button android:id="@+id/emergencyCallTogether"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lockscreen_emergency_call"
style="@style/Widget.Button.Transparent"
diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
index d7c4aae..ac6cf19 100644
--- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
@@ -23,14 +23,14 @@
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:gravity="center_horizontal"
android:background="#70000000"
>
<RelativeLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
@@ -70,7 +70,7 @@
<TextView android:id="@+id/am_pm"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="bottom"
android:singleLine="true"
android:ellipsize="none"
@@ -98,7 +98,7 @@
<View
android:id="@+id/divider"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginTop="8dip"
android:layout_marginBottom="8dip"
@@ -109,7 +109,7 @@
status. -->
<LinearLayout
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dip"
android:layout_marginLeft="12dip"
@@ -145,7 +145,7 @@
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_marginTop="2dip"
@@ -153,14 +153,14 @@
<!-- footer -->
<FrameLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<!-- option 1: a single emergency call button -->
<RelativeLayout android:id="@+id/footerNormal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<Button android:id="@+id/emergencyCallAlone"
android:layout_width="wrap_content"
@@ -177,13 +177,13 @@
<!-- option 2: an emergency call button, and a 'forgot pattern?' button -->
<LinearLayout android:id="@+id/footerForgotPattern"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:gravity="center"
>
<Button android:id="@+id/emergencyCallTogether"
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1.0"
android:layout_marginTop="4dip"
android:layout_marginBottom="4dip"
@@ -196,7 +196,7 @@
/>
<Button android:id="@+id/forgotPattern"
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1.0"
android:layout_marginTop="4dip"
android:layout_marginBottom="4dip"
diff --git a/core/res/res/layout/list_content.xml b/core/res/res/layout/list_content.xml
index a7f3e2d..6f9f1e0 100644
--- a/core/res/res/layout/list_content.xml
+++ b/core/res/res/layout/list_content.xml
@@ -18,7 +18,7 @@
*/
-->
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:drawSelectorOnTop="false"
/>
diff --git a/core/res/res/layout/list_gestures_overlay.xml b/core/res/res/layout/list_gestures_overlay.xml
index 54d72c8..5ebf092 100644
--- a/core/res/res/layout/list_gestures_overlay.xml
+++ b/core/res/res/layout/list_gestures_overlay.xml
@@ -15,5 +15,5 @@
-->
<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
diff --git a/core/res/res/layout/list_menu_item_layout.xml b/core/res/res/layout/list_menu_item_layout.xml
index df4958f..39c88722 100644
--- a/core/res/res/layout/list_menu_item_layout.xml
+++ b/core/res/res/layout/list_menu_item_layout.xml
@@ -15,7 +15,7 @@
-->
<com.android.internal.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight">
<!-- Icon will be inserted here. -->
@@ -32,7 +32,7 @@
<TextView
android:id="@+id/title"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
diff --git a/core/res/res/layout/media_controller.xml b/core/res/res/layout/media_controller.xml
index 32db60a..f4a701e 100644
--- a/core/res/res/layout/media_controller.xml
+++ b/core/res/res/layout/media_controller.xml
@@ -15,17 +15,17 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#CC666666"
android:orientation="vertical">
- <ImageView android:layout_width="fill_parent"
+ <ImageView android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:drawable/divider_horizontal_dark" />
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="4dip"
@@ -40,7 +40,7 @@
</LinearLayout>
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml
index 6380d25..44dca33 100644
--- a/core/res/res/layout/number_picker.xml
+++ b/core/res/res/layout/number_picker.xml
@@ -20,12 +20,12 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<com.android.common.widget.NumberPickerButton android:id="@+id/increment"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/timepicker_up_btn" />
<EditText android:id="@+id/timepicker_input"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:singleLine="true"
@@ -35,7 +35,7 @@
android:background="@drawable/timepicker_input" />
<com.android.common.widget.NumberPickerButton android:id="@+id/decrement"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/timepicker_down_btn" />
diff --git a/core/res/res/layout/permissions_account_and_authtokentype.xml b/core/res/res/layout/permissions_account_and_authtokentype.xml
index 4494a2c5..833572603 100644
--- a/core/res/res/layout/permissions_account_and_authtokentype.xml
+++ b/core/res/res/layout/permissions_account_and_authtokentype.xml
@@ -21,7 +21,7 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
diff --git a/core/res/res/layout/permissions_package_list_item.xml b/core/res/res/layout/permissions_package_list_item.xml
index 1bffe51..3c9570e 100644
--- a/core/res/res/layout/permissions_package_list_item.xml
+++ b/core/res/res/layout/permissions_package_list_item.xml
@@ -21,7 +21,7 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
diff --git a/core/res/res/layout/power_dialog.xml b/core/res/res/layout/power_dialog.xml
index 7c59ab4..60298d2 100644
--- a/core/res/res/layout/power_dialog.xml
+++ b/core/res/res/layout/power_dialog.xml
@@ -18,30 +18,30 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button android:id="@+id/keyguard"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/off"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/power_off" />
<Button android:id="@+id/silent"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button android:id="@+id/radio_power"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/core/res/res/layout/preference.xml b/core/res/res/layout/preference.xml
index 00745b4..e1fa230 100644
--- a/core/res/res/layout/preference.xml
+++ b/core/res/res/layout/preference.xml
@@ -18,7 +18,7 @@
Preference is able to place a specific widget for its particular
type in the "widget_frame" layout. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
@@ -54,7 +54,7 @@
<!-- Preference should place its actual preference widget here. -->
<LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical" />
diff --git a/core/res/res/layout/preference_child.xml b/core/res/res/layout/preference_child.xml
index 5f8ddd4..8975ed6 100644
--- a/core/res/res/layout/preference_child.xml
+++ b/core/res/res/layout/preference_child.xml
@@ -16,7 +16,7 @@
<!-- Layout for a visually child-like Preference in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
@@ -53,7 +53,7 @@
<!-- Preference should place its actual preference widget here. -->
<LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical" />
diff --git a/core/res/res/layout/preference_dialog_edittext.xml b/core/res/res/layout/preference_dialog_edittext.xml
index 7d1faac..5cc1ea2 100644
--- a/core/res/res/layout/preference_dialog_edittext.xml
+++ b/core/res/res/layout/preference_dialog_edittext.xml
@@ -24,7 +24,7 @@
<TextView android:id="@+android:id/message"
style="?android:attr/textAppearanceSmall"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorSecondary" />
diff --git a/core/res/res/layout/preference_information.xml b/core/res/res/layout/preference_information.xml
index 8f05a8e..a5cf31a 100644
--- a/core/res/res/layout/preference_information.xml
+++ b/core/res/res/layout/preference_information.xml
@@ -18,7 +18,7 @@
Preference is able to place a specific widget for its particular
type in the "widget_frame" layout. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
@@ -54,7 +54,7 @@
<!-- Preference should place its actual preference widget here. -->
<LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical" />
diff --git a/core/res/res/layout/preference_list_content.xml b/core/res/res/layout/preference_list_content.xml
index 31113e1..8f86981 100644
--- a/core/res/res/layout/preference_list_content.xml
+++ b/core/res/res/layout/preference_list_content.xml
@@ -18,8 +18,8 @@
*/
-->
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:drawSelectorOnTop="false"
android:scrollbarAlwaysDrawVerticalTrack="true"
/>
diff --git a/core/res/res/layout/progress_dialog.xml b/core/res/res/layout/progress_dialog.xml
index 8f66451..298173a 100644
--- a/core/res/res/layout/progress_dialog.xml
+++ b/core/res/res/layout/progress_dialog.xml
@@ -19,13 +19,13 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout android:id="@+id/body"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:baselineAligned="false"
android:paddingLeft="8dip"
android:paddingTop="10dip"
@@ -40,7 +40,7 @@
android:layout_marginRight="12dip" />
<TextView android:id="@+id/message"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
diff --git a/core/res/res/layout/recent_apps_dialog.xml b/core/res/res/layout/recent_apps_dialog.xml
index c4ee95d..4e416e1 100644
--- a/core/res/res/layout/recent_apps_dialog.xml
+++ b/core/res/res/layout/recent_apps_dialog.xml
@@ -19,7 +19,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dip"
android:orientation="vertical">
diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml
index 4c5c456..6ed43de 100644
--- a/core/res/res/layout/resolve_list_item.xml
+++ b/core/res/res/layout/resolve_list_item.xml
@@ -22,7 +22,7 @@
android:orientation="horizontal"
android:minHeight="?android:attr/listPreferredItemHeight"
android:layout_height="wrap_content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:paddingLeft="10dip"
android:paddingRight="15dip">
diff --git a/core/res/res/layout/screen.xml b/core/res/res/layout/screen.xml
index ded97e2..dfa9731 100644
--- a/core/res/res/layout/screen.xml
+++ b/core/res/res/layout/screen.xml
@@ -22,13 +22,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fitsSystemWindows="true"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<!-- Title bar -->
<RelativeLayout android:id="@android:id/title_container"
style="?android:attr/windowTitleBackgroundStyle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
>
<ImageView android:id="@android:id/left_icon"
@@ -66,7 +66,7 @@
</LinearLayout>
<ProgressBar android:id="@+id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_toLeftOf="@android:id/right_container"
@@ -77,8 +77,8 @@
/>
<TextView android:id="@android:id/title"
style="?android:attr/windowTitleStyle"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="@null"
android:fadingEdge="horizontal"
android:scrollHorizontally="true"
@@ -90,7 +90,7 @@
<!-- Content -->
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:foregroundGravity="fill_horizontal|top"
diff --git a/core/res/res/layout/screen_custom_title.xml b/core/res/res/layout/screen_custom_title.xml
index 12ed1d0..34c9de0 100644
--- a/core/res/res/layout/screen_custom_title.xml
+++ b/core/res/res/layout/screen_custom_title.xml
@@ -22,12 +22,12 @@
android:orientation="vertical"
android:fitsSystemWindows="true">
<FrameLayout android:id="@android:id/title_container"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
style="?android:attr/windowTitleBackgroundStyle">
</FrameLayout>
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:foregroundGravity="fill_horizontal|top"
diff --git a/core/res/res/layout/screen_progress.xml b/core/res/res/layout/screen_progress.xml
index 477cadb..6e694c1 100644
--- a/core/res/res/layout/screen_progress.xml
+++ b/core/res/res/layout/screen_progress.xml
@@ -23,12 +23,12 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fitsSystemWindows="true"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<RelativeLayout android:id="@android:id/title_container"
style="?android:attr/windowTitleBackgroundStyle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
>
<ProgressBar android:id="@+android:id/progress_circular"
@@ -43,7 +43,7 @@
/>
<ProgressBar android:id="@+android:id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_alignParentLeft="true"
@@ -54,8 +54,8 @@
/>
<TextView android:id="@android:id/title"
style="?android:attr/windowTitleStyle"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@android:id/progress_circular"
android:background="@null"
@@ -65,7 +65,7 @@
/>
</RelativeLayout>
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:foregroundGravity="fill_horizontal|top"
diff --git a/core/res/res/layout/screen_title.xml b/core/res/res/layout/screen_title.xml
index 5fcd2dd..39ea131 100644
--- a/core/res/res/layout/screen_title.xml
+++ b/core/res/res/layout/screen_title.xml
@@ -23,7 +23,7 @@
android:orientation="vertical"
android:fitsSystemWindows="true">
<FrameLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
style="?android:attr/windowTitleBackgroundStyle">
<TextView android:id="@android:id/title"
@@ -31,11 +31,11 @@
android:background="@null"
android:fadingEdge="horizontal"
android:gravity="center_vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:foregroundGravity="fill_horizontal|top"
diff --git a/core/res/res/layout/screen_title_icons.xml b/core/res/res/layout/screen_title_icons.xml
index 5415909..62a0228 100644
--- a/core/res/res/layout/screen_title_icons.xml
+++ b/core/res/res/layout/screen_title_icons.xml
@@ -21,11 +21,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fitsSystemWindows="true"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<RelativeLayout android:id="@android:id/title_container"
style="?android:attr/windowTitleBackgroundStyle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize">
<!-- The title background has 9px left padding. -->
<ImageView android:id="@android:id/left_icon"
@@ -51,7 +51,7 @@
the left of the title text left edge. -->
<ProgressBar android:id="@+id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="-3dip"
android:layout_toLeftOf="@android:id/progress_circular"
@@ -60,8 +60,8 @@
android:visibility="gone"
android:max="10000" />
<LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_toLeftOf="@id/progress_circular"
android:layout_toRightOf="@android:id/left_icon"
@@ -69,7 +69,7 @@
<TextView android:id="@android:id/title"
style="?android:attr/windowTitleStyle"
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:fadingEdge="horizontal"
@@ -89,7 +89,7 @@
</LinearLayout>
</RelativeLayout>
<FrameLayout android:id="@android:id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:foregroundGravity="fill_horizontal|top"
diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml
index 964af9b..12285fd 100644
--- a/core/res/res/layout/search_bar.xml
+++ b/core/res/res/layout/search_bar.xml
@@ -21,7 +21,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
class="android.app.SearchDialog$SearchBar"
android:id="@+id/search_bar"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
@@ -30,7 +30,7 @@
<!-- Outer layout defines the entire search bar at the top of the screen -->
<LinearLayout
android:id="@+id/search_plate"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="12dip"
@@ -52,17 +52,14 @@
<!-- Inner layout contains the app icon, button(s) and EditText -->
<LinearLayout
android:id="@+id/search_edit_frame"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/search_app_icon"
- android:layout_height="36dip"
- android:layout_width="36dip"
+
+ <include android:id="@+id/search_source_selector"
+ layout="@layout/search_source_selector"
android:layout_marginRight="7dip"
- android:layout_gravity="center_vertical"
- />
+ android:layout_gravity="center_vertical" />
<view class="android.app.SearchDialog$SearchAutoComplete"
android:id="@+id/search_src_text"
@@ -76,8 +73,8 @@
android:singleLine="true"
android:ellipsize="end"
android:inputType="text|textAutoComplete"
- android:dropDownWidth="fill_parent"
- android:dropDownHeight="fill_parent"
+ android:dropDownWidth="match_parent"
+ android:dropDownHeight="match_parent"
android:dropDownAnchor="@id/search_plate"
android:dropDownVerticalOffset="-9dip"
android:popupBackground="@android:drawable/search_dropdown_background"
@@ -88,13 +85,13 @@
android:id="@+id/search_go_btn"
android:background="@drawable/btn_search_dialog"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
/>
<ImageButton
android:id="@+id/search_voice_btn"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_marginLeft="8dip"
android:background="@drawable/btn_search_dialog_voice"
android:src="@android:drawable/ic_btn_speak_now"
diff --git a/core/res/res/layout/search_dropdown_item_1line.xml b/core/res/res/layout/search_dropdown_item_1line.xml
index bf3dd48..eed8b7d 100644
--- a/core/res/res/layout/search_dropdown_item_1line.xml
+++ b/core/res/res/layout/search_dropdown_item_1line.xml
@@ -22,5 +22,5 @@
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/searchResultListItemHeight" />
\ No newline at end of file
diff --git a/core/res/res/layout/search_dropdown_item_icons_2line.xml b/core/res/res/layout/search_dropdown_item_icons_2line.xml
index 2710b3b..d71b4f7 100644
--- a/core/res/res/layout/search_dropdown_item_icons_2line.xml
+++ b/core/res/res/layout/search_dropdown_item_icons_2line.xml
@@ -21,7 +21,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingLeft="4dip"
android:paddingRight="2dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/searchResultListItemHeight" >
<!-- Icons come first in the layout, since their placement doesn't depend on
@@ -50,7 +50,7 @@
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceSearchResultSubtitle"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="29dip"
android:paddingBottom="4dip"
android:gravity="top"
@@ -66,7 +66,7 @@
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@android:id/icon1"
diff --git a/core/res/res/layout/search_source_selector.xml b/core/res/res/layout/search_source_selector.xml
new file mode 100644
index 0000000..c69dfc0
--- /dev/null
+++ b/core/res/res/layout/search_source_selector.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="48dip"
+ android:layout_height="match_parent"
+ android:foreground="@drawable/search_source_selector_indicator"
+ android:foregroundGravity="bottom|right"
+ >
+
+ <ImageButton
+ android:id="@+id/search_source_selector_icon"
+ android:background="@drawable/search_source_selector_background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:focusable="true"
+ android:clickable="true"
+ />
+
+</FrameLayout>
diff --git a/core/res/res/layout/seekbar_dialog.xml b/core/res/res/layout/seekbar_dialog.xml
index f61f435..84352a5 100644
--- a/core/res/res/layout/seekbar_dialog.xml
+++ b/core/res/res/layout/seekbar_dialog.xml
@@ -15,8 +15,8 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
@@ -26,7 +26,7 @@
android:paddingTop="20dip" />
<SeekBar android:id="@+id/seekbar"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dip" />
diff --git a/core/res/res/layout/select_dialog.xml b/core/res/res/layout/select_dialog.xml
index 249b527..c665f7a 100644
--- a/core/res/res/layout/select_dialog.xml
+++ b/core/res/res/layout/select_dialog.xml
@@ -26,8 +26,8 @@
<view class="com.android.internal.app.AlertController$RecycleListView"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/select_dialog_listview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:layout_marginTop="5px"
android:cacheColorHint="@null"
android:divider="@android:drawable/divider_horizontal_bright"
diff --git a/core/res/res/layout/select_dialog_item.xml b/core/res/res/layout/select_dialog_item.xml
index 60a74a4..30fe02e 100644
--- a/core/res/res/layout/select_dialog_item.xml
+++ b/core/res/res/layout/select_dialog_item.xml
@@ -25,7 +25,7 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
diff --git a/core/res/res/layout/select_dialog_multichoice.xml b/core/res/res/layout/select_dialog_multichoice.xml
index 55fc39b..5785d3b 100644
--- a/core/res/res/layout/select_dialog_multichoice.xml
+++ b/core/res/res/layout/select_dialog_multichoice.xml
@@ -16,7 +16,7 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
diff --git a/core/res/res/layout/select_dialog_singlechoice.xml b/core/res/res/layout/select_dialog_singlechoice.xml
index 220af64..3560fee 100644
--- a/core/res/res/layout/select_dialog_singlechoice.xml
+++ b/core/res/res/layout/select_dialog_singlechoice.xml
@@ -16,7 +16,7 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
diff --git a/core/res/res/layout/simple_dropdown_hint.xml b/core/res/res/layout/simple_dropdown_hint.xml
index 44be46d..df9d720 100644
--- a/core/res/res/layout/simple_dropdown_hint.xml
+++ b/core/res/res/layout/simple_dropdown_hint.xml
@@ -25,5 +25,5 @@
android:layout_marginTop="3dip"
android:layout_marginRight="3dip"
android:layout_marginBottom="3dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
diff --git a/core/res/res/layout/simple_dropdown_item_1line.xml b/core/res/res/layout/simple_dropdown_item_1line.xml
index 5745d15..18e7b88 100644
--- a/core/res/res/layout/simple_dropdown_item_1line.xml
+++ b/core/res/res/layout/simple_dropdown_item_1line.xml
@@ -22,6 +22,6 @@
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/simple_dropdown_item_2line.xml b/core/res/res/layout/simple_dropdown_item_2line.xml
index a04c849..903adb0 100644
--- a/core/res/res/layout/simple_dropdown_item_2line.xml
+++ b/core/res/res/layout/simple_dropdown_item_2line.xml
@@ -19,7 +19,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:gravity="center_vertical"
@@ -39,7 +39,7 @@
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
@@ -48,7 +48,7 @@
android:textAppearance="?android:attr/textAppearanceSmallInverse"
android:textColor="#323232"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
android:layout_alignLeft="@android:id/text1" />
diff --git a/core/res/res/layout/simple_expandable_list_item_1.xml b/core/res/res/layout/simple_expandable_list_item_1.xml
index 052b353..dc3e58e 100644
--- a/core/res/res/layout/simple_expandable_list_item_1.xml
+++ b/core/res/res/layout/simple_expandable_list_item_1.xml
@@ -16,7 +16,7 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:textAppearance="?android:attr/textAppearanceLarge"
diff --git a/core/res/res/layout/simple_expandable_list_item_2.xml b/core/res/res/layout/simple_expandable_list_item_2.xml
index 741f1db..b48b444 100644
--- a/core/res/res/layout/simple_expandable_list_item_2.xml
+++ b/core/res/res/layout/simple_expandable_list_item_2.xml
@@ -15,7 +15,7 @@
-->
<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingTop="2dip"
android:paddingBottom="2dip"
@@ -24,14 +24,14 @@
>
<TextView android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView android:id="@android:id/text2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
android:layout_alignLeft="@android:id/text1"
diff --git a/core/res/res/layout/simple_list_item_1.xml b/core/res/res/layout/simple_list_item_1.xml
index fe617ac..c9c77a5 100644
--- a/core/res/res/layout/simple_list_item_1.xml
+++ b/core/res/res/layout/simple_list_item_1.xml
@@ -16,7 +16,7 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
diff --git a/core/res/res/layout/simple_list_item_2.xml b/core/res/res/layout/simple_list_item_2.xml
index b5e2385..5eab54e 100644
--- a/core/res/res/layout/simple_list_item_2.xml
+++ b/core/res/res/layout/simple_list_item_2.xml
@@ -17,14 +17,14 @@
<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="2dip"
android:paddingBottom="2dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
>
<TextView android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="6dip"
android:layout_marginTop="6dip"
@@ -32,7 +32,7 @@
/>
<TextView android:id="@android:id/text2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
android:layout_alignLeft="@android:id/text1"
diff --git a/core/res/res/layout/simple_list_item_checked.xml b/core/res/res/layout/simple_list_item_checked.xml
index 95612f6..5f99044 100644
--- a/core/res/res/layout/simple_list_item_checked.xml
+++ b/core/res/res/layout/simple_list_item_checked.xml
@@ -16,7 +16,7 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
diff --git a/core/res/res/layout/simple_list_item_multiple_choice.xml b/core/res/res/layout/simple_list_item_multiple_choice.xml
index 102e5fc..05c66f3 100644
--- a/core/res/res/layout/simple_list_item_multiple_choice.xml
+++ b/core/res/res/layout/simple_list_item_multiple_choice.xml
@@ -16,7 +16,7 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
diff --git a/core/res/res/layout/simple_list_item_single_choice.xml b/core/res/res/layout/simple_list_item_single_choice.xml
index 326de1d..27afd1d 100644
--- a/core/res/res/layout/simple_list_item_single_choice.xml
+++ b/core/res/res/layout/simple_list_item_single_choice.xml
@@ -16,7 +16,7 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
diff --git a/core/res/res/layout/simple_spinner_dropdown_item.xml b/core/res/res/layout/simple_spinner_dropdown_item.xml
index 7006b09..5fd7a09 100644
--- a/core/res/res/layout/simple_spinner_dropdown_item.xml
+++ b/core/res/res/layout/simple_spinner_dropdown_item.xml
@@ -21,6 +21,6 @@
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/simple_spinner_item.xml b/core/res/res/layout/simple_spinner_item.xml
index 4dd739fd..77929ee 100644
--- a/core/res/res/layout/simple_spinner_item.xml
+++ b/core/res/res/layout/simple_spinner_item.xml
@@ -21,6 +21,6 @@
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/status_bar.xml b/core/res/res/layout/status_bar.xml
index 0bc0dac..e8d8866 100644
--- a/core/res/res/layout/status_bar.xml
+++ b/core/res/res/layout/status_bar.xml
@@ -27,14 +27,14 @@
>
<LinearLayout android:id="@+id/icons"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="horizontal">
<com.android.server.status.IconMerger android:id="@+id/notificationIcons"
android:layout_width="0dip"
android:layout_weight="1"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:paddingLeft="6dip"
android:gravity="center_vertical"
@@ -42,7 +42,7 @@
<LinearLayout android:id="@+id/statusIcons"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:paddingRight="6dip"
android:gravity="center_vertical"
@@ -50,14 +50,14 @@
</LinearLayout>
<LinearLayout android:id="@+id/ticker"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:paddingLeft="6dip"
android:animationCache="false"
android:orientation="horizontal" >
<ImageSwitcher android:id="@+id/tickerIcon"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_marginRight="8dip"
>
<com.android.server.status.AnimatedImageView
@@ -76,12 +76,12 @@
android:paddingTop="2dip"
android:paddingRight="10dip">
<TextView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="#ff000000" />
<TextView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="#ff000000" />
@@ -90,7 +90,7 @@
<com.android.server.status.DateView android:id="@+id/date"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:singleLine="true"
android:textSize="16sp"
android:textStyle="bold"
diff --git a/core/res/res/layout/status_bar_expanded.xml b/core/res/res/layout/status_bar_expanded.xml
index fd9d26e..a0cd11d 100644
--- a/core/res/res/layout/status_bar_expanded.xml
+++ b/core/res/res/layout/status_bar_expanded.xml
@@ -25,7 +25,7 @@
android:descendantFocusability="afterDescendants">
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="3dp"
@@ -77,26 +77,26 @@
</LinearLayout>
<FrameLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ScrollView
android:id="@+id/scroll"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fadingEdge="none"
>
<com.android.server.status.NotificationLinearLayout
android:id="@+id/notificationLinearLayout"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<TextView android:id="@+id/noNotificationsTitle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
@@ -105,7 +105,7 @@
/>
<TextView android:id="@+id/ongoingTitle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
@@ -113,13 +113,13 @@
android:text="@string/status_bar_ongoing_events_title"
/>
<LinearLayout android:id="@+id/ongoingItems"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>
<TextView android:id="@+id/latestTitle"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bar_portrait"
android:paddingLeft="5dp"
@@ -127,7 +127,7 @@
android:text="@string/status_bar_latest_events_title"
/>
<LinearLayout android:id="@+id/latestItems"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>
@@ -135,7 +135,7 @@
</ScrollView>
<ImageView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/title_bar_shadow"
android:scaleType="fitXY"
diff --git a/core/res/res/layout/status_bar_icon.xml b/core/res/res/layout/status_bar_icon.xml
index 1516036..0536792 100644
--- a/core/res/res/layout/status_bar_icon.xml
+++ b/core/res/res/layout/status_bar_icon.xml
@@ -26,8 +26,8 @@
>
<com.android.server.status.AnimatedImageView android:id="@+id/image"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
/>
<TextView android:id="@+id/number"
diff --git a/core/res/res/layout/status_bar_latest_event.xml b/core/res/res/layout/status_bar_latest_event.xml
index d524bb6..59cc90d 100644
--- a/core/res/res/layout/status_bar_latest_event.xml
+++ b/core/res/res/layout/status_bar_latest_event.xml
@@ -1,11 +1,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="65sp"
android:orientation="vertical"
>
<com.android.server.status.LatestItemView android:id="@+id/content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="64sp"
android:background="@drawable/status_bar_item_background"
android:focusable="true"
@@ -15,7 +15,7 @@
</com.android.server.status.LatestItemView>
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1sp"
android:background="@drawable/divider_horizontal_bright"
/>
diff --git a/core/res/res/layout/status_bar_latest_event_content.xml b/core/res/res/layout/status_bar_latest_event_content.xml
index eeb9d9d..2f7036f 100644
--- a/core/res/res/layout/status_bar_latest_event_content.xml
+++ b/core/res/res/layout/status_bar_latest_event_content.xml
@@ -1,13 +1,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="7dp"
android:paddingLeft="5dp"
>
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="3dp"
@@ -18,7 +18,7 @@
android:scaleType="fitCenter"
android:src="@drawable/arrow_down_float"/>
<TextView android:id="@+id/title"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
@@ -30,7 +30,7 @@
android:textColor="#ff000000" />
</LinearLayout>
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
diff --git a/core/res/res/layout/status_bar_tracking.xml b/core/res/res/layout/status_bar_tracking.xml
index aa3b733..c0a7a97 100644
--- a/core/res/res/layout/status_bar_tracking.xml
+++ b/core/res/res/layout/status_bar_tracking.xml
@@ -26,18 +26,18 @@
>
<com.android.server.status.TrackingPatternView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<com.android.server.status.CloseDragHandle android:id="@+id/close"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<ImageView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:scaleType="fitXY"
diff --git a/core/res/res/layout/tab_content.xml b/core/res/res/layout/tab_content.xml
index 8f67af0..0ee87ce 100644
--- a/core/res/res/layout/tab_content.xml
+++ b/core/res/res/layout/tab_content.xml
@@ -19,13 +19,13 @@
-->
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost"
- android:layout_width="fill_parent" android:layout_height="fill_parent">
+ android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:orientation="vertical"
- android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent">
+ <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_weight="0" />
<FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="fill_parent" android:layout_height="0dip"
+ android:layout_width="match_parent" android:layout_height="0dip"
android:layout_weight="1"/>
</LinearLayout>
</TabHost>
diff --git a/core/res/res/layout/test_list_item.xml b/core/res/res/layout/test_list_item.xml
index f4e0d3c..ede32e8 100644
--- a/core/res/res/layout/test_list_item.xml
+++ b/core/res/res/layout/test_list_item.xml
@@ -19,6 +19,6 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:paddingTop="2dip"
android:paddingBottom="3dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
diff --git a/core/res/res/layout/textview_hint.xml b/core/res/res/layout/textview_hint.xml
index d69a2f6..4978be5 100644
--- a/core/res/res/layout/textview_hint.xml
+++ b/core/res/res/layout/textview_hint.xml
@@ -15,8 +15,8 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="@drawable/popup_inline_error"
android:textAppearance="?android:attr/textAppearanceSmallInverse"
/>
diff --git a/core/res/res/layout/transient_notification.xml b/core/res/res/layout/transient_notification.xml
index 1d3be14..12b67f1 100644
--- a/core/res/res/layout/transient_notification.xml
+++ b/core/res/res/layout/transient_notification.xml
@@ -19,8 +19,8 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/toast_frame">
diff --git a/core/res/res/layout/twelve_key_entry.xml b/core/res/res/layout/twelve_key_entry.xml
new file mode 100644
index 0000000..46301cd
--- /dev/null
+++ b/core/res/res/layout/twelve_key_entry.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** 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.
+*/
+-->
+
+<!-- This is not a standalone element it can be included into apps that need 12-key input -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/one"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/two"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/three"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/four"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/five"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/six"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/seven"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/eight"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/nine"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/ok"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:text="@android:string/ok"
+ />
+
+ <Button android:id="@+id/zero"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+
+ <Button android:id="@+id/cancel"
+ android:layout_width="0sp"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:text="@android:string/cancel"
+ />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/core/res/res/layout/two_line_list_item.xml b/core/res/res/layout/two_line_list_item.xml
index 2a2e759..24ba47a 100644
--- a/core/res/res/layout/two_line_list_item.xml
+++ b/core/res/res/layout/two_line_list_item.xml
@@ -18,19 +18,19 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:id="@android:id/text1"
android:textSize="16sp"
android:textStyle="bold"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:id="@android:id/text2"
android:textSize="16sp"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 6b5b168..016900d 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Umožňuje aplikaci povolit ladění jiné aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit jiné aplikace."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"změna vašeho nastavení uživatelského rozhraní"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"restartování ostatních aplikací"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Umožňuje aplikaci vynutit restartování jiných aplikací."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"vynucení zavření aplikace"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat."</string>
<string name="permlab_dump" msgid="1681799862438954752">"načtení interního stavu systému"</string>
@@ -353,7 +359,7 @@
<string name="permdesc_useCredentials" msgid="7416570544619546974">"Umožňuje aplikaci požadovat ověřovací tokeny."</string>
<string name="permlab_accessNetworkState" msgid="6865575199464405769">"zobrazení stavu sítě"</string>
<string name="permdesc_accessNetworkState" msgid="558721128707712766">"Umožňuje aplikaci zobrazit stav všech sítí."</string>
- <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"plný přístup k Internetu"</string>
+ <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"plný přístup k internetu"</string>
<string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Umožňuje aplikaci vytvořit síťové sokety."</string>
<string name="permlab_writeApnSettings" msgid="7823599210086622545">"zápis nastavení názvu přístupového bodu (APN)"</string>
<string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Umožňuje aplikaci změnit nastavení APN, jako je například proxy či port APN."</string>
@@ -387,8 +393,12 @@
<string name="permdesc_readDictionary" msgid="1082972603576360690">"Umožní aplikaci číst soukromá slova, jména a fráze, která uživatel mohl uložit do svého slovníku."</string>
<string name="permlab_writeDictionary" msgid="6703109511836343341">"zápis do slovníku definovaného uživatelem"</string>
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Umožní aplikaci zapisovat nová slova do uživatelského slovníku."</string>
- <string name="permlab_sdcardWrite" msgid="8079403759001777291">"změna/smazání obsah karty SD"</string>
+ <string name="permlab_sdcardWrite" msgid="8079403759001777291">"změna/smazání obsahu karty SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domů"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -402,7 +412,7 @@
<string-array name="emailAddressTypes">
<item msgid="8073994352956129127">"Domů"</item>
<item msgid="7084237356602625604">"Práce"</item>
- <item msgid="1112044410659011023">"Ostatní"</item>
+ <item msgid="1112044410659011023">"(další)"</item>
<item msgid="2374913952870110618">"Vlastní"</item>
</string-array>
<string-array name="postalAddressTypes">
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Přihlásit se"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Neplatné uživatelské jméno nebo heslo."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Probíhá kontrola..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odemknout"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zapnout zvuk"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Vypnout zvuk"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Ukončit aplikaci"</string>
<string name="report" msgid="4060218260984795706">"Nahlásit"</string>
<string name="wait" msgid="7147118217226317732">"Počkat"</string>
- <string name="debug" msgid="9103374629678531849">"Ladit"</string>
<string name="sendText" msgid="5132506121645618310">"Vyberte činnost s textem"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Hlasitost vyzvánění"</string>
<string name="volume_music" msgid="5421651157138628171">"Hlasitost médií"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Síť VPN L2TP/IPSec s certifikátem"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 33c21e3..61ee2e7 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -33,7 +33,7 @@
<string name="serviceEnabledFor" msgid="6856228140453471041">"Tjenesten blev aktiveret for:"</string>
<string name="serviceDisabled" msgid="1937553226592516411">"Tjenesten er deaktiveret."</string>
<string name="serviceRegistered" msgid="6275019082598102493">"Registreringen er afsluttet."</string>
- <string name="serviceErased" msgid="1288584695297200972">"Sletning afsluttet."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"Sletningen er fuldført."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"Forkert adgangskode."</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI-nummer afsluttet."</string>
<string name="badPin" msgid="5085454289896032547">"Den gamle PIN-kode, du indtastede, er ikke korrekt."</string>
@@ -49,11 +49,11 @@
<string name="BaMmi" msgid="455193067926770581">"Opkaldsspærring"</string>
<string name="PwdMmi" msgid="7043715687905254199">"Ændring af adgangskode"</string>
<string name="PinMmi" msgid="3113117780361190304">"ændring af PIN-kode"</string>
- <string name="CnipMmi" msgid="3110534680557857162">"Opkaldsnummer til stede"</string>
- <string name="CnirMmi" msgid="3062102121430548731">"Opkaldsnummer begrænset"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"Opkaldsnummeret er til stede"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"Opkaldsnummeret er begrænset"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"Trevejsopkald"</string>
<string name="RuacMmi" msgid="7827887459138308886">"Afvisning af uønskede, irriterende opkald"</string>
- <string name="CndMmi" msgid="3116446237081575808">"Opkaldsnummer levering"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Levering af opkaldsnummer"</string>
<string name="DndMmi" msgid="1265478932418334331">"Forstyr ikke"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Standarder for opkalds-id til begrænset. Næste opkald: Begrænset"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Standarder for opkalds-id til begrænset. Næste opkald: Ikke begrænset"</string>
@@ -62,14 +62,14 @@
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Tjenesten leveres ikke!"</string>
<string name="CLIRPermanent" msgid="5460892159398802465">"Indstillingen for opkalds-id kan ikke ændres."</string>
<string name="RestrictedChangedTitle" msgid="5592189398956187498">"Begrænset adgang ændret"</string>
- <string name="RestrictedOnData" msgid="8653794784690065540">"Datatjeneste er blokeret."</string>
- <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Nødtjeneste er blokeret."</string>
- <string name="RestrictedOnNormal" msgid="2045364908281990708">"Stemme-/SMS-tjeneste er blokeret."</string>
- <string name="RestrictedOnAll" msgid="4923139582141626159">"Alle stemme-/SMS-tjenester er blokerede."</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"Datatjenesten er blokeret."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Nødtjenesten er blokeret."</string>
+ <string name="RestrictedOnNormal" msgid="2045364908281990708">"Stemme-/sms-tjenesten er blokeret."</string>
+ <string name="RestrictedOnAll" msgid="4923139582141626159">"Alle stemme-/sms-tjenester er blokerede."</string>
<string name="serviceClassVoice" msgid="1258393812335258019">"Stemme"</string>
<string name="serviceClassData" msgid="872456782077937893">"Data"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"FAX"</string>
- <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"sms"</string>
<string name="serviceClassDataAsync" msgid="4523454783498551468">"Asynkroniser"</string>
<string name="serviceClassDataSync" msgid="7530000519646054776">"Synkroniser"</string>
<string name="serviceClassPacket" msgid="6991006557993423453">"Pakke"</string>
@@ -77,8 +77,8 @@
<string name="roamingText0" msgid="7170335472198694945">"Roamingindikator til"</string>
<string name="roamingText1" msgid="5314861519752538922">"Roamingindikator fra"</string>
<string name="roamingText2" msgid="8969929049081268115">"Roamingindikator blinker"</string>
- <string name="roamingText3" msgid="5148255027043943317">"Ude af kvarteret"</string>
- <string name="roamingText4" msgid="8808456682550796530">"Ude af bygningen"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"Ikke i kvarteret"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"Ikke i bygningen"</string>
<string name="roamingText5" msgid="7604063252850354350">"Roaming – Foretrukket system"</string>
<string name="roamingText6" msgid="2059440825782871513">"Roaming – Tilgængeligt system"</string>
<string name="roamingText7" msgid="7112078724097233605">"Roaming – Alliance Partner"</string>
@@ -88,12 +88,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roamingbanner til"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roamingbanner fra"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Søger efter tjeneste"</string>
- <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderestillet"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> efter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
- <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
- <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
- <string name="fcComplete" msgid="3118848230966886575">"Funktionskode komplet."</string>
+ <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderestillet"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderestillet"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"Funktionskoden er komplet."</string>
<string name="fcError" msgid="3327560126588500777">"Forbindelsesproblemer eller ugyldig funktionskode."</string>
<string name="httpErrorOk" msgid="1191919378083472204">"OK"</string>
<string name="httpError" msgid="2567300624552921790">"Websiden indeholder en fejl."</string>
@@ -124,29 +124,29 @@
<string name="screen_lock" msgid="799094655496098153">"Skærmlås"</string>
<string name="power_off" msgid="4266614107412865048">"Sluk"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"Lukker ned ..."</string>
- <string name="shutdown_confirm" msgid="649792175242821353">"Din telefon lukkes ned."</string>
+ <string name="shutdown_confirm" msgid="649792175242821353">"lydstyrke for opkald"</string>
<string name="no_recent_tasks" msgid="279702952298056674">"Der er ingen nye programmer."</string>
- <string name="global_actions" msgid="2406416831541615258">"Telefonvalgmuligheder"</string>
+ <string name="global_actions" msgid="2406416831541615258">"Indstillinger for telefon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Skærmlås"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Sluk"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lydløs"</string>
- <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Lyden er FRA"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Lyden er slået FRA"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Lyden er TIL"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flytilstand"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er FRA"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string>
<string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tjenester, der koster dig penge"</string>
- <string name="permgroupdesc_costMoney" msgid="8193824940620517189">"Tillader et program at gøre ting, som kan koste penge."</string>
+ <string name="permgroupdesc_costMoney" msgid="8193824940620517189">"Tillader, at et program kan gøre ting, som kan koste penge."</string>
<string name="permgrouplab_messages" msgid="7521249148445456662">"Dine beskeder"</string>
- <string name="permgroupdesc_messages" msgid="7045736972019211994">"Læs og skriv dine SMS-, e-mail- og andre beskeder."</string>
+ <string name="permgroupdesc_messages" msgid="7045736972019211994">"Læs og skriv dine sms-, e-mail- og andre beskeder."</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Dine personlige oplysninger"</string>
<string name="permgroupdesc_personalInfo" msgid="5488050357388806068">"Få direkte adgang til dine kontakter og din kalender, der er gemt på telefonen."</string>
<string name="permgrouplab_location" msgid="635149742436692049">"Din placering"</string>
<string name="permgroupdesc_location" msgid="2430258821648348660">"Overvåg din fysiske placering"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netværkskommunikation"</string>
- <string name="permgroupdesc_network" msgid="5035763698958415998">"Tillader programmer at få adgang til forskellige netværksfunktioner."</string>
+ <string name="permgroupdesc_network" msgid="5035763698958415998">"Tillader, at programmerne får adgang til forskellige netværksfunktioner."</string>
<string name="permgrouplab_accounts" msgid="3359646291125325519">"Dine konti"</string>
<string name="permgroupdesc_accounts" msgid="4948732641827091312">"Få adgang til de tilgængelige konti."</string>
<string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Hardwarekontroller"</string>
@@ -160,123 +160,129 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="9203302214915355774">"Få adgang til SD-kortet."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktiver eller rediger statuslinje"</string>
- <string name="permdesc_statusBar" msgid="1365473595331989732">"Tillader et program at deaktivere statuslinjen eller tilføje eller fjerne systemikoner."</string>
+ <string name="permdesc_statusBar" msgid="1365473595331989732">"Tillader, at et program deaktiverer statuslinjen eller tilføjer eller fjerner systemikoner."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"udvid/skjul statuslinje"</string>
- <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Tillader et program at udvide eller skjule statuslinjen."</string>
+ <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Tillader, at et program udvider eller skjuler statuslinjen."</string>
<string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"opfang udgående opkald"</string>
- <string name="permdesc_processOutgoingCalls" msgid="2228988201852654461">"Tillader et program at behandle udgående opkald og ændre nummeret, der skal ringes til. Ondsindede programmer kan overvåge, omdirigere eller forhindre udgående opkald."</string>
- <string name="permlab_receiveSms" msgid="2697628268086208535">"modtag SMS"</string>
- <string name="permdesc_receiveSms" msgid="6298292335965966117">"Tillader et program at modtage og behandle SMS-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
- <string name="permlab_receiveMms" msgid="8894700916188083287">"modtag MMS"</string>
- <string name="permdesc_receiveMms" msgid="4563346832000174373">"Tillader et program at modtage og behandle MMS-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
- <string name="permlab_sendSms" msgid="5600830612147671529">"send SMS-beskeder"</string>
- <string name="permdesc_sendSms" msgid="1946540351763502120">"Tillader et program at sende SMS-beskeder. Ondsindede programmer kan eventuelt koste dig penge ved at sende beskeder uden din bekræftelse."</string>
- <string name="permlab_readSms" msgid="4085333708122372256">"læs SMS eller MMS"</string>
- <string name="permdesc_readSms" msgid="3002170087197294591">"Tillader et program at læse SMS-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt læse dine fortrolige beskeder."</string>
- <string name="permlab_writeSms" msgid="6881122575154940744">"rediger SMS eller MMS"</string>
- <string name="permdesc_writeSms" msgid="6299398896177548095">"Tillader et program at skrive til SMS-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt slette dine beskeder."</string>
+ <string name="permdesc_processOutgoingCalls" msgid="2228988201852654461">"Tillader, at et program behandler udgående opkald og ændrer det nummer, der ringes til. Ondsindede programmer kan overvåge, omdirigere eller forhindre udgående opkald."</string>
+ <string name="permlab_receiveSms" msgid="2697628268086208535">"modtag sms"</string>
+ <string name="permdesc_receiveSms" msgid="6298292335965966117">"Tillader, at et program modtager og behandler sms-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+ <string name="permlab_receiveMms" msgid="8894700916188083287">"modtag mms"</string>
+ <string name="permdesc_receiveMms" msgid="4563346832000174373">"Tillader, at et program modtager og behandler mms-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"send sms-beskeder"</string>
+ <string name="permdesc_sendSms" msgid="1946540351763502120">"Tillader, at et program at sender sms-beskeder. Ondsindede programmer kan eventuelt koste dig penge ved at sende beskeder uden din bekræftelse."</string>
+ <string name="permlab_readSms" msgid="4085333708122372256">"læs sms eller mms"</string>
+ <string name="permdesc_readSms" msgid="3002170087197294591">"Tillader, at et program læser sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt læse dine fortrolige beskeder."</string>
+ <string name="permlab_writeSms" msgid="6881122575154940744">"rediger sms eller mms"</string>
+ <string name="permdesc_writeSms" msgid="6299398896177548095">"Tillader, at et program skriver i sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt slette dine beskeder."</string>
<string name="permlab_receiveWapPush" msgid="8258226427716551388">"modtag WAP"</string>
- <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Tillader et program at modtage og behandle WAP-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+ <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Tillader, at et program modtager og behandler WAP-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
<string name="permlab_getTasks" msgid="5005277531132573353">"hent kørende programmer"</string>
- <string name="permdesc_getTasks" msgid="7048711358713443341">"Tillader et program at hente oplysninger om nuværende og for nyligt kørende opgaver. Tillader eventuelt ondsindede programmer at finde private oplysninger om andre programmer."</string>
+ <string name="permdesc_getTasks" msgid="7048711358713443341">"Tillader, at et program henter oplysninger om nuværende og for nyligt kørende opgaver. Tillader, at eventuelt ondsindede programmer finder private oplysninger om andre programmer."</string>
<string name="permlab_reorderTasks" msgid="5669588525059921549">"omorganiser kørende programmer"</string>
- <string name="permdesc_reorderTasks" msgid="126252774270522835">"Tillader et program at flytte opgaver til forgrunden og baggrunden. Ondsindede programmer kan tvinge dem selv til forgrunden uden din kontrol."</string>
+ <string name="permdesc_reorderTasks" msgid="126252774270522835">"Tillader, at et program flytter opgaver til forgrunden og baggrunden. Ondsindede programmer kan tvinge dem selv til forgrunden uden din kontrol."</string>
<string name="permlab_setDebugApp" msgid="4339730312925176742">"aktiver programfejlretning"</string>
- <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillader et program at slå fejlretning af andet program til. Ondsindede programmer kan bruge dette til at standse andre programmer."</string>
- <string name="permlab_changeConfiguration" msgid="8214475779521218295">"skift dine UI-indstillinger"</string>
- <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillader et program at ændre den nuværende konfiguration, som f.eks. den lokale eller overordnede skrifttypestørrelse."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"genstart andre programmer"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Tillader et program at tvangsgenstarte andre programmer."</string>
+ <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillader, at et program slår fejlretning af andet program til. Ondsindede programmer kan bruge dette til at standse andre programmer."</string>
+ <string name="permlab_changeConfiguration" msgid="8214475779521218295">"skift indstillinger for brugergrænsefladen"</string>
+ <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillader, at et program ændrer den nuværende konfiguration, f.eks. den lokale eller overordnede skrifttypestørrelse."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"tving programmet til at lukke"</string>
- <string name="permdesc_forceBack" msgid="6534109744159919013">"Tillader et program at tvinge alle programmer, der er i forgrunden, til at lukke og gå tilbage. Bør aldrig være nødvendigt til normale programmer."</string>
+ <string name="permdesc_forceBack" msgid="6534109744159919013">"Tillader, at et program tvinger alle programmer, der er i forgrunden, til at lukke og køre i baggrunden. Bør aldrig være nødvendigt til normale programmer."</string>
<string name="permlab_dump" msgid="1681799862438954752">"hent intern systemtilstand"</string>
- <string name="permdesc_dump" msgid="2198776174276275220">"Tillader et program at hente systemets interne tilstand. Ondsindede programmer kan hente en række private og sikre oplysninger, som de normalt aldrig bør have brug for."</string>
+ <string name="permdesc_dump" msgid="2198776174276275220">"Tillader, at et program henter systemets interne tilstand. Ondsindede programmer kan hente en række private og sikre oplysninger, som de normalt aldrig bør have brug for."</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"delvis lukning"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"Sætter aktivitetsadministratoren i lukningstilstand. Lukker ikke helt ned."</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"undgå programskift"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Forhindrer brugeren i at skifte til et andet program."</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"overvåg og kontroller start af alle programmer"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Tillader et program at overvåge og kontrollere, hvordan systemet starter aktiviteter. Ondsindede programmer kan fuldstændig kompromittere systemet. Denne tilladelse er kun nødvendig til udvikling, aldrig til normal telefonbrug."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Tillader, at et program overvåger og kontrollerer, hvordan systemet starter aktiviteter. Ondsindede programmer kan fuldstændig kompromittere systemet. Denne tilladelse er kun nødvendig til udvikling, aldrig til normal telefonbrug."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"send udsendelse om fjernet pakke"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Tillader et program at udsende en meddelelse om, at en programpakke er fjernet. Ondsindede programmer kan bruge dette til at afslutte et andet kørende program."</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"send SMS-modtaget udsendelse"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="9122419277306740155">"Tillader et program at udsende en meddelelse om, at der er modtaget en SMS-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske indgående SMS-beskeder."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Tillader, at et program udsender en meddelelse om, at en programpakke er fjernet. Ondsindede programmer kan bruge dette til at afslutte et andet kørende program."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"send sms-modtaget udsendelse"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="9122419277306740155">"Tillader, at et program udsender en meddelelse om, at der er modtaget en sms-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske indgående sms-beskeder."</string>
<string name="permlab_broadcastWapPush" msgid="3145347413028582371">"send WAP-PUSH-modtaget udsendelse"</string>
- <string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"Tillader et program at udsende en meddelelse om, at der er modtaget en WAP PUSH-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske modtagelse af MMS-besked eller i det skjulte erstatte indholdet på alle websider med ondsindede varianter."</string>
+ <string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"Tillader, at et program udsender en meddelelse om, at der er modtaget en WAP PUSH-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske modtagelse af mms-besked eller i det skjulte erstatte indholdet på alle websider med ondsindede varianter."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"begræns antallet af kørende processer"</string>
- <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"Tillader et program at kontrollere det maksimale antal processer, der kan køre. Er aldrig nødvendigt til normale programmer."</string>
+ <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"Tillader, at et program kontrollerer det maksimale antal processer, der kan køre. Er aldrig nødvendigt til normale programmer."</string>
<string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"få alle baggrundsprogrammer til at lukke"</string>
- <string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Tillader et program at kontrollere, om aktiviteter altid afsluttes, så snart de går i baggrunden. Aldrig nødvendigt til normale programmer."</string>
+ <string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Tillader, at et program kontrollerer, om aktiviteter altid afsluttes, så snart de går i baggrunden. Aldrig nødvendigt til normale programmer."</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"rediger batteristatistikker"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Tillader ændring af indsamlede batteristatistikker. Ikke til brug for normale programmer."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontroller sikkerhedskopiering af system, og gendan"</string>
- <string name="permdesc_backup" msgid="4837493065154256525">"Tillader et program at kontrollere systemets sikkerhedskopierings- og gendannelsesmekanisme. Ikke til brug til normale programmer."</string>
- <string name="permlab_backup_data" msgid="4057625941707926463">"Sikkerhedskopier og gendan programmets data"</string>
- <string name="permdesc_backup_data" msgid="8274426305151227766">"Tillader et program at deltage i systemets sikkerhedskopierings- og gendannelsesmekanisme."</string>
+ <string name="permdesc_backup" msgid="4837493065154256525">"Tillader, at et program kontrollerer systemets sikkerhedskopierings- og gendannelsesfunktion. Ikke til brug til normale programmer."</string>
+ <string name="permlab_backup_data" msgid="4057625941707926463">"sikkerhedskopier og gendan programmets data"</string>
+ <string name="permdesc_backup_data" msgid="8274426305151227766">"Tillader, at et program deltager i systemets sikkerhedskopierings- og gendannelsesfunktion."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserede vinduer"</string>
<string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillader oprettelse af vinduer, der er beregnet til at blive brugt af den interne systembrugergrænseflade. Ikke til brug for normale programmer."</string>
<string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vis underretninger på systemniveau"</string>
- <string name="permdesc_systemAlertWindow" msgid="5109622689323490558">"Tillader et program at vise systemunderretningsvinduer. Ondsindede programmer kan overtage hele telefonens skærm."</string>
+ <string name="permdesc_systemAlertWindow" msgid="5109622689323490558">"Tillader, at et program viser vinduer med systemunderretninger. Ondsindede programmer kan overtage hele telefonens skærm."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"rediger global animationshastighed"</string>
- <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Tillader et program at ændre den globale animationshastighed (hurtigere eller langsommere animationer) når som helst."</string>
+ <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Tillader, at et program altid kan ændre den globale animationshastighed (hurtigere eller langsommere animationer)."</string>
<string name="permlab_manageAppTokens" msgid="17124341698093865">"administrer programtokens"</string>
- <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Tillader programmet at oprette og administrere deres egen tokens og gå uden om deres normale Z-rækkefølge. Bør aldrig være nødvendigt til normale programmer."</string>
+ <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Tillader, at programmet opretter og administrerer sine egen tokens og gå uden om sin normale Z-rækkefølge. Bør aldrig være nødvendigt til normale programmer."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"tryk på taster og kontrolknapper"</string>
- <string name="permdesc_injectEvents" msgid="3946098050410874715">"Tillader et program at levere sine egne inputbegivenheder (tastetryk osv.) til andre programmer. Ondsindede programmer kan bruge dette til at overtage telefonen."</string>
+ <string name="permdesc_injectEvents" msgid="3946098050410874715">"Tillader, at et program leverer sine egne inputbegivenheder (tastetryk osv.) til andre programmer. Ondsindede programmer kan bruge dette til at overtage telefonen."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"registrerer, hvad du indtaster, og hvilke handlinger du foretager dig"</string>
- <string name="permdesc_readInputState" msgid="5132879321450325445">"Tillader et program at holde øje med de taster, du trykker på, selv når du interagerer med andre programmer (som f.eks. indtastning af adgangskode). Bør aldrig være nødvendigt til normale programmer."</string>
+ <string name="permdesc_readInputState" msgid="5132879321450325445">"Tillader, at et program registrerer taster, du trykker på, selv når du interagerer med andre programmer (f.eks. ved indtastning af adgangskode). Bør aldrig være nødvendigt til normale programmer."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"forpligt til en inputmetode"</string>
- <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tillader brugeren at forpligte sig på en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
+ <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tillader, at brugeren forpligter sig til en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"forpligt til et tapet"</string>
- <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Tillader brugeren at forpligte sig på et tapets grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
+ <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Tillader, at brugeren forpligter sig til et tapets grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"skift skærmretning"</string>
- <string name="permdesc_setOrientation" msgid="6335814461615851863">"Tillader et program at ændre rotationen af skærmen når som helst. Bør aldrig være nødvendigt til normale programmer."</string>
+ <string name="permdesc_setOrientation" msgid="6335814461615851863">"Tillader, at et program ændrer rotationen af skærmen når som helst. Bør aldrig være nødvendigt til normale programmer."</string>
<string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"send Linux-signaler til programmer"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"Tillader program at anmode om, at det leverede signal sendes til alle vedholdende processer."</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"Tillader, at programmet kan anmode om, at det leverede signal sendes til alle vedholdende processer."</string>
<string name="permlab_persistentActivity" msgid="8659652042401085862">"lad altid programmet køre"</string>
- <string name="permdesc_persistentActivity" msgid="5037199778265006008">"Tillader et program at gøre dele af sig selv vedholdende, så systemet ikke kan bruge det til andre programmer."</string>
+ <string name="permdesc_persistentActivity" msgid="5037199778265006008">"Tillader, at et program gør dele af sig selv vedholdende, så systemet ikke kan bruge det til andre programmer."</string>
<string name="permlab_deletePackages" msgid="3343439331576348805">"slet programmer"</string>
- <string name="permdesc_deletePackages" msgid="3634943677518723314">"Tillader et program at slette Android-pakker. Ondsindede programmer kan bruge dette til at slette vigtige programmer."</string>
+ <string name="permdesc_deletePackages" msgid="3634943677518723314">"Tillader, at et program sletter Android-pakker. Ondsindede programmer kan bruge dette til at slette vigtige programmer."</string>
<string name="permlab_clearAppUserData" msgid="2192134353540277878">"slet andre programmers data"</string>
- <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Lader et program rydde brugerdata."</string>
+ <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Tillader, at et program rydder brugerdata."</string>
<string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"slet andre programmers cacher"</string>
- <string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"Tillader et program at slette cachefiler."</string>
- <string name="permlab_getPackageSize" msgid="4799785352306641460">"måler programmets lagerplads"</string>
- <string name="permdesc_getPackageSize" msgid="5557253039670753437">"Tillader et program at hente dets kode, data og cachestørrelser"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"Tillader, at et program sletter cachefiler."</string>
+ <string name="permlab_getPackageSize" msgid="4799785352306641460">"vis programmets lagerplads"</string>
+ <string name="permdesc_getPackageSize" msgid="5557253039670753437">"Tillader, at et program henter sin kode, data og cachestørrelser"</string>
<string name="permlab_installPackages" msgid="335800214119051089">"installer programmer direkte"</string>
- <string name="permdesc_installPackages" msgid="526669220850066132">"Tillader et program at installere nye eller opdaterede Android-pakker. Ondsindede programmer kan bruge dette til at tilføje nye programmer med vilkårlige, effektive tilladelser."</string>
+ <string name="permdesc_installPackages" msgid="526669220850066132">"Tillader, at et program installerer nye eller opdaterede Android-pakker. Ondsindede programmer kan bruge dette til at tilføje nye programmer med vilkårlige, effektive tilladelser."</string>
<string name="permlab_clearAppCache" msgid="4747698311163766540">"slet alle cachedata for programmet"</string>
- <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Tillader et program at frigøre plads på telefonen ved at slette filer i programmets cachemappe. Adgang er normalt meget begrænset til systemprocesser."</string>
+ <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Tillader, at et program frigør plads på telefonen ved at slette filer i programmets cachemappe. Adgang er normalt meget begrænset til systemprocesser."</string>
<string name="permlab_readLogs" msgid="4811921703882532070">"læs systemlogfiler"</string>
- <string name="permdesc_readLogs" msgid="2257937955580475902">"Tillader et program at læse fra systemets forskellige logfiler. Dermed kan generelle oplysninger om, hvad du laver med telefonen, opdages, men logfilerne skulle ikke indeholde personlige eller private oplysninger."</string>
+ <string name="permdesc_readLogs" msgid="2257937955580475902">"Tillader, at et program læser fra systemets forskellige logfiler. Dermed kan generelle oplysninger om, hvad du laver med telefonen, registreres, men logfilerne bør ikke indeholde personlige eller private oplysninger."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"læs/skriv til ressourcer ejet af diag"</string>
- <string name="permdesc_diagnostic" msgid="3121238373951637049">"Tillader et program at læse og skrive til alle ressourcer, der ejes af diag-gruppen, som f.eks. flier i /dev. Dette kan muligvis påvirke systemets stabilitet og sikkerhed. Dette bør KUN bruges til hardwarespecifikke diagnosticeringer foretaget af producent eller udbyder."</string>
+ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Tillader, at et program læser og skriver til alle ressourcer, der ejes af diag-gruppen, som f.eks. flier i /dev. Dette kan muligvis påvirke systemets stabilitet og sikkerhed. Dette bør KUN bruges til hardwarespecifikke diagnosticeringer foretaget af producent eller udbyder."</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"aktiver eller deaktiver programkomponenter"</string>
- <string name="permdesc_changeComponentState" msgid="4569107043246700630">"Tillader et program at ændre, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige telefonfunktioner. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string>
- <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"indstil foretrukne programmer"</string>
- <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Tillader et program at ændre dine foretrukne programmer. Dette kan tillade, at ondsindede programmer ændrer kørende programmer i det skjulte og narrer dine eksisterende programmer til at indsamle personlige data fra dig."</string>
+ <string name="permdesc_changeComponentState" msgid="4569107043246700630">"Tillader, at et program ændrer, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige telefonfunktioner. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string>
+ <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"angiv foretrukne programmer"</string>
+ <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Tillader, at et program ændrer dine foretrukne programmer. Dette kan medføre, at ondsindede programmer ændrer kørende programmer i det skjulte og narrer dine eksisterende programmer til at indsamle personlige oplysninger fra dig."</string>
<string name="permlab_writeSettings" msgid="1365523497395143704">"rediger globale systemindstillinger"</string>
- <string name="permdesc_writeSettings" msgid="838789419871034696">"Tillader et program at ændre systemets indstillingsdata. Ondsindede programmer kan skade systemets konfiguration."</string>
+ <string name="permdesc_writeSettings" msgid="838789419871034696">"Tillader, at et program ændrer systemets indstillingsdata. Ondsindede programmer kan skade systemets konfiguration."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"rediger sikre systemindstillinger"</string>
- <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Tillader et program at ændre systemernes sikre indstillingsdata. Ikke til brug til almindelige programmer."</string>
+ <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Tillader, at et program ændrer systemernes sikre indstillingsdata. Ikke til brug til almindelige programmer."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"rediger kortet over Google-tjenester"</string>
- <string name="permdesc_writeGservices" msgid="6602362746516676175">"Tillader et program at ændre kortet over Google-tjenester. Ikke til brug til normale programmer."</string>
+ <string name="permdesc_writeGservices" msgid="6602362746516676175">"Tillader, at et program ændrer kortet over Google-tjenester. Ikke til brug til normale programmer."</string>
<string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"start automatisk ved opstart"</string>
- <string name="permdesc_receiveBootCompleted" msgid="698336728415008796">"Tillader et program at starte selv, når systemet er færdig med at starte. Dette kan gøre start af telefonen langsommere og generelt gøre telefonen langsommere ved altid at lade programmet køre."</string>
+ <string name="permdesc_receiveBootCompleted" msgid="698336728415008796">"Tillader, at et program starter selv, når systemet er færdig med at starte. Dette kan gøre startem af telefonen langsommere og generelt gøre telefonen langsommere ved altid at lade programmet køre."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"send klæbende udsendelse"</string>
- <string name="permdesc_broadcastSticky" msgid="1920045289234052219">"Tillader et program at sende klæbende udsendelser, der bliver tilbage, efter udsendelsen er slut. Ondsindede programmer kan gøre telefonen langsom eller ustabil ved at få den til at bruge for meget hukommelse."</string>
+ <string name="permdesc_broadcastSticky" msgid="1920045289234052219">"Tillader, at et program sender klæbende udsendelser, der bliver tilbage, efter udsendelsen er slut. Ondsindede programmer kan gøre telefonen langsom eller ustabil ved at få den til at bruge for meget hukommelse."</string>
<string name="permlab_readContacts" msgid="6219652189510218240">"læs kontaktdata"</string>
- <string name="permdesc_readContacts" msgid="3371591512896545975">"Tillader et program at læse alle kontaktdata (adresse), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine data til andre mennesker."</string>
+ <string name="permdesc_readContacts" msgid="3371591512896545975">"Tillader, at et program læser alle kontaktdata (adresser), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine data til andre mennesker."</string>
<string name="permlab_writeContacts" msgid="644616215860933284">"skriv kontaktdata"</string>
- <string name="permdesc_writeContacts" msgid="3924383579108183601">"Tillader et program at ændre telefonens kontaktdata (adresse), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kontaktdata."</string>
+ <string name="permdesc_writeContacts" msgid="3924383579108183601">"Tillader, at et program ændrer kontaktdata (adresser), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kontaktdata."</string>
<string name="permlab_writeOwnerData" msgid="4892555913849295393">"skriv ejerdata"</string>
- <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Tillader et program at ændre telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre ejerdata."</string>
+ <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Tillader, at et program ændrer rtelefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre ejerdata."</string>
<string name="permlab_readOwnerData" msgid="6668525984731523563">"læs ejerdata"</string>
- <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Tillader et program at læse telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at læse ejerdata."</string>
+ <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Tillader, at et program læser telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at læse ejerdata."</string>
<string name="permlab_readCalendar" msgid="3728905909383989370">"læs kalenderdata"</string>
- <string name="permdesc_readCalendar" msgid="5533029139652095734">"Tillader et program at læse alle kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine kalenderbegivenheder til andre mennesker."</string>
+ <string name="permdesc_readCalendar" msgid="5533029139652095734">"Tillader, at et program læser alle kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine kalenderbegivenheder til andre mennesker."</string>
<string name="permlab_writeCalendar" msgid="377926474603567214">"skriv kalenderdata"</string>
- <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Tillader et program at ændre telefonens kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kalenderdata."</string>
+ <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Tillader, at et program ændrer de kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kalenderdata."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"imiterede placeringskilder til test"</string>
<string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Opret imiterede placeringskilder til testning. Ondsindede programmer kan bruge dette til at tilsidesætte den returnerede placering og/eller status fra rigtige placeringskilder som f.eks. GPS eller netværksudbydere."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få adgang til ekstra kommandoer for placeringsudbyder"</string>
@@ -288,33 +294,33 @@
<string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"grov (netværksbaseret) placering"</string>
<string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"Få adgang til grove placeringskilder som f.eks. den mobile netværksdatabase for at finde en omtrentlig placering for telefonen, hvor det er muligt. Ondsindede programmer kan bruge dette til at finde ud af, hvor du omtrent er."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"få adgang til SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Tillader et program at bruge SurfaceFlinger-funktioner på lavt niveau."</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Tillader, at et program bruger SurfaceFlinger-funktioner på lavt niveau."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"læs rammebuffer"</string>
- <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"Tillader et program at læse indholdet fra rammebufferen."</string>
+ <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"Tillader, at et program læser indholdet fra rammebufferen."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"skift dine lydindstillinger"</string>
- <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Tillader et program at ændre globale lydindstillinger som f.eks. lydstyrke og kanalisering."</string>
+ <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Tillader, at et program ændrer globale lydindstillinger som f.eks. lydstyrke og kanalisering."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"optag lyd"</string>
- <string name="permdesc_recordAudio" msgid="6493228261176552356">"Tillader et program at få adgang til lydregistreringsstien."</string>
+ <string name="permdesc_recordAudio" msgid="6493228261176552356">"Tillader, at et program får adgang til lydregistreringsstien."</string>
<string name="permlab_camera" msgid="8059288807274039014">"tag billeder"</string>
- <string name="permdesc_camera" msgid="9013476258810982546">"Tillader programmet at tage billeder med kameraet. Dette tillader programmet til hver en tid at indsamle de billeder, kameraet ser."</string>
+ <string name="permdesc_camera" msgid="9013476258810982546">"Tillader, at programmet tager billeder med kameraet. Dette giver programmet mulighed for altid at indsamle de billeder, kameraet ser."</string>
<string name="permlab_brick" msgid="8337817093326370537">"deaktiver telefonen permanent"</string>
- <string name="permdesc_brick" msgid="5569526552607599221">"Tillader programmet at deaktivere hele telefonen permanent. Dette er meget farligt."</string>
+ <string name="permdesc_brick" msgid="5569526552607599221">"Tillader, at programmet deaktiverer hele telefonen permanent. Dette er meget farligt."</string>
<string name="permlab_reboot" msgid="2898560872462638242">"tving telefon til at genstarte"</string>
- <string name="permdesc_reboot" msgid="7914933292815491782">"Tillader programmet at tvinge telefonen til at genstarte."</string>
+ <string name="permdesc_reboot" msgid="7914933292815491782">"Tillader, at programmet tvinger telefonen til at genstarte."</string>
<string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"monter eller demonter filsystemer"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Tillader programmet at montere eller demontere filsystemer til flytbar lagring."</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Tillader, at programmet monterer eller demonterer filsystemer til flytbar lagring."</string>
<string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formater ekstern lagring"</string>
- <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Tillader et program at formatere flytbar lagring."</string>
+ <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Tillader, at et program formaterer flytbart lager."</string>
<string name="permlab_vibrate" msgid="7768356019980849603">"kontroller vibrator"</string>
<string name="permdesc_vibrate" msgid="2886677177257789187">"Lader programmet kontrollere vibratoren."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"kontroller lommelygte"</string>
- <string name="permdesc_flashlight" msgid="6433045942283802309">"Tillader programmet at kontrollere lommelygten."</string>
+ <string name="permdesc_flashlight" msgid="6433045942283802309">"Tillader, at programmet kontrollerer lommelygten."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"test hardware"</string>
- <string name="permdesc_hardware_test" msgid="3668894686500081699">"Tillader et program at kontrollere forskellige perifere enheder med det formål at teste hardwaren."</string>
+ <string name="permdesc_hardware_test" msgid="3668894686500081699">"Tillader, at et program kontrollerer forskellige perifere enheder for at teste hardwaren."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ring direkte op til telefonnumre"</string>
- <string name="permdesc_callPhone" msgid="3369867353692722456">"Tillader programmet at ringe til telefonnumre uden din indgriben. Ondsindede programmer kan forårsage uventede opkald på din telefonregning. Vær opmærksom på, at det ikke tillader programmet at ringe til nødnumre."</string>
+ <string name="permdesc_callPhone" msgid="3369867353692722456">"Tillader, at programmet ringer til telefonnumre uden din indgriben. Ondsindede programmer kan forårsage uventede opkald på din telefonregning. Vær opmærksom på, at programmet ikke kan ringe til nødnumre."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"ring direkte op til alle telefonnumre"</string>
- <string name="permdesc_callPrivileged" msgid="244405067160028452">"Tillader programmet at ringe til alle telefonnumre inklusive nødnumre uden din indgriben. Ondsindede programmer kan eventuelt foretage unødvendige og ulovlige opkald til nødtjenester."</string>
+ <string name="permdesc_callPrivileged" msgid="244405067160028452">"Tillader, at programmet ringer til alle telefonnumre inklusive nødnumre uden din indgriben. Ondsindede programmer kan eventuelt foretage unødvendige og ulovlige opkald til nødtjenester."</string>
<string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"start CDMA-telefonopsætning direkte"</string>
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Tillader, at programmet starter CDMA-levering. Ondsindede programmer kan starte unødvendig CDMA-levering"</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"kontroller meddelelser om placeringsopdatering"</string>
@@ -322,75 +328,79 @@
<string name="permlab_checkinProperties" msgid="7855259461268734914">"egenskaber for adgangskontrol"</string>
<string name="permdesc_checkinProperties" msgid="7150307006141883832">"Tillader læse/skrive-adgang til egenskaber, der er uploadet af kontroltjenesten. Ikke til brug til normale programmer."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"vælg widgets"</string>
- <string name="permdesc_bindGadget" msgid="2098697834497452046">"Tillader programmet at fortælle systemet, hvilke widgets der kan bruges af hvilke programmer. Med denne tilladelse kan programmer give adgang til personlige data til andre programmer. Ikke til brug til normale programmer."</string>
+ <string name="permdesc_bindGadget" msgid="2098697834497452046">"Tillader, at programmet fortæller systemet, hvilke widgets der kan bruges af hvilke programmer. Med denne tilladelse kan programmer give adgang til personlige oplysninger til andre programmer. Ikke til brug til normale programmer."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"rediger telefontilstand"</string>
- <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Tillader programmet at kontrollere enhedens telefonfunktioner. Et program med denne tilladelse kan skifte netværk, slå telefonens radio til og fra og lignende uden nogensinde at underrette dig."</string>
+ <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Tillader, at programmet kontrollerer enhedens telefonfunktioner. Et program med denne tilladelse kan skifte netværk, slå telefonens radio til og fra og lignende uden nogensinde at informere dig."</string>
<string name="permlab_readPhoneState" msgid="2326172951448691631">"læs telefontilstand og identitet"</string>
- <string name="permdesc_readPhoneState" msgid="188877305147626781">"Tillader programmet at få adgang til enhedens telefonfunktioner. Et program med denne tilladelse kan afgøre denne telefons telefon- og serienummer, om et opkald er aktivt, nummeret som opkaldet er forbundet til osv."</string>
+ <string name="permdesc_readPhoneState" msgid="188877305147626781">"Tillader, at programmet får adgang til enhedens telefonfunktioner. Et program kan med denne tilladelse registrere denne telefons telefon- og serienummer, om et opkald er aktivt, nummeret som det opkald er forbundet til osv."</string>
<string name="permlab_wakeLock" msgid="573480187941496130">"afhold telefonen fra at gå i dvale"</string>
- <string name="permdesc_wakeLock" msgid="7584036471227467099">"Tillader et program at forhindre telefonen i at gå i dvale."</string>
- <string name="permlab_devicePower" msgid="4928622470980943206">"Tænd eller sluk for telefonen"</string>
- <string name="permdesc_devicePower" msgid="4577331933252444818">"Tillader programmet at slå telefonen til eller fra."</string>
+ <string name="permdesc_wakeLock" msgid="7584036471227467099">"Tillader, at et program forhindrer telefonen i at gå i dvale."</string>
+ <string name="permlab_devicePower" msgid="4928622470980943206">"tænd eller sluk for telefonen"</string>
+ <string name="permdesc_devicePower" msgid="4577331933252444818">"Tillader, at programmet slukker og tænder telefonen."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"kør i fabriksindstillet testtilstand"</string>
<string name="permdesc_factoryTest" msgid="8136644990319244802">"Kør som en producenttest på lavt niveau. Giver fuld adgang til telefonens hardware. Kun tilgængeligt når en telefon kører i producenttesttilstand."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"angiv tapet"</string>
- <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Tillader programmet at opsætte systemets tapet."</string>
+ <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Tillader, at programmet opsætter systemets tapet."</string>
<string name="permlab_setWallpaperHints" msgid="3600721069353106851">"opsæt tip til tapetstørrelse"</string>
- <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Tillader programmet at opsætte størrelsestip for systemets tapet."</string>
+ <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Tillader, at programmet opsætter størrelsestip for systemets tapet."</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"nulstil system til fabriksstandarder"</string>
- <string name="permdesc_masterClear" msgid="5033465107545174514">"Tillader et program fuldstændig at nulstille systemet til fabriksindstillingerne, slette alle data, konfigurationen og installerede programmer."</string>
- <string name="permlab_setTimeZone" msgid="2945079801013077340">"indstil tidszone"</string>
- <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Tillader et program at ændre telefonens tidszone."</string>
+ <string name="permdesc_masterClear" msgid="5033465107545174514">"Tillader, at et program nulstiller systemet fuldstændig til fabriksindstillingerne, sletter alle data, konfigurationer og installerede programmer."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"angiv tidszone"</string>
+ <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Tillader, at et program ændrer telefonens tidszone."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"fungerer som kontoadministrationstjeneste"</string>
- <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Tillader et program at foretage opkald til kontogodkendere"</string>
- <string name="permlab_getAccounts" msgid="4549918644233460103">"opdag kendte konti"</string>
- <string name="permdesc_getAccounts" msgid="6839262446413155394">"Tillader et program at hente listen over konti, der er kendt af telefonen."</string>
+ <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Tillader, at et program foretager opkald til kontogodkendere"</string>
+ <string name="permlab_getAccounts" msgid="4549918644233460103">"registrer kendte konti"</string>
+ <string name="permdesc_getAccounts" msgid="6839262446413155394">"Tillader, at et program henter listen over konti, der er kendt af telefonen."</string>
<string name="permlab_authenticateAccounts" msgid="3940505577982882450">"fungerer som en kontogodkender"</string>
- <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Tillader et program at bruge kontoadministratorens kontogodkendelsesegenskaber, bl.a. oprettelse af konti samt hentning og indstilling af deres adgangskoder."</string>
- <string name="permlab_manageAccounts" msgid="4440380488312204365">"administrer kontilisten"</string>
- <string name="permdesc_manageAccounts" msgid="8804114016661104517">"Tillader et program at foretage handlinger, som f.eks. at tilføje og fjerne konti samt slette deres adgangskode."</string>
+ <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Tillader, at et program bruger kontoadministratorens kontogodkendelsesegenskaber, bl.a. oprettelse af konti samt hentning og indstilling af deres adgangskoder."</string>
+ <string name="permlab_manageAccounts" msgid="4440380488312204365">"administrer kontolisten"</string>
+ <string name="permdesc_manageAccounts" msgid="8804114016661104517">"Tillader, at et program foretager handlinger, f.eks. at tilføje og fjerne konti samt slette sin adgangskode."</string>
<string name="permlab_useCredentials" msgid="6401886092818819856">"brug en kontos godkendelsesoplysninger"</string>
- <string name="permdesc_useCredentials" msgid="7416570544619546974">"Tillader et program at anmode om godkendelsestokens"</string>
+ <string name="permdesc_useCredentials" msgid="7416570544619546974">"Tillader, at et program anmoder om godkendelsestokens"</string>
<string name="permlab_accessNetworkState" msgid="6865575199464405769">"vis netværkstilstand"</string>
- <string name="permdesc_accessNetworkState" msgid="558721128707712766">"Tillader et program at vise tilstanden for alle netværk."</string>
+ <string name="permdesc_accessNetworkState" msgid="558721128707712766">"Tillader, at et program viser tilstanden for alle netværk."</string>
<string name="permlab_createNetworkSockets" msgid="9121633680349549585">"Fuld internetadgang"</string>
- <string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Tillader et program at oprette netværks-sockets."</string>
+ <string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Tillader, at et program opretter netværks-sockets."</string>
<string name="permlab_writeApnSettings" msgid="7823599210086622545">"skriv indstillinger for adgangspunktnavn"</string>
- <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Tillader et program at ændre APN-indstillingerne, som f.eks. enhver APNs Proxy og Port."</string>
+ <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Tillader, at et program ændrer APN-indstillingerne, f.eks. enhver APNs Proxy og Port."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"skift netværksforbindelse"</string>
- <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Tillader et program at ændre netværksforbindelsens tilstand."</string>
+ <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Tillader, at et program ændrer netværksforbindelsens tilstand."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"skift brugerindstilling for baggrundsdata"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Tillader et program at ændre brugerindstillingerne for baggrundsdata."</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Tillader, at et program ændrer brugerindstillingerne for baggrundsdata."</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"vis Wi-Fi-tilstand"</string>
- <string name="permdesc_accessWifiState" msgid="485796529139236346">"Tillader et program at vise oplysninger om Wi-Fi-tilstanden."</string>
+ <string name="permdesc_accessWifiState" msgid="485796529139236346">"Tillader, at et program viser oplysninger om Wi-Fi-tilstanden."</string>
<string name="permlab_changeWifiState" msgid="7280632711057112137">"skift Wi-Fi-tilstand"</string>
- <string name="permdesc_changeWifiState" msgid="2950383153656873267">"Tillader et program at oprette og afbryde forbindelse fra Wi-Fi-adgangspunkter og foretage ændringer til konfigurerede Wi-Fi-netværk."</string>
+ <string name="permdesc_changeWifiState" msgid="2950383153656873267">"Tillader, at et program opretter og afbryder forbindelsen fra Wi-Fi-adgangspunkter og foretager ændringer i konfigurerede Wi-Fi-netværk."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"tillad Wi-Fi-multicastmodtagelse"</string>
- <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Tillader et program at modtage pakker, der ikke er direkte adresseret til din enhed. Dette kan være nyttigt, hvis du finder tjenester, der er tilbudt i nærheden. Det bruger mere strøm end multicasttilstanden."</string>
+ <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Tillader, at et program modtager pakker, der ikke er direkte adresseret til din enhed. Dette kan være nyttigt, hvis du finder tjenester, der tilbydes i nærheden. Det bruger mere strøm end multicasttilstanden."</string>
<string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"bluetooth-administration"</string>
- <string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"Tillader et program at konfigurere den lokale Bluetooth-telefon samt at opdage og parre med fjerne enheder."</string>
+ <string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"Tillader, at et program konfigurerer den lokale Bluetooth-telefon samt opdager og parrer med fjerne enheder."</string>
<string name="permlab_bluetooth" msgid="8361038707857018732">"opret Bluetooth-forbindelser"</string>
- <string name="permdesc_bluetooth" msgid="762515380679392945">"Tillader et program at vise konfigurationen af den lokale Bluetooth-telefon samt at oprette og acceptere forbindelse med parrede enheder."</string>
+ <string name="permdesc_bluetooth" msgid="762515380679392945">"Tillader, at et program viser konfigurationen af den lokale Bluetooth-telefon samt opretter og accepterer forbindelse med parrede enheder."</string>
<string name="permlab_disableKeyguard" msgid="4977406164311535092">"deaktiver tastaturlås"</string>
- <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Tillader et program at deaktivere tastaturlåsen og al associeret adgangskodesikkerhed. Et legitimt eksempel på dette er, at telefonen deaktiverer tastaturlåsen, når der modtages et indgående telefonopkald, og genaktiverer tastaturlåsen, når opkaldet er afsluttet."</string>
- <string name="permlab_readSyncSettings" msgid="6201810008230503052">"læs synkroniseringsindstillinger"</string>
- <string name="permdesc_readSyncSettings" msgid="5315925706353341823">"Tillader et program at læse synkroniseringsindstillingerne, som f.eks. om synkronisering er aktiveret for kontakter."</string>
- <string name="permlab_writeSyncSettings" msgid="6297138566442486462">"skriv synkroniseringsindstillinger"</string>
- <string name="permdesc_writeSyncSettings" msgid="2498201614431360044">"Tillader et program at ændre synkroniseringsindstillingerne, som f.eks. om synkronisering er aktiveret for kontakter."</string>
+ <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Tillader, at et program deaktiverer tastaturlåsen og al associeret adgangskodesikkerhed. Et legitimt eksempel på dette er, at telefonen deaktiverer tastaturlåsen, når der modtages et indgående telefonopkald, og genaktiverer tastaturlåsen, når opkaldet er afsluttet."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"læs indstillinger for synkronisering"</string>
+ <string name="permdesc_readSyncSettings" msgid="5315925706353341823">"Tillader, at et program læser synkroniseringsindstillingerne, f.eks. om kontakter skal synkroniseres."</string>
+ <string name="permlab_writeSyncSettings" msgid="6297138566442486462">"skriv indstillinger for synkronisering"</string>
+ <string name="permdesc_writeSyncSettings" msgid="2498201614431360044">"Tillader, at et program ændrer indstillingerne for synkronisering, f.eks. kontakter skal synkroniseres."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"læs synkroniseringsstatistikker"</string>
- <string name="permdesc_readSyncStats" msgid="7511448343374465000">"Tillader et program at læse synkroniseringsstatistikkerne, som f.eks. oversigt over forekomne synkroniseringer."</string>
+ <string name="permdesc_readSyncStats" msgid="7511448343374465000">"Tillader, at et program læser synkroniseringsstatistikker, f.eks. oversigten over forrige synkroniseringer."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"læs abonnerede feeds"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="3622200625634207660">"Lader et program få detaljer om de aktuelt synkroniserede feeds."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="3622200625634207660">"Tillader, at et program får detaljer om de aktuelt synkroniserede feeds."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"skriv abonnerede feeds"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Tillader et program at ændre dine aktuelle synkroniserede feeds. Dette kan muligvis lade et ondsindet program ændre dine synkroniserede feeds."</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Tillader, at et program ændrer dine aktuelle synkroniserede feeds. Dette kan muligvis lade et ondsindet program ændre dine synkroniserede feeds."</string>
<string name="permlab_readDictionary" msgid="432535716804748781">"læs brugerdefineret ordbog"</string>
- <string name="permdesc_readDictionary" msgid="1082972603576360690">"Tillader et program at læse alle private ord, navne og sætninger, som brugeren eventuelt har gemt i brugerordbogen."</string>
- <string name="permlab_writeDictionary" msgid="6703109511836343341">"skriv til den brugerdefinerede mappe"</string>
- <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Tillader et program at skrive nye ord i brugermappen."</string>
- <string name="permlab_sdcardWrite" msgid="8079403759001777291">"ret/slet indholdet af SD-kort"</string>
- <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Tillader et program at skrive til SD-kortet."</string>
+ <string name="permdesc_readDictionary" msgid="1082972603576360690">"Tillader, at et program læser alle private ord, navne og sætninger, som brugeren eventuelt har gemt i brugerordbogen."</string>
+ <string name="permlab_writeDictionary" msgid="6703109511836343341">"skriv til den brugerdefinerede ordbog"</string>
+ <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Tillader, at et program skriver nye ord i brugerordbogen."</string>
+ <string name="permlab_sdcardWrite" msgid="8079403759001777291">"ret/slet indholdet på SD-kortet"</string>
+ <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Tillader, at et program skriver til SD-kortet."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
- <item msgid="8901098336658710359">"Start"</item>
+ <item msgid="8901098336658710359">"Hjem"</item>
<item msgid="869923650527136615">"Mobil"</item>
<item msgid="7897544654242874543">"Arbejde"</item>
<item msgid="1103601433382158155">"Arbejdsfax"</item>
@@ -400,19 +410,19 @@
<item msgid="9192514806975898961">"Tilpasset"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"Start"</item>
+ <item msgid="8073994352956129127">"Hjem"</item>
<item msgid="7084237356602625604">"Arbejde"</item>
<item msgid="1112044410659011023">"Andre"</item>
<item msgid="2374913952870110618">"Tilpasset"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"Start"</item>
+ <item msgid="6880257626740047286">"Hjem"</item>
<item msgid="5629153956045109251">"Arbejde"</item>
<item msgid="4966604264500343469">"Andre"</item>
<item msgid="4932682847595299369">"Tilpasset"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"Start"</item>
+ <item msgid="1738585194601476694">"Hjem"</item>
<item msgid="1359644565647383708">"Arbejde"</item>
<item msgid="7868549401053615677">"Anden"</item>
<item msgid="3145118944639869809">"Tilpasset"</item>
@@ -433,7 +443,7 @@
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Tilpasset"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"Start"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Hjem"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Arbejde"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Arbejdsfax"</string>
@@ -445,28 +455,28 @@
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Virksomhed (hovednummer)"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Hoved"</string>
- <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Andre faxmeddelelser"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Andre faxbeskeder"</string>
<string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Telex"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Arbejdsmobiltelefon"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøger"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
- <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"mms"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Fødselsdato"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Årsdag"</string>
<string name="eventTypeOther" msgid="5834288791948564594">"Begivenhed"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Tilpasset"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Start"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Hjem"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Arbejde"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Andre"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Tilpasset"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"Start"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Hjem"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Arbejde"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Andre"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Tilpasset"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"Start"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Hjem"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Arbejde"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Andre"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Tilpasset"</string>
@@ -492,7 +502,7 @@
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skærmen er låst."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryk på Menu for at låse op eller foretage et nødopkald."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryk på Menu for at låse op."</string>
- <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn mønster til at låse op"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn oplåsningsmønster"</string>
<string name="lockscreen_emergency_call" msgid="5347633784401285225">"Nødopkald"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Rigtigt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Beklager! Prøv igen"</string>
@@ -504,32 +514,35 @@
<string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"Der er ikke noget SIM-kort i telefonen."</string>
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Indsæt et SIM-kort."</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Netværket er låst"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-kort er låst med PUK-koden."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-kortet er låst med PUK-koden."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Se brugervejledningen, eller kontakt kundeservice."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM-kortet er låst."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Låser SIM-kortet op ..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Du har tegnet dit mønster til at låse op forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" msgid="3351013842320127827">"Du har tegnet dit mønster til at låse op forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> forsøg mere vil du blive bedt om at låse din telefon op ved hjælp af dit Google-login"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" msgid="3351013842320127827">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> forsøg mere vil du blive bedt om at låse din telefon op ved hjælp af dit Google-login"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
- <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Har du glemt mønster?"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Har du glemt mønstret?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Oplåsning af konto"</string>
- <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"For mange mønsterforsøg!"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"For mange forsøg på at tegne mønstret korrekt!"</string>
<string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"For at låse op skal du logge ind med din Google-konto"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Brugernavn (e-mail)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Adgangskode"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Log ind"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ugyldigt brugernavn eller ugyldig adgangskode."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerer ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås op"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd slået til"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Lyd slået fra"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen meddelelser"</string>
- <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Løbende"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelelser"</string>
<string name="battery_status_text_percent_format" msgid="7660311274698797147">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="battery_status_charging" msgid="756617993998772213">"Oplader ..."</string>
<string name="battery_low_title" msgid="7923774589611311406">"Forbind oplader"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet er ved at blive tomt:"</string>
+ <string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet er ved at være fladt:"</string>
<string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre tilbage."</string>
<string name="battery_low_why" msgid="7279169609518386372">"Batteriforbrug"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"Fabrikstest mislykkedes"</string>
@@ -542,9 +555,9 @@
<string name="save_password_label" msgid="6860261758665825069">"Bekræft"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dobbeltklik for at zoome ind eller ud."</string>
<string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"læs browserens oversigt og bogmærker"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillader programmet at læse alle de webadresser, browseren har besøgt, og alle browserens bogmærker."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillader, at programmet læser alle de webadresser, browseren har besøgt, og alle browserens bogmærker."</string>
<string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skriv browserens oversigt og bogmærker"</string>
- <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Tillader et program at ændre browseroversigten eller bogmærker, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre din browsers data."</string>
+ <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Tillader, at et program ændrer browseroversigten eller bogmærker, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre din browsers data."</string>
<string name="save_password_message" msgid="767344687139195790">"Ønsker du, at browseren skal huske denne adgangskode?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Ikke nu"</string>
<string name="save_password_remember" msgid="6491879678996749466">"Husk"</string>
@@ -638,12 +651,12 @@
<string name="weeks" msgid="6509623834583944518">"uger"</string>
<string name="year" msgid="4001118221013892076">"år"</string>
<string name="years" msgid="6881577717993213522">"år"</string>
- <string name="every_weekday" msgid="8777593878457748503">"Hver ugedag (man.-fre.)"</string>
+ <string name="every_weekday" msgid="8777593878457748503">"Hverdage (man.-fre.)"</string>
<string name="daily" msgid="5738949095624133403">"Dagligt"</string>
<string name="weekly" msgid="983428358394268344">"Ugentlig hver <xliff:g id="DAY">%s</xliff:g>"</string>
<string name="monthly" msgid="2667202947170988834">"Månedligt"</string>
<string name="yearly" msgid="1519577999407493836">"Årligt"</string>
- <string name="VideoView_error_title" msgid="3359437293118172396">"Video kan ikke afspilles"</string>
+ <string name="VideoView_error_title" msgid="3359437293118172396">"Videoen kan ikke afspilles"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="897920883624437033">"Beklager! Denne video er ikke gyldig til streaming på denne enhed."</string>
<string name="VideoView_error_text_unknown" msgid="710301040038083944">"Beklager! Denne video kan ikke afspilles."</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"OK"</string>
@@ -655,8 +668,8 @@
<string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll" msgid="6876518925844129331">"Vælg alle"</string>
- <string name="selectText" msgid="3889149123626888637">"Vælg tekst"</string>
- <string name="stopSelectingText" msgid="4157931463872320996">"Stands med at vælge tekst"</string>
+ <string name="selectText" msgid="3889149123626888637">"Marker tekst"</string>
+ <string name="stopSelectingText" msgid="4157931463872320996">"Hold op med at markere tekst"</string>
<string name="cut" msgid="3092569408438626261">"Klip"</string>
<string name="cutAll" msgid="2436383270024931639">"Klip alle"</string>
<string name="copy" msgid="2681946229533511987">"Kopier"</string>
@@ -675,7 +688,7 @@
<string name="dialog_alert_title" msgid="2049658708609043103">"Bemærk"</string>
<string name="capital_on" msgid="1544682755514494298">"TIL"</string>
<string name="capital_off" msgid="6815870386972805832">"FRA"</string>
- <string name="whichApplication" msgid="4533185947064773386">"Afslut handling ved hjælp af"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"Fuldfør handling ved hjælp af"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Brug som standard til denne handling."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Ryd standard i Startindstillinger > Programmer > Administrer programmer."</string>
<string name="chooseActivity" msgid="1009246475582238425">"Vælg en handling"</string>
@@ -691,16 +704,15 @@
<string name="force_close" msgid="3653416315450806396">"Tving til at lukke"</string>
<string name="report" msgid="4060218260984795706">"Rapporter"</string>
<string name="wait" msgid="7147118217226317732">"Vent"</string>
- <string name="debug" msgid="9103374629678531849">"Fejlretning"</string>
<string name="sendText" msgid="5132506121645618310">"Vælg en handling for teksten"</string>
- <string name="volume_ringtone" msgid="6885421406845734650">"Opkaldslydstyrke"</string>
- <string name="volume_music" msgid="5421651157138628171">"Medielydstyrke"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Spiller gennem Bluetooth"</string>
- <string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"Lydløs ringetone valgt"</string>
- <string name="volume_call" msgid="3941680041282788711">"Opkaldslydstyrke"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth-lydstyrke under opkald"</string>
- <string name="volume_alarm" msgid="1985191616042689100">"Alarmlydstyrke"</string>
- <string name="volume_notification" msgid="2422265656744276715">"Meddelelseslydstyrke"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"Lydstyrke for opkald"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Lydstyrke for medier"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Afspilning via Bluetooth"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"Lydløs ringetone er valgt"</string>
+ <string name="volume_call" msgid="3941680041282788711">"Lydstyrke for opkald"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Lydstyrke for Bluetooth under opkald"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Lydstyrke for alarm"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Lydstyrke for meddelelser"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Lydstyrke"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Standardringetone"</string>
<string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standardringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -717,46 +729,46 @@
</plurals>
<string name="select_character" msgid="3365550120617701745">"Indsæt tegn"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Ukendt program"</string>
- <string name="sms_control_title" msgid="7296612781128917719">"Sender SMS-beskeder"</string>
- <string name="sms_control_message" msgid="1289331457999236205">"Der sendes et stort antal SMS-beskeder. Vælg \"OK\" for at fortsætte eller \"Annuller\" for at stoppe med at sende."</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"Sender sms-beskeder"</string>
+ <string name="sms_control_message" msgid="1289331457999236205">"Der sendes et stort antal sms-beskeder. Vælg \"OK\" for at fortsætte eller \"Annuller\" for at stoppe afsendelsen."</string>
<string name="sms_control_yes" msgid="2532062172402615953">"OK"</string>
<string name="sms_control_no" msgid="1715320703137199869">"Annuller"</string>
- <string name="date_time_set" msgid="5777075614321087758">"Indstil"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"Angiv"</string>
<string name="default_permission_group" msgid="2690160991405646128">"Standard"</string>
<string name="no_permissions" msgid="7283357728219338112">"Der kræves ingen tilladelser"</string>
<string name="perms_hide" msgid="7283915391320676226"><b>"Skjul"</b></string>
<string name="perms_show_all" msgid="2671791163933091180"><b>"Vis alle"</b></string>
<string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Indlæser ..."</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"USB forbundet"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB er tilsluttet"</string>
<string name="usb_storage_message" msgid="2759542180575016871">"Du har forbundet din telefon til din computer via USB. Vælg \"Monter\", hvis du ønsker at kopiere filer mellem din computer og din telefons SD-kort."</string>
<string name="usb_storage_button_mount" msgid="8063426289195405456">"Monter"</string>
<string name="usb_storage_button_unmount" msgid="6092146330053864766">"Indsæt ikke"</string>
<string name="usb_storage_error_message" msgid="2534784751603345363">"Der opstod et problem med at bruge dit SD-kort til USB-lagring."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB forbundet"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB er tilsluttet"</string>
<string name="usb_storage_notification_message" msgid="7380082404288219341">"Vælg for at kopiere filer til/fra din computer."</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Slå USB-lagringen fra"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Vælg for at slå USB-lagring fra."</string>
<string name="usb_storage_stop_title" msgid="6014127947456185321">"Slå USB-lagring fra"</string>
- <string name="usb_storage_stop_message" msgid="2390958966725232848">"Inden du slår USB-lagringen fra, skal du sørge for, at du demonterer USB-værten. Vælg \"Slå fra\" for at slå USB-lagringen fra."</string>
+ <string name="usb_storage_stop_message" msgid="2390958966725232848">"Inden du slår USB-lagringen fra, skal du sørge for, at USB-værten er demonteret. Vælg \"Slå fra\" for at slå USB-lagringen fra."</string>
<string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Slå fra"</string>
<string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Annuller"</string>
<string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Der opstod et problem med at slå USB-lagringen fra. Sørg for, at du har demonteret USB-værten, og prøv så igen."</string>
<string name="extmedia_format_title" msgid="8663247929551095854">"Formater SD-kort"</string>
<string name="extmedia_format_message" msgid="3621369962433523619">"Er du sikker på, du ønsker at formatere SD-kortet? Alle data på kortet mistes."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formater"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning forbundet"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Vælg for at deaktivere USB-fejlretning."</string>
<string name="select_input_method" msgid="6865512749462072765">"Vælg indtastningsmetode"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string>
- <string name="ext_media_checking_notification_title" msgid="5457603418970994050">"Forbereder SD-kort"</string>
+ <string name="ext_media_checking_notification_title" msgid="5457603418970994050">"Forbereder SD-kortet"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Kontrollerer for fejl."</string>
- <string name="ext_media_nofs_notification_title" msgid="780477838241212997">"Blankt SD-kort"</string>
+ <string name="ext_media_nofs_notification_title" msgid="780477838241212997">"Tomt SD-kort"</string>
<string name="ext_media_nofs_notification_message" msgid="3817704088027829380">"SD-kortet er tomt eller har et ikke understøttet filsystem."</string>
<string name="ext_media_unmountable_notification_title" msgid="6410723906019100189">"Beskadiget SD-kort"</string>
- <string name="ext_media_unmountable_notification_message" msgid="6902531775948238989">"SD-kort beskadiget. Du bliver muligvis nødt til at omformatere det."</string>
- <string name="ext_media_badremoval_notification_title" msgid="6872152882604407837">"SD-kort blev uventet fjernet"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="6902531775948238989">"SD-kortet er beskadiget. Du bliver muligvis nødt til at formatere det igen."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="6872152882604407837">"SD-kortet blev fjernet uventet"</string>
<string name="ext_media_badremoval_notification_message" msgid="7260183293747448241">"Demonter SD-kortet inden fjernelse for at undgå tab af data."</string>
<string name="ext_media_safe_unmount_notification_title" msgid="6729801130790616200">"SD-kortet kan fjernes sikkert"</string>
<string name="ext_media_safe_unmount_notification_message" msgid="568841278138377604">"Du kan nu fjerne SD-kortet."</string>
@@ -766,12 +778,12 @@
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"opdater brugerstatistikker for komponenter"</string>
<string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Tillader ændring af indsamlede brugerstatistikker for komponenter. Ikke til brug til normale programmer."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tryk to gange for zoomkontrol"</string>
- <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Der opstod en fejl under forøgelsen af widgeten"</string>
+ <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Der opstod en fejl under forøgelsen af widgetten"</string>
<string name="ime_action_go" msgid="8320845651737369027">"Gå"</string>
<string name="ime_action_search" msgid="658110271822807811">"Søg"</string>
<string name="ime_action_send" msgid="2316166556349314424">"Send"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Næste"</string>
- <string name="ime_action_done" msgid="8971516117910934605">"Færdig"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"Udfør"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Udfør"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Ring til nummer"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Opret kontakt"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certifikatbaseret L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 167faa0..9ad1614 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -177,7 +177,7 @@
<string name="permdesc_writeSms" msgid="6299398896177548095">"Ermöglicht einer Anwendung, auf Ihrem Telefon oder Ihrer SIM-Karte gespeicherte Kurznachrichten zu bearbeiten. Schädliche Anwendungen löschen möglicherweise Ihre Nachrichten."</string>
<string name="permlab_receiveWapPush" msgid="8258226427716551388">"WAP-Nachrichten empfangen"</string>
<string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Ermöglicht der Anwendung, WAP-Mitteilungen zu empfangen und zu verarbeiten. Schädliche Anwendungen können Ihre Nachrichten möglicherweise überwachen oder löschen, bevor sie angezeigt werden."</string>
- <string name="permlab_getTasks" msgid="5005277531132573353">"Laufende Anwendungen abrufen"</string>
+ <string name="permlab_getTasks" msgid="5005277531132573353">"laufende Anwendungen abrufen"</string>
<string name="permdesc_getTasks" msgid="7048711358713443341">"Ermöglicht der Anwendung, Informationen zu aktuellen und kürzlich ausführten Aufgaben abzurufen. Schädliche Anwendungen können so eventuell geheime Informationen zu anderen Anwendungen entdecken."</string>
<string name="permlab_reorderTasks" msgid="5669588525059921549">"Laufende Anwendungen neu ordnen"</string>
<string name="permdesc_reorderTasks" msgid="126252774270522835">"Ermöglicht einer Anwendung, Aufgaben in den Vorder- und Hintergrund zu verschieben. Schädliche Anwendungen können so ohne Ihr Zutun eine Anzeige im Vordergrund erzwingen."</string>
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Ermöglicht einer Anwendung, die Fehlerbeseitigung für eine andere Anwendung zu aktivieren. Schädliche Anwendungen können so andere Anwendungen löschen."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI-Einstellungen ändern"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Ermöglicht einer Anwendung, die aktuelle Konfiguration zu ändern, etwa das Gebietsschema oder die Schriftgröße."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"Andere Anwendungen neu starten"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Ermöglicht einer Anwendung, den Neustart anderer Anwendungen zu erzwingen."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"Schließen von Anwendung erzwingen"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Ermöglicht einer Anwendung, alle Aktivitäten, die im Vordergrund ablaufen, zu beenden und in den Hintergrund zu schieben. Sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_dump" msgid="1681799862438954752">"Systeminternen Status abrufen"</string>
@@ -253,9 +259,9 @@
<string name="permdesc_diagnostic" msgid="3121238373951637049">"Ermöglicht einer Anwendung, alle Elemente in der Diagnosegruppe zu lesen und zu bearbeiten, etwa Dateien in \"/dev\". Dies könnte eine potenzielle Gefährdung für die Stabilität und Sicherheit des Systems darstellen und sollte NUR für Hardware-spezifische Diagnosen des Herstellers oder Netzbetreibers verwendet werden."</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"Anwendungskomponenten aktivieren oder deaktivieren"</string>
<string name="permdesc_changeComponentState" msgid="4569107043246700630">"Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Telefons deaktivieren. Bei der Erteilung von Berechtigungen ist daher Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und unstabil werden können."</string>
- <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"Bevorzugte Einstellungen festlegen"</string>
+ <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"bevorzugte Einstellungen festlegen"</string>
<string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Ermöglicht einer Anwendung, Ihre bevorzugten Einstellungen zu ändern. Schädliche Anwendungen können so laufende Anwendungen ohne Ihr Wissen ändern, damit die vorhandenen Anwendungen private Daten von Ihnen sammeln."</string>
- <string name="permlab_writeSettings" msgid="1365523497395143704">"Allgemeine Systemeinstellungen ändern"</string>
+ <string name="permlab_writeSettings" msgid="1365523497395143704">"allgemeine Systemeinstellungen ändern"</string>
<string name="permdesc_writeSettings" msgid="838789419871034696">"Ermöglicht einer Anwendung, die Einstellungsdaten des Systems zu ändern. Schädliche Anwendungen können so die Systemkonfiguration beschädigen."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"Sicherheitseinstellungen für das System ändern"</string>
<string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Der Anwendung wird das Ändern der Sicherheitseinstellungsdaten des Systems ermöglicht. Nicht für normale Anwendungen vorgesehen."</string>
@@ -353,7 +359,7 @@
<string name="permdesc_useCredentials" msgid="7416570544619546974">"Ermöglicht einer Anwendung, Authentifizierungs-Token anzufordern."</string>
<string name="permlab_accessNetworkState" msgid="6865575199464405769">"Netzwerkstatus anzeigen"</string>
<string name="permdesc_accessNetworkState" msgid="558721128707712766">"Ermöglicht einer Anwendung, den Status aller Netzwerke anzuzeigen."</string>
- <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"Uneingeschränkter Internetzugriff"</string>
+ <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"uneingeschränkter Internetzugriff"</string>
<string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Ermöglicht einer Anwendung, Netzwerk-Sockets einzurichten."</string>
<string name="permlab_writeApnSettings" msgid="7823599210086622545">"Einstellungen für Zugriffspunktname schreiben"</string>
<string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Ermöglicht einer Anwendung, die APN-Einstellungen wie Proxy und Port eines Zugriffspunkts zu ändern."</string>
@@ -379,16 +385,20 @@
<string name="permdesc_writeSyncSettings" msgid="2498201614431360044">"Ermöglicht einer Anwendung, die Synchronisierungseinstellungen zu ändern, etwa ob die Synchronisierung für Kontakte aktiviert ist oder nicht."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"Synchronisierungsstatistiken lesen"</string>
<string name="permdesc_readSyncStats" msgid="7511448343374465000">"Ermöglicht einer Anwendung, die Synchronisierungsstatistiken zu lesen, etwa den Verlauf der bereits durchgeführten Synchronisierungen."</string>
- <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"Abonnierte Feeds lesen"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abonnierte Feeds lesen"</string>
<string name="permdesc_subscribedFeedsRead" msgid="3622200625634207660">"Ermöglicht einer Anwendung, Details zu den zurzeit synchronisierten Feeds abzurufen."</string>
- <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"Abonnierte Feeds schreiben"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abonnierte Feeds schreiben"</string>
<string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Ermöglicht einer Anwendung, Änderungen an den kürzlich synchronisierten Feeds vorzunehmen. Schädliche Anwendungen könnten so Ihre synchronisierten Feeds ändern."</string>
- <string name="permlab_readDictionary" msgid="432535716804748781">"Nutzerdefiniertes Wörterbuch lesen"</string>
+ <string name="permlab_readDictionary" msgid="432535716804748781">"nutzerdefiniertes Wörterbuch lesen"</string>
<string name="permdesc_readDictionary" msgid="1082972603576360690">"Erlaubt einer Anwendung, alle privaten Wörter, Namen und Ausdrücke zu lesen, die ein Nutzer in seinem Wörterbuch gespeichert hat."</string>
<string name="permlab_writeDictionary" msgid="6703109511836343341">"in nutzerdefiniertes Wörterbuch schreiben"</string>
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Erlaubt einer Anwendung, neue Wörter in das Wörterbuch des Nutzers zu schreiben."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD-Karten-Inhalt ändern/löschen"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Ermöglicht einer Anwendung, auf die SD-Karte zu schreiben"</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Anmelden"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ungültiger Nutzername oder ungültiges Passwort."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Überprüfung..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Entsperren"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ton ein"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Ton aus"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Schließen erzwingen"</string>
<string name="report" msgid="4060218260984795706">"Bericht"</string>
<string name="wait" msgid="7147118217226317732">"Warten"</string>
- <string name="debug" msgid="9103374629678531849">"Fehler suchen"</string>
<string name="sendText" msgid="5132506121645618310">"Aktion für Text auswählen"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Klingeltonlautstärke"</string>
<string name="volume_music" msgid="5421651157138628171">"Medienlautstärke"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Zertifikat mit vorinstalliertem Schlüssel"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 5b02a65..33a3a41 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Επιτρέπει σε μια εφαρμογή να ενεργοποιήσει τον εντοπισμό σφαλμάτων για μια άλλη εφαρμογή. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να τερματίσουν άλλες εφαρμογές."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"αλλαγή των ρυθμίσεων του UI"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Επιτρέπει σε μια εφαρμογή την αλλαγή της τρέχουσας διαμόρφωσης, όπως οι τοπικές ρυθμίσεις ή το μέγεθος γραμματοσειράς γενικά."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"επανεκκίνηση άλλων εφαρμογών"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Επιτρέπει σε μια εφαρμογή να πραγματοποιήσει αναγκαστική επανεκκίνηση άλλων εφαρμογών."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"αναγκαστικός τερματισμός εφαρμογής"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Επιτρέπει σε μια εφαρμογή να εξαναγκάσει οποιαδήποτε δραστηριότητα που βρίσκεται στο προσκήνιο να κλείσει και να μεταβεί στο φόντο. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
<string name="permlab_dump" msgid="1681799862438954752">"ανάκτηση εσωτερικής κατάστασης συστήματος"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Επιτρέπει σε μια εφαρμογή την εγγραφή νέων λέξεων στο λεξικό χρήστη."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"τροποποίηση/διαγραφή περιεχομένων κάρτας SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Οικία"</item>
<item msgid="869923650527136615">"Κινητό"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Σύνδεση"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Έλεγχος..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ξεκλείδωμα"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ενεργοποίηση ήχου"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Απενεργοποίηση ήχου"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Αναγκαστικό κλείσιμο"</string>
<string name="report" msgid="4060218260984795706">"Αναφορά"</string>
<string name="wait" msgid="7147118217226317732">"Αναμονή"</string>
- <string name="debug" msgid="9103374629678531849">"Εντοπισμός σφαλμάτων"</string>
<string name="sendText" msgid="5132506121645618310">"Επιλέξτε μια ενέργεια για το κείμενο"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ένταση ειδοποίησης ήχου"</string>
<string name="volume_music" msgid="5421651157138628171">"Ένταση ήχου πολυμέσων"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Πιστοποιητικό βάσει L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e0408b3..806d64e 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Admite una aplicación que activa la depuración en otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para suprimir otras aplicaciones."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"cambiar tu configuración de la interfaz de usuario"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Admite una aplicación para cambiar la configuración actual, como el tamaño de fuente local o general."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"reiniciar otras aplicaciones"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Admite una aplicación que reinicia otras aplicaciones por la fuerza."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"provocar que la aplicación se acerque"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Admite una aplicación que provoca que cualquier actividad del fondo se acerque y vuelva a alejarse. Se debe evitar utilizarlo en aplicaciones normales."</string>
<string name="permlab_dump" msgid="1681799862438954752">"recuperar el estado interno del sistema"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Admite una aplicación que escribe palabras nuevas en el diccionario del usuario."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/suprimir el contenido de la tarjeta SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Admite que una aplicación escriba en la tarjeta SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Página principal"</item>
<item msgid="869923650527136615">"Celular"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Inicia sesión"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nombre de usuario o contraseña incorrecta."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Comprobando..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sonido encendido"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sonido apagado"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Provocar acercamiento"</string>
<string name="report" msgid="4060218260984795706">"Notificar"</string>
<string name="wait" msgid="7147118217226317732">"Espera"</string>
- <string name="debug" msgid="9103374629678531849">"Depurar"</string>
<string name="sendText" msgid="5132506121645618310">"Selecciona una acción para el texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumen del timbre"</string>
<string name="volume_music" msgid="5421651157138628171">"Volumen de los medios"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificado según L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index fa6160a..4626326 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -101,7 +101,7 @@
<string name="httpErrorUnsupportedAuthScheme" msgid="2781440683514730227">"No se admite el esquema de autenticación del sitio."</string>
<string name="httpErrorAuth" msgid="7293960746955020542">"La autenticación no se ha realizado correctamente."</string>
<string name="httpErrorProxyAuth" msgid="1788207010559081331">"La autenticación mediante el servidor proxy no se ha realizado correctamente."</string>
- <string name="httpErrorConnect" msgid="7623096283505770433">"La conexión al servidor no se ha realizado correctamente."</string>
+ <string name="httpErrorConnect" msgid="7623096283505770433">"La conexión con el servidor no se ha realizado correctamente."</string>
<string name="httpErrorIO" msgid="5047872902739125260">"El servidor no ha podido establecer la comunicación. Vuelve a intentarlo más tarde."</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"Se ha agotado el tiempo de espera de conexión al servidor."</string>
<string name="httpErrorRedirectLoop" msgid="8679596090392779516">"La página contiene demasiados redireccionamientos de servidor."</string>
@@ -156,7 +156,7 @@
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"Herramientas del sistema"</string>
<string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Acceso de nivel inferior y control del sistema"</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Herramientas de desarrollo"</string>
- <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funciones necesarias sólo para desarrolladores de aplicaciones"</string>
+ <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funciones necesarias solo para desarrolladores de aplicaciones"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamiento"</string>
<string name="permgroupdesc_storage" msgid="9203302214915355774">"Acceder a la tarjeta SD"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"inhabilitar o modificar la barra de estado"</string>
@@ -180,13 +180,19 @@
<string name="permlab_getTasks" msgid="5005277531132573353">"recuperar aplicaciones en ejecución"</string>
<string name="permdesc_getTasks" msgid="7048711358713443341">"Permite que la aplicación recupere información sobre tareas que se están ejecutando en este momento o que se han ejecutado recientemente. Puede permitir que las aplicaciones malintencionadas vean información privada sobre otras aplicaciones."</string>
<string name="permlab_reorderTasks" msgid="5669588525059921549">"reorganizar aplicaciones en ejecución"</string>
- <string name="permdesc_reorderTasks" msgid="126252774270522835">"Permite que una aplicación mueva tareas a segundo plano y a primer plano. Las aplicaciones malintencionadas pueden aparecer en primer plano sin su control."</string>
+ <string name="permdesc_reorderTasks" msgid="126252774270522835">"Permite que una aplicación mueva tareas a segundo plano y a primer plano. Las aplicaciones malintencionadas pueden aparecer en primer plano sin tu control."</string>
<string name="permlab_setDebugApp" msgid="4339730312925176742">"habilitar depuración de aplicación"</string>
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite que una aplicación active la depuración de otra aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para desactivar otras aplicaciones."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"cambiar la configuración de la interfaz de usuario"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite que una aplicación cambie la configuración actual como, por ejemplo, la configuración local o el tamaño de fuente general."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"reiniciar otras aplicaciones"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Permite que una aplicación reinicie de forma forzosa otras aplicaciones."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"forzar el cierre de la aplicación"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Permite que una aplicación fuerce a cualquier actividad en segundo plano a cerrarse y volver a la pantalla anterior. No debería ser necesario nunca para las aplicaciones normales."</string>
<string name="permlab_dump" msgid="1681799862438954752">"recuperar estado interno del sistema"</string>
@@ -196,7 +202,7 @@
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar cambios de aplicación"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Evita que el usuario cambie a otra aplicación."</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso sólo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso solo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar emisión eliminada de paquete"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Permite que una aplicación emita una notificación de que se ha eliminado un paquete de aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para interrumpir la ejecución de cualquier otra aplicación."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"enviar una emisión recibida mediante SMS"</string>
@@ -284,7 +290,7 @@
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"permiso para instalar un proveedor de ubicación"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Crear fuentes de origen simuladas para realizar pruebas. Las aplicaciones malintencionadas pueden utilizar este permiso para sobrescribir la ubicación o el estado devueltos por orígenes de ubicación reales, tales como los proveedores de red o GPS, o para controlar y notificar tu ubicación a una fuente externa."</string>
<string name="permlab_accessFineLocation" msgid="8116127007541369477">"precisar la ubicación (GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Permite precisar las fuentes de ubicación como, por ejemplo, el sistema de posicionamiento global, en el teléfono, en los casos en que estén disponibles. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde se encuentra en usuario y pueden consumir batería adicional."</string>
+ <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Permite precisar las fuentes de ubicación como, por ejemplo, el sistema de posicionamiento global, en el teléfono, en los casos en que estén disponibles. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde se encuentra el usuario y pueden consumir batería adicional."</string>
<string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"ubicación común (basada en red)"</string>
<string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"Acceder a fuentes de ubicación comunes como, por ejemplo, la base de datos de red de un teléfono móvil, para determinar una ubicación telefónica aproximada, en los casos en que esté disponible. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde te encuentras aproximadamente."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"acceder a SurfaceFlinger"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite a una aplicación escribir palabras nuevas en el diccionario del usuario."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/eliminar contenido de la tarjeta SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que una aplicación escriba en la tarjeta SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvil"</item>
@@ -406,7 +416,7 @@
<item msgid="2374913952870110618">"Personalizar"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"Casa"</item>
+ <item msgid="6880257626740047286">"Página principal"</item>
<item msgid="5629153956045109251">"Trabajo"</item>
<item msgid="4966604264500343469">"Otra"</item>
<item msgid="4932682847595299369">"Personalizar"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Acceder"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nombre de usuario o contraseña no válido"</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Comprobando..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Activar sonido"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Desactivar sonido"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
@@ -533,7 +546,7 @@
<string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> o menos disponible"</string>
<string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"Fallo en la prueba de fábrica"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"La acción FACTORY_TEST sólo es compatible con los paquetes instalados en /system/app."</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"La acción FACTORY_TEST solo es compatible con los paquetes instalados en /system/app."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"No se ha encontrado ningún paquete que proporcione la acción FACTORY_TEST."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Reiniciar"</string>
<string name="js_dialog_title" msgid="8143918455087008109">"La página \"<xliff:g id="TITLE">%s</xliff:g>\" dice:"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Forzar cierre"</string>
<string name="report" msgid="4060218260984795706">"Informe"</string>
<string name="wait" msgid="7147118217226317732">"Esperar"</string>
- <string name="debug" msgid="9103374629678531849">"Depurar"</string>
<string name="sendText" msgid="5132506121645618310">"Seleccionar la opción para compartir"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumen del timbre"</string>
<string name="volume_music" msgid="5421651157138628171">"Volumen multimedia"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Red privada virtual L2TP/IPSec basada en certificado"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 75f7406..d46820a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permet à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"Modification des paramètres de l\'IU"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permet à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres régionaux)."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"Démarrage d\'autres applications"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Permet à une application de forcer le lancement d\'autres applications."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"Fermeture forcée de l\'application"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Permet à une application de forcer une autre application exécutée au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
<string name="permlab_dump" msgid="1681799862438954752">"Vérification de l\'état interne du système"</string>
@@ -277,16 +283,16 @@
<string name="permdesc_readCalendar" msgid="5533029139652095734">"Permet à une application de lire tous les événements de l\'agenda enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre agenda à d\'autres personnes."</string>
<string name="permlab_writeCalendar" msgid="377926474603567214">"Écriture des données de l\'agenda"</string>
<string name="permdesc_writeCalendar" msgid="8674240662630003173">"Permet à une application de modifier les événements de l\'agenda enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre agenda."</string>
- <string name="permlab_accessMockLocation" msgid="8688334974036823330">"Création de sources de positionnement fictives à des fins de test"</string>
- <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Permet de créer des sources de positionnement fictives à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour remplacer la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"Création de sources de localisation fictives à des fins de test"</string>
+ <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Permet de créer des sources de localisation fictives à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour remplacer la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Accès aux commandes de fournisseur de position géographique supplémentaires"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de localisation géographique."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"autoriser l\'installation d\'un fournisseur de services de localisation"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Créer des sources de données de localisation factices à des fins de test. Les applications malveillantes peuvent exploiter cette fonction pour remplacer la position géographique et/ou l\'état renvoyé par les sources de données de localisation réelles, telles que le GPS ou les fournisseurs réseau, ou pour surveiller et transmettre votre position géographique à une source externe."</string>
<string name="permlab_accessFineLocation" msgid="8116127007541369477">"Localisation OK (GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Permet d\'accéder à des sources de positionnement précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone."</string>
+ <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Permet d\'accéder à des sources de localisation précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone."</string>
<string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"Position géo. approximative (selon le réseau)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"Accès à des sources de positionnement approximatif (par ex. des bases de données de réseaux mobiles) pour déterminer la position géographique du téléphone, lorsque cette option est disponible. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer approximativement l\'endroit où vous vous trouvez."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"Accès à des sources de localisation approximative (par ex. des bases de données de réseaux mobiles) pour déterminer la position géographique du téléphone, lorsque cette option est disponible. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer approximativement l\'endroit où vous vous trouvez."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"Accès à SurfaceFlinger"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Permet à certaines applications d\'utiliser les fonctionnalités SurfaceFlinger de bas niveau."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Lecture de la mémoire tampon graphique"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permet à une application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modifier/supprimer le contenu de la carte SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Autorise une application à écrire sur la carte SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domicile"</item>
<item msgid="869923650527136615">"Portable"</item>
@@ -495,7 +505,7 @@
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dessinez un schéma pour déverrouiller le téléphone"</string>
<string name="lockscreen_emergency_call" msgid="5347633784401285225">"Appel d\'urgence"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Combinaison correcte !"</string>
- <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Désolé. Merci de réessayer."</string>
+ <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Incorrect. Merci de réessayer."</string>
<string name="lockscreen_plugged_in" msgid="613343852842944435">"Chargement (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
<string name="lockscreen_charged" msgid="4938930459620989972">"Chargé"</string>
<string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Se connecter"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nom d\'utilisateur ou mot de passe incorrect."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Vérification..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Débloquer"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Son activé"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Son désactivé"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Forcer la fermeture"</string>
<string name="report" msgid="4060218260984795706">"Rapport"</string>
<string name="wait" msgid="7147118217226317732">"Attendre"</string>
- <string name="debug" msgid="9103374629678531849">"Débogage"</string>
<string name="sendText" msgid="5132506121645618310">"Sélectionner une action pour le texte"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume de la sonnerie"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificat basé sur L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index f89b9ad..ff6107a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -133,8 +133,8 @@
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Audio non attivo"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Audio attivo"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Disattiva modalità aereo"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Disattiva modalità aeereo"</string>
<string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servizi che prevedono un costo"</string>
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Consente a un\'applicazione di attivare il debug per un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per interrompere altre applicazioni."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"modifica impostazioni UI"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Consente a un\'applicazione di modificare la configurazione corrente, come le dimensioni dei caratteri locali o complessive."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"riavvio altre applicazioni"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Consente a un\'applicazione di riavviare forzatamente altre applicazioni."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"chiusura forzata dell\'applicazione"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Consente a un\'applicazione di forzare la chiusura di attività in primo piano. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
<string name="permlab_dump" msgid="1681799862438954752">"recupero stato interno del sistema"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Consente a un\'applicazione di scrivere nuove parole nel dizionario utente."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificare/eliminare i contenuti della scheda SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Consente a un\'applicazione di scrivere sulla scheda SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Cellulare"</item>
@@ -446,10 +456,10 @@
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Principale"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Altro fax"</string>
- <string name="phoneTypeRadio" msgid="4093738079908667513">"Segnale cellulare"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"Segnale radio"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Telex"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
- <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Cellulare ufficio"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Cellulare lavoro"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Cercapersone ufficio"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Accedi"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Password o nome utente non valido."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controllo in corso..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Sblocca"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Audio attivato"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Audio disattivato"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Termina"</string>
<string name="report" msgid="4060218260984795706">"Segnala"</string>
<string name="wait" msgid="7147118217226317732">"Attendi"</string>
- <string name="debug" msgid="9103374629678531849">"Debug"</string>
<string name="sendText" msgid="5132506121645618310">"Selezione un\'opzione di invio"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume suoneria"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume app. multimediali"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec basata su certificato"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index e26ece2..31c823c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"別のアプリケーションをデバッグモードにすることをアプリケーションに許可します。悪意のあるアプリケーションが別のアプリケーションを終了させる恐れがあります。"</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI設定の変更"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"地域/言語やフォントのサイズなど、現在の設定の変更をアプリケーションに許可します。"</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"他のアプリケーションの再起動"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"他のアプリケーションの強制的な再起動をアプリケーションに許可します。"</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"アプリケーションの強制終了"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
<string name="permlab_dump" msgid="1681799862438954752">"システムの内部状態の取得"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"アプリケーションがユーザー辞書に新しい語句を書き込むことを許可します。"</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"SDカードのコンテンツを修正/削除する"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"SDカードへの書き込みをアプリケーションに許可します。"</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"自宅"</item>
<item msgid="869923650527136615">"携帯"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ログイン"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ユーザー名またはパスワードが正しくありません。"</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"確認中..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"ロック解除"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"サウンドON"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"サウンドOFF"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"強制終了"</string>
<string name="report" msgid="4060218260984795706">"レポート"</string>
<string name="wait" msgid="7147118217226317732">"待機"</string>
- <string name="debug" msgid="9103374629678531849">"デバッグ"</string>
<string name="sendText" msgid="5132506121645618310">"アプリケーションを選択"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"着信音量"</string>
<string name="volume_music" msgid="5421651157138628171">"メディアの音量"</string>
@@ -723,7 +735,7 @@
<string name="sms_control_no" msgid="1715320703137199869">"キャンセル"</string>
<string name="date_time_set" msgid="5777075614321087758">"設定"</string>
<string name="default_permission_group" msgid="2690160991405646128">"端末既定"</string>
- <string name="no_permissions" msgid="7283357728219338112">"権限付与の必要はありません"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"権限の許可は必要ありません"</string>
<string name="perms_hide" msgid="7283915391320676226"><b>"隠す"</b></string>
<string name="perms_show_all" msgid="2671791163933091180"><b>"すべて表示"</b></string>
<string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"読み込み中..."</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPNベースの証明書"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index fc156b1..8afa494 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -122,13 +122,13 @@
<string name="turn_on_radio" msgid="3912793092339962371">"무선 사용"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"무선 끄기"</string>
<string name="screen_lock" msgid="799094655496098153">"화면 잠금"</string>
- <string name="power_off" msgid="4266614107412865048">"끄기"</string>
+ <string name="power_off" msgid="4266614107412865048">"종료"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"종료 중..."</string>
<string name="shutdown_confirm" msgid="649792175242821353">"휴대전화가 종료됩니다."</string>
<string name="no_recent_tasks" msgid="279702952298056674">"최신 응용프로그램이 아닙니다."</string>
<string name="global_actions" msgid="2406416831541615258">"휴대전화 옵션"</string>
<string name="global_action_lock" msgid="2844945191792119712">"화면 잠금"</string>
- <string name="global_action_power_off" msgid="4471879440839879722">"끄기"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"종료"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"무음 모드"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"소리 꺼짐"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"소리 켜짐"</string>
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"응용프로그램이 다른 응용프로그램에 대해 디버깅을 사용할 수 있도록 합니다. 이 경우 악성 응용프로그램이 다른 응용프로그램을 중지시킬 수 있습니다."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI 설정 변경"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"응용프로그램이 로케일 또는 전체 글꼴 크기와 같은 현재 구성을 변경할 수 있도록 합니다."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"다른 응용프로그램 다시 시작"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"응용프로그램이 다른 응용프로그램을 강제로 다시 시작할 수 있도록 합니다."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"강제로 응용프로그램 닫기"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫고 되돌아갈 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
<string name="permlab_dump" msgid="1681799862438954752">"시스템 내부 상태 검색"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"응용프로그램이 사용자 사전에 새 단어를 입력할 수 있도록 합니다."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD 카드 콘텐츠 수정/삭제"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"응용프로그램이 SD 카드에 쓸 수 있도록 합니다."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"집"</item>
<item msgid="869923650527136615">"모바일"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"로그인"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"확인 중..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"잠금해제"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"사운드 켜기"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"사운드 끄기"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"닫기"</string>
<string name="report" msgid="4060218260984795706">"신고"</string>
<string name="wait" msgid="7147118217226317732">"대기"</string>
- <string name="debug" msgid="9103374629678531849">"디버그"</string>
<string name="sendText" msgid="5132506121645618310">"텍스트에 대한 작업 선택"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"벨소리 볼륨"</string>
<string name="volume_music" msgid="5421651157138628171">"미디어 볼륨"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"인증서 기반 L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mcc204-cs/strings.xml b/core/res/res/values-mcc204-cs/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-cs/strings.xml
+++ b/core/res/res/values-mcc204-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-da/strings.xml b/core/res/res/values-mcc204-da/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-da/strings.xml
+++ b/core/res/res/values-mcc204-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-de/strings.xml b/core/res/res/values-mcc204-de/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-de/strings.xml
+++ b/core/res/res/values-mcc204-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-el/strings.xml b/core/res/res/values-mcc204-el/strings.xml
index 94786f1..97bfe65 100644
--- a/core/res/res/values-mcc204-el/strings.xml
+++ b/core/res/res/values-mcc204-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc204-es-rUS/strings.xml b/core/res/res/values-mcc204-es-rUS/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-es-rUS/strings.xml
+++ b/core/res/res/values-mcc204-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-es/strings.xml b/core/res/res/values-mcc204-es/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-es/strings.xml
+++ b/core/res/res/values-mcc204-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-fr/strings.xml b/core/res/res/values-mcc204-fr/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-fr/strings.xml
+++ b/core/res/res/values-mcc204-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-it/strings.xml b/core/res/res/values-mcc204-it/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-it/strings.xml
+++ b/core/res/res/values-mcc204-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-ja/strings.xml b/core/res/res/values-mcc204-ja/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-ja/strings.xml
+++ b/core/res/res/values-mcc204-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-ko/strings.xml b/core/res/res/values-mcc204-ko/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-ko/strings.xml
+++ b/core/res/res/values-mcc204-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-nb/strings.xml b/core/res/res/values-mcc204-nb/strings.xml
deleted file mode 100644
index 94786f1..0000000
--- a/core/res/res/values-mcc204-nb/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
-</resources>
diff --git a/core/res/res/values-mcc204-nl/strings.xml b/core/res/res/values-mcc204-nl/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-nl/strings.xml
+++ b/core/res/res/values-mcc204-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-pl/strings.xml b/core/res/res/values-mcc204-pl/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-pl/strings.xml
+++ b/core/res/res/values-mcc204-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-pt-rPT/strings.xml b/core/res/res/values-mcc204-pt-rPT/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc204-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-pt/strings.xml b/core/res/res/values-mcc204-pt/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-pt/strings.xml
+++ b/core/res/res/values-mcc204-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-ru/strings.xml b/core/res/res/values-mcc204-ru/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-ru/strings.xml
+++ b/core/res/res/values-mcc204-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-sv/strings.xml b/core/res/res/values-mcc204-sv/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-sv/strings.xml
+++ b/core/res/res/values-mcc204-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-tr/strings.xml b/core/res/res/values-mcc204-tr/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-tr/strings.xml
+++ b/core/res/res/values-mcc204-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-zh-rCN/strings.xml b/core/res/res/values-mcc204-zh-rCN/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc204-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc204-zh-rTW/strings.xml b/core/res/res/values-mcc204-zh-rTW/strings.xml
index 94786f1..7d96230 100644
--- a/core/res/res/values-mcc204-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc204-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="2972154133076909542">"nl_nl"</string>
+ <string name="locale_replacement">"nl_nl"</string>
</resources>
diff --git a/core/res/res/values-mcc230-cs/strings.xml b/core/res/res/values-mcc230-cs/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-cs/strings.xml
+++ b/core/res/res/values-mcc230-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-da/strings.xml b/core/res/res/values-mcc230-da/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-da/strings.xml
+++ b/core/res/res/values-mcc230-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-de/strings.xml b/core/res/res/values-mcc230-de/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-de/strings.xml
+++ b/core/res/res/values-mcc230-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-el/strings.xml b/core/res/res/values-mcc230-el/strings.xml
index 63ade62..97bfe65 100644
--- a/core/res/res/values-mcc230-el/strings.xml
+++ b/core/res/res/values-mcc230-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc230-es-rUS/strings.xml b/core/res/res/values-mcc230-es-rUS/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-es-rUS/strings.xml
+++ b/core/res/res/values-mcc230-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-es/strings.xml b/core/res/res/values-mcc230-es/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-es/strings.xml
+++ b/core/res/res/values-mcc230-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-fr/strings.xml b/core/res/res/values-mcc230-fr/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-fr/strings.xml
+++ b/core/res/res/values-mcc230-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-it/strings.xml b/core/res/res/values-mcc230-it/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-it/strings.xml
+++ b/core/res/res/values-mcc230-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-ja/strings.xml b/core/res/res/values-mcc230-ja/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-ja/strings.xml
+++ b/core/res/res/values-mcc230-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-ko/strings.xml b/core/res/res/values-mcc230-ko/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-ko/strings.xml
+++ b/core/res/res/values-mcc230-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-nl/strings.xml b/core/res/res/values-mcc230-nl/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-nl/strings.xml
+++ b/core/res/res/values-mcc230-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-pl/strings.xml b/core/res/res/values-mcc230-pl/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-pl/strings.xml
+++ b/core/res/res/values-mcc230-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-pt-rPT/strings.xml b/core/res/res/values-mcc230-pt-rPT/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc230-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-pt/strings.xml b/core/res/res/values-mcc230-pt/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-pt/strings.xml
+++ b/core/res/res/values-mcc230-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-ru/strings.xml b/core/res/res/values-mcc230-ru/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-ru/strings.xml
+++ b/core/res/res/values-mcc230-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-sv/strings.xml b/core/res/res/values-mcc230-sv/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-sv/strings.xml
+++ b/core/res/res/values-mcc230-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-tr/strings.xml b/core/res/res/values-mcc230-tr/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-tr/strings.xml
+++ b/core/res/res/values-mcc230-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-zh-rCN/strings.xml b/core/res/res/values-mcc230-zh-rCN/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc230-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc230-zh-rTW/strings.xml b/core/res/res/values-mcc230-zh-rTW/strings.xml
index 63ade62..d3ecdbb 100644
--- a/core/res/res/values-mcc230-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc230-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+ <string name="locale_replacement">"cs_cz"</string>
</resources>
diff --git a/core/res/res/values-mcc232-cs/strings.xml b/core/res/res/values-mcc232-cs/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-cs/strings.xml
+++ b/core/res/res/values-mcc232-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-da/strings.xml b/core/res/res/values-mcc232-da/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-da/strings.xml
+++ b/core/res/res/values-mcc232-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-de/strings.xml b/core/res/res/values-mcc232-de/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-de/strings.xml
+++ b/core/res/res/values-mcc232-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-el/strings.xml b/core/res/res/values-mcc232-el/strings.xml
index b028927..97bfe65 100644
--- a/core/res/res/values-mcc232-el/strings.xml
+++ b/core/res/res/values-mcc232-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc232-es-rUS/strings.xml b/core/res/res/values-mcc232-es-rUS/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-es-rUS/strings.xml
+++ b/core/res/res/values-mcc232-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-es/strings.xml b/core/res/res/values-mcc232-es/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-es/strings.xml
+++ b/core/res/res/values-mcc232-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-fr/strings.xml b/core/res/res/values-mcc232-fr/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-fr/strings.xml
+++ b/core/res/res/values-mcc232-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-it/strings.xml b/core/res/res/values-mcc232-it/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-it/strings.xml
+++ b/core/res/res/values-mcc232-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-ja/strings.xml b/core/res/res/values-mcc232-ja/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-ja/strings.xml
+++ b/core/res/res/values-mcc232-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-ko/strings.xml b/core/res/res/values-mcc232-ko/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-ko/strings.xml
+++ b/core/res/res/values-mcc232-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-nb/strings.xml b/core/res/res/values-mcc232-nb/strings.xml
deleted file mode 100644
index b028927..0000000
--- a/core/res/res/values-mcc232-nb/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
-</resources>
diff --git a/core/res/res/values-mcc232-nl/strings.xml b/core/res/res/values-mcc232-nl/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-nl/strings.xml
+++ b/core/res/res/values-mcc232-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-pl/strings.xml b/core/res/res/values-mcc232-pl/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-pl/strings.xml
+++ b/core/res/res/values-mcc232-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-pt-rPT/strings.xml b/core/res/res/values-mcc232-pt-rPT/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc232-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-pt/strings.xml b/core/res/res/values-mcc232-pt/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-pt/strings.xml
+++ b/core/res/res/values-mcc232-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-ru/strings.xml b/core/res/res/values-mcc232-ru/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-ru/strings.xml
+++ b/core/res/res/values-mcc232-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-sv/strings.xml b/core/res/res/values-mcc232-sv/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-sv/strings.xml
+++ b/core/res/res/values-mcc232-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-tr/strings.xml b/core/res/res/values-mcc232-tr/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-tr/strings.xml
+++ b/core/res/res/values-mcc232-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-zh-rCN/strings.xml b/core/res/res/values-mcc232-zh-rCN/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc232-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc232-zh-rTW/strings.xml b/core/res/res/values-mcc232-zh-rTW/strings.xml
index b028927..4773838 100644
--- a/core/res/res/values-mcc232-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc232-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="166900303893651370">"de_at"</string>
+ <string name="locale_replacement">"de_at"</string>
</resources>
diff --git a/core/res/res/values-mcc234-cs/strings.xml b/core/res/res/values-mcc234-cs/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-cs/strings.xml
+++ b/core/res/res/values-mcc234-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-da/strings.xml b/core/res/res/values-mcc234-da/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-da/strings.xml
+++ b/core/res/res/values-mcc234-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-de/strings.xml b/core/res/res/values-mcc234-de/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-de/strings.xml
+++ b/core/res/res/values-mcc234-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-el/strings.xml b/core/res/res/values-mcc234-el/strings.xml
index bd391e1..97bfe65 100644
--- a/core/res/res/values-mcc234-el/strings.xml
+++ b/core/res/res/values-mcc234-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc234-es-rUS/strings.xml b/core/res/res/values-mcc234-es-rUS/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-es-rUS/strings.xml
+++ b/core/res/res/values-mcc234-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-es/strings.xml b/core/res/res/values-mcc234-es/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-es/strings.xml
+++ b/core/res/res/values-mcc234-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-fr/strings.xml b/core/res/res/values-mcc234-fr/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-fr/strings.xml
+++ b/core/res/res/values-mcc234-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-it/strings.xml b/core/res/res/values-mcc234-it/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-it/strings.xml
+++ b/core/res/res/values-mcc234-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-ja/strings.xml b/core/res/res/values-mcc234-ja/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-ja/strings.xml
+++ b/core/res/res/values-mcc234-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-ko/strings.xml b/core/res/res/values-mcc234-ko/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-ko/strings.xml
+++ b/core/res/res/values-mcc234-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-nb/strings.xml b/core/res/res/values-mcc234-nb/strings.xml
deleted file mode 100644
index bd391e1..0000000
--- a/core/res/res/values-mcc234-nb/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
-</resources>
diff --git a/core/res/res/values-mcc234-nl/strings.xml b/core/res/res/values-mcc234-nl/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-nl/strings.xml
+++ b/core/res/res/values-mcc234-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-pl/strings.xml b/core/res/res/values-mcc234-pl/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-pl/strings.xml
+++ b/core/res/res/values-mcc234-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-pt-rPT/strings.xml b/core/res/res/values-mcc234-pt-rPT/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc234-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-pt/strings.xml b/core/res/res/values-mcc234-pt/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-pt/strings.xml
+++ b/core/res/res/values-mcc234-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-ru/strings.xml b/core/res/res/values-mcc234-ru/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-ru/strings.xml
+++ b/core/res/res/values-mcc234-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-sv/strings.xml b/core/res/res/values-mcc234-sv/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-sv/strings.xml
+++ b/core/res/res/values-mcc234-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-tr/strings.xml b/core/res/res/values-mcc234-tr/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-tr/strings.xml
+++ b/core/res/res/values-mcc234-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-zh-rCN/strings.xml b/core/res/res/values-mcc234-zh-rCN/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc234-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc234-zh-rTW/strings.xml b/core/res/res/values-mcc234-zh-rTW/strings.xml
index bd391e1..2538b73 100644
--- a/core/res/res/values-mcc234-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc234-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="233769627858930762">"en_gb"</string>
+ <string name="locale_replacement">"en_gb"</string>
</resources>
diff --git a/core/res/res/values-mcc260-cs/strings.xml b/core/res/res/values-mcc260-cs/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-cs/strings.xml
+++ b/core/res/res/values-mcc260-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-da/strings.xml b/core/res/res/values-mcc260-da/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-da/strings.xml
+++ b/core/res/res/values-mcc260-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-de/strings.xml b/core/res/res/values-mcc260-de/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-de/strings.xml
+++ b/core/res/res/values-mcc260-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-el/strings.xml b/core/res/res/values-mcc260-el/strings.xml
index 13ea1b2..97bfe65 100644
--- a/core/res/res/values-mcc260-el/strings.xml
+++ b/core/res/res/values-mcc260-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc260-es-rUS/strings.xml b/core/res/res/values-mcc260-es-rUS/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-es-rUS/strings.xml
+++ b/core/res/res/values-mcc260-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-es/strings.xml b/core/res/res/values-mcc260-es/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-es/strings.xml
+++ b/core/res/res/values-mcc260-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-fr/strings.xml b/core/res/res/values-mcc260-fr/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-fr/strings.xml
+++ b/core/res/res/values-mcc260-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-it/strings.xml b/core/res/res/values-mcc260-it/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-it/strings.xml
+++ b/core/res/res/values-mcc260-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-ja/strings.xml b/core/res/res/values-mcc260-ja/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-ja/strings.xml
+++ b/core/res/res/values-mcc260-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-ko/strings.xml b/core/res/res/values-mcc260-ko/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-ko/strings.xml
+++ b/core/res/res/values-mcc260-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-nb/strings.xml b/core/res/res/values-mcc260-nb/strings.xml
deleted file mode 100644
index 13ea1b2..0000000
--- a/core/res/res/values-mcc260-nb/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
-</resources>
diff --git a/core/res/res/values-mcc260-nl/strings.xml b/core/res/res/values-mcc260-nl/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-nl/strings.xml
+++ b/core/res/res/values-mcc260-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-pl/strings.xml b/core/res/res/values-mcc260-pl/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-pl/strings.xml
+++ b/core/res/res/values-mcc260-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-pt-rPT/strings.xml b/core/res/res/values-mcc260-pt-rPT/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc260-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-pt/strings.xml b/core/res/res/values-mcc260-pt/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-pt/strings.xml
+++ b/core/res/res/values-mcc260-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-ru/strings.xml b/core/res/res/values-mcc260-ru/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-ru/strings.xml
+++ b/core/res/res/values-mcc260-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-sv/strings.xml b/core/res/res/values-mcc260-sv/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-sv/strings.xml
+++ b/core/res/res/values-mcc260-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-tr/strings.xml b/core/res/res/values-mcc260-tr/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-tr/strings.xml
+++ b/core/res/res/values-mcc260-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-zh-rCN/strings.xml b/core/res/res/values-mcc260-zh-rCN/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc260-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc260-zh-rTW/strings.xml b/core/res/res/values-mcc260-zh-rTW/strings.xml
index 13ea1b2..1161f9a 100644
--- a/core/res/res/values-mcc260-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc260-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="6306793451973344945">"pl_pl"</string>
+ <string name="locale_replacement">"pl_pl"</string>
</resources>
diff --git a/core/res/res/values-mcc262-cs/strings.xml b/core/res/res/values-mcc262-cs/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-cs/strings.xml
+++ b/core/res/res/values-mcc262-cs/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-da/strings.xml b/core/res/res/values-mcc262-da/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-da/strings.xml
+++ b/core/res/res/values-mcc262-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-de/strings.xml b/core/res/res/values-mcc262-de/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-de/strings.xml
+++ b/core/res/res/values-mcc262-de/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-el/strings.xml b/core/res/res/values-mcc262-el/strings.xml
index a90e7cf..97bfe65 100644
--- a/core/res/res/values-mcc262-el/strings.xml
+++ b/core/res/res/values-mcc262-el/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"el_GR"</string>
</resources>
diff --git a/core/res/res/values-mcc262-es-rUS/strings.xml b/core/res/res/values-mcc262-es-rUS/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-es-rUS/strings.xml
+++ b/core/res/res/values-mcc262-es-rUS/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-es/strings.xml b/core/res/res/values-mcc262-es/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-es/strings.xml
+++ b/core/res/res/values-mcc262-es/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-fr/strings.xml b/core/res/res/values-mcc262-fr/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-fr/strings.xml
+++ b/core/res/res/values-mcc262-fr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-it/strings.xml b/core/res/res/values-mcc262-it/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-it/strings.xml
+++ b/core/res/res/values-mcc262-it/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-ja/strings.xml b/core/res/res/values-mcc262-ja/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-ja/strings.xml
+++ b/core/res/res/values-mcc262-ja/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-ko/strings.xml b/core/res/res/values-mcc262-ko/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-ko/strings.xml
+++ b/core/res/res/values-mcc262-ko/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-nb/strings.xml b/core/res/res/values-mcc262-nb/strings.xml
deleted file mode 100644
index a90e7cf..0000000
--- a/core/res/res/values-mcc262-nb/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
-</resources>
diff --git a/core/res/res/values-mcc262-nl/strings.xml b/core/res/res/values-mcc262-nl/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-nl/strings.xml
+++ b/core/res/res/values-mcc262-nl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-pl/strings.xml b/core/res/res/values-mcc262-pl/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-pl/strings.xml
+++ b/core/res/res/values-mcc262-pl/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-pt-rPT/strings.xml b/core/res/res/values-mcc262-pt-rPT/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-pt-rPT/strings.xml
+++ b/core/res/res/values-mcc262-pt-rPT/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-pt/strings.xml b/core/res/res/values-mcc262-pt/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-pt/strings.xml
+++ b/core/res/res/values-mcc262-pt/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-ru/strings.xml b/core/res/res/values-mcc262-ru/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-ru/strings.xml
+++ b/core/res/res/values-mcc262-ru/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-sv/strings.xml b/core/res/res/values-mcc262-sv/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-sv/strings.xml
+++ b/core/res/res/values-mcc262-sv/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-tr/strings.xml b/core/res/res/values-mcc262-tr/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-tr/strings.xml
+++ b/core/res/res/values-mcc262-tr/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-zh-rCN/strings.xml b/core/res/res/values-mcc262-zh-rCN/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-zh-rCN/strings.xml
+++ b/core/res/res/values-mcc262-zh-rCN/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-mcc262-zh-rTW/strings.xml b/core/res/res/values-mcc262-zh-rTW/strings.xml
index a90e7cf..9505cf4 100644
--- a/core/res/res/values-mcc262-zh-rTW/strings.xml
+++ b/core/res/res/values-mcc262-zh-rTW/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="273407696421660814">"de_de"</string>
+ <string name="locale_replacement">"de_de"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index c0aae98..ed4f596 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Lar applikasjonen skru på debugging for en annen applikasjon. Ondsinnede applikasjoner kan bruke dette til å drepe andre applikasjoner."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"endre innstillingene for brukergrensesnitt"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillater applikasjonen å endre gjeldende innstillinger, slik som språk eller skriftstørrelse."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"omstarte andre applikasjoner"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Lar applikasjonen tvinge andre applikasjoner til å starte på nytt."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"tvinge applikasjoner til å lukkes"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Lar applikasjonen tvinge enhver aktivitet som er i forgrunnen til å lukkes og gå tilbake. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_dump" msgid="1681799862438954752">"hente intern systemtilstand"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Lar applikasjonen skrive nye ord til den brukerdefinerte ordlisten."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"redigere/slette innhold på minnekort"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Lar applikasjonen skrive til minnekortet."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjemmenummer"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Logg på"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ugyldig brukernavn eller passord."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerer ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås opp"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd på"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Lyd av"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Tving avslutning"</string>
<string name="report" msgid="4060218260984795706">"Rapportér"</string>
<string name="wait" msgid="7147118217226317732">"Vent"</string>
- <string name="debug" msgid="9103374629678531849">"Debug"</string>
<string name="sendText" msgid="5132506121645618310">"Velg mål for tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringetonevolum"</string>
<string name="volume_music" msgid="5421651157138628171">"Medievolum"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikatbasert L2TP/IPSec-VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 9b95c09..a6ebcde 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -147,10 +147,8 @@
<string name="permgroupdesc_location" msgid="2430258821648348660">"Uw fysieke locatie bijhouden"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netwerkcommunicatie"</string>
<string name="permgroupdesc_network" msgid="5035763698958415998">"Toepassingen toestaan verschillende netwerkfuncties te openen."</string>
- <!-- no translation found for permgrouplab_accounts (3359646291125325519) -->
- <skip />
- <!-- no translation found for permgroupdesc_accounts (4948732641827091312) -->
- <skip />
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"Uw accounts"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Toegang tot de beschikbare accounts."</string>
<string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Bedieningselementen hardware"</string>
<string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Rechtstreekse toegang tot hardware op de handset."</string>
<string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Telefoonoproepen"</string>
@@ -187,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Hiermee kan een toepassing de foutopsporing voor een andere toepassing inschakelen. Schadelijke toepassingen kunnen dit gebruiken om andere toepassingen af te sluiten."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"uw UI-instellingen wijzigen"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Hiermee kan een toepassing de huidige configuratie, zoals de landinstelling of de algemene lettergrootte, wijzigen."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"andere toepassingen opnieuw starten"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Hiermee kan een toepassing andere toepassingen opnieuw starten."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"toepassing nu sluiten"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Hiermee kan een toepassing elke willekeurige activiteit die op de voorgrond wordt uitgevoerd, sluiten en naar de achtergrond verplaatsen. Nooit vereist voor normale toepassingen."</string>
<string name="permlab_dump" msgid="1681799862438954752">"interne systeemstatus ophalen"</string>
@@ -391,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Hiermee kan een toepassing nieuwe woorden schrijven naar het gebruikerswoordenboek."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"inhoud op de SD-kaart aanpassen/verwijderen"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Hiermee kan een toepassing schrijven naar de SD-kaart."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Thuis"</item>
<item msgid="869923650527136615">"Mobiel"</item>
@@ -455,12 +463,9 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager werk"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeBirthday (2813379844211390740) -->
- <skip />
- <!-- no translation found for eventTypeAnniversary (3876779744518284000) -->
- <skip />
- <!-- no translation found for eventTypeOther (5834288791948564594) -->
- <skip />
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"Verjaardag"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string>
+ <string name="eventTypeOther" msgid="5834288791948564594">"Afspraak"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Aangepast"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Thuis"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Werk"</string>
@@ -525,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Aanmelden"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Gebruikersnaam of wachtwoord ongeldig."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controleren..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ontgrendelen"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Geluid aan"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Geluid uit"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
@@ -696,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Nu sluiten"</string>
<string name="report" msgid="4060218260984795706">"Rapport"</string>
<string name="wait" msgid="7147118217226317732">"Wachten"</string>
- <string name="debug" msgid="9103374629678531849">"Foutopsporing"</string>
<string name="sendText" msgid="5132506121645618310">"Selecteer een actie voor tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Belvolume"</string>
<string name="volume_music" msgid="5421651157138628171">"Mediavolume"</string>
@@ -797,14 +804,14 @@
<string name="accessibility_binding_label" msgid="4148120742096474641">"Toegankelijkheid"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Achtergrond"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Achtergrond wijzigen"</string>
- <!-- no translation found for pptp_vpn_description (2688045385181439401) -->
- <skip />
- <!-- no translation found for l2tp_vpn_description (3750692169378923304) -->
- <skip />
- <!-- no translation found for l2tp_ipsec_psk_vpn_description (3945043564008303239) -->
- <skip />
- <!-- no translation found for l2tp_ipsec_crt_vpn_description (5382714073103653577) -->
- <skip />
+ <string name="pptp_vpn_description" msgid="2688045385181439401">"Point-to-Point Tunneling Protocol (PPTP)"</string>
+ <string name="l2tp_vpn_description" msgid="3750692169378923304">"Layer 2 Tunneling Protocol (L2TP)"</string>
+ <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Vooraf gedeelde sleutel op basis van L2TP/IPSec VPN"</string>
+ <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificaat op basis van L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 6ee52ed..6d0539e 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Pozwala aplikacji na włączenie debugowania innej aplikacji. Szkodliwe aplikacje mogą to wykorzystać do wyłączenia innych programów."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"zmienianie ustawień interfejsu użytkownika"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Pozwala aplikacji zmieniać bieżącą konfigurację, na przykład lokalny lub globalny rozmiar czcionki."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"resetowanie innych aplikacji"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Pozwala aplikacji na wymuszenie ponownego uruchomienia innych aplikacji."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"wymuszanie zamknięcia aplikacji"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Pozwala aplikacji na wymuszenie zamknięcia i cofnięcia dowolnej operacji działającej na pierwszym planie. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
<string name="permlab_dump" msgid="1681799862438954752">"pobieranie informacji o wewnętrznym stanie systemu"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Zezwala aplikacjom na zapisywanie nowych słów w słowniku użytkownika."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modyfikowanie/usuwanie zawartości karty SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umożliwia aplikacji zapis na karcie SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Dom"</item>
<item msgid="869923650527136615">"Komórka"</item>
@@ -434,7 +444,7 @@
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Niestandardowy"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"Domowy"</string>
- <string name="phoneTypeMobile" msgid="6501463557754751037">"Komórkowy"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Komórka"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Służbowy"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Faks służbowy"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faks domowy"</string>
@@ -449,7 +459,7 @@
<string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Teleks"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
- <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Służbowy komórkowy"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Służbowa komórka"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager służbowy"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asystent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"Wiadomość MMS"</string>
@@ -460,7 +470,7 @@
<string name="emailTypeHome" msgid="449227236140433919">"Domowy"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Służbowy"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Inny"</string>
- <string name="emailTypeMobile" msgid="119919005321166205">"Komórkowy"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Komórka"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Niestandardowy"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Domowy"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Służbowy"</string>
@@ -517,9 +527,12 @@
<string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"Aby odblokować, zaloguj się za pomocą konta Google"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Nazwa użytkownika (e-mail)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Hasło"</string>
- <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj się"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Błędna nazwa użytkownika lub hasło."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Trwa sprawdzanie..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Wyłącz dźwięk"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
@@ -593,7 +606,7 @@
</plurals>
<plurals name="abbrev_num_seconds_ago">
<item quantity="one" msgid="1849036840200069118">"sekundę temu"</item>
- <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> sek. temu"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> s temu"</item>
</plurals>
<plurals name="abbrev_num_minutes_ago">
<item quantity="one" msgid="6361490147113871545">"minutę temu"</item>
@@ -609,7 +622,7 @@
</plurals>
<plurals name="abbrev_in_num_seconds">
<item quantity="one" msgid="5842225370795066299">"za sekundę"</item>
- <item quantity="other" msgid="5495880108825805108">"za <xliff:g id="COUNT">%d</xliff:g> sek."</item>
+ <item quantity="other" msgid="5495880108825805108">"za <xliff:g id="COUNT">%d</xliff:g> s"</item>
</plurals>
<plurals name="abbrev_in_num_minutes">
<item quantity="one" msgid="562786149928284878">"za minutę"</item>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Wymuś zamknięcie"</string>
<string name="report" msgid="4060218260984795706">"Zgłoś"</string>
<string name="wait" msgid="7147118217226317732">"Czekaj"</string>
- <string name="debug" msgid="9103374629678531849">"Debuguj"</string>
<string name="sendText" msgid="5132506121645618310">"Jak wysłać tekst?"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Głośność dzwonka"</string>
<string name="volume_music" msgid="5421651157138628171">"Głośność multimediów"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sieć VPN L2TP/IPSec z certyfikatem"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index c86fbdb..1872cb4 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite a uma aplicação activar a depuração para outra aplicação. Algumas aplicações maliciosas podem utilizar este item para eliminar outras aplicações."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"alterar definições da IU"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite a uma aplicação mudar a configuração actual como, por exemplo, a região ou o tamanho global do tipo de letra."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"reiniciar outras aplicações"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Permite a uma aplicação efectuar o reinício forçado de outras aplicações."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"forçar fecho da aplicação"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Permite a uma aplicação forçar qualquer actividade em primeiro plano a fechar e retroceder. Nunca deve ser necessário para aplicações normais."</string>
<string name="permlab_dump" msgid="1681799862438954752">"obter estado interno do sistema"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite a uma aplicação escrever novas palavras no dicionário do utilizador."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/eliminar os conteúdos do cartão SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que uma aplicação escreva no cartão SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Residência"</item>
<item msgid="869923650527136615">"Móvel"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Iniciar sessão"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de utilizador ou palavra-passe inválidos."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"A verificar..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som activado"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desactivado"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Forçar fecho"</string>
<string name="report" msgid="4060218260984795706">"Relatório"</string>
<string name="wait" msgid="7147118217226317732">"Esperar"</string>
- <string name="debug" msgid="9103374629678531849">"Depuração"</string>
<string name="sendText" msgid="5132506121645618310">"Seleccionar uma acção para texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume da campainha"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume de multimédia"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec baseada em certificado"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 70f82ee..6841fec 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite que um aplicativo ative a depuração de outro aplicativo. Aplicativos maliciosos podem usar isso para encerrar outros aplicativos."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"alterar as suas configurações de UI"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite que um aplicativo altere a configuração atual, como o local ou o tamanho geral da fonte."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"reiniciar outros aplicativos"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Permite que um aplicativo reinicie forçosamente outros aplicativos."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"forçar fechamento do aplicativo"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Permite que um aplicativo force o fechamento de qualquer atividade que esteja em primeiro plano. Aplicativos normais não devem precisar disso em momento algum."</string>
<string name="permlab_dump" msgid="1681799862438954752">"recuperar o estado interno do sistema"</string>
@@ -389,8 +395,12 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite que um aplicativo grave novas palavras no dicionário do usuário."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/excluir conteúdo do cartão SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que um aplicativo grave no cartão SD."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
- <item msgid="8901098336658710359">"Página inicial"</item>
+ <item msgid="8901098336658710359">"Residencial"</item>
<item msgid="869923650527136615">"Celular"</item>
<item msgid="7897544654242874543">"Trabalho"</item>
<item msgid="1103601433382158155">"Fax do trabalho"</item>
@@ -400,19 +410,19 @@
<item msgid="9192514806975898961">"Personalizado"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"Página inicial"</item>
+ <item msgid="8073994352956129127">"Residencial"</item>
<item msgid="7084237356602625604">"Trabalho"</item>
<item msgid="1112044410659011023">"Outros"</item>
<item msgid="2374913952870110618">"Personalizado"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"Página inicial"</item>
+ <item msgid="6880257626740047286">"Residencial"</item>
<item msgid="5629153956045109251">"Trabalho"</item>
<item msgid="4966604264500343469">"Outros"</item>
<item msgid="4932682847595299369">"Personalizado"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"Página inicial"</item>
+ <item msgid="1738585194601476694">"Residencial"</item>
<item msgid="1359644565647383708">"Trabalho"</item>
<item msgid="7868549401053615677">"Outros"</item>
<item msgid="3145118944639869809">"Personalizado"</item>
@@ -433,7 +443,7 @@
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Personalizado"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"Página inicial"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Residencial"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Celular"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Comercial"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Fax comercial"</string>
@@ -457,16 +467,16 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Data comemorativa"</string>
<string name="eventTypeOther" msgid="5834288791948564594">"Evento"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Página inicial"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Residencial"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Comercial"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Outros"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Celular"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Personalizado"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"Página inicial"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Residencial"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Comercial"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Outros"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Personalizado"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"Página inicial"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Residencial"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Comercial"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Outros"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Personalizado"</string>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Fazer login"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nome de usuário ou senha inválida."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Verificando..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som ativado"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desativado"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Forçar fechamento"</string>
<string name="report" msgid="4060218260984795706">"Informar"</string>
<string name="wait" msgid="7147118217226317732">"Aguardar"</string>
- <string name="debug" msgid="9103374629678531849">"Depurar"</string>
<string name="sendText" msgid="5132506121645618310">"Selecione uma ação para o texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume da campainha"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume da mídia"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec com base em certificado"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 56b75fc..0fa02dc 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Позволяет приложению запускать процесс отладки другого приложения. Вредоносные приложения могут использовать эту возможность для остановки других приложений."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"изменять настройки пользовательского интерфейса"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Позволяет приложению изменять текущую конфигурацию, например региональные настройки или размер шрифта."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"перезапускать другие приложения"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Позволяет приложению принудительно перезапускать другие приложения."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"принудительно закрывать приложения"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Позволяет приложению принудительно закрыть или вернуть в исходное состояние процессы, выполняемые в активном режиме. Не требуется для обычных приложений."</string>
<string name="permlab_dump" msgid="1681799862438954752">"извлекать данные о внутреннем состоянии системы"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Позволяет приложению записывать новые слова в пользовательский словарь."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"изменять/удалять содержание SD-карты"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Разрешает приложению запись на SD-карту"</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Домашний"</item>
<item msgid="869923650527136615">"Мобильный"</item>
@@ -397,30 +407,30 @@
<item msgid="1735177144948329370">"Домашний факс"</item>
<item msgid="603878674477207394">"Пейджер"</item>
<item msgid="1650824275177931637">"Другой"</item>
- <item msgid="9192514806975898961">"Особый"</item>
+ <item msgid="9192514806975898961">"Создать свой ярлык"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"Домашний"</item>
+ <item msgid="8073994352956129127">"Личный"</item>
<item msgid="7084237356602625604">"Рабочий"</item>
<item msgid="1112044410659011023">"Другой"</item>
- <item msgid="2374913952870110618">"Особый"</item>
+ <item msgid="2374913952870110618">"Создать свой ярлык"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="6880257626740047286">"Домашний"</item>
<item msgid="5629153956045109251">"Рабочий"</item>
<item msgid="4966604264500343469">"Другой"</item>
- <item msgid="4932682847595299369">"Особый"</item>
+ <item msgid="4932682847595299369">"Создать свой ярлык"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="1738585194601476694">"Домашний"</item>
<item msgid="1359644565647383708">"Рабочий"</item>
<item msgid="7868549401053615677">"Другое"</item>
- <item msgid="3145118944639869809">"Особый"</item>
+ <item msgid="3145118944639869809">"Создать свой ярлык"</item>
</string-array>
<string-array name="organizationTypes">
<item msgid="7546335612189115615">"Рабочий"</item>
- <item msgid="4378074129049520373">"Другой"</item>
- <item msgid="3455047468583965104">"Особый"</item>
+ <item msgid="4378074129049520373">"Другое"</item>
+ <item msgid="3455047468583965104">"Создать свой ярлык"</item>
</string-array>
<string-array name="imProtocols">
<item msgid="8595261363518459565">"AIM"</item>
@@ -432,44 +442,44 @@
<item msgid="2506857312718630823">"ICQ"</item>
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
- <string name="phoneTypeCustom" msgid="1644738059053355820">"Особый"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"Дом"</string>
- <string name="phoneTypeMobile" msgid="6501463557754751037">"Моб."</string>
- <string name="phoneTypeWork" msgid="8863939667059911633">"Раб."</string>
- <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Раб. факс"</string>
- <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Дом. факс"</string>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"Создать свой ярлык"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Домашний"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Мобильный"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"Рабочий"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Рабочий факс"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Домашний факс"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Пейджер"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Другой"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Обр. вызов"</string>
<string name="phoneTypeCar" msgid="8738360689616716982">"В авто"</string>
- <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Раб., осн."</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Телефон офиса"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Основной"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Доп. факс"</string>
<string name="phoneTypeRadio" msgid="4093738079908667513">"Радио"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Телекс"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"Телетайп"</string>
- <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Раб. моб."</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Рабочий мобильный"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Рабочий пейджер"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Секретарь"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"День рождения"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Юбилей"</string>
<string name="eventTypeOther" msgid="5834288791948564594">"Мероприятие"</string>
- <string name="emailTypeCustom" msgid="8525960257804213846">"Особый"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Дом"</string>
- <string name="emailTypeWork" msgid="3548058059601149973">"Раб."</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"Создать свой ярлык"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Личный"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"Рабочий"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Другой"</string>
- <string name="emailTypeMobile" msgid="119919005321166205">"Моб."</string>
- <string name="postalTypeCustom" msgid="8903206903060479902">"Особый"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"Дом"</string>
- <string name="postalTypeWork" msgid="5268172772387694495">"Раб."</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Мобильный"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"Создать свой ярлык"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Домашний"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"Рабочий"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Другой"</string>
- <string name="imTypeCustom" msgid="2074028755527826046">"Особый"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"Дом"</string>
- <string name="imTypeWork" msgid="1371489290242433090">"Раб."</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"Создать свой ярлык"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Домашний"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"Рабочий"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Другой"</string>
- <string name="imProtocolCustom" msgid="6919453836618749992">"Особый"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"Создать свой ярлык"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
<string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
<string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
@@ -479,9 +489,9 @@
<string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
<string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
- <string name="orgTypeWork" msgid="29268870505363872">"Раб."</string>
- <string name="orgTypeOther" msgid="3951781131570124082">"Другой"</string>
- <string name="orgTypeCustom" msgid="225523415372088322">"Особый"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"Работа"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"Другое"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"Создать свой ярлык"</string>
<string name="contact_status_update_attribution" msgid="5112589886094402795">"с помощью <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> с помощью <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Введите PIN-код"</string>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Вход"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Неверное имя пользователя или пароль."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Проверка..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Разблокировать"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Вкл. звук"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Откл. звук"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
@@ -684,14 +697,13 @@
<string name="aerr_application" msgid="4683614104336409186">"Произошла неожиданная остановка приложения <xliff:g id="APPLICATION">%1$s</xliff:g> (процесс <xliff:g id="PROCESS">%2$s</xliff:g>). Повторите попытку."</string>
<string name="aerr_process" msgid="1551785535966089511">"Произошла неожиданная остановка процесса <xliff:g id="PROCESS">%1$s</xliff:g>. Повторите попытку."</string>
<string name="anr_title" msgid="3100070910664756057">"Извините!"</string>
- <string name="anr_activity_application" msgid="3538242413112507636">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в приложении <xliff:g id="APPLICATION">%2$s</xliff:g>) не отвечает."</string>
- <string name="anr_activity_process" msgid="5420826626009561014">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
+ <string name="anr_activity_application" msgid="3538242413112507636">"<xliff:g id="ACTIVITY">%1$s</xliff:g> не отвечает (приложение: <xliff:g id="APPLICATION">%2$s</xliff:g>)."</string>
+ <string name="anr_activity_process" msgid="5420826626009561014">"Приложение <xliff:g id="ACTIVITY">%1$s</xliff:g> не отвечает (процесс: <xliff:g id="PROCESS">%2$s</xliff:g>)."</string>
<string name="anr_application_process" msgid="4185842666452210193">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
<string name="anr_process" msgid="1246866008169975783">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> не отвечает."</string>
- <string name="force_close" msgid="3653416315450806396">"Принудительное закрытие"</string>
+ <string name="force_close" msgid="3653416315450806396">"Закрыть"</string>
<string name="report" msgid="4060218260984795706">"Отчет"</string>
- <string name="wait" msgid="7147118217226317732">"Подождите"</string>
- <string name="debug" msgid="9103374629678531849">"Выполнить отладку"</string>
+ <string name="wait" msgid="7147118217226317732">"Подождать"</string>
<string name="sendText" msgid="5132506121645618310">"Выберите действие для текста"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Громкость звонка"</string>
<string name="volume_music" msgid="5421651157138628171">"Громкость мультимедиа"</string>
@@ -744,7 +756,7 @@
<string name="extmedia_format_title" msgid="8663247929551095854">"Форматировать карту SD"</string>
<string name="extmedia_format_message" msgid="3621369962433523619">"Отформатировать карту SD? Все данные, находящиеся на карте, будут уничтожены."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка USB подключена"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Нажмите, чтобы отключить отладку USB."</string>
<string name="select_input_method" msgid="6865512749462072765">"Выберите способ ввода"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -789,7 +801,7 @@
<string name="permission_request_notification_with_subtitle" msgid="4325409589686688000">"Требуется разрешение"\n"для аккаунта <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"Способ ввода"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"Синхр."</string>
- <string name="accessibility_binding_label" msgid="4148120742096474641">"Специальные возможности"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Спец. возможности"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Фоновый рисунок"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Изменить фоновый рисунок"</string>
<string name="pptp_vpn_description" msgid="2688045385181439401">"Протокол PPTP"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN (на основе сертификата)"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3e32b15..313073f 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillåter att ett program aktiverar felsökning för ett annat program. Skadliga program kan använda detta för att avsluta andra program."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"ändra dina gränssnittsinställningar"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillåter att ett program ändrar den aktuella konfigurationen, till exempel språk eller övergripande teckenformat."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"starta om andra program"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Tillåter att ett program framtvingar omstart av andra program."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"tvinga program att avsluta"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Tillåter att ett program tvingar en aktivitet som finns i förgrunden att avsluta och gå tillbaka. Behövs inte för vanliga program."</string>
<string name="permlab_dump" msgid="1681799862438954752">"hämta systemets interna status"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Tillåter att ett program skriver in nya ord i användarordlistan."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"ändra/ta bort innehåll på SD-kortet"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Tillåter att ett program skriver till SD-kortet."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hem"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -486,12 +496,12 @@
<string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ange PIN-kod"</string>
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Fel PIN-kod!"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Tryck på Meny och sedan på 0 om du vill låsa upp."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Tryck på Menu och sedan på 0 om du vill låsa upp."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nödsamtalsnummer"</string>
<string name="lockscreen_carrier_default" msgid="8812714795156374435">"(Ingen tjänst)"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skärmen har låsts."</string>
- <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Meny om du vill låsa upp eller ringa nödsamtal."</string>
- <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Meny om du vill låsa upp."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu om du vill låsa upp eller ringa nödsamtal."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu om du vill låsa upp."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rita grafiskt lösenord för att låsa upp"</string>
<string name="lockscreen_emergency_call" msgid="5347633784401285225">"Nödsamtal"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Logga in"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ogiltigt användarnamn eller lösenord."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrollerar ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås upp"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ljud på"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Ljud av"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
@@ -552,7 +565,7 @@
<string name="open_permission_deny" msgid="5661861460947222274">"Du har inte behörighet att öppna den här sidan."</string>
<string name="text_copied" msgid="4985729524670131385">"Text har kopierats till urklipp."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mer"</string>
- <string name="prepend_shortcut_label" msgid="2572214461676015642">"Meny+"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"utrymme"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"retur"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ta bort"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Tvinga fram en stängning"</string>
<string name="report" msgid="4060218260984795706">"Rapportera"</string>
<string name="wait" msgid="7147118217226317732">"Vänta"</string>
- <string name="debug" msgid="9103374629678531849">"Felsökning"</string>
<string name="sendText" msgid="5132506121645618310">"Välj en åtgärd för text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringvolym"</string>
<string name="volume_music" msgid="5421651157138628171">"Mediavolym"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certifikatsbaserad L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index cae0c03..d7a02bc 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Bir uygulamanın başka bir uygulama için hata ayıklamayı çalıştırmasına izin verir. Kötü amaçlı uygulamalar bu işlevi başka uygulamaları kapatmak için kullanabilir."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"kullanıcı arayüzü ayarlarınızı değiştirin"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Uygulamaların güncel yapılandırmayı; örneğin yerel ayarı veya genel yazı tipi boyutunu değiştirmesine izin verir."</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"diğer uygulamaları yeniden başlat"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"Uygulamaların başka uygulamaları zorla yeniden başlatmasına izin verir."</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"uygulamayı kapanmaya zorla"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Uygulamaların, ön plandaki herhangi bir etkinliği kapanmaya ve arka plana geçmeye zorlamasına izin verir. Normal uygulamalarda hiçbir zaman gerekmemelidir."</string>
<string name="permlab_dump" msgid="1681799862438954752">"sistemin dahili durumunu al"</string>
@@ -311,9 +317,9 @@
<string name="permdesc_flashlight" msgid="6433045942283802309">"Uygulamaların flaş ışığını denetlemesine izin verir."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"donanımı test et"</string>
<string name="permdesc_hardware_test" msgid="3668894686500081699">"Uygulamanın donanım testi için çeşitli çevre birimlerini denetlemesine izin verir."</string>
- <string name="permlab_callPhone" msgid="3925836347681847954">"telefon numaralarını doğrudan ara"</string>
- <string name="permdesc_callPhone" msgid="3369867353692722456">"Uygulamanın müdahaleniz olmadan telefon numaralarını aramasına izin verir. Kötü amaçlı uygulamalar, telefon faturanızda beklenmedik görüşmeler çıkmasına neden olabilir. Bu işlev, uygulamanın acil numara aramasına izin vermez."</string>
- <string name="permlab_callPrivileged" msgid="4198349211108497879">"herhangi bir telefon numarasını doğrudan ara"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"telefon numaralarına doğrudan çağrı yap"</string>
+ <string name="permdesc_callPhone" msgid="3369867353692722456">"Uygulamanın müdahaleniz olmadan telefon numaralarına çağrı yapmasına izin verir. Kötü amaçlı uygulamalar, telefon faturanızda beklenmedik görüşmeler çıkmasına neden olabilir. Bu işlev, uygulamanın acil numaralara çağrı yapmasına izin vermez."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"herhangi bir telefon numarasına doğrudan çağrı yap"</string>
<string name="permdesc_callPrivileged" msgid="244405067160028452">"Uygulamanın, siz müdahale etmeden acil numaralar dahil herhangi bir numarayı aramasına izin verir. Kötü amaçlı uygulamalar acil servisleri gereksiz yere ve yasal olmayan şekilde arayabilir."</string>
<string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"CDMA telefon kurulumunu doğrudan başlat"</string>
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Uygulamaya CDMA hazırlığını başlatma izni verir. Kötü niyetli uygulamalar CDMA hazırlığını gereksiz yere başlatabilir"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Uygulamaların kullanıcı sözlüğüne yeni kelimeler yazmasına izin verir."</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD kart içeriklerini değiştir/sil"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Bir uygulamaya SD karta yazma izni verir."</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Ev"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Oturum aç"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Geçersiz kullanıcı adı veya şifre."</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Kontrol ediliyor..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilit Aç"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sesi aç"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sesi kapat"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string>
@@ -655,7 +668,7 @@
<string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll" msgid="6876518925844129331">"Tümünü seç"</string>
- <string name="selectText" msgid="3889149123626888637">"Metni seç"</string>
+ <string name="selectText" msgid="3889149123626888637">"Metin seç"</string>
<string name="stopSelectingText" msgid="4157931463872320996">"Metin seçmeyi durdur"</string>
<string name="cut" msgid="3092569408438626261">"Kes"</string>
<string name="cutAll" msgid="2436383270024931639">"Tümünü kes"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"Kapanmaya zorla"</string>
<string name="report" msgid="4060218260984795706">"Rapor"</string>
<string name="wait" msgid="7147118217226317732">"Bekle"</string>
- <string name="debug" msgid="9103374629678531849">"Hata ayıkla"</string>
<string name="sendText" msgid="5132506121645618310">"Metin için bir işlem seçin"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Zil sesi düzeyi"</string>
<string name="volume_music" msgid="5421651157138628171">"Medya ses düzeyi"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN temelli sertifika"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 6620a60..3f3549b 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -35,32 +35,32 @@
<string name="serviceRegistered" msgid="6275019082598102493">"注册成功。"</string>
<string name="serviceErased" msgid="1288584695297200972">"清除成功。"</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"密码不正确。"</string>
- <string name="mmiComplete" msgid="8232527495411698359">"MMI 完成。"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI 码已完成。"</string>
<string name="badPin" msgid="5085454289896032547">"您输入的旧 PIN 不正确。"</string>
- <string name="badPuk" msgid="5702522162746042460">"您输入的 PUK 不正确。"</string>
+ <string name="badPuk" msgid="5702522162746042460">"您输入的 PUK 码不正确。"</string>
<string name="mismatchPin" msgid="3695902225843339274">"您输入的 PIN 码不一致。"</string>
- <string name="invalidPin" msgid="3850018445187475377">"输入一个 4 至 8 位数的 PIN。"</string>
- <string name="needPuk" msgid="919668385956251611">"您的 SIM 卡被 PUK 锁定。请输入 PUK 码进行解锁。"</string>
- <string name="needPuk2" msgid="4526033371987193070">"输入 PUK2 以解锁 SIM 卡。"</string>
- <string name="ClipMmi" msgid="6952821216480289285">"来电者信息"</string>
- <string name="ClirMmi" msgid="7784673673446833091">"外拨者信息"</string>
- <string name="CfMmi" msgid="5123218989141573515">"呼叫转接"</string>
- <string name="CwMmi" msgid="9129678056795016867">"呼叫等待"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"输入一个 4 至 8 位数的 PIN 码。"</string>
+ <string name="needPuk" msgid="919668385956251611">"已对 SIM 卡进行 PUK 码锁定。键入 PUK 码将其解锁。"</string>
+ <string name="needPuk2" msgid="4526033371987193070">"输入 PUK2 码以解锁 SIM 卡。"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"来电显示"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"本机号码"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"来电转接"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"来电等待"</string>
<string name="BaMmi" msgid="455193067926770581">"呼叫限制"</string>
<string name="PwdMmi" msgid="7043715687905254199">"密码更改"</string>
<string name="PinMmi" msgid="3113117780361190304">"PIN 码更改"</string>
- <string name="CnipMmi" msgid="3110534680557857162">"来电显示"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"显示号码"</string>
<string name="CnirMmi" msgid="3062102121430548731">"来电显示受限制"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"三方通话"</string>
<string name="RuacMmi" msgid="7827887459138308886">"拒绝不想接听的骚扰电话"</string>
<string name="CndMmi" msgid="3116446237081575808">"主叫号码传送"</string>
<string name="DndMmi" msgid="1265478932418334331">"请勿打扰"</string>
- <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"来电者信息在默认情况下受限制。在下一次通话中:受限制"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"来电者信息在默认情况受限制。在下一次通话中:不受限制"</string>
- <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"来电者信息在默认情况下不受限制。在下一次通话中:受限制"</string>
- <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"来电者信息在默认情况下不受限制。在下一次通话中:不受限制"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"默认不显示本机号码,在下一次通话中也不显示"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"默认不显示本机号码,但在下一次通话中显示"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"默认显示本机号码,但在下一次通话中不显示"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"默认显示本机号码,在下一次通话中也显示"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"未提供服务。"</string>
- <string name="CLIRPermanent" msgid="5460892159398802465">"无法更改来电者信息设置。"</string>
+ <string name="CLIRPermanent" msgid="5460892159398802465">"本机号码显示设置无法更改。"</string>
<string name="RestrictedChangedTitle" msgid="5592189398956187498">"访问受限情况已发生变化"</string>
<string name="RestrictedOnData" msgid="8653794784690065540">"数据服务已禁用。"</string>
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"紧急服务已禁用。"</string>
@@ -72,7 +72,7 @@
<string name="serviceClassSMS" msgid="2015460373701527489">"短信"</string>
<string name="serviceClassDataAsync" msgid="4523454783498551468">"异步"</string>
<string name="serviceClassDataSync" msgid="7530000519646054776">"同步"</string>
- <string name="serviceClassPacket" msgid="6991006557993423453">"封包"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"包"</string>
<string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
<string name="roamingText0" msgid="7170335472198694945">"启用漫游指示符"</string>
<string name="roamingText1" msgid="5314861519752538922">"禁用漫游指示符"</string>
@@ -90,21 +90,21 @@
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜索服务"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒后拨打 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:没有转接"</string>
- <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:没有转接"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒后<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
<string name="fcComplete" msgid="3118848230966886575">"功能代码已拨完。"</string>
<string name="fcError" msgid="3327560126588500777">"出现连接问题或功能代码无效。"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"确定"</string>
- <string name="httpError" msgid="2567300624552921790">"网页包含错误。"</string>
- <string name="httpErrorLookup" msgid="4517085806977851374">"找不到网址。"</string>
+ <string name="httpError" msgid="2567300624552921790">"此网页包含错误。"</string>
+ <string name="httpErrorLookup" msgid="4517085806977851374">"找不到该网址。"</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="2781440683514730227">"不支持此网站身份验证方案。"</string>
<string name="httpErrorAuth" msgid="7293960746955020542">"身份验证失败。"</string>
<string name="httpErrorProxyAuth" msgid="1788207010559081331">"通过代理服务器进行身份验证失败。"</string>
<string name="httpErrorConnect" msgid="7623096283505770433">"未能连接到服务器。"</string>
- <string name="httpErrorIO" msgid="5047872902739125260">"服务器无法通信,请稍后重试。"</string>
+ <string name="httpErrorIO" msgid="5047872902739125260">"服务器无法通讯,请稍后重试。"</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"与服务器的连接超时。"</string>
- <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"网页包含过多服务器重定向。"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"该页面包含太多服务器重定向。"</string>
<string name="httpErrorUnsupportedScheme" msgid="5257172771607996054">"不支持该协议。"</string>
<string name="httpErrorFailedSslHandshake" msgid="3088290300440289771">"无法建立安全连接。"</string>
<string name="httpErrorBadUrl" msgid="6088183159988619736">"网址无效,此网页无法打开。"</string>
@@ -119,111 +119,117 @@
<string name="me" msgid="6545696007631404292">"我"</string>
<string name="power_dialog" msgid="1319919075463988638">"手机选项"</string>
<string name="silent_mode" msgid="7167703389802618663">"静音模式"</string>
- <string name="turn_on_radio" msgid="3912793092339962371">"打开无线电"</string>
- <string name="turn_off_radio" msgid="8198784949987062346">"关闭无线电"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"打开收音机"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"关闭收音机"</string>
<string name="screen_lock" msgid="799094655496098153">"屏幕锁定"</string>
<string name="power_off" msgid="4266614107412865048">"关机"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"正在关机..."</string>
- <string name="shutdown_confirm" msgid="649792175242821353">"您的手机会关闭。"</string>
- <string name="no_recent_tasks" msgid="279702952298056674">"无最近的应用程序。"</string>
+ <string name="shutdown_confirm" msgid="649792175242821353">"您的手机会关机。"</string>
+ <string name="no_recent_tasks" msgid="279702952298056674">"没有最近的应用程序。"</string>
<string name="global_actions" msgid="2406416831541615258">"手机选项"</string>
<string name="global_action_lock" msgid="2844945191792119712">"屏幕锁定"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"关机"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"静音模式"</string>
- <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"已关闭声音"</string>
- <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"已打开声音"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"声音已关闭"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"声音已开启"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飞行模式"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飞行模式已开启"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飞行模式已关闭"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"已开启飞行模式"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"已关闭飞行模式"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系统"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"需要您付费的服务"</string>
<string name="permgroupdesc_costMoney" msgid="8193824940620517189">"允许应用程序执行可能需要您付费的操作。"</string>
- <string name="permgrouplab_messages" msgid="7521249148445456662">"您的消息"</string>
- <string name="permgroupdesc_messages" msgid="7045736972019211994">"读/写短信、电子邮件和其他消息。"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"您的信息"</string>
+ <string name="permgroupdesc_messages" msgid="7045736972019211994">"读写短信、电子邮件和其他信息。"</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"您的个人信息"</string>
<string name="permgroupdesc_personalInfo" msgid="5488050357388806068">"直接访问手机上存储的联系人和日历。"</string>
<string name="permgrouplab_location" msgid="635149742436692049">"您的位置"</string>
<string name="permgroupdesc_location" msgid="2430258821648348660">"监视您的物理位置"</string>
- <string name="permgrouplab_network" msgid="5808983377727109831">"网络通信"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"网络通讯"</string>
<string name="permgroupdesc_network" msgid="5035763698958415998">"允许应用程序访问各种网络功能。"</string>
<string name="permgrouplab_accounts" msgid="3359646291125325519">"您的帐户"</string>
<string name="permgroupdesc_accounts" msgid="4948732641827091312">"访问可用的帐户。"</string>
- <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"硬件控制"</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"硬件控件"</string>
<string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"直接访问手机上的硬件。"</string>
<string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"手机通话"</string>
- <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"监视、记录和处理电话。"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"监管、记录和处理电话呼叫。"</string>
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"系统工具"</string>
- <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"对系统的低级别访问和控制。"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"对系统进行低级访问和控制。"</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"开发工具"</string>
- <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"只有应用程序开发人员需要这些功能。"</string>
+ <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"只有应用程序开发人员才会用到的功能。"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"存储"</string>
<string name="permgroupdesc_storage" msgid="9203302214915355774">"访问 SD 卡。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或修改状态栏"</string>
- <string name="permdesc_statusBar" msgid="1365473595331989732">"允许应用程序停用状态栏,或者添加和删除系统图标。"</string>
- <string name="permlab_expandStatusBar" msgid="1148198785937489264">"展开/折叠状态栏"</string>
- <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"允许应用程序展开或折叠状态栏。"</string>
+ <string name="permdesc_statusBar" msgid="1365473595331989732">"允许应用程序停用状态栏或者增删系统图标。"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"展开/收拢状态栏"</string>
+ <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"允许应用程序展开或收拢状态栏。"</string>
<string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"拦截外拨电话"</string>
- <string name="permdesc_processOutgoingCalls" msgid="2228988201852654461">"允许应用程序处理外拨电话和更改要拨打的号码。恶意应用程序可借此监视、重定向或阻止外拨电话。"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="2228988201852654461">"允许应用程序处理外拨电话或更改要拨打的号码。恶意应用程序可能会借此监视、另行转接甚至阻止外拨电话。"</string>
<string name="permlab_receiveSms" msgid="2697628268086208535">"接收短信"</string>
<string name="permdesc_receiveSms" msgid="6298292335965966117">"允许应用程序接收和处理短信。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。"</string>
<string name="permlab_receiveMms" msgid="8894700916188083287">"接收彩信"</string>
<string name="permdesc_receiveMms" msgid="4563346832000174373">"允许应用程序接收和处理彩信。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。"</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"发送短信"</string>
- <string name="permdesc_sendSms" msgid="1946540351763502120">"允许应用程序发送短信。恶意应用程序可借此不经您的确认发送信息来让您付费。"</string>
+ <string name="permdesc_sendSms" msgid="1946540351763502120">"允许应用程序发送短信。恶意应用程序可能会不经您的确认就发送信息,给您带来费用。"</string>
<string name="permlab_readSms" msgid="4085333708122372256">"读取短信或彩信"</string>
<string name="permdesc_readSms" msgid="3002170087197294591">"允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可借此读取您的机密信息。"</string>
<string name="permlab_writeSms" msgid="6881122575154940744">"编辑短信或彩信"</string>
<string name="permdesc_writeSms" msgid="6299398896177548095">"允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可借此删除您的信息。"</string>
<string name="permlab_receiveWapPush" msgid="8258226427716551388">"接收 WAP"</string>
- <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"允许应用程序接收和处理 WAP 消息。恶意应用程序可借此监视您的消息,或者将消息删除而不向您显示。"</string>
+ <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"允许应用程序接收和处理 WAP 信息。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。"</string>
<string name="permlab_getTasks" msgid="5005277531132573353">"检索当前运行的应用程序"</string>
- <string name="permdesc_getTasks" msgid="7048711358713443341">"允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可借此发现有关其他应用程序的私有信息。"</string>
+ <string name="permdesc_getTasks" msgid="7048711358713443341">"允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可借此发现有关其他应用程序的保密信息。"</string>
<string name="permlab_reorderTasks" msgid="5669588525059921549">"对正在运行的应用程序重新排序"</string>
- <string name="permdesc_reorderTasks" msgid="126252774270522835">"允许应用程序将任务移至前台和后台。恶意应用程序可借此强行进到前台,而不受您的控制。"</string>
+ <string name="permdesc_reorderTasks" msgid="126252774270522835">"允许应用程序将任务移至前端和后台。恶意应用程序可借此强行进入前端,而不受您的控制。"</string>
<string name="permlab_setDebugApp" msgid="4339730312925176742">"启用应用程序调试"</string>
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"允许应用程序启动对其他应用程序的调试。恶意应用程序可借此终止其他应用程序。"</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"更改用户界面设置"</string>
- <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"允许应用程序更改当前配置,例如语言区域或整体字号。"</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"重新启动其他应用程序"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"允许应用程序强行重新启动其他应用程序。"</string>
- <string name="permlab_forceBack" msgid="1804196839880393631">"强行关闭应用程序"</string>
- <string name="permdesc_forceBack" msgid="6534109744159919013">"允许应用程序强行关闭前台中的任何活动并返回。普通应用程序从不需要使用此权限。"</string>
+ <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"允许应用程序更改当前配置,例如语言设置或整体的字体大小。"</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
+ <string name="permlab_forceBack" msgid="1804196839880393631">"强制应用程序关闭"</string>
+ <string name="permdesc_forceBack" msgid="6534109744159919013">"允许应用程序强制前端的任何活动关闭并重新开始。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_dump" msgid="1681799862438954752">"检索系统内部状态"</string>
- <string name="permdesc_dump" msgid="2198776174276275220">"允许应用程序检索系统的内部状态。恶意应用程序可借此检索它们通常并不需要的各种私有信息和安全信息。"</string>
+ <string name="permdesc_dump" msgid="2198776174276275220">"允许应用程序检索系统的内部状态。恶意应用程序可借此检索它们本不需要的各种保密信息和安全信息。"</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"部分关机"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"使活动管理器进入关闭状态。不执行彻底关机。"</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"禁止切换应用程序"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"禁止用户切换到另一应用程序。"</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"监控所有应用程序的启动"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"允许应用程序监控系统启动活动的方式。恶意应用程序可借此彻底损坏系统。这一权限只在开发过程中需要,普通的手机操作不需要。"</string>
- <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"发送已删除包的广播"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"允许应用程序广播已删除应用程序包的通知。恶意应用程序可借此终止任何正在运行的其他应用程序。"</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"发送可通过短信接收的广播"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"允许应用程序监控系统启动活动的方式。恶意应用程序可借此彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"发送包删除的广播"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"允许应用程序广播已删除某应用程序包的通知。恶意应用程序可借此终止任何正在运行的其他应用程序。"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"发送短信收到的广播"</string>
<string name="permdesc_broadcastSmsReceived" msgid="9122419277306740155">"允许应用程序广播已收到短信的通知。恶意应用程序可借此伪造收到的短信。"</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"发送 WAP 一键接收广播"</string>
- <string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"允许应用程序广播收到 WAP 一键信息的通知。恶意应用程序可借此乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"发送 WAP-PUSH 收到的广播"</string>
+ <string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"允许应用程序播报收到 WAP PUSH 消息的通知。恶意应用程序可能会借此乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"限制运行的进程个数"</string>
- <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"允许应用程序控制将运行的最大进程数。普通应用程序从不需要使用此权限。"</string>
+ <string name="permdesc_setProcessLimit" msgid="7824786028557379539">"允许应用程序控制将运行的进程数上限。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"关闭所有后台应用程序"</string>
<string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"允许应用程序控制活动是否始终是一转至后台就完成。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"修改电池统计信息"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"允许修改收集的电池使用情况统计信息。普通应用程序不能使用此权限。"</string>
<string name="permlab_backup" msgid="470013022865453920">"控制系统备份和还原"</string>
- <string name="permdesc_backup" msgid="4837493065154256525">"允许应用程序控制系统的备份和还原机制。不适用于普通应用程序。"</string>
+ <string name="permdesc_backup" msgid="4837493065154256525">"允许应用程序控制系统的备份和还原机制。普通应用程序不能使用此权限。"</string>
<string name="permlab_backup_data" msgid="4057625941707926463">"备份与还原应用程序数据"</string>
<string name="permdesc_backup_data" msgid="8274426305151227766">"允许应用程序参与系统的备份和还原机制。"</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"显示未授权的窗口"</string>
- <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允许创建专供内部系统用户界面使用的窗口。普通应用程序不能使用此权限。"</string>
+ <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。"</string>
<string name="permlab_systemAlertWindow" msgid="3372321942941168324">"显示系统级警报"</string>
<string name="permdesc_systemAlertWindow" msgid="5109622689323490558">"允许应用程序显示系统警报窗口。恶意应用程序可借此掌控整个手机屏幕。"</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"修改全局动画速度"</string>
<string name="permdesc_setAnimationScale" msgid="7181522138912391988">"允许应用程序随时更改全局动画速度(加快或放慢动画)。"</string>
<string name="permlab_manageAppTokens" msgid="17124341698093865">"管理应用程序令牌"</string>
- <string name="permdesc_manageAppTokens" msgid="977127907524195988">"允许应用程序创建和管理自己的令牌,从而绕开正常的 Z 方向排序。普通应用程序从不需要使用此权限。"</string>
+ <string name="permdesc_manageAppTokens" msgid="977127907524195988">"允许应用程序创建和管理自己的令牌,从而绕开其常规的 Z 方向。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"按键和控制按钮"</string>
<string name="permdesc_injectEvents" msgid="3946098050410874715">"允许应用程序将其自己的输入活动(按键等)提供给其他应用程序。恶意应用程序可借此掌控手机。"</string>
- <string name="permlab_readInputState" msgid="469428900041249234">"记录您输入的内容和采取的操作"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"记录您键入的内容和执行的操作"</string>
<string name="permdesc_readInputState" msgid="5132879321450325445">"允许应用程序查看您按的键,即使在与其他应用程序交互(例如输入密码)时也不例外。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"绑定至输入法"</string>
<string name="permdesc_bindInputMethod" msgid="3734838321027317228">"允许手机用户绑定至输入法的顶级界面。普通应用程序从不需要使用此权限。"</string>
@@ -232,33 +238,33 @@
<string name="permlab_setOrientation" msgid="3365947717163866844">"更改屏幕显示方向"</string>
<string name="permdesc_setOrientation" msgid="6335814461615851863">"允许应用程序随时更改屏幕的旋转方向。普通应用程序从不需要使用此权限。"</string>
<string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"向应用程序发送 Linux 信号"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"允许应用程序请求将提供的信号发送给所有持续的进程。"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"允许应用程序请求将所提供的信号发送给所有持久进程。"</string>
<string name="permlab_persistentActivity" msgid="8659652042401085862">"让应用程序始终运行"</string>
<string name="permdesc_persistentActivity" msgid="5037199778265006008">"允许应用程序部分持续运行,这样系统便不能将其用于其他应用程序。"</string>
<string name="permlab_deletePackages" msgid="3343439331576348805">"删除应用程序"</string>
<string name="permdesc_deletePackages" msgid="3634943677518723314">"允许应用程序删除 Android 包。恶意应用程序可借此删除重要的应用程序。"</string>
<string name="permlab_clearAppUserData" msgid="2192134353540277878">"删除其他应用程序的数据"</string>
<string name="permdesc_clearAppUserData" msgid="7546345080434325456">"允许应用程序清除用户数据。"</string>
- <string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"删除其他应用程序缓存"</string>
+ <string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"删除其他应用程序的缓存"</string>
<string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"允许应用程序删除缓存文件。"</string>
<string name="permlab_getPackageSize" msgid="4799785352306641460">"计算应用程序存储空间"</string>
<string name="permdesc_getPackageSize" msgid="5557253039670753437">"允许应用程序检索其代码、数据和缓存大小"</string>
<string name="permlab_installPackages" msgid="335800214119051089">"直接安装应用程序"</string>
- <string name="permdesc_installPackages" msgid="526669220850066132">"允许应用程序安装新的或更新的 Android 包。恶意应用程序可借此添加具有极大权限的新应用程序。"</string>
+ <string name="permdesc_installPackages" msgid="526669220850066132">"允许应用程序安装全新的或更新的 Android 包。恶意应用程序可能会借此添加其具有任意权限的新应用程序。"</string>
<string name="permlab_clearAppCache" msgid="4747698311163766540">"删除所有应用程序缓存数据"</string>
- <string name="permdesc_clearAppCache" msgid="7740465694193671402">"允许应用程序通过删除应用程序缓存目录中的文件释放手机内存。通常严格限制访问系统进程。"</string>
+ <string name="permdesc_clearAppCache" msgid="7740465694193671402">"允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。通常此权限只适用于系统进程。"</string>
<string name="permlab_readLogs" msgid="4811921703882532070">"读取系统日志文件"</string>
- <string name="permdesc_readLogs" msgid="2257937955580475902">"允许应用程序读取系统的各日志文件。这样应用程序可以发现有关您操作手机的一般信息,但这些信息不应包含任何个人信息或私有信息。"</string>
+ <string name="permdesc_readLogs" msgid="2257937955580475902">"允许应用程序从系统的各日志文件中读取信息。这样应用程序可以发现您的手机使用情况,但这些信息不应包含任何个人信息或保密信息。"</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"读取/写入诊断所拥有的资源"</string>
- <string name="permdesc_diagnostic" msgid="3121238373951637049">"允许应用程序读取/写入诊断组所拥有的任何资源;例如,/dev 中的文件。这可能会影响系统稳定性和安全性。此权限只应由制造商或运营商用于硬件特定的诊断。"</string>
+ <string name="permdesc_diagnostic" msgid="3121238373951637049">"允许应用程序读取/写入诊断组所拥有的任何资源(例如,/dev 中的文件)。这可能会影响系统稳定性和安全性。此权限仅供制造商或运营商诊断硬件问题。"</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"启用或停用应用程序组件"</string>
<string name="permdesc_changeComponentState" msgid="4569107043246700630">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可借此停用重要的手机功能。使用此权限时务必谨慎,因为这可能导致应用程序组件进入不可用、不一致或不稳定的状态。"</string>
<string name="permlab_setPreferredApplications" msgid="3393305202145172005">"设置首选应用程序"</string>
- <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"允许应用程序修改首选的应用程序。这样恶意应用程序可能会暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的私有数据。"</string>
+ <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"允许应用程序修改首选的应用程序。这样恶意应用程序可能会暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的保密数据。"</string>
<string name="permlab_writeSettings" msgid="1365523497395143704">"修改全局系统设置"</string>
- <string name="permdesc_writeSettings" msgid="838789419871034696">"允许应用程序修改系统的设置数据。恶意应用程序可借此破坏您的系统配置。"</string>
+ <string name="permdesc_writeSettings" msgid="838789419871034696">"允许应用程序修改系统设置方面的数据。恶意应用程序可借此破坏您的系统配置。"</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"修改安全系统设置"</string>
- <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"允许应用程序修改系统的安全设置数据。不适用于普通应用程序。"</string>
+ <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"允许应用程序修改系统的安全设置数据。普通应用程序不能使用此权限。"</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"修改 Google 服务地图"</string>
<string name="permdesc_writeGservices" msgid="6602362746516676175">"允许应用程序修改 Google 服务地图。普通应用程序不能使用此权限。"</string>
<string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"开机时自动启动"</string>
@@ -269,40 +275,40 @@
<string name="permdesc_readContacts" msgid="3371591512896545975">"允许应用程序读取您手机上存储的所有联系人(地址)数据。恶意应用程序可借此将您的数据发送给其他人。"</string>
<string name="permlab_writeContacts" msgid="644616215860933284">"写入联系数据"</string>
<string name="permdesc_writeContacts" msgid="3924383579108183601">"允许应用程序修改您手机上存储的联系人(地址)数据。恶意应用程序可借此清除或修改您的联系人数据。"</string>
- <string name="permlab_writeOwnerData" msgid="4892555913849295393">"写入拥有者数据"</string>
- <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"允许应用程序修改您手机上存储的手机拥有者数据。恶意应用程序可借此清除或修改拥有者数据。"</string>
- <string name="permlab_readOwnerData" msgid="6668525984731523563">"读取拥有者数据"</string>
- <string name="permdesc_readOwnerData" msgid="3088486383128434507">"允许应用程序读取您手机上存储的手机拥有者数据。恶意应用程序可借此读取手机拥有者数据。"</string>
+ <string name="permlab_writeOwnerData" msgid="4892555913849295393">"写入所有者数据"</string>
+ <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"允许应用程序修改您手机上存储的手机所有者数据。恶意应用程序可借此清除或修改所有者数据。"</string>
+ <string name="permlab_readOwnerData" msgid="6668525984731523563">"读取所有者数据"</string>
+ <string name="permdesc_readOwnerData" msgid="3088486383128434507">"允许应用程序读取您手机上存储的手机所有者数据。恶意应用程序可借此读取手机所有者数据。"</string>
<string name="permlab_readCalendar" msgid="3728905909383989370">"读取日历数据"</string>
<string name="permdesc_readCalendar" msgid="5533029139652095734">"允许应用程序读取您手机上存储的所有日历活动。恶意应用程序可借此将您的日历活动发送给其他人。"</string>
<string name="permlab_writeCalendar" msgid="377926474603567214">"写入日历数据"</string>
<string name="permdesc_writeCalendar" msgid="8674240662630003173">"允许应用程序修改您手机上存储的日历活动。恶意应用程序可借此清除或修改您的日历数据。"</string>
- <string name="permlab_accessMockLocation" msgid="8688334974036823330">"禁止使用位置来源进行测试"</string>
- <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"创建用于测试的模拟位置源。恶意应用程序可借此替代真正的位置源(如 GPS 或网络提供商)返回的位置和/或状态。"</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"访问更多位置提供者的命令"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"访问额外的位置提供程序命令。恶意应用程序可借此干扰 GPS 或其他位置源的运作。"</string>
- <string name="permlab_installLocationProvider" msgid="6578101199825193873">"安装位置信息提供程序"</string>
- <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"创建用于测试的模拟地点信息源。恶意应用程序可借此覆盖真正的地点信息源(如 GPS 或网络提供商)返回的地点和/或状态,或者监视您的地点并向外部信息源报告。"</string>
- <string name="permlab_accessFineLocation" msgid="8116127007541369477">"精准位置 (GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"访问精准的位置源,例如手机上的全球定位系统(如果适用)。恶意应用程序可能借此确定您所处的位置,并消耗额外的电池电量。"</string>
- <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"粗略位置(以网络为基础)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可借此确定您所处的大体位置。"</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"使用模拟地点来源进行测试"</string>
+ <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"创建模拟地点来源进行测试。恶意应用程序可能利用此选项覆盖由真实地点来源(如 GPS 或网络提供商)传回的地点和/或状态。"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"访问额外的位置信息提供程序命令"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"访问额外的位置信息提供程序命令。恶意应用程序可借此干扰 GPS 或其他位置源的正常工作。"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"允许安装位置信息提供程序"</string>
+ <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"创建模拟地点来源进行测试。恶意应用程序可能利用此选项覆盖由真实地点来源(如 GPS 或网络提供商)所传回的地点和/或状态,或者监视您的位置并将其提供给外部来源。"</string>
+ <string name="permlab_accessFineLocation" msgid="8116127007541369477">"精准的(GPS)位置"</string>
+ <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会借此确定您所处的位置,并可能消耗额外的电池电量。"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"(基于网络的)粗略位置"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="8235655958070862293">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果可以)。恶意应用程序可借此确定您所处的大体位置。"</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"访问 SurfaceFlinger"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"允许应用程序使用 SurfaceFlinger 低级别功能。"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"读取帧缓冲区"</string>
<string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"允许应用程序读取帧缓冲区中的内容。"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"更改您的音频设置"</string>
- <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"允许应用程序修改全局音频设置,如音量和路由。"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"允许应用程序修改整个系统的音频设置,如音量和路由。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"录音"</string>
<string name="permdesc_recordAudio" msgid="6493228261176552356">"允许应用程序访问录音路径。"</string>
<string name="permlab_camera" msgid="8059288807274039014">"拍照"</string>
- <string name="permdesc_camera" msgid="9013476258810982546">"允许应用程序使用相机拍照。此权限允许应用程序随时收集相机看到的图片。"</string>
+ <string name="permdesc_camera" msgid="9013476258810982546">"允许应用程序使用相机拍照,这样应用程序可随时收集进入相机镜头的图像。"</string>
<string name="permlab_brick" msgid="8337817093326370537">"永久停用手机"</string>
<string name="permdesc_brick" msgid="5569526552607599221">"允许应用程序永久停用整个手机,这非常危险。"</string>
<string name="permlab_reboot" msgid="2898560872462638242">"强行重新启动手机"</string>
<string name="permdesc_reboot" msgid="7914933292815491782">"允许应用程序强行重新启动手机。"</string>
- <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"安装和卸载文件系统"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"允许应用程序安装和卸载可移动存储器的文件系统。"</string>
+ <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"装载和卸载文件系统"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"允许应用程序装载和卸载可移动存储器的文件系统。"</string>
<string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"格式化外部存储设备"</string>
<string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"允许应用程序格式化可移除的存储设备。"</string>
<string name="permlab_vibrate" msgid="7768356019980849603">"控制振动器"</string>
@@ -310,21 +316,21 @@
<string name="permlab_flashlight" msgid="2155920810121984215">"控制闪光灯"</string>
<string name="permdesc_flashlight" msgid="6433045942283802309">"允许应用程序控制闪光灯。"</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"测试硬件"</string>
- <string name="permdesc_hardware_test" msgid="3668894686500081699">"允许应用程序控制各种用于硬件测试的外围设备。"</string>
+ <string name="permdesc_hardware_test" msgid="3668894686500081699">"允许应用程序控制各外围设备以进行硬件测试。"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"直接拨打电话号码"</string>
- <string name="permdesc_callPhone" msgid="3369867353692722456">"允许应用程序在无人操作的情况下拨打电话。恶意应用程序可借此在您的话费单上产生意外通话费。请注意,此权限不允许应用程序拨打紧急电话。"</string>
+ <string name="permdesc_callPhone" msgid="3369867353692722456">"允许应用程序在您不介入的情况下拨打电话。恶意应用程序可借此在您的话费单上产生意外通话费。请注意,此权限不允许应用程序拨打紧急呼救电话。"</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"直接呼叫任何电话号码"</string>
- <string name="permdesc_callPrivileged" msgid="244405067160028452">"允许应用程序在无人操作的情况下拨打任何电话(包括紧急电话)。恶意应用程序可借此向紧急服务拨打骚扰电话和非法电话。"</string>
+ <string name="permdesc_callPrivileged" msgid="244405067160028452">"允许应用程序在您不介入的情况下拨打任何电话(包括紧急呼救)。恶意应用程序可借此向应急服务机构拨打骚扰电话甚至非法电话。"</string>
<string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"直接启动 CDMA 电话设置"</string>
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"允许应用程序启动 CDMA 服务。恶意应用程序可能会无端启动 CDMA 服务"</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"控制位置更新通知"</string>
- <string name="permdesc_locationUpdates" msgid="2300018303720930256">"允许启用/停用收音机的位置更新通知。普通应用程序不能使用此权限。"</string>
+ <string name="permdesc_locationUpdates" msgid="2300018303720930256">"允许启用/停用来自收音机的位置更新通知。普通应用程序不能使用此权限。"</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"访问检入属性"</string>
<string name="permdesc_checkinProperties" msgid="7150307006141883832">"允许对检入服务上传的属性进行读/写访问。普通应用程序不能使用此权限。"</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"选择窗口小部件"</string>
- <string name="permdesc_bindGadget" msgid="2098697834497452046">"允许应用程序告诉系统哪个应用程序可以使用哪些窗口小部件。具有该权限的应用程序可以允许其他应用程序访问个人数据。普通应用程序不适合使用此权限。"</string>
+ <string name="permdesc_bindGadget" msgid="2098697834497452046">"允许应用程序告诉系统哪个应用程序可以使用哪些窗口小部件。具有该权限的应用程序可以允许其他应用程序访问个人数据。普通应用程序不能使用此权限。"</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"修改手机状态"</string>
- <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"允许应用程序控制设备的手机功能。具有此权限的应用程序可切换网络、打开和关闭手机收音机等,而不通知您。"</string>
+ <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"允许应用程序控制设备的电话功能。拥有此权限的应用程序可自行切换网络、打开和关闭无线通信等,而不会通知您。"</string>
<string name="permlab_readPhoneState" msgid="2326172951448691631">"读取手机状态和身份"</string>
<string name="permdesc_readPhoneState" msgid="188877305147626781">"允许应用程序访问设备的手机功能。有此权限的应用程序可确定此手机的号码和序列号,是否正在通话,以及对方的号码等。"</string>
<string name="permlab_wakeLock" msgid="573480187941496130">"防止手机休眠"</string>
@@ -332,13 +338,13 @@
<string name="permlab_devicePower" msgid="4928622470980943206">"开机或关机"</string>
<string name="permdesc_devicePower" msgid="4577331933252444818">"允许应用程序打开或关闭手机。"</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"在出厂测试模式下运行"</string>
- <string name="permdesc_factoryTest" msgid="8136644990319244802">"作为低级别制造商测试运行,以允许完全访问手机硬件。此权限只有当手机在制造商测试模式下运行时才可用。"</string>
+ <string name="permdesc_factoryTest" msgid="8136644990319244802">"作为一项低级制造商测试来运行,从而允许对手机硬件进行完全访问。此权限仅当手机在制造商测试模式下运行时才可用。。"</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"设置壁纸"</string>
<string name="permdesc_setWallpaper" msgid="6417041752170585837">"允许应用程序设置系统壁纸。"</string>
- <string name="permlab_setWallpaperHints" msgid="3600721069353106851">"设置壁纸大小提示"</string>
- <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"允许应用程序设置系统壁纸大小提示。"</string>
- <string name="permlab_masterClear" msgid="2315750423139697397">"将系统重置为出厂时的默认设置"</string>
- <string name="permdesc_masterClear" msgid="5033465107545174514">"允许应用程序将系统完全重置为出厂设置,即清除所有数据、配置和安装的应用程序。"</string>
+ <string name="permlab_setWallpaperHints" msgid="3600721069353106851">"设置有关壁纸大小的提示"</string>
+ <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"允许应用程序设置有关壁纸大小的提示。"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"将系统恢复为出厂设置"</string>
+ <string name="permdesc_masterClear" msgid="5033465107545174514">"允许应用程序将系统恢复为出厂设置,即清除所有数据、配置以及所安装的应用程序。"</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"设置时区"</string>
<string name="permdesc_setTimeZone" msgid="1902540227418179364">"允许应用程序更改手机的时区。"</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"作为 AccountManagerService"</string>
@@ -353,12 +359,12 @@
<string name="permdesc_useCredentials" msgid="7416570544619546974">"允许应用程序请求身份验证标记。"</string>
<string name="permlab_accessNetworkState" msgid="6865575199464405769">"查看网络状态"</string>
<string name="permdesc_accessNetworkState" msgid="558721128707712766">"允许应用程序查看所有网络的状态。"</string>
- <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"完全访问互联网"</string>
+ <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"完全的互联网访问权限"</string>
<string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"允许应用程序创建网络套接字。"</string>
- <string name="permlab_writeApnSettings" msgid="7823599210086622545">"写入接入点名称设置"</string>
+ <string name="permlab_writeApnSettings" msgid="7823599210086622545">"写入“接入点名称”设置"</string>
<string name="permdesc_writeApnSettings" msgid="7443433457842966680">"允许应用程序修改 APN 设置,例如任何 APN 的代理和端口。"</string>
- <string name="permlab_changeNetworkState" msgid="958884291454327309">"更改网络连接"</string>
- <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"允许应用程序更改网络连接状态。"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"更改网络连接性"</string>
+ <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"允许应用程序更改状态网络连接性。"</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"更改背景数据使用设置"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允许应用程序更改背景数据使用设置。"</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"查看 Wi-Fi 状态"</string>
@@ -368,15 +374,15 @@
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"允许接收 Wi-Fi 多播"</string>
<string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"允许应用程序接收并非直接向您的设备发送的数据包。这样在查找附近提供的服务时很有用。这种操作所耗电量大于非多播模式。"</string>
<string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"蓝牙管理"</string>
- <string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"允许应用程序配置本地蓝牙手机,以及查找远程设备并与之配对。"</string>
+ <string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"允许应用程序配置本地蓝牙手机,以及发现远程设备并与其配对。"</string>
<string name="permlab_bluetooth" msgid="8361038707857018732">"创建蓝牙连接"</string>
- <string name="permdesc_bluetooth" msgid="762515380679392945">"允许应用程序查看本地蓝牙手机的配置,以及建立和接受与配对设备的连接。"</string>
+ <string name="permdesc_bluetooth" msgid="762515380679392945">"允许应用程序查看本地蓝牙手机的配置,以及建立或接受与配对设备的连接。"</string>
<string name="permlab_disableKeyguard" msgid="4977406164311535092">"停用键锁"</string>
- <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"允许应用程序停用键锁和任何关联的密码安全设置。这种情况的一个恰当示例就是这样一个手机:在接听来电时停用键锁,在通话结束后重新启用键锁。"</string>
+ <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"允许应用程序停用键锁和任何关联的密码安全设置。例如,在手机上接听电话时停用键锁,在通话结束后重新启用键锁。"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string>
- <string name="permdesc_readSyncSettings" msgid="5315925706353341823">"允许应用程序读取同步设置,例如是否针对联系人启用同步。"</string>
+ <string name="permdesc_readSyncSettings" msgid="5315925706353341823">"允许应用程序读取同步设置,例如是否为“联系人”启用同步。"</string>
<string name="permlab_writeSyncSettings" msgid="6297138566442486462">"写入同步设置"</string>
- <string name="permdesc_writeSyncSettings" msgid="2498201614431360044">"允许应用程序修改同步设置,例如是否针对联系人启用同步。"</string>
+ <string name="permdesc_writeSyncSettings" msgid="2498201614431360044">"允许应用程序修改同步设置,例如是否为“联系人”启用同步。"</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"读取同步统计信息"</string>
<string name="permdesc_readSyncStats" msgid="7511448343374465000">"允许应用程序读取同步统计信息;例如已发生的同步历史记录。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"读取订阅的供稿"</string>
@@ -389,21 +395,25 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"允许应用程序向用户词典中写入新词。"</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"修改/删除 SD 卡内容"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"允许应用程序写入 SD 卡。"</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
- <item msgid="8901098336658710359">"住宅电话"</item>
+ <item msgid="8901098336658710359">"住宅"</item>
<item msgid="869923650527136615">"手机"</item>
<item msgid="7897544654242874543">"单位电话"</item>
<item msgid="1103601433382158155">"单位传真"</item>
<item msgid="1735177144948329370">"住宅传真"</item>
<item msgid="603878674477207394">"寻呼机"</item>
- <item msgid="1650824275177931637">"其他电话"</item>
- <item msgid="9192514806975898961">"自定义电话"</item>
+ <item msgid="1650824275177931637">"其他"</item>
+ <item msgid="9192514806975898961">"自定义"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"主要邮箱"</item>
- <item msgid="7084237356602625604">"单位邮箱"</item>
- <item msgid="1112044410659011023">"其他邮箱"</item>
- <item msgid="2374913952870110618">"自定义邮箱"</item>
+ <item msgid="8073994352956129127">"家庭"</item>
+ <item msgid="7084237356602625604">"单位"</item>
+ <item msgid="1112044410659011023">"其他"</item>
+ <item msgid="2374913952870110618">"自定义"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="6880257626740047286">"住宅"</item>
@@ -412,15 +422,15 @@
<item msgid="4932682847595299369">"自定义"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"住宅聊天工具"</item>
- <item msgid="1359644565647383708">"单位聊天工具"</item>
- <item msgid="7868549401053615677">"其他聊天工具"</item>
- <item msgid="3145118944639869809">"自定义聊天工具"</item>
+ <item msgid="1738585194601476694">"住宅"</item>
+ <item msgid="1359644565647383708">"单位"</item>
+ <item msgid="7868549401053615677">"其他"</item>
+ <item msgid="3145118944639869809">"自定义"</item>
</string-array>
<string-array name="organizationTypes">
<item msgid="7546335612189115615">"单位"</item>
- <item msgid="4378074129049520373">"其他组织"</item>
- <item msgid="3455047468583965104">"自定义组织"</item>
+ <item msgid="4378074129049520373">"其他"</item>
+ <item msgid="3455047468583965104">"自定义"</item>
</string-array>
<string-array name="imProtocols">
<item msgid="8595261363518459565">"AIM"</item>
@@ -487,13 +497,13 @@
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"输入 PIN 码"</string>
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 码不正确!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"要解锁,请先按 MENU 再按 0。"</string>
- <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"紧急电话号码"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"急救或报警电话"</string>
<string name="lockscreen_carrier_default" msgid="8812714795156374435">"(无服务)"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"屏幕已锁定。"</string>
- <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按 MENU 解锁或拨打紧急电话。"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按 Menu 解锁或进行紧急呼救。"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按 MENU 解锁。"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"绘制解锁图案"</string>
- <string name="lockscreen_emergency_call" msgid="5347633784401285225">"紧急呼叫"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"紧急呼救"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"正确!"</string>
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"很抱歉,请重试"</string>
<string name="lockscreen_plugged_in" msgid="613343852842944435">"正在充电 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -504,36 +514,39 @@
<string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"手机中无 SIM 卡"</string>
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"请插入 SIM 卡"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"网络已锁定"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 卡被 PUK 锁定"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 卡已用 PUK 码锁定"</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"请参阅《用户指南》或联系客服人员。"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM 卡被锁定"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"正在解锁 SIM 卡..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" msgid="3351013842320127827">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统会要求您使用自己的 Google 登录信息解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次绘错了自己的解锁图案。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" msgid="3351013842320127827">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次绘错了自己的解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统会要求您使用自己的 Google 登录信息解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"忘记了图案?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"帐户解锁"</string>
- <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"图案尝试次数过多!"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"图案尝试次数太多!"</string>
<string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"要解除锁定,请使用您的 Google 帐户登录"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"用户名(电子邮件)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"密码"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"登录"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"用户名或密码无效。"</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"正在检查..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"解锁"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"打开声音"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"关闭声音"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="AMPM">%P</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="AMPM">%p</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
- <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
<string name="battery_status_text_percent_format" msgid="7660311274698797147">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="battery_status_charging" msgid="756617993998772213">"正在充电..."</string>
<string name="battery_low_title" msgid="7923774589611311406">"请连接充电器"</string>
- <string name="battery_low_subtitle" msgid="7388781709819722764">"电量在减少:"</string>
+ <string name="battery_low_subtitle" msgid="7388781709819722764">"电量所剩不多:"</string>
<string name="battery_low_percent_format" msgid="696154104579022959">"电量剩余 <xliff:g id="NUMBER">%d%%</xliff:g> 或更少。"</string>
<string name="battery_low_why" msgid="7279169609518386372">"电量使用情况"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"出厂测试失败"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"只有 /system/app 中安装的包支持 FACTORY_TEST 操作。"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"只有在 /system/app 中安装的包支持 FACTORY_TEST 操作。"</string>
<string name="factorytest_no_action" msgid="872991874799998561">"未发现支持 FACTORY_TEST 操作的包。"</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"重新启动"</string>
<string name="js_dialog_title" msgid="8143918455087008109">"“<xliff:g id="TITLE">%s</xliff:g>”处的页面表明:"</string>
@@ -546,11 +559,11 @@
<string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"写入浏览器的历史记录和书签"</string>
<string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"允许应用程序修改存储在手机中的浏览器历史记录或书签。恶意应用程序可借此清除或修改浏览器数据。"</string>
<string name="save_password_message" msgid="767344687139195790">"是否希望浏览器记住此密码?"</string>
- <string name="save_password_notnow" msgid="6389675316706699758">"此时不保存密码"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"暂不保存"</string>
<string name="save_password_remember" msgid="6491879678996749466">"记住"</string>
<string name="save_password_never" msgid="8274330296785855105">"从不"</string>
<string name="open_permission_deny" msgid="5661861460947222274">"您无权打开此网页。"</string>
- <string name="text_copied" msgid="4985729524670131385">"文字已复制到剪贴板。"</string>
+ <string name="text_copied" msgid="4985729524670131385">"文本已复制到剪贴板。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"MENU+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"空格"</string>
@@ -666,8 +679,8 @@
<string name="inputMethod" msgid="1653630062304567879">"输入法"</string>
<string name="addToDictionary" msgid="8793624991686948709">"将“<xliff:g id="WORD">%s</xliff:g>”添加到词典"</string>
<string name="editTextMenuTitle" msgid="1672989176958581452">"编辑文字"</string>
- <string name="low_internal_storage_view_title" msgid="1399732408701697546">"空间不足"</string>
- <string name="low_internal_storage_view_text" msgid="635106544616378836">"手机内存空间正在减少。"</string>
+ <string name="low_internal_storage_view_title" msgid="1399732408701697546">"存储空间不足"</string>
+ <string name="low_internal_storage_view_text" msgid="635106544616378836">"手机内存空间所剩不多了。"</string>
<string name="ok" msgid="5970060430562524910">"确定"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="yes" msgid="5362982303337969312">"确定"</string>
@@ -677,25 +690,24 @@
<string name="capital_off" msgid="6815870386972805832">"关闭"</string>
<string name="whichApplication" msgid="4533185947064773386">"使用以下方式发送"</string>
<string name="alwaysUse" msgid="4583018368000610438">"默认使用此方式发送。"</string>
- <string name="clearDefaultHintMsg" msgid="4815455344600932173">"清除“主屏幕设置”>“应用程序”>“管理应用程序”中的默认设置。"</string>
+ <string name="clearDefaultHintMsg" msgid="4815455344600932173">"通过主屏幕上的“设置”>“应用程序”>“管理应用程序”清除默认设置。"</string>
<string name="chooseActivity" msgid="1009246475582238425">"选择一项操作"</string>
<string name="noApplications" msgid="1691104391758345586">"没有应用程序可执行此操作。"</string>
<string name="aerr_title" msgid="653922989522758100">"很抱歉!"</string>
- <string name="aerr_application" msgid="4683614104336409186">"<xliff:g id="APPLICATION">%1$s</xliff:g>应用程序(<xliff:g id="PROCESS">%2$s</xliff:g> 进程)意外停止,请重试。"</string>
- <string name="aerr_process" msgid="1551785535966089511">"<xliff:g id="PROCESS">%1$s</xliff:g> 进程意外停止,请重试。"</string>
+ <string name="aerr_application" msgid="4683614104336409186">"“<xliff:g id="APPLICATION">%1$s</xliff:g>”应用程序(在“<xliff:g id="PROCESS">%2$s</xliff:g>”进程中)意外停止,请重试。"</string>
+ <string name="aerr_process" msgid="1551785535966089511">"“<xliff:g id="PROCESS">%1$s</xliff:g>”进程意外停止,请重试。"</string>
<string name="anr_title" msgid="3100070910664756057">"很抱歉!"</string>
- <string name="anr_activity_application" msgid="3538242413112507636">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动(在<xliff:g id="APPLICATION">%2$s</xliff:g>应用程序中)无响应。"</string>
- <string name="anr_activity_process" msgid="5420826626009561014">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动(在 <xliff:g id="PROCESS">%2$s</xliff:g> 进程中)无响应。"</string>
- <string name="anr_application_process" msgid="4185842666452210193">"<xliff:g id="APPLICATION">%1$s</xliff:g>应用程序(在 <xliff:g id="PROCESS">%2$s</xliff:g> 进程中)无响应。"</string>
- <string name="anr_process" msgid="1246866008169975783">"<xliff:g id="PROCESS">%1$s</xliff:g> 进程无响应。"</string>
+ <string name="anr_activity_application" msgid="3538242413112507636">"“<xliff:g id="ACTIVITY">%1$s</xliff:g>”活动(在“<xliff:g id="APPLICATION">%2$s</xliff:g>”应用程序中)无响应。"</string>
+ <string name="anr_activity_process" msgid="5420826626009561014">"“<xliff:g id="ACTIVITY">%1$s</xliff:g>”活动(在“<xliff:g id="PROCESS">%2$s</xliff:g>”进程中)无响应。"</string>
+ <string name="anr_application_process" msgid="4185842666452210193">"“<xliff:g id="APPLICATION">%1$s</xliff:g>”应用程序(在“<xliff:g id="PROCESS">%2$s</xliff:g>”进程中)无响应。"</string>
+ <string name="anr_process" msgid="1246866008169975783">"“<xliff:g id="PROCESS">%1$s</xliff:g>”进程无响应。"</string>
<string name="force_close" msgid="3653416315450806396">"强行关闭"</string>
<string name="report" msgid="4060218260984795706">"报告"</string>
<string name="wait" msgid="7147118217226317732">"等待"</string>
- <string name="debug" msgid="9103374629678531849">"调试"</string>
<string name="sendText" msgid="5132506121645618310">"选择要对文字执行的操作"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"铃声音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒体音量"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"通过蓝牙播放"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"正通过蓝牙播放"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"选择的是静音铃声"</string>
<string name="volume_call" msgid="3941680041282788711">"通话音量"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"使用蓝牙时的通话音量"</string>
@@ -728,12 +740,12 @@
<string name="perms_show_all" msgid="2671791163933091180"><b>"全部显示"</b></string>
<string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"正在载入..."</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB 已连接"</string>
- <string name="usb_storage_message" msgid="2759542180575016871">"您已通过 USB 将手机连接至计算机。如果要在计算机和手机的 SD 卡之间复制文件,请选择“安装”。"</string>
- <string name="usb_storage_button_mount" msgid="8063426289195405456">"安装"</string>
- <string name="usb_storage_button_unmount" msgid="6092146330053864766">"不安装"</string>
+ <string name="usb_storage_message" msgid="2759542180575016871">"已通过 USB 连接与计算机。若要在计算机和手机 SD 卡之间复制文件,请选择“装载”。"</string>
+ <string name="usb_storage_button_mount" msgid="8063426289195405456">"装载"</string>
+ <string name="usb_storage_button_unmount" msgid="6092146330053864766">"不装载"</string>
<string name="usb_storage_error_message" msgid="2534784751603345363">"使用 SD 卡进行 USB 存储时出现问题。"</string>
<string name="usb_storage_notification_title" msgid="8175892554757216525">"USB 已连接"</string>
- <string name="usb_storage_notification_message" msgid="7380082404288219341">"选择将文件复制到计算机/从计算机复制到存储设备。"</string>
+ <string name="usb_storage_notification_message" msgid="7380082404288219341">"选择将文件复制到计算机或从计算机复制到存储设备。"</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"关闭 USB 存储设备"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"选中以关闭 USB 存储设备。"</string>
<string name="usb_storage_stop_title" msgid="6014127947456185321">"关闭 USB 存储设备"</string>
@@ -742,7 +754,7 @@
<string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"取消"</string>
<string name="usb_storage_stop_error_message" msgid="3746037090369246731">"关闭 USB 存储设备时遇到问题。请检查是否卸载了 USB 主设备,然后重试。"</string>
<string name="extmedia_format_title" msgid="8663247929551095854">"格式化 SD 卡"</string>
- <string name="extmedia_format_message" msgid="3621369962433523619">"您确定要格式化 SD 卡?卡上的所有数据都会丢失。"</string>
+ <string name="extmedia_format_message" msgid="3621369962433523619">"确定要将 SD 卡格式化吗?该卡上的所有数据都将丢失。"</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接 USB 调试"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"选择停用 USB 调试。"</string>
@@ -753,15 +765,15 @@
<string name="ext_media_checking_notification_title" msgid="5457603418970994050">"正在准备 SD 卡"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"正在检查是否有错误。"</string>
<string name="ext_media_nofs_notification_title" msgid="780477838241212997">"空 SD 卡"</string>
- <string name="ext_media_nofs_notification_message" msgid="3817704088027829380">"SD 卡是空的或其文件系统不受支持。"</string>
+ <string name="ext_media_nofs_notification_message" msgid="3817704088027829380">"SD 卡无文件系统,或文件系统不受支持。"</string>
<string name="ext_media_unmountable_notification_title" msgid="6410723906019100189">"SD 卡受损"</string>
- <string name="ext_media_unmountable_notification_message" msgid="6902531775948238989">"SD 卡已损坏。可能必须重新格式化。"</string>
- <string name="ext_media_badremoval_notification_title" msgid="6872152882604407837">"SD 卡被意外拔除"</string>
- <string name="ext_media_badremoval_notification_message" msgid="7260183293747448241">"先卸载 SD 卡再拔除,以避免数据丢失。"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="6902531775948238989">"SD 卡已损坏。您可能必须将其重新格式化。"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="6872152882604407837">"SD 卡未正常移除"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="7260183293747448241">"请先卸载 SD 卡,再将其移除,以防数据丢失。"</string>
<string name="ext_media_safe_unmount_notification_title" msgid="6729801130790616200">"SD 卡已安全移除"</string>
- <string name="ext_media_safe_unmount_notification_message" msgid="568841278138377604">"可安全地取出 SD 卡。"</string>
+ <string name="ext_media_safe_unmount_notification_message" msgid="568841278138377604">"您现在可以安全移除 SD 卡。"</string>
<string name="ext_media_nomedia_notification_title" msgid="8902518030404381318">"已移除 SD 卡"</string>
- <string name="ext_media_nomedia_notification_message" msgid="3870120652983659641">"SD 卡已取出。请插入另一 SD 卡。"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="3870120652983659641">"SD 卡已移除。请插入新的 SD 卡。"</string>
<string name="activity_list_empty" msgid="4168820609403385789">"找不到匹配的活动"</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"更新组件使用情况统计"</string>
<string name="permdesc_pkgUsageStats" msgid="891553695716752835">"允许修改收集的组件使用情况统计。普通应用程序不能使用此权限。"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"基于证书的 L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index b9f344e..ee31333 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -185,8 +185,14 @@
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"允許應用程式為其他程式開啟偵錯功能。請注意:惡意程式可利用此功能終止其他應用程式。"</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"變更介面設定"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"允許應用程式變更目前設定,例如:地區設定或字型大小。"</string>
- <string name="permlab_restartPackages" msgid="2386396847203622628">"重新啟動其他應用程式"</string>
- <string name="permdesc_restartPackages" msgid="1076364837492936814">"允許應用程式強制重新啟動其他應用程式。"</string>
+ <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
+ <skip />
+ <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
+ <skip />
+ <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
+ <skip />
<string name="permlab_forceBack" msgid="1804196839880393631">"強制關閉應用程式"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"允許應用程式強制關閉在前端運作的活動並返回。一般應用程式不需要此功能。"</string>
<string name="permlab_dump" msgid="1681799862438954752">"接收系統內部狀態"</string>
@@ -389,6 +395,10 @@
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"允許應用程式將新字詞寫入使用者的字典。"</string>
<string name="permlab_sdcardWrite" msgid="8079403759001777291">"修改/刪除 SD 卡的內容"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"允許應用程式寫入 SD 卡。"</string>
+ <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
+ <skip />
+ <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"住家電話"</item>
<item msgid="869923650527136615">"行動電話"</item>
@@ -520,6 +530,9 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"登入"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"使用者名稱或密碼錯誤。"</string>
<string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"檢查中..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"解除封鎖"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"開啟音效"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"關閉音效"</string>
<string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
@@ -691,7 +704,6 @@
<string name="force_close" msgid="3653416315450806396">"強制關閉"</string>
<string name="report" msgid="4060218260984795706">"回報"</string>
<string name="wait" msgid="7147118217226317732">"等待"</string>
- <string name="debug" msgid="9103374629678531849">"偵錯"</string>
<string name="sendText" msgid="5132506121645618310">"訊息傳送方式"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"鈴聲音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒體音量"</string>
@@ -770,7 +782,7 @@
<string name="ime_action_go" msgid="8320845651737369027">"開始"</string>
<string name="ime_action_search" msgid="658110271822807811">"搜尋"</string>
<string name="ime_action_send" msgid="2316166556349314424">"傳送"</string>
- <string name="ime_action_next" msgid="3138843904009813834">"下一步"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"下一頁"</string>
<string name="ime_action_done" msgid="8971516117910934605">"完成"</string>
<string name="ime_action_default" msgid="2840921885558045721">"執行"</string>
<string name="dial_number_using" msgid="5789176425167573586">"使用 <xliff:g id="NUMBER">%s</xliff:g>"\n"撥號"</string>
@@ -798,4 +810,8 @@
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"採用憑證的 L2TP/IPSec VPN"</string>
<!-- no translation found for upload_file (2897957172366730416) -->
<skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 0b605ed..8dadd88 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1394,8 +1394,10 @@
be a dimension (such as "12dip") for a constant width or one of
the special constants. -->
<attr name="layout_width" format="dimension">
- <!-- The view should be as big as its parent (minus padding). -->
+ <!-- {@deprecated Use match_parent instead.} -->
<enum name="fill_parent" value="-1" />
+ <!-- The view should be as big as its parent (minus padding). -->
+ <enum name="match_parent" value="-1" />
<!-- The view should be only big enough to enclose its content (plus padding). -->
<enum name="wrap_content" value="-2" />
</attr>
@@ -1405,8 +1407,10 @@
be a dimension (such as "12dip") for a constant height or one of
the special constants. -->
<attr name="layout_height" format="dimension">
- <!-- The view should be as big as its parent (minus padding). -->
+ <!-- {@deprecated Use match_parent instead.} -->
<enum name="fill_parent" value="-1" />
+ <!-- The view should be as big as its parent (minus padding). -->
+ <enum name="match_parent" value="-1" />
<!-- The view should be only big enough to enclose its content (plus padding). -->
<enum name="wrap_content" value="-2" />
</attr>
@@ -2110,22 +2114,26 @@
is used. -->
<attr name="dropDownAnchor" format="reference" />
<!-- Specifies the basic width of the dropdown. Its value may
- be a dimension (such as "12dip") for a constant width, fill_parent
- to fill the width of the screen, or wrap_content to match the width
+ be a dimension (such as "12dip") for a constant width, match_parent
+ to match the width of the screen, or wrap_content to match the width
of the anchored view. -->
<attr name="dropDownWidth" format="dimension">
- <!-- The dropdown should fill the width of the screen. -->
+ <!-- {@deprecated Use match_parent instead.} -->
<enum name="fill_parent" value="-1" />
+ <!-- The dropdown should fit the width of the screen. -->
+ <enum name="match_parent" value="-1" />
<!-- The dropdown should fit the width of its anchor. -->
<enum name="wrap_content" value="-2" />
</attr>
<!-- Specifies the basic width of the dropdown. Its value may
- be a dimension (such as "12dip") for a constant width, fill_parent
+ be a dimension (such as "12dip") for a constant width, match_parent
to fill the width of the screen, or wrap_content to match the height of
the content of the drop down. -->
<attr name="dropDownHeight" format="dimension">
- <!-- The dropdown should fill the width of the screen. -->
+ <!-- {@deprecated Use match_parent instead.} -->
<enum name="fill_parent" value="-1" />
+ <!-- The dropdown should fill the width of the screen. -->
+ <enum name="match_parent" value="-1" />
<!-- The dropdown should fit the width of its anchor. -->
<enum name="wrap_content" value="-2" />
</attr>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 62529f1..c6ef3a0 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -78,7 +78,14 @@
turned on by default unless explicitly set to false
by applications. -->
<attr name="allowClearUserData" format="boolean" />
-
+
+ <!-- Option to let applications specify that user data should
+ never be encrypted if an Encrypted File System solution
+ is enabled. Specifically, this is an "opt-out" feature, meaning
+ that, by default, user data will be encrypted if the EFS feature
+ is enabled.-->
+ <attr name="neverEncrypt" format="boolean" />
+
<!-- Option to indicate this application is only for testing purposes.
For example, it may expose functionality or data outside of itself
that would cause a security hole, but is useful for testing. This
@@ -671,6 +678,7 @@
<attr name="allowBackup" />
<attr name="killAfterRestore" />
<attr name="restoreNeedsApplication" />
+ <attr name="neverEncrypt" />
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0b6f97e..cc54ba3 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -46,26 +46,30 @@
<!-- XXXXX NOTE THE FOLLOWING RESOURCES USE THE WRONG NAMING CONVENTION.
Please don't copy them, copy anything else. -->
-
- <!-- This string array should be overridden by the device to present a list of network attributes. This is used by the connectivity manager to decide which networks can coexist based on the hardward -->
- <!-- An Array of "[type-name],[associated radio-name],[priority] -->
+
+ <!-- This string array should be overridden by the device to present a list of network
+ attributes. This is used by the connectivity manager to decide which networks can coexist
+ based on the hardware -->
+ <!-- An Array of "[Connection name],[ConnectivityManager connection type],
+ [associated radio-type],[priority] -->
<string-array translatable="false" name="networkAttributes">
- <item>"default,wifi,0"</item>
- <item>"default,mobile,0"</item>
- <item>"mms,mobile,1"</item>
- <item>"supl,mobile,1"</item>
- <item>"dun,mobile,1"</item>
- <item>"hipri,mobile,2"</item>
+ <item>"wifi,1,1,1"</item>
+ <item>"mobile,0,0,0"</item>
+ <item>"mobile_mms,2,0,2"</item>
+ <item>"mobile_supl,3,0,2"</item>
+ <item>"mobile_hipri,5,0,3"</item>
</string-array>
- <!-- This string array should be overridden by the device to present a list of radio attributes. This is used by the connectivity manager to decide which networks can coexist based on the hardware -->
- <!-- An Array of "[radio-name],[priority] -->
- <!-- [# simultaneous connection types]" -->
+ <!-- This string array should be overridden by the device to present a list of radio
+ attributes. This is used by the connectivity manager to decide which networks can coexist
+ based on the hardware -->
+ <!-- An Array of "[ConnectivityManager connectionType],
+ [# simultaneous connection types]" -->
<string-array translatable="false" name="radioAttributes">
- <item>"wifi,1,1"</item>
- <item>"mobile,0,1"</item>
+ <item>"1,1"</item>
+ <item>"0,1"</item>
</string-array>
-
+
<!-- Flag indicating whether the keyguard should be bypassed when
the slider is open. This can be set or unset depending how easily
the slider can be opened (for example, in a pocket or purse). -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 80d1cea..bd4a3eb 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1220,7 +1220,13 @@
Resources added in version 8 of the platform (Eclair MR2).
=============================================================== -->
<eat-comment />
-
+
<public type="attr" name="expandableListViewWhiteStyle" id="0x010102b6" />
+<!-- ===============================================================
+ Resources proposed for Flan.
+ =============================================================== -->
+ <eat-comment />
+ <public type="attr" name="neverEncrypt" id="0x010102b7" />
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index bc354c5..539db83 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -462,10 +462,17 @@
size.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_restartPackages">restart other applications</string>
+ <string name="permlab_killBackgroundProcesses">kill background processes</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_restartPackages">Allows an application to
- forcibly restart other applications.</string>
+ <string name="permdesc_killBackgroundProcesses">Allows an application to
+ kill background processes of other applications, even if memory
+ isn\'t low.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_forceStopPackages">force stop other applications</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_forceStopPackages">Allows an application to
+ forcibly stop other applications.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_forceBack">force application to close</string>
@@ -1139,6 +1146,11 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_sdcardWrite">Allows an application to write to the SD card.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_cache_filesystem">access the cache filesystem</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_cache_filesystem">Allows an application to read and write the cache filesystem.</string>
+
<!-- The order of these is important, don't reorder without changing Contacts.java --> <skip />
<!-- Phone number types from android.provider.Contacts. This could be used when adding a new phone number for a contact, for example. -->
<string-array name="phoneTypes">
@@ -1313,10 +1325,14 @@
<!-- Attbution of a contact status update, when the time of update is known -->
<string name="contact_status_update_attribution_with_date"><xliff:g id="date" example="3 hours ago">%1$s</xliff:g> via <xliff:g id="source" example="Google Talk">%2$s</xliff:g></string>
- <!-- Instructions telling the user to enter their pin to unlock the keyguard.
+ <!-- Instructions telling the user to enter their SIM PIN to unlock the keyguard.
Displayed in one line in a large font. -->
<string name="keyguard_password_enter_pin_code">Enter PIN code</string>
+ <!-- Instructions telling the user to enter their PIN password to unlock the keyguard.
+ Displayed in one line in a large font. -->
+ <string name="keyguard_password_enter_password_code">Enter password to unlock</string>
+
<!-- Instructions telling the user that they entered the wrong pin while trying
to unlock the keyguard. Displayed in one line in a large font. -->
<string name="keyguard_password_wrong_pin_code">Incorrect PIN code!</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index b155769..58e9f45 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -101,6 +101,7 @@
<!-- Standard animations for a non-full-screen window or activity. -->
<style name="Animation.LockScreen">
+ <item name="windowEnterAnimation">@anim/lock_screen_enter</item>
<item name="windowExitAnimation">@anim/lock_screen_exit</item>
</style>
@@ -370,7 +371,7 @@
<style name="Widget.TextView.ListSeparator">
<item name="android:background">@android:drawable/dark_header_dither</item>
- <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">25dip</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">?textColorSecondary</item>
diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd
index 2c255a99..398d863 100644
--- a/docs/html/guide/appendix/api-levels.jd
+++ b/docs/html/guide/appendix/api-levels.jd
@@ -6,7 +6,7 @@
<h2>In this document</h2>
<ol>
- <li><a href="intro">What is API Level?</a></li>
+ <li><a href="#intro">What is API Level?</a></li>
<li><a href="#uses">Uses of API Level in Android</a></li>
<li><a href="#considerations">Development Considerations</a>
<ol>
@@ -83,6 +83,7 @@
<table>
<tr><th>Platform Version</th><th>API Level</th></tr>
+ <tr><td>Android 2.1</td><td>7</td></tr>
<tr><td>Android 2.0.1</td><td>6</td></tr>
<tr><td>Android 2.0</td><td>5</td></tr>
<tr><td>Android 1.6</td><td>4</td></tr>
diff --git a/docs/html/guide/appendix/app-intents.jd b/docs/html/guide/appendix/app-intents.jd
index 102183b..110196c 100644
--- a/docs/html/guide/appendix/app-intents.jd
+++ b/docs/html/guide/appendix/app-intents.jd
@@ -97,7 +97,7 @@
the fisheye lens effect that would be present if a 90 degree horizontal
FOV was used in portrait mode.</td></tr>
<tr><td>mapZoom</td><td>The map zoom of the map location associated with this panorama. This value is passed on to the
- Maps activity when the Street View "Go to Maps" menu item is chosen. It corresponds to the <em>z</em> paramaeter in
+ Maps activity when the Street View "Go to Maps" menu item is chosen. It corresponds to the <em>z</em> parameter in
the geo: intent.</td></tr>
</table>
</td>
diff --git a/docs/html/guide/appendix/faq/commontasks.jd b/docs/html/guide/appendix/faq/commontasks.jd
index e88a867..38a89ef 100644
--- a/docs/html/guide/appendix/faq/commontasks.jd
+++ b/docs/html/guide/appendix/faq/commontasks.jd
@@ -160,11 +160,9 @@
<li>Create an {@link android.app.AlertDialog app.AlertDialog} class </li>
<li>Set the {@link android.R.style#Theme_Dialog} <em>theme</em> attribute to <code>@android:style/Theme.Dialog</code>
in your AndroidManifest.xml file. For example:
-</ul>
-<blockquote>
<pre><activity class="AddRssItem" android:label="Add an item" android:theme="@android:style/Theme.Dialog"/>
-</pre>
-</blockquote>
+</pre></li>
+</ul>
<p>Calling startActivity() or startActivityForResult() will open a new screen in whatever
way it defines itself (if it uses a floating theme it will be floating,
otherwise it will be full screen). </p>
@@ -328,7 +326,7 @@
<p>The listening classes, called broadcast receivers, extend {@link android.content.BroadcastReceiver
BroadcastReceiver}. If you want Android to instantiate the object whenever an appropriate
intent notification is sent, define the receiver with a <code><receiver></code> element
- in the AndroidManifext.xml file. If the caller is expected to instantiate the
+ in the AndroidManifest.xml file. If the caller is expected to instantiate the
object in preparation to receive a message, this is not required. The receiver
will get a call to their {@link android.content.BroadcastReceiver#onReceive(android.content.Context,android.content.Intent)
BroadcastReceiver.onReceive()} method. A receiver can define an <code><intent-filter></code> tag
@@ -468,7 +466,7 @@
};
-private void IncomingMotherInlawCall(Connection c) {
+private void IncomingMotherInLawCall(Connection c) {
String Text;
// "Answer" callback.
@@ -486,7 +484,7 @@
new AlertDialog.Builder(this)
.setMessage("Phyllis is calling")
.setPositiveButton("Answer", acceptMsg)
- .setOnCanceListener(new OnCancelListener() {
+ .setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
rejectMsg.sendToTarget();
}});
diff --git a/docs/html/guide/appendix/faq/troubleshooting.jd b/docs/html/guide/appendix/faq/troubleshooting.jd
old mode 100644
new mode 100755
index 0cf1ab0..86ab187
--- a/docs/html/guide/appendix/faq/troubleshooting.jd
+++ b/docs/html/guide/appendix/faq/troubleshooting.jd
@@ -22,7 +22,10 @@
<li><a href="#eclipse">Eclipse isn't talking to the emulator</a></li>
<li><a href="#majorminor">When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported major.minor version 49.0.</a></li>
<li><a href="#apidemosreinstall">I can't install ApiDemos apps in my IDE because of a signing error</a></li>
+ <li><a href="#gesturebuilderinstall">I can't install the GestureBuilder sample
+app in the emulator</a></li>
<li><a href="#signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</a></li>
+ <li><a href="#manifestfiles">Unable to view manifest files from within Eclipse</a></li>
</ul>
<a name="installeclipsecomponents" id="installeclipsecomponents"></a><h2>ADT Installation Error: "requires plug-in org.eclipse.wst.sse.ui".</h2>
@@ -201,17 +204,17 @@
If you want to modify or run one of the ApiDemos apps from Eclipse/ADT or other IDE, you can do so
so only after you uninstall the <em>preinstalled</em> version of the app from the emulator. If
-you try to run an ApiDemos apps from your IDE without removing the preinstalled version first,
-you will get errors similar to: </p>
+you try to run an ApiDemos app from your IDE without removing the preinstalled version first,
+you will get errors similar to these: </p>
<pre>[2008-08-13 15:14:15 - ApiDemos] Re-installation failed due to different application signatures.
[2008-08-13 15:14:15 - ApiDemos] You must perform a full uninstall of the application. WARNING: ...This will remove the application data!
[2008-08-13 15:14:15 - ApiDemos] Please execute 'adb uninstall com.android.samples' in a shell.</pre>
<p>The error occurs because, in this case, you are attempting to install another copy of ApiDemos
-onto the emulator, a copy that is signed with a different certificate (the Android IDE tools will
+onto the emulator, a copy that is signed with a different certificate. (The Android IDE tools will
have signed the app with a debug certificate, where the existing version was already signed with
-a private certificate). The system does not allow this type of reinstallation. </p>
+a private certificate.) The system does not allow this type of reinstallation. </p>
<p>To resolve the issue, you need to fully uninstall the preinstalled and then reinstall it using
the adb tool. Here's how to do that:</p>
@@ -233,6 +236,55 @@
<p>For more information about adb, see the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a>
documentation.</p>
+<h2 id="gesturebuilderinstall">I can't install the GestureBuilder sample
+app in the emulator</a></h2>
+
+<p>This is similar to the ApiDemos problem described above, except that
+you cannot fix it by uninstalling GestureBuilder from the emulator. The
+GestureBuilder app cannot be uninstalled because it is currently installed
+within the system files themselves.</p>
+
+<p><strong>Symptoms</strong></p>
+
+<ul><li><p>You cannot run GestureBuilder in the emulator:</p>
+
+<pre>[2009-12-10 14:57:19 - GestureBuilderActivity]Re-installation failed due to different application signatures.
+[2009-12-10 14:57:19 - GestureBuilderActivity]You must perform a full uninstall of the application. WARNING: This will remove the application data!
+[2009-12-10 14:57:19 - GestureBuilderActivity]Please execute 'adb uninstall com.android.gesture.builder' in a shell.</pre>
+</li>
+
+<li><p>Running <code>adb uninstall com.android.gesture.builder</code> fails:</p>
+<pre>$ adb uninstall com.android.gesture.builder
+ Failure</pre>
+</li></ul>
+
+<p>For now, the work-around is to change the sample's package name
+so that the system can install it as a new app rather than as a
+replacement for the existing GestureBuilder app. To change the
+package name, open the manifest file and modify the package attribute
+of the manifest element. Next, update imports and other references to
+the package name, rebuild the app, and run it in an AVD.</p>
+
+<p>For example, here's how you could do this in Eclipse:</p>
+
+<ol>
+ <li>Right-click on the package name
+(<code>src/com.android.gesture.builder</code>).</li>
+ <li>Select <strong>Refactor > Rename</strong> and change the name, for example to
+<code>com.android.gestureNEW.builder</code>. </li>
+ <li>Open the manifest file. Inside the <code><manifest></code>
+tag, change the package name to
+<code>com.android.gestureNEW.builder</code>.</li>
+ <li>Open each of the two Activity files and do Ctrl-Shift-O to add
+missing import packages, then save each file.</li>
+<li>Run the GestureBuilder application on the emulator.</li>
+</ol>
+
+<p>If you get an error message such as "Could not load /sdcard/gestures.
+Make sure you have a mounted SD card," be sure that your target AVD has an
+SD card. To create an AVD that has an SD card, use the
+<a href="{@docRoot}guide/developing/tools/avd.html#options"><code>-c</code>
+option</a> in the <code>android create avd</code> command.</p>
<h2 id="signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</h2>
@@ -259,3 +311,25 @@
<p>For general information about signing Android applications, see
<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>. </p>
+<h2 id="manifestfiles">Unable to view manifest files from within
+Eclipse</a></h2>
+
+<p>When you try to open an application's manifest file from within
+Eclipse, you might get an error such as this one:</p>
+<pre>An error has occurred. See error log for more details.
+org.eclipse.wst.sse.ui.StructuredTextEditor.isBlockSelectionModeEnabled()Z</pre>
+
+<p>Try reverting to the 3.0 version of the Eclipse XML Editors and
+Tools. If this does not work, remove the 3.1 version of the tool. To do
+this in Eclipse 3.4:</p>
+
+<ol>
+ <li>Select <strong>Help > Software Updates...</strong></li>
+ <li>Select the <strong>Installed Software</strong> tab.</li>
+ <li>Select <strong>Eclipse XML Editors and Tools</strong>.</li>
+ <li>Click <strong>Uninstall</strong>.</li>
+ <li>Click <strong>Finish</strong>.</li>
+</ol>
+
+<p>When you restart Eclipse, you should be able to view the manifest
+files. </p>
diff --git a/docs/html/guide/appendix/g-app-intents.jd b/docs/html/guide/appendix/g-app-intents.jd
index d4f97c8..2846859 100644
--- a/docs/html/guide/appendix/g-app-intents.jd
+++ b/docs/html/guide/appendix/g-app-intents.jd
@@ -103,7 +103,7 @@
effect that would be present if a 90 degree horizontal FOV was used in portrait
mode.</td></tr>
<tr><td><em>mapZoom</em></td><td>The map zoom of the map location associated with this panorama. This value is passed on to the
- Maps activity when the Street View "Go to Maps" menu item is chosen. It corresponds to the <em>z</em> paramaeter in
+ Maps activity when the Street View "Go to Maps" menu item is chosen. It corresponds to the <em>z</em> parameter in
the geo: intent.</td></tr>
</table>
</td>
diff --git a/docs/html/guide/appendix/glossary.jd b/docs/html/guide/appendix/glossary.jd
index ef81631..97669ba 100644
--- a/docs/html/guide/appendix/glossary.jd
+++ b/docs/html/guide/appendix/glossary.jd
@@ -167,7 +167,7 @@
<dd>An XML file that each application must define, to describe the
application's package name, version, components (activities, intent
filters, services), imported libraries, and describes the various
- activies, and so on. See <a
+ activities, and so on. See <a
href="{@docRoot}guide/topics/manifest/manifest-intro.html">The
AndroidManifest.xml File</a> for complete information.</dd>
diff --git a/docs/html/guide/basics/what-is-android.jd b/docs/html/guide/basics/what-is-android.jd
index 668e62e..9393fab 100644
--- a/docs/html/guide/basics/what-is-android.jd
+++ b/docs/html/guide/basics/what-is-android.jd
@@ -64,7 +64,7 @@
<p>Underlying all applications is a set of services and systems, including:
<ul>
<li>A rich and extensible set of <a
- href="{@docRoot}guide/tutorials/views/index.html">Views</a> that can be used to
+ href="{@docRoot}resources/tutorials/views/index.html">Views</a> that can be used to
build an application, including lists, grids, text boxes, buttons, and even
an embeddable web browser</li>
<li><a href="{@docRoot}guide/topics/providers/content-providers.html">Content
@@ -80,7 +80,7 @@
</ul>
<p>For more details and a walkthrough of an application, see the <a
-href="{@docRoot}guide/tutorials/notepad/index.html">Notepad Tutorial</a>.</p>
+href="{@docRoot}resources/tutorials/notepad/index.html">Notepad Tutorial</a>.</p>
<a name="libraries" id="libraries"></a>
<h2>Libraries</h2>
diff --git a/docs/html/guide/developing/debug-tasks.jd b/docs/html/guide/developing/debug-tasks.jd
index 6b7c27a..3279741 100644
--- a/docs/html/guide/developing/debug-tasks.jd
+++ b/docs/html/guide/developing/debug-tasks.jd
@@ -60,7 +60,7 @@
that expose useful information such as CPU usage and frame rate. See <a href="#additionaldebugging">Debug
and Test Settings on the Emulator</a> below. </li>
</ul>
-<p>Also, see the <a href="{@docRoot}guide/appendix/faq/troubleshooting.html">Troubleshooting</a> section
+<p>Also, see the <a href="{@docRoot}resources/faq/troubleshooting.html">Troubleshooting</a> section
of the doc to figure out why your application isn't appearing on the emulator,
or why it's not starting. </p>
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index 667aa9f..c01745e 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -27,7 +27,7 @@
<ul>
<li>It gives you access to other Android development tools from inside the Eclipse IDE. For
example, ADT lets you access the many capabilities of the DDMS tool: take screenshots, manage
-port-forwarding, set breakpoints, and view thread and process informationd irectly from Eclipse.</li>
+port-forwarding, set breakpoints, and view thread and process information directly from Eclipse.</li>
<li>It provides a New Project Wizard, which helps you quickly create and set up all of the
basic files you'll need for a new Android application.</li>
<li>It automates and simplifies the process of building your Android application.</li>
@@ -145,7 +145,7 @@
<p>If you will be running your applications only on actual device hardware, you do not
need an AVD — see
<a href="{@docRoot}guide/developing/device.html">Developing On a Device</a> for information
-on running your applicaiton.</p>
+on running your application.</p>
<h3 id="CreatingAnAvd">Creating an AVD</h3>
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index 2080873..d043a7d 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -239,7 +239,7 @@
<p class="note"><strong>Note:</strong> When installing JDK on Windows, the default is to install
in the "Program Files" directory. This location will cause <code>ant</code> to fail, because of
the space. To fix the problem, you can specify the JAVA_HOME variable like this:
-<code>set JAVA_HOME=c:\Prora~1\Java\<jdkdir></code>. The easiest solution, however, is to
+<code>set JAVA_HOME=c:\Progra~1\Java\<jdkdir></code>. The easiest solution, however, is to
install JDK in a non-space directory, for example: <code>c:\java\jdk1.6.0_02</code>.</p>
diff --git a/docs/html/guide/developing/tools/adb.jd b/docs/html/guide/developing/tools/adb.jd
index e8c726f..04eed8e 100644
--- a/docs/html/guide/developing/tools/adb.jd
+++ b/docs/html/guide/developing/tools/adb.jd
@@ -83,18 +83,18 @@
<p>The server then sets up connections to all running emulator/device instances. It locates emulator/device instances by scanning odd-numbered ports in the range 5555 to 5585, the range used by emulators/devices. Where the server finds an adb daemon, it sets up a connection to that port. Note that each emulator/device instance acquires a pair of sequential ports — an even-numbered port for console connections and an odd-numbered port for adb connections. For example: </p>
-<blockquote>
+<p style="margin-left:2em">
Emulator 1, console: 5554<br/>
Emulator 1, adb: 5555<br>
Emulator 2, console: 5556<br>
Emulator 2, adb: 5557 ...
-</blockquote>
+</p>
<p>As shown, the emulator instance connected to adb on port 5555 is the same as the instance whose console listens on port 5554. </p>
<p>Once the server has set up connections to all emulator instances, you can use adb commands to control and access those instances. Because the server manages connections to emulator/device instances and handles commands from multiple adb clients, you can control any emulator/device instance from any client (or from a script).</p>
-<p>The sections below describe the commands that you can use to access adb capabilities and manage the state of an emulator/device. Note that if you are developing Android applications in Eclipse and have installed the ADT plugin, you do not need to access adb from the command line. The ADT plugin provides a trasparent integration of adb into the Eclipse IDE. However, you can still use adb directly as necessary, such as for debugging.</p>
+<p>The sections below describe the commands that you can use to access adb capabilities and manage the state of an emulator/device. Note that if you are developing Android applications in Eclipse and have installed the ADT plugin, you do not need to access adb from the command line. The ADT plugin provides a transparent integration of adb into the Eclipse IDE. However, you can still use adb directly as necessary, such as for debugging.</p>
<a name="issuingcommands"></a>
diff --git a/docs/html/guide/developing/tools/adt.jd b/docs/html/guide/developing/tools/adt.jd
index f28b24c..eb7ad4f 100644
--- a/docs/html/guide/developing/tools/adt.jd
+++ b/docs/html/guide/developing/tools/adt.jd
@@ -4,7 +4,7 @@
<p>The Android Development Tools (ADT) plugin adds powerful extensions to the Eclipse integrated development environment. It allows you to create and debug your Android applications easier and faster. If you use Eclipse, the ADT plugin gives you an incredible boost in developing Android applications:</p>
<ul>
- <li>It gives you access to other Android development tools from inside the Eclipse IDE. For example, ADT lets you access the many capabilities of the DDMS tool: take screenshots, manage port-forwarding, set breakpoints, and view thread and process informationd irectly from Eclipse.</li>
+ <li>It gives you access to other Android development tools from inside the Eclipse IDE. For example, ADT lets you access the many capabilities of the DDMS tool: take screenshots, manage port-forwarding, set breakpoints, and view thread and process information directly from Eclipse.</li>
<li>It provides a New Project Wizard, which helps you quickly create and set up all of the basic files you'll need for a new Android application.</li>
<li>It automates and simplifies the process of building your Android application.</li>
<li>It provides an Android code editor that helps you write valid XML for your Android manifest and resource files.</li>
@@ -102,10 +102,10 @@
<p>Note that the "Android Editors" feature of ADT requires several optional
Eclipse components (for example, WST). If you encounter an error when
-installing ADT, your Eclipse installion might not include those components.
+installing ADT, your Eclipse installation might not include those 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>
+<a href="{@docRoot}resources/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:
diff --git a/docs/html/guide/developing/tools/draw9patch.jd b/docs/html/guide/developing/tools/draw9patch.jd
index f25fabb..9607ae7 100644
--- a/docs/html/guide/developing/tools/draw9patch.jd
+++ b/docs/html/guide/developing/tools/draw9patch.jd
@@ -5,7 +5,7 @@
{@link android.graphics.NinePatch} graphic using a WYSIWYG editor.</p>
<p>For an introduction to Nine-patch graphics and how they work, please read
the section on Nine-patch in the
-<a href="{@docRoot}guide/topics/resources/available-resources.html#ninepatch">Ninepatch Images</a> topic.</p>
+<a href="{@docRoot}guide/topics/resources/available-resources.html#ninepatch">Nine-patch Images</a> topic.</p>
<div class="sidebox" style="width:auto"><br/>
<img src="{@docRoot}images/draw9patch-norm.png" alt="" height="300" width="341" />
diff --git a/docs/html/guide/developing/tools/emulator.jd b/docs/html/guide/developing/tools/emulator.jd
index a9b6914..507353e 100644
--- a/docs/html/guide/developing/tools/emulator.jd
+++ b/docs/html/guide/developing/tools/emulator.jd
@@ -1338,7 +1338,7 @@
<p>You can use the <code>power</code> command to control the simulated power state of the emulator instance.The usage for the command is: </p>
-<pre>power <display|ac|status|present|health|capactiy></pre>
+<pre>power <display|ac|status|present|health|capacity></pre>
<p>The <code>event</code> command supports the subcommands listed in the table below. </p>
@@ -1393,7 +1393,7 @@
<a name="netdelay"></a>
<h3>Network Delay Emulation</h3>
-<p>The emulator lets you simulate various network latency levels, so that you can test your applicaton in an environment more typical of the actual conditions in which it will run. You can set a latency level or range at emulator startup or you can use the console to change the latency dynamically, while the application is running in the emulator. </p>
+<p>The emulator lets you simulate various network latency levels, so that you can test your application in an environment more typical of the actual conditions in which it will run. You can set a latency level or range at emulator startup or you can use the console to change the latency dynamically, while the application is running in the emulator. </p>
<p>To set latency at emulator startup, use the <code>-netdelay</code> emulator option with a supported <code><delay></code> value, as listed in the table below. Here are some examples:</p>
<pre>emulator -netdelay gprs
emulator -netdelay 40 100</pre>
@@ -1754,7 +1754,7 @@
<p>For emulators running on Mac OS X, if you see an error "Warning: No DNS servers found" when starting the emulator, check to see whether you have an <code>/etc/resolv.conf</code> file. If not, please run the following line in a command window:</p>
<pre>ln -s /private/var/run/resolv.conf /etc/resolv.conf</pre>
-<p>See <a href="{@docRoot}guide/appendix/faq/index.html">Frequently Asked Questions</a> for more troubleshooting information. </p>
+<p>See <a href="{@docRoot}resources/faq/index.html">Frequently Asked Questions</a> for more troubleshooting information. </p>
<a name="limitations"></a>
<h2>Emulator Limitations</h2>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index c08a280..13d752a 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -143,7 +143,6 @@
<li><a href="<?cs var:toroot ?>guide/topics/manifest/intent-filter-element.html"><intent-filter></a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/manifest-element.html"><manifest></a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/meta-data-element.html"><meta-data></a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/manifest/path-permission-element.html"><path-permission></a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-element.html"><permission></a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-group-element.html"><permission-group></a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-tree-element.html"><permission-tree></a></li>
@@ -364,81 +363,6 @@
</a></li>
</ul>
</li>
-
- <li>
- <h2><span class="en">Tutorials and Sample Code</span>
- <span class="de" style="display:none">Lernprogramme und Beispielcode</span>
- <span class="es" style="display:none">Tutoriales y código de ejemplo</span>
- <span class="fr" style="display:none">Didacticiels et exemple de code</span>
- <span class="it" style="display:none">Esercitazioni e codice di esempio</span>
- <span class="ja" style="display:none">チュートリアルとサンプル コード</span>
- <span class="zh-CN" style="display:none">辅导手册和示例代码</span>
- <span class="zh-TW" style="display:none">教學課程與程式碼範例</span>
- </h2>
- <ul>
- <li><a href="<?cs var:toroot ?>guide/tutorials/hello-world.html">
- <span class="en">Hello World</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/tutorials/views/index.html">
- <span class="en">Hello Views</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/tutorials/localization/index.html">
- <span class="en">Hello Localization</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/tutorials/notepad/index.html">
- <span class="en">Notepad Tutorial</span>
- </a></li>
- </ul>
- <ul>
- <li class="toggle-list">
- <div><a href="<?cs var:toroot ?>guide/samples/index.html">
- <span class="en">Sample Code</span>
- </a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>guide/samples/ApiDemos/index.html">
- <span class="en">API Demos</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/BluetoothChat/index.html">
- <span class="en">Bluetooth Chat</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/ContactManager/index.html">
- <span class="en">Contact Manager</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/Home/index.html">
- <span class="en">Home</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/JetBoy/index.html">
- <span class="en">JetBoy</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/LunarLander/index.html">
- <span class="en">Lunar Lander</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/MultiResolution/index.html">
- <span class="en">Multiple Resolutions</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/NotePad/index.html">
- <span class="en">Note Pad</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/SearchableDictionary/index.html">
- <span class="en">Searchable Dictionary</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/Snake/index.html">
- <span class="en">Snake</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/SoftKeyboard/index.html">
- <span class="en">Soft Keyboard</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/Wiktionary/index.html">
- <span class="en">Wiktionary</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/samples/WiktionarySimple/index.html">
- <span class="en">Wiktionary (Simplified)</span>
- </a></li>
- </ul>
- </li>
- </ul>
- </li>
-
<li>
<h2><span class="en">Appendix</span>
@@ -463,9 +387,6 @@
<li><a href="<?cs var:toroot ?>guide/appendix/glossary.html">
<span class="en">Glossary</span>
</a></li>
- <li><a href="<?cs var:toroot ?>guide/appendix/faq/index.html">
- <span class="en">FAQ</span>
- </a></li>
</ul>
</li>
diff --git a/docs/html/guide/index.jd b/docs/html/guide/index.jd
index ecbf97b..1674bc8 100644
--- a/docs/html/guide/index.jd
+++ b/docs/html/guide/index.jd
@@ -77,7 +77,7 @@
<p>
For additional help, consider joining one or more of the Android
discussion groups. Go to the
-<a href="{@docRoot}community/index.html">Community</a> tab above
+<a href="{@docRoot}resources/community-groups.html">Community</a> pages
for more information.
</p>
diff --git a/docs/html/guide/practices/design/performance.jd b/docs/html/guide/practices/design/performance.jd
index 1eef342..ec34ac9 100644
--- a/docs/html/guide/practices/design/performance.jd
+++ b/docs/html/guide/practices/design/performance.jd
@@ -22,6 +22,7 @@
<p>This document covers these topics: </p>
<ul>
<li><a href="#intro">Introduction</a></li>
+ <li><a href="#optimize_judiciously">Optimize Judiciously</a></li>
<li><a href="#object_creation">Avoid Creating Objects</a></li>
<li><a href="#native_methods">Use Native Methods</a></li>
<li><a href="#prefer_virtual">Prefer Virtual Over Interface</a></li>
@@ -74,6 +75,180 @@
probably be as fast or faster than compiled bar(). It is unwise to rely on a
compiler to "save" you and make your code fast enough.</p>
+<h2 id="optimize_judiciously">Optimize Judiciously</h2>
+
+<p>As you get started thinking about how to design your application, consider
+the cautionary points about optimization that Josh Bloch makes in his book
+<em>Effective Java</em>. Here's "Item 47: Optimize Judiciously", excerpted from
+the latest edition of the book with permission. Although Josh didn't have
+Android application development in mind when writing this section — for
+example, the <code style="color:black">java.awt.Component</code> class
+referenced is not available in Android, and Android uses the
+Dalvik VM, rather than a standard JVM — his points are still valid. </p>
+
+<blockquote>
+
+<p>There are three aphorisms concerning optimization that everyone should know.
+They are perhaps beginning to suffer from overexposure, but in case you aren't
+yet familiar with them, here they are:</p>
+
+<div style="padding-left:3em;padding-right:4em;">
+
+<p style="margin-bottom:.5em;">More computing sins are committed in the name of
+efficiency (without necessarily achieving it) than for any other single
+reason—including blind stupidity.</p>
+<p>—William A. Wulf <span style="font-size:80%;"><sup>1</sup></span></p>
+
+<p style="margin-bottom:.5em;">We should forget about small efficiencies, say
+about 97% of the time: premature optimization is the root of all evil. </p>
+<p>—Donald E. Knuth <span style="font-size:80%;"><sup>2</sup></span></p>
+
+
+<p style="margin-bottom:.5em;">We follow two rules in the matter of optimization:</p>
+<ul style="margin-bottom:0">
+<li>Rule 1. Don't do it.</li>
+<li>Rule 2 (for experts only). Don't do it yet — that is, not until you have a
+perfectly clear and unoptimized solution. </li>
+</ul>
+<p>—M. A. Jackson <span style="font-size:80%;"><sup>3</sup></span></p>
+</div>
+
+<p>All of these aphorisms predate the Java programming language by two decades.
+They tell a deep truth about optimization: it is easy to do more harm than good,
+especially if you optimize prematurely. In the process, you may produce software
+that is neither fast nor correct and cannot easily be fixed.</p>
+
+<p>Don't sacrifice sound architectural principles for performance.
+<strong>Strive to write good programs rather than fast ones.</strong> If a good
+program is not fast enough, its architecture will allow it to be optimized. Good
+programs embody the principle of <em>information hiding</em>: where possible,
+they localize design decisions within individual modules, so individual
+decisions can be changed without affecting the remainder of the system (Item
+13).</p>
+
+<p>This does <em>not</em> mean that you can ignore performance concerns until
+your program is complete. Implementation problems can be fixed by later
+optimization, but pervasive architectural flaws that limit performance can be
+impossible to fix without rewriting the system. Changing a fundamental facet of
+your design after the fact can result in an ill-structured system that is
+difficult to maintain and evolve. Therefore you must think about performance
+during the design process.</p>
+
+<p><strong>Strive to avoid design decisions that limit performance.</strong> The
+components of a design that are most difficult to change after the fact are
+those specifying interactions between modules and with the outside world. Chief
+among these design components are APIs, wire-level protocols, and persistent
+data formats. Not only are these design components difficult or impossible to
+change after the fact, but all of them can place significant limitations on the
+performance that a system can ever achieve.</p>
+
+<p><strong>Consider the performance consequences of your API design
+decisions.</strong> Making a public type mutable may require a lot of needless
+defensive copying (Item 39). Similarly, using inheritance in a public class
+where composition would have been appropriate ties the class forever to its
+superclass, which can place artificial limits on the performance of the subclass
+(Item 16). As a final example, using an implementation type rather than an
+interface in an API ties you to a specific implementation, even though faster
+implementations may be written in the future (Item 52).</p>
+
+<p>The effects of API design on performance are very real. Consider the <code
+style="color:black">getSize</code> method in the <code
+style="color:black">java.awt.Component</code> class. The decision that this
+performance-critical method was to return a <code
+style="color:black">Dimension</code> instance, coupled with the decision that
+<code style="color:black">Dimension</code> instances are mutable, forces any
+implementation of this method to allocate a new <code
+style="color:black">Dimension</code> instance on every invocation. Even though
+allocating small objects is inexpensive on a modern VM, allocating millions of
+objects needlessly can do real harm to performance.</p>
+
+<p>In this case, several alternatives existed. Ideally, <code
+style="color:black">Dimension</code> should have been immutable (Item 15);
+alternatively, the <code style="color:black">getSize</code> method could have
+been replaced by two methods returning the individual primitive components of a
+<code style="color:black">Dimension</code> object. In fact, two such methods
+were added to the Component API in the 1.2 release for performance reasons.
+Preexisting client code, however, still uses the <code
+style="color:black">getSize</code> method and still suffers the performance
+consequences of the original API design decisions.</p>
+
+<p>Luckily, it is generally the case that good API design is consistent with
+good performance. <strong>It is a very bad idea to warp an API to achieve good
+performance.</strong> The performance issue that caused you to warp the API may
+go away in a future release of the platform or other underlying software, but
+the warped API and the support headaches that come with it will be with you for
+life.</p>
+
+<p>Once you've carefully designed your program and produced a clear, concise,
+and well-structured implementation, <em>then</em> it may be time to consider
+optimization, assuming you're not already satisfied with the performance of the
+program.</p>
+
+<p>Recall that Jackson's two rules of optimization were "Don't do it," and "(for
+experts only). Don't do it yet." He could have added one more: <strong>measure
+performance before and after each attempted optimization.</strong> You may be
+surprised by what you find. Often, attempted optimizations have no measurable
+effect on performance; sometimes, they make it worse. The main reason is that
+it's difficult to guess where your program is spending its time. The part of the
+program that you think is slow may not be at fault, in which case you'd be
+wasting your time trying to optimize it. Common wisdom says that programs spend
+80 percent of their time in 20 percent of their code.</p>
+
+<p>Profiling tools can help you decide where to focus your optimization efforts.
+Such tools give you runtime information, such as roughly how much time each
+method is consuming and how many times it is invoked. In addition to focusing
+your tuning efforts, this can alert you to the need for algorithmic changes. If
+a quadratic (or worse) algorithm lurks inside your program, no amount of tuning
+will fix the problem. You must replace the algorithm with one that is more
+efficient. The more code in the system, the more important it is to use a
+profiler. It's like looking for a needle in a haystack: the bigger the haystack,
+the more useful it is to have a metal detector. The JDK comes with a simple
+profiler and modern IDEs provide more sophisticated profiling tools.</p>
+
+<p>The need to measure the effects of attempted optimization is even greater on
+the Java platform than on more traditional platforms, because the Java
+programming language does not have a strong <em>performance model</em>. The
+relative costs of the various primitive operations are not well defined. The
+"semantic gap" between what the programmer writes and what the CPU executes is
+far greater than in traditional statically compiled languages, which makes it
+very difficult to reliably predict the performance consequences of any
+optimization. There are plenty of performance myths floating around that turn
+out to be half-truths or outright lies.</p>
+
+<p>Not only is Java's performance model ill-defined, but it varies from JVM
+implementation to JVM implementation, from release to release, and from
+processor to processor. If you will be running your program on multiple JVM
+implementations or multiple hardware platforms, it is important that you measure
+the effects of your optimization on each. Occasionally you may be forced to make
+trade-offs between performance on different JVM implementations or hardware
+platforms.</p>
+
+<p>To summarize, do not strive to write fast programs — strive to write
+good ones; speed will follow. Do think about performance issues while you're
+designing systems and especially while you're designing APIs, wire-level
+protocols, and persistent data formats. When you've finished building the
+system, measure its performance. If it's fast enough, you're done. If not,
+locate the source of the problems with the aid of a profiler, and go to work
+optimizing the relevant parts of the system. The first step is to examine your
+choice of algorithms: no amount of low-level optimization can make up for a poor
+choice of algorithm. Repeat this process as necessary, measuring the performance
+after every change, until you're satisfied.</p>
+
+<p>—Excerpted from Josh Bloch's <em>Effective Java</em>, Second Ed.
+(Addison-Wesley, 2008).</em></p>
+
+<p style="font-size:80%;margin-bottom:0;"><sup>1</sup> Wulf, W. A Case Against
+the GOTO. <em>Proceedings of the 25th ACM National
+Conference</em> 2 (1972): 791–797.</p>
+<p style="font-size:80%;margin-bottom:0;"><sup>2</sup> Knuth, Donald. Structured
+Programming with go to Statements. <em>Computing
+Surveys 6</em> (1974): 261–301.</p>
+<p style="font-size:80%"><sup>3</sup> Jackson, M. A. <em>Principles of Program
+Design</em>, Academic Press, London, 1975.
+ISBN: 0123790506.</p>
+
+</blockquote>
+
<a name="object_creation"></a>
<h2>Avoid Creating Objects</h2>
diff --git a/docs/html/guide/practices/screens_support.jd b/docs/html/guide/practices/screens_support.jd
index 10f4485..643d307 100644
--- a/docs/html/guide/practices/screens_support.jd
+++ b/docs/html/guide/practices/screens_support.jd
@@ -289,11 +289,11 @@
compatibility features that together manage the rendering of application
resources in an appropriate way for the current device screen. The platform
handles most of the work of rendering your application, but also gives you two
-key ways to control the way your application is displayed, if you need or want
+key ways to control how your application is displayed, if you need or want
to use them:</p>
<ul>
- <li>The platform provides a set of resource qualifiers that let you provide
+ <li>The platform supports a set of resource qualifiers that let you provide
size- and density-specific resources, if needed. The qualifiers for
size-specific resources are <code>large</code>, <code>normal</code>, and
<code>small</code>, and those for density-specific resources are
@@ -303,7 +303,7 @@
<li>The platform also provides a
<a href="{@docRoot}guide/topics/manifest/supports-screens-element.html">
<code><supports-screens></code></a>
-element, whose attributes
+manifest element, whose attributes
<code>android:largeScreens</code>, <code>android:normalScreens</code>, and
<code>android:smallScreens</code> let you specify what generalized screen sizes
your application supports. A fourth attribute, <code>android:anyDensity</code>,
diff --git a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
index e2fc89c..6cd2199 100644
--- a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd
@@ -469,7 +469,7 @@
re-use activities in other applications, and how your activities might
be re-used by other applications. If you add an activity with the same
<a href=#intents title="intent filter">intent filter</a> as an
- exisiting activity, then the system presents the user with a choice
+ existing activity, then the system presents the user with a choice
between the activities.
</p>
@@ -879,7 +879,7 @@
<p>
You can either test that an activity matches the intent, which you can do
before starting the activity, or catch an exception if starting the
- activity fails. Both approaches are descibed in the blog posting
+ activity fails. Both approaches are described in the blog posting
<a href="http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html">Can
I use this Intent?</a>.
</p>
@@ -938,7 +938,7 @@
the menus, the system compares the "Share" request (an Intent
object) to available activities (by looking at their intent
filters) and displays choices to share. In this case, it
- matches Email, Gmail, Messaging and Picassa. If your activity
+ matches Email, Gmail, Messaging and Picasa. If your activity
can send a picture or upload it to a website, all it needs to
do is make itself available for sharing (by setting its intent
filter).
@@ -978,7 +978,7 @@
<li>
<b>Launch your activity <em>only</em> from within another
application</b> - The previous cases of sharing by way of
- Email, Gmail, Messaging and Picassa (from within Gallery) are
+ Email, Gmail, Messaging and Picasa (from within Gallery) are
all activities that can also be started from icons in the
application launcher at Home. In contrast, the activities for
cropping a picture and attaching a file cannot be started from
diff --git a/docs/html/guide/practices/ui_guidelines/menu_design.jd b/docs/html/guide/practices/ui_guidelines/menu_design.jd
index 518cea1..ebf8a4b 100644
--- a/docs/html/guide/practices/ui_guidelines/menu_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/menu_design.jd
@@ -93,10 +93,10 @@
<h2 id="tour_of_the_menus">Tour of the Menus</h2>
-<blockquote>
- <b>NOTE</b> - Your menus and screens might not look like those shown in this document;
- they may vary from one version of Android or device to another.
-</blockquote>
+<p class="note"><strong>Note:</strong> Your menus and screens might not look
+like those shown in this document; they may vary from one version of Android
+or device to another.
+</p>
<h3 id="options_menu">Options Menu</h3>
diff --git a/docs/html/guide/practices/ui_guidelines/widget_design.jd b/docs/html/guide/practices/ui_guidelines/widget_design.jd
index 514b315..fc62fe6 100644
--- a/docs/html/guide/practices/ui_guidelines/widget_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/widget_design.jd
@@ -9,7 +9,7 @@
<ul>
<li>Widgets have six standard sizes on the Home screen</li>
<li>Widgets have standards for size, frames, shadows, and file format, which you can copy</li>
-<li>A few tricks make it easier to design widgets that fit graphically on the Home screeen</li>
+<li>A few tricks make it easier to design widgets that fit graphically on the Home screen</li>
</ul>
<h2>In this document</h2>
diff --git a/docs/html/guide/publishing/app-signing.jd b/docs/html/guide/publishing/app-signing.jd
index f0febc0..86dd155 100644
--- a/docs/html/guide/publishing/app-signing.jd
+++ b/docs/html/guide/publishing/app-signing.jd
@@ -268,7 +268,7 @@
<p>Note that, if your development machine is using a non-Gregorian locale, the build
tools may erroneously generate an already-expired debug certificate, so that you get an
error when trying to compile your application. For workaround information, see the
-troubleshooting topic <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#signingcalendar">
+troubleshooting topic <a href="{@docRoot}resources/faq/troubleshooting.html#signingcalendar">
I can't compile my app because the build tools generated an expired debug
certificate</a>. </p>
diff --git a/docs/html/guide/publishing/publishing.jd b/docs/html/guide/publishing/publishing.jd
index c027f4d..0c087ef 100644
--- a/docs/html/guide/publishing/publishing.jd
+++ b/docs/html/guide/publishing/publishing.jd
@@ -121,6 +121,9 @@
consider it a new application and will not offer it to users as an update.</p>
+
+
+
<h3 id="marketintent">Using Intents to Launch the Market Application on
a Device</h3>
@@ -141,9 +144,37 @@
<p>The URI that you supply with the Intent lets the system route the intent
properly and also expresses the type of action that you want Market to perform
-after launch. Currently, you can have Market initiate a search for applications
-on Android Market, based on query parameters that you provide. For example, you
-can specify URIs to search for applications by:</p>
+after launch. Currently, you can have Market take these actions:</p>
+
+<ul>
+<li>Initiate a search for applications on Android Market, based on the query
+parameters that you provide, or </li>
+<li>Load the Details page for a specific application on Android Market, based on
+the application's package name.</li>
+</ul>
+
+<h4>Initiating a search</h4>
+
+<p>Your application can initiate a search on Android Market for applications
+that match the query parameters that you provide. To do so, your application
+sends an ACTION_VIEW Intent that includes a URI and query parameters in this
+format:</p>
+
+<p style="margin-left:2em"><code>market://search?q=<paramtype>:<value></code></p>
+
+<div class="sidebox-wrapper" xstyle="margin-bottom:2em;margin-top:.5em;width:90%;">
+ <img id="rule" src="{@docRoot}assets/images/grad-rule-qv.png">
+ <div id="qv-sub-rule">
+ <img src="{@docRoot}assets/images/icon_market.jpg" style="float:left;margin:0;padding:0;">
+ <p style="color:#669999;">Searches on Android Market</p>
+<p>When you initiate a search, Android Market returns results from matches in
+the public metadata supplied by developers in their Android Market profiles or
+application publishing information, but not from the developer's private account
+or from the certificate used to sign the application. </p>
+ </div>
+</div>
+
+<p>Using this URI format, you can search for applications by:</p>
<ul>
<li>Package name</li>
@@ -153,33 +184,73 @@
<li>Any combination of the above</li>
</ul>
-<p>Note that the URI queries return results from the public metadata supplied by
-developers in their Android Market profiles or application publishing
-information, but not from the developer's private account or from the
-certificate used to sign the application. </p>
+<p>The table at the bottom of this page specifies the <code>paramtypes</code>
+and <code>values</code> that correspond to each of these types of search. </p>
+
+<p>When you send an intent to initiate a search for applications, Market sends
+the search query to the server and displays the result. To the user, the
+experience is something like this: </p>
+
+<ol>
+<li>The user presses a link or button in your application.</li>
+<li>The Market application launches and takes control of the screen, displaying
+a progress indicator labeled "Searching" until it receives the search
+results.</li>
+<li>Market receives the search results and displays them. Depending on the query
+parameters, the search results may include a list of one or more applications.
+</li>
+<li>From the results page, the user can select an app to go to its Details page,
+which offers information about the app and lets the user download/purchase the
+app.</li>
+</ol>
+
+<h4>Loading an application's Details page</h4>
+
+<p>In Android Market, every application has a Details page that provides an
+overview of the application for users. For example, the page includes a short
+description of the app and screen shots of it in use, if supplied by the
+developer, as well as feedback from users and information about the developer.
+The Details page also includes an "Install" button that lets the user trigger
+the download/purchase of the application.</p>
+
+<p>If you want to refer the user to a specific appplication, your application
+can take the user directly to the application's Details page. To do so, your
+application sends an ACTION_VIEW Intent that includes a URI and query parameter
+in this format:</p>
+
+<p style="margin-left:2em"><code>market://details?id=<packagename></code></p>
+
+<p>In this case, the <code>packagename</code> parameter is target application's
+fully qualified package name, as declared in the <code>package</code> attribute
+of the <code>manifest</code> element in the application's manifest file. For example:</p>
+
+<p style="margin-left:2em"><code>market://details?id=com.example.android.jetboy</code></p>
+
+<h4>Android Market URIs</h4>
<p>The table below provides a list of URIs and actions currently
supported by the Market application.</p>
+<p>Note that these URIs work only when passed as Intent data — you
+can't currently load the URIs in a web browser, either on a desktop machine or
+on the device. </p>
+
<table>
<tr>
-<th>For this Result</th>
+<th width="25%">For this Result</th>
<th>Pass this URI with the ACTION_VIEW Intent</th>
-<th>Comments</th>
+<th width="36%">Comments</th>
</tr>
-
-<!--
<tr>
-<td>Display the details screen for a specific application, as identified
-by its Market appID string.</td>
-<td><code>http://market.android.com/details?id=<appMarketAppIdString></code>
+<td>Display the Details screen for a specific application, as identified
+by the app's fully qualified package name.</td>
+<td><code>http://market.android.com/details?id=<packagename></code>
or<br>
-<code>market://details?id=<appMarketUidString></code></td>
-<td>Note that Market appID is specific to an application
-<em>and</em> its version. That is, an appID query loads the details page
-for a specific version of an application.</td>
+<code>market://details?id=<packagename></code></td>
+<td>Note that the package name that you specify is <em>not</em> specific to any
+version of an application. Therefore, Market always displays the Details page for the
+latest version of the application.</td>
</tr>
--->
<tr>
<td>Search for an application by its fully qualified Java package name and
display the result.</td>
@@ -191,8 +262,8 @@
<tr>
<td>Search for applications by developer name and display the results.</td>
-<td><code>http://market.android.com/search?q=pub:"<Developer Name>"</code>
-or<br> <code>market://search?q=pub:"<Developer Name>"</code></td>
+<td><code>http://market.android.com/search?q=pub:<Developer Name></code>
+or<br> <code>market://search?q=pub:<Developer Name></code></td>
<td>Searches only the "Developer Name" fields of Market public profiles.
Returns exact matches only. </td>
</tr>
@@ -212,7 +283,3 @@
<td>Returns a list of applications meeting all the supplied parameters. </td>
</tr>
</table>
-
-<p>Note that these URIs work only when passed as intent data — you
-can't currently load the URIs in a web browser, either on a desktop machine or
-on the device. </p>
\ No newline at end of file
diff --git a/docs/html/guide/publishing/versioning.jd b/docs/html/guide/publishing/versioning.jd
index bff8c97..1d55f8a 100644
--- a/docs/html/guide/publishing/versioning.jd
+++ b/docs/html/guide/publishing/versioning.jd
@@ -67,7 +67,7 @@
<li><code>android:versionCode</code> — An integer value that represents
the version of the application code, relative to other versions.
-<p>The value is an integer so that other applications can programatically
+<p>The value is an integer so that other applications can programmatically
evaluate it, for example to check an upgrade or downgrade relationship. You can
set the value to any integer you want, however you should make sure that each
successive release of your application uses a greater value. The system does not
@@ -78,7 +78,7 @@
versionCode set to 1, then monotonically increase the value with each release,
regardless whether the release constitutes a major or minor release. This means
that the <code>android:versionCode</code> value does not necessarily have a
-strong resemblence to the application release version that is visible to the
+strong resemblance to the application release version that is visible to the
user (see <code>android:versionName</code>, below). Applications and publishing
services should not display this version value to users.</p>
</li>
@@ -170,6 +170,6 @@
<code>android:minSdkVersion</code> as an attribute. </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/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
+manifest element documentation and the <a
href="{@docRoot}guide/appendix/api-levels.html">API Levels</a> document.</p>
diff --git a/docs/html/guide/samples/images/ContactManager1.png b/docs/html/guide/samples/images/ContactManager1.png
deleted file mode 100644
index 78f09d2..0000000
--- a/docs/html/guide/samples/images/ContactManager1.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/guide/samples/images/ContactManager2.png b/docs/html/guide/samples/images/ContactManager2.png
deleted file mode 100644
index 34da37d..0000000
--- a/docs/html/guide/samples/images/ContactManager2.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/guide/samples/images/Wiktionary.png b/docs/html/guide/samples/images/Wiktionary.png
deleted file mode 100644
index eae5da5..0000000
--- a/docs/html/guide/samples/images/Wiktionary.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/guide/samples/images/WiktionarySimple.png b/docs/html/guide/samples/images/WiktionarySimple.png
deleted file mode 100644
index a23226b..0000000
--- a/docs/html/guide/samples/images/WiktionarySimple.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/guide/samples/index.jd b/docs/html/guide/samples/index.jd
index 28f3d08..7923532 100644
--- a/docs/html/guide/samples/index.jd
+++ b/docs/html/guide/samples/index.jd
@@ -31,56 +31,57 @@
<div class="special">
<p>Some of the samples in this listing are not yet available in the
SDK. While we work to update the SDK, you can
- <a href="../../shareables/latest_samples.zip">download the latest samples</a> as a ZIP
- file here.</p>
+ <a href="{@docRoot}shareables/latest_samples.zip">download the latest samples</a> as a ZIP
+ archive.</p>
</div>
<dl>
- <dt><a href="ApiDemos/index.html">API Demos</a></dt>
+ <dt><a href="{@docRoot}resources/samples/ApiDemos/index.html">API Demos</a></dt>
<dd>A variety of small applications that demonstrate an extensive collection of
framework topics.</dd>
- <dt><a href="BluetoothChat/index.html">Bluetooth Chat</a></dt>
+ <dt><a href="{@docRoot}resources/samples/BluetoothChat/index.html">Bluetooth Chat</a></dt>
<dd>An application for two-way text messaging over Bluetooth.</dd>
- <dt><a href="ContactManager/index.html">Contact Manager</a></dt>
- <dd>An application that demonstrates how to query the system contacts provider, as
- well as insert contacts into a specific account.</p>
+ <dt><a href="{@docRoot}resources/samples/ContactManager/index.html">Contact Manager</a></dt>
+ <dd>An application that demonstrates how to query the system contacts provider
+ using the <code>ContactsContract</code> API, as
+ well as insert contacts into a specific account.</dd>
- <dt><a href="Home/index.html">Home</a></dt>
+ <dt><a href="{@docRoot}resources/samples/Home/index.html">Home</a></dt>
<dd>A home screen replacement application.</dd>
- <dt><a href="JetBoy/index.html">JetBoy</a></dt>
+ <dt><a href="{@docRoot}resources/samples/JetBoy/index.html">JetBoy</a></dt>
<dd>JetBoy is a game that demonstrates the SONiVOX JET interactive music technology,
with {@link android.media.JetPlayer}.</dd>
- <dt><a href="LunarLander/index.html">Lunar Lander</a></dt>
+ <dt><a href="{@docRoot}resources/samples/LunarLander/index.html">Lunar Lander</a></dt>
<dd>A classic Lunar Lander game.</dd>
- <dt><a href="MultiResolution/index.html">Multiple Resolutions</a></dt>
+ <dt><a href="{@docRoot}resources/samples/MultiResolution/index.html">Multiple Resolutions</a></dt>
<dd>A sample application that shows how to use resource directory qualifiers to
provide different resources for different screen configurations.</dd>
- <dt><a href="NotePad/index.html">Note Pad</a></dt>
+ <dt><a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a></dt>
<dd>An application for saving notes. Similar (but not identical) to the
- <a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad tutorial</a>.</dd>
+ <a href="{@docRoot}resources/tutorials/notepad/index.html">Notepad tutorial</a>.</dd>
- <dt><a href="SearchableDictionary/index.html">Searchable Dictionary</a></dt>
+ <dt><a href="{@docRoot}resources/samples/SearchableDictionary/index.html">Searchable Dictionary</a></dt>
<dd>A sample application that demonstrates Android's search framework,
including how to provide search suggestions for Quick Search Box.</dd>
- <dt><a href="Snake/index.html">Snake</a></dt>
+ <dt><a href="{@docRoot}resources/samples/Snake/index.html">Snake</a></dt>
<dd>An implementation of the classic game "Snake."</dd>
- <dt><a href="SoftKeyboard/index.html">Soft Keyboard</a></dt>
+ <dt><a href="{@docRoot}resources/samples/SoftKeyboard/index.html">Soft Keyboard</a></dt>
<dd>An example of writing an input method for a software keyboard.</dd>
- <dt><a href="Wiktionary/index.html">Wiktionary</a></dt>
+ <dt><a href=""{@docRoot}resources/samples/Wiktionary/index.html">Wiktionary</a></dt>
<dd>An example of creating interactive widgets for display on the Android
home screen.</dd>
- <dt><a href="WiktionarySimple/index.html">Wiktionary (Simplified)</a></dt>
+ <dt><a href="{@docRoot}resources/samples/WiktionarySimple/index.html">Wiktionary (Simplified)</a></dt>
<dd>A simple Android home screen widgets example.</dd>
</dl>
diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd
index c9df3ba..f36b684 100644
--- a/docs/html/guide/topics/appwidgets/index.jd
+++ b/docs/html/guide/topics/appwidgets/index.jd
@@ -339,7 +339,7 @@
sample's AppWidgetProvider</a> for an example of an App Widget running a {@link android.app.Service}.</p>
<p>Also see the <a
-href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html">
ExampleAppWidgetProvider.java</a> sample class.</p>
@@ -382,7 +382,7 @@
<p>Also, the Activity must be declared in the AppWidgetProviderInfo XML file, with the
<code>android:configure</code> attribute (see <a href="#MetaData">Adding
-the AppWidgetProvierInfo Metadata</a> above). For example, the configuration Activity
+the AppWidgetProviderInfo Metadata</a> above). For example, the configuration Activity
can be declared like this:</p>
<pre>
@@ -468,7 +468,7 @@
App Widget will not be added.</p>
<p>See the <a
-href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html">
ExampleAppWidgetConfigure.java</a> sample class in ApiDemos for an example.</p>
diff --git a/docs/html/guide/topics/fundamentals.jd b/docs/html/guide/topics/fundamentals.jd
index 640e44b..c10af8e 100644
--- a/docs/html/guide/topics/fundamentals.jd
+++ b/docs/html/guide/topics/fundamentals.jd
@@ -262,7 +262,7 @@
</p>
<p>
-There are separate methods for activiating each type of component:
+There are separate methods for activating each type of component:
</p>
<ul>
diff --git a/docs/html/guide/topics/graphics/2d-graphics.jd b/docs/html/guide/topics/graphics/2d-graphics.jd
index af584a2..051427b 100644
--- a/docs/html/guide/topics/graphics/2d-graphics.jd
+++ b/docs/html/guide/topics/graphics/2d-graphics.jd
@@ -43,7 +43,7 @@
{@link android.graphics.drawable.PictureDrawable}, {@link android.graphics.drawable.LayerDrawable}, and several more.
Of course, you can also extend these to define your own custom Drawable objects that behave in unique ways.</p>
-<p>There are three ways to define and instantiate a Drawable: using an image saved in your project resouces;
+<p>There are three ways to define and instantiate a Drawable: using an image saved in your project resources;
using an XML file that defines the Drawable properties; or using the normal class constructors. Below, we'll discuss
each the first two techniques (using constructors is nothing new for an experienced developer).</p>
@@ -126,7 +126,7 @@
<a href="{@docRoot}guide/topics/ui/index.html">User Interface</a>. Hence, you understand the power
and flexibility inherent in defining objects in XML. This philosophy caries over from Views to Drawables.
If there is a Drawable object that you'd like to create, which is not initially dependent on variables defined by
-your applicaton code or user interaction, then defining the Drawable in XML is a good option.
+your application code or user interaction, then defining the Drawable in XML is a good option.
Even if you expect your Drawable to change its properties during the user's experience with your application,
you should consider defining the object in XML, as you can always modify properties once it is instantiated.</p>
@@ -206,7 +206,7 @@
It's then given a color and the bounds of the shape are set. If you do not set the bounds, then the
shape will not be drawn, whereas if you don't set the color, it will default to black.</p>
<p>With the custom View defined, it can be drawn any way you like. With the sample above, we can
-draw the shape progammatically in an Activity:</p>
+draw the shape programmatically in an Activity:</p>
<pre>
CustomDrawableView mCustomDrawableView;
@@ -248,7 +248,7 @@
<h2 id="nine-patch">NinePatchDrawable</h2>
<p>A {@link android.graphics.drawable.NinePatchDrawable} graphic is a stretchable bitmap image, which Android
-will automatically resize to accomodate the contents of the View in which you have placed it as the background.
+will automatically resize to accommodate the contents of the View in which you have placed it as the background.
An example use of a NinePatch is the backgrounds used by standard Android buttons —
buttons must stretch to accommodate strings of various lengths. A NinePatch drawable is a standard PNG
image that includes an extra 1-pixel-wide border. It must be saved with the extension <code>.9.png</code>,
@@ -271,7 +271,7 @@
define this drawable area.
</p>
<p>To clarify the difference between the different lines, the left and top lines define
-which pixels of the image are allowed to be replicated in order to strech the image.
+which pixels of the image are allowed to be replicated in order to stretch the image.
The bottom and right lines define the relative area within the image that the contents
of the View are allowed to lie within.</p>
<p>
@@ -281,7 +281,7 @@
<p>This NinePatch defines one stretchable area with the left and top lines
and the drawable area with the bottom and right lines. In the top image, the dotted grey
-lines identify the regions of the image that will be replicated in order to strech the image. The pink
+lines identify the regions of the image that will be replicated in order to stretch the image. The pink
rectangle in the bottom image identifies the region in which the contents of the View are allowed.
If the contents don't fit in this region, then the image will be stretched so that they do.
</p>
@@ -333,7 +333,7 @@
If it has a background image, the background image will be transformed along with the text.
The {@link android.view.animation animation package} provides all the classes used in a tween animation.</p>
-<p>A sequence of animation instructions defines the twen animation, defined by either XML or Android code.
+<p>A sequence of animation instructions defines the tween animation, defined by either XML or Android code.
Like defining a layout, an XML file is recommended because it's more readable, reusable, and swappable
than hard-coding the animation. In the example below, we use XML. (To learn more about defining an animation
in your application code, instead of XML, refer to the
@@ -428,7 +428,7 @@
in the <a href="{@docRoot}guide/topics/resources/available-resources.html#animation">Available Resources</a>.</p>
<p class="note"><strong>Note:</strong> Regardless of how your animation may move or resize, the bounds of the
-View that holds your animation will not automatically adjust to accomodate it. Even so, the animation will still
+View that holds your animation will not automatically adjust to accommodate it. Even so, the animation will still
be drawn beyond the bounds of its View and will not be clipped. However, clipping <em>will occur</em>
if the animation exceeds the bounds of the parent View.</p>
diff --git a/docs/html/guide/topics/graphics/index.jd b/docs/html/guide/topics/graphics/index.jd
index bc2a8bf..e1158be 100644
--- a/docs/html/guide/topics/graphics/index.jd
+++ b/docs/html/guide/topics/graphics/index.jd
@@ -112,7 +112,7 @@
Other classes that you might use also have <code>draw()</code> methods. For example, you'll probably
have some {@link android.graphics.drawable.Drawable} objects that you want to put on the Canvas. Drawable
has its own <code>{@link android.graphics.drawable.Drawable#draw(Canvas) draw()}</code> method
-that takes your Canvas as an arguement.</p>
+that takes your Canvas as an argument.</p>
<h3 id="on-view">On a View</h3>
@@ -124,7 +124,7 @@
The most convenient aspect of doing so is that the Android framework will
provide you with a pre-defined Canvas to which you will place your drawing calls.</p>
-<p>To start, extend the {@link android.view.View} class (or descendent thereof) and define
+<p>To start, extend the {@link android.view.View} class (or descendant thereof) and define
the <code>{@link android.view.View#onDraw(Canvas) onDraw()}</code> callback method. This method will be called by the Android
framework to request that your View draw itself. This is where you will perform all your calls
to draw through the {@link android.graphics.Canvas}, which is passed to you through the <code>onDraw()</code> callback.</p>
@@ -190,7 +190,7 @@
you will see traces of the drawings you previously performed.</p>
-<p>For a sample application, see the Lunar Landar game, in the SDK samples folder:
+<p>For a sample application, see the Lunar Lander game, in the SDK samples folder:
<code><your-sdk-directory>/samples/LunarLander/</code>. Or,
browse the source in the <a href="{@docRoot}guide/samples/index.html">Sample Code</a> section.</p>
diff --git a/docs/html/guide/topics/graphics/opengl.jd b/docs/html/guide/topics/graphics/opengl.jd
index 901980d..4d0b223 100644
--- a/docs/html/guide/topics/graphics/opengl.jd
+++ b/docs/html/guide/topics/graphics/opengl.jd
@@ -28,7 +28,7 @@
<p>For an example of this usage model (based on the classic GL ColorCube), showing how to use
it with threads can be found in
-<a href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html">com.android.samples.graphics.GLSurfaceViewActivity.java</a>.
+<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html">com.android.samples.graphics.GLSurfaceViewActivity.java</a>.
</p>
<p>Writing a summary of how to actually write 3D applications using OpenGL is
diff --git a/docs/html/guide/topics/intents/intents-filters.jd b/docs/html/guide/topics/intents/intents-filters.jd
index 962a001..110721d 100644
--- a/docs/html/guide/topics/intents/intents-filters.jd
+++ b/docs/html/guide/topics/intents/intents-filters.jd
@@ -702,8 +702,8 @@
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>.)
+<a href="{@docRoot}resources/samples/index.html">Tutorials and Sample Code</a>
+section <a href="{@docRoot}resources/samples/NotePad/index.html">here</a>.)
</p>
<p>
@@ -968,7 +968,7 @@
<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>.)
+<a href="{@docRoot}guide/topics/providers/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>
diff --git a/docs/html/guide/topics/manifest/activity-element.jd b/docs/html/guide/topics/manifest/activity-element.jd
index 83237c6..41c27c6 100644
--- a/docs/html/guide/topics/manifest/activity-element.jd
+++ b/docs/html/guide/topics/manifest/activity-element.jd
@@ -5,17 +5,17 @@
<dt>syntax:</dt>
<dd><pre class="stx"><activity android:<a href="#reparent">allowTaskReparenting</a>=["true" | "false"]
android:<a href="#always">alwaysRetainTaskState</a>=["true" | "false"]
- android:<a href="#clear">clearTaskOnLaunch</a>=["true"" | "false"]
- android:<a href="#config">configChanges</a>=[<i>one or more of</i>: "mcc" "mnc" "locale"
- "touchscreen" "keyboard" "keyboardHidden"
- "navigation" "orientation" "fontScale"]
+ android:<a href="#clear">clearTaskOnLaunch</a>=["true" | "false"]
+ android:<a href="#config">configChanges</a>=["mcc", "mnc", "locale",
+ "touchscreen", "keyboard", "keyboardHidden",
+ "navigation", "orientation", "fontScale"]
android:<a href="#enabled">enabled</a>=["true" | "false"]
android:<a href="#exclude">excludeFromRecents</a>=["true" | "false"]
android:<a href="#exported">exported</a>=["true" | "false"]
android:<a href="#finish">finishOnTaskLaunch</a>=["true" | "false"]
android:<a href="#icon">icon</a>="<i>drawable resource</i>"
android:<a href="#label">label</a>="<i>string resource</i>"
- android:<a href="#lmode">launchMode</a>=["multiple" | "singleTop" |
+ android:<a href="#lmode">launchMode</a>=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:<a href="#multi">multiprocess</a>=["true" | "false"]
android:<a href="#nm">name</a>="<i>string</i>"
@@ -23,16 +23,16 @@
android:<a href="#prmsn">permission</a>="<i>string</i>"
android:<a href="#proc">process</a>="<i>string</i>"
android:<a href="#screen">screenOrientation</a>=["unspecified" | "user" | "behind" |
- "landscape" | "portrait" |
- "sensor" | "nonsensor"]
+ "landscape" | "portrait" |
+ "sensor" | "nosensor"]
android:<a href="#state">stateNotNeeded</a>=["true" | "false"]
android:<a href="#aff">taskAffinity</a>="<i>string</i>"
- android:<a href="#theme">theme</a>="<i>resource or theme</i>"
- android:<a href="#wsoft">windowSoftInputMode</a>=[<i>one or more of</i>: "stateUnspecified"
- "stateUnchanged" "stateHidden"
- "stateAlwaysHidden" "stateVisible"
- "stateAlwaysVisible" "adjustUnspecified"
- "adjustResize" "adjustPan"] > <!-- ##api level 3## -->
+ android:<a href="#theme">theme</a>="<i>resource or theme</i>"
+ android:<a href="#wsoft">windowSoftInputMode</a>=["stateUnspecified",
+ "stateUnchanged", "stateHidden",
+ "stateAlwaysHidden", "stateVisible",
+ "stateAlwaysVisible", "adjustUnspecified",
+ "adjustResize", "adjustPan"] > <!-- ##api level 3## -->
. . .
</activity></pre></dd>
@@ -687,7 +687,7 @@
keyboard. Rather, the contents of the window are automatically
panned so that the current focus is never obscured by the keyboard
and users can always see what they are typing. This is generally less
- desireable than resizing, because the user may need to close the soft
+ desirable than resizing, because the user may need to close the soft
keyboard to get at and interact with obscured parts of the window.</td>
</tr>
</table>
diff --git a/docs/html/guide/topics/manifest/data-element.jd b/docs/html/guide/topics/manifest/data-element.jd
index b48c5e0..b77fd05 100644
--- a/docs/html/guide/topics/manifest/data-element.jd
+++ b/docs/html/guide/topics/manifest/data-element.jd
@@ -28,7 +28,7 @@
These attributes are optional, but also mutually dependent:
If a <code><a href="{@docRoot}guide/topics/manifest/data-element.html#scheme">scheme</a></code> is not specified for the
intent filter, all the other URI attributes are ignored. If a
-<code><a href="{@docRoot}guide/topics/manifest/data-element.html#host">host</a></code> is not specified for the filer,
+<code><a href="{@docRoot}guide/topics/manifest/data-element.html#host">host</a></code> is not specified for the filter,
the {@code port} attribute and all the path attributes are ignored.
</p>
diff --git a/docs/html/guide/topics/manifest/manifest-intro.jd b/docs/html/guide/topics/manifest/manifest-intro.jd
index 89171c1..efbfa5a 100644
--- a/docs/html/guide/topics/manifest/manifest-intro.jd
+++ b/docs/html/guide/topics/manifest/manifest-intro.jd
@@ -112,7 +112,6 @@
<a href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a>
<a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission /></a>
- <a href="{@docRoot}guide/topics/manifest/path-permission-element.html"><path-permission /></a>
<a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data /></a>
<a href="{@docRoot}guide/topics/manifest/provider-element.html"></provider></a>
@@ -141,7 +140,6 @@
<br/><code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code>
-<br/><code><a href="{@docRoot}guide/topics/manifest/path-permission-element.html"><path-permission /></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/permission-element.html"><permission></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/permission-group-element.html"><permission-group></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/permission-tree-element.html"><permission-tree></a></code>
@@ -445,7 +443,7 @@
<permission android:name="com.example.project.DEBIT_ACCT" . . . />
. . .
<application . . .>
- <activity android:name="com.example.project.FreneticActivity" . . . >
+ <activity android:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
diff --git a/docs/html/guide/topics/manifest/path-permission-element.jd b/docs/html/guide/topics/manifest/path-permission-element.jd
deleted file mode 100644
index 5c271a7..0000000
--- a/docs/html/guide/topics/manifest/path-permission-element.jd
+++ /dev/null
@@ -1,104 +0,0 @@
-page.title=<path-permission>
-@jd:body
-
-<dl class="xml">
-<dt>syntax:</dt>
-<dd><pre class="stx">
-<path-permission android:<a href="#path">path</a>="<i>string</i>"
- android:<a href="#pathPrefix">pathPrefix</a>="<i>string</i>"
- android:<a href="#pathPattern">pathPattern</a>="<i>string</i>"
- android:<a href="#permission">permission</a>="<i>string</i>"
- android:<a href="#readPermission">readPermission</a>="<i>string</i>"
- android:<a href="#writePermission">writePermission</a>="<i>string</i>" />
-</pre></dd>
-
-<dt>contained in:</dt>
-<dd><code><a href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a></code></dd>
-
-<!--
-<dt>can contain:</dt>
-</dd>
--->
-
-<dt>description:</dt>
-<dd>Defines the path and required permissions for a specific subset of data
-within a content provider. This element can be
-specified multiple times to supply multiple paths.
-
-</dd>
-
-<dt>attributes:</dt>
-
-<dd><dl class="attr">
-<dt><a name="path"></a>{@code android:path}</dt>
-<dd>A complete URI path for a subset of content provider data.
-Permission can be granted only to the particular data identified by this path.
-When used to provide search suggestion content, it must be appended
-with "/search_suggest_query".
-</dd>
-
-<dt><a name="pathPrefix"></a>{@code android:pathPrefix}</dt>
-<dd>The initial part of a URI path for a subset of content provider data.
-Permission can be granted to all data subsets with paths that share this initial part.
-</dd>
-
-<dt><a name="pathPattern"></a>{@code android:pathPattern}</dt>
-<dd>A complete URI path for a subset of content provider data,
-but one that can use the following wildcards:
-
-<ul>
-<li>An asterisk ('<code class="Code prettyprint">*</code>'). This matches a sequence of 0 to many occurrences of
-the immediately preceding character.</li>
-
-<li>A period followed by an asterisk ("<code class="Code prettyprint">.*</code>"). This matches any sequence of
-0 or more characters.</li>
-</ul>
-
-<p>
-Because '<code class="Code prettyprint">\</code>' is used as an escape character when the string is read
-from XML (before it is parsed as a pattern), you will need to double-escape.
-For example, a literal '<code class="Code prettyprint">*</code>' would be written as "<code class="Code prettyprint">\\*</code>" and a
-literal '<code class="Code prettyprint">\</code>' would be written as "<code class="Code prettyprint">\\</code>". This is basically
-the same as what you would need to write if constructing the string in Java code.
-</p>
-<p>
-For more information on these types of patterns, see the descriptions of
-<a href="/reference/android/os/PatternMatcher.html#PATTERN_LITERAL">PATTERN_LITERAL</a>,
-<a href="/reference/android/os/PatternMatcher.html#PATTERN_PREFIX">PATTERN_PREFIX</a>, and
-<a href="/reference/android/os/PatternMatcher.html#PATTERN_SIMPLE_GLOB">PATTERN_SIMPLE_GLOB</a> in the
-<a href="/reference/android/os/PatternMatcher.html">PatternMatcher</a> class.
-</p>
-</dd>
-
-<dt><a name="permission"></a>{@code android:permission}</dt>
-<dd>The name of a permission that clients must have in order to read or write the
-content provider's data. This attribute is a convenient way of setting a
-single permission for both reading and writing. However, the
-<code>readPermission</code> and
-<code>writePermission</code> attributes take precedence
-over this one.
-</dd>
-
-<dt><a name="readPermission"></a>{@code android:readPermission}</dt>
-<dd>A permission that clients must have in order to query the content provider.
-</dd>
-
-<dt><a name="writePermission"></a>{@code android:writePermission}</dt>
-<dd>A permission that clients must have in order to make changes to the data controlled by the content provider.
-</dd>
-
-
-
-</dl></dd>
-
-<!-- ##api level indication## -->
-<dt>introduced in:</dt>
-<dd>API Level 4</dd>
-
-<dt>see also:</dt>
-<dd>{@link android.app.SearchManager}</dd>
-<dd>{@link android.Manifest.permission}</dd>
-<dd><a href="/guide/topics/security/security.html">Security and
-Permissions</a></dd>
-
-</dl>
diff --git a/docs/html/guide/topics/manifest/permission-tree-element.jd b/docs/html/guide/topics/manifest/permission-tree-element.jd
index 3074354..aecc930 100644
--- a/docs/html/guide/topics/manifest/permission-tree-element.jd
+++ b/docs/html/guide/topics/manifest/permission-tree-element.jd
@@ -46,7 +46,7 @@
<dd>The name that's at the base of the permission tree. It serves as
a prefix to all permission names in the tree. Java-style scoping should
be used to ensure that the name is unique. The name must have more than
-two period-separated seqments in its path — for example,
+two period-separated segments in its path — for example,
{@code com.example.base} is OK, but {@code com.example} is not.</dd>
</dl></dd>
diff --git a/docs/html/guide/topics/manifest/provider-element.jd b/docs/html/guide/topics/manifest/provider-element.jd
index 98892f1..c80b207 100644
--- a/docs/html/guide/topics/manifest/provider-element.jd
+++ b/docs/html/guide/topics/manifest/provider-element.jd
@@ -25,9 +25,7 @@
<dt>can contain:</dt>
<dd><code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code>
-<br/><code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></code>
-<br/><code><a href="{@docRoot}guide/topics/manifest/path-permission-element.html"><path-permission /></a></code>
-</dd>
+<br/><code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></code></dd>
<dt>description:</dt>
<dd>Declares a content provider — a subclass of
@@ -187,7 +185,7 @@
Normally, a content provider is instantiated in the process of the
application that defined it. However, if this flag is set to "{@code true}",
the system can create an instance in every process where there's a client
-that wants to interact withit, thus avoiding the overhead of interprocess
+that wants to interact with it, thus avoiding the overhead of interprocess
communication.
</p></dd>
diff --git a/docs/html/guide/topics/manifest/receiver-element.jd b/docs/html/guide/topics/manifest/receiver-element.jd
index 280d402..b208917 100644
--- a/docs/html/guide/topics/manifest/receiver-element.jd
+++ b/docs/html/guide/topics/manifest/receiver-element.jd
@@ -17,7 +17,7 @@
<dd><code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code></dd>
<dt>can contain:</dt>
-<dd><code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filer></a></code>
+<dd><code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code></dd>
<dt>description:</dt>
diff --git a/docs/html/guide/topics/manifest/service-element.jd b/docs/html/guide/topics/manifest/service-element.jd
index e5ac7b5..0a44e2c 100644
--- a/docs/html/guide/topics/manifest/service-element.jd
+++ b/docs/html/guide/topics/manifest/service-element.jd
@@ -17,7 +17,7 @@
<dd><code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code></dd>
<dt>can contain:</dt>
-<dd><code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filer></a></code>
+<dd><code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
<br/><code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code></dd>
<dt>description:</dt>
diff --git a/docs/html/guide/topics/manifest/supports-screens-element.jd b/docs/html/guide/topics/manifest/supports-screens-element.jd
index 5494320..620d3b2 100644
--- a/docs/html/guide/topics/manifest/supports-screens-element.jd
+++ b/docs/html/guide/topics/manifest/supports-screens-element.jd
@@ -31,7 +31,7 @@
The screen density is expressed as dots-per-inch (dpi).</p>
<p>For more information, see
-<a href="{@docRoot}guide/practices/screens_suppport.html">Multiple Screens Support</a>.</p>
+<a href="{@docRoot}guide/practices/screens_support.html">Multiple Screens Support</a>.</p>
<dt>attributes:</dt>
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index e508392..d7fc563 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -5,19 +5,20 @@
<dt>syntax:</dt>
<dd>
-<pre class="stx">
-<uses-feature android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>"
- android:<a href="#name">name</a>="<em>string</em>" />
-</pre>
+<pre class="stx"><uses-feature android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>"
+ android:<a href="#name">name</a>="<em>string</em>"
+ android:<a href="#required">required</a>=["true" | "false"] /></pre>
</dd>
<dt>contained in:</dt>
-<dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd>
+<dd><code><a
+href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd>
<dt>description:</dt>
<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>
+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 device-variable
features it uses. In this way, the application
will not be installed on devices that do not offer the feature.</p>
@@ -27,14 +28,14 @@
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
+this element to declare all applicable features (listed below) that your application uses. Failure
+to declare a feature may result in 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
+exist for a device, such as a camera, are declared using the
<a href="#name">{@code name}</a> attribute.</p>
<p>Any software or hardware features that may vary among Android-powered
@@ -47,13 +48,12 @@
<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"
+<p>If you declare {@code android.hardware.camera} this way, then your application is considered
+compatible with all devices that include a camera. If your application also uses auto-focus
+features, then you also need to include a
+{@code <uses-feature>} element that declares the {@code 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
+CAMERA} permission. Requesting the permission grants your application access to the
appropriate hardware and software, while declaring the features used by
your application ensures proper device compatibility.</p>
@@ -75,50 +75,113 @@
<dt>attributes:</dt>
<dd>
-<dl class="attr"><dt><a name="glEsVersion"></a>{@code android:glEsVersion}</dt>
+<dl class="attr">
+ <dt><a name="glEsVersion"></a>{@code android:glEsVersion}</dt>
<dd>The GLES version needed by the application.
The higher 16 bits represent the major number and the lower 16 bits
- represent the minor number. For example, for GL 1.2 referring to
- 0x00000102, the actual value should be set as 0x00010002.
+ represent the minor number. For example, for GL 1.2,
+ the value should be set as {@code 0x00010002}.
</dd>
-</dl>
-</dd>
-<dd>
-<dl class="attr"><dt><a name="name"></a>{@code android:name}</dt>
+ <dt><a name="name"></a>{@code android:name}</dt>
<dd>The name of a feature required by the application.
The value must be one of the following accepted strings:
-
- <table>
+
+ <table>
<tr>
<th>Feature</th>
<th>Value</th>
<th>Description</th>
- </tr><tr>
- <td rowspan="3">Camera</td>
- <td>"{@code android.hardware.camera}"</td>
+ </tr><tr>
+ <td rowspan="2">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>
- <tr>
+ </tr><tr>
<td colspan="2">
<strong>Note:</strong> Any application that requests the
- {@link android.Manifest.permission#CAMERA CAMERA permission} but does <em>not</em>
+ {@link android.Manifest.permission#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.
+ to use all camera features (auto-focus and flash). Thus, the application will not
+ be compatible with devices that do not support all camera features. Please use
+ {@code <uses-feature>} to declare only the camera features that your
+ application does need. For instance, if you request the
+ {@link android.Manifest.permission#CAMERA} permission, but you do not need auto-focus or
+ flash, then declare only the {@code android.hardware.camera} feature—the other
+ camera features that you do not request will no longer be assumed as required.
</td>
- </tr>
+ </tr><tr>
+ <td>Camera auto-focus</td>
+ <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>
+ </tr><tr>
+ <td>Camera flash</td>
+ <td>{@code android.hardware.camera.flash}</td>
+ <td>The application requires a camera with a flash.
+ As a prerequisite, both {@code android.hardware.camera} and {@code
+ android.hardware.camera.autofocus} must also be declared
+ with separate {@code <uses-feature>} elements.
+ </td>
+ </tr><tr>
+ <td>Light sensor</td>
+ <td>{@code android.hardware.sensor.light}</td>
+ <td>The application requires a device with a light sensor.
+ </td>
+ </tr><tr>
+ <td>Proximity sensor</td>
+ <td>{@code android.hardware.sensor.proximity}</td>
+ <td>The application requires a device with a proximity sensor.
+ </td>
+ </tr><tr>
+ <td>Multitouch screen</td>
+ <td>{@code android.hardware.touchscreen.multitouch}</td>
+ <td>The application requires a device that supports multitouch.
+ </td>
+ </tr><tr>
+ <td>Telephony</td>
+ <td>{@code android.hardware.telephony}</td>
+ <td>The application requires a device that includes a telephony radio with data
+ communication services.
+ </td>
+ </tr><tr>
+ <td>CDMA telephony</td>
+ <td>{@code android.hardware.telephony.cdma}</td>
+ <td>The application requires a device that includes a CDMA telephony radio. As a
+ prerequisite, {@code android.hardware.telephony} must also be declared
+ with a separate {@code <uses-feature>} element.
+ </td>
+ </tr><tr>
+ <td>GSM telephony</td>
+ <td>{@code android.hardware.telephony.gsm}</td>
+ <td>The application requires a device that includes a GSM telephony radio. As a
+ prerequisite, {@code android.hardware.telephony} must also be declared
+ with a separate {@code <uses-feature>} element.
+ </td>
</tr>
</table>
-
</dd>
+
+ <dt><a name="required"></a>{@code android:required}</dt> <!-- added in api level 5 -->
+ <dd>Indicates whether the feature is required by the application. This is
+ {@code true} by default. <strong>You should not use this attribute for most cases.</strong>
+ </p>
+
+ <p>The only situation in which you should set this attribute {@code false} is when your
+ application requests the {@link android.Manifest.permission#CAMERA} permission, but will degrade
+ gracefully and perform without failure if the device does not have a camera. In this situation,
+ you must declare the {@code android.hardware.camera} feature and set the {@code required}
+ attribute {@code false}. This is necessary because the {@link
+ android.Manifest.permission#CAMERA} permission will automatically turn on the requirement for
+ all camera features. So if your application uses this permission but is still compatible with
+ devices without a camera, then you must set the {@code required} attribute {@code false} for
+ {@code android.hardware.camera} or else it will not install on devices without a camera. Note
+ that, while the permission will enable the requirement for <em>all</em> camera features, you
+ only need to off the requirement for the basic camera feature.</p>
+
+ </dd>
+
</dl>
</dd>
diff --git a/docs/html/guide/topics/media/jet/jetcreator_manual.jd b/docs/html/guide/topics/media/jet/jetcreator_manual.jd
index 9692d97..214c79e 100644
--- a/docs/html/guide/topics/media/jet/jetcreator_manual.jd
+++ b/docs/html/guide/topics/media/jet/jetcreator_manual.jd
@@ -993,7 +993,7 @@
results, scoring or other game actions can take place. </li>
<li><span
lang=EN-IE>Musical transitions between levels or action sequences can be
- synchronized to be musically seemless.</li>
+ synchronized to be musically seamless.</li>
</ol>
diff --git a/docs/html/guide/topics/providers/content-providers.jd b/docs/html/guide/topics/providers/content-providers.jd
index 86dcebf..5da760a 100644
--- a/docs/html/guide/topics/providers/content-providers.jd
+++ b/docs/html/guide/topics/providers/content-providers.jd
@@ -731,7 +731,7 @@
URI for a TransportationProvider class could be defined as follows:
<pre>public static final Uri CONTENT_URI =
- Uri.parse("content://com.example.codelab.transporationprovider");</pre>
+ Uri.parse("content://com.example.codelab.transportationprovider");</pre>
<p>
If the provider has subtables, also define {@code CONTENT_URI} constants for
@@ -740,9 +740,9 @@
For example:
</p>
-<p style="margin-left: 2em">{@code content://com.example.codelab.transporationprovider/train}
-<br/>{@code content://com.example.codelab.transporationprovider/air/domestic}
-<br/>{@code content://com.example.codelab.transporationprovider/air/international}</p>
+<p style="margin-left: 2em">{@code content://com.example.codelab.transportationprovider/train}
+<br/>{@code content://com.example.codelab.transportationprovider/air/domestic}
+<br/>{@code content://com.example.codelab.transportationprovider/air/international}</p>
<p>
For an overview of {@code content:} URIs, see the <a href="#urisum">Content URI
diff --git a/docs/html/guide/topics/resources/available-resources.jd b/docs/html/guide/topics/resources/available-resources.jd
index f5f1475..0e003a0e 100644
--- a/docs/html/guide/topics/resources/available-resources.jd
+++ b/docs/html/guide/topics/resources/available-resources.jd
@@ -225,7 +225,7 @@
<p>
The following declares two strings: the first — simple text with no
formatting (resulting in a CharSequence that is simply a String object) — the second includes formatting information in the string (resulting
- in a CharSequence that is a complex data structure). If you are using the custom editor for string files in Eclipse, the HTML formatting tags will automatically be escaped and you will need to use {@link android.content.Context#getString(int) Context.getString()} and {@link android.text.Html#fromHtml} to retreive the resource and then convert it to formatted text.
+ in a CharSequence that is a complex data structure). If you are using the custom editor for string files in Eclipse, the HTML formatting tags will automatically be escaped and you will need to use {@link android.content.Context#getString(int) Context.getString()} and {@link android.text.Html#fromHtml} to retrieve the resource and then convert it to formatted text.
</p>
<pre>
<resources>
diff --git a/docs/html/guide/topics/resources/localization.jd b/docs/html/guide/topics/resources/localization.jd
index f32f1ac..192695b 100755
--- a/docs/html/guide/topics/resources/localization.jd
+++ b/docs/html/guide/topics/resources/localization.jd
@@ -51,7 +51,7 @@
<h2>See also</h2>
<ol>
<li><a
-href="{@docRoot}guide/tutorials/localization/index.html">Hello, L10N Tutorial</a></li>
+href="{@docRoot}resources/tutorials/localization/index.html">Hello, L10N Tutorial</a></li>
<li><a href="resources-i18n.html">Resources</a></li>
<li><a href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout</a></li>
<li><a href="{@docRoot}reference/android/app/Activity.html#ActivityLifecycle">Activity Lifecycle</a></li>
@@ -90,7 +90,7 @@
</ul>
<p>The <a
-href="{@docRoot}guide/tutorials/localization/index.html">Hello, L10N
+href="{@docRoot}resources/tutorials/localization/index.html">Hello, L10N
</a> tutorial takes you through the steps of creating a simple localized
application that uses locale-specific resources in the way described in this
document. </p>
diff --git a/docs/html/guide/topics/resources/resources-i18n.jd b/docs/html/guide/topics/resources/resources-i18n.jd
index 091bc62..fcf2af9 100755
--- a/docs/html/guide/topics/resources/resources-i18n.jd
+++ b/docs/html/guide/topics/resources/resources-i18n.jd
@@ -643,14 +643,14 @@
<p>Android will pick which of the various underlying resource files should be
used at runtime, depending on the current configuration of the device.
The example used here assumes the following device configuration:</p>
-<blockquote>
- <p>Locale = <code>en-GB</code><br>
+
+ <p style="margin-left:2em">Locale = <code>en-GB</code><br>
Screen orientation = <code>port</code><br>
Screen pixel density = <code>mdpi</code><br>
Touchscreen type = <code>notouch</code><br>
Primary text input method = <code>12key</code><br>
</p>
-</blockquote>
+
<p>Here is how Android makes the selection: </p>
<ol>
<li>
@@ -762,7 +762,7 @@
contains all of the standard view attributes: padding, visibility,
background, etc.; when View is inflated it uses this style class to
retrieve those values from the XML file (at which point style and theme
-information is applied as approriate) and load them into its instance.</p>
+information is applied as appropriate) and load them into its instance.</p>
<p><strong>Configuration</strong>: For any particular resource identifier, there may be
multiple different available values depending on the current configuration.
diff --git a/docs/html/guide/topics/ui/binding.jd b/docs/html/guide/topics/ui/binding.jd
index 85aed18..6ac0bb0 100644
--- a/docs/html/guide/topics/ui/binding.jd
+++ b/docs/html/guide/topics/ui/binding.jd
@@ -13,9 +13,9 @@
<h2>See also</h2>
<ol>
- <li><a href="{@docRoot}guide/tutorials/views/hello-spinner.html">Hello Spinner tutorial</a></li>
- <li><a href="{@docRoot}guide/tutorials/views/hello-listview.html">Hello ListView tutorial</a></li>
- <li><a href="{@docRoot}guide/tutorials/views/hello-gridview.html">Hello GridView tutorial</a></li>
+ <li><a href="{@docRoot}resources/tutorials/views/hello-spinner.html">Hello Spinner tutorial</a></li>
+ <li><a href="{@docRoot}resources/tutorials/views/hello-listview.html">Hello ListView tutorial</a></li>
+ <li><a href="{@docRoot}resources/tutorials/views/hello-gridview.html">Hello GridView tutorial</a></li>
</ol>
</div>
</div>
@@ -37,7 +37,7 @@
<h2 id="FillingTheLayout">Filling the Layout with Data</h2>
<p>Inserting data into the layout is typically done by binding the AdapterView class to an {@link
-android.widget.Adapter}, which retireves data from an external source (perhaps a list that
+android.widget.Adapter}, which retrieves data from an external source (perhaps a list that
the code supplies or query results from the device's database). </p>
<p>The following code sample does the following:</p>
<ol>
@@ -68,7 +68,7 @@
android.R.layout.simple_spinner_item, // Use a template
// that displays a
// text view
- cur, // Give the cursor to the list adatper
+ cur, // Give the cursor to the list adapter
new String[] {People.NAME}, // Map the NAME column in the
// people database to...
new int[] {android.R.id.text1}); // The "text1" view defined in
@@ -86,7 +86,7 @@
that the data has been changed and it should refresh itself.</p>
<h2 id="HandlingUserSelections">Handling User Selections</h2>
-<p>You handle the user's selecction by setting the class's {@link
+<p>You handle the user's selection by setting the class's {@link
android.widget.AdapterView.OnItemClickListener} member to a listener and
catching the selection changes. </p>
<pre>
@@ -107,7 +107,7 @@
<div class="special">
<p>For more discussion on how to create different AdapterViews, read the following tutorials:
-<a href="{@docRoot}guide/tutorials/views/hello-spinner.html">Hello Spinner</a>,
-<a href="{@docRoot}guide/tutorials/views/hello-listview.html">Hello ListView</a>, and
-<a href="{@docRoot}guide/tutorials/views/hello-gridview.html">Hello GridView</a>.
+<a href="{@docRoot}resources/tutorials/views/hello-spinner.html">Hello Spinner</a>,
+<a href="{@docRoot}resources/tutorials/views/hello-listview.html">Hello ListView</a>, and
+<a href="{@docRoot}resources/tutorials/views/hello-gridview.html">Hello GridView</a>.
</div>
diff --git a/docs/html/guide/topics/ui/custom-components.jd b/docs/html/guide/topics/ui/custom-components.jd
index 76d1034..900e08b 100644
--- a/docs/html/guide/topics/ui/custom-components.jd
+++ b/docs/html/guide/topics/ui/custom-components.jd
@@ -61,7 +61,7 @@
</li>
<li>
You could override the way that an EditText component is rendered on the screen
- (the <a href="{@docRoot}guide/samples/NotePad/index.html">Notepad Tutorial</a> uses this to good effect,
+ (the <a href="{@docRoot}resources/samples/NotePad/index.html">Notepad Tutorial</a> uses this to good effect,
to create a lined-notepad page).
</li>
<li>
@@ -159,7 +159,7 @@
<p class="note"><strong>Note:</strong>
This does not apply to 3D graphics. If you want to
use 3D graphics, you must extend {@link android.view.SurfaceView SurfaceView}
-instead of View, and draw from a seperate thread. See the
+instead of View, and draw from a separate thread. See the
GLSurfaceViewActivity sample
for details.</p>
@@ -318,9 +318,9 @@
<h3 id="customexample">A Custom View Example</h3>
<p>The CustomView sample in the
-<a href="{@docRoot}guide/samples/ApiDemos/index.html">API Demos</a> provides an example
+<a href="{@docRoot}resources/samples/ApiDemos/index.html">API Demos</a> provides an example
of a customized View. The custom View is defined in the
-<a href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html">LabelView</a>
+<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html">LabelView</a>
class.</p>
<p>The LabelView sample demonstrates a number of different aspects of custom components:</p>
<ul>
@@ -339,7 +339,7 @@
provided canvas.</li>
</ul>
<p>You can see some sample usages of the LabelView custom View in
-<a href="{@docRoot}guide/samples/ApiDemos/res/layout/custom_view_1.html">custom_view_1.xml</a>
+<a href="{@docRoot}resources/samples/ApiDemos/res/layout/custom_view_1.html">custom_view_1.xml</a>
from the samples. In particular, you can see a mix of both <code>android:</code>
namespace parameters and custom <code>app:</code> namespace parameters. These
<code>app:</code> parameters are the custom ones that the LabelView recognizes
@@ -443,10 +443,10 @@
similar to what you want, you can simply extend that component and just
override the behavior that you want to change. You can do all of the things
you would do with a fully customized component, but by starting with a more
-specialized class in the View heirarchy, you can also get a lot of behavior for
+specialized class in the View hierarchy, you can also get a lot of behavior for
free that probably does exactly what you want.</p>
<p>For example, the SDK includes a <a
-href="{@docRoot}guide/samples/NotePad/index.html">NotePad application</a> in the
+href="{@docRoot}resources/samples/NotePad/index.html">NotePad application</a> in the
samples. This demonstrates many aspects of using the Android platform, among
them is extending an EditText View to make a lined notepad. This is not a
perfect example, and the APIs for doing this might change from this early
@@ -455,7 +455,7 @@
NotePad sample into Eclipse (or
just look at the source using the link provided). In particular look at the definition of
<code>MyEditText</code> in the <a
-href="{@docRoot}guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">NoteEditor.java</a>
+href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">NoteEditor.java</a>
file.</p>
<p>Some points to note here</p>
<ol>
diff --git a/docs/html/guide/topics/ui/declaring-layout.jd b/docs/html/guide/topics/ui/declaring-layout.jd
index 80ad7b8..662efbf 100644
--- a/docs/html/guide/topics/ui/declaring-layout.jd
+++ b/docs/html/guide/topics/ui/declaring-layout.jd
@@ -65,7 +65,7 @@
<p class="note"><strong>Tip:</strong> Learn more about different layout types in <a href="{@docRoot}guide/topics/ui/layout-objects.html">Common
Layout Objects</a>. There are also a collection of tutorials on building various layouts in the
-<a href="{@docRoot}guide/tutorials/views/index.html">Hello Views</a> tutorial guide.</p>
+<a href="{@docRoot}resources/tutorials/views/index.html">Hello Views</a> tutorial guide.</p>
<h2 id="write">Write the XML</h2>
@@ -119,7 +119,7 @@
<p>The <code>onCreate()</code> callback method in your Activity is called by the Android framework when
your Activity is launched (see the discussion on Lifecycles, in the
-<a href="{@docRoot}guide/topics/fundamentals.html#lcycles">Application Fundamantals</a>, for more on this).</p>
+<a href="{@docRoot}guide/topics/fundamentals.html#lcycles">Application Fundamentals</a>, for more on this).</p>
<h2 id="attributes">Attributes</h2>
diff --git a/docs/html/guide/topics/ui/dialogs.jd b/docs/html/guide/topics/ui/dialogs.jd
index 4e4ca14..74b544b 100644
--- a/docs/html/guide/topics/ui/dialogs.jd
+++ b/docs/html/guide/topics/ui/dialogs.jd
@@ -47,10 +47,10 @@
See <a href="#ProgressDialog">Creating a ProgressDialog</a> below.</dd>
<dt>{@link android.app.DatePickerDialog}</dt>
<dd>A dialog that allows the user to select a date. See the
- <a href="{@docRoot}guide/tutorials/views/hello-datepicker.html">Hello DatePicker</a> tutorial.</dd>
+ <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Hello DatePicker</a> tutorial.</dd>
<dt>{@link android.app.TimePickerDialog}</dt>
<dd>A dialog that allows the user to select a time. See the
- <a href="{@docRoot}guide/tutorials/views/hello-timepicker.html">Hello TimePicker</a> tutorial.</dd>
+ <a href="{@docRoot}resources/tutorials/views/hello-timepicker.html">Hello TimePicker</a> tutorial.</dd>
</dl>
<p>If you would like to customize your own dialog, you can extend the
@@ -154,7 +154,7 @@
<h3>Using dismiss listeners</h3>
-<p>If you'd like your applcation to perform some procedures the moment that a dialog is dismissed,
+<p>If you'd like your application to perform some procedures the moment that a dialog is dismissed,
then you should attach an on-dismiss listener to your Dialog.</p>
<p>First define the {@link android.content.DialogInterface.OnDismissListener} interface.
diff --git a/docs/html/guide/topics/ui/how-android-draws.jd b/docs/html/guide/topics/ui/how-android-draws.jd
index 21f9833..efb55a2 100644
--- a/docs/html/guide/topics/ui/how-android-draws.jd
+++ b/docs/html/guide/topics/ui/how-android-draws.jd
@@ -51,7 +51,7 @@
</p>
<div class="sidebox"><p>
- To intiate a layout, call <code>{@link android.view.View#requestLayout}</code>. This method is typically
+ To initiate a layout, call <code>{@link android.view.View#requestLayout}</code>. This method is typically
called by a View on itself when it believes that is can no longer fit within
its current bounds.</p>
</div>
@@ -86,7 +86,7 @@
child. The child must use this size, and guarantee that all of its
descendants will fit within this size.</li>
<li><var>AT_MOST</var>: This is used by the parent to impose a maximum size on the
- child. The child must gurantee that it and all of its descendants will fit
+ child. The child must guarantee that it and all of its descendants will fit
within this size.</li>
</ul>
diff --git a/docs/html/guide/topics/ui/index.jd b/docs/html/guide/topics/ui/index.jd
index ef23672..494bda8 100644
--- a/docs/html/guide/topics/ui/index.jd
+++ b/docs/html/guide/topics/ui/index.jd
@@ -74,7 +74,7 @@
<p>The most common way to define your layout and express the view hierarchy is with an XML layout file.
XML offers a human-readable structure for the layout, much like HTML. Each element in XML is
-either a View or ViewGroup object (or descendent thereof). View objects are leaves in the tree,
+either a View or ViewGroup object (or descendant thereof). View objects are leaves in the tree,
ViewGroup objects are branches in the tree (see the View Hierarchy figure above).</p>
<p>The name of an XML element
is respective to the Java class that it represents. So a <code><TextView></code> element creates
diff --git a/docs/html/guide/topics/ui/layout-objects.jd b/docs/html/guide/topics/ui/layout-objects.jd
index bb13a188..345e9b3 100644
--- a/docs/html/guide/topics/ui/layout-objects.jd
+++ b/docs/html/guide/topics/ui/layout-objects.jd
@@ -19,7 +19,7 @@
<p>This section describes some of the more common types of layout objects
to use in your applications. Like all layouts, they are subclasses of {@link android.view.ViewGroup ViewGroup}.</p>
-<p>Also see the <a href="{@docRoot}guide/tutorials/views/index.html">Hello Views</a> tutorials for
+<p>Also see the <a href="{@docRoot}resources/tutorials/views/index.html">Hello Views</a> tutorials for
some guidance on using more Android View layouts.</p>
<h2 id="framelayout">FrameLayout</h2>
@@ -83,7 +83,7 @@
<code>android:baselineAligned="false"</code> in the layout XML. </p>
<p>To view other sample code, see the
-<a href="{@docRoot}guide/tutorials/views/hello-linearlayout.html">Hello LinearLayout</a> tutorial.</p>
+<a href="{@docRoot}resources/tutorials/views/hello-linearlayout.html">Hello LinearLayout</a> tutorial.</p>
<h2 id="tablelayout">TableLayout</h2>
@@ -138,7 +138,7 @@
fits the screen. See the {@link android.widget.TableLayout TableLayout reference}
documentation for more details. </p>
-<p>To view sample code, see the <a href="{@docRoot}guide/tutorials/views/hello-tablelayout.html">Hello
+<p>To view sample code, see the <a href="{@docRoot}resources/tutorials/views/hello-tablelayout.html">Hello
TableLayout</a> tutorial.</p>
@@ -208,7 +208,7 @@
For example, assigning the parameter <code>toLeft="my_button"</code> to a TextView would place the TextView to
the left of the View with the ID <var>my_button</var> (which must be written in the XML <em>before</em> the TextView). </p>
-<p>To view this sample code, see the <a href="{@docRoot}guide/tutorials/views/hello-relativelayout.html">Hello
+<p>To view this sample code, see the <a href="{@docRoot}resources/tutorials/views/hello-relativelayout.html">Hello
RelativeLayout</a> tutorial.</p>
diff --git a/docs/html/guide/topics/ui/menus.jd b/docs/html/guide/topics/ui/menus.jd
index bae94ca..cf3c7de 100644
--- a/docs/html/guide/topics/ui/menus.jd
+++ b/docs/html/guide/topics/ui/menus.jd
@@ -86,7 +86,7 @@
Usually, you'll want to use one that accepts an <var>itemId</var> argument.
This is a unique integer that allows you to identify the item during a callback.</p>
-<p>When a menu item is selected from the Options Menu, you will recieve a callback to the
+<p>When a menu item is selected from the Options Menu, you will receive a callback to the
<code>{@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}</code>
method of your Activity. This callback passes you the
<code>MenuItem</code> that has been selected. You can identify the item by requesting the
@@ -180,7 +180,7 @@
<code>{@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()}</code>.</p>
<p>For example, here is some code that can be used with the
-<a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad application</a>
+<a href="{@docRoot}resources/tutorials/notepad/index.html">Notepad application</a>
to add a context menu for each note in the list:</p>
<pre>
public void onCreateContextMenu(ContextMenu menu, View v,
@@ -216,7 +216,7 @@
All we need from
this is the list ID for the selected item, so whether editing a note or deleting it,
we find the ID with the {@code AdapterContextMenuInfo.info} field of the object. This ID
-is passed to the <code>editNote()</code> and <code>deleteNote()</code> methods to perfrom
+is passed to the <code>editNote()</code> and <code>deleteNote()</code> methods to perform
the respective action.</p>
<p>Now, to register this context menu for all the items in a {@link android.widget.ListView},
@@ -338,7 +338,7 @@
<img align="right" src="{@docRoot}images/radio_buttons.png" alt="" />
<p>Any menu item can be used as an interface for turning options on and off. This can
be indicated with a checkbox for stand-alone options, or radio buttons for groups of
-mutually exlusive options (see the screenshot, to the right).</p>
+mutually exclusive options (see the screenshot, to the right).</p>
<p class="note"><strong>Note:</strong> Menu items in the Icon Menu cannot
display a checkbox or radio button. If you choose to make items in the Icon Menu checkable,
@@ -490,7 +490,7 @@
null, // Specific items to place first (none)
intent, // Intent created above that describes our requirements
0, // Additional flags to control items (none)
- null); // Array of MenuItems that corrolate to specific items (none)
+ null); // Array of MenuItems that correlate to specific items (none)
return true;
}</pre>
@@ -518,5 +518,5 @@
<a href="/guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> document.</p>
<p>For a sample application using this technique, see the
-<a href="{@docRoot}guide/samples/NotePad/index.html">Note Pad</a>
+<a href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a>
sample code.</p>
diff --git a/docs/html/guide/topics/ui/notifiers/index.jd b/docs/html/guide/topics/ui/notifiers/index.jd
index 5b37f5b6..f7ccce7 100644
--- a/docs/html/guide/topics/ui/notifiers/index.jd
+++ b/docs/html/guide/topics/ui/notifiers/index.jd
@@ -25,7 +25,7 @@
<li>When an event such as saving a file is complete, a small message
should appear to confirm that the save was successful.</li>
<li>If the application is running in the background and needs the user's attention,
-the application should create a notificaiton that allows the user to respond at
+the application should create a notification that allows the user to respond at
his or her convenience.</li>
<li>If the application is
performing work that the user must wait for (such as loading a file),
@@ -49,7 +49,7 @@
<img src="{@docRoot}images/toast.png" alt="" style="float:right" />
-<p>A toast notificaiton is a message that pops up on the surface of the window.
+<p>A toast notification is a message that pops up on the surface of the window.
It only fills the amount of space required for the message and the user's current
activity remains visible and interactive. The notification automatically fades in and
out, and does not accept interaction events. Because a toast can be created from a background
@@ -97,7 +97,7 @@
<p>You should use a dialog when you need to show a progress bar or a short
message that requires confirmation from the user (such as an alert with "OK" and "Cancel" buttons).
-You can use also use dialogs as integral componenents
+You can use also use dialogs as integral components
in your application's UI and for other purposes besides notifications.
For a complete discussion on all the available types of dialogs,
including its uses for notifications, refer to
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
index e6fa48fe..a0dd9f1 100644
--- a/docs/html/guide/topics/ui/notifiers/notifications.jd
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -316,7 +316,7 @@
your notification is on-going.</dd>
<dt><var>number</var> field</dt>
<dd>This value indicates the current number of events represented by the notification.
- The appropriate number is overlayed on top of the status bar icon.
+ The appropriate number is overlaid on top of the status bar icon.
If you intend to use this field, then you must start with "1" when the Notification is first
created. (If you change the value from zero to anything greater during an update, the number
is not shown.)</dd>
@@ -375,7 +375,7 @@
</pre>
<p>This layout is used for the expanded view,
- but the content of the ImageView and TextView still needs to be defined by the applicaiton.
+ but the content of the ImageView and TextView still needs to be defined by the application.
RemoteViews offers some convenient methods that allow you to define this content...</p>
</li>
@@ -389,7 +389,7 @@
notification.contentView = contentView;
</pre>
- <p>As shown here, pass the applicaiton's package name and the layout
+ <p>As shown here, pass the application's package name and the layout
resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView,
using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()}
and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}.
diff --git a/docs/html/guide/topics/ui/notifiers/toasts.jd b/docs/html/guide/topics/ui/notifiers/toasts.jd
index a800c3c..5b324d2 100644
--- a/docs/html/guide/topics/ui/notifiers/toasts.jd
+++ b/docs/html/guide/topics/ui/notifiers/toasts.jd
@@ -18,7 +18,7 @@
</div>
</div>
-<p>A toast notificaiton is a message that pops up on the surface of the window.
+<p>A toast notification is a message that pops up on the surface of the window.
It only fills the amount of space required for the message and the user's current
activity remains visible and interactive. The notification automatically fades in and
out, and does not accept interaction events.</p>
diff --git a/docs/html/guide/topics/ui/themes.jd b/docs/html/guide/topics/ui/themes.jd
index 41e8563..03995126 100644
--- a/docs/html/guide/topics/ui/themes.jd
+++ b/docs/html/guide/topics/ui/themes.jd
@@ -111,7 +111,7 @@
</p>
<h3 id="inTheManifest">Set the theme in the manifest</h3>
-<p>To set this theme for all the activites of your application, open the AndroidManifest.xml file and
+<p>To set this theme for all the activities of your application, open the AndroidManifest.xml file and
edit the <code><application></code> tag to include the <code>android:theme</code> attribute with the
theme name:</p>
diff --git a/docs/html/guide/topics/ui/ui-events.jd b/docs/html/guide/topics/ui/ui-events.jd
index 5628d46..ccef64f 100644
--- a/docs/html/guide/topics/ui/ui-events.jd
+++ b/docs/html/guide/topics/ui/ui-events.jd
@@ -15,7 +15,7 @@
<h2>See also</h2>
<ol>
- <li><a href="{@docRoot}guide/tutorials/views/hello-formstuff.html">Hello Form Stuff tutorial</a></li>
+ <li><a href="{@docRoot}resources/tutorials/views/hello-formstuff.html">Hello Form Stuff tutorial</a></li>
</ol>
</div>
</div>
@@ -139,7 +139,7 @@
this event can have multiple actions that follow each other. So, if you return <em>false</em> when the
down action event is received, you indicate that you have not consumed the event and are also
not interested in subsequent actions from this event. Thus, you will not be called for any other actions
- within the event, such as a fingure gesture, or the eventual up action event.</li>
+ within the event, such as a finger gesture, or the eventual up action event.</li>
</ul>
<p>Remember that key events are always delivered to the View currently in focus. They are dispatched starting from the top
diff --git a/docs/html/guide/topics/views/custom-views.jd b/docs/html/guide/topics/views/custom-views.jd
index c5f9346..8589b1a 100644
--- a/docs/html/guide/topics/views/custom-views.jd
+++ b/docs/html/guide/topics/views/custom-views.jd
@@ -40,7 +40,7 @@
</li>
<li>
You could override the way that an EditText component is rendered on the screen
- (the <a href="{@docRoot}guide/samples/NotePad/">Notepad sample</a> uses this to good effect,
+ (the <a href="{@docRoot}resources/samples/NotePad/">Notepad sample</a> uses this to good effect,
to create a lined-notepad page).
</li>
<li>
@@ -151,7 +151,7 @@
<p><em>Note:</em>
Except for 3D graphics. If you want to
use 3D graphics, you must extend {@link android.view.SurfaceView SurfaceView}
-instead of View, and draw from a seperate thread. See the
+instead of View, and draw from a separate thread. See the
GLSurfaceViewActivity sample
for details.</p>
<p><code>onMeasure()</code> is a little more involved. <code>onMeasure()</code>
@@ -171,7 +171,7 @@
<li>
The overridden <code>onMeasure()</code> method is called with width and
height measure specifications (<code>widthMeasureSpec</code> and
- <code>heighMeasureSpec</code> parameters, both are integer codes
+ <code>heightMeasureSpec</code> parameters, both are integer codes
representing dimensions) which should be treated as requirements for
the restrictions on the width and height measurements you should produce. A
full reference to the kind of restrictions these specifications can require
@@ -434,7 +434,7 @@
similar to what you want, you can simply extend that component and just
override the behavior that you want to change. You can do all of the things
you would do with a fully customized component, but by starting with a more
-specialized class in the View heirarchy, you can also get a lot of behavior for
+specialized class in the View hierarchy, you can also get a lot of behavior for
free that probably does exactly what you want.</p>
<p>For example, the SDK includes a <a
href="{@docRoot}samples/NotePad/index.html">NotePad application</a> in the
diff --git a/docs/html/guide/topics/wireless/bluetooth.jd b/docs/html/guide/topics/wireless/bluetooth.jd
index 8a0efc9..80aa0d7 100644
--- a/docs/html/guide/topics/wireless/bluetooth.jd
+++ b/docs/html/guide/topics/wireless/bluetooth.jd
@@ -34,6 +34,12 @@
<li><a href="#ManagingAConnection">Managing a Connection</a></li>
</ol>
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}resources/samples/BluetoothChat/index.html">Bluetooth Chat sample
+ app</a></li>
+ </ol>
+
</div>
</div>
@@ -826,4 +832,7 @@
This should always be called when you're done using the Bluetooth
connection.</p>
-
+<div class="special">
+<p>For a complete demonstration using the Bluetooth APIs, see the <a
+href="{@docRoot}resources/samples/BluetoothChat/index.html">Bluetooth Chat sample app</a>.</p>
+</div>
diff --git a/docs/html/guide/topics/wireless/index.jd b/docs/html/guide/topics/wireless/index.jd
index a3a2b363f..23d2f0f 100644
--- a/docs/html/guide/topics/wireless/index.jd
+++ b/docs/html/guide/topics/wireless/index.jd
@@ -1,8 +1,9 @@
page.title=Wireless Controls
@jd:body
+Go away.
-
+<!--
<h2>Wi-Fi</h2>
<p>The Wi-Fi APIs provide a means by which application can communicate with the lower-level
wireless stack that provides Wi-Fi network access. Almost all information from the device supplicant
@@ -12,8 +13,11 @@
<h2>Bluetooth</h2>
-<p>The Bluetooth APIs allow applications to scan, connect and pair with other Bluetooth devices.
-THESE APIS ARE NOT YET AVAILABLE.</p>
-
+<p>The Android platform includes support for the Bluetooth network stack, which allows a device to
+wirelessly exchange data with other Bluetooth devices. The application framework provides access to
+the Bluetooth functionality through the Android Bluetooth APIs. These APIs let applications
+wirelessly connect to other Bluetooth devices, enabling point-to-point and multipoint wireless
+features.</p>
+-->
diff --git a/docs/html/guide/topics/wireless/wifi.jd b/docs/html/guide/topics/wireless/wifi.jd
index 520feafe..761e463 100644
--- a/docs/html/guide/topics/wireless/wifi.jd
+++ b/docs/html/guide/topics/wireless/wifi.jd
@@ -15,4 +15,4 @@
</div>
-TODO
\ No newline at end of file
+Go away.
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/hello-world.jd b/docs/html/guide/tutorials/hello-world.jd
index 58d1a16..f6b54ff 100644
--- a/docs/html/guide/tutorials/hello-world.jd
+++ b/docs/html/guide/tutorials/hello-world.jd
@@ -478,12 +478,12 @@
because it lets you quickly and interactively locate the specific reference
you're looking for.</p>
-<p>It's possible yours looks slighly different than this (perhaps the hexadecimal values are different).
+<p>It's possible yours looks slightly different than this (perhaps the hexadecimal values are different).
For now, notice the inner class named "layout", and its
member field "main". The Eclipse plugin noticed the XML
layout file named main.xml and generated a class for it here. As you add other
resources to your project (such as strings in the <code>res/values/string.xml</code> file or drawables inside
-the <code>res/drawable/</code> direcory) you'll see <code>R.java</code> change to keep up.</p>
+the <code>res/drawable/</code> directory) you'll see <code>R.java</code> change to keep up.</p>
<p>When not using Eclipse, this class file will be generated for you at build time (with the Ant tool).</p>
<p><em>You should never edit this file by hand.</em></p>
</div>
diff --git a/docs/html/guide/tutorials/views/hello-autocomplete.jd b/docs/html/guide/tutorials/views/hello-autocomplete.jd
index fba1ad8..07235a1 100644
--- a/docs/html/guide/tutorials/views/hello-autocomplete.jd
+++ b/docs/html/guide/tutorials/views/hello-autocomplete.jd
@@ -44,7 +44,7 @@
textView.setAdapter(adapter);
}
</pre>
- <p>Here, we create an AutoComplteteTextView from our layout. We then
+ <p>Here, we create an AutoCompleteTextView from our layout. We then
create an {@link android.widget.ArrayAdapter} that binds a <code>simple_dropdown_item_1line</code>
layout item to each entry in the <code>COUNTRIES</code> array (which we'll add next).
The last part sets the ArrayAdapter to associate with our AutoCompleteTextView.</p>
diff --git a/docs/html/guide/tutorials/views/hello-formstuff.jd b/docs/html/guide/tutorials/views/hello-formstuff.jd
index da4289c..b554001 100644
--- a/docs/html/guide/tutorials/views/hello-formstuff.jd
+++ b/docs/html/guide/tutorials/views/hello-formstuff.jd
@@ -175,7 +175,7 @@
</li>
<li>To do something when each is selected, we'll need an OnClickListener. Unlike the other
listeners we've created, instead of creating this one as an anonymous inner class,
-we'll create it as a new object. This way, we can re-use the OnClickLIstener for
+we'll create it as a new object. This way, we can re-use the OnClickListener for
both RadioButtons. So, add the following code in the HelloFormStuff Activity
(<em>outside</em> the <code>onCreate()</code> method):
<pre>
diff --git a/docs/html/guide/tutorials/views/hello-gridview.jd b/docs/html/guide/tutorials/views/hello-gridview.jd
index ffb6c93..186c4e7 100644
--- a/docs/html/guide/tutorials/views/hello-gridview.jd
+++ b/docs/html/guide/tutorials/views/hello-gridview.jd
@@ -94,7 +94,7 @@
}
</pre>
<p>First we take care of some required methods inherited from BaseAdapter.
- The constructor and <code>getCount()</code> are self-explanitory. Normally, <code>getItem()</code>
+ The constructor and <code>getCount()</code> are self-explanatory. Normally, <code>getItem()</code>
should return the actual object at the specified position in our Adapter, but for this Hello World,
we're not going to bother. Likewise, <code>getItemId()</code> should return the row id of
the item, but right now we don't care.</p>
diff --git a/docs/html/guide/tutorials/views/hello-mapview.jd b/docs/html/guide/tutorials/views/hello-mapview.jd
index 7a21485..458db4f 100644
--- a/docs/html/guide/tutorials/views/hello-mapview.jd
+++ b/docs/html/guide/tutorials/views/hello-mapview.jd
@@ -81,7 +81,7 @@
<li>Now open the HelloMapView.java file. For this Activity, we're going to extend the special sub-class of
Activity called MapActivity, so change the class declaration to extend
- MapActicity, instead of Activity:</p>
+ MapActivity, instead of Activity:</p>
<pre>public class HelloMapView extends MapActivity {</pre>
diff --git a/docs/html/guide/tutorials/views/hello-tabwidget.jd b/docs/html/guide/tutorials/views/hello-tabwidget.jd
index 8424616..98dddf53 100644
--- a/docs/html/guide/tutorials/views/hello-tabwidget.jd
+++ b/docs/html/guide/tutorials/views/hello-tabwidget.jd
@@ -53,7 +53,7 @@
be associated with a different tab.
In this case, each tab simply shows a different {@link android.widget.TextView} with some text. </p>
<p>Notice that the TabWidget and the FrameLayout elements have specific <code>android</code> namespace IDs. These are necessary
- so that the TabHost can automatically retireve references to them, populate the TabWidget with the tabs that we'll define
+ so that the TabHost can automatically retrieve references to them, populate the TabWidget with the tabs that we'll define
in our code, and swap the views in the FrameLayout. We've also defined our own IDs for each TextView, which we'll use to
associate each tab with the view that it should reveal.</p>
<p>Of course, you can
diff --git a/docs/html/images/icon_dashboard.png b/docs/html/images/icon_dashboard.png
new file mode 100644
index 0000000..04793e0
--- /dev/null
+++ b/docs/html/images/icon_dashboard.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index 0d72e80..7c28583 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -20,7 +20,8 @@
</div> <!-- end annoucement -->
</div> <!-- end annoucement-block -->
</div><!-- end topAnnouncement -->
- <div id="carouselMain" style="height:215px"> <!-- this height can be adjusted based on the content height -->
+ <div id="carouselMain" style="height:200px"> <!-- this height can be
+ adjusted based on the content height -->
</div>
<div class="clearer"></div>
<div id="carouselWheel">
@@ -46,7 +47,7 @@
<td class="imageCell"><a href="{@docRoot}sdk/index.html"><img src="{@docRoot}assets/images/icon_download.jpg" style="padding:0" /></a></td>
<td>
<h2 class="green">Download</h2>
- <p>The Android SDK the tools, sample code, and docs you need to create great apps.</p>
+ <p>The Android SDK has the tools, sample code, and docs you need to create great apps.</p>
<p><a href="{@docRoot}sdk/index.html">Learn more »</a></p>
</td>
</tr>
@@ -76,11 +77,17 @@
<td colspan="2"><div class="seperator"> </div></td>
</tr>
<tr>
- <td class="imageCell"><a href="http://www.youtube.com/user/androiddevelopers"><img src="{@docRoot}assets/images/video-droid.png" style="padding:0" /></a></td>
+ <td class="imageCell"><a
+href="{@docRoot}resources/dashboard/platform-versions.html"><img
+src="{@docRoot}images/icon_dashboard.png" style="padding:0" /></a></td>
<td>
- <h2 class="green">Watch</h2>
- <object width="150" height="140"><param name="movie" value="http://www.youtube.com/v/N6YdwzAvwOA&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/N6YdwzAvwOA&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="150" height="140"></embed></object>
- <p style="margin-top:1em"><a href="{@docRoot}videos/index.html">More Android videos »</a></p>
+ <h2 class="green">Target Devices</h2>
+ <p>The Device Dashboard
+provides information about deployed Android devices to
+help you target suitable device configurations as you build and update your
+apps.</p>
+ <p><a
+href="{@docRoot}resources/dashboard/platform-versions.html">Learn more »</a></p>
</td>
</tr>
@@ -120,18 +127,17 @@
'sdk': {
'layout':"imgLeft",
'icon':"sdk-small.png",
- 'name':"Android 2.0.1",
- 'img':"eclair-android.png",
- 'title':"Android 2.0.1",
- 'desc': "<p>Android 2.0.1 is a minor platform update to Android 2.0. "
- + "For information about what's included in the new platform, read "
- + "the <a href='{@docRoot}sdk/android-2.0.1.html'>Android 2.0.1 "
+ 'name':"Android 2.1",
+ 'img':"sdk-large.png",
+ 'title':"Android 2.1 is now available",
+ 'desc': "<p>Android 2.1 is a small feature release that includes new developer APIs "
+ + "and documentation. For information about what's included in the platform, "
+ + "read the <a href='{@docRoot}sdk/android-2.1.html'>Android 2.1 "
+ "version notes</a>.</p>"
- + "<p>You can update your existing environment "
- + "by installing the Android 2.0.1 platform and updated tools as"
- + " <a href='{@docRoot}sdk/adding-components.html'>SDK "
- + "components</a>. Otherwise, "
- + "<a href='{@docRoot}sdk/index.html'>download a new Android SDK</a>.</p>"
+ + "<p>You can update your existing development environment "
+ + "by installing the Android 2.1 platform as an "
+ + "<a href='{@docRoot}sdk/adding-components.html'>SDK "
+ + "component</a>."
},
'devphone': {
diff --git a/docs/html/intl/ja/guide/basics/what-is-android.jd b/docs/html/intl/ja/guide/basics/what-is-android.jd
index 89558a0..fcf670d 100644
--- a/docs/html/intl/ja/guide/basics/what-is-android.jd
+++ b/docs/html/intl/ja/guide/basics/what-is-android.jd
@@ -39,7 +39,7 @@
<p>アプリケーションの基盤となるのは、次のサービスとシステムのセットです:
<ul>
<li>アプリケーションの構築を可能にする、拡張可能で豊富な<a
- href="{@docRoot}guide/tutorials/views/index.html">ビュー</a>のセット。ビューには、リスト、グリッド、テキスト ボックス、ボタンだけでなく、埋め込み可能なウェブブラウザも含まれます。</li>
+ href="{@docRoot}resources/tutorials/views/index.html">ビュー</a>のセット。ビューには、リスト、グリッド、テキスト ボックス、ボタンだけでなく、埋め込み可能なウェブブラウザも含まれます。</li>
<li><a href="{@docRoot}guide/topics/providers/content-providers.html">コンテンツ プロバイダ</a>を使用すると、アプリケーションのデータ(たとえば、連絡先アプリケーション)に、別のアプリケーションからアクセスしたり、データを共有させることができます。</li> <li><a
href="{@docRoot}guide/topics/resources/resources-i18n.html">リソース マネージャ</a>は、ローカライズされた文字列、グラフィックス、レイアウト ファイルなどのコード以外のリソースへのアクセスを提供します。</li>
<li>{@link android.app.NotificationManager 通知マネージャ}を使用すると、すべてのアプリケーションからステータス バーにカスタマイズした警告を表示することができます。</li>
@@ -47,7 +47,7 @@
</ul>
<p>アプリケーションの簡単な説明と詳細については、<a
-href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>をご覧ください。</p>
+href="{@docRoot}resources/tutorials/notepad/index.html">Notepad チュートリアル</a>をご覧ください。</p>
<a name="libraries" id="libraries"></a>
<h2>ライブラリ</h2>
diff --git a/docs/html/intl/ja/guide/index.jd b/docs/html/intl/ja/guide/index.jd
index 73ca18a..5d35e0a 100644
--- a/docs/html/intl/ja/guide/index.jd
+++ b/docs/html/intl/ja/guide/index.jd
@@ -41,12 +41,12 @@
</p>
<p>
-SDK のダウンロード後は、まずはじめにデベロッパー ガイドを参照してください。コードを実際に見てみることから始めたい場合は、簡単な <a href="{@docRoot}guide/tutorials/hello-world.html">Hello World</a> チュートリアルを参照してください。Android プラットフォーム向けに作成された標準的な「Hello, World」アプリケーションについて説明しています。<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>ドキュメントは、アプリケーション フレームワークを理解したいユーザーに最適な出発点となります。
+SDK のダウンロード後は、まずはじめにデベロッパー ガイドを参照してください。コードを実際に見てみることから始めたい場合は、簡単な <a href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a> チュートリアルを参照してください。Android プラットフォーム向けに作成された標準的な「Hello, World」アプリケーションについて説明しています。<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>ドキュメントは、アプリケーション フレームワークを理解したいユーザーに最適な出発点となります。
</p>
<p>
-不明点などがある場合は、Android ディスカッション グループへの参加をおすすめします。詳しくは上部にある [<a href="{@docRoot}community/index.html">コミュニティ</a>] タブをご覧ください。
+不明点などがある場合は、Android ディスカッション グループへの参加をおすすめします。詳しくは上部にある [<a href="{@docRoot}resources/community-groups.html">コミュニティ</a>] タブをご覧ください。
</p>
<p>デベロッパー ガイドの別のページに移動してから、このページに戻るには、[デベロッパー ガイド] タブをクリックします。 </p>
\ No newline at end of file
diff --git a/docs/html/intl/ja/guide/publishing/app-signing.jd b/docs/html/intl/ja/guide/publishing/app-signing.jd
index 23d8cf7..710591d 100644
--- a/docs/html/intl/ja/guide/publishing/app-signing.jd
+++ b/docs/html/intl/ja/guide/publishing/app-signing.jd
@@ -153,7 +153,7 @@
<p>次にビルドを行うと、ビルド ツールは新しいキーストアとデバッグ キーを再度生成します。</p>
-<p>開発コンピュータがグレゴリオ暦以外のロケールを使用している場合、ビルド ツールが誤って期限切れのデバッグ証明書を生成することがあります。このため、アプリケーションをコンパイルしようとするとエラーが発生します。解決策については、トラブルシューティング トピックの <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#signingcalendar">ビルド ツールが期限切れのデバッグ証明書を生成するため、アプリケーションがコンパイルできない</a> をご覧ください。 </p>
+<p>開発コンピュータがグレゴリオ暦以外のロケールを使用している場合、ビルド ツールが誤って期限切れのデバッグ証明書を生成することがあります。このため、アプリケーションをコンパイルしようとするとエラーが発生します。解決策については、トラブルシューティング トピックの <a href="{@docRoot}resources/faq/troubleshooting.html#signingcalendar">ビルド ツールが期限切れのデバッグ証明書を生成するため、アプリケーションがコンパイルできない</a> をご覧ください。 </p>
<h2 id="releasemode">公開リリースへの署名</h2>
diff --git a/docs/html/intl/ja/resources/community-groups.jd b/docs/html/intl/ja/resources/community-groups.jd
new file mode 100644
index 0000000..c99b1f8
--- /dev/null
+++ b/docs/html/intl/ja/resources/community-groups.jd
@@ -0,0 +1,116 @@
+community=true
+page.title=コミュニティ
+@jd:body
+
+ <div id="mainBodyFluid">
+ <h1>コミュニティ</h1>
+ <p>Android デベロッパー コミュニティへようこそ。コミュニティでのディスカッションにぜひ参加してください。投稿する前に、コミュニティ ガイドラインが記載されている<a href="http://source.android.com/discuss/android-discussion-groups-charter">グループの趣意</a>をお読みください。</p>
+
+<p class="note"><strong>注:</strong> Android ソース コード(アプリケーション開発ではなく)に関するディスカッションは、<a href="http://source.android.com/discuss">オープンソース プロジェクトのメーリング リスト</a>(英語)を参照してください。</p>
+
+<p style="margin-bottom:.5em"><strong>目次</strong></p>
+<ol class="toc">
+ <li><a href="#BeforeYouPost">質問を投稿する前に</a></li>
+ <li><a href="#ApplicationDeveloperLists">アプリケーション デベロッパー メーリング リスト</a></li>
+ <li><a href="#UsingEmail">メーリング リストにメールを使用</a></li>
+ <li><a href="#UsingIRC">IRC の使用</a></li>
+</ol>
+
+<h2 id="BeforeYouPost">質問を投稿する前に</h2>
+<p>投稿を作成する前に、下記をお試しください:</p>
+
+<ol>
+<li><a href="{@docRoot}resources/faq/index.html">よくある質問を参照します</a>。Android アプリケーションの開発について非常に一般的な質問が、この一覧に記載されており、頻繁に更新されています。</li>
+<li><strong>Android のメイン サイトの検索バー(このページの上部にあるのと同じもの)に、調べたいキーワードを入力してください</strong>。この検索は、サイト、ドキュメント、ブログに含まれるすべてのコンテンツの他に、すべてのグループで以前行われたすべてのディスカッションを網羅しています。誰か他の人が、以前にも同じ問題に遭遇した可能性は大いにあります。</li>
+<li><b>メーリング リストのアーカイブを検索</b>して、同じ質問に関するディスカッションが既に存在しないか調べてください。
+ </li>
+</ol>
+
+<p>質問への答えが見つからない場合、コミュニティで質問することをおすすめします。投稿する際は、次の手順に従ってください。
+<ol>
+<li>コミュニティ ガイドラインが記載されている<b><a href="http://sites.google.com/a/android.com/opensource/discuss/android-discussion-groups-charter">Android メーリングリストの趣意</a></b>をお読みください。
+</li>
+<li><b>質問に最適なメーリング リストを選択してください</b>。後述するように、デベロッパー向けのメーリング リストは何種類かに分かれています。</li>
+<li>
+ <b>質問の内容を明確に</b>。明確な質問は、回答者と、将来情報を探そうとする人の双方にとって有益です。</li>
+<li><b>投稿は詳しく書いてください</b>。回答者の人たちが問題を理解するのに役立ちます。コードやログのスニペット、スクリーンショットへのリンクを含めることも有用です。質問をわかりやすく表現するための詳しいガイドラインは、<a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">賢い質問のしかた</a>(英語)をご覧ください。
+ </li>
+</ol>
+
+
+<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></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></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></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></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></li>
+</ul>
+</li>
+
+<li><b>Android マーケット ヘルプフォーラム</b> - Android マーケットに関する質問や問題の報告をするための、ウェブベースのディスカッション フォーラムです。
+<ul>
+<li>URL: <a href="http://www.google.com/support/forum/p/Android+Market?hl=ja">http://www.google.com/support/forum/p/Android+Market?hl=ja</a></li>
+</ul>
+</li>
+
+</ul>
+
+
+
+<h2 id="UsingEmail">メーリング リストにメールを使用</h2>
+<p><a href="http://groups.google.com/">Google グループ</a> のサイトを使用する代わりに、メール クライアントを使用して、メーリング リストに投稿することも可能です。</p>
+<p>Google グループのサイトを使用せずに、グループに登録するには、上記の「メールで登録」のリンクを使用します。</p>
+<p>メーリング リストへの投稿をメールで受信するように設定する方法は、次のとおりです:</p>
+
+<ol><li>Google グループ サイトから、グループにログインします。たとえば android-framework グループには <a href="http://groups.google.com/group/android-framework?hl=ja">http://groups.google.com/group/android-framework?hl=ja</a> にアクセスします。</li>
+<li>右側の [メンバーステータスを編集] をクリックします。</li>
+<li>[このグループの閲覧方法] で、メール オプションのいずれかを選択します。 </li>
+</ol>
+
+<h2 id="UsingIRC">IRC の使用</h2>
+<p>Android コミュニティは irc.freenode.net サーバーの #android チャンネルを使用しています。
+</p>
+
+
+
+
+
+
+
+</div>
diff --git a/docs/html/intl/ja/resources/tutorials/hello-world.jd b/docs/html/intl/ja/resources/tutorials/hello-world.jd
new file mode 100644
index 0000000..c12965c
--- /dev/null
+++ b/docs/html/intl/ja/resources/tutorials/hello-world.jd
@@ -0,0 +1,375 @@
+page.title=Hello, World
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>このドキュメントの内容</h2>
+ <ol>
+ <li><a href="#avd">AVD の作成</a></li>
+ <li><a href="#create">プロジェクトを作成する</a></li>
+ <li><a href="#ui">UI を構築する</a></li>
+ <li><a href="#run">コードを実行する</a></li>
+ <li><a href="#upgrading">UI を XML レイアウトにアップグレードする</a></li>
+ <li><a href="#debugging">プロジェクトをデバッグする</a></li>
+ <li><a href="#noeclipse">Eclipse を使用せずにプロジェクトを作成する</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>デベロッパーにとって、開発フレームワークの第一印象は、どれだけ簡単に「Hello, World」を記述できるかで決まります。Android では、非常に簡単に記述できます。総合開発環境として Eclipse を使用している場合には、開発は特に簡単です。プロジェクトの作成と管理に使用できる便利なプラグインが用意されており、開発サイクルを大幅にスピードアップできるためです。</p>
+
+<p>Eclipse を使用していない場合でも問題ありません。<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>に慣れてから、このチュートリアルに戻り、Eclipse に関する部分以外を参考にしてください。</p>
+
+<p>開始する前に、最新の SDK がインストールされている必要があります。また、Eclipse を使用する場合には、ADT プラグインもインストールされている必要があります。これらのプログラムがインストールされていない場合は、「<a href="{@docRoot}sdk/installing.html">Installing the Android SDK</a>」を参考にインストールを実行して、完了後にこのチュートリアルに戻ってください。</p>
+
+<h2 id="avd">AVD の作成</h2>
+
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>AVD の使用方法と使用可能なオプションについて詳しくは、<a href="{@docRoot}guide/developing/tools/avd.html">Android 仮想デバイス</a> のドキュメントを参照してください。</p>
+ </div>
+</div>
+
+<p>このチュートリアルでは、開発したアプリケーションを Android エミュレータで実行します。エミュレータを起動するには、事前に Android 仮想デバイス(AVD)を作成する必要があります。AVD は、エミュレータが使用するシステム イメージとデバイスの設定を定義するものです。</p>
+
+<p>AVD を作成するには、Android SDK に含まれている「android」ツールを使用します。コマンド プロンプトまたはターミナルを開き、SDK パッケージの中の <code>tools/</code> ディレクトリに移動して、次のコマンドを実行します。
+<pre>
+android create avd --target 2 --name my_avd
+</pre>
+
+<p>カスタム ハードウェア プロファイルを作成するかどうかを尋ねられます。ここではひとまず、リターン キーを押してスキップします(デフォルトの回答は「No」となっています)以上で AVD の作成は終了です。この作業により、Android 1.5 プラットフォームを使用する「my_avd」という名前の AVD が構成されました。これで、AVD をエミュレータで使用できる状態になりました。</p>
+
+<p>上記のコマンドで使用した <code>--target</code> オプションは、エミュレータを実行する配備ターゲットを指定するもので、必須オプションです。<code>--name</code> オプションは新規 AVD の名前を定義するもので、これも必須オプションです。</p>
+
+
+<h2 id="create">新規 Android プロジェクトを作成する</h2>
+
+<p>AVD を作成したら、次は Eclipse 内で新規 Android プロジェクトを開始します。</p>
+
+<ol>
+ <li>Eclipse で、<strong>[[]ファイル(File)] > [[]新規(New)] > [[]プロジェクト(Project)]</strong> を選択します。
+ <p>ADT Plugin for Eclipse が正常にインストールされていれば、表示されるダイアログに、「Android」というラベルの付いたフォルダと、その中の「Android プロジェクト(Android Project)」が表示されます(1 つまたは複数の Android プロジェクトを作成した後は、「Android XML File」というエントリも表示されるようになります)。</p>
+ </li>
+
+ <li>「Android プロジェクト(Android Project)」を選択して、[[]<strong>次へ(Next)</strong>] をクリックします。<br/><a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a>
+ </li>
+
+ <li>プロジェクトの詳細項目に以下の値を入力します。
+ <ul>
+ <li><em>プロジェクト名(Project name):</em> HelloAndroid</li>
+ <li><em>アプリケーション名(Application name):</em> Hello, Android</li>
+ <li><em>パッケージ名(Package name):</em> com.example.helloandroid(または自分のプライベート ネームスペース)</li>
+ <li><em>アクティビティを作成(Create Activity):</em> HelloAndroid</li>
+ <li><em>SDK の最小バージョン(Min SDK Version):</em> 2</li>
+ </ul>
+ <p>[[]<strong>完了(Finish)</strong>] をクリックします。</p>
+
+ <a href="images/hello_world_1.png"><img src="images/hello_world_1.png" style="height:230px" alt="" /></a>
+
+ <p>各フィールドの説明は以下のとおりです。</p>
+
+ <dl>
+ <dt><em>プロジェクト名(Project Name)</em></dt>
+ <dd>Eclipse のプロジェクト名。プロジェクト ファイルを格納するディレクトリの名前です。</dd>
+ <dt><em>アプリケーション名(Application Name)</em></dt>
+ <dd>アプリケーション名はユーザーにわかりやすいアプリケーションのタイトルにします。この名前が Android 携帯端末に表示されます。</dd>
+ <dt><em>パッケージ名(Package Name)</em></dt>
+ <dd>作成したすべてのソース コードを格納するパッケージ ネームスペースです(Java プログラミング言語で作成するパッケージと同じルールに従います)。また、これにより、スタブ Activity が生成されるパッケージの名前も設定されます。
+ <p>パッケージ名は Android システムにインストールされたすべてのパッケージに共通して固有のものでなければなりません。このため、作成するアプリケーションに標準的なドメイン スタイルのパッケージを使用することが非常に重要です。上記の例では、「com.example」というネームスペースを使用しています。これはサンプル ドキュメント用のネームスペースです。実際にアプリケーションを作成する際には、所属する組織または法人に適切なネームスペースを使用します。</p></dd>
+ <dt><em>アクティビティを作成(Create Activity)</em></dt>
+ <dd>プラグインによって生成されるクラス スタブの名前です。クラス スタブは Android の {@link android.app.Activity} クラスのサブクラスとなります。アクティビティとは単に、実行して何らかの処理を行うことができるクラスを意味します。選択に応じて UI を作成することもできます(ただし必須ではありません)。チェックボックスになっていることからわかるように、これは任意選択の項目です。しかし、実際にはほとんどのアプリケーションでは、アクティビティをアプリケーションの基盤として使用しています。</dd>
+ <dt><em>SDK の最小バージョン(Min SDK Version)</em></dt>
+ <dd>作成するアプリケーションが必要とする最小 API レベルを指定する値です。ここに入力した API レベルが、選択可能なターゲットのいずれかで提供される API レベルと一致する場合は、ビルド ターゲットが自動的に選択されます(この例では、API レベルに「2」と入力するとターゲット Android 1.1 が選択されます)。Android システム イメージと Android SDK それぞれの新しいバージョンでは、API に追加または変更が加えられている可能性があります。追加または変更が加えられている場合、新しい API レベルがシステム イメージに割り当てられ、どのアプリケーションの実行を許可するかが規制されます。アプリケーションで必要な API レベルがデバイスでサポートされるレベルよりも<em>高い</em>場合、アプリケーションはインストールされません。</dd>
+ </dl>
+
+ <p><em>その他のフィールド</em>: 「デフォルト ロケーションの使用」チェックボックスでは、プロジェクトのファイルが生成され保存されるディスク上の場所を変更することができます。「ビルド ターゲット」は、作成するアプリケーションがコンパイルされるときにターゲットとするプラットフォームです(この項目は [[]SDK の最小バージョン(Min SDK Version)] の入力値に基づいて自動的に選択されます)。</p>
+
+ <p class="note">ここで、選択した「ビルド ターゲット」で Android 1.1 プラットフォームが使用されることに注目してください。これは、作成するアプリケーションが Android 1.1 プラットフォーム ライブラリをターゲットとしてコンパイルされることを意味します。先ほど作成した AVD は Android 1.5 プラットフォームで実行されます。バージョンの数字が一致しませんが、Android アプリケーションには上方互換性があるため、1.1 プラットフォーム ライブラリをターゲットとして構築されたアプリケーションでも 1.5 プラットフォームで正常に動作します。ただしその逆の場合は正常に動作しません。</p>
+ </li>
+</ol>
+
+<p>さて、これで Android プロジェクトを使用できる状態になりました。プロジェクトは左側のパッケージ エクスプローラー(Package Explorer)で表示できます。<em>「HelloAndroid」 > 「src」 > 「com.example.helloandroid」</em> の中にある <code>HelloAndroid.java</code> ファイルを開きます。ファイルの内容は次のようになっています。</p>
+
+<pre>
+package com.example.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>クラスが {@link android.app.Activity} クラスに基づいていることに注目してください。アクティビティ(Activity)とは、処理を実行するために使用される単体のアプリケーション エンティティです。1 つのアプリケーションにはいくつものアクティビティが含まれる場合がありますが、ユーザーが一度に操作するのは 1 つのアクティビティです。アクティビティが開始すると、Android システムによって {@link android.app.Activity#onCreate(Bundle) onCreate()} メソッドが呼び出されます。このタイミングですべての初期化と UI セットアップを実行します。アクティビティにユーザー インターフェースは必須ではありませんが、通常はユーザー インターフェースを装備します。</p>
+
+<p>では、コードを変更してみましょう。 </p>
+
+
+<h2 id="ui">UI を構築する</h2>
+
+<p>下記の変更済みのコードを参照して、お手元の HelloAndroid クラスに同じ変更を加えてみてください。太字の部分が追加された行です。</p>
+
+<pre>
+package com.android.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+<strong>import android.widget.TextView;</strong>
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ <strong>TextView tv = new TextView(this);
+ tv.setText("Hello, Android");
+ setContentView(tv);</strong>
+ }
+}</pre>
+
+<p class="note"><strong>ヒント:</strong> プロジェクトにインポート パッケージを簡単に追加できる方法として、<strong>Ctrl+Shift+O</strong>(Mac では <strong>コマンド+Shift+O</strong>)を押す方法があります。これは、コードの記述に基づいて足りないパッケージを特定して追加する Eclipse のショートカット キーです。</p>
+
+<p>Android のユーザー インターフェースは、「ビュー(Views)」と呼ばれるオブジェクトの階層で構成されています。{@link android.view.View} は、UI レイアウト内でボタン、画像、または(このサンプルのように)テキスト ラベルといった要素として使用される、描画可能なオブジェクトです。これらのオブジェクトのそれぞれが View クラスのサブクラスであり、テキストを処理するサブクラスは {@link android.widget.TextView} です。</p>
+
+<p>この変更では、クラス コンストラクタを使用して TextView を作成します。このクラス コンストラクタは、パラメータとして Android {@link android.content.Context} インスタンスを受け入れます。Context とは、システムへのハンドルであり、リソースの解決、データベースや設定へのアクセスの取得などのサービスを提供します。Activity クラスは Context を継承します。作成する HelloAndroid クラスは、Activity のサブクラスであるため、Context でもあります。したがって、<code>this</code> を Context 参照として TextView に引き渡すことができます。</p>
+
+<p>次に、{@link android.widget.TextView setText(CharSequence) setText()} を使用してテキスト コンテンツを定義します。</p>
+
+<p>最後に、そのコンテンツが Activity UI のコンテンツとして表示されるように、TextView を {@link android.app.Activity#setContentView(View) setContentView()} に引き渡します。Activity によってこのメソッドが呼び出されなければ、UI は表示されず、空白の画面が表示されます。</p>
+
+<p>これで、Android で「Hello, World」が表示されるようになりました。次の手順はもちろん、アプリケーションの実行です。</p>
+
+
+<h2 id="run">アプリケーションを実行する</h2>
+
+<p>Eclipse プラグインでは、非常に簡単にアプリケーションを実行できます。</p>
+
+<ol>
+ <li><strong>[[]実行] > [[]実行]</strong> を選択します。</li>
+ <li>「Android Application」を選択します。</li>
+</ol>
+
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>Eclipse での起動構成の作成と編集について詳しくは、「<a href="{@docRoot}guide/developing/eclipse-adt.html#RunConfig">ADT を使用した Eclipse での開発</a>」を参照してください。</p>
+ </div>
+</div>
+
+<p>Eclipse ADT によって自動的にプロジェクトの新規起動構成が作成され、Android エミュレータが自動的に起動します。エミュレータが起動した後、少し経つとアプリケーションが表示されます。次のような画面が表示されます。</p>
+
+ <a href="images/hello_world_5.png"><img src="images/hello_world_5.png" style="height:230px" alt="" /></a>
+
+<p>グレーのバーに表示されている「Hello, Android」は、アプリケーションのタイトルです。このタイトルは Eclipse プラグインによって自動的に作成されます(文字列は <code>res/values/strings.xml</code> ファイル内で定義され、<code>AndroidManifest.xml</code> によって参照されます)。タイトルの下のテキストは、先ほど TextView オブジェクトで作成した実際のテキストです。</p>
+
+<p>これで「Hello World」についての基本的なチュートリアルは終了ですが、この続きもぜひ読んでください。Android アプリケーションの開発に関するさらに有益な情報を紹介しています。</p>
+
+
+<h2 id="upgrading">UI を XML レイアウトにアップグレードする</h2>
+
+<p>先ほど作成した「Hello, World」のサンプルは、「プログラマティック」と呼ばれる UI レイアウトを使用しています。「プログラマティック」とは、アプリケーションの UI を直接ソース コードで作成および構築することを意味します。UI プログラミングの経験が豊富な方であればおそらく、このようなアプローチが時にいかに脆弱になり得るかをよくご存じでしょう。レイアウトの軽微な変更のたびに、ソース コード全体に関わる大きな問題が発生する可能性があるからです。また、複数のビューを適切に結びつけることも忘れられがちであるため、これによりレイアウトにエラーが発生し、コードのデバッグで時間が無駄になる場合があります。</p>
+
+<p>その理由から、Android では、XML ベースのレイアウト ファイルを使用する別の UI 構築モデルを用意しています。この概念を簡単に説明するには、サンプルを紹介するのが一番です。ここに示すのは、上記の「プログラマティック」に構築したサンプルと同じように動作する XML レイアウト ファイルです。</p>
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="@string/hello"/></pre>
+
+<p>Android XML レイアウト ファイルの全般的な構造はシンプルです。XML 要素がツリー構造になっており、含まれた各ノードが View クラスの名前を表しています(このサンプルでは View 要素が 1 つのみですが)。XML レイアウト内の要素として、{@link android.view.View} を拡張する任意のクラスの名前を使用できます。これには作成するコードの中で定義するカスタム View クラスも含まれます。この構造により、プログラマティックなレイアウトよりもシンプルな構造と構文を使用して、迅速な UI 構築を非常に簡単に行うことができます。このモデルは、アプリケーションの表示(つまり UI)を、データの取得と入力に使用されるアプリケーション ロジックから切り離すことができる Web 開発モデルからヒントを得て考案されました。</p>
+
+<p>上記の XML サンプルには、<code>TextView</code> という View 要素 1 つのみが含まれています。この要素は 4 つの XML 属性を持っています。下表に、これらの 4 つの属性の説明をまとめました。</p>
+
+<table>
+ <tbody>
+ <tr>
+ <th>
+ 属性
+ </th>
+ <th>
+ 説明
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <code>xmlns:android</code>
+ </td>
+ <td>
+ Android ネームスペースで定義された共通の属性を参照することを Android ツールに伝える XML ネームスペース宣言です。すべての Android レイアウト ファイル内の最初と最後のタグはこの属性を持つ必要があります。<br>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:layout_width</code>
+ </td>
+ <td>
+ 該当の View が画面の利用可能な幅のうちどれくらいを占めるかを定義します。このサンプルでは、この View しかないため、「fill_parent」という値を使用して画面全体を占めることにします。<br>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:layout_height</code>
+ </td>
+ <td>
+ android:layout_width とよく似た属性で、幅ではなく高さを表します。
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:text</code>
+ </td>
+ <td>
+ TextView が表示するテキストを設定します。このサンプルでは、ハードコード記述された文字列値ではなく文字列リソースを使用します。文字列「<em>hello</em>」は <em>res/values/strings.xml</em> ファイル内で定義されます。アプリケーションに文字列を挿入する場合にはこの方法が推奨されます。レイアウト ファイルのハードコードを直接変更する必要がないため、アプリケーションの他の言語へのローカライズがスムーズに進むからです。詳しくは、「<a href="{@docRoot}guide/topics/resources/resources-i18n.html">リソースと国際化</a>」を参照してください。
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+
+<p>これらの XML レイアウト ファイルは、作成するプロジェクトの <code>res/layout/</code> ディレクトリ内に置かれます。「res」は「resources」の略で、アプリケーションに必要なコード以外のすべてのアセットがこのディレクトリに格納されます。リソースには、レイアウト ファイルの他に、画像、音声、ローカライズされた文字列などのアセットがあります。</p>
+
+<div class="sidebox">
+ <h2>横表示レイアウト</h2>
+ <p>横表示の場合に異なるデザインで表示するには、レイアウト XML ファイルを /res/layout-land 内に入れます。Android 端末のレイアウトが横表示に変わると自動的にこのディレクトリが参照されます。このように横表示向けに定義されたレイアウトが存在しない場合、自動的にデフォルトのレイアウトが拡大して使用されます。</p>
+</div>
+
+<p>Eclipse プラグインでは、このようなレイアウト ファイルの 1 つである「main.xml」が自動的に作成されます。先ほど「Hello World」アプリケーションを作成した際には、このファイルは無視してプログラマティックにレイアウトを作成しました。この作成方法は Android フレームワークについてより深く理解していただくことを意図したもので、実際にはほとんどの場合レイアウトはコードではなく XML ファイルで定義します。以下の手順では、既存のアプリケーションを変更して XML レイアウトが使用されるようにする方法を説明します。</p>
+
+<ol>
+ <li>Eclipse のパッケージ エクスプローラー(Package Explorer)で、<code>/res/layout/</code> フォルダを展開し、<code>main.xml</code> を開きます(開いた後、場合によっては XML ソースを見るのにウィンドウ下部にある「main.xml」タブをクリックする必要があります)。ファイルの内容を以下の XML に置き換えます。
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="@string/hello"/></pre>
+<p>ファイルを保存します。</p>
+</li>
+
+<li><code>res/values/</code> フォルダ内の <code>strings.xml</code> を開きます。このファイルは、作成するユーザー インターフェースのためのすべてのデフォルトのテキスト文字列を保存するものです。Eclipse を使用している場合、ADT によってあらかじめ <em>hello</em> と <em>app_name</em> という 2 つの文字列が用意された状態になります。<em>hello</em> を何か別の文字列に書き換えてみましょう。たとえば「Hello, Android! I am a string resource!」としてみましょう。変更後のファイルの全体は次のようになります。
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="hello">Hello, Android! I am a string resource!</string>
+ <string name="app_name">Hello, Android</string>
+</resources>
+</pre>
+</li>
+
+<li>次に、<code>HelloAndroid</code> クラスを開いて、XML レイアウトを使用して変更します。ファイルを編集して次のような内容にします。
+<pre>
+package com.example.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>この変更を行う際に、コードを手入力してコード補完機能を試してみましょう。「R.layout.main」と入力しようとすると、プラグインによって入力候補が表示されます。この機能の便利さは、開発中に何回も実感すると思います。</p>
+
+<p>View オブジェクトに <code>setContentView()</code> を引き渡す代わりに、レイアウト リソースへの参照を付与します。リソースは <code>R.layout.main</code> として識別されます。これは、<code>/res/layout/main.xml</code> で定義されたレイアウトを、コンパイルされたオブジェクトで表したものです。Eclipse プラグインでは、この参照がプロジェクトの R.java クラス内に自動的に作成されます。Eclipse を使用していない場合、Ant を実行してアプリケーションのビルドを行う際に R.java クラスが生成されます(R クラスについて詳しくは後ほど説明します)。</p>
+</li>
+</ol>
+
+<p>ここで、アプリケーションを再実行します。起動構成は作成済みであるため、ここでは緑色の矢印アイコンをクリックして実行するか、または <strong>[[]実行(Run)] > [[]ヒストリーの実行(Run History)] > [[]Android Activity]</strong> を選択するだけです。TextView 文字列に加えた変更を除けば、アプリケーションは同じに見えます。ここでポイントとなるのは、2 つの異なるレイアウト編集方法を使用して同じ結果が得られるということです。</p>
+
+<p class="note"><strong>ヒント:</strong> ショートカット キー<strong>Ctrl+F11</strong>(Mac では <strong>コマンド+Shift+F11</strong>)を使用して、現在表示されているアプリケーションを実行することができます。</p>
+
+<p>ここからは、デバッグの基礎知識と、他の総合開発環境に関する補足情報について説明します。さらに詳しく学習したい場合は、「<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>」を参照してください。Android アプリケーションが動作するためのすべての要素について説明しています。また、「<a href="{@docRoot}guide/index.html">デベロッパー ガイド</a>」の導入ページを参照して、<em>デベロッパー ガイド</em> ドキュメントの概要を確認してください。</p>
+
+
+<div class="special">
+<h3>R クラス</h3>
+<p>Eclipse で、<code>R.java</code> という名前のファイル(<code>gen/</code>(「生成された Java ファイル(Generated Java Files)」フォルダ内)を開きます。ファイルの内容は次のようになっています。</p>
+
+<pre>
+package com.example.helloandroid;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class drawable {
+ public static final int icon=0x7f020000;
+ }
+ public static final class layout {
+ public static final int main=0x7f030000;
+ }
+ public static final class string {
+ public static final int app_name=0x7f040001;
+ public static final int hello=0x7f040000;
+ }
+}
+</pre>
+
+<p>プロジェクトの <code>R.java</code> ファイルは、ファイル内で定義されたすべてのリソースへのインデックスです。ソース コード内では、プロジェクトに含めたすべてのリソースを参照するための簡略形式としてこのクラスを使用します。これは、Eclipse などの総合開発環境のコード補完機能とともに使用すると特に便利です。探している特定の参照をすばやくインタラクティブに見つけることができるからです。</p>
+
+<p>お手元のファイルはこれとは若干異なる可能性があります(おそらく 16 進値が異なるためです)。ここでは、「layout」という名前の内部クラスと、そのメンバーであるフィールド「main」に注目します。Eclipse プラグインにより main.xml という名前の XML レイアウト ファイルが認識され、ここにそのためのクラスが生成されたものです。プロジェクトに他のリソース(<code>res/values/string.xml</code> ファイル内の文字列や <code>res/drawable/</code> ディレクトリ内の描画可能オブジェクトなど)を追加すると、<code>R.java</code> に最新の変更が反映されます。</p>
+<p>Eclipse を使用していない場合は、(Ant ツールを使用した)ビルド時にこのクラス ファイルが生成されます。</p>
+<p><em>くれぐれもこのファイルを手動で編集しないようにしてください。</em></p>
+</div>
+
+<h2 id="debugging">プロジェクトをデバッグする</h2>
+
+<p>Android Plugin for Eclipse は、Eclipse のデバッガと優れた連動性を発揮します。このメリットを確認するため、作成したコードにバグを埋め込んでみましょう。作成した HelloAndroid ソース コードを次のように変更します。</p>
+
+<pre>
+package com.android.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Object o = null;
+ o.toString();
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>この変更は、単にコードに NullPointerException を発生させるものです。アプリケーションを再度実行すると、最終的に次のような画面が表示されます。</p>
+
+ <a href="images/hello_world_8.png"><img src="images/hello_world_8.png" style="height:230px" alt="" /></a>
+
+<p>「強制終了」を押してアプリケーションを終了し、エミュレータ ウィンドウを閉じます。</p>
+
+<p>エラーの詳細を確認するには、ソース コード内の <code>Object o = null;</code> 行にブレークポイントを設定します(該当するソース コード行の横にあるマーカー バーをダブルクリックします)。次に、メニューから <strong>[[]実行(Run)] > [[]デバッグ ヒストリー(Debug History)] > [[]Hello, Android]</strong> を選択して、デバッグ モードに入ります。エミュレータでアプリケーションが再起動されますが、今度は、先ほど設定したブレークポイントに到達した時点で中断されます。その後 Eclipse のデバッグ パースペクティブ(Debug Perspective)で、他のアプリケーションで通常行うように、コードの内容を確認できます。</p>
+
+ <a href="images/hello_world_9.png"><img src="images/hello_world_9.png" style="height:230px" alt="" /></a>
+
+
+<h2 id="noeclipse">Eclipse を使用せずにプロジェクトを作成する</h2>
+
+ <p>Eclipse を使用していない場合(普段から使用している総合開発環境がある場合や、シンプルにテキスト エディタやコマンド ライン ツールを使用している場合など)は、Eclipse プラグインを利用することはできません。しかし心配は無用です。Eclipse を使用していないからといって何らかの機能が失われることはありません。</p>
+
+ <p>Android Plugin for Eclipse は、単に Android SDK に含まれるツール セットをまとめたものに過ぎません(エミュレータ、aapt、adb、ddms などの個別のツールについては、<a href="{@docRoot}guide/developing/tools/index.html">こちらで別途説明</a>しています)。このため、これらのツールを別のツール、たとえば「Ant」のビルド ファイルなどでまとめることも可能です。</p>
+
+ <p>Android SDK には、「android」という名前のツールが含まれています。このツールを使用すると、作成するプロジェクトのソース コードとディレクトリ スタブすべて、および Ant と互換性のある <code>build.xml</code> ファイルを作成することができます。これにより、プロジェクトをコマンド ラインで作成したり、普段使用している総合開発環境と統合したりすることができます。</p>
+
+ <p>たとえば、Eclipse で作成されるものと同様の HelloAndroid プロジェクトを作成するには、次のコマンドを使用します。</p>
+
+ <pre>
+android create project \
+ --package com.android.helloandroid \
+ --activity HelloAndroid \
+ --target 2 \
+ --path <em><path-to-your-project></em>/HelloAndroid
+</pre>
+
+ <p>これにより、<em>path</em> で定義された場所に、プロジェクトに必要なフォルダとファイルが作成されます。</p>
+
+ <p>SDK ツールを使用してプロジェクトを作成および構築する方法について詳しくは、「<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>」を参照してください。</p>
diff --git a/docs/html/intl/ja/sdk/1.5_r2/installing.jd b/docs/html/intl/ja/sdk/1.5_r2/installing.jd
index a587b1a..789fc26 100644
--- a/docs/html/intl/ja/sdk/1.5_r2/installing.jd
+++ b/docs/html/intl/ja/sdk/1.5_r2/installing.jd
@@ -130,7 +130,7 @@
<h4>その他のインストール エラー</h4>
-<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p>
+<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}resources/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p>
<h4>Linux ユーザーの場合</h4>
<p>Eclipse 用 ADT プラグインのインストール時に、次のエラーが発生する場合があります。
@@ -166,15 +166,15 @@
<p><strong>サンプル コードの参照</strong></p>
<ul>
- <li><a href="{@docRoot}guide/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li>
- <li><a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li>
+ <li><a href="{@docRoot}resources/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li>
+ <li><a href="{@docRoot}resources/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li>
<li><code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code> に収められている他のサンプル アプリケーションのいずれかを新しいプロジェクトとして作成し、自分の開発環境でコンパイルし、実行します。</li>
</ul>
<p><strong>Android デベロッパー グループへのアクセス</strong></p>
<ul>
<li>[<a
- href="{@docRoot}community/index.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li>
+ href="{@docRoot}resources/community-groups.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li>
</ul>
diff --git a/docs/html/intl/ja/sdk/1.5_r3/installing.jd b/docs/html/intl/ja/sdk/1.5_r3/installing.jd
index a587b1a..789fc26 100644
--- a/docs/html/intl/ja/sdk/1.5_r3/installing.jd
+++ b/docs/html/intl/ja/sdk/1.5_r3/installing.jd
@@ -130,7 +130,7 @@
<h4>その他のインストール エラー</h4>
-<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p>
+<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}resources/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p>
<h4>Linux ユーザーの場合</h4>
<p>Eclipse 用 ADT プラグインのインストール時に、次のエラーが発生する場合があります。
@@ -166,15 +166,15 @@
<p><strong>サンプル コードの参照</strong></p>
<ul>
- <li><a href="{@docRoot}guide/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li>
- <li><a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li>
+ <li><a href="{@docRoot}resources/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li>
+ <li><a href="{@docRoot}resources/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li>
<li><code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code> に収められている他のサンプル アプリケーションのいずれかを新しいプロジェクトとして作成し、自分の開発環境でコンパイルし、実行します。</li>
</ul>
<p><strong>Android デベロッパー グループへのアクセス</strong></p>
<ul>
<li>[<a
- href="{@docRoot}community/index.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li>
+ href="{@docRoot}resources/community-groups.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li>
</ul>
diff --git a/docs/html/resources/articles/avoiding-memory-leaks.jd b/docs/html/resources/articles/avoiding-memory-leaks.jd
new file mode 100644
index 0000000..3361bc1
--- /dev/null
+++ b/docs/html/resources/articles/avoiding-memory-leaks.jd
@@ -0,0 +1,109 @@
+page.title=Avoiding Memory Leaks
+@jd:body
+
+
+<p>Android applications are, at least on the T-Mobile G1, limited
+to 16 MB of heap. It's both a lot of memory for a phone and yet very
+little for what some developers want to achieve. Even if you do not
+plan on using all of this memory, you should use as little as possible
+to let other applications run without getting them killed. The more
+applications Android can keep in memory, the faster it will be for the
+user to switch between his apps. As part of my job, I ran into memory
+leaks issues in Android applications and they are most of the time due
+to the same mistake: keeping a long-lived reference to a
+{@link android.content.Context Context}.</p>
+
+<p>On Android, a <code>Context</code> is used for many operations
+ but mostly to load and access resources. This is why all the widgets
+receive a <code>Context</code> parameter in their constructor. In a
+regular Android application, you usually have two kinds of
+<code>Context</code>, {@link android.app.Activity} and
+{@link android.app.Application}. It's usually the first one that
+the developer passes to classes and methods that need a <code>Context</code>:</p>
+
+<pre class="prettyprint">@Override
+protected void onCreate(Bundle state) {
+ super.onCreate(state);
+
+ TextView label = new TextView(this);
+ label.setText("Leaks are bad");
+
+ setContentView(label);
+}
+</pre>
+
+<p>This means that views have a reference to the entire activity and
+therefore to anything your activity is holding onto; usually the entire
+View hierarchy and all its resources. Therefore, if you leak the <code>Context</code>
+("leak" meaning you keep a reference to it thus preventing the GC from
+collecting it), you leak a lot of memory. Leaking an entire activity
+can be really easy if you're not careful.</p>
+
+<p>When the screen orientation changes the system will, by default,
+destroy the current activity and create a new one while preserving its
+state. In doing so, Android will reload the application's UI from the
+resources. Now imagine you wrote an application with a large bitmap
+that you don't want to load on every rotation. The easiest way to keep
+it around and not having to reload it on every rotation is to keep in a
+static field:</p>
+
+<pre class="prettyprint">private static Drawable sBackground;
+
+@Override
+protected void onCreate(Bundle state) {
+ super.onCreate(state);
+
+ TextView label = new TextView(this);
+ label.setText("Leaks are bad");
+
+ if (sBackground == null) {
+ sBackground = getDrawable(R.drawable.large_bitmap);
+ }
+ label.setBackgroundDrawable(sBackground);
+
+ setContentView(label);
+}
+</pre>
+
+<p>This code is very fast and also very wrong; it leaks the first activity
+created upon the first screen orientation change. When a
+{@link android.graphics.drawable.Drawable Drawable} is attached to a view, the view is set as a
+{@link android.graphics.drawable.Drawable#setCallback(android.graphics.drawable.Drawable.Callback) callback}
+on the drawable. In the code snippet above, this means the drawable has a
+reference to the <code>TextView</code> which itself has a reference to the
+activity (the <code>Context</code>) which in turns has references to
+pretty much anything (depending on your code.)</p>
+
+<p>This example is one of the simplest cases of leaking the
+<code>Context</code> and you can see how we worked around it in the
+<a href="http://android.git.kernel.org/?p=platform/packages/apps/Launcher.git;a=blob;f=src/com/android/launcher/LauncherModel.java;h=0ef2a806b767142b28b2ff3b37f21f4ca16c355d;hb=cupcake">Home screen's source code</a>
+(look for the <code>unbindDrawables()</code> method) by setting the stored
+drawables' callbacks to null when the activity is destroyed. Interestingly
+enough, there are cases where you can create a chain of leaked contexts,
+and they are bad. They make you run out of memory rather quickly.</p>
+
+<p>There are two easy ways to avoid context-related memory leaks. The most
+obvious one is to avoid escaping the context outside of its own scope. The
+example above showed the case of a static reference but inner classes and
+their implicit reference to the outer class can be equally dangerous. The
+second solution is to use the <code>Application</code> context. This
+context will live as long as your application is alive and does not depend
+on the activities life cycle. If you plan on keeping long-lived objects
+that need a context, remember the application object. You can obtain it
+easily by calling
+{@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
+or {@link android.app.Activity#getApplication() Activity.getApplication()}.</p>
+
+<p>In summary, to avoid context-related memory leaks, remember the following:</p>
+<ul>
+<li>Do not keep long-lived references to a context-activity (a reference
+to an activity should have the same life cycle as the activity itself)</li>
+<li>Try using the context-application instead of a context-activity</li>
+<li>Avoid non-static inner classes in an activity if you don't control
+their life cycle, use a static inner class and make a weak reference to
+the activity inside. The solution to this issue is to use a static inner
+class with a {@link java.lang.ref.WeakReference WeakReference} to the
+outer class, as done in <a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/view/ViewRoot.java;h=9d7a124cb01ab94bf53e34f6e5e8a07f81e2423c;hb=master">ViewRoot</a>
+and its W inner class for instance</li>
+<li>A garbage collector is not an insurance against memory leaks</li>
+</ul>
diff --git a/docs/html/resources/articles/backward-compatibility.jd b/docs/html/resources/articles/backward-compatibility.jd
new file mode 100644
index 0000000..e7f0b60
--- /dev/null
+++ b/docs/html/resources/articles/backward-compatibility.jd
@@ -0,0 +1,238 @@
+page.title=Backward Compatibility for Applications
+@jd:body
+
+<p>A variety of Android-powered devices are now available to consumers from carriers
+in geographies around the world. Across those devices, a range of Android
+platform versions are in use, some running the latest version of the platform,
+others running older versions. As a developer, you need to consider the approach
+to backward compatibility that you will take in your application — do you
+want to allow your application to run on all devices, or just those running the
+latest software? In some cases it will be useful to employ the newer APIs on
+devices that support them, while continuing to support older devices. </p>
+
+<h3>Setting the minSdkVersion</h3>
+<p>If the use of a new API is integral to the application — perhaps you
+need to record video using an API introduced in Android 1.5 (API Level 3)
+— you should add a <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><android:minSdkVersion></code></a>
+ to the application's manifest, to ensure your app won't
+be installed on older devices. For example, if your application depends on an
+API introduced in API Level 3, you would specify "3" as the value of the minimum
+SDK version</a>:</p>
+
+<pre> <manifest>
+ ...
+ <uses-sdk android:minSdkVersion="3" />
+ ...
+ </manifest></pre>
+
+<p>However, if you want to add a useful but non-essential feature, such as
+popping up an on-screen keyboard even when a hardware keyboard is available, you
+can write your program in a way that allows it to use the newer features without
+failing on older devices.</p>
+
+<h3>Using reflection</h3>
+
+<p>Suppose there's a simple new call you want to use, like {@link
+android.os.Debug#dumpHprofData(java.lang.String)
+android.os.Debug.dumpHprofData(String filename)}. The {@link android.os.Debug}
+class has existed since Android 1.0, but the method is new in Anroid 1.5 (API
+Level 3). If you try to call it directly, your app will fail to run on devices
+running Android 1.1 or earlier.</p>
+
+<p>The simplest way to call the method is through reflection. This requires
+doing a one-time lookup and caching the result in a <code>Method</code> object.
+Using the method is a matter of calling <code>Method.invoke</code> and un-boxing
+the result. Consider the following:</p>
+
+<pre>public class Reflect {
+ private static Method mDebug_dumpHprofData;
+
+ static {
+ initCompatibility();
+ };
+
+ private static void initCompatibility() {
+ try {
+ mDebug_dumpHprofData = Debug.class.getMethod(
+ "dumpHprofData", new Class[] { String.class } );
+ /* success, this is a newer device */
+ } catch (NoSuchMethodException nsme) {
+ /* failure, must be older device */
+ }
+ }
+
+ private static void dumpHprofData(String fileName) throws IOException {
+ try {
+ mDebug_dumpHprofData.invoke(null, fileName);
+ } catch (InvocationTargetException ite) {
+ /* unpack original exception when possible */
+ Throwable cause = ite.getCause();
+ if (cause instanceof IOException) {
+ throw (IOException) cause;
+ } else if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ } else if (cause instanceof Error) {
+ throw (Error) cause;
+ } else {
+ /* unexpected checked exception; wrap and re-throw */
+ throw new RuntimeException(ite);
+ }
+ } catch (IllegalAccessException ie) {
+ System.err.println("unexpected " + ie);
+ }
+ }
+
+ public void fiddle() {
+ if (mDebug_dumpHprofData != null) {
+ /* feature is supported */
+ try {
+ dumpHprofData("/sdcard/dump.hprof");
+ } catch (IOException ie) {
+ System.err.println("dump failed!");
+ }
+ } else {
+ /* feature not supported, do something else */
+ System.out.println("dump not supported");
+ }
+ }
+}</pre>
+
+<p>This uses a static initializer to call <code>initCompatibility</code>,
+which does the method lookup. If that succeeds, it uses a private
+method with the same semantics as the original (arguments, return
+value, checked exceptions) to do the call. The return value (if it had
+one) and exception are unpacked and returned in a way that mimics the
+original. The <code>fiddle</code> method demonstrates how the
+application logic would choose to call the new API or do something
+different based on the presence of the new method.</p>
+
+<p>For each additional method you want to call, you would add an additional
+private <code>Method</code> field, field initializer, and call wrapper to the
+class.</p>
+
+<p>This approach becomes a bit more complex when the method is declared in a
+previously undefined class. It's also much slower to call
+<code>Method.invoke()</code> than it is to call the method directly. These
+issues can be mitigated by using a wrapper class.</p>
+
+<h3>Using a wrapper class</h3>
+
+<p>The idea is to create a class that wraps all of the new APIs exposed by a new
+or existing class. Each method in the wrapper class just calls through to the
+corresponding real method and returns the same result.</p>
+
+<p>If the target class and method exist, you get the same behavior you would get
+by calling the class directly, with a small amount of overhead from the
+additional method call. If the target class or method doesn't exist, the
+initialization of the wrapper class fails, and your application knows that it
+should avoid using the newer calls.</p>
+
+<p>Suppose this new class were added:</p><pre>public class NewClass {
+ private static int mDiv = 1;
+
+ private int mMult;
+
+ public static void setGlobalDiv(int div) {
+ mDiv = div;
+ }
+
+ public NewClass(int mult) {
+ mMult = mult;
+ }
+
+ public int doStuff(int val) {
+ return (val * mMult) / mDiv;
+ }
+}</pre>
+
+<p>We would create a wrapper class for it:</p>
+
+<pre>class WrapNewClass {
+ private NewClass mInstance;
+
+ /* class initialization fails when this throws an exception */
+ static {
+ try {
+ Class.forName("NewClass");
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /* calling here forces class initialization */
+ public static void checkAvailable() {}
+
+ public static void setGlobalDiv(int div) {
+ NewClass.setGlobalDiv(div);
+ }
+
+ public WrapNewClass(int mult) {
+ mInstance = new NewClass(mult);
+ }
+
+ public int doStuff(int val) {
+ return mInstance.doStuff(val);
+ }
+}</pre>
+
+<p>This has one method for each constructor and method in the original, plus a
+static initializer that tests for the presence of the new class. If the new
+class isn't available, initialization of <code>WrapNewClass</code> fails,
+ensuring that the wrapper class can't be used inadvertently. The
+<code>checkAvailable</code> method is used as a simple way to force class
+initialization. We use it like this:</p>
+
+<pre>public class MyApp {
+ private static boolean mNewClassAvailable;
+
+ /* establish whether the "new" class is available to us */
+ static {
+ try {
+ WrapNewClass.checkAvailable();
+ mNewClassAvailable = true;
+ } catch (Throwable t) {
+ mNewClassAvailable = false;
+ }
+ }
+
+ public void diddle() {
+ if (mNewClassAvailable) {
+ WrapNewClass.setGlobalDiv(4);
+ WrapNewClass wnc = new WrapNewClass(40);
+ System.out.println("newer API is available - " + wnc.doStuff(10));
+ } else {
+ System.out.println("newer API not available");
+ }
+ }
+}</pre>
+
+<p>If the call to <code>checkAvailable</code> succeeds, we know the new class is
+part of the system. If it fails, we know the class isn't there, and adjust our
+expectations accordingly. It should be noted that the call to
+<code>checkAvailable</code> will fail before it even starts if the bytecode
+verifier decides that it doesn't want to accept a class that has references to a
+nonexistent class. The way this code is structured, the end result is the same
+whether the exception comes from the verifier or from the call to
+<code>Class.forName</code>.</p>
+
+<p>When wrapping an existing class that now has new methods, you only need to
+put the new methods in the wrapper class. Invoke the old methods directly. The
+static initializer in <code>WrapNewClass</code> would be augmented to do a
+one-time check with reflection.</p>
+
+<h3>Testing is key</h3>
+
+<p>You must test your application on every version of the Android framework that
+is expected to support it. By definition, the behavior of your application will
+be different on each. Remember the mantra: if you haven't tried it, it doesn't
+work.</p>
+
+<p>You can test for backward compatibility by running your application in an
+emulator that uses an older version of the platform. The Android SDK allows you
+to do this easily by creating "Android Virtual Devices" with different API
+levels. Once you create the AVDs, you can test your application with old and new
+versions of the system, perhaps running them side-by-side to see the
+differences. More information about emulator AVDs can be found <a
+href="{@docRoot}guide/developing/tools/avd.html">in the AVD documentation</a> and
+from <code>emulator -help-virtual-device</code>.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/can-i-use-this-intent.jd b/docs/html/resources/articles/can-i-use-this-intent.jd
new file mode 100644
index 0000000..a726189
--- /dev/null
+++ b/docs/html/resources/articles/can-i-use-this-intent.jd
@@ -0,0 +1,69 @@
+page.title=Can I Use this Intent?
+@jd:body
+
+<p>Android offers a very powerful and yet easy-to-use message type called
+an <a href="{@docRoot}guide/topics/intents/intents-filters.html">intents</a>.
+You can use intents to turn applications into high-level libraries and
+make code modular and reusable. The Android Home screen and AnyCut
+applications, for instance, use intents extensively to create shortcuts. </p>
+
+<p>While it is nice to be able to make use of a loosely coupled
+API, there is no guarantee that the intent you send will be received by
+another application. This happens in particular with third-party apps, like
+<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Panoramio">Panoramio</a>
+and its RADAR intent.</p>
+
+<p>This article describes a technique you can use to find out whether the system
+contains any application capable of responding to the intent you want to use.
+The example below shows a helper method that queries the system package manager
+to determine whether there's an app that can respond to a specified intent. Your
+application can pass an intent to the method and then, for example, show or hide
+user options that the user would normally use to trigger the intent. </p>
+
+<pre class="prettyprint">/**
+ * Indicates whether the specified action can be used as an intent. This
+ * method queries the package manager for installed packages that can
+ * respond to an intent with the specified action. If no suitable package is
+ * found, this method returns false.
+ *
+ * @param context The application's environment.
+ * @param action The Intent action to check for availability.
+ *
+ * @return True if an Intent with the specified action can be sent and
+ * responded to, false otherwise.
+ */
+public static boolean isIntentAvailable(Context context, String action) {
+ final PackageManager packageManager = context.getPackageManager();
+ final Intent intent = new Intent(action);
+ List<ResolveInfo> list =
+ packageManager.queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ return list.size() > 0;
+}
+</pre>
+
+<p>Here is how you could use the helper method:</p>
+
+<pre class="prettyprint">@Override
+public boolean onPrepareOptionsMenu(Menu menu) {
+ final boolean scanAvailable = isIntentAvailable(this,
+ "com.google.zxing.client.android.SCAN");
+
+ MenuItem item;
+ item = menu.findItem(R.id.menu_item_add);
+ item.setEnabled(scanAvailable);
+
+ return super.onPrepareOptionsMenu(menu);
+}
+</pre>
+
+<p>In this example, the menu is grayed out if the <em>Barcode Scanner</em>
+application is not installed. </p>
+
+<p>Another, simpler, way to do this is to catch the
+<code>ActivityNotFoundException</code> when calling <code>startActivity()</code>
+but it only lets you react to the problem, you cannot predict it and update the
+UI accordingly to prevent the user from doing something that won't work. The
+technique described here can also be used at startup time to ask the user
+whether he'd like to install the missing package, you can then simply redirect
+him to the Android Market by using the appropriate URI.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/creating-input-method.jd b/docs/html/resources/articles/creating-input-method.jd
new file mode 100644
index 0000000..5a92970
--- /dev/null
+++ b/docs/html/resources/articles/creating-input-method.jd
@@ -0,0 +1,235 @@
+page.title=Creating an Input Method
+@jd:body
+
+
+<p>To create an input method (IME) for entering text into text fields
+and other Views, you need to extend the {@link android.inputmethodservice.InputMethodService}.
+class. This class provides much of the basic implementation for an input
+method, in terms of managing the state and visibility of the input method and
+communicating with the currently visible activity.</p>
+
+<p>A good starting point would be the SoftKeyboard sample code provided as part
+of the SDK. You can modify the sample code to start building your own input
+method.</p>
+
+<p>An input method is packaged like any other application or service. In the
+<code>AndroidManifest.xml</code> file, you declare the input method as a
+service, with the appropriate intent filter and any associated meta data:</p>
+
+<pre><manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.fastinput">
+
+ <application android:label="@string/app_label"><br>
+ <!-- Declares the input method service -->
+ <service android:name="FastInputIME"
+ android:label="@string/fast_input_label"
+ android:permission="android.permission.BIND_INPUT_METHOD">
+ <intent-filter>
+ <action android:name="android.view.InputMethod" />
+ </intent-filter>
+ <meta-data android:name="android.view.im" android:resource="@xml/method" />
+ </service>
+
+ <!-- Optional activities. A good idea to have some user settings. -->
+ <activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ </intent-filter>
+ </activity>
+ </application>
+</manifest></pre>
+
+<p>If your input method allows the user to tweak some settings, you should
+provide a settings activity that can be launched from the Settings application.
+This is optional and you may choose to provide all user settings directly in
+your IME's UI.</p>
+
+<p>The typical life-cycle of an <code>InputMethodService</code> looks like
+this:</p>
+
+<p><img src="images/ime_003.png" style="border: medium none ; width: 374px; height: 871px;"></p>
+
+<h3>Visual Elements</h3>
+
+<p>There are two main visual elements for an input method—the input view and the
+candidates view. You don't have to follow this style though, if one of them is
+not relevant to your input method experience.</p>
+
+<h4>Input View</h4>
+
+<p>This is where the user can input text either in the form of keypresses,
+handwriting or other gestures. When the input method is displayed for the first
+time, <code>InputMethodService.onCreateInputView()</code> will be called. Create
+and return the view hierarchy that you would like to display in the input method
+window.</p>
+
+<h4>Candidates View</h4>
+
+<p>This is where potential word corrections or completions are presented to the
+user for selection. Again, this may or may not be relevant to your input method
+and you can return <code>null</code> from calls to
+<code>InputMethodService.onCreateCandidatesView()</code>, which is the default
+behavior.</p>
+
+<h3>Designing for the different Input Types</h3>
+
+<p>An application's text fields can have different input types specified on
+them, such as free form text, numeric, URL, email address and search. When you
+implement a new input method, you need to be aware of the different input types.
+Input methods are not automatically switched for different input types and so
+you need to support all types in your IME. However, the IME is not responsible
+for validating the input sent to the application. That's the responsibility of
+the application.</p>
+
+<p>For example, the LatinIME provided with the Android platform provides
+different layouts for text and phone number entry:</p>
+
+<p><img style="margin: 0pt 10px 0pt 0pt; width: 319px; height: 198px;" src="images/ime_002.png"><img style="width: 320px; height: 199px;" src="images/ime.png"></p>
+
+<p><code>InputMethodService.onStartInputView()</code> is called with an<code>
+EditorInfo</code> object that contains details about the input type and other
+attributes of the application's text field.</p><p>(<code>EditorInfo.inputType
+& EditorInfo.TYPE_CLASS_MASK</code>) can be one of many different values,
+including:</p>
+
+<ul>
+<li><code>TYPE_CLASS_NUMBER</code></li>
+<li><code>TYPE_CLASS_DATETIME</code></li>
+<li><code>TYPE_CLASS_PHONE</code></li>
+<li><code>TYPE_CLASS_TEXT</code></li>
+</ul>
+
+<p>See <code>android.text.InputType</code> for more details.</p>
+
+<p><code>EditorInfo.inputType</code> can contain other masked bits that
+indicate the class variation and other flags. For example,
+<code>TYPE_TEXT_VARIATION_PASSWORD</code> or <code>TYPE_TEXT_VARIATION_URI</code>
+or <code>TYPE_TEXT_FLAG_AUTO_COMPLETE</code>.</p>
+
+<h4>Password fields</h4>
+
+<p>Pay
+specific attention when sending text to password fields. Make sure that
+the password is not visible within your UI — neither in the input
+view or the candidates view. Also, do not save the password anywhere without
+explicitly informing the user.</p>
+
+<h3>Landscape vs. portrait</h3>
+
+<p>The UI needs to be able to scale between landscape and portrait orientations.
+In non-fullscreen IME mode, leave sufficient space for the application to show
+the text field and any associated context. Preferably, no more than half the
+screen should be occupied by the IME. In fullscreen IME mode this is not an
+issue.</p>
+
+<h3>Sending text to the application</h3>
+
+<p>There are two ways to send text to the application. You can either send
+individual key events or you can edit the text around the cursor in the
+application's text field.</p>
+
+<p>To send a key event, you can simply construct KeyEvent objects and call
+<code>InputConnection.sendKeyEvent()</code>. Here are some examples:</p>
+
+<pre>InputConnection ic = getCurrentInputConnection();
+long eventTime = SystemClock.uptimeMillis();
+ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,
+ KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
+ KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
+ic.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
+ KeyEvent.ACTION_UP, keyEventCode, 0, 0, 0, 0,
+ KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));</pre>
+
+<p>Or use the convenience method:</p>
+
+<pre>InputMethodService.sendDownUpKeyEvents(keyEventCode);</pre>
+
+<p class="note"><strong>Note</strong>:
+It is recommended to use the above method for certain fields such as
+phone number fields because of filters that may be applied to the text
+after each key press. Return key and delete key should also be sent as
+raw key events for certain input types, as applications may be watching
+for specific key events in order to perform an action.</p>
+
+<p>When editing text in a text field, some of the more useful methods on
+<code>android.view.inputmethod.InputConnection</code> are:</p>
+
+<ul>
+<li><code>getTextBeforeCursor()</code></li>
+<li><code>getTextAfterCursor()</code></li>
+<li><code>deleteSurroundingText()</code></li>
+<li><code>commitText()</code></li>
+</ul>
+
+<p>For example, let's say the text "Fell" is to the left of the cursor
+and you want to replace it with "Hello!":</p>
+
+<pre>InputConnection ic = getCurrentInputConnection();
+ic.deleteSurroundingText(4, 0);
+ic.commitText("Hello", 1);
+ic.commitText("!", 1);</pre>
+
+<h4>Composing text before committing</h4>
+
+<p>If your input method does some kind of text prediction or requires multiple
+steps to compose a word or glyph, you can show the progress in the text field
+until the user commits the word and then you can replace the partial composition
+with the completed text. The text that is being composed will be highlighted in
+the text field in some fashion, such as an underline.</p>
+
+<pre>InputConnection ic = getCurrentInputConnection();
+ic.setComposingText("Composi", 1);
+...
+ic.setComposingText("Composin", 1);
+...
+ic.commitText("Composing ", 1);</pre>
+
+<p><img style="width: 320px; height: 98px; margin-bottom: 10px;" src="images/ime_006.png">
+<img style="width: 320px; height: 97px; margin-bottom: 10px;" src="images/ime_005.png">
+<img style="width: 320px; height: 97px;" src="images/ime_004.png"></p>
+
+<h3>Intercepting hard key events</h3>
+
+<p>Even though the input method window doesn't have explicit focus, it receives
+hard key events first and can choose to consume them or forward them along to
+the application. For instance, you may want to consume the directional keys to
+navigate within your UI for candidate selection during composition. Or you may
+want to trap the back key to dismiss any popups originating from the input
+method window. To intercept hard keys, override
+<code>InputMethodService.onKeyDown()</code> and
+<code>InputMethodService.onKeyUp().</code> Remember to call
+<code>super.onKey</code>* if you don't want to consume a certain key
+yourself.</p>
+
+<h3>Other considerations</h3>
+
+<ul>
+<li>Provide a way for the user to easily bring up any associated settings
+directly from the input method UI</li>
+<li>Provide
+a way for the user to switch to a different input method (multiple
+input methods may be installed) directly from the input method UI.</li>
+<li>Bring
+up the UI quickly - preload or lazy-load any large resources so that
+the user sees the input method quickly on tapping on a text field. And
+cache any resources and views for subsequent invocations of the input
+method.</li>
+<li>On the flip side, any large memory allocations should
+be released soon after the input method window is hidden so that
+applications can have sufficient memory to run. Consider using a
+delayed message to release resources if the input method is in a hidden
+state for a few seconds.</li>
+<li>Make sure that most common characters
+can be entered using the input method, as users may use punctuation in
+passwords or user names and they shouldn't be stuck in a situation
+where they can't enter a certain character in order to gain access into
+a password-locked device.</li>
+</ul>
+
+<h3>Samples</h3>
+
+<p>For a real world example, with support for multiple input types and text
+prediction, see the <a id="ccpb"
+href="http://android.git.kernel.org/?p=platform/packages/inputmethods/LatinIME.
+git;a=tree" title="LatinIME source code online">LatinIME source code</a>. The
+Android SDK also includes a SoftKeyboard sample as well.</p>
diff --git a/docs/html/resources/articles/drawable-mutations.jd b/docs/html/resources/articles/drawable-mutations.jd
new file mode 100644
index 0000000..f979829
--- /dev/null
+++ b/docs/html/resources/articles/drawable-mutations.jd
@@ -0,0 +1,91 @@
+page.title=Drawable Mutations
+@jd:body
+
+<p>Android's drawables are extremely useful to easily build applications. A
+{@link android.graphics.drawable.Drawable Drawable} is a pluggable drawing
+container that is usually associated with a View. For instance, a
+{@link android.graphics.drawable.BitmapDrawable BitmapDrawable} is used to display
+images, a {@link android.graphics.drawable.ShapeDrawable ShapeDrawable} to draw
+shapes and gradients, and so on. You can even combine them to create complex
+renderings.</p>
+
+<p>Drawables allow you to easily customize the rendering of the widgets without
+subclassing them. As a matter of fact, they are so convenient that most of the
+default Android apps and widgets are built using drawables; there are about 700
+drawables used in the core Android framework. Because drawables are used so
+extensively throughout the system, Android optimizes them when they are loaded
+from resources. For instance, every time you create a
+{@link android.widget.Button Button}, a new drawable is loaded from the framework
+resources (<code>android.R.drawable.btn_default</code>). This means all buttons
+across all the apps use a different drawable instance as their background.
+However, all these drawables share a common state, called the "constant state."
+The content of this state varies according to the type of drawable you are
+using, but it usually contains all the properties that can be defined by a
+resource. In the case of a button, the constant state contains a bitmap image.
+This way, all buttons across all applications share the same bitmap, which saves
+a lot of memory.</p>
+
+<p>The following diagram shows what entities are
+created when you assign the same image resource as the background of
+two different views. As you can see, two drawables are created but they
+both share the same constant state, hence the same bitmap:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 307px; height: 400px;" src="images/shared_states.png" alt="" id="BLOGGER_PHOTO_ID_5331437883277472082" border="0">
+
+<p>This state sharing feature is great to avoid wasting memory but it can cause
+problems when you try to modify the properties of a drawable. Imagine an
+application with a list of books. Each book has a star next to its name, totally
+opaque when the user marks the book as a favorite, and translucent when the book
+is not a favorite. To achieve this effect, you would probably write the
+following code in your list adapter's <code>getView()</code> method:</p>
+
+<pre>Book book = ...;
+TextView listItem = ...;
+
+listItem.setText(book.getTitle());
+
+Drawable star = context.getResources().getDrawable(R.drawable.star);
+if (book.isFavorite()) {
+ star.setAlpha(255); // opaque
+} else {
+ star.setAlpha(70); // translucent
+}</pre>
+
+<p>Unfortunately, this piece of code yields a rather strange result:
+all of the drawables have the same opacity:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="images/all_drawables_changed.png" alt="" id="BLOGGER_PHOTO_ID_5331438978390342066" border="0">
+
+<p>This
+result is explained by the constant state. Even though we are getting a
+new drawable instance for each list item, the constant state remains
+the same and, in the case of BitmapDrawable, the opacity is part of the
+constant state. Thus, changing the opacity of one drawable instance
+changes the opacity of all the other instances. Even worse, working
+around this issue was not easy with Android 1.0 and 1.1.</p>
+
+<p>Android 1.5 and higher offers a very easy way to solve this issue
+with the new {@link android.graphics.drawable.Drawable#mutate()} method</a>.
+When you invoke this method on a drawable, the constant state of the
+drawable is duplicated to allow you to change any property without
+affecting other drawables. Note that bitmaps are still shared, even
+after mutating a drawable. The diagram below shows what happens when
+you invoke <code>mutate()</code> on a drawable:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 307px; height: 400px;" src="images/mutated_states.png" alt="" id="BLOGGER_PHOTO_ID_5331440144116345074" border="0">
+
+<p>Let's update our previous piece of code to make use of <code>mutate()</code>:</p>
+
+<pre>Drawable star = context.getResources().getDrawable(R.drawable.star);
+if (book.isFavorite()) {
+ star.mutate().setAlpha(255); // opaque
+} else {
+ star. mutate().setAlpha(70); // translucent
+}</pre>
+
+<p>For convenience, <code>mutate()</code>
+returns the drawable itself, which allows to chain method calls. It
+does not however create a new drawable instance. With this new piece of
+code, our application now behaves correctly:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="images/correct_drawables.png" alt="" id="BLOGGER_PHOTO_ID_5331440757515573842" border="0">
diff --git a/docs/html/resources/articles/faster-screen-orientation-change.jd b/docs/html/resources/articles/faster-screen-orientation-change.jd
new file mode 100644
index 0000000..c500035
--- /dev/null
+++ b/docs/html/resources/articles/faster-screen-orientation-change.jd
@@ -0,0 +1,115 @@
+page.title=Faster Screen Orientation Change
+@jd:body
+
+<p>Android is designed to run efficiently on a wide
+array of devices, with very different hardware configurations. Some
+devices, like the T-Mobile G1, can change their hardware configuration
+at runtime. For instance, when you open the keyboard, the screen change
+from the portrait orientation to the landscape orientation.
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Using the alternate resources framework</h2>
+
+<p>The platform's support for loading orientation-specific
+resources at run time is based on the alternate resources framework.</p>
+
+<p>Providing orientation-specific resources is an important part of
+developing your app. If you are not familiar with resource directory qualifiers
+or how the platform uses them, please read
+<a href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">
+Alternate Resources</a>.
+</div>
+</div>
+
+<p>To make
+Android app development easier, the Android system automatically handles
+configuration change events and restarts the current activity with the new
+configuration. This is the default behavior that lets you declare
+resources like layouts and drawables based on the orientation, screen
+size, locale, etc. </p>
+
+<p>While this behavior is really powerful, since your application adapts
+automatically to the device's configuration at runtime, it is sometimes
+confusing for new Android developers, who wonder why their activity is
+destroyed and recreated. </p>
+
+<p>Facing this "issue," some developers choose to handle configuration changes
+themselves which is, in general, a short-term solution that will only complicate
+their lives later. On the other hand, the system's automatic resource handling
+is a very efficient and easy way to adapt an application's user interface to
+various devices and devices configurations. It sometimes comes at a price,
+though.</p>
+
+<p>When your application displays a lot of data, or data that is expensive to fetch,
+the automatic destruction/creation of the activities can be lead to a
+painful user experience. Take the example of <a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/">Photostream</a>,
+a simple Flickr browsing application. After you launch the application and choose a Flickr account, the
+application downloads a set of 6 photos (on a T-Mobile G1) from the
+Flickr servers and displays them on screen. To improve the user
+experience, the application uses slightly different layouts and drawables in
+portrait and landscape modes and this is what the result looks like:</p>
+
+<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9l0GmPwgCzk/SZoGyJyg6-I/AAAAAAAAACU/ItuVwhegPb8/s1600-h/photostream_landscape.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="images/photostream_landscape.png" alt="" id="BLOGGER_PHOTO_ID_5303558969873198050" border="0"></a></p>
+
+<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9l0GmPwgCzk/SZoGx4I-QlI/AAAAAAAAACM/-GkZR5MUKhY/s1600-h/photostream_portrait.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 320px;" src="images/photostream_portrait.png" alt="" id="BLOGGER_PHOTO_ID_5303558965135557202" border="0"></a></p>
+
+<p>Photostream lets Android take care of the configuration change when the
+screen is rotated. However, can you imagine how painful it would be for the user
+to see all the images being downloaded again? The obvious solution to this
+problem is to temporarily cache the images. They could be cached on the SD card
+(if there's one), in the Application object, in a static field, etc. None of
+these techniques is adapted to the current situation: why should we bother
+caching the images when the screen is not rotated? Fortunately for us, Android
+offers a great API exactly for that purpose.</p>
+
+<p>The Activity class has a special method called
+{@link android.app.Activity#onRetainNonConfigurationInstance()}. This method
+can be used to pass an arbitrary object <em>your future self</em> and Android
+is smart enough to call this method only when needed. In the case of Photostream,
+the application <a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/PhotostreamActivity.java#226">used this method</a>
+to pass the downloaded images to the future activity on orientation change.
+The implementation can be summarized like so:</p>
+
+<pre class="prettyprint">@Override
+public Object onRetainNonConfigurationInstance() {
+ final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
+ keepPhotos(list);
+ return list;
+}
+</pre>
+
+<p>In the new activity, in <code>onCreate()</code>, all you have to do to
+get your object back is to call {@link android.app.Activity#getLastNonConfigurationInstance()}.
+In Photostream, <a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/PhotostreamActivity.java#251">this method is invoked</a>
+and if the returned value is not null, the grid is loaded with the list of
+photos from the previous activity:</p>
+
+<pre class="prettyprint">private void loadPhotos() {
+ final Object data = getLastNonConfigurationInstance();
+
+ // The activity is starting for the first time, load the photos from Flickr
+ if (data == null) {
+ mTask = new GetPhotoListTask().execute(mCurrentPage);
+ } else {
+ // The activity was destroyed/created automatically, populate the grid
+ // of photos with the images loaded by the previous activity
+ final LoadedPhoto[] photos = (LoadedPhoto[]) data;
+ for (LoadedPhoto photo : photos) {
+ addPhoto(photo);
+ }
+ }
+}
+</pre>
+
+<p>Be very careful with the object you pass through
+<code>onRetainNonConfigurationChange()</code>, though. If the object you
+pass is for some reason tied to the Activity/Context, <a
+href="http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/">you will leak</a>
+all the views and resources of the activity. This means you should
+never pass a View, a Drawable, an Adapter, etc. Photostream for
+instance extracts the bitmaps from the drawables and pass the bitmaps
+only, not the drawables. Finally, remember that
+<code>onRetainNonConfigurationChange()</code> should be used only to retain
+data that is expensive to load. Otherwise, keep it simple and let Android
+do everything.</p>
diff --git a/docs/html/resources/articles/future-proofing.jd b/docs/html/resources/articles/future-proofing.jd
new file mode 100644
index 0000000..ee98186
--- /dev/null
+++ b/docs/html/resources/articles/future-proofing.jd
@@ -0,0 +1,89 @@
+page.title=Future-Proofing Your Apps
+@jd:body
+
+<p>It's important to implement your application so that it will not break as new
+versions of the Android platform are loaded onto the users device. The list
+below is based on our observations of five ways that we've seen bad apps fail.
+You can think of these as "anti-patterns" (that is, techniques to avoid) for
+Android development.</p>
+
+<p>If your application uses any of the dubious techniques below, break out
+your IDE and duct tape, spackle, and patch up the app.</p>
+
+<p><b>Technique to Avoid, #1: Using Internal APIs</b></p>
+
+<p>Even
+though we've always strongly advised against doing so, some developers
+have chosen to use unsupported or internal APIs. For instance, many
+developers are using the internal brightness control and bluetooth
+toggle APIs that were present in 1.0 and 1.1. A bug -- which was
+fixed in Android 1.5 -- allowed apps to use those APIs without
+requesting permission. As a result, apps that used those APIs broke
+on 1.5. If you've used internal APIs in your apps, you need to update
+your apps to stop doing so. </p>
+
+<p><b>Technique to Avoid, #2: Directly Manipulating Settings</b></p>
+
+<p>Strictly speaking this one isn't evil, since this is a change in
+behavior that we made to Android itself. But we made it because some
+developers were doing naughty things: a number of apps were changing
+system settings silently without even notifying the user. For instance,
+some apps turn on GPS without asking the user, and others might turn on
+data roaming.</p>
+
+<p>As a result, applications can no longer directly
+manipulate the values of certain system Settings, even if they
+previously had permission to do so. For instance, apps can no longer
+directly turn on or off GPS. These apps won't crash, but the APIs in
+question now have no effect, and do nothing. Instead, apps will need to
+issue an Intent to launch the appropriate Settings configuration
+screen, so that the user can change these settings manually. For
+details, see the android.provider.Settings.Secure class, which you can
+find in the 1.5_pre SDK documentation (and later). Note that only
+Settings that were moved to the Settings.Secure class are affected.
+Other, less sensitive, settings will continue to have the same behavior
+as in Android 1.1.</p>
+
+<p><b>Technique to Avoid, #3: Going Overboard with Layouts</b></p>
+
+<p>Due to changes in the View rendering infrastructure, unreasonably deep
+(more than 10 or so) or broad (more than 30 total) View hierarchies in
+layouts are now likely to cause crashes. This was always a risk for
+excessively complex layouts, but you can think of Android 1.5 as being
+better than 1.1 at exposing this problem. Most developers won't need to
+worry about this, but if your app has very complicated layouts, you'll
+need to put it on a diet. You can simplify your layouts using the more
+advanced layout classes like FrameLayout and TableLayout.</p>
+
+<p><b>Technique to Avoid, #4: Bad Hardware Assumptions</b></p>
+
+<p>Android 1.5 includes support for soft keyboards, and there will soon be many
+devices that run Android but do not have physical keyboards. If your
+application assumes the presence of a physical keyboard (such as if you
+have created a custom View that sinks keypress events) you should make
+sure it degrades gracefully on devices that only have soft keyboards.
+For more information on this, keep on eye on this blog as we'll be
+posting more detailed information about handling the new soft keyboards.</p>
+
+<p><b>Technique to Avoid, #5: Incautious Rotations </b></p>
+
+<p>Devices running Android 1.5 and later can automatically rotate the screen,
+depending on how the user orients the device. Some 1.5 devices will do
+this by default, and on all others it can be turned on by the user.
+This can sometimes result in unpredictable behavior from applications
+that do their own reorientations (whether using the accelerometer, or
+something else.) This often happens when applications assume that the
+screen can only rotate if the physical keyboard is exposed; if the
+device lacks a physical keyboard, these apps do not expect to be
+reoriented, which is a coding error. Developers should be sure that
+their applications can gracefully handle being reoriented at any time.</p>
+
+<p>Also, apps that use the accelerometer directly to reorient themselves
+sometimes compete with the system doing the same thing, with odd
+results. And finally, some apps that use the accelerometer to detect
+things like shaking motions and that don't lock their orientation to
+portrait or landscape, often end up flipping back and forth between
+orientations. This can be irritating to the user. (You can lock your
+app's orientation to portrait or landscape using the
+<code>android:screenOrientation</code> attribute in the manifest file.)</p>
+
diff --git a/docs/html/resources/articles/gestures.jd b/docs/html/resources/articles/gestures.jd
new file mode 100644
index 0000000..8711645b
--- /dev/null
+++ b/docs/html/resources/articles/gestures.jd
@@ -0,0 +1,211 @@
+page.title=Gestures
+@jd:body
+
+<p>Touch screens are a great way to interact with applications on
+mobile devices. With a touch screen, users can easily tap, drag, fling,
+or slide to quickly perform actions in their favorite applications.
+For app developers. the Android framework makes it's easy to
+recognize simple actions, like a swipe, but it has been more
+difficult to handle complicated gestures, sometimes requiring
+developers to write a lot of code.</p>
+
+<p>That's why we introduced a new gestures API in Android 1.6. This API, located
+in the new package {@link android.gesture}, lets you store, load, draw, and
+recognize gestures. This article will show you how you can use the
+<code>android.gesture</code> API in your applications. Before going any further,
+you should <a
+href="http://code.google.com/p/apps-for-android/downloads/detail?name=
+GesturesDemos.zip&can=2&q=#makechanges">download the source code
+of the examples</a>.</p>
+
+<h3>Creating a gestures library</h3>
+
+<p>Android 1.6 and higher SDK platforms include a new application pre-installed
+on the emulator, called Gestures Builder. You can use this application to create
+a set of pre-defined gestures for your own application. It also serves as an
+example of how to let the user define his own gestures in your applications. You
+can find the source code of Gestures Builders in the samples directory of each
+SDK platform. In our example we will use Gestures Builder to generate a set of
+gestures for us (make sure to create an AVD with an SD card image to use
+Gestures Builder.) The screenshot below shows what the application looks like
+after adding a few gestures:</p>
+
+<img src="images/gestures_006.png" style="width: 320px; height: 480px;">
+
+<p>As you can see, a gesture is always associated with a name. That name is very
+important because it identifies each gesture within your application. The names
+do not have to be unique. Actually it can be very useful to have several
+gestures with the same name to increase the precision of the recognition. Every
+time you add or edit a gesture in the Gestures Builder, a file is generated on
+the emulator's SD card, <code>/sdcard/gestures</code>. This file contains the
+description of all the gestures, and you will need to package it inside your
+application inside the resources directory, in
+<code>/res/raw</code>.</p>
+
+<h3>Loading the gestures library</h3>
+
+<p>Now that you have a set of pre-defined gestures, you must load it inside your
+application. This can be achieved in several ways but the easiest is to use the
+<code>GestureLibraries</code> class:</p>
+
+<pre class="prettyprint">mLibrary = GestureLibraries.fromRawResource(this, R.raw.spells);
+if (!mLibrary.load()) {
+ finish();
+}</pre>
+
+<p>In this example, the gesture library is loaded from the file
+<code>/res/raw/spells</code>. You can easily load libraries from other sources,
+like the SD card, which is very important if you want your application to be
+able to save the library; a library loaded from a raw resource is read-only and
+cannot be modified. The following diagram shows the structure of a library:</p>
+
+<img src="images/gestures_002.png" style="width: 600px; height: 512px;">
+
+<h3>Recognizing gestures</h3>
+
+<p>To start recognizing gestures in your application, all you have to do
+is add a <code>GestureOverlayView</code> to your XML layout:</p>
+
+<pre><android.gesture.GestureOverlayView
+ android:id="@+id/gestures"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1.0" /></pre>
+
+<p>Notice that the <code>GestureOverlayView</code>
+is not part of the usual android.widget package. Therefore, you must
+use its fully qualified name. A gesture overlay acts as a simple
+drawing board on which the user can draw his gestures. You can tweak
+several visual properties, like the color and the width of the stroke
+used to draw gestures, and register various listeners to follow what
+the user is doing. The most commonly used listener is
+<code>GestureOverlayView.OnGesturePerformedListener</code>,
+which fires whenever a user is done drawing a gesture:</p>
+
+<pre>GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
+gestures.addOnGesturePerformedListener(this);</pre>
+
+<p>When the listener fires, you can ask the <code>GestureLibrary</code>
+to try to recognize the gesture. In return, you will get a list of
+Prediction instances, each with a name - the same name you entered in
+the Gestures Builder - and a score. The list is sorted by descending
+scores; the higher the score, the more likely the associated gesture is
+the one the user intended to draw. The following code snippet
+demonstrates how to retrieve the name of the first prediction:</p>
+
+<pre>public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
+ ArrayList<prediction> predictions = mLibrary.recognize(gesture);
+
+ // We want at least one prediction
+ if (predictions.size() > 0) {
+ Prediction prediction = predictions.get(0);
+ // We want at least some confidence in the result
+ if (prediction.score > 1.0) {
+ // Show the spell
+ Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
+ }
+ }
+}</pre>
+
+<p>In this example, the first prediction is taken into account only if it's
+score is greater than 1.0. The threshold you use is entirely up to you
+but know that scores lower than 1.0 are typically poor matches. And
+this is all the code you need to create a simple application that can
+recognize pre-defined gestures (see the source code of the project
+GesturesDemo):</p>
+
+<img src="images/gestures.png" style="width: 320px; height: 480px;">
+
+<h3>Gestures overlay</h3>
+
+<p>In the example above, the <code>GestureOverlayView</code> was used
+as a normal view, embedded inside a <code>LinearLayout</code>.
+However, as its name suggests, it can also be used as an overlay on top
+of other views. This can be useful to recognize gestures in a game or
+just anywhere in the UI of an application. In the second example,
+called GesturesListDemo, we'll create an overlay on top of a list of
+contacts. We start again in Gestures Builder to create a new set of
+pre-defined gestures:</p>
+
+<p><img src="images/gestures_005.png" style="width: 320px; height: 480px;"></p>
+
+<p>And here is what the XML layout looks like:</p>
+
+<pre><android.gesture.GestureOverlayView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gestures"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ android:gestureStrokeType="multiple"
+ android:eventsInterceptionEnabled="true"
+ android:orientation="vertical">
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" />
+
+</android.gesture.GestureOverlayView></pre>
+
+<p>In this application, the gestures view is an overlay on top of a regular
+ListView. The overlay also specifies a few properties that we did not
+need before:</p>
+
+<ul>
+<li><code>gestureStrokeType</code>: indicates
+whether we want to recognize gestures made of a single stroke or
+multiple strokes. Since one of our gestures is the "+" symbol, we need
+multiple strokes</li>
+<li><code>eventsInterceptionEnabled</code>: when
+set to true, this property tells the overlay to steal the events from
+its children as soon as it knows the user is really drawing a gesture.
+This is useful when there's a scrollable view under the overlay, to
+avoid scrolling the underlying child as the user draws his gesture </li>
+<li><code>orientation</code>:
+indicates the scroll orientation of the views underneath. In this case
+the list scrolls vertically, which means that any horizontal gestures
+(like <code>action_delete</code>) can immediately be recognized as a
+gesture. Gestures that start with a vertical stroke must contain at
+least one horizontal component to be recognized. In other words, a
+simple vertical line cannot be recognized as a gesture since it would
+conflict with the list's scrolling.</li>
+</ul>
+
+<p>The code used to load and set up the gestures library and overlay is exactly
+the same as before. The only difference is that we now check the name of the
+predictions to know what the user intended to do:</p>
+
+<pre>public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
+ ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
+ if (predictions.size() > 0 && predictions.get(0).score > 1.0) {
+ String action = predictions.get(0).name;
+ if ("action_add".equals(action)) {
+ Toast.makeText(this, "Adding a contact", Toast.LENGTH_SHORT).show();
+ } else if ("action_delete".equals(action)) {
+ Toast.makeText(this, "Removing a contact", Toast.LENGTH_SHORT).show();
+ } else if ("action_refresh".equals(action)) {
+ Toast.makeText(this, "Reloading contacts", Toast.LENGTH_SHORT).show();
+ }
+ }
+}</pre>
+
+<p>The user is now able to draw his gestures on top of the list without
+interfering with the scrolling:</p>
+
+<img src="images/gestures_004.png" style="width: 320px; height: 480px;">
+
+<p>The overlay even gives visual clues as to whether the gesture is considered
+valid for recognition. In the case of a vertical overlay, for instance,
+a single vertical stroke cannot be recognized as a gesture and is
+therefore drawn with a translucent color:</p>
+
+<img src="images/gestures_003.png" style="width: 320px; height: 480px;">
+
+<h3>It's your turn</h3>
+
+<p>Adding support for gestures in your application is easy and can be a valuable
+addition. The gestures API does not even have to be used to recognize complex
+shapes; it will work equally well to recognize simple swipes. We are very
+excited by the possibilities the gestures API offers, and we're eager to see
+what cool applications the community will create with it.</p>
diff --git a/docs/html/resources/articles/glsurfaceview.jd b/docs/html/resources/articles/glsurfaceview.jd
new file mode 100644
index 0000000..57403ea
--- /dev/null
+++ b/docs/html/resources/articles/glsurfaceview.jd
@@ -0,0 +1,268 @@
+page.title=Introducing GLSurfaceView
+@jd:body
+
+
+<p>The {@link android android.opengl.GLSurfaceView} class makes it
+easier for you to use OpenGL ES rendering in your applications by:</p>
+
+<ul>
+<li>Providing the glue code to connect OpenGL ES to the {@link
+android.view.View} system.</li>
+<li>Providing the glue code to make OpenGL ES work with the {@link
+android.app.Activity} life-cycle.</li>
+<li>Making it easy to choose an appropriate frame buffer pixel format.</li>
+<li>Creating and managing a separate rendering thread, to enable smooth
+animation.</li>
+<li>Providing easy-to-use debugging tools for tracing OpenGL ES API calls and
+checking for errors.</li>
+</ul>
+
+<p>GLSurfaceView is a good base for building an application that uses OpenGL ES
+for part or all of its rendering. A 2D or 3D action game would be a good
+candidate, as would a 2D or 3D data visualization application such as <a
+href="http://www.youtube.com/watch?v=4PRfVKzuUJ4&fmt=18" title="Google Maps
+StreetView">Google Maps StreetView</a>.</p>
+
+<h3>A simple GLSurfaceView application</h3>
+
+<p>Here's the source code to the simplest possible OpenGL ES application:</p>
+
+<pre>package com.example.android.apis.graphics;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+
+public class ClearActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mGLView = new GLSurfaceView(this);
+ mGLView.setRenderer(new ClearRenderer());
+ setContentView(mGLView);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mGLView.onPause();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mGLView.onResume();
+ }
+
+ private GLSurfaceView mGLView;
+}
+
+class ClearRenderer implements GLSurfaceView.Renderer {
+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+ // Do nothing special.
+ }
+
+ public void onSurfaceChanged(GL10 gl, int w, int h) {
+ gl.glViewport(0, 0, w, h);
+ }
+
+ public void onDrawFrame(GL10 gl) {
+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
+ }
+}</pre>
+
+<p>This program doesn't do much: it clears the screen to black on every frame.
+But it is a complete OpenGL application that correctly implements the
+Android activity life-cycle. It pauses rendering when the activity is
+paused, and resumes it when the activity is resumed. You could use this
+application as the basis for non-interactive demonstration programs.
+Just add more OpenGL calls to the <code>ClearRenderer.onDrawFrame()</code> method.
+Notice that you don't even need to subclass the <code>GLSurfaceView</code> view.</p>
+
+<p>The {@link android.opengl.GLSurfaceView.Renderer} interface has three methods:</p>
+
+<ul>
+<li>The
+<code>onSurfaceCreated()</code> method is called at the start of rendering, and
+whenever the OpenGL ES drawing context has to be recreated. (The
+drawing context is typically lost and recreated when the activity is
+paused and resumed.) <code>OnSurfaceCreated()</code> is a good place to create
+long-lived OpenGL resources such as textures.</li>
+<li>The <code>onSurfaceChanged()</code>
+method is called when the surface changes size. It's a good place to
+set your OpenGL viewport. You may also want to set your camera here, if
+it's a fixed camera that doesn't move around the scene.</li>
+<li>The <code>onDrawFrame()</code> method is called every frame, and is
+responsible for drawing the scene. You would typically start by calling
+<code>glClear</code> to clear the framebuffer, followed by other OpenGL ES calls
+to draw the current scene.</li>
+</ul>
+
+<h3>How about user input?</h3>
+
+<p>If you want an interactive application (such as a game), you will typically
+subclass <code>GLSurfaceView</code>, because that's an easy way of obtaining
+input events. Here's a slightly longer example showing how to do that:</p>
+
+<pre>package com.google.android.ClearTest;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.app.Activity;
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.MotionEvent;
+
+public class ClearActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mGLView = new ClearGLSurfaceView(this);
+ setContentView(mGLView);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mGLView.onPause();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mGLView.onResume();
+ }
+
+ private GLSurfaceView mGLView;
+}
+
+class ClearGLSurfaceView extends GLSurfaceView {
+ public ClearGLSurfaceView(Context context) {
+ super(context);
+ mRenderer = new ClearRenderer();
+ setRenderer(mRenderer);
+ }
+
+ public boolean onTouchEvent(final MotionEvent event) {
+ queueEvent(new Runnable(){
+ public void run() {
+ mRenderer.setColor(event.getX() / getWidth(),
+ event.getY() / getHeight(), 1.0f);
+ }});
+ return true;
+ }
+
+ ClearRenderer mRenderer;
+}
+
+class ClearRenderer implements GLSurfaceView.Renderer {
+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+ // Do nothing special.
+ }
+
+ public void onSurfaceChanged(GL10 gl, int w, int h) {
+ gl.glViewport(0, 0, w, h);
+ }
+
+ public void onDrawFrame(GL10 gl) {
+ gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
+ }
+
+ public void setColor(float r, float g, float b) {
+ mRed = r;
+ mGreen = g;
+ mBlue = b;
+ }
+
+ private float mRed;
+ private float mGreen;
+ private float mBlue;
+}</pre>
+
+<p>This application clears the screen for every frame. When you tap on the
+screen, it sets the clear color based on the (x,y) coordinates of your touch
+event. Note the use of <code>queueEvent()</code> in
+<code>ClearGLSurfaceView.onTouchEvent()</code>. The <code>queueEvent()</code>
+method is used to safely communicate between the UI thread and the rendering
+thread. If you prefer, you can use some other Java cross-thread communication
+technique, such as synchronized methods on the <code>Renderer</code> class
+itself. However, queueing events is often the simplest way of dealing with
+cross-thread communication.</p>
+
+<h3>Other GLSurfaceView samples</h3>
+
+<p>Tired
+of just clearing the screen? You can find more interesting samples in
+the API Demos sample included in the Android SDK. All the OpenGL ES samples have been
+converted to use the <code>GLSurfaceView</code> view:</p>
+
+<ul>
+<li>GLSurfaceView - a spinning triangle</li>
+<li>Kube - a cube puzzle demo</li>
+<li>Translucent GLSurfaceView - shows how to display 3D graphics on a translucent background</li>
+<li>Textured Triangle - shows how to draw a textured 3D triangle</li>
+<li>Sprite Text - shows how to draw text into a texture and then composite it into a 3D scene</li>
+<li>Touch Rotate - shows how to rotate a 3D object in response to user input.</li>
+</ul>
+
+<h3>Choosing a surface</h3>
+
+<p><code>GLSurfaceView</code>
+helps you choose the type of surface to render to. Different Android
+devices support different types of surfaces, with no common subset.
+This makes it tricky problem to choose the best available surface on
+each device. </p>
+
+<p>By default, <code>GLSurfaceView</code> tries to find a surface that's as
+close as possible to a 16-bit RGB frame buffer with a 16-bit depth
+buffer. Depending upon your application's needs you may want to change
+this behavior. For example, the Translucent GLSurfaceView sample needs
+an Alpha channel in order to render translucent data. <code>GLSurfaceView</code>
+provides an overloaded <code>setEGLSurfaceChooser()</code> method to give
+you control over which surface type is chosen:</p>
+
+<dl>
+<dt><code>setEGLConfigChooser(boolean needDepth)</code></dt>
+<dd>Choose a config that's closest to R5G6B5 with or without a 16-bit framebuffer</dd>
+<dt><code>setEGLConfigChooser(int redSize, int greenSize,int blueSize,
+int alphaSize,int depthSize, int stencilSize)</code></dt>
+<dd>Choose the config with the fewest number of bits per pixel that has at least
+as many bits-per-channel as specified in the constructor.</dd>
+<dt><code>setEGLConfigChooser(EGLConfigChooser configChooser)</code></dt>
+<dd>Allow total control over choosing a configuration. You pass in your own
+implementation of <code>EGLConfigChooser</code>, which gets to inspect the
+device's capabilities and choose a configuration.</dd>
+</dl>
+
+<h3>Continuous rendering versus render-when-dirty</h3>
+
+<p>Most 3D applications, such as games or simulations, are continuously
+animated. But some 3D applications are more reactive: they wait passively until
+the user does something, and then react to it. For those types of applications,
+the default <code>GLSurfaceView</code> behavior of continuously redrawing the
+screen is a waste of time. If you are developing a reactive application, you can
+call <code>GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY)</code>, which
+turns off the continuous animation. Then you call
+<code>GLSurfaceView.requestRender()</code> whenever you want to re-render.</p>
+
+<h3>Help With debugging</h3>
+
+<p><code>GLSurfaceView</code> has a handy built-in feature for debugging OpenGL ES
+applications: the <code>GLSurfaceView.setDebugFlags()</code> method can be used
+to enable logging and/or error checking your OpenGL ES calls. Call this method
+in your <code>GLSurfaceView</code>'s constructor, before calling
+<code>setRenderer()</code>:</p>
+
+<pre>public ClearGLSurfaceView(Context context) {
+ super(context);
+ // Turn on error-checking and logging
+ setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
+ mRenderer = new ClearRenderer();
+ setRenderer(mRenderer);
+}</pre>
\ No newline at end of file
diff --git a/docs/html/resources/articles/images/File.png b/docs/html/resources/articles/images/File.png
new file mode 100644
index 0000000..bc5a2b8
--- /dev/null
+++ b/docs/html/resources/articles/images/File.png
Binary files differ
diff --git a/docs/html/resources/articles/images/File_002.png b/docs/html/resources/articles/images/File_002.png
new file mode 100644
index 0000000..39254b30
--- /dev/null
+++ b/docs/html/resources/articles/images/File_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/JFlubber.png b/docs/html/resources/articles/images/JFlubber.png
new file mode 100644
index 0000000..d95e32b
--- /dev/null
+++ b/docs/html/resources/articles/images/JFlubber.png
Binary files differ
diff --git a/docs/html/resources/articles/images/WikiNotes.png b/docs/html/resources/articles/images/WikiNotes.png
new file mode 100644
index 0000000..d52c4fc
--- /dev/null
+++ b/docs/html/resources/articles/images/WikiNotes.png
Binary files differ
diff --git a/docs/html/resources/articles/images/all_drawables_changed.png b/docs/html/resources/articles/images/all_drawables_changed.png
new file mode 100644
index 0000000..04ec4a2
--- /dev/null
+++ b/docs/html/resources/articles/images/all_drawables_changed.png
Binary files differ
diff --git a/docs/html/resources/articles/images/android.png b/docs/html/resources/articles/images/android.png
new file mode 100644
index 0000000..6dc88cc
--- /dev/null
+++ b/docs/html/resources/articles/images/android.png
Binary files differ
diff --git a/docs/html/resources/articles/images/buttons.png b/docs/html/resources/articles/images/buttons.png
new file mode 100644
index 0000000..8c220b9
--- /dev/null
+++ b/docs/html/resources/articles/images/buttons.png
Binary files differ
diff --git a/docs/html/resources/articles/images/contacts-2.png b/docs/html/resources/articles/images/contacts-2.png
new file mode 100644
index 0000000..02f28aa
--- /dev/null
+++ b/docs/html/resources/articles/images/contacts-2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/contacts.png b/docs/html/resources/articles/images/contacts.png
new file mode 100644
index 0000000..d8b067d
--- /dev/null
+++ b/docs/html/resources/articles/images/contacts.png
Binary files differ
diff --git a/docs/html/resources/articles/images/correct_drawables.png b/docs/html/resources/articles/images/correct_drawables.png
new file mode 100644
index 0000000..516309b
--- /dev/null
+++ b/docs/html/resources/articles/images/correct_drawables.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ddms_allocation_tracker.png b/docs/html/resources/articles/images/ddms_allocation_tracker.png
new file mode 100644
index 0000000..b9fa0a1
--- /dev/null
+++ b/docs/html/resources/articles/images/ddms_allocation_tracker.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ddms_allocation_trackerl.png b/docs/html/resources/articles/images/ddms_allocation_trackerl.png
new file mode 100644
index 0000000..5ac8d2a
--- /dev/null
+++ b/docs/html/resources/articles/images/ddms_allocation_trackerl.png
Binary files differ
diff --git a/docs/html/resources/articles/images/device.png b/docs/html/resources/articles/images/device.png
new file mode 100644
index 0000000..186b960
--- /dev/null
+++ b/docs/html/resources/articles/images/device.png
Binary files differ
diff --git a/docs/html/resources/articles/images/device_002.png b/docs/html/resources/articles/images/device_002.png
new file mode 100644
index 0000000..4bc3b0c
--- /dev/null
+++ b/docs/html/resources/articles/images/device_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures.png b/docs/html/resources/articles/images/gestures.png
new file mode 100644
index 0000000..fe8f7cd
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures_002.png b/docs/html/resources/articles/images/gestures_002.png
new file mode 100644
index 0000000..b20da98
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures_003.png b/docs/html/resources/articles/images/gestures_003.png
new file mode 100644
index 0000000..a295939
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures_003.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures_004.png b/docs/html/resources/articles/images/gestures_004.png
new file mode 100644
index 0000000..3fe5fb1
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures_004.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures_005.png b/docs/html/resources/articles/images/gestures_005.png
new file mode 100644
index 0000000..3efc519
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures_005.png
Binary files differ
diff --git a/docs/html/resources/articles/images/gestures_006.png b/docs/html/resources/articles/images/gestures_006.png
new file mode 100644
index 0000000..399c31d
--- /dev/null
+++ b/docs/html/resources/articles/images/gestures_006.png
Binary files differ
diff --git a/docs/html/resources/articles/images/grid.png b/docs/html/resources/articles/images/grid.png
new file mode 100644
index 0000000..4713de5
--- /dev/null
+++ b/docs/html/resources/articles/images/grid.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime.png b/docs/html/resources/articles/images/ime.png
new file mode 100644
index 0000000..57f6df1
--- /dev/null
+++ b/docs/html/resources/articles/images/ime.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime_002.png b/docs/html/resources/articles/images/ime_002.png
new file mode 100644
index 0000000..3ec00b2
--- /dev/null
+++ b/docs/html/resources/articles/images/ime_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime_003.png b/docs/html/resources/articles/images/ime_003.png
new file mode 100644
index 0000000..a3f57bb
--- /dev/null
+++ b/docs/html/resources/articles/images/ime_003.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime_004.png b/docs/html/resources/articles/images/ime_004.png
new file mode 100644
index 0000000..efeddf0
--- /dev/null
+++ b/docs/html/resources/articles/images/ime_004.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime_005.png b/docs/html/resources/articles/images/ime_005.png
new file mode 100644
index 0000000..a7394e0
--- /dev/null
+++ b/docs/html/resources/articles/images/ime_005.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ime_006.png b/docs/html/resources/articles/images/ime_006.png
new file mode 100644
index 0000000..0b55c79
--- /dev/null
+++ b/docs/html/resources/articles/images/ime_006.png
Binary files differ
diff --git a/docs/html/resources/articles/images/layouts_comparison_small.png b/docs/html/resources/articles/images/layouts_comparison_small.png
new file mode 100644
index 0000000..0ba4cb8
--- /dev/null
+++ b/docs/html/resources/articles/images/layouts_comparison_small.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list01.png b/docs/html/resources/articles/images/list01.png
new file mode 100644
index 0000000..e1b7fa8
--- /dev/null
+++ b/docs/html/resources/articles/images/list01.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list02.png b/docs/html/resources/articles/images/list02.png
new file mode 100644
index 0000000..7f72a3f
--- /dev/null
+++ b/docs/html/resources/articles/images/list02.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list_fade_1.png b/docs/html/resources/articles/images/list_fade_1.png
new file mode 100644
index 0000000..43013d6
--- /dev/null
+++ b/docs/html/resources/articles/images/list_fade_1.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list_fade_2.png b/docs/html/resources/articles/images/list_fade_2.png
new file mode 100644
index 0000000..160d3ff
--- /dev/null
+++ b/docs/html/resources/articles/images/list_fade_2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list_fade_3.png b/docs/html/resources/articles/images/list_fade_3.png
new file mode 100644
index 0000000..70dca64
--- /dev/null
+++ b/docs/html/resources/articles/images/list_fade_3.png
Binary files differ
diff --git a/docs/html/resources/articles/images/list_fade_4.png b/docs/html/resources/articles/images/list_fade_4.png
new file mode 100644
index 0000000..7619fca
--- /dev/null
+++ b/docs/html/resources/articles/images/list_fade_4.png
Binary files differ
diff --git a/docs/html/resources/articles/images/merge1.jpg b/docs/html/resources/articles/images/merge1.jpg
new file mode 100644
index 0000000..114eed6
--- /dev/null
+++ b/docs/html/resources/articles/images/merge1.jpg
Binary files differ
diff --git a/docs/html/resources/articles/images/merge2.png b/docs/html/resources/articles/images/merge2.png
new file mode 100644
index 0000000..b4a8d4c
--- /dev/null
+++ b/docs/html/resources/articles/images/merge2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/merge3.png b/docs/html/resources/articles/images/merge3.png
new file mode 100644
index 0000000..61ed983
--- /dev/null
+++ b/docs/html/resources/articles/images/merge3.png
Binary files differ
diff --git a/docs/html/resources/articles/images/merge4.jpg b/docs/html/resources/articles/images/merge4.jpg
new file mode 100644
index 0000000..17b6c20
--- /dev/null
+++ b/docs/html/resources/articles/images/merge4.jpg
Binary files differ
diff --git a/docs/html/resources/articles/images/merge5.png b/docs/html/resources/articles/images/merge5.png
new file mode 100644
index 0000000..289f47e
--- /dev/null
+++ b/docs/html/resources/articles/images/merge5.png
Binary files differ
diff --git a/docs/html/resources/articles/images/mutated_states.png b/docs/html/resources/articles/images/mutated_states.png
new file mode 100644
index 0000000..50518b6
--- /dev/null
+++ b/docs/html/resources/articles/images/mutated_states.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs.png b/docs/html/resources/articles/images/on-screen-inputs.png
new file mode 100644
index 0000000..b8b3cf7
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs_002.png b/docs/html/resources/articles/images/on-screen-inputs_002.png
new file mode 100644
index 0000000..a5d21c7
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs_003.png b/docs/html/resources/articles/images/on-screen-inputs_003.png
new file mode 100644
index 0000000..81ee257
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs_003.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs_004.png b/docs/html/resources/articles/images/on-screen-inputs_004.png
new file mode 100644
index 0000000..651b72a
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs_004.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs_005.png b/docs/html/resources/articles/images/on-screen-inputs_005.png
new file mode 100644
index 0000000..75185ff
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs_005.png
Binary files differ
diff --git a/docs/html/resources/articles/images/on-screen-inputs_006.png b/docs/html/resources/articles/images/on-screen-inputs_006.png
new file mode 100644
index 0000000..b653d75
--- /dev/null
+++ b/docs/html/resources/articles/images/on-screen-inputs_006.png
Binary files differ
diff --git a/docs/html/resources/articles/images/photostream_landscape.png b/docs/html/resources/articles/images/photostream_landscape.png
new file mode 100644
index 0000000..ad4a0c5
--- /dev/null
+++ b/docs/html/resources/articles/images/photostream_landscape.png
Binary files differ
diff --git a/docs/html/resources/articles/images/photostream_portrait.png b/docs/html/resources/articles/images/photostream_portrait.png
new file mode 100644
index 0000000..3794f63
--- /dev/null
+++ b/docs/html/resources/articles/images/photostream_portrait.png
Binary files differ
diff --git a/docs/html/resources/articles/images/qsb.png b/docs/html/resources/articles/images/qsb.png
new file mode 100644
index 0000000..4e40af1
--- /dev/null
+++ b/docs/html/resources/articles/images/qsb.png
Binary files differ
diff --git a/docs/html/resources/articles/images/qsb_002.png b/docs/html/resources/articles/images/qsb_002.png
new file mode 100644
index 0000000..8c2f772
--- /dev/null
+++ b/docs/html/resources/articles/images/qsb_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/qsb_003.png b/docs/html/resources/articles/images/qsb_003.png
new file mode 100644
index 0000000..069b6cd
--- /dev/null
+++ b/docs/html/resources/articles/images/qsb_003.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_1.png b/docs/html/resources/articles/images/relativelayout_1.png
new file mode 100644
index 0000000..3360ad8
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_1.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_2.png b/docs/html/resources/articles/images/relativelayout_2.png
new file mode 100644
index 0000000..8e71bb2
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_3.png b/docs/html/resources/articles/images/relativelayout_3.png
new file mode 100644
index 0000000..16a9767
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_3.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_wire_1.png b/docs/html/resources/articles/images/relativelayout_wire_1.png
new file mode 100644
index 0000000..9cb241d
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_wire_1.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_wire_2.png b/docs/html/resources/articles/images/relativelayout_wire_2.png
new file mode 100644
index 0000000..4243812
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_wire_2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/relativelayout_wire_3.png b/docs/html/resources/articles/images/relativelayout_wire_3.png
new file mode 100644
index 0000000..04ce1ce
--- /dev/null
+++ b/docs/html/resources/articles/images/relativelayout_wire_3.png
Binary files differ
diff --git a/docs/html/resources/articles/images/search01.png b/docs/html/resources/articles/images/search01.png
new file mode 100644
index 0000000..4160a76
--- /dev/null
+++ b/docs/html/resources/articles/images/search01.png
Binary files differ
diff --git a/docs/html/resources/articles/images/search02.png b/docs/html/resources/articles/images/search02.png
new file mode 100644
index 0000000..6300018
--- /dev/null
+++ b/docs/html/resources/articles/images/search02.png
Binary files differ
diff --git a/docs/html/resources/articles/images/shared_states.png b/docs/html/resources/articles/images/shared_states.png
new file mode 100644
index 0000000..81bec09
--- /dev/null
+++ b/docs/html/resources/articles/images/shared_states.png
Binary files differ
diff --git a/docs/html/resources/articles/images/shelves2.png b/docs/html/resources/articles/images/shelves2.png
new file mode 100644
index 0000000..2de239f
--- /dev/null
+++ b/docs/html/resources/articles/images/shelves2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/text_field.png b/docs/html/resources/articles/images/text_field.png
new file mode 100644
index 0000000..b9dedec
--- /dev/null
+++ b/docs/html/resources/articles/images/text_field.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ui-1.6.png b/docs/html/resources/articles/images/ui-1.6.png
new file mode 100644
index 0000000..bc5a2b8
--- /dev/null
+++ b/docs/html/resources/articles/images/ui-1.6.png
Binary files differ
diff --git a/docs/html/resources/articles/images/ui-1.6_002.png b/docs/html/resources/articles/images/ui-1.6_002.png
new file mode 100644
index 0000000..39254b30
--- /dev/null
+++ b/docs/html/resources/articles/images/ui-1.6_002.png
Binary files differ
diff --git a/docs/html/resources/articles/images/viewstub1.png b/docs/html/resources/articles/images/viewstub1.png
new file mode 100644
index 0000000..2de239f
--- /dev/null
+++ b/docs/html/resources/articles/images/viewstub1.png
Binary files differ
diff --git a/docs/html/resources/articles/images/viewstub2.png b/docs/html/resources/articles/images/viewstub2.png
new file mode 100644
index 0000000..6e6feb9
--- /dev/null
+++ b/docs/html/resources/articles/images/viewstub2.png
Binary files differ
diff --git a/docs/html/resources/articles/images/viewstub3.png b/docs/html/resources/articles/images/viewstub3.png
new file mode 100644
index 0000000..5e793e6
--- /dev/null
+++ b/docs/html/resources/articles/images/viewstub3.png
Binary files differ
diff --git a/docs/html/resources/articles/images/viewstub4.png b/docs/html/resources/articles/images/viewstub4.png
new file mode 100644
index 0000000..cffb9c6
--- /dev/null
+++ b/docs/html/resources/articles/images/viewstub4.png
Binary files differ
diff --git a/docs/html/resources/articles/images/webview.png b/docs/html/resources/articles/images/webview.png
new file mode 100644
index 0000000..92472af
--- /dev/null
+++ b/docs/html/resources/articles/images/webview.png
Binary files differ
diff --git a/docs/html/resources/articles/images/window_background.png b/docs/html/resources/articles/images/window_background.png
new file mode 100644
index 0000000..58f4f7e
--- /dev/null
+++ b/docs/html/resources/articles/images/window_background.png
Binary files differ
diff --git a/docs/html/resources/articles/images/window_background_null.png b/docs/html/resources/articles/images/window_background_null.png
new file mode 100644
index 0000000..83f7b45d
--- /dev/null
+++ b/docs/html/resources/articles/images/window_background_null.png
Binary files differ
diff --git a/docs/html/resources/articles/images/window_background_root.png b/docs/html/resources/articles/images/window_background_root.png
new file mode 100644
index 0000000..95a47c0
--- /dev/null
+++ b/docs/html/resources/articles/images/window_background_root.png
Binary files differ
diff --git a/docs/html/resources/articles/index.jd b/docs/html/resources/articles/index.jd
new file mode 100644
index 0000000..4fda6d7
--- /dev/null
+++ b/docs/html/resources/articles/index.jd
@@ -0,0 +1,147 @@
+page.title=Technical Articles
+@jd:body
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/avoiding-memory-leaks.html">Avoiding Memory Leaks</a></dt>
+ <dd>Mobile devices often have limited memory, and memory leaks can cause your application to waste this valuable resource without your knowledge. This article provides tips to help you avoid common causes of memory leaks on the Android platform.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/backward-compatibility.html">Backward Compatibility</a></dt>
+ <dd>The Android platform strives to ensure backwards compatibility. However, sometimes you want to use new features which aren't supported on older platforms. This article discusses strategies for selectively using these features based on availability, allowing you to keep your applications portable across a wide range of devices.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/can-i-use-this-intent.html">Can I Use this Intent?</a></dt>
+ <dd>Android offers a very powerful and yet easy-to-use message type called an intent. You can use intents to turn applications into high-level libraries and make code modular and reusable. While it is nice to be able to make use of a loosely coupled API, there is no guarantee that the intent you send will be received by another application. This article describes a technique you can use to find out whether the system contains any application capable of responding to the intent you want to use.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/creating-input-method.html">Creating an Input Method</a></dt>
+ <dd>Input Method Editors (IMEs) provide the mechanism for entering text into text fields and other Views. Android devices come bundled with at least one IME, but users can install additional IMEs. This article covers the basics of developing an IME for the Android platform.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/drawable-mutations.html">Drawable Mutations</a></dt>
+ <dd>Drawables are pluggable drawing containers that allow applications to display graphics. This article explains some common pitfalls when trying to modify the properties of multiple Drawables.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/faster-screen-orientation-change.html">Faster Screen Orientation Change</a></dt>
+ <dd>When an Android device changes its orientation, the default behavior is to automatically restart the current activity with a new configuration. However, this can become a bottleneck in applications that access a large amount of external data. This article discusses how to gracefully handle this situation without resorting to manually processing configuration changes.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/future-proofing.html">Future-Proofing Your Apps</a></dt>
+ <dd>A collection of common sense advice to help you ensure that your applications don't break when new versions of the Android platform are released.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/gestures.html">Gestures</a></dt>
+ <dd>Touch screens allow users to perform gestures, such as tapping, dragging, flinging, or sliding, to perform various actions. The gestures API enables your application to recognize even complicated gestures with ease. This article explains how to integrate this API into an application.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/glsurfaceview.html">Introducing GLSurfaceView</a></dt>
+ <dd>This article provides an overview of GLSurfaceView, a class that makes it easy to implement 2D or 3D OpenGL rendering inside of an Android application.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/layout-tricks-reuse.html">Layout Tricks: Creating Reusable UI Components</a></dt>
+ <dd>Learn how to combine multiple standard UI widgets into a single high-level component, which can be reused throughout your application.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/layout-tricks-efficiency.html">Layout Tricks: Creating Efficient Layouts</a></dt>
+ <dd>Learn how to optimize application layouts as this article walks you through converting a LinearLayout into a RelativeLayout, and analyzes the resulting implications on performance.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/layout-tricks-stubs.html">Layout Tricks: Using ViewStubs</a></dt>
+ <dd>Learn about using ViewStubs inside an application's layout in order to inflate rarely used UI elements, without the performance implications which would otherwise be caused by using the <code><include></code> tag.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/layout-tricks-merge.html">Layout Tricks: Merging Layouts</a></dt>
+ <dd>Learn how to use the <code><merge></code> tag in your XML layouts in order to avoid unnecessary levels of hierarchy within an application's view tree.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/listview-backgrounds.html">ListView Backgrounds: An Optimization</a></dt>
+ <dd>ListViews are very popular widgets within the Android framework. This article describes some of the optimizations used by the ListView widget, and how to avoid some common issues that this causes when trying to use a custom background.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/live-folders.html">Live Folders</a></dt>
+ <dd>Live Folders allow users to display any source of data on their home screen without launching an application. This article discusses how to export an application's data in a format suitable for display inside of a live folder.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/on-screen-inputs.html">Onscreen Input Methods</a></dt>
+ <dd>The Input Method Framework (IMF) allows users to take advantage of on-screen input methods, such as software keyboards. This article provides an overview of Input Method Editors (IMEs) and how applications interact with them.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/painless-threading.html">Painless Threading</a></dt>
+ <dd>This article discusses the threading model used by Android applications and how applications can ensure best UI performance by spawning worker threads to handle long-running operations, rather than handling them in the main thread. The article also explains the API that your application can use to interact with Android UI toolkit components running on the main thread and spawn managed worker threads.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/qsb.html">Quick Search Box</a></dt>
+ <dd>Quick Search Box (QSB) is a powerful, system-wide search framework. QSB makes it possible for users to quickly and easily find what they're looking for, both on their devices and on the web. This article discusses how to work with the QSB framework to add new search results for an installed application.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/touch-mode.html">Touch Mode</a></dt>
+ <dd>This article explains the touch mode, one of the most important principles of Android's UI toolkit. Whenever a user interacts with a device's touch screen, the system enters touch mode. While simple in concept, there are important implications touch mode that are often overlooked.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/track-mem.html">Tracking Memory Allocations</a></dt>
+ <dd>This article discusses how to use the Allocation Tracker tool to observe memory allocations and avoid performance problems that would otherwise be caused by ignoring the effect of Dalvik's garbage collector.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/ui-1.5.html">UI Framework Changes in Android 1.5</a></dt>
+ <dd>Explore the UI changes that were introduced in Android 1.5, compared with the UI provided in Android 1.0 and 1.1.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/ui-1.6.html">UI Framework Changes in Android 1.6</a></dt>
+ <dd>Explore the UI changes that were introduced in Android 1.6, compared with the UI provided in Android 1.5. In particular, this article discusses changes to RelativeLayouts and click listeners.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/timed-ui-updates.html">Updating the UI from a Timer</a></dt>
+ <dd>Learn about how to use Handlers as a more efficient replacement for java.util.Timer on the Android platform.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/tts.html">Using Text-to-Speech</a></dt>
+ <dd>The text-to-speech API lets your application "speak" to users, in any of several languages. This article provides an overview of the TTS API and how you use to add speech capabilities to your application.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/using-webviews.html">Using WebViews</a></dt>
+ <dd>WebViews allow an application to dynamically display HTML and execute JavaScript, without relinquishing control to a separate browser application. This article introduces the WebView classes and provides a sample application that demonstrates its use.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/wikinotes-linkify.html">WikiNotes: Linkify your Text!</a></dt>
+ <dd>This article introduces WikiNotes for Android, part of the Apps for Android project. It covers the use of Linkify to turn ordinary text views into richer, link-oriented content that causes Android intents to fire when a link is selected.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/wikinotes-intents.html">WikiNotes: Routing Intents</a></dt>
+ <dd>This article illustrates how an application, in this case the WikiNotes sample app, can use intents to route various types of linked text to the application that handles that type of data. For example, an app can use intents to route a linked telephone number to a dialer app and a web URL to a browser.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/window-bg-speed.html">Window Backgrounds & UI Speed</a></dt>
+ <dd>Some Android applications need to squeeze every bit of performance out of the UI toolkit and there are many ways to do so. In this article, you will discover how to speed up the drawing and the perceived startup time of your activities. Both of these techniques rely on a single feature, the window's background drawable.</dd>
+</dl>
+
+<dl>
+ <dt><a href="{@docRoot}resources/articles/zipalign.html">Zipalign: an Easy Optimization</a></dt>
+ <dd>The Android SDK includes a tool called zipalign that optimizes the way an application is packaged. Running zipalign against your application enables Android to interact with it more efficiently at run time and thus has the potential to make it and the overall system run faster. This article provides a high-level overview of the zipalign tool and its use.</dd>
+</dl>
diff --git a/docs/html/resources/articles/layout-tricks-efficiency.jd b/docs/html/resources/articles/layout-tricks-efficiency.jd
new file mode 100644
index 0000000..b7b5761
--- /dev/null
+++ b/docs/html/resources/articles/layout-tricks-efficiency.jd
@@ -0,0 +1,177 @@
+page.title=Layout Tricks: Creating Efficient Layouts
+@jd:body
+
+<p>The Android UI toolkit offers several layout managers that are
+rather easy to use and, most of the time, you only need the basic
+features of these layout managers to implement a user interface.</p>
+
+<p>Sticking to the basic features is unfortunately not the most efficient
+way to create user interfaces. A common example is the abuse of
+{@link android.widget.LinearLayout}, which leads to a proliferation of
+views in the view hierarchy. Every view — or worse, every layout
+manager — that you add to your application comes at a cost:
+initialization, layout and drawing become slower. The layout pass can be
+especially expensive when you nest several <code>LinearLayout</code>
+that use the {@link android.R.attr#layout_weight weight}
+parameter, which requires the child to be measured twice.</p>
+
+<p>Let's consider a very simple and common example of a layout: a list item
+with an icon on the left, a title at the top and an optional description
+underneath the title. Here is what such an item looks like:</p>
+
+<div style="text-align: center;"><img src="images/relativelayout_1.png" alt="Simple list item"></div>
+
+<p>To clearly understand how the views, one {@link android.widget.ImageView} and
+two {@link android.widget.TextView}, are positioned with respect to each other,
+here is the wireframe of the layout as captured by <a
+href="{@docRoot}guide/developing/tools/hierarchy-viewer.html">HierarchyViewer</a
+>:</p>
+
+<div style="text-align: center;"><img src="images/relativelayout_wire_1.png" alt="Wireframe of the simple list item"></div>
+
+<p>Implementing this layout is straightforward with <code>LinearLayout</code>.
+The item itself is a horizontal <code>LinearLayout</code> with an
+<code>ImageView</code> and a vertical <code>LinearLayout</code>, which contains
+the two <code>TextView</code>. Here's the source code of this layout:</p>
+
+<pre class="prettyprint"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+
+ android:padding="6dip">
+
+ <ImageView
+ android:id="@+id/icon"
+
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="6dip"
+
+ android:src="@drawable/icon" />
+
+ <LinearLayout
+ android:orientation="vertical"
+
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+
+ android:gravity="center_vertical"
+ android:text="My Application" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:text="Simple application that shows how to use RelativeLayout" />
+
+ </LinearLayout>
+
+</LinearLayout></pre>
+
+<p>This layout works but can be wasteful if you instantiate it for every list
+item of a {@link android.widget.ListView}. The same layout can be rewritten
+using a single {@link android.widget.RelativeLayout}, thus saving one view, and
+even better one level in view hierarchy, per list item. The implementation of
+the layout with a <code>RelativeLayout</code> remains simple:</p>
+
+<pre class="prettyprint"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+
+ android:padding="6dip">
+
+ <ImageView
+ android:id="@+id/icon"
+
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:layout_marginRight="6dip"
+
+ android:src="@drawable/icon" />
+
+ <TextView
+ android:id="@+id/secondLine"
+
+ android:layout_width="fill_parent"
+ android:layout_height="26dip"
+
+ android:layout_toRightOf="@id/icon"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:text="Simple application that shows how to use RelativeLayout" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+
+ android:layout_toRightOf="@id/icon"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:layout_above="@id/secondLine"
+ android:layout_alignWithParentIfMissing="true"
+
+ android:gravity="center_vertical"
+ android:text="My Application" />
+
+</RelativeLayout></pre>
+
+<p>This new implementation behaves exactly the same way as the previous
+implementation, except in one case. The list item we want to display has two
+lines of text: the title and an <em>optional</em> description. When a
+description is not available for a given list item, the application would simply
+set the visibility of the second <code>TextView</code> to
+{@link android.view.View#GONE}. This works perfectly with the <code>LinearLayout</code>
+implementation but not with the <code>RelativeLayout</code> version:</p>
+
+<div style="text-align: center;"><img src="images/relativelayout_2.png" alt="RelativeLayout and description GONE"></div>
+<div style="text-align: center;"><img src="images/relativelayout_wire_2.png" alt="RelativeLayout and description GONE"></div>
+
+<p>In a <code>RelativeLayout</code>, views are aligned with their parent, with the
+<code>RelativeLayout</code> itself, or with other views. For instance, we declared that
+the description is aligned with the bottom of the <code>RelativeLayout</code> and
+that the title is positioned above the description and anchored to the
+parent's top. With the description GONE, RelativeLayout doesn't know
+where to position the title's bottom edge. To solve this problem, you
+can use a very special layout parameter called
+{@link android.R.attr#layout_alignWithParentIfMissing}.
+</p>
+
+<p>This boolean parameter simply tells RelativeLayout to use its own edges as
+anchors when a constraint target is missing. For instance, if you position a
+view to the right of a GONE view and set <code>alignWithParentIfMissing</code>
+to <code>true</code>, <code>RelativeLayout</code> will instead anchor the view
+to its left edge. In our case, using <code>alignWithParentIfMissing</code> will
+cause <code>RelativeLayout</code> to align the title's bottom with its own
+bottom. The result is the following:</p>
+
+<div style="text-align: center;"><img src="images/relativelayout_3.png" alt="RelativeLayout, description GONE and alignWithParentIfMissing"></div>
+<div style="text-align: center;"><img src="images/relativelayout_wire_3.png" alt="RelativeLayout, description GONE and alignWithParentIfMissing"></div>
+
+<p>The
+behavior of our layout is now perfect, even when the description is
+GONE. Even better, the hierarchy is simpler and because we are not
+using LinearLayout's weights it's also more efficient. The difference
+between the two implementations becomes obvious when comparing the view
+hierarchies in HierarchyViewer:</p>
+
+<div style="text-align: center;"><img src="images/layouts_comparison_small.png" alt="LinearLayout vs RelativeLayout"></div>
+
+<p>Again, the difference will be much more important when you use such a layout
+for every item in a ListView for instance. Hopefully this simple
+example showed you that getting to know your layouts is the best way to
+learn how to optimize your UI.</p>
diff --git a/docs/html/resources/articles/layout-tricks-merge.jd b/docs/html/resources/articles/layout-tricks-merge.jd
new file mode 100644
index 0000000..3e165d2
--- /dev/null
+++ b/docs/html/resources/articles/layout-tricks-merge.jd
@@ -0,0 +1,198 @@
+page.title=Layout Tricks: Merging Layouts
+@jd:body
+
+<p>The <a href=""></a> articles showed you how to use the <code><include /></code> tag in XML layouts, to reuse and share your layout code. This article explains the <code><merge /></code> tag and how it complements the <code><include /></code> tag.</p>
+
+<p>The <code><merge /></code> tag was created for the purpose of
+optimizing Android layouts by reducing the number of levels in view trees. It's
+easier to understand the problem this tag solves by looking at an example. The
+following XML layout declares a layout that shows an image with its title on top
+of it. The structure is fairly simple; a {@link android.widget.FrameLayout} is
+used to stack a {@link android.widget.TextView} on top of an
+{@link android.widget.ImageView}:</p>
+
+<pre class="prettyprint"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <ImageView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ android:scaleType="center"
+ android:src="@drawable/golden_gate" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="20dip"
+ android:layout_gravity="center_horizontal|bottom"
+
+ android:padding="12dip"
+
+ android:background="#AA000000"
+ android:textColor="#ffffffff"
+
+ android:text="Golden Gate" />
+
+</FrameLayout></pre>
+
+<p>This layout renders nicely and nothing seems wrong with it:</p>
+
+<div style="text-align: center;"><img src="images/merge1.jpg" alt="A FrameLayout is used to overlay a title on top of an image"></div>
+
+<p>Things get more interesting when you inspect the result with <a
+href="{@docRoot}guide/developing/tools/hierarchy-viewer.html">HierarchyViewer</a>.
+If you look closely at the resulting tree, you will notice that the
+<code>FrameLayout</code> defined in our XML file (highlighted in blue below) is
+the sole child of another <code>FrameLayout</code>:</p>
+
+<div style="text-align: center;"><img src="images/merge2.png" alt="A layout with only one child of same dimensions can be removed"></div>
+
+<p>Since our <code>FrameLayout</code> has the same dimension as its parent, by
+the virtue of using the <code>fill_parent</code> constraints, and does not
+define any background, extra padding or a gravity, it is <em>totally
+useless</em>. We only made the UI more complex for no good reason. But how could
+we get rid of this <code>FrameLayout</code>? After all, XML documents require a
+root tag and tags in XML layouts always represent view instances.</p>
+
+<p>That's where the <code><merge /></code> tag comes in handy. When the
+{@link android.view.LayoutInflater} encounters this tag, it skips it and adds
+the <code><merge /></code> children to the <code><merge /></code>
+parent. Confused? Let's rewrite our previous XML layout by replacing the
+<code>FrameLayout</code> with <code><merge /></code>:</p>
+
+<pre class="prettyprint"><merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <ImageView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ android:scaleType="center"
+ android:src="@drawable/golden_gate" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="20dip"
+ android:layout_gravity="center_horizontal|bottom"
+
+ android:padding="12dip"
+
+ android:background="#AA000000"
+ android:textColor="#ffffffff"
+
+ android:text="Golden Gate" />
+
+</merge></pre>
+
+<p>With this new version, both the <code>TextView</code> and the
+<code>ImageView</code> will be added directly to the top-level
+<code>FrameLayout</code>. The result will be visually the same but the view
+hierarchy is simpler:</p>
+
+<div style="text-align: center;"><img src="images/merge3.png" alt="Optimized view hierarchy using the merge tag"></div>
+
+<p>Obviously, using <code><merge /></code> works in this case because the
+parent of an activity's content view is always a <code>FrameLayout</code>. You
+could not apply this trick if your layout was using a <code>LinearLayout</code>
+as its root tag for instance. The <code><merge /></code> can be useful in
+other situations though. For instance, it works perfectly when combined with the
+<code><include /></code> tag. You can also use <code><merge
+/></code> when you create a custom composite view. Let's see how we can use
+this tag to create a new view called <code>OkCancelBar</code> which simply shows
+two buttons with customizable labels. You can also <a
+href="http://progx.org/users/Gfx/android/MergeLayout.zip">download the complete
+source code of this example</a>. Here is the XML used to display this custom
+view on top of an image:</p>
+
+<pre class="prettyprint"><merge
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:okCancelBar="http://schemas.android.com/apk/res/com.example.android.merge">
+
+ <ImageView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ android:scaleType="center"
+ android:src="@drawable/golden_gate" />
+
+ <com.example.android.merge.OkCancelBar
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+
+ android:paddingTop="8dip"
+ android:gravity="center_horizontal"
+
+ android:background="#AA000000"
+
+ okCancelBar:okLabel="Save"
+ okCancelBar:cancelLabel="Don't save" />
+
+</merge></pre>
+
+<p>This new layout produces the following result on a device:</p>
+
+<div style="text-align: center;"><img src="images/merge4.jpg" alt="Creating a custom view with the merge tag"></div>
+
+<p>The source code of <code>OkCancelBar</code> is very simple because the two
+buttons are defined in an external XML file, loaded using a
+<code>LayoutInflate</code>. As you can see in the following snippet, the XML
+layout <code>R.layout.okcancelbar</code> is inflated with the
+<code>OkCancelBar</code> as the parent:</p>
+
+<pre class="prettyprint">public class OkCancelBar extends LinearLayout {
+ public OkCancelBar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setOrientation(HORIZONTAL);
+ setGravity(Gravity.CENTER);
+ setWeightSum(1.0f);
+
+ LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
+
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);
+
+ String text = array.getString(R.styleable.OkCancelBar_okLabel);
+ if (text == null) text = "Ok";
+ ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);
+
+ text = array.getString(R.styleable.OkCancelBar_cancelLabel);
+ if (text == null) text = "Cancel";
+ ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);
+
+ array.recycle();
+ }
+}</pre>
+
+<p>The two buttons are defined in the following XML layout. As you can see, we
+use the <code><merge /></code> tag to add the two buttons directly to the
+<code>OkCancelBar</code>. Each button is included from the same external XML
+layout file to make them easier to maintain; we simply override their id:</p>
+
+<pre class="prettyprint"><merge xmlns:android="http://schemas.android.com/apk/res/android">
+ <include
+ layout="@layout/okcancelbar_button"
+ android:id="@+id/okcancelbar_ok" />
+
+ <include
+ layout="@layout/okcancelbar_button"
+ android:id="@+id/okcancelbar_cancel" />
+</merge></pre>
+
+<p>We have created a flexible and easy to maintain custom view that generates
+an efficient view hierarchy:</p>
+
+<div style="text-align: center;"><img src="images/merge5.png" alt="The resulting hierarchy is simple and efficient"></div>
+
+<p>The <code><merge /></code> tag is extremely useful and can do wonders
+in your code. However, it suffers from a couple of limitations:</p>
+
+<ul>
+<li><code><merge /></code> can only be used as the root tag of an XML layout</li>
+<li>When inflating a layout starting with a <code><merge /></code>, you <strong>must</strong>
+specify a parent <code>ViewGroup</code> and you must set <code>attachToRoot</code> to
+<code>true</code> (see the documentation for
+{@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)} method)</li>
+</ul>
+
diff --git a/docs/html/resources/articles/layout-tricks-reuse.jd b/docs/html/resources/articles/layout-tricks-reuse.jd
new file mode 100644
index 0000000..072ba89
--- /dev/null
+++ b/docs/html/resources/articles/layout-tricks-reuse.jd
@@ -0,0 +1,67 @@
+page.title=Layout Tricks: Creating Reusable UI Components
+@jd:body
+
+<p>The Android platform offers a wide variety of UI <em>widgets</em>, small
+visual construction blocks that you can glue together to present users with
+complex and useful interfaces. However applications often need higher-level
+visual <em>components</em>. To meet that need, and to do so efficiently, you can
+combine multiple standard widgets into a single, reusable component. </p>
+
+<p>For example, you could create a reusable component that contains a progress
+bar and a cancel button, a panel containing two buttons (positive and negative
+actions), a panel with an icon, a title and a description, and so on. You can
+create UI components easily by writing a custom <code>View</code>, but you can
+do it even more easily using only XML.</p>
+
+<p>In Android XML layout files, each tag is mapped to an actual class instance
+(the class is always a subclass of {@link android.view.View} The UI toolkit lets
+you also use three special tags that are not mapped to a <code>View</code>
+instance: <code><requestFocus /></code>, <code><merge /></code> and
+<code><include /></code>. This article shows how to use <code><include
+/></code> to create pure XML visual components. For information about how to
+use <code><merge /></code>, which can be particularly powerful when
+combined with <code><include /></code>see the <a
+href="{@docRoot}resources/articles/layout-tricks-merge.html">Merging Layouts</a>
+article. </p>
+
+<p>The <code><include /></code> element does exactly what its name
+suggests; it includes another XML layout. Using this tag is straightforward as
+shown in the following example, taken straight from <a
+href="http://android.git.kernel.org/?p=platform/packages/apps/Launcher.git;a=
+tree;h=refs/heads/master;hb=master">the source code of the Home application</a>
+that ships with Android:</p>
+
+<pre class="prettyprint"><com.android.launcher.Workspace
+ android:id="@+id/workspace"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ launcher:defaultScreen="1">
+
+ <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
+ <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
+ <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
+
+</com.android.launcher.Workspace></pre>
+
+<p>In the <code><include /></code> only the <code>layout</code> attribute
+is required. This attribute, without the <code>android</code> namespace prefix,
+is a reference to the layout file you wish to include. In this example, the same
+layout is included three times in a row. This tag also lets you override a few
+attributes of the included layout. The above example shows that you can use
+<code>android:id</code> to specify the id of the root view of the included
+layout; it will also override the id of the included layout if one is defined.
+Similarly, you can override all the layout parameters. This means that any
+<code>android:layout_*</code> attribute can be used with the <code><include
+/></code> tag. Here is an example:</p>
+
+<pre class="prettyprint"><include android:layout_width="fill_parent" layout="@layout/image_holder" />
+<include android:layout_width="256dip" layout="@layout/image_holder" />
+</pre>
+
+<p>This tag is particularly useful when you need to customize only part of your
+UI depending on the device's configuration. For instance, the main layout of
+your activity can be placed in the <code>layout/</code> directory and can
+include another layout which exists in two flavors, in <code>layout-land/</code>
+and <code>layout-port/</code>. This allows you to share most of the UI in
+portrait and landscape.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/layout-tricks-stubs.jd b/docs/html/resources/articles/layout-tricks-stubs.jd
new file mode 100644
index 0000000..88e4b25
--- /dev/null
+++ b/docs/html/resources/articles/layout-tricks-stubs.jd
@@ -0,0 +1,84 @@
+page.title=Layout Tricks: Using ViewStubs
+@jd:body
+
+<p>Sharing and reusing UI components is very easy with Android, thanks to the <a
+href="layout-tricks-reuse.html"><include /></a> tag. Sometimes it's so
+easy to create complex UI constructs that your UI ends up with a large number of
+views, some of which are rarely used. Thankfully, Android offers a very special
+widget called {@link android.view.ViewStub}, which brings you all the benefits
+of the <code><include /></code> without polluting your user interface with
+rarely used views.</p>
+
+<p>A <code>ViewStub</code> is a dumb and lightweight view. It has no dimension,
+it does not draw anything and does not participate in the layout in any way.
+This means that a <code>ViewStub</code> is very cheap to inflate and very cheap
+to keep in a view hierarchy. A <code>ViewStub</code> can be best described as a
+<em>lazy include</em>. The layout referenced by a <code>ViewStub</code> is
+inflated and added to the user interface only when you decide so.</p>
+
+<p>The following screenshot comes from the <a
+href="http://code.google/p/shelves">Shelves</a> application. The main purpose of
+the activity shown in the screenshot is to present the user with a browsable
+list of books:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center;" src="images/viewstub1.png" alt="" id="BLOGGER_PHOTO_ID_5314039375336055346" border="0">
+
+<p>The same activity is also used when the user adds or imports new books.
+During such an operation, Shelves shows extra bits of user interface.
+The screenshot below shows the progress bar and cancel button that
+appear at the bottom of the screen during an import:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center;" src="images/viewstub2.png" alt="" id="BLOGGER_PHOTO_ID_5314039800002559378" border="0">
+
+<p>Because importing books is not a common operation, at least when compared to
+browsing the list of books, the import panel is originally represented
+by a <code>ViewStub</code>:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center;" src="images/viewstub3.png" alt="" id="BLOGGER_PHOTO_ID_5314040334008167378" border="0">
+
+<p>When the user initiates the import process, the <code>ViewStub</code> is
+inflated and replaced by the content of the layout file it references:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center;" src="images/viewstub4.png" alt="" id="BLOGGER_PHOTO_ID_5314040638747834450" border="0">
+
+<p>To use a <code>ViewStub</code>, all you need is to specify an
+<code>android:id</code> attribute, to later inflate the stub, and an
+<code>android:layout</code> attribute, to reference what layout file
+to include and inflate. A stub lets you use a third attribute,
+<code>android:inflatedId</code>, which can be used to override the
+<code>id</code> of the root of the included file. Finally, the layout
+parameters specified on the stub will be applied to the roof of the
+included layout. Here is an example:</p>
+
+<pre class="prettyprint"><ViewStub
+ android:id="@+id/stub_import"
+ android:inflatedId="@+id/panel_import"
+
+ android:layout="@layout/progress_overlay"
+
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom" /></pre>
+
+<p>When you are ready to inflate the stub, simply invoke the
+{@link android.view.ViewStub#inflate()} method. You can also simply change the
+visibility of the stub to {@link android.view.View#VISIBLE} or
+{@link android.view.View#INVISIBLE} and the stub will inflate. Note however that the
+<code>inflate()</code> method has the benefit of returning the root
+<code>View</code> of the inflate layout:</p>
+
+<pre class="prettyprint">((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
+// or
+View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();</pre>
+
+<p>It is very important to remember that after the stub is inflated, the stub is
+<em>removed</em> from the view hierarchy. As such, it is unnecessary to keep a
+long-lived reference, for instance in an class instance field, to a
+<code>ViewStub</code>.</p>
+
+<p>A <code>ViewStub</code> is a great compromise between ease of programming and
+efficiency. Instead of inflating views manually and adding them at runtime to
+your view hierarchy, simply use a <code>ViewStub</code>. It's cheap and easy.
+The only drawback of <code>ViewStub</code> is that it currently does
+<em>not</em> support the <a href="layout-tricks-merge.html"><merge />
+tag</a>.</p>
diff --git a/docs/html/resources/articles/listview-backgrounds.jd b/docs/html/resources/articles/listview-backgrounds.jd
new file mode 100644
index 0000000..f4c6998
--- /dev/null
+++ b/docs/html/resources/articles/listview-backgrounds.jd
@@ -0,0 +1,86 @@
+page.title=ListView Backgrounds: An Optimization
+@jd:body
+
+<p>{@link android.widget.ListView} is one of Android's most widely used widgets.
+It is rather easy to use, very flexible, and incredibly powerful.
+<code>ListView</code> can also be difficult to understand at times.</p>
+
+<p>One of the most common issues with <code>ListView</code> happens when you try
+to use a custom background. By default, like many Android widgets,
+<code>ListView</code> has a transparent background which means that you can see
+through the default window's background, a very dark gray
+(<code>#FF191919</code> with the current <code>dark</code> theme.) Additionally,
+<code>ListView</code> enables the <em>fading edges</em> by default, as you can
+see at the top of the following screenshot — the first text item gradually
+fades to black. This technique is used throughout the system to indicate that
+the container can be scrolled.</p>
+
+<div style="text-align: center;"><img src="images/list_fade_1.png" alt="Android's default ListView"></div>
+
+<p>The fade effect is implemented using a combination of
+{@link android.graphics.Canvas#saveLayerAlpha(float, float, float, float, int, int) Canvas.saveLayerAlpha()}
+and the {@link android.graphics.PorterDuff.Mode#DST_OUT Porter-Duff Destination Out blending mode}. </p>
+
+<p>Unfortunately, things start to get ugly when you try to use a custom
+background on the <code>ListView</code> or when you change the window's
+background. The following two screenshots show what happens in an application
+when you change the window's background. The left image shows what the list
+looks like by default and the right image shows what the list looks like during
+a scroll initiated with a touch gesture:</p>
+
+<div style="text-align: center;">
+<img style="margin-right: 12px;" src="images/list_fade_2.png" alt="Dark fade">
+<img src="images/list_fade_3.png" alt="Dark list"></div>
+
+<p>This rendering issue is caused by an optimization of the Android framework
+enabled by default on all instances of <code>ListView</code>. I mentioned
+earlier that the fade effect is implemented using a Porter-Duff blending mode.
+This implementation works really well but is unfortunately very costly and can
+bring down drawing performance by quite a bit as it requires to capture a
+portion of the rendering in an offscreen bitmap and then requires extra blending
+(which implies readbacks from memory.)</p>
+
+<p>Since <code>ListView</code> is most of the time displayed on a solid
+background, there is no reason to go down that expensive route. That's why we
+introduced an optimization called the "cache color hint." The cache color hint
+is an RGB color set by default to the window's background color, that is #191919
+in Android's dark theme. When this hint is set, <code>ListView</code> (actually,
+its base class <code>View</code>) knows it will draw on a solid background and
+therefore replaces th expensive <code>saveLayerAlpha()/Porter-Duff</code>
+rendering with a simple gradient. This gradient goes from fully transparent to
+the cache color hint value and this is exactly what you see on the image above,
+with the dark gradient at the bottom of the list. However, this still does not
+explain why the entire list turns black during a scroll.</p>
+
+<p>As mentioned before, <code>ListView</code> has a transparent/translucent
+background by default, and so all default widgets in the Android UI toolkit.
+This implies that when <code>ListView</code> redraws its children, it has to
+blend the children with the window's background. Once again, this requires
+costly readbacks from memory that are particularly painful during a scroll or a
+fling when drawing happens dozen of times per second. </p>
+
+<p>To improve drawing performance during scrolling operations, the Android
+framework reuses the cache color hint. When this hint is set, the framework
+copies each child of the list in a <code>Bitmap</code> filled with the hint
+value (assuming that another optimization, called <em>scrolling cache</em>, is
+not turned off). <code>ListView</code> then blits these bitmaps directly on
+screen and because these bitmaps are known to be opaque, no blending is
+required. Also, since the default cache color hint is <code>#191919</code>, you
+get a dark background behind each item during a scroll.</p>
+
+<p>To fix this issue, all you have to do is either disable the cache color hint
+optimization, if you use a non-solid color background, or set the hint to the
+appropriate solid color value. You can do this from code (see
+{@link android.widget.AbsListView#setCacheColorHint(int)}) or preferably from
+XML, by using the <code>android:cacheColorHint</code> attribute. To disable the
+optimization, simply use the transparent color <code>#00000000</code>. The
+following screenshot shows a list with
+<code>android:cacheColorHint="#00000000"</code> set in the XML layout file:</p>
+
+<div style="text-align: center;"><img src="images/list_fade_4.png" alt="Fade on a custom background"></div>
+
+<p>As you can see, the fade works perfectly against the custom wooden
+background. The cache color hint feature is interesting because it
+shows how optimizations can make your life more difficult in
+some situations. In this particular case, however, the benefit of the
+default behavior outweighs the added complexity..</p>
diff --git a/docs/html/resources/articles/live-folders.jd b/docs/html/resources/articles/live-folders.jd
new file mode 100644
index 0000000..be974f4
--- /dev/null
+++ b/docs/html/resources/articles/live-folders.jd
@@ -0,0 +1,168 @@
+page.title=Live Folders
+@jd:body
+
+<p>Live folders, introduced in Android 1.5 (API Level 3), let you display any source of data
+on the Home screen without forcing the user to launch an application. A live
+folder is simply a real-time view of a {@link android.content.ContentProvider}.
+As such, a live folder can be used to display all of the user's contacts or
+bookmarks, email, playlists, an RSS feed, and so on. The possibilities are
+endless! </p>
+
+<p>The platform includes several standard folders for displaying contacts. For
+instance, the screenshot below shows the content of the live folders that
+displays all contacts with a phone number:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="images/contacts.png" alt="" id="BLOGGER_PHOTO_ID_5323287788220889218" border="0">
+
+<p>If a contacts sync happens in the background while the user is browsing this live
+folder, the user will see the change happen in real-time. Live folders are not
+only useful, but they are also easy to add to to your application and data.
+
+This articles shows how to add a live folder to an example application called
+Shelves. To better understand how live folders work, you can <a
+href="http://code.google.com/p/shelves">download the source code of the
+application</a> and modify it by following the instructions below.</p>
+
+<p>To give the user the option to create a new live folder for an application,
+you first need to create a new activity with an intent filter whose action is
+<code>android.intent.action.CREATE_LIVE_FOLDER</code>. To do so, simply open
+<code>AndroidManifest.xml</code> and add something similar to this:</p>
+
+<pre><activity
+ android:name=".activity.BookShelfLiveFolder"
+ android:label="BookShelf">
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+</activity></pre>
+
+<p>The label and icon of this activity are what the user will see on the Home
+screen when choosing a live folder to create:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="images/device_002.png" alt="" id="BLOGGER_PHOTO_ID_5323289217773103922" border="0">
+
+<p>Since you just need an intent filter, it is possible, and sometimes advised,
+to reuse an existing activity. In the case of Shelves, we will create a new
+activity, <code>org.curiouscreature.android.shelves.activity.BookShelfLiveFolder</code>.
+The role of this activity is to send an <code>Intent</code> result to Home
+containing the description of the live folder: its name, icon, display mode and
+content URI. The content URI is very important as it describes what
+<code>ContentProvider</code> will be used to populate the live folder. The code
+of the activity is very simple as you can see here:</p>
+
+<pre>public class BookShelfLiveFolder extends Activity {
+ public static final Uri CONTENT_URI = Uri.parse("content://shelves/live_folders/books");
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final Intent intent = getIntent();
+ final String action = intent.getAction();
+
+ if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
+ setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI,
+ "Books", R.drawable.ic_live_folder));
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+
+ finish();
+ }
+
+ private static Intent createLiveFolder(Context context, Uri uri, String name, int icon) {
+ final Intent intent = new Intent();
+
+ intent.setData(uri);
+ intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, name);
+ intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
+ Intent.ShortcutIconResource.fromContext(context, icon));
+ intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
+
+ return intent;
+ }
+}</pre>
+
+<p>This activity, when invoked with the<code>ACTION_CREATE_LIVE_FOLDER</code>
+intent, returns an intent with a URI,
+<code>content://shelves/live_folders/books</code>, and three extras to describe
+the live folder. There are other extras and constants you can use and you should
+refer to the documentation of <code>android.provider.LiveFolders</code> for more
+details. When Home receives this intent, a new live folder is created on the
+user's desktop, with the name and icon you provided. Then, when the user clicks
+on the live folder to open it, Home queries the content provider referenced by
+the provided URI.</p>
+
+<p>Live folders' content providers must obey specific naming rules. The
+<code>Cursor</code> returned by the <code>query()</code> method must have at
+least two columns named <code>LiveFolders._ID</code> and
+<code>LiveFolders.NAME</code>. The first one is the unique identifier of each
+item in the live folder and the second one is the name of the item. There are
+other column names you can use to specify an icon, a description, the intent to
+associate with the item (fired when the user clicks that item), etc. Again,
+refer to the documentation of <code>android.provider.LiveFolders</code> for more
+details.</p><p>In our example, all we need to do is modify the existing provider
+in Shelves called
+<code>org.curiouscreature.android.shelves.provider.BooksProvider</code>. First,
+we need to modify the <code>URI_MATCHER</code> to recognize our
+<code>content://shelves/live_folders/books</code> content URI:</p>
+
+<pre>private static final int LIVE_FOLDER_BOOKS = 4;
+// ...
+URI_MATCHER.addURI(AUTHORITY, "live_folders/books", LIVE_FOLDER_BOOKS);</pre>
+
+<p>Then we need to create a new projection map for the cursor. A projection map
+can be used to "rename" columns. In our case, we will replace
+<code>BooksStore.Book._ID</code>, <code>BooksStore.Book.TITLE</code> and
+<code>BooksStore.Book.AUTHORS</code> with <code>LiveFolders._ID</code>,
+<code>LiveFolders.TITLE</code> and <code>LiveFolders.DESCRIPTION</code>:</p>
+
+<pre>private static final HashMap<string, string=""> LIVE_FOLDER_PROJECTION_MAP;
+static {
+ LIVE_FOLDER_PROJECTION_MAP = new HashMap<string, string="">();
+ LIVE_FOLDER_PROJECTION_MAP.put(LiveFolders._ID, BooksStore.Book._ID +
+ " AS " + LiveFolders._ID);
+ LIVE_FOLDER_PROJECTION_MAP.put(LiveFolders.NAME, BooksStore.Book.TITLE +
+ " AS " + LiveFolders.NAME);
+ LIVE_FOLDER_PROJECTION_MAP.put(LiveFolders.DESCRIPTION, BooksStore.Book.AUTHORS +
+ " AS " + LiveFolders.DESCRIPTION);
+}</pre>
+
+<p>Because we are providing a title and a description for each row, Home will
+automatically display each item of the live folder with two lines of text.
+Finally, we implement the <code>query()</code> method by supplying our
+projection map to the SQL query builder:</p>
+
+<pre>public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+
+ switch (URI_MATCHER.match(uri)) {
+ // ...
+ case LIVE_FOLDER_BOOKS:
+ qb.setTables("books");
+ qb.setProjectionMap(LIVE_FOLDER_PROJECTION_MAP);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+ Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, BooksStore.Book.DEFAULT_SORT_ORDER);
+ c.setNotificationUri(getContext().getContentResolver(), uri);
+
+ return c;
+}</pre>
+
+<p>You can now compile and deploy the application, go to the Home screen and
+try to add a live folder. You can add a books live folder to your Home screen
+and when you open it, see the list of all of your books, with their
+titles and authors, and all it took was a few lines of code:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="images/device.png" alt="" id="BLOGGER_PHOTO_ID_5323293545495859234" border="0"></p>
+
+<p>The live folders API is extremely simple and relies only on intents and
+content URI. If you want to see more examples of live folders
+implementation, you can read the source code of the <a href="http://android.git.kernel.org/?p=platform/packages/apps/Contacts.git;a=tree;h=refs/heads/cupcake;hb=cupcake">Contacts application</a> and of the <a href="http://android.git.kernel.org/?p=platform/packages/providers/ContactsProvider.git;a=tree;h=refs/heads/cupcake;hb=cupcake">Contacts provider</a>.</p><p>You can also download the result of our exercise, the <a href="http://jext.free.fr/CupcakeShelves.zip">modified version of Shelves with live folders support</a>.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/on-screen-inputs.jd b/docs/html/resources/articles/on-screen-inputs.jd
new file mode 100644
index 0000000..057325a
--- /dev/null
+++ b/docs/html/resources/articles/on-screen-inputs.jd
@@ -0,0 +1,249 @@
+page.title=Onscreen Input Methods
+@jd:body
+
+
+<p>Starting from Android 1.5, the Android platform offers an Input Method
+Framework (IMF) that lets you create on-screen input methods such as software
+keyboards. This article provide an overview of what Android input method editors
+(IMEs) are and what an application needs to do to work well with them. The IMF
+is designed to support new classes of Android devices, such as those without
+hardware keyboards, so it is important that your application works well with the
+IMF and offers a great experience for users.</p>
+
+<h3>What is an input method?</h3>
+
+<p>The Android IMF is designed to support a variety of IMEs, including soft
+keyboard, hand-writing recognizers, and hard keyboard translators. Our focus,
+however, will be on soft keyboards, since this is the kind of input method that
+is currently part of the platform.</p>
+
+<p>A user will usually access the current IME by tapping on a text view to
+edit, as shown here in the home screen:</p>
+
+<img style="width: 320px; height: 480px; margin-right: 10px;" src="images/on-screen-inputs_004.png">
+<img style="width: 320px; height: 480px;" src="images/on-screen-inputs.png">
+
+<p>The soft keyboard is positioned at the bottom of the screen over the
+application's window. To organize the available space between the application
+and IME, we use a few approaches; the one shown here is called <em>pan and
+scan</em>, and simply involves scrolling the application window around so that
+the currently focused view is visible. This is the default mode, since it is the
+safest for existing applications.</p>
+
+<p>Most often the preferred screen layout is a <em>resize</em>, where the
+application's window is resized to be entirely visible. An example is shown
+here, when composing an e-mail message:</p>
+
+<img style="width: 320px; height: 480px; margin-right: 10px;" src="images/on-screen-inputs_005.png">
+<img style="width: 320px; height: 480px;" src="images/on-screen-inputs_003.png">
+
+<p>The size of the application window is changed so that none of it is hidden by
+the IME, allowing full access to both the application and IME. This of course
+only works for applications that have a resizeable area that can be reduced to
+make enough space, but the vertical space in this mode is actually no less than
+what is available in landscape orientation, so very often an application can
+already accommodate it.</p>
+
+<p>The final major mode is <em>fullscreen</em> or <em>extract</em>
+mode. This is used when the IME is too large to reasonably share space
+with the underlying application. With the standard IMEs, you will only
+encounter this situation when the screen is in a landscape orientation,
+although other IMEs are free to use it whenever they desire. In this
+case the application window is left as-is, and the IME simply displays
+fullscreen on top of it, as shown here:</p>
+
+<img style="width: 480px; height: 320px; margin-right: 10px; margin-bottom: 10px;" src="images/on-screen-inputs_006.png">
+<img style="width: 480px; height: 320px;" src="images/on-screen-inputs_002.png">
+
+<p>Because the IME is covering the application, it has its own editing area,
+which shows the text actually contained in the application. There are also some
+limited opportunities the application has to customize parts of the IME (the
+"done" button at the top and enter key label at the bottom) to improve the user
+experience.</p>
+
+<h3>Basic XML attributes for controlling IMEs</h3>
+
+<p>There are a number of things the system does to try to help existing
+applications work with IMEs as well as possible, such as:</p>
+
+<ul>
+<li>Use pan and scan mode by default, unless it can reasonably guess that
+resize mode will work by the existence of lists, scroll views, etc.</li>
+<li>Analyze the various existing TextView attributes to guess at the kind of
+content (numbers, plain text, etc) to help the soft keyboard display an
+appropriate key layout.</li>
+<li>Assign a few default actions to the fullscreen IME, such as "next field"
+and "done".</li>
+</ul>
+
+<p>There are also some simple things you can do in your application that will
+often greatly improve its user experience. Except where explicitly mentioned,
+these will work in any Android platform version, even those previous to Android
+1.5 (since they will simply ignore these new options).</p>
+
+<h4>Specifying each EditText control's input type</h4>
+
+<p>The most important thing for an application to do is to use the new
+<code>android:inputType</code>
+attribute on each <code>EditText</code>. The attribute provides much richer
+information
+about the text content. This attribute actually replaces many existing
+attributes (<code>android:</code><code>password</code>,
+<code>android:</code><code>singleLine</code>,
+<code>android:</code><code>numeric</code>,
+<code>android:</code><code>phoneNumber</code>,
+<code>android:</code><code>capitalize</code>,
+<code>android:</code><code>autoText</code>, and
+<code>android:</code><code>editable</code>). If you specify the older attributes
+and the new <code>android:inputType</code> attribute, the system uses
+<code>android:inputType</code> and ignores the others. </p>
+
+<p>The <code>android:inputType</code> attribute has three pieces:</p>
+
+<ul>
+<li>The <em>class</em> is the overall interpretation of characters. The
+currently supported classes are <code>text</code> (plain text),
+<code>number</code> (decimal number), <code>phone</code> (phone number), and
+<code>datetime</code> (a date or time).</li>
+<li>The <em>variation</em> is a further refinement on the class. In the
+attribute you will normally specify the class and variant together, with the
+class as a prefix. For example, <code>textEmailAddress</code> is a text field
+where the user will enter something that is an e-mail address (foo@bar.com) so
+the key layout will have an '@' character in easy access, and
+<code>numberSigned</code> is a numeric field with a sign. If only the class is
+specified, then you get the default/generic variant.</li>
+<li>Additional <em>flags</em> can be specified that supply further refinement.
+These flags are specific to a class. For example, some flags for the
+<code>text</code> class are <code>textCapSentences</code>,
+<code>textAutoCorrect</code>, and <code>textMultiline</code>.</li>
+</ul>
+
+<p>As an example, here is the new EditText for the IM application's message text view:</p>
+
+<pre> <EditText android:id="@+id/edtInput"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
+ android:imeOptions="actionSend|flagNoEnterAction"
+ android:maxLines="4"
+ android:maxLength="2000"
+ android:hint="@string/compose_hint"/></pre>
+
+<p>A full description of all of the input types can be found in the
+documentation. It is important to make use of the correct input types that are
+available, so that the soft keyboard can use the optimal keyboard layout for the
+text the user will be entering.</p>
+
+<h4>Enabling resize mode and other window features</h4>
+
+<p>The second most important thing for your app to do is to specify the overall
+behavior of your window in relation to the input method. The most visible aspect
+of this is controlling resize vs. pan and scan mode, but there are other things
+you can do as well to improve your user experience.</p>
+
+<p>You will usually control this behavior through the
+<code>android:windowSoftInputMode</code> attribute on each
+<code><activity></code> definition in your
+<code>AndroidManifest.xml</code>. Like the input type, there are a couple
+different pieces of data that can be specified here by combining them
+together:</p>
+
+<ul>
+<li>The window adjustment mode is specified with either
+<code>adjustResize</code> or <code>adjustPan</code>. It is highly recommended
+that you always specify one or the other.</li>
+<li>You can further control whether the IME will be shown automatically when
+your activity is displayed and other situations where the user moves to it. The
+system won't automatically show an IME by default, but in some cases it can be
+convenient for the user if an application enables this behavior. You can request
+this with <code>stateVisible</code>. There are also a number of other state
+options for finer-grained control that you can find in the documentation.</li>
+</ul>
+
+<p>A typical example of this field can be see in the edit contact activity,
+which ensures it is resized and automatically displays the IME for the user:</p>
+
+<pre> <activity name="EditContactActivity"
+ android:windowSoftInputMode="stateVisible|adjustResize">
+ ...
+ </activity></pre>
+
+<p class="note"><strong>Note:</strong>Starting from Android 1.5 (API Level 3),
+the platform offers a new method,
+{@link android.view.Window#setSoftInputMode(int mode)},
+that non-Activity windows can use to control their behavior. Calling this method
+in your will make your application incompatible with previous versions of the
+Android platform.</p>
+
+<h4>Controlling the action buttons</h4>
+
+<p>The final customization we will look at is the "action" buttons in the IME.
+There are currently two types of actions:</p>
+
+<ul>
+<li>The enter key on a soft keyboard is typically bound to an action when not
+operating on a mult-line edit text. For example, on the G1 pressing the hard
+enter key will typically move to the next field or the application will
+intercept it to execute an action; with a soft keyboard, this overloading of the
+enter key remains, since the enter button just sends an enter key event.</li>
+<li>When in fullscreen mode, an IME may also put an additional action button to
+the right of the text being edited, giving the user quick access to a common
+application operation.</li>
+</ul>
+
+<p>These options are controlled with the <code>android:imeOptions</code>
+attribute on <code>TextView</code>. The value you supply here can be any
+combination of:</p>
+
+<ul>
+<li>One of the pre-defined action constants (<code>actionGo</code>,
+<code>actionSearch</code>, <code>actionSend</code>, <code>actionNext</code>,
+<code>actionDone</code>). If none of these are specified, the system will infer
+either <code>actionNext</code> or <code>actionDone</code> depending on whether
+there is a focusable field after this one; you can explicitly force no action
+with <code>actionNone</code>.</li>
+<li>The <code>flagNoEnterAction</code> option tells the IME that the action
+should <em>not</em> be available on the enter key, even if the text itself is
+not multi-line. This avoids having unrecoverable actions like (send) that can be
+accidentally touched by the user while typing.</li>
+<li>The <code>flagNoAccessoryAction</code> removes the action button from the
+text area, leaving more room for text.</li><li>The <code>flagNoExtractUi</code>
+completely removes the text area, allowing the application to be seen behind
+it.</li>
+</ul>
+
+<p>The previous IM application message view also provides an example of an
+interesting use of <code>imeOptions</code>, to specify the send action but not
+let it be shown on the enter key:</p>
+
+<pre>android:imeOptions="actionSend|flagNoEnterAction"</pre>
+
+<h3>APIs for controlling IMEs</h3>
+
+<p>For more advanced control over the IME, there are a variety of new APIs you
+can use. Unless special care is taken (such as by using reflection), using these
+APIs will cause your application to be incompatible with previous versions of
+Android, and you should make sure you specify
+<code>android:minSdkVersion="3"</code> in your manifest. For more information,
+see the documentation for the <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a
+> manifest element.</p>
+
+<p>The primary API is the new <code>android.view.inputmethod.InputMethodManager</code> class, which you can retrieve with <code>Context.getSystemService()</code>.
+It allows you to interact with the global input method state, such as
+explicitly hiding or showing the current IME's input area.</p>
+
+<p>There are also new window flags controlling input method interaction, which you can control through the existing <code>Window.addFlags()</code> method and new <code>Window.setSoftInputMode()</code> method. The <code>PopupWindow</code>
+class has grown corresponding methods to control these options on its
+window. One thing in particular to be aware of is the new <code>WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM</code> constant, which is used to control whether a window is on top of or behind the current IME.</p>
+
+<p>Most of the interaction between an active IME and application is done through the <code>android.view.inputmethod.InputConnection</code>
+class. This is the API an application implement, which an IME calls to
+perform the appropriate edit operations on the application. You won't
+normally need to worry about this, since <code>TextView</code> provides its own implementation for itself.</p>
+
+<p>There are also a handful of new <code>View</code> APIs, the most important of these being<code> onCreateInputConnection()</code> which creates a new <code>InputConnection</code> for an IME (and fills in an <code>android.view.inputmethod.EditorInfo</code>
+structure with your input type, IME options, and other data); again,
+most developers won't need to worry about this, since TextView takes
+care of it for you.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/painless-threading.jd b/docs/html/resources/articles/painless-threading.jd
new file mode 100644
index 0000000..921f4df
--- /dev/null
+++ b/docs/html/resources/articles/painless-threading.jd
@@ -0,0 +1,147 @@
+page.title=Painless Threading
+@jd:body
+
+<p>This article discusses the threading model used by Android applications and how applications can ensure best UI performance by spawning worker threads to handle long-running operations, rather than handling them in the main thread. The article also explains the API that your application can use to interact with Android UI toolkit components running on the main thread and spawn managed worker threads. </p>
+
+<h3>The UI thread</h3>
+
+<p>When an application is launched, the system creates a thread called
+"main" for the application. The main thread, also called the <em>UI
+thread</em>, is very important because it is in charge of dispatching the
+events to the appropriate widgets, including drawing events.
+It is also the thread where your application interacts with running
+components of the Android UI toolkit. </p>
+
+<p>For instance, if you touch the a button on screen, the UI thread dispatches
+the touch event to the widget, which in turn sets its pressed state and
+posts an invalidate request to the event queue. The UI thread dequeues
+the request and notifies the widget to redraw itself.</p>
+
+<p>This single-thread model can yield poor performance unless your application
+is implemented properly. Specifically, if everything is happening in a single
+thread, performing long operations such as network access or database
+queries on the UI thread will block the whole user interface. No event
+can be dispatched, including drawing events, while the long operation
+is underway. From the user's perspective, the application appears hung.
+Even worse, if the UI thread is blocked for more than a few seconds
+(about 5 seconds currently) the user is presented with the infamous "<a href="http://developer.android.com/guide/practices/design/responsiveness.html">application not responding</a>" (ANR) dialog.</p>
+
+<p>If you want to see how bad this can look, write a simple application
+with a button that invokes <code>Thread.sleep(2000)</code> in its
+<a href="http://developer.android.com/reference/android/view/View.OnClickListener.html">OnClickListener</a>.
+The button will remain in its pressed state for about 2 seconds before
+going back to its normal state. When this happens, it is very easy for
+the user to <em>perceive</em> the application as slow.</p>
+
+<p>To summarize, it's vital to the responsiveness of your application's UI to
+keep the UI thread unblocked. If you have long operations to perform, you should
+make sure to do them in extra threads (<em>background</em> or <em>worker</em>
+threads). </p>
+
+<p>Here's an example of a click listener downloading an image over the
+network and displaying it in an <a href="http://developer.android.com/reference/android/widget/ImageView.html">ImageView</a>:</p>
+
+<pre class="prettyprint">public void onClick(View v) {
+ new Thread(new Runnable() {
+ public void run() {
+ Bitmap b = loadImageFromNetwork();
+ mImageView.setImageBitmap(b);
+ }
+ }).start();
+}</pre>
+
+<p>At first, this code seems to be a good solution to your problem, as it does
+not block the UI thread. Unfortunately, it violates the single-threaded model
+for the UI: the Android UI toolkit is <em>not thread-safe</em> and must always
+be manipulated on the UI thread. In this piece of code above, the
+<code>ImageView</code> is manipulated on a worker thread, which can cause really
+weird problems. Tracking down and fixing such bugs can be difficult and
+time-consuming.</p>
+
+<p>Android offers several ways to access the UI
+thread from other threads. You may already be familiar with some of
+them but here is a comprehensive list:</p>
+
+<ul>
+<li>{@link android.app.Activity#runOnUiThread(java.lang.Runnable) Activity.runOnUiThread(Runnable)}</li>
+<li>{@link android.view.View#post(java.lang.Runnable) View.post(Runnable)}</li>
+<li>{@link android.view.View#postDelayed(java.lang.Runnable, long) View.postDelayed(Runnable, long)}</li>
+<li>{@link android.os.Handler}</li>
+</ul>
+
+<p>You can use any of these classes and methods to correct the previous code example:</p>
+
+<pre class="prettyprint">public void onClick(View v) {
+ new Thread(new Runnable() {
+ public void run() {
+ final Bitmap b = loadImageFromNetwork();
+ mImageView.post(new Runnable() {
+ public void run() {
+ mImageView.setImageBitmap(b);
+ }
+ });
+ }
+ }).start();
+}</pre>
+
+<p>Unfortunately,
+these classes and methods could also tend to make your code more complicated
+and more difficult to read. It becomes even worse when your implement
+complex operations that require frequent UI updates. </p>
+
+<p>To remedy this problem, Android 1.5 and later platforms offer a utility class
+called {@link android.os.AsyncTask}, that simplifies the creation of
+long-running tasks that need to communicate with the user interface.</p>
+
+<p>An <code>AsyncTask</code> equivalent is also available for applications that
+will run on Android 1.0 and 1.1. The name of the class is <a
+href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/
+curiouscreature/android/shelves/util/UserTask.java">UserTask</a>. It offers the
+exact same API and all you have to do is copy its source code in your
+application.</p>
+
+<p>The goal of <code>AsyncTask</code> is to take care of thread management for
+you. Our previous example can easily be rewritten with
+<code>AsyncTask</code>:</p>
+
+<pre class="prettyprint">public void onClick(View v) {
+ new DownloadImageTask().execute("http://example.com/image.png");
+}
+
+private class DownloadImageTask extends AsyncTask<string, void,="" bitmap=""> {
+ protected Bitmap doInBackground(String... urls) {
+ return loadImageFromNetwork(urls[0]);
+ }
+
+ protected void onPostExecute(Bitmap result) {
+ mImageView.setImageBitmap(result);
+ }
+ }</pre>
+
+<p>As you can see, <code>AsyncTask</code> <em>must</em> be used by subclassing
+it. It is also very important to remember that an <code>AsyncTask</code>
+instance has to be created on the UI thread and can be executed only once. You
+can read the <a
+href="http://developer.android.com/reference/android/os/AsyncTask.html">
+AsyncTask documentation</a> for a full understanding on how to use this class,
+but here is a quick overview of how it works:</p>
+
+<ul>
+<li>You can specify the type, using generics, of the parameters, the progress values and the final value of the task</li>
+<li>The method <a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground%28Params...%29">doInBackground()</a> executes automatically on a worker thread</li>
+<li><a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPreExecute%28%29">onPreExecute()</a>, <a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute%28Result%29">onPostExecute()</a> and <a href="http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29">onProgressUpdate()</a> are all invoked on the UI thread</li>
+<li>The value returned by <a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground%28Params...%29">doInBackground()</a> is sent to <a href="http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute%28Result%29">onPostExecute()</a></li>
+<li>You can call <a href="http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress%28Progress...%29">publishProgress()</a> at anytime in <a href="http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground%28Params...%29">doInBackground()</a> to execute <a href="http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29">onProgressUpdate()</a> on the UI thread</li><li>You can cancel the task at any time, from any thread</li>
+</ul>
+
+<p>In addition to the official documentation, you can read several complex examples in the source code of Shelves (<a href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/activity/ShelvesActivity.java">ShelvesActivity.java</a> and <a href="http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/activity/AddBookActivity.java">AddBookActivity.java</a>) and Photostream (<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/LoginActivity.java">LoginActivity.java</a>, <a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/PhotostreamActivity.java">PhotostreamActivity.java</a> and <a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/ViewPhotoActivity.java">ViewPhotoActivity.java</a>). We highly recommend reading the source code of <a href="http://code.google.com/p/shelves/">Shelves</a> to see how to persist tasks across configuration changes and how to cancel them properly when the activity is destroyed.</p>
+
+<p>Regardless of whether or not you use <a href="http://developer.android.com/reference/android/os/AsyncTask.html">AsyncTask</a>,
+always remember these two rules about the single thread model: </p>
+
+<ol>
+<li>Do not block the UI thread, and
+<li>Make sure that you access the Android UI toolkit <em>only</em> on the UI thread.
+</ol>
+
+<p><code>AsyncTask</code> just makes it easier to do both of these things.</p>
diff --git a/docs/html/resources/articles/qsb.jd b/docs/html/resources/articles/qsb.jd
new file mode 100644
index 0000000..e497f50
--- /dev/null
+++ b/docs/html/resources/articles/qsb.jd
@@ -0,0 +1,151 @@
+page.title=Quick Search Box
+@jd:body
+
+<img src="images/qsb_002.png" style="float: right; margin-left: 2em; margin-bottom: 1em; width: 233px; height: 349.5px;"></p>
+
+<p>Starting with Android 1.6, the platform includes support for Quick Search
+Box (QSB), a powerful, system-wide search framework. Quick Search Box makes it
+possible for users to quickly and easily find what they're looking for, both on
+their devices and on the web. It suggests content on your device as you type,
+like apps, contacts, browser history, and music. It also offers results from the
+web search suggestions, local business listings, and other info from
+Google, such as stock quotes, weather, and flight status. All of this is
+available right from the home screen, by tapping on Quick Search Box.</p>
+
+<p>What
+we're most excited about with this new feature is the ability for you,
+the developers, to leverage the QSB framework to provide quicker and
+easier access to the content inside your apps. Your apps can provide
+search suggestions that will surface to users in QSB alongside other
+search results and suggestions. This makes it possible for users to
+access your application's content from outside your application—for
+example, from the home screen.</p>
+
+<p class="note"><strong>Note:</strong> The code fragments in this document are
+related to a sample app called <a
+href="{@docRoot}resources/samples/SearchableDictionary/index.html"
+title="Searchable Dictionary">Searchable Dictionary</a>. The app is
+available for Android 1.6 and later platforms.</p>
+
+<h3>The story before now: searching within your app</h3>
+
+<p>Platform releases versions previous to Android 1.6 already provided a mechanism
+that let you expose search and search suggestions in your app, as described in
+the docs for {@link android.app.SearchManager}. That mechanism has not changed
+and requires the following two things in your
+<code>AndroidManifest.xml</code>:</p>
+
+<p>1) In your <code><activity></code>, an intent filter, and a reference
+to a <code>searchable.xml</code> file (described below):</p>
+
+<pre class="prettyprint"><intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+</intent-filter>
+
+<meta-data android:name="android.app.searchable"
+ android:resource="@xml/searchable" /></pre>
+
+<p>2) A content provider that can provide search suggestions according to the
+URIs and column formats specified by the
+<a href="{@docRoot}reference/android/app/SearchManager.html#Suggestions">Search Suggestions</a>
+section of the SearchManager docs:</p>
+
+<pre class="prettyprint"><!-- Provides search suggestions for words and their definitions. -->
+<provider android:name="DictionaryProvider"
+ android:authorities="dictionary"
+ android:syncable="false" /></pre>
+
+<p>In the <code>searchable.xml</code> file, you specify a few things about how
+you want the search system to present search for your app, including the
+authority of the content provider that provides suggestions for the user as they
+type. Here's an example of the <code>searchable.xml</code> of an Android app
+that provides search suggestions within its own activities:</p>
+
+<pre class="prettyprint"><searchable xmlns:android="http://schemas.android.com/apk/res/android"
+ android:label="@string/search_label"
+ android:searchSuggestAuthority="dictionary"
+ android:searchSuggestIntentAction="android.intent.action.VIEW">
+</searchable></pre>
+
+<p>Note that the <code>android:searchSuggestAuthority</code> attribute refers to
+the authority of the content provider we declared in
+<code>AndroidManifest.xml</code>.</p>
+
+<p>For more details on this, see the
+<a href="{@docRoot}reference/android/app/SearchManager.html#SearchabilityMetadata">Searchability Metadata
+section</a> of the of the SearchManager docs.</p>
+
+<h3>Including your app in Quick Search Box</h3>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h2>Searchable Dictionary Sample App</h2>
+<p>Quick Search Box provides a really cool way to make it easier and faster for
+users to access your app's content. To help you get your app started with it,
+we've created a sample app that simply provides access to a small dictionary of
+words in QSB. The app is called Searchable Dictionary, and we encourage you to
+<a href="{@docRoot}resources/samples/SearchableDictionary/index.html">check it
+out</a>.</p>
+</div>
+</div>
+
+<p>In Android 1.6, we added a new attribute to the metadata for searchables:
+<code>android:includeInGlobalSearch</code>. By specifying this as
+<code>"true"</code> in your <code>searchable.xml</code>, you allow QSB to pick
+up your search suggestion content provider and include its suggestions along
+with the rest (if the user enables your suggestions from the system search
+settings).</p>
+
+<p>You should also specify a string value for
+<code>android:searchSettingsDescription</code>, which describes to users what
+sorts of suggestions your app provides in the system settings for search.</p>
+
+<pre class="prettyprint"><searchable xmlns:android="http://schemas.android.com/apk/res/android"
+ android:label="@string/search_label"
+ <span style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">android:searchSettingsDescription="@string/settings_description"</span>
+ <span style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">android:includeInGlobalSearch="true"</span>
+ android:searchSuggestAuthority="dictionary"
+ android:searchSuggestIntentAction="android.intent.action.VIEW">
+</searchable></pre>
+
+<p>These new attributes are supported only in Android 1.6 and later.</p>
+
+<h3>What to expect</h3>
+
+<p>The
+first and most important thing to note is that when a user installs an
+app with a suggestion provider that participates in QSB, this new app
+will <em>not</em> be enabled for QSB by default. The user can choose
+to enable particular suggestion sources from the system settings for
+search (by going to "Search" > "Searchable items" in settings).</p>
+
+<p>You
+should consider how to handle this in your app. Perhaps show a notice
+that instructs the user to visit system settings and enable your app's
+suggestions.</p>
+
+<p>Once the user enables your searchable item, the
+app's suggestions will have a chance to show up in QSB, most likely
+under the "more results" section to begin with. As your app's
+suggestions are chosen more frequently, they can move up in the list.</p>
+
+<img src="images/qsb.png" style="width: 233px; height: 349.5px;">
+<img id="k0vw" src="images/qsb_003.png" style="width: 233px; height: 349.5px;">
+
+<h3>Shortcuts</h3>
+
+<p>One
+of our objectives with QSB is to make it faster for users to access the
+things they access most often. One way we've done this is by
+'shortcutting' some of the previously chosen search suggestions, so
+they will be shown immediately as the user starts typing, instead of
+waiting to query the content providers. Suggestions from your app may
+be chosen as shortcuts when the user clicks on them.</p>
+
+<p>For dynamic suggestions that may wish to change their content (or become invalid)
+in the future, you can provide a 'shortcut id'. This tells QSB to query
+your suggestion provider for up-to-date content for a suggestion after
+it has been displayed. For more details on how to manage shortcuts, see
+the Shortcuts section
+<a href="{@docRoot}reference/android/app/SearchManager.html#ExposingSearchSuggestionsToQuickSearchBox">within the SearchManager docs</a>.</p>
diff --git a/docs/html/resources/articles/timed-ui-updates.jd b/docs/html/resources/articles/timed-ui-updates.jd
new file mode 100644
index 0000000..863387c
--- /dev/null
+++ b/docs/html/resources/articles/timed-ui-updates.jd
@@ -0,0 +1,149 @@
+page.title=Updating the UI from a Timer
+@jd:body
+
+<img style="margin: 1.5em; float: right;" src="images/JFlubber.png" alt="" id="BLOGGER_PHOTO_ID_5135098660116808706" border="0">
+
+<p><strong>Background</strong>: While developing my first useful
+(though small) application for Android, which was a port of an existing
+utility I use when podcasting, I needed a way of updating a clock
+displayed on the UI at regular intervals, but in a lightweight and CPU
+efficient way.</p>
+
+<p><strong>Problem</strong>: In the original application I used
+java.util.Timer to update the clock, but that class is not such a good
+choice on Android. Using a Timer introduces a new thread into the
+application for a relatively minor reason. Thinking in terms of mobile
+applications often means re-considering choices that you might make
+differently for a desktop application with relatively richer resources
+at its disposal. We would like to find a more efficient way of updating
+that clock.</p>
+
+<p><strong>The Application</strong>: The original application is a
+Java Swing and SE application. It is like a stopwatch with a lap timer
+that we use when recording podcasts; when you start the recording, you
+start the stopwatch. Then for every mistake that someone makes, you hit
+the flub button. At the end you can save out the bookmarked mistakes
+which can be loaded into the wonderful
+<a href="http://audacity.sourceforge.net/" title="Audacity">Audacity</a>
+audio editor as a labels track. You can then see where all of the mistakes
+are in the recording and edit them out.</p>
+
+<p>The article describing it is: <a href="http://www.developer.com/java/ent/print.php/3589961" title="http://www.developer.com/java/ent/print.php/3589961">http://www.developer.com/java/ent/print.php/3589961</a></p>
+
+<p>In the original version, the timer code looked like this:</p>
+
+<pre>class UpdateTimeTask extends TimerTask {
+ public void run() {
+ long millis = System.currentTimeMillis() - startTime;
+ int seconds = (int) (millis / 1000);
+ int minutes = seconds / 60;
+ seconds = seconds % 60;
+
+ timeLabel.setText(String.format("%d:%02d", minutes, seconds));
+ }
+}</pre><p>And in the event listener to start this update, the following Timer() instance is used:
+</p><pre>if(startTime == 0L) {
+ startTime = evt.getWhen();
+ timer = new Timer();
+ timer.schedule(new UpdateTimeTask(), 100, 200);
+}</pre>
+
+<p>In particular, note the 100, 200 parameters. The first parameter
+means wait 100 ms before running the clock update task the first time.
+The second means repeat every 200ms after that, until stopped. 200 ms
+should not be too noticeable if the second resolution happens to fall
+close to or on the update. If the resolution was a second, you could
+find the clock sometimes not updating for close to 2 seconds, or
+possibly skipping a second in the counting, it would look odd).</p>
+
+<p>When I ported the application to use the Android SDKs, this code
+actually compiled in Eclipse, but failed with a runtime error because
+the Timer() class was not available at runtime (fortunately, this was
+easy to figure out from the error messages). On a related note, the
+String.format method was also not available, so the eventual solution
+uses a quick hack to format the seconds nicely as you will see.</p>
+
+<p>Fortunately, the role of Timer can be replaced by the
+android.os.Handler class, with a few tweaks. To set it up from an event
+listener:</p>
+
+<pre>private Handler mHandler = new Handler();
+
+...
+
+OnClickListener mStartListener = new OnClickListener() {
+ public void onClick(View v) {
+ if (mStartTime == 0L) {
+ mStartTime = System.currentTimeMillis();
+ mHandler.removeCallbacks(mUpdateTimeTask);
+ mHandler.postDelayed(mUpdateTimeTask, 100);
+ }
+ }
+};</pre>
+
+<p>A couple of things to take note of here. First, the event doesn't
+have a .getWhen() method on it, which we handily used to set the start
+time for the timer. Instead, we grab the System.currentTimeMillis().
+Also, the Handler.postDelayed() method only takes one time parameter,
+it doesn't have a "repeating" field. In this case we are saying to the
+Handler "call mUpdateTimeTask() after 100ms", a sort of fire and forget
+one time shot. We also remove any existing callbacks to the handler
+before adding the new handler, to make absolutely sure we don't get
+more callback events than we want.</p>
+
+<p>But we want it to repeat, until we tell it to stop. To do this, just
+put another postDelayed at the tail of the mUpdateTimeTask run()
+method. Note also that Handler requires an implementation of Runnable,
+so we change mUpdateTimeTask to implement that rather than extending
+TimerTask. The new clock updater, with all these changes, looks like
+this:</p>
+
+<pre>private Runnable mUpdateTimeTask = new Runnable() {
+ public void run() {
+ final long start = mStartTime;
+ long millis = SystemClock.uptimeMillis() - start;
+ int seconds = (int) (millis / 1000);
+ int minutes = seconds / 60;
+ seconds = seconds % 60;
+
+ if (seconds < 10) {
+ mTimeLabel.setText("" + minutes + ":0" + seconds);
+ } else {
+ mTimeLabel.setText("" + minutes + ":" + seconds);
+ }
+
+ mHandler.postAtTime(this,
+ start + (((minutes * 60) + seconds + 1) * 1000));
+ }
+};</pre>
+
+<p>and can be defined as a class member field.</p>
+
+<p>The if statement is just a way to make sure the label is set to
+10:06 instead of 10:6 when the seconds modulo 60 are less than 10
+(hopefully String.format() will eventually be available). At the end of
+the clock update, the task sets up another call to itself from the
+Handler, but instead of a hand-wavy 200ms before the update, we can
+schedule it to happen at a particular wall-clock time — the line: start
++ (((minutes * 60) + seconds + 1) * 1000) does this.</p>
+
+<p>All we need now is a way to stop the timer when the stop button
+is pressed. Another button listener defined like this:</p>
+
+<pre>OnClickListener mStopListener = new OnClickListener() {
+ public void onClick(View v) {
+ mHandler.removeCallbacks(mUpdateTimeTask);
+ }
+};</pre>
+
+<p>will make sure that the next callback is removed when the stop button
+is pressed, thus interrupting the tail iteration.</p>
+
+<p>Handler is actually a better choice than Timer for another reason
+too. The Handler runs the update code as a part of your main thread,
+avoiding the overhead of a second thread and also making for easy
+access to the View hierarchy used for the user interface. Just remember
+to keep such tasks small and light to avoid slowing down the user
+experience.</p>
+
+
diff --git a/docs/html/resources/articles/touch-mode.jd b/docs/html/resources/articles/touch-mode.jd
new file mode 100644
index 0000000..e340062
--- /dev/null
+++ b/docs/html/resources/articles/touch-mode.jd
@@ -0,0 +1,138 @@
+page.title=Touch Mode
+@jd:body
+
+<p>This article explains the <em>touch mode</em>, one of the most
+important principles of Android's UI toolkit.</p>
+
+<p>The touch mode is a state of the view hierarchy that depends solely on the
+user interaction with the phone. By itself, the touch mode is something very
+easy to understand as it simply indicates whether the last user interaction was
+performed with the touch screen. For example, if you are using an
+Android-powered device, selecting a widget with the trackball will take you out
+of touch mode; however, if you touch a button on the screen with your finger,
+you will enter touch mode. When the user is not in touch mode, we talk about the
+trackball mode, navigation mode or keyboard navigation, so do not be surprised
+if you encounter these terms. </p>
+
+<p>There is only one API directly related to touch mode,
+{@link android.view.View#isInTouchMode() View.isInTouchMode()}.</p>
+
+<p>Sounds easy enough, right? Oddly enough, touch mode is deceivingly simple and
+the consequences of entering touch mode are far greater than you might
+think. Let's look at some of the reasons why.</p>
+
+<h4>Touch Mode, Selection, and Focus</h4>
+
+<p>Designing a UI toolkit for mobile devices is difficult because of the various
+interaction mechanisms they provide. Some devices offer only 12 keys, some have
+a touch screen, some require a stylus, some have both a touch screen and a
+keyboard. Based on the hardware capabilities of the he user can interact with
+your application using different mechanisms, so we had to think very hard about
+all the possible issues that could arise. One issue led us to create the touch
+mode.</p>
+
+<p>Imagine a simple application, <a href="{@docRoot}resources/samples/index.html">ApiDemos</a>
+for example, that shows a list of text items. The user can freely
+navigate through the list using the trackball but also, alternatively, scroll
+and fling the list using the touch screen. The issue in this scenario is
+how to handle the selection properly when the user manipulates the list
+through the touch screen. </p>
+
+<p>In this case, if the user selects an item at the top of the list and then
+flings the list towards the bottom, what should happen to the selection? Should
+it remain on the item and scroll off the screen? What should happen if the user
+then decided to move the selection with the trackball? Or worse, what should
+happen if the user presses the trackball to act upon the currently selected
+item, which is not shown on screen anymore? </p>
+
+<p>After careful consideration, we decided to remove the selection altogether,
+when the user manipulates the UI through the touch screen.</p>
+
+<p>In touch mode, there is no focus and no selection. Any selected item in a
+list of in a grid becomes unselected as soon as the user enters touch
+mode. Similarly, any focused widgets become unfocused when the user
+enters touch mode. The image below illustrates what happens when the
+user touches a list after selecting an item with the trackball.</p>
+
+<img style="margin: 0px 7px;" src="images/list02.png" alt="" id="BLOGGER_PHOTO_ID_5272753165743060962" border="0">
+<img style="margin: 0px 7px;" src="images/list01.png" alt="" id="BLOGGER_PHOTO_ID_5272753357441963442" border="0">
+
+<p>To
+make things more natural for the user, the framework knows how to
+resurrect the selection/focus whenever the user leaves touch mode. For
+instance, in the example above, if the user were to use the trackball
+again, the selection would reappear on the previously-selected item.
+This is why some developers are confused when they create a custom view
+and start receiving key events only after moving the trackball once:
+their application is in touch mode, and they need to use the trackball
+to exit touch mode and resurrect the focus.</p>
+
+<p>The relationship between touch mode, selection, and focus means you must not
+rely on selection and/or focus to exist in your application. A very common
+problem with new Android developers is to rely on
+{@link android.widget.AdapterView#getSelectedItemPosition() ListView.getSelectedItemPosition()}.
+In touch mode, this method will return
+{@link android.widget.AdapterView#INVALID_POSITION INVALID_POSITION}.
+ You should instead use click listeners (see
+{@link android.widget.AdapterView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)})
+or the choice mode (see
+{@link android.widget.ListView#setChoiceMode(int)}).</p>
+
+<h4>Focusable in Touch Mode</h4>
+
+<p>In general, focus doesn't exist in touch mode. However, focus can exist in
+touch mode in a very special way called <em>focusable</em>. This special mode
+was created for widgets that receive text input, such as
+{@link android.widget.EditText} or, when filtering is enabled,
+{@link android.widget.ListView}. The focusable mode is what lets the user enter text
+inside a text field on the screen, without first selecting it with the trackball
+or their finger.</p>
+
+<p>When a user
+touches the screen, the application will enter touch mode if it wasn't
+in touch mode already. What happens during the transition to
+touch mode depends on what the user touched, and what currently has
+focus. If the user touches a widget that is focusable in touch
+mode, that widget will receive focus. Otherwise, any currently
+focused widget will not retain focus unless it is focusable in touch
+mode. For instance, in the picture below, when the user touches
+the screen, the input text field receives the focus.</p>
+
+<img style="margin: 0px 7px;" src="images/text_field.png" alt="" id="BLOGGER_PHOTO_ID_5272755475757779154" border="0">
+
+<p>Fousable in touch mode (see
+{@link android.view.View#setFocusableInTouchMode(boolean) View.setFocusableInTouchMode})
+ is a property that you can set yourself, either from code or from XML.
+However, you should use it sparingly and only in very specific situations,
+because it breaks consistency with the normal behavior of the Android UI. A game
+is a good example of an application that could make good use of the focusable in
+touch mode property. MapView, if used in fullscreen as in Google Maps, is
+another good example of where you can use focusable in touch mode correctly.</p>
+
+<p>Below is another example of a focusable in touch mode widget. When the user
+taps an <code>AutoCompleteTextView</code> suggestion with his finger, the focus
+remains on the input text field:</p>
+
+<img style="margin: 0px 7px;" src="images/search01.png" alt="" id="BLOGGER_PHOTO_ID_5272756689821626962" border="0">
+<img style="margin: 0px 7px;" src="images/search02.png" alt="" id="BLOGGER_PHOTO_ID_5272756246104676754" border="0">
+
+<p>Developers new to Android often think that focusable in touch mode is the
+solution they need to "fix" the problem of "disappearing" selection/focus. We
+really encourage you to think very hard before using it. If used incorrectly, it
+can make your application behave differently from the rest of the system and
+simply throw off the user's habits. The Android framework contains all the tools
+you need to handle user interactions without using focusable in touch mode. For
+example, instead of trying to make <code>ListView</code> always keep its
+selection, simply use the appropriate choice mode, as shown in
+{@link android.widget.ListView#setChoiceMode(int)}.
+
+<h4>Touch Mode Cheat Sheet</h4>
+
+<p>Do:</p>
+<ul>
+<li>Remain consistent with the core applications</li><li>Use the appropriate feature if you need persistent selection (radio button, check box, the <code>ListView</code> choice mode, etc.)</li>
+<li>Use focusable in touch mode if you write a game</li>
+</ul>
+
+<p>Don't:</p>
+<ul><li>Do not try to keep the focus or selection in touch mode</li></ul>
diff --git a/docs/html/resources/articles/track-mem.jd b/docs/html/resources/articles/track-mem.jd
new file mode 100644
index 0000000..d580e82
--- /dev/null
+++ b/docs/html/resources/articles/track-mem.jd
@@ -0,0 +1,62 @@
+page.title=Tracking Memory Allocations
+@jd:body
+
+<p>Writing efficient mobile applications is not always straightforward. In
+particular, Android applications rely on automatic memory management handled by
+Dalvik's garbage collector, which can sometimes cause performance issues if you
+are not careful with memory allocations.</p>
+
+<p>In a performance-sensitive code path, such as the layout or drawing method of
+a view or the logic code of a game, any allocation comes at a price. After too
+many allocations, the garbage collector will kick in and stop your application
+to let it free some memory. Most of the time, garbage collections happen fast
+enough for you not to notice. However, if a collection happens while you are
+scrolling through a list of items or while you are trying to defeat a foe in a
+game, you may suddenly see a drop in performance/responsiveness of the
+application. It's not unusual for a garbage collection to take 100 to 200 ms.
+For comparison, a smooth animation needs to draw each frame in 16 to 33 ms. If
+the animation is suddenly interrupted for 10 frames, you can be certain that
+your users will notice.</p>
+
+<p>Most of the time, garbage collection occurs because of tons of small,
+short-lived objects and some garbage collectors, like generational garbage
+collectors, can optimize the collection of these objects so that the application
+does not get interrupted too often. The Android garbage collector is
+unfortunately not able to perform such optimizations and the creation of
+short-lived objects in performance critical code paths is thus very costly for
+your application.</p>
+
+<p>To help you avoid frequent garbage collections, the Android SDK ships with a
+very useful tool called <em>allocation tracker</em>. This tool is part of DDMS,
+which you must have already used for debugging purposes. To start using the
+allocation tracker, you must first launch the standalone version of DDMS, which
+can be found in the <code>tools/</code> directory of the SDK. The version of
+DDMS included in the Eclipse plugin does not offer you ability to use the
+allocation tracker yet.</p>
+
+<p>Once DDMS is running, simply select your application process and then click
+the <em>Allocation Tracker</em> tab. In the new view, click <em>Start
+Tracking</em> and then use your application to make it execute the code paths
+you want to analyze. When you are ready, click <em>Get Allocations</em>. A list
+of allocated objects will be shown in the first table. By clicking on a line you
+can see, in the second table, the stack trace that led to the allocation. Not
+only you will know what type of object was allocated, but also in which thread,
+in which class, in which file and at which line. The following screenshot shows
+the allocations performed by <a
+href="http://code.google.com/p/shelves">Shelves</a> while scrolling a
+ListView.</p>
+
+<a href="images/ddms_allocation_trackerl.png">
+
+<img style="cursor:hand;width: 320px; height: 250px;" src="images/ddms_allocation_tracker.png" border="0" alt="" />
+</a>
+
+<p>Even though it is not necessary — and sometimes not possible — to
+remove all allocations for your performance critical code paths. the allocation
+tracker will help you identify important issues in your code. For instance, a
+common mistake I have seen in many applications is to create a new
+<code>Paint</code> object on every draw. Moving the paint into an instance field
+is a simple fix that helps performance a lot. I highly encourage you to peruse
+the <a href="http://source.android.com/">Android source code</a> to see how we
+reduce allocations in performance-critical code paths. You will also thus
+discover the APIs Android provide to help you reuse objects.</p>
diff --git a/docs/html/resources/articles/tts.jd b/docs/html/resources/articles/tts.jd
new file mode 100644
index 0000000..e3fad91
--- /dev/null
+++ b/docs/html/resources/articles/tts.jd
@@ -0,0 +1,241 @@
+page.title=Using Text-to-Speech
+@jd:body
+
+<p>Starting with Android 1.6 (API Level 4), the Android platform includes a new
+Text-to-Speech (TTS) capability. Also known as "speech synthesis", TTS enables
+your Android device to "speak" text of different languages.</p>
+
+<p>Before we explain how to use the TTS API itself, let's first review a few
+aspects of the engine that will be important to your TTS-enabled application. We
+will then show how to make your Android application talk and how to configure
+the way it speaks.</p>
+
+<h3>Languages and resources</h3>
+
+<p>The TTS engine that ships with the Android platform supports a number of
+languages: English, French, German, Italian and Spanish. Also, depending on
+which side of the Atlantic you are on, American and British accents for English
+are both supported.</p>
+
+<p>The TTS engine needs to know which language to speak, as a word like "Paris",
+for example, is pronounced differently in French and English. So the voice and
+dictionary are language-specific resources that need to be loaded before the
+engine can start to speak.</p>
+
+<p>Although all Android-powered devices that support the TTS functionality ship
+with the engine, some devices have limited storage and may lack the
+language-specific resource files. If a user wants to install those resources,
+the TTS API enables an application to query the platform for the availability of
+language files and can initiate their download and installation. So upon
+creating your activity, a good first step is to check for the presence of the
+TTS resources with the corresponding intent:</p>
+
+<pre>Intent checkIntent = new Intent();
+checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
+startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);</pre>
+
+<p>A successful check will be marked by a <code>CHECK_VOICE_DATA_PASS</code>
+result code, indicating this device is ready to speak, after the creation of
+our
+{@link android.speech.tts.TextToSpeech} object. If not, we need to let the user
+know to install the data that's required for the device to become a
+multi-lingual talking machine! Downloading and installing the data is
+accomplished by firing off the ACTION_INSTALL_TTS_DATA intent, which will take
+the user to Android Market, and will let her/him initiate the download.
+Installation of the data will happen automatically once the download completes.
+Here is an example of what your implementation of
+<code>onActivityResult()</code> would look like:</p>
+
+<pre>private TextToSpeech mTts;
+protected void onActivityResult(
+ int requestCode, int resultCode, Intent data) {
+ if (requestCode == MY_DATA_CHECK_CODE) {
+ if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
+ // success, create the TTS instance
+ mTts = new TextToSpeech(this, this);
+ } else {
+ // missing data, install it
+ Intent installIntent = new Intent();
+ installIntent.setAction(
+ TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
+ startActivity(installIntent);
+ }
+ }
+}</pre>
+
+<p>In the constructor of the <code>TextToSpeech</code> instance we pass a
+reference to the <code>Context</code> to be used (here the current Activity),
+and to an <code>OnInitListener</code> (here our Activity as well). This listener
+enables our application to be notified when the Text-To-Speech engine is fully
+loaded, so we can start configuring it and using it.</p>
+
+<h4>Languages and Locale</h4>
+
+<p>At Google I/O 2009, we showed an <a title="Google I/O 2009, TTS
+demonstration" href="http://www.youtube.com/watch?v=uX9nt8Cpdqg#t=6m17s"
+id="rnfd">example of TTS</a> where it was used to speak the result of a
+translation from and to one of the 5 languages the Android TTS engine currently
+supports. Loading a language is as simple as calling for instance:</p>
+
+<pre>mTts.setLanguage(Locale.US);</pre><p>to load and set the language to
+English, as spoken in the country "US". A locale is the preferred way to specify
+a language because it accounts for the fact that the same language can vary from
+one country to another. To query whether a specific Locale is supported, you can
+use <code>isLanguageAvailable()</code>, which returns the level of support for
+the given Locale. For instance the calls:</p>
+
+<pre>mTts.isLanguageAvailable(Locale.UK))
+mTts.isLanguageAvailable(Locale.FRANCE))
+mTts.isLanguageAvailable(new Locale("spa", "ESP")))</pre>
+
+<p>will return TextToSpeech.LANG_COUNTRY_AVAILABLE to indicate that the language
+AND country as described by the Locale parameter are supported (and the data is
+correctly installed). But the calls:</p>
+
+<pre>mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
+mTts.isLanguageAvailable(new Locale("spa"))</pre>
+
+<p>will return <code>TextToSpeech.LANG_AVAILABLE</code>. In the first example,
+French is supported, but not the given country. And in the second, only the
+language was specified for the Locale, so that's what the match was made on.</p>
+
+<p>Also note that besides the <code>ACTION_CHECK_TTS_DATA</code> intent to check
+the availability of the TTS data, you can also use
+<code>isLanguageAvailable()</code> once you have created your
+<code>TextToSpeech</code> instance, which will return
+<code>TextToSpeech.LANG_MISSING_DATA</code> if the required resources are not
+installed for the queried language.</p>
+
+<p>Making the engine speak an Italian string while the engine is set to the
+French language will produce some pretty <i>interesting </i>results, but it will
+not exactly be something your user would understand So try to match the
+language of your application's content and the language that you loaded in your
+<code>TextToSpeech</code> instance. Also if you are using
+<code>Locale.getDefault()</code> to query the current Locale, make sure that at
+least the default language is supported.</p>
+
+<h3>Making your application speak</h3>
+
+<p>Now that our <code>TextToSpeech</code> instance is properly initialized and
+configured, we can start to make your application speak. The simplest way to do
+so is to use the <code>speak()</code> method. Let's iterate on the following
+example to make a talking alarm clock:</p>
+
+<pre>String myText1 = "Did you sleep well?";
+String myText2 = "I hope so, because it's time to wake up.";
+mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
+mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);</pre>
+
+<p>The TTS engine manages a global queue of all the entries to synthesize, which
+are also known as "utterances". Each <code>TextToSpeech</code> instance can
+manage its own queue in order to control which utterance will interrupt the
+current one and which one is simply queued. Here the first <code>speak()</code>
+request would interrupt whatever was currently being synthesized: the queue is
+flushed and the new utterance is queued, which places it at the head of the
+queue. The second utterance is queued and will be played after
+<code>myText1</code> has completed.</p>
+
+<h4>Using optional parameters to change the playback stream type</h4>
+
+<p>On Android, each audio stream that is played is associated with one stream
+type, as defined in
+{@link android.media.AudioManager android.media.AudioManager}. For a talking
+alarm clock, we would like our text to be played on the
+<code>AudioManager.STREAM_ALARM</code> stream type so that it respects the alarm
+settings the user has chosen on the device. The last parameter of the speak()
+method allows you to pass to the TTS engine optional parameters, specified as
+key/value pairs in a HashMap. Let's use that mechanism to change the stream type
+of our utterances:</p>
+
+<pre>HashMap<String, String> myHashAlarm = new HashMap();
+myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
+ String.valueOf(AudioManager.STREAM_ALARM));
+mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
+mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
+
+<h4>Using optional parameters for playback completion callbacks</h4>
+
+<p>Note that <code>speak()</code> calls are asynchronous, so they will return
+well before the text is done being synthesized and played by Android, regardless
+of the use of <code>QUEUE_FLUSH</code> or <code>QUEUE_ADD</code>. But you might
+need to know when a particular utterance is done playing. For instance you might
+want to start playing an annoying music after <code>myText2</code> has finished
+synthesizing (remember, we're trying to wake up the user). We will again use an
+optional parameter, this time to tag our utterance as one we want to identify.
+We also need to make sure our activity implements the
+<code>TextToSpeech.OnUtteranceCompletedListener</code> interface:</p>
+
+<pre>mTts.setOnUtteranceCompletedListener(this);
+myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
+ String.valueOf(AudioManager.STREAM_ALARM));
+mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
+myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
+ "end of wakeup message ID");
+// myHashAlarm now contains two optional parameters
+mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
+
+<p>And the Activity gets notified of the completion in the implementation
+of the listener:</p>
+
+<pre>public void onUtteranceCompleted(String uttId) {
+ if (uttId == "end of wakeup message ID") {
+ playAnnoyingMusic();
+ }
+}</pre>
+
+<h4>File rendering and playback</h4>
+
+<p>While the <code>speak()</code> method is used to make Android speak the text
+right away, there are cases where you would want the result of the synthesis to
+be recorded in an audio file instead. This would be the case if, for instance,
+there is text your application will speak often; you could avoid the synthesis
+CPU-overhead by rendering only once to a file, and then playing back that audio
+file whenever needed. Just like for <code>speak()</code>, you can use an
+optional utterance identifier to be notified on the completion of the synthesis
+to the file:</p>
+
+<pre>HashMap<String, String> myHashRender = new HashMap();
+String wakeUpText = "Are you up yet?";
+String destFileName = "/sdcard/myAppCache/wakeUp.wav";
+myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
+mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);</pre>
+
+<p>Once you are notified of the synthesis completion, you can play the output
+file just like any other audio resource with
+{@link android.media.MediaPlayer android.media.MediaPlayer}.</p>
+
+<p>But the <code>TextToSpeech</code> class offers other ways of associating
+audio resources with speech. So at this point we have a WAV file that contains
+the result of the synthesis of "Wake up" in the previously selected language. We
+can tell our TTS instance to associate the contents of the string "Wake up" with
+an audio resource, which can be accessed through its path, or through the
+package it's in, and its resource ID, using one of the two
+<code>addSpeech()</code> methods:</p>
+
+<pre>mTts.addSpeech(wakeUpText, destFileName);</pre>
+
+<p>This way any call to speak() for the same string content as
+<code>wakeUpText</code> will result in the playback of
+<code>destFileName</code>. If the file is missing, then speak will behave as if
+the audio file wasn't there, and will synthesize and play the given string. But
+you can also take advantage of that feature to provide an option to the user to
+customize how "Wake up" sounds, by recording their own version if they choose
+to. Regardless of where that audio file comes from, you can still use the same
+line in your Activity code to ask repeatedly "Are you up yet?":</p>
+
+<pre>mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
+
+<h4>When not in use...</h4><p>The text-to-speech functionality relies on a
+dedicated service shared across all applications that use that feature. When you
+are done using TTS, be a good citizen and tell it "you won't be needing its
+services anymore" by calling <code>mTts.shutdown()</code>, in your Activity
+<code>onDestroy()</code> method for instance.</p>
+
+<h3>Conclusion</h3>
+
+<p>Android now talks, and so can your apps. Remember that in order for
+synthesized speech to be intelligible, you need to match the language you select
+to that of the text to synthesize. Text-to-speech can help you push your app in
+new directions. Whether you use TTS to help users with disabilities, to enable
+the use of your application while looking away from the screen, or simply to
+make it cool, we hope you'll enjoy this new feature.</p>
\ No newline at end of file
diff --git a/docs/html/resources/articles/ui-1.5.jd b/docs/html/resources/articles/ui-1.5.jd
new file mode 100644
index 0000000..c10cf52
--- /dev/null
+++ b/docs/html/resources/articles/ui-1.5.jd
@@ -0,0 +1,48 @@
+page.title=UI Framework Changes in Android 1.5
+@jd:body
+
+
+<p>Android 1.5 offers a different default look for
+the Android UI framework, in relation to Android 1.0 and 1.1. The
+screenshots below show the same activity (creating a new contact) on
+Android 1.1 and Android 1.5:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 277px;" src="images/android.png" alt="" id="BLOGGER_PHOTO_ID_5323141124169754690" border="0">
+
+<p>You
+can see in this example that the buttons and checkboxes have a new
+appearance. Even though these changes do not affect binary nor source
+compatibility, they might still break the UI of your apps. As part of
+the UI refresh, the minimum size of some of the widgets has changed.
+For instance, Android 1.1 buttons have a minimum size of 44x48 pixels
+whereas Android 1.5 buttons now have a minimum size of 24x48 pixels.
+The image below compares the sizes of Android 1.1 buttons with Android
+1.5 buttons:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 130px;" src="images/buttons.png" alt="" border="0">
+
+<p>If you rely on the button's minimum size, then the layout of your application
+may not be the same in Android 1.5 as it was in Android 1.1 because of this
+change. This would happen for instance if you created a grid of buttons using
+<code>LinearLayout</code> and relying on the minimum size yielded by
+<code>wrap_content</code> to align the buttons properly:</p>
+
+<img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 277px;" src="images/grid.png" alt="" id="BLOGGER_PHOTO_ID_5323147943613255250" border="0">
+
+<p>This layout could easily be fixed by using the
+<code>android:layout_weight</code> attribute or by replacing the
+<code>LinearLayout</code> containers with a <code>TableLayout</code>.</p>
+
+<p>This example is probably the worst-case UI issue you may encounter when
+running your application on Android 1.5. Other changes introduced in Android
+1.5, especially bug fixes in the layout views, may also impact your
+application—especially if it is relying on faulty/buggy behavior of the UI
+framework.</p>
+
+<p>If you encounter issues when running your application on Android 1.5, please
+join us on the <a href="{@docRoot}resources/community-groups.html">Android
+developer groups</a> or <a
+href="{@docRoot}resources/community-more.html">IRC</a> so that we and the
+Android community can help you fix your application.</p>
+
+<p>Happy coding!</p>
diff --git a/docs/html/resources/articles/ui-1.6.jd b/docs/html/resources/articles/ui-1.6.jd
new file mode 100644
index 0000000..10cb524
--- /dev/null
+++ b/docs/html/resources/articles/ui-1.6.jd
@@ -0,0 +1,130 @@
+page.title=UI Framework Changes in Android 1.6
+@jd:body
+
+<p>Android 1.6 introduces numerous enhancements and bug fixes in the UI
+framework. This article highlights two improvements in particular: more flexible
+and robust RelativeLayout and easier click listeners. </p>
+
+<h3>More flexible, more robust RelativeLayout</h3>
+
+<p>RelativeLayout is the most versatile layout offered by the Android UI toolkit
+and can be successfully used to reduce the number of views created by your
+applications. This layout used to suffer from various bugs and limitations,
+sometimes making it difficult to use without having some knowledge of its
+implementation. To make your life easier, Android 1.6 comes with a revamped
+RelativeLayout. </p>
+
+<p>This new implementation not only fixes all known bugs in
+RelativeLayout but also addresses its major limitation: the
+fact that views had to be declared in a particular order. Consider the following
+XML layout:</p>
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+ android:padding="6dip">
+
+ <TextView
+ android:id="@+id/band"
+ android:layout_width="fill_parent"
+ android:layout_height="26dip"
+
+ android:layout_below="@+id/track"
+ android:layout_alignLeft="@id/track"
+ android:layout_alignParentBottom="true"
+
+ android:gravity="top"
+ android:text="The Airborne Toxic Event" />
+
+ <TextView
+ android:id="@id/track"
+ android:layout_marginLeft="6dip"
+ android:layout_width="fill_parent"
+ android:layout_height="26dip"
+
+ android:layout_toRightOf="@+id/artwork"
+
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="bottom"
+ android:text="Sometime Around Midnight" />
+
+ <ImageView
+ android:id="@id/artwork"
+ android:layout_width="56dip"
+ android:layout_height="56dip"
+ android:layout_gravity="center_vertical"
+
+ android:src="@drawable/artwork" />
+
+</RelativeLayout></pre>
+
+<p>This code builds a very simple layout—an image on the left with two lines of
+text stacked vertically. This XML layout is perfectly fine and contains no
+errors. Unfortunately, Android 1.5's RelativeLayout is incapable of rendering it
+correctly, as shown in the screenshot below.</p>
+
+<img src="images/ui-1.6_002.png" style="width: 320px; height: 480px;">
+
+<p>The problem is that this layout uses forward references. For instance, the
+"band" TextView is positioned below the "track" TextView but "track" is declared
+after "band" and, in Android 1.5, RelativeLayout does not know how to handle
+this case. Now look at the exact same layout running on Android 1.6:</p>
+
+<img src="images/ui-1.6.png" style="width: 320px; height: 480px;">
+
+<p>As you can see Android 1.6 is now better able to handle forward reference.
+The result on screen is exactly what you would expect when writing the
+layout.</p>
+
+<h3>Easier click listeners</h3>
+
+<p>Setting up a click listener on a button is very common task, but
+it requires quite a bit of boilerplate code:</p>
+
+<pre>findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ // Do stuff
+ }
+});</pre>
+
+<p>One way to reduce the amount of boilerplate is to share a single click
+listener between several buttons. While this technique reduces the
+number of classes, it still requires a fair amount of code and it still
+requires giving each button an id in your XML layout file:</p>
+
+<pre>View.OnClickListener handler = View.OnClickListener() {
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.myButton: // doStuff
+ break;
+ case R.id.myOtherButton: // doStuff
+ break;
+ }
+ }
+}
+
+findViewById(R.id.myButton).setOnClickListener(handler);
+findViewById(R.id.myOtherButton).setOnClickListener(handler);</pre>
+
+<p>With Android 1.6, none of this is necessary. All you have to do is
+declare a public method in your Activity to handle the click
+(the method <i>must</i> have one View argument):</p>
+
+<pre>class MyActivity extends Activity {
+ public void myClickHandler(View target) {
+ // Do stuff
+ }
+}</pre>
+
+<p>And then reference this method from your XML layout:</p>
+
+<pre><Button android:onClick="myClickHandler" /></pre>
+
+<p>This new feature reduces both the amount of Java and XML you have to write,
+leaving you more time to concentrate on your application.</p>
+
+<p>The Android team is committed to helping you write applications in the
+easiest and most efficient way possible. We hope you find these improvements
+useful and we're excited to see your applications on Android Market.</p>
diff --git a/docs/html/resources/articles/using-webviews.jd b/docs/html/resources/articles/using-webviews.jd
new file mode 100644
index 0000000..3a1f34c
--- /dev/null
+++ b/docs/html/resources/articles/using-webviews.jd
@@ -0,0 +1,61 @@
+page.title=Using WebViews
+@jd:body
+
+<p>A small application called <a title="WebViewDemo"
+href="http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/Samples
+/WebViewDemo">WebViewDemo</a> shows how you can add web content to your
+application. You can find it in the <a title="apps-for-android"
+href="http://code.google.com/p/apps-for-android/">apps-for-android</a> project.
+This application demonstrates how you can embed a {@link android.webkit.WebView}
+into an activity and also how you can have two way communication between your
+application and the web content. </p>
+
+<p>A
+WebView uses the same rendering and JavaScript engine as the browser,
+but it runs under the control of your application. The WebView can be
+full screen or you can mix it with other Views. The content for your
+WebView can come from anywhere. The WebView can download content from
+the web, or it can come from local files stored in your assets
+directory. The content can even be dynamically generated by your
+application code. For this example, the HTML comes from a local file
+called <a title="demo.html" href="http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html">demo.html</a>.</p>
+
+<p>This application does not do very much: when you click on the
+android, he raises his arm.</p>
+
+<div style="text-align: center;"><img style="width: 322px; height: 482px;" src="images/webview.png"></div>
+
+<p>This
+could, of course, easily be accomplished with a little bit of
+JavaScript. Instead, though, WebViewDemo takes a slightly more
+complicated path to illustrate two very powerful features of WebView.</p>
+
+<p>First,
+JavaScript running inside the WebView can call out to code in your
+Activity. You can use this to have your JavaScript trigger actions like
+starting a new activity, or it can be used to fetch data from a
+database or {@link android.content.ContentProvider}. The API for this
+is very simple: just call the
+{@link android.webkit.WebView#addJavascriptInterface(java.lang.Object, java.lang.String) addJavascriptInterface()}
+method on your WebView. You pass an object whose methods you want to
+expose to JavaScript and the name to use when making calls. You can see
+the exact syntax in <a title="WebViewDemo.java"
+href="http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/
+WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java">WebViewDemo.
+java</a>. Here we are making our DemoJavascriptInterface object available to
+JavaScript where it will be called "window.demo".</p>
+
+<p>Second, your Activity can invoke JavaScript methods. All you have to do
+is call the {@link android.webkit.WebView#loadUrl(java.lang.String) loadUrl}
+method with the appropriate JavaScript call:</p>
+
+<p><code style="padding-left: 25px;">mWebView.loadUrl("javascript:wave()");</code></p>
+
+<p>Our <a title="WebViewDemo"
+href="http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/Samples
+/WebViewDemo">WebViewDemo</a> uses both techniques: when you click on the
+android, it calls out to the activity, which then turns around and calls back
+into the JavaScript. WebViews are very powerful, and they may be a valuable tool
+to help you build your application – especially if you already have a lot of
+HTML content. As it happens, we've used exactly this approach in some of the
+applications we've written.</p>
diff --git a/docs/html/resources/articles/wikinotes-intents.jd b/docs/html/resources/articles/wikinotes-intents.jd
new file mode 100644
index 0000000..bc64544
--- /dev/null
+++ b/docs/html/resources/articles/wikinotes-intents.jd
@@ -0,0 +1,255 @@
+page.title=WikiNotes: Routing Intents
+@jd:body
+
+
+<p>In <a href="wikinotes-linkify.html">the Linkify! article</a>, we talked about
+using Linkify to turn wiki words (those that match a regular expression that we
+have defined) into a <code>content:</code> URI and defining a path to data that
+matched a note belonging to that wiki word. As an example, a matching word like
+<code>ToDoList</code> would be turned into a URI such as
+<code>content://com.google.android.wikinotes.db.wikinotes/wikinotes/ToDoList
+</code> and then acted upon using the VIEW action from the Linkify class.</p>
+
+<p>This article examines how the Android system takes this combination of
+<code>VIEW</code> action and <code>content:</code> URI and finds the correct
+activity to fire in order to do something with the data. It will also explain
+how the other default links created by Linkify, such as web URLs and telephone
+numbers, also result in the correct activity to handle that data type being
+fired. Finally, this article will start to examine the custom
+<code>ContentProvider</code> that has been created to handle WikiNotes data. The
+full description of the ContentProvider and what it does will span a couple more
+articles as well, because there is a lot to cover.</p>
+
+<h3>The Linkify-calls-intent Workflow</h3>
+
+<p>At a high level, the steps for Linkify to invoke an intent, and for the
+resulting activity (if any) to handle it, look like this:</p>
+
+<ol>
+ <li>Linkify is invoked on a TextView to turn matching text patterns into Intent links.</li>
+ <li>Linkify takes over monitoring for those Intent links being selected by the user.</li>
+ <li>When the user selects a link, Linkify calls the VIEW action using the content: URI associated with the link.</li>
+ <li>Android takes the content: URI that represents the data, and looks for a
+ContentProvider registered in the system that matches the URI.</li>
+ <li>If a match is found, Android queries the ContentProvider using the URI,
+and asks what MIME type the data that will be returned from the URI is.</li>
+ <li>Android then looks for an activity registered in the system with an
+intent-filter that matches both the VIEW action, and the MIME type for
+the data represented by the content: URI.</li>
+ <li>Assuming a match is found, Linkify then invokes the intent for
+the URI, at which point the activity takes over, and is handed
+the content: URI.</li>
+ <li>The activity can then use the URI to retrieve the data and act on
+it.</li>
+</ol>
+
+<p>This is actually a simpler process than it
+sounds, and it is quite lightweight as well. Perhaps a more
+understandable statement about how it works might be:</p>
+
+<p>Linkify is used to turn matching text into hot-links. When the user
+selects a hot-link, Android takes the data locator represented by the
+hot-link and looks for a data handler for that data locator. If it
+finds one, it asks for what type of data is returned for that locator.
+It then looks for something registered with the system that handles
+that type of data for the VIEW action, and starts it, including the
+data locator in the request.</p>
+
+<p>The real key here is the MIME type. MIME stands for <a
+href="http://en.wikipedia.org/wiki/MIME">Multipurpose Internet Mail
+Extensions</a> — a standard for sending attachments over email. The MIME
+type (which is the part Android uses) is a way of describing certain kinds of
+data. That type is then used to look for an Activity that can do something with
+that data type. In this way, ContentProviders and Activities (or other
+IntentReceivers) are decoupled, meaning that a given Content URI might have a
+different ContentProvider to handle it, but could still use the same MIME type
+meaning that the same activity could be called upon to handle the resulting
+data.</p>
+
+<h3>Linkify on a wiki word</h3>
+
+<p>Using the above workflow, let's take a look at exactly how the process
+works in WikiNotes for Android:</p>
+
+<p>First, Linkify is used to turn text matching the wiki word regular expression
+into a link that provides a Content URI for that wiki word, for example
+<code>content://com.google.android.wikinotes.db.wikinotes/wikinotes/ToDoList</code>.</p>
+
+<p>When the user clicks on the wiki word link, Linkify invokes the VIEW
+action on the Content URI. At this point, the Android system takes over
+getting the Intent request to the correct activity.</p>
+
+<p>Next, Android looks for a ContentProvider that has been registered
+with the system to handle URIs matching our Content URI format.</p>
+
+<p>In our case, we have a definition inside
+<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/WikiNotes/AndroidManifest.xml">our application's AndroidManifest.xml</a>
+file that reads:</p>
+
+<pre><provider name="com.google.android.wikinotes.db.WikiNotesProvider"
+ android:authorities="com.google.android.wikinotes.db.wikinotes" /></pre>
+
+<p>This establishes that we have a ContentProvider defined in our application
+that provides the "root authority":
+<code>com.google.android.wikinotes.db.wikinotes</code>. This is the first part
+of the Content URI that we create for a wiki word link. Root Authority is just
+another way of thinking about a descriptor that is registered with Android to
+allow requests for certain URLs to be routed to the correct class.</p>
+
+<p>So, the whole definition is that a class called
+<code>com.google.android.wikinotes.db.WikiNotesProvider</code> is registered
+with the system as able to handle the
+<code>com.google.android.wikinotes.db.wikinotes</code> root authority (i.e. URIs
+starting with that identifier).</p>
+
+<p>From here, Android takes the rest of the URI and presents it to that
+ContentProvider. If you look at the
+<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/WikiNotes/src/com/google/android/wikinotes/db/WikiNotesProvider.java">WikiNotesProvider
+class</a> and scroll to the very bottom, in the static block there, you can see
+the pattern definitions to match the rest of the URL.</p>
+
+<p>In particular, take a look at the two lines:</p>
+
+<pre>URI_MATCHER.addURI(WikiNote.WIKINOTES_AUTHORITY, "wikinotes", NOTES);
+URI_MATCHER.addURI(WikiNote.WIKINOTES_AUTHORITY, "wikinotes/*", NOTE_NAME);</pre>
+
+<p>These are the definitions of URIs that our ContentProvider recognizes and can
+handle. The first recognizes a full URI of
+<code>content://com.google.android.wikinotes.db.wikinotes/wikinotes</code> and
+associates that with a constant called NOTES. This is used elsewhere in the
+ContentProvider to provide a list of all of the wiki notes in the database when
+the URI is requested.</p>
+
+<p>The second line uses a wildcard — '*' — to match a request of the
+form that Linkify will create, e.g.
+<code>content://com.google.android.wikinotes.db.wikinotes/wikinotes/ToDoList
+</code>. In this example, the * matches the ToDoList part of the URI and is
+available to the handler of the request, so that it can fish out the matching
+note for ToDoList and return it as the data. This also associates that match
+with a constant called NOTE_NAME, which again is used as an identifier elsewhere
+in the ContentProvider.</p>
+
+<p>The other matches in this static block are related to forms of
+searching that have been implemented in the WikiNotes for Android
+application, and will be covered in later articles. Likewise, how the
+data is obtained from this matching pattern will be the subject of the
+next article.</p>
+
+<p>For right now we are concerned with the MIME type for the URI. This is
+defined in the <code>getType()</code> method also in the
+<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/WikiNotes/src/com/google/android/wikinotes/db/WikiNotesProvider.java">WikiNotesProvider
+class</a> (about halfway through the file). Take a quick look at this. The key
+parts for now are:</p>
+
+<pre>case NOTES:
+ return "vnd.android.cursor.<b>dir</b>/vnd.google.wikinote";</pre>
+
+<p>and</p>
+
+<pre>case NOTE_NAME:
+ return "vnd.android.cursor.<b>item</b>/vnd.google.wikinote";</pre>
+
+<p>These are the same constant names we defined in our pattern
+matchers. In the first case, that of the all notes URI, the MIME type
+returned is <code>vnd.android.cursor.dir/vnd.google.wikinote</code>
+which is like saying an Android list (dir) of Google wiki notes (the
+vnd bit is MIME-speak for "vendor specific definition"). Likewise, in
+the case of a NOTE_NAME match, the MIME type returned is
+<code>vnd.android.cursor.item/vnd.google.wikinote</code> which is
+like saying an Android item of Google wiki notes.</p>
+
+<p>Note that if you define your own MIME data types like this, the
+<code>vnd.android.cursor.dir</code> and <code>vnd.android.cursor.item</code>
+categories should be retained, since they have meaning to the Android
+system, but the actual item types should be changed to reflect your
+particular data type.</p>
+
+<p>So far Android has been able to find a ContentProvider that handles
+the Content URI supplied by the Linkify Intent call, and has queried
+the ContentProvider to find out the MIME types for that URI. The final
+step is to find an activity that can handle the VIEW action for that
+MIME type. Take a look in the the
+<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/WikiNotes/AndroidManifest.xml">AndroidManifest.xml file</a>
+again. Inside the WikiNotes activity definition, you will see:</p>
+
+<pre><intent-filter>
+ <action name="android.intent.action.VIEW"/>
+ <category name="android.intent.category.DEFAULT"/>
+ <category name="android.intent.category.BROWSABLE"/>
+ <data mimetype="vnd.android.cursor.item/vnd.google.wikinote"/>
+</intent-filter></pre>
+
+<p>This is the correct combination of matches for the VIEW action on a
+WikiNote type that is requested from the LINKIFY class. The DEFAULT
+category indicates that the WikiNotes activity should be treated as a
+default handler (a primary choice) for this kind of data, and the
+BROWSABLE category means it can be invoked from a "browser", in this
+case the marked-up Linkified text.</p>
+
+<p>Using this information, Android can match up the VIEW action request
+for the WikiNotes data type with the WikiNotes activity, and can then
+use the WikiNotes activity to handle the request.</p>
+
+<h3>Why do it like this?</h3>
+
+<p>It's quite a trip through the system, and there is a lot to absorb
+here, but this is one of the main reasons I wanted to write WikiNotes
+in the first place. If you follow and understand the steps here, you'll
+have a good grasp of the whole Intents mechanism in Android, and how it
+helps loosely coupled activities cooperate to get things done.</p>
+
+<p>In this case, we could have found another way to detect wiki words
+based on a regular expression, and maybe written our own handler to
+intercept clicks within the TextView and dig out the right data and
+display it. This would seem to accomplish the same functionality just
+as easily as using intents, so what is the advantage to using the full
+Intents mechanism?</p>
+
+<p>In fact there are several advantages:</p>
+
+<p>The most obvious is that because we are using the standard Intent
+based approach, we are not limited to just linking and navigating to
+other wiki notes. We get similar behavior to a number of other data
+types as well. For example, a telephone number or web URL in a wiki
+note will be marked up by Linkify, and using this same mechanism (VIEW
+action on the linked data type) the browser or dialer activities will
+be automatically fired.</p>
+
+<p>It also means that each operation on a wiki note can be treated as a
+separate life cycle by our activity. We are not dealing with swapping
+data in and out of an existing activity - each activity works on a
+particular wiki note and that's all you have to worry about.</p>
+
+<p>Another advantage is that we now have a public activity to handle
+VIEW actions in WikiNotes no matter where the request comes from.
+Another application could request to view a wiki note (perhaps without
+even knowing what kind of data it is) and our activity could start up
+and handle it.</p>
+
+<p>The backstack is automatically maintained for you too. As you
+forward navigate through WikiNotes, Android maintains the history of
+notes visited, and so when you hit the back button you go back to the
+last note you were on. All this is free because we rely on the Android
+intents mechanism.</p>
+
+<p>Finally, if you run WikiNotes for Android and then start DDMS to
+take a look at the Activity threads in the WikiNotes application while
+it is running, you can see that despite what you might think, letting
+Android manage the navigation is very efficient. Create a few linked
+notes, as many links deep as you like, and then follow them. If you
+follow links hundreds of notes deep, you will still only see a handful
+of WikiNotes activities. Android is managing the activities, closing
+the older ones as necessary and using the life cycle to swap data in
+and out.</p>
+
+<h3>Next Time</h3>
+
+<p>This was a long article, but necessarily so. It demonstrates the
+importance of the Intents mechanism and to reinforce the notion that it
+should be used whenever possible for forward navigation, even within a
+single application. Illustrating this is one of the primary reasons I
+wrote WikiNotes for Android in the first place.</p>
+
+<p>In the next article we will look deeper into the ContentProvider and
+examine how it turns a Content URI into a row (or several rows) of data
+that can be used by an activity.</p>
diff --git a/docs/html/resources/articles/wikinotes-linkify.jd b/docs/html/resources/articles/wikinotes-linkify.jd
new file mode 100644
index 0000000..21b1f13
--- /dev/null
+++ b/docs/html/resources/articles/wikinotes-linkify.jd
@@ -0,0 +1,113 @@
+page.title=WikiNotes: Linkify your Text!
+@jd:body
+
+<img style="margin-left: 1.5em; margin-bottom:1.5em; float: right;"
+src="images/WikiNotes.png" alt="Linkify example" border="0">
+
+<p>This article introduces <a
+href="http://android-developers.blogspot.com/2008/03/announcing-apps-for-android
+.html">WikiNotes for Android</a>, part of the <a
+href="http://code.google.com/p/apps-for-android/">Apps for Android</a>
+project. It covers the use of Linkify to turn ordinary text views
+into richer, link-oriented content that causes Android intents to fire
+when a link is selected.</p>
+
+<p><strong>Linkify</strong>: The {@link android.text.util.Linkify} class in the
+framework is perfect for creating a wiki note pad. It lets you specify a <a
+title="regular expression"
+href="http://en.wikipedia.org/wiki/Regular_expression">regular expression
+»</a>
+to match, and a scheme to prepend. The scheme is a string that, when
+the matched text is added, forms a Content URI to allow the correct
+data to be looked up.</p>
+
+<p>For example, in our case we want to look for a regular expression match for a
+WikiWord (that is, a word with <a title="word with camel case"
+href="http://en.wikipedia.org/wiki/CamelCase">camel case »</a> and no
+spaces). Linkify can then turn this into a Content URI — something like
+<code>content://com.google.android.wikinotes.db.wikinotes/wikinotes/WikiWord</code>,
+which can then be used to locate the correct wiki page from a
+{@link android.content.ContentProvider}.</p>
+
+<p>As a bonus, the Linkify class also defines several default matches,
+in particular it is able to turn web URLs, email addresses and
+telephone numbers into active links which fire Android intents
+automatically.</p>
+
+<p>Linkify can be passed any TextView in your application, and will
+take care of creating the links and enabling their "clickability" for
+you.</p>
+
+<p><strong>Default Linkify</strong>: Using the set of default active
+link options is very straightforward. Simply pass it a handle to a
+TextView with content in it, and the <code>Linkify.ALL</code> flag:</p>
+
+<pre>TextView noteView = (TextView) findViewById(R.id.noteview);
+noteView.setText(someContent);
+Linkify.addLinks(noteView, Linkify.ALL);</pre>
+
+<p>and that's it. The <code>Linkify.ALL</code> flag applies all of the predefined
+link actions, and the TextView will be immediately updated with a set
+of active links which, if you select them, fire default intents for the
+actions (e.g. a web URL will start the browser with that URL, a
+telephone number will bring up the phone dialer with that number ready
+to call, etc.).</p>
+
+<p><strong>Custom Linkify</strong>: So what about our WikiWord? There is no
+pre-defined action for that, so it needs to be defined and associated with a
+scheme.</p>
+
+<p>The first task is to define a regular expression that matches the kind of
+WikiWords we want to find. The regex in this case is:</p>
+
+<pre>\b[A-Z]+[a-z0-9]+[A-Z][A-Za-z0-9]+\b</pre>
+
+<p>Obvious, no? Well actually this is equivalent to the following
+description: "Starting with a word boundary (the \b) find at least one
+upper case letter, followed by at least one lower case letter or a
+numeric digit, followed by another upper case letter, and then any mix
+of upper case, lower case or numeric until the next word boundary (the
+final \b)". Regular expressions are not very pretty, but they are an
+extremely concise and accurate way of specifying a search pattern.</p>
+
+<p>We also need to tell Linkify what to do with a match to the
+WikiWord. Linkify will automatically append whatever is matched to a
+scheme that is supplied to it, so for the sake of argument let's assume
+we have a {@link android.content.ContentProvider} that matches the
+following content URI:</p>
+
+<pre>content://com.google.android.wikinotes.db.wikinotes/wikinotes/WikiWord</pre>
+
+<p>The WikiWord part will be appended by Linkify when it finds a match, so we
+just need the part before that as our scheme.</p>
+
+<p>Now that we have these two things, we use Linkify to connect them up:</p>
+
+<pre>Pattern wikiWordMatcher = Pattern.compile("\\b[A-Z]+[a-z0-9]+[A-Z][A-Za-z0-9]+\\b");
+String wikiViewURL = "content://com.google.android.wikinotes.db.wikinotes/wikinotes/";
+Linkify.addLinks(noteView, wikiWordMatcher, wikiViewURL);</pre>
+
+<p>Note that the \b's had to be escaped with double backslashes for the Java
+Pattern.compile line.</p>
+
+<p>Linkify can be used multiple times on the same view to add more
+links, so using this after the Default Linkify call means that the
+existing active links will be maintained and the new WikiWords will be
+added. You could define more Linkify actions and keep applying them to
+the same TextView if you wanted to.</p>
+
+<p>Now, if we have a WikiWord in the TextView, let's say
+<code>MyToDoList</code>, Linkify will turn it into an active link with the
+content URI:</p>
+
+<pre>content://com.google.android.wikinotes.db.wikinotes/wikinotes/MyToDoList</pre>
+
+<p>and if you click on it, Android will fire the default intent for that content
+URI.</p>
+
+<p>For this to all work, you will need a ContentProvider that
+understands that Content URI, and you will need a default activity
+capable of doing something with the resulting data. I plan to cover
+these in future blog entries (and soon). In fact, the whole Wiki Note
+Pad application is currently undergoing some clean up and review, and
+will then hopefully be released as a sample application.</p>
diff --git a/docs/html/resources/articles/window-bg-speed.jd b/docs/html/resources/articles/window-bg-speed.jd
new file mode 100644
index 0000000..bd7a303
--- /dev/null
+++ b/docs/html/resources/articles/window-bg-speed.jd
@@ -0,0 +1,125 @@
+page.title=Window Backgrounds & UI Speed
+@jd:body
+
+<p>Some Android applications require to squeeze every bit of performance out of
+the UI toolkit and there are many ways to do so. In this article, you will
+discover how to speed up the drawing and the <em>perceived</em> startup time of
+your activities. Both these techniques rely on a single feature, the window's
+background drawable.</p>
+
+<p>The term <em>window background</em> is a bit misleading, however. When you
+setup your user interface by calling <code>setContentView()</code> on an
+{@link android.app.Activity}, Android adds your views to the <code>Activity</code>'s
+window. The window however does not contain only your views, but a few others
+created for you. The most important one is, in the current implementation used
+on the T-Mobile G1, the <code>DecorView</code>, highlighted in the view
+hierarchy below:</p>
+
+<div style="text-align: center;"><img src="images/window_background_root.png" alt="A typical Android view hierarchy"></div>
+
+<p>The <code>DecorView</code> is the view that actually holds the
+window's background drawable. Calling
+{@link android.view.Window#setBackgroundDrawable(android.graphics.drawable.Drawable) getWindow().setBackgroundDrawable()}
+from your <code>Activity</code> changes the background of the window by changing
+the <code>DecorView</code>'s background drawable. As mentioned before, this
+setup is very specific to the current implementation of Android and can change
+in a future version or even on another device.</p>
+
+<p>If you are using the standard Android themes, a default background drawable
+is set on your activities. The standard theme currently used on the T-Mobile G1
+uses for instance a {@link android.graphics.drawable.ColorDrawable}. For most
+applications, this background drawable works just fine and can be left alone. It
+can however impacts your application's drawing performance. Let's take the
+example of an application that always draws a full screen opaque picture:</p>
+
+<div style="text-align: center;"><img src="images/window_background.png" alt="An opaque user interface doesn't need a window background"></div>
+
+<p>You can see on this screenshot that the window's background is invisible,
+entirely covered by an <code>ImageView</code>. This application is setup to
+redraw as fast as it can and draws at about 44 frames per second, or 22
+milliseconds per frame (<strong>note:</strong> the number of frames per second
+used in this article were obtained on a T-Mobile G1 with my finger on the screen
+so as to reduce the drawing speed which would otherwise be capped at 60 fps.) An
+easy way to make such an application draw faster is to <em>remove</em> the
+background drawable. Since the user interface is entirely opaque, drawing the
+background is simply wasteful. Removing the background improves the performance
+quite nicely:</p>
+
+<div style="text-align: center;"><img src="images/window_background_null.png" alt="Remove the background for faster drawing"></div>
+
+<p>In this new version of the application, the drawing speed went up to 51
+frames per second, or 19 milliseconds per frame. The difference of 3
+milliseconds per is easily explained by the speed of the memory bus on the
+T-Mobile G1: it is exactly the time it takes to move the equivalent of a
+screenful of pixels on the bus. The difference could be even greater if the
+default background was using a more expensive drawable.</p>
+
+<p>Removing the window's background can be achieved very easily by using
+a custom theme. To do so, first create a file called
+<code>res/values/theme.xml</code> containing the following:</p>
+
+<pre class="prettyprint"><resources>
+ <style name="Theme.NoBackground" parent="android:Theme">
+ <item name="android:windowBackground">@null</item>
+ </style>
+</resources></pre>
+
+<p>You then need to apply the theme to your activity by adding the attribute
+<code>android:theme="@style/Theme.NoBackground"</code> to your
+<code><activity /></code> or <code><application /></code> tag. This
+trick comes in very handy for any app that uses a <code>MapView</code>, a
+<code>WebView</code> or any other full screen opaque view.</p>
+
+<p><strong>Opaque views and Android</strong>: this optimization is currently
+necessary because the Android UI toolkit is not smart enough to prevent the
+drawing of views hidden by opaque children. The main reason why this
+optimization was not implemented is simply because there are usually very few
+opaque views in Android applications. This is however something that I
+definitely plan on implementing as soon as possible and I can only apologize for
+not having been able to do this earlier.</p><p>Using a theme to change the
+window's background is also a fantastic way to improve the <em>perceived</em>
+startup performance of some of your activities. This particular trick can only
+be applied to activities that use a custom background, like a texture or a logo.
+The <a href="http://code.google.com/p/shelves">Shelves</a> application is a good
+example:</p>
+
+<div style="text-align: center;"><img src="images/shelves2.png" alt="Textured backgrounds are good candidates for window's background"></div>
+
+<p>If this application simply set the wooden background in the XML layout or in
+<code>onCreate()</code> the user would see the application startup with the
+default theme and its dark background. The wooden texture would only appear
+after the inflation of the content view and the first layout/drawing pass. This
+causes a jarring effect and gives the user the impression that the application
+takes time to load (which can actually be the case.) Instead, the application
+defines the wooden background in a theme, picked up by the system as soon as the
+application starts. The user never sees the default theme and gets the
+impression that the application is up and running right away. To limit the
+memory and disk usage, the background is a tiled texture defined in
+<code>res/drawable/background_shelf.xml</code>:</p>
+
+<pre class="prettyprint"><bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/shelf_panel"
+ android:tileMode="repeat" /></pre><p>This drawable is simply referenced by the theme:</p>
+
+<pre class="prettyprint"><resources>
+ <style name="Theme.Shelves" parent="android:Theme">
+ <item name="android:windowBackground">@drawable/background_shelf</item>
+ <item name="android:windowNoTitle">true</item>
+ </style>
+</resources></pre>
+
+<p>The same exact trick is used in the <em>Google Maps application that ships
+with the T-Mobile G1. When the application is launched, the user immediately
+sees the loading tiles of <code>MapView</code>. This is only a trick, the theme
+is simply using a tiled background that looks exactly like the loading tiles of
+<code>MapView</code>.</em></p>
+
+<p>Sometimes the best tricks are also the simplest, so the next time you create
+an activity with an opaque UI or a custom background, remember to change the
+window's background.</p>
+
+<p><a href="http://progx.org/users/Gfx/android/WindowBackground">Download the source code of the first example</a>.</p>
+
+<p><a href="http://code.google.com/p/shelves/">Download the source code of Shelves</a>.</p>
+
+
diff --git a/docs/html/resources/articles/zipalign.jd b/docs/html/resources/articles/zipalign.jd
new file mode 100644
index 0000000..013d0fe
--- /dev/null
+++ b/docs/html/resources/articles/zipalign.jd
@@ -0,0 +1,98 @@
+page.title=Zipalign: an Easy Optimization
+@jd:body
+
+<p>The Android SDK includes a tool called <a
+href="{@docRoot}guide/developing/tools/zipalign.html"><code>zipalign</code></a>
+that optimizes the way an application is packaged. Running zipalign against your
+application enables Android to interact it more efficiently at run time and thus
+has the potential to make it and the overall system run faster. We strongly
+encourage you to use <code>zipalign</code> on both new and already published
+applications and to make the optimized version available — even if your
+application targets a previous version of Android. This article describes how
+<code>zipalign</code> helps performance and how to use it to optimize your
+app.</p>
+
+<p>In Android, data files stored in each application's apk are accessed by
+multiple processes: the installer reads the manifest to handle the
+permissions associated with that application; the Home application
+reads resources to get the application's name and icon; the system
+server reads resources for a variety of reasons (e.g. to display that
+application's notifications); and last but not least, the resource
+files are obviously used by the application itself.</p>
+
+<p>The resource-handling code in Android can efficiently access resources when
+they're aligned on 4-byte boundaries by memory-mapping them. But for resources
+that are not aligned (that is, when <code>zipalign</code> hasn't been run on an
+apk), it has to fall back to explicitly reading them — which is slower and
+consumes additional memory.</p>
+
+<p>For an application developer, this fallback mechanism is very
+convenient. It provides a lot of flexibility by allowing for several
+different development methods, including those that don't include
+aligning resources as part of their normal flow.</p>
+
+<p>Unfortunately, for users the situation is reversed — reading resources
+from unaligned apks is slow and takes a lot of memory. In the best case, the
+only visible result is that both the Home application and the unaligned
+application launch slower than they otherwise should. In the worst case,
+installing several applications with unaligned resources increases memory
+pressure, thus causing the system to thrash around by having to constantly start
+and kill processes. The user ends up with a slow device with a poor battery
+life.</p>
+
+<p>Luckily, it's very easy for you to align the resources in your application:</p>
+
+<ul>
+<li>Using ADT:</li>
+<li style="list-style-type: none; list-style-image: none; list-style-position: outside;">
+<ul>
+<li>The ADT plugin for Eclipse (starting from version 0.9.3) will automatically
+align release application packages if the export wizard is used to create them.
+To use the wizard, right click the project and choose "Android Tools" >
+"Export Signed Application Package..." It can also be accessed from the first
+page of the <code>AndroidManifest.xml</code> editor.</li>
+</ul>
+</li>
+<li>Using Ant:</li><li style="list-style-type: none; list-style-image: none; list-style-position: outside;">
+
+<ul>
+<li>The <em>Ant</em> build script (starting from Android 1.6) can align
+application packages. Targets for older versions of the Android platform are not
+aligned by the <em>Ant</em> build script and need to be manually aligned.</li>
+<li>Starting from the Android 1.6 SDK, Ant aligns and signs packages automatically,
+when building in debug mode.</li>
+<li>In release mode, Ant aligns packages only if it has enough
+information to sign the packages, since aligning has to happen after signing. In
+order to be able to sign packages, and therefore to align them, <em>Ant</em>
+needs to know the location of the keystore and the name of the key in
+<code>build.properties</code>. The name of the properties are
+<code>key.store</code> and <code>key.alias</code> respectively. If those
+properties are present, the signing tool will prompt to enter the store/key
+passwords during the build, and the script will sign and then align the apk
+file. If the properties are missing, the release package will not be signed, and
+therefore will not get aligned either.</li>
+</ul>
+</li>
+<li>Manually:</li>
+<li style="list-style-type: none; list-style-image: none; list-style-position: outside;">
+<ul>
+<li>In order to manually align a package, <code>zipalign</code>
+is in the <code>tools/</code> folder of Android 1.6 and later SDKs. You can use
+it to align application packages targeting any version of Android. You should run
+it only after signing the apk file, using the following command:
+<br><code>zipalign -v 4 source.apk destination.apk</code></li>
+</ul>
+</li>
+<li>Verifying alignment:</li>
+<li style="list-style-type: none; list-style-image: none; list-style-position: outside;">
+<ul>
+<li>The following command verifies that a package is aligned:<br><code>zipalign -c -v 4 application.apk</code>
+</li>
+</ul>
+</li>
+</ul>
+
+<p>We encourage you manually run <code>zipalign</code>
+on your currently published applications and to make the newly aligned
+versions available to users. Also, don't forget to align any new
+applications going forward!</p>
diff --git a/docs/html/resources/community-groups.jd b/docs/html/resources/community-groups.jd
new file mode 100644
index 0000000..61fbcc8
--- /dev/null
+++ b/docs/html/resources/community-groups.jd
@@ -0,0 +1,121 @@
+community=true
+page.title=Android Developer Groups
+@jd:body
+
+<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>
+
+<p style="margin-bottom:.5em"><strong>Contents</strong></p>
+<ol class="toc">
+ <li><a href="#BeforeYouPost">Before you post</a></li>
+ <li><a href="#ApplicationDeveloperLists">Application developer mailing lists</a></li>
+ <li><a href="#UsingEmail">Using email with the mailing lists</a></li>
+</ol>
+
+<h2 id="BeforeYouPost">Before you post</h2>
+<p>Before writing a post, please try the following:</p>
+
+<ol>
+<li><a href="{@docRoot}resources/faq/index.html">Read the FAQs</a> The most common questions about developing Android applications are addressed in this frequently updated list.</li>
+<li><strong>Type in keywords of your questions in the main Android site's search bar</strong> (such as the one above). This search encompasses all previous discussions, across all groups, as well as the full contents of the site, documentation, and blogs. Chances are good that somebody has run into the same issue before.</li>
+<li><b>Search the mailing list archives</b> to see whether your questions have already been discussed.
+ </li>
+</ol>
+
+<p>If you can't find your answer, then we encourage you to address the community.
+As you write your post, please do the following:
+<ol>
+<li><b>Read
+the <a href="http://sites.google.com/a/android.com/opensource/discuss/android-discussion-groups-charter">mailing list charter</a></b> that covers the community guidelines.
+</li>
+<li><b>Select the most appropriate mailing list for your question</b>. There are several different lists for
+developers, described below.</li>
+<li>
+ <b>Be very clear</b> about your question
+in the subject -- it helps everyone, both those trying to answer your
+question as well as those who may be looking for information in the
+future.</li>
+<li><b>Give plenty of details</b> in your post to
+help others understand your problem. Code or log snippets, as well as
+pointers to screenshots, may also be helpful. For a great guide to
+phrasing your questions, read <a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">How To Ask Questions The Smart Way</a>.
+ </li>
+</ol>
+
+
+<h2 id="ApplicationDeveloperLists">Application developer mailing lists</h2>
+<ul>
+<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></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></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></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></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></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></li>
+</ul>
+</li>
+
+<li><b>Android Market Help Forum</b> - A web-based discussion forum where you can ask questions or report issues relating to Android Market.
+<ul>
+<li>URL: <a href="http://www.google.com/support/forum/p/Android+Market?hl=en">http://www.google.com/support/forum/p/Android+Market?hl=en</a></li>
+</ul>
+</li>
+
+</ul>
+
+
+
+<h2 id="UsingEmail">Using email with the mailing lists</h2>
+<p>Instead of using the <a href="http://groups.google.com/">Google Groups</a> site, you can use your email client of choice to participate in the mailing lists.</p>
+<p>To subscribe to a group without using the Google Groups site, use the link under "subscribe via email" in the lists above.</p>
+<p>To set up how you receive mailing list postings by email:</p>
+
+<ol><li>Sign into the group via the Google Groups site. For example, for the android-framework group you would visit <a href="http://groups.google.com/group/android-framework">http://groups.google.com/group/android-framework</a>.</li>
+<li>Click "Edit
+my membership" on the right side.</li>
+<li>Under "How do
+you want to read this group?" select one of the email options. </li>
+</ol>
+
+
+
+
+
+
+
+
+</div>
diff --git a/docs/html/resources/community-more.jd b/docs/html/resources/community-more.jd
new file mode 100644
index 0000000..2be015a
--- /dev/null
+++ b/docs/html/resources/community-more.jd
@@ -0,0 +1,48 @@
+community=true
+page.title=IRC and Twitter
+@jd:body
+
+<p>In addition to the <a href="community-groups.html">Android developer groups</a>, you can also participate in the Android developer community through IRC, and you can also follow us on Twitter. </p>
+
+<h3 id="irc">IRC</h3>
+
+<p>Several IRC channels are available for discussions about developing Android applications.</p>
+
+<table>
+<tr>
+ <th>Channel</th><th>Host</th><th>Description</th>
+</tr>
+<tr>
+ <td>#android</td>
+ <td>irc.freenode.net</td>
+ <td>General discussion about Android (and Android development).</td>
+</tr>
+<tr>
+ <td>#android-dev</td>
+ <td>irc.freenode.net</td>
+ <td>Discussion focused on developing Android apps.</td>
+</tr>
+</table>
+
+<p>If you haven't used IRC before, check <a href="http://en.wikipedia.org/wiki/List_of_IRC_clients">http://en.wikipedia.org/wiki/List_of_IRC_clients »</a> for a helpful list of IRC clients. Alternatively, you could also use this <a href="http://java.freenode.net/index.php?channel=android-dev">web interface »</a>, which does not require any installation, to join discussions on the Android IRC channels. </p>
+
+<p>Here are some tips for using IRC:</h4>
+
+<ul>
+<li>Set your nickname before you join the channel.</li>
+<li>Registering your nickname prevents others from using your nickname or impersonating you later:
+<pre>/nick <yournickname>
+/msg nickserv register <password> <email></code></pre>
+<p>Afterwards, when you connect, you'll need to supply a password:</p>
+<pre>/connect irc.freenode.net
+/nick <yournickname>
+/msg nickserv identify <password>
+/join #android-dev</pre>
+</li>
+</ul>
+
+<h3 id="twitter">Twitter</h3>
+<p>You can follow us on Twitter at this account:</p>
+
+<p style="margin-left:2em;"><a href="http://twitter.com/androiddev">http://twitter.com/androiddev</a></p>
+
diff --git a/docs/html/resources/dashboard/platform-versions.jd b/docs/html/resources/dashboard/platform-versions.jd
new file mode 100644
index 0000000..ec7e9da
--- /dev/null
+++ b/docs/html/resources/dashboard/platform-versions.jd
@@ -0,0 +1,81 @@
+page.title=Platform Versions
+@jd:body
+
+<style type="text/css">
+div.dashboard-panel {
+ max-width:928px;
+ margin:0 0 1em 0;
+ padding:20px 20px 0 20px;
+ border:1px solid #d3ecf5;
+ border-radius:7px;
+ -moz-border-radius:7px;
+ -webkit-border-radius:7px;
+ background-color: #DAF3FC;
+ box-shadow:2px 3px 1px #eee;
+ -moz-box-shadow:2px 3px 1px #eee;
+ -webkit-box-shadow:2px 3px 1px #eee;
+ overflow:hidden;
+}
+#jd-content div.dashboard-panel img {
+ margin:0 20px 20px 0;
+ padding:0;
+ border:1px solid #ccc;
+ float:left;
+}
+div.dashboard-panel table {
+ margin:0 0 20px 0;
+ float:left;
+ background-color:#fff;
+}
+div.dashboard-panel th {
+ white-space:nowrap;
+}
+</style>
+
+<p>This page provides data about the relative number of active devices
+running a given version of the Android platform. This can help you
+understand the landscape of device distribution and decide how to prioritize
+the development of your application features for the devices currently in
+the hands of users.</p>
+
+<p class="note"><strong>Note:</strong> This data is based on the number
+of Android devices that have accessed Android Market within a 14-day period
+ending on the data collection date noted below.</p>
+
+<div class="dashboard-panel">
+
+<img alt="" width="400" height="250"
+src="http://chart.apis.google.com/chart?cht=p&chs=400x250&chd=t:0.3,31.0,47.6,0.7,20.4&chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1&chco=c4df9b,6fad0c" />
+
+<!-- HISTORY
+12/14/09 http://chart.apis.google.com/chart?cht=p&chs=400x250&chd=t:0.3,27.7,54.2,2.9,14.8&chl=Android%201.1|Android%201.5|Android%201.6|Android%202.0|Android%202.0.1&chco=c4df9b,6fad0c
+-->
+
+<table>
+<tr>
+ <th>Android Platform</th>
+ <th>Percent of Devices</th>
+</tr>
+<tr>
+ <td>Android 1.1</td>
+ <td>0.3%</td>
+</tr>
+<tr>
+ <td>Android 1.5</td>
+ <td>31.0%</td>
+</tr>
+<tr>
+ <td>Android 1.6</td>
+ <td>47.6%</td></tr>
+<tr>
+ <td>Android 2.0</td>
+ <td>0.7%</td>
+</tr>
+<tr>
+ <td>Android 2.0.1</td>
+ <td>20.4%</td>
+</tr>
+</table>
+</div>
+
+<p><em>Data collected during two weeks ending on 1/4/2010</em></p>
diff --git a/docs/html/resources/faq/commontasks.jd b/docs/html/resources/faq/commontasks.jd
new file mode 100644
index 0000000..2f09b00
--- /dev/null
+++ b/docs/html/resources/faq/commontasks.jd
@@ -0,0 +1,819 @@
+page.title=Common Tasks and How to Do Them in Android
+parent.title=FAQs, Tips, and How-to
+parent.link=index.html
+@jd:body
+
+<ul>
+ <li><a href="#neweclipseandroidproject">Creating an Android Application using
+ the Eclipse plugin</a></li>
+ <li><a href="#newandroidprojectnoeclipse">Creating an Android Application without
+ the Eclipse plugin</a></li>
+ <li><a href="#addexternallibrary">Adding an External Library (.jar) using Eclipse</a></li>
+ <li><a href="#implementcallbacks">Implementing Activity callbacks</a> (Android
+ calls your activity at various key moments in its life cycle. You must know
+ how to handle each of these to draw your screen, initialize class members,
+ and acquire data.)</li>
+ <li><a href="#opennewscreen">Opening a new screen</a></li>
+ <li><a href="#listening">Listening for button clicks </a></li>
+ <li><a href="#configurewindowproperties">Configuring general window properties </a></li>
+ <li><a href="#localhostalias">Referring to localhost from the emulated environment</a></li>
+ <li><a href="#appstate">Storing and retrieving state</a></li>
+ <li><a href="{@docRoot}guide/topics/data/data-storage.html#preferences">Storing and retrieving preferences</a></li>
+ <li><a href="#storingandretrieving">Storing and retrieving larger or more complex
+ persistent data</a> (files and data) </li>
+ <li><a href="#playback">Playing audio, video, still, or other media files</a></li>
+ <li><a href="#broadcastreceivers">Listening for and broadcasting global messages
+ and setting alarms</a></li>
+ <li><a href="#alerts">Displaying alerts </a></li>
+ <li><a href="#progressbar">Displaying a progress bar</a> </li>
+ <li><a href="#addmenuitems">Adding items to the screen menu</a> </li>
+ <li><a href="#webpage">Display a web page</a> </li>
+ <li><a href="#binding">Binding to data</a></li>
+ <li><a href="#handle">Getting a Handle to a Screen Element</a></li>
+ <li><a href="#captureimages">Capture images from the phone camera </a></li>
+ <li><a href="#threading">Handling expensive operations in the UI thread</a></li>
+ <li><a href="#selectingtext">Selecting, highlighting, or styling portions of
+ text</a></li>
+ <li><a href="#querymap">Utilizing attributes in a Map query</a></li>
+ <li><a href="#filelist">List of files for an Android application</a></li>
+ <li><a href="#logging">Print messages to a log file</a></li>
+</ul>
+<p>The ApiDemos sample application includes many, many examples of common
+tasks and UI features. See the code inside
+<code><sdk>samples/ApiDemos</code> and the other sample applications
+under the <code>samples/</code> folder in the SDK.</p>
+
+
+<h2 id="neweclipseandroidproject">Creating an Android Application using the Eclipse Plugin</h2>
+
+<p>Using the Android Eclipse plugin is the fastest and easiest way
+to start creating a new Android application. The plugin automatically generates
+the correct project structure for your application, and keeps the resources
+compiled for you automatically.</p>
+
+<p>It is still a good idea to know what is going on though. Take a look at <a
+href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>
+to understand the basics of how an Android application works.</p>
+
+<p>You should also take a look at the ApiDemos application and the other sample
+applications included in the SDK, in the <code><sdk>/samples/</code>
+folder in the SDK.</p>
+
+<p>Finally, a great way to started with Android development in Eclipse is to
+follow both the <a href="{@docRoot}resources/tutorials/hello-world.html">Hello,
+World</a> and <a
+href="{@docRoot}resources/tutorials/notepad/index.html">Notepad</a> code
+tutorials. In particular, the start of the Hello Android tutorial is an
+excellent introduction to creating a new Android application in Eclipse.</p>
+
+<h2 id="newandroidprojectnoeclipse">Creating an Android Application without the Eclipse Plugin</h2>
+
+<p>This topic describes the manual steps in creating an Android application.
+Before reading this, you should read <a
+href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>
+to understand the basics of how an Android application works. You might also
+want to look at the sample code included with the Android SDK, in the
+<code><sdk>/samples/</code> directory. </p>
+
+<p>Here is a list of the basic steps in building an application.</p>
+<ol>
+ <li><strong>Create your required resource files</strong> This includes
+ the AndroidManifest.xml global description file, string files that your application
+ needs, and layout files describing your user interface. A full list of optional
+ and required files and syntax details for each is given in <a href="#filelist">File
+ List for an Android Application</a>. </li>
+ <li><strong>Design your user interface</strong> See <a
+ href="{@docRoot}guide/topics/ui/index.html">User Interface</a> for
+ details on elements of the Android screen. </li>
+ <li><strong>Implement your Activity </strong>(this page)<strong> </strong> You
+ will create one class/file for each screen in your application. Screens will
+ inherit from an {@link android.app android.app} class, typically {@link android.app.Activity
+ android.app.Activity} for basic screens, {@link android.app.ListActivity
+ android.app.ListActivity} for list screens, or {@link android.app.Dialog
+ android.app.Dialog} for dialog boxes. You will implement the required callbacks
+ that let you draw your screen, query data, and commit changes, and also perform
+ any required tasks such as opening additional screens or reading data from
+ the device. Common tasks, such as opening a new screen or reading data from
+ the device, are described below.
+ The list of files you'll need for your application are described in <a href="#filelist">List
+ of Files for an Android Application</a>. </li>
+ <li><strong><a href="{@docRoot}guide/developing/other-ide.html#buildingwithant">Build and install your
+ package</a>.</strong> The Android SDK has some nice tools for generating
+ projects and debugging code. </li>
+</ol>
+
+<h2 id="addexternallibrary">Adding an External Library (.jar) using Eclipse</h2>
+<p>
+You can use a third party JAR in your application by adding it to your Eclipse project as follows:
+</p>
+<ol>
+<li>
+In the <strong>Package Explorer</strong> panel, right-click on your project and select <strong>Properties</strong>.
+<li>
+Select <strong>Java Build Path</strong>, then the tab <strong>Libraries</strong>.
+<li>
+Press the <strong>Add External JARs...</strong> button and select the JAR file.
+</ol>
+<p>
+Alternatively, if you want to include third party JARs with your package, create a new directory for them within your project and select <strong>Add Library...</strong> instead.</p>
+<p>
+It is not necessary to put external JARs in the assets folder.
+</p>
+
+<a name="implementcallbacks" id="implementcallbacks"></a>
+<h2>Implementing Activity Callbacks</h2>
+<p>Android calls a number of callbacks to let you draw your screen, store data before
+ pausing, and refresh data after closing. You must implement at least some of
+ these methods. See <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">Lifecycles</a>
+ discussion in Application Fundamentals to learn when and in what order these methods
+ are called. Here are some of the standard types of screen classes that Android provides:</p>
+<ul>
+ <li>{@link android.app.Activity android.app.Activity} - This is a standard screen,
+ with no specialization.</li>
+ <li>{@link android.app.ListActivity android.app.ListActivity} - This is a screen
+ that is used to display a list of something. It hosts a ListView object,
+ and exposes methods to let you identify the selected item, receive callbacks
+ when the selected item changes, and perform other list-related actions. </li>
+ <li>{@link android.app.Dialog android.app.Dialog} - This is a small, popup dialog-style
+ window that isn't intended to remain in the history stack. (It is not resizeable
+ or moveable by the user.)</li>
+</ul>
+
+<a name="opennewscreen" id="opennewscreen"></a><h2>Opening a New Screen</h2>
+<p>Your Activity will often need to open another Activity screen as it progresses.
+ This new screen can be part of the same application or part of another application,
+ the new screen can be floating or full screen, it can return a result, and you
+ can decide whether to close this screen and remove it from the history stack
+ when you are done with it, or to keep the screen open in history. These next
+ sections describe all these options. </p>
+<h3>Floating or full?<a name="floatingorfull" id="floatingorfull"></a></h3>
+<p>When you open a new screen you can decide whether to make it transparent or floating,
+ or full-screen. The choice of new screen affects the event sequence of events
+ in the old screen (if the new screen obscures the old screen, a different
+ series of events is called in the old screen). See <a
+ href="{@docRoot}guide/topics/fundamentals.html#lcycles">Lifecycles</a> discussion
+ in Application Fundamentals for details. </p>
+<p>Transparent or floating windows are implemented in three
+ standard ways: </p>
+<ul>
+ <li>Create an {@link android.app.Dialog app.Dialog} class </li>
+ <li>Create an {@link android.app.AlertDialog app.AlertDialog} class </li>
+ <li>Set the {@link android.R.style#Theme_Dialog} <em>theme</em> attribute to <code>@android:style/Theme.Dialog</code>
+ in your AndroidManifest.xml file. For example:
+ <pre><activity class="AddRssItem" android:label="Add an item" android:theme="@android:style/Theme.Dialog"/></pre></li>
+</ul>
+
+<p>Calling startActivity() or startActivityForResult() will open a new screen in whatever
+ way it defines itself (if it uses a floating theme it will be floating,
+ otherwise it will be full screen). </p>
+<h3>Opening a Screen </h3>
+<p>When you want to open a new screen, you can either explicitly specify the activity
+ class to open, or you can let the operating system decide which screen to open,
+ based upon the data and various parameters you pass in. A screen is opened by
+ calling {@link android.app.Activity#startActivity(android.content.Intent) startActivity}
+ and passing in an {@link android.content.Intent Intent} object, which specifies
+ the criteria for the handling screen. To specify a specific screen, call Intent.setClass
+ or setClassName with the exact activity class to open. Otherwise, set a variety
+ of values and data, and let Android decide which screen is appropriate to open.
+ Android will find one or zero Activities that match the specified requirements;
+ it will never open multiple activities for a single request. More information
+ on Intents and how Android resolves them to a specific class is given in the
+ {@link android.content.Intent Intent} topic. </p>
+<a name="intentexamples" id="intentexamples"></a><h3>Some Intent examples </h3>
+<p>The following snippet loads the com.android.samples.Animation1 class, and
+ passes it some arbitrary data.:</p>
+<pre>Intent myIntent = new Intent();
+myIntent.setClassName("com.android.samples", "com.android.samples.Animation1");
+myIntent.putExtra("com.android.samples.SpecialValue", "Hello, Joe!"); // key/value pair, where key needs current package prefix.
+startActivity(myIntent); </pre>
+<p>The next snippet requests that a Web page be opened by specifying the VIEW action,
+ and a URI data string starting with "http://" schema:</p>
+<pre>Intent myIntent = new Intent(Intent.VIEW_ACTION, Uri.parse("http://www.google.com"));</pre>
+<p>Here is the intent filter from the AndroidManifest.xml file for com.android.browser:</p>
+<pre><intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <scheme android:name="http" />
+ <scheme android:name="https" />
+ <scheme android:name="file" />
+</intent-filter> </pre>
+<p>Android defines a number of standard values, for instance the action constants
+ defined by {@link android.content.Intent}. You can define custom values, but
+ both the caller and handler must use them. See the <intent-filter>
+ tag description in <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml
+ File</a> for more information on the manifest syntax for the handling
+ application. </p>
+<a name="returningaresult" id="returningaresult"></a><h3>Returning a Result from a Screen</h3>
+<p>A window can return a result after it closes. This result will be passed back
+ into the calling Activity's {@link android.app.Activity#onActivityResult(int,int,android.content.Intent)
+ onActivityResult()} method, which can supply an Intent containing arbitrary data, along with
+ the request code passed to startActivityForResult(). Note that you must call the {@link
+ android.app.Activity#startActivityForResult(android.content.Intent,int) startActivityForResult()}
+ method that accepts a request code parameter to get this callback. The following
+ code demonstrates opening a new screen and retrieving a result. </p>
+<pre>// Open the new screen.
+public void onClick(View v){
+ // Start the activity whose result we want to retrieve. The
+ // result will come back with request code GET_CODE.
+ Intent intent = new Intent(this, com.example.app.ChooseYourBoxer.class);
+ startActivityForResult(intent, CHOOSE_FIGHTER);
+}
+
+// Listen for results.
+protected void onActivityResult(int requestCode, int resultCode, Intent data){
+ // See which child activity is calling us back.
+ switch (resultCode) {
+ case CHOOSE_FIGHTER:
+ // This is the standard resultCode that is sent back if the
+ // activity crashed or didn't doesn't supply an explicit result.
+ if (resultCode == RESULT_CANCELED){
+ myMessageboxFunction("Fight cancelled");
+ }
+ else {
+ myFightFunction(data);
+ }
+ default:
+ break;
+ }
+}
+
+// Class SentResult
+// Temporary screen to let the user choose something.
+ private OnClickListener mLincolnListener = new OnClickListener(){
+ public void onClick(View v) {
+ Bundle stats = new Bundle();
+ stats.putString("height","6\'4\"");
+ stats.putString("weight", "190 lbs");
+ stats.putString("reach", "74\"");
+ setResult(RESULT_OK, "Lincoln", stats);
+ finish();
+ }
+ };
+
+ private OnClickListener mWashingtonListener = new OnClickListener() {
+ public void onClick(View v){
+ Bundle stats = new Bundle();
+ stats.putString("height","6\'2\"");
+ stats.putString("weight", "190 lbs");
+ stats.putString("reach", "73\"");
+ setResult(RESULT_OK, "Washington", Bundle);
+ finish();
+ }
+ };
+ </pre>
+<h3>Lifetime of the new screen </h3>
+<p>An activity can remove itself from the history stack by calling {@link android.app.Activity#finish()
+ Activity.finish()} on itself, or the activity that opened the screen can call
+ {@link android.app.Activity#finishActivity(int) Activity.finishActivity()}
+ on any screens that it opens to close them. </p>
+<a name="listening" id="listening"></a><h2>Listening for Button Clicks</h2>
+<p>Button click and other UI event capturing are covered in <a href="{@docRoot}guide/topics/ui/ui-events.html">Handling UI Events</a> on the UI Design page.</p>
+<a name="configurewindowproperties" id="configurewindowproperties"></a><h2>Configuring General Window Properties</h2>
+<p>You can set a number of general window properties, such as whether to display
+ a title, whether the window is floating, and whether it displays an icon, by
+ calling methods on the {@link android.view.Window Window} member
+ of the underlying View object for the window. Examples include calling {@link
+ android.app.Activity#getWindow() getWindow().requestFeature()} (or the convenience
+ method {@link android.app.Activity#requestWindowFeature(int) requestWindowFeature(<em>some_feature</em>)})
+ to hide the title. Here is an example of hiding the title bar:</p>
+<pre>//Hide the title bar
+requestWindowFeature(Window.FEATURE_NO_TITLE);
+</pre>
+<p>A better way to achieve the same end is to specify a theme in your Android
+Manifest file:</p>
+<pre><application android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar">
+</pre>
+<p>This is preferable because it tells the system not to show a title bar while
+your application is starting up. With the explicit method call, your application
+will have a title bar visible to the user until <code>onCreate</code> runs.</p>
+<p>(Note that this can be applied to either the <code><application></code>
+tag or to individual <code><activity></code> tags.)</p>
+<a name="localhostalias" id="localhostalias"></a><h2>Referring to localhost from the emulated environment</h2>
+<p>
+If you need to refer to your host computer's <em>localhost</em>, such as when you
+want the emulator client to contact a server running on the same host, use the alias
+<code>10.0.2.2</code> to refer to the host computer's loopback interface.
+From the emulator's perspective, localhost (<code>127.0.0.1</code>) refers to its own
+loopback interface.
+</p>
+<a name="appstate" id="appstate"></a><h2>Storing and Retrieving State</h2>
+<p>If your application is dumped from memory because of space concerns, it will lose
+ all user interface state information such as checkbox state and text box values
+ as well as class member values. Android calls {@link android.app.Activity#onSaveInstanceState(android.os.Bundle)
+ Activity.onSaveInstanceState} before it pauses the application. This method hands in a {@link
+ android.os.Bundle Bundle} that can be used to store name/value pairs that will
+ persist and be handed back to the application even if it is dropped from memory.
+ Android will pass this Bundle back to you when it calls {@link android.app.Activity#onCreate(android.os.Bundle)
+ onCreate()}. This Bundle only exists while the application is still in the history
+ stack (whether or not it has been removed from memory) and will be lost when
+ the application is finalized. See the topics for {@link android.app.Activity#onSaveInstanceState} and
+ {@link android.app.Activity#onCreate} for
+ examples of storing and retrieving state.</p>
+<p>Read more about the lifecycle of an application in <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a>.</p>
+<h3>Storing and Retrieving Larger or More Complex Persistent Data<a name="storingandretrieving" id="storingandretrieving"></a></h3>
+<p>Your application can store files or complex collection objects, and reserve them
+ for private use by itself or other activities in the application, or it can expose
+ its data to all other applications on the device. See <a href="{@docRoot}guide/topics/data/data-storage.html">Storing,
+ Retrieving, and Exposing Data</a> to learn how to store and retrieve private data,
+ how to store and retrieve common data from the device, and how to expose your
+ private data to other applications.</p>
+<a name="playback" id="playback"></a><h2>Playing Media Files</h2>
+<p>Please see the document <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a> for more details.</p>
+<a name="broadcastreceivers" id="broadcastreceivers"></a><h2>Listening For and Broadcasting Global Messages, and Setting Alarms</h2>
+<p>You can create a listening class that can be notified or even instantiated whenever
+ a specific type of system message is sent.
+</p>
+<p>The listening classes, called broadcast receivers, extend {@link android.content.BroadcastReceiver
+ BroadcastReceiver}. If you want Android to instantiate the object whenever an appropriate
+ intent notification is sent, define the receiver with a <code><receiver></code> element
+ in the AndroidManifext.xml file. If the caller is expected to instantiate the
+ object in preparation to receive a message, this is not required. The receiver
+ will get a call to their {@link android.content.BroadcastReceiver#onReceive(android.content.Context,android.content.Intent)
+ BroadcastReceiver.onReceive()} method. A receiver can define an <code><intent-filter></code> tag
+ that describes the types of messages it will receive. Just as Android's IntentResolver
+ will look for appropriate Activity matches for a startActivity() call, it will
+ look for any matching Receivers (but it will send the message to all matching
+ receivers, not to the "best" match). </p>
+<p>To send a notification, the caller creates an {@link android.content.Intent Intent}
+ object and calls {@link android.app.Activity#sendBroadcast(android.content.Intent)
+ Context.sendBroadcast()} with that Intent. Multiple recipients can receive
+ the same message. You can broadcast an Intent message to an intent receiver in
+ any application, not only your own. If the receiving class is not registered
+ using <code><receiver></code> in its manifest, you can dynamically instantiate
+ and register a receiver by calling {@link android.content.Context#registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter)
+ Context.registerReceiver()}. </p>
+<p>Receivers can include intent filters to specify what kinds of intents they are
+ listening for. Alternatively, if you expect a single known caller to contact
+ a single known receiver, the receiver does not specify an intent filter, and
+ the caller specifies the receiver's class name in the Intent by calling {@link
+ android.content.Intent#setClassName(java.lang.String, java.lang.String) Intent.setClassName()}
+ with the recipient's class name. The recipient receives a {@link android.content.Context
+ Context} object that refers to its own package, not to the package of the sender.</p>
+<p><em><strong>Note:</strong></em> If a receiver or broadcaster
+ enforces permissions, your application might need to request permission
+ to send or receive messages from that object. You can request permission by using
+ the <uses-permission> tag in the manifest. </p>
+<p>Here is a code snippet of a sender and receiver. This example does not demonstrate
+ registering receivers dynamically. For a full code example, see the AlarmService
+ class in the ApiDemos project.</p>
+<h3>Sending the message</h3>
+<pre>// We are sending this to a specific recipient, so we will
+// only specify the recipient class name.
+Intent intent = new Intent(this, AlarmReceiver.class);
+intent.putExtra("message","Wake up.");
+sendBroadcast(intent);
+</pre>
+<h3>Receiving the message</h3>
+<p><strong>Receiver AndroidManifest.xml </strong>(because there is no intent filter
+ child, this class will only receive a broadcast when the receiver class is specified
+ by name, as is done in this example):</p>
+<pre>
+<receiver class=".AlarmReceiver" /></pre>
+<p><strong>Receiver Java code: </strong></p>
+<pre>
+public class AlarmReceiver extends BroadcastReceiver{
+ // Display an alert that we've received a message.
+ @Override
+ public void onReceive(Context context, Intent intent){
+ // Send a text notification to the screen.
+ NotificationManager nm = (NotificationManager)
+ context.getSystemService(Context.NOTIFICATION_SERVICE);
+ nm.notifyWithText(R.id.alarm,
+ "Alarm!!!",
+ NotificationManager.LENGTH_SHORT,
+ null);
+ }
+} </pre>
+<h3>Other system messages</h3>
+<p>You can listen for other system messages sent by Android as well, such as USB
+ connection/removal messages, SMS arrival messages, and timezone changes. See
+ {@link android.content.Intent} for a list of broadcast messages to listen for.
+ Messages are marked "Broadcast Action" in the documentation. </p>
+<h3>Listening for phone events<a name="phoneevents" id="phoneevents"></a></h3>
+<p>The {@link android.telephony android.telephony} package overview page describes how to
+ register to listen for phone events. </p>
+<a name="alarms" id="alarms"></a><h3>Setting Alarms </h3>
+<p>Android provides an {@link android.app.AlarmManager AlarmManager} service that
+ will let you specify an Intent to send at a designated time. This intent is typically
+ used to start an application at a preset time. (Note: If you want to send
+ a notification to a sleeping or running application, use {@link android.os.Handler
+ Handler} instead.)</p>
+<a name="alerts" id="alerts"></a><h2>Displaying Alerts</h2>
+<p>There are two major kinds of alerts that you may display to the user:
+(1) Normal alerts are displayed in response to a user action, such as
+trying to perform an action that is not allowed. (2) Out-of-band alerts,
+called notifications, are
+displayed as a result of something happening in the background, such as the
+user receiving new e-mail.</p>
+
+<a name="dialogsandalerts" id="dialogsandalerts"></a><h3>Normal Alerts</h3>
+
+<p>Android provides a number of ways for you to show popup notifications to your
+ user as they interact with your application. </p>
+<table width="100%" border="1">
+ <tr>
+ <th scope="col">Class</th>
+ <th scope="col">Description</th>
+ </tr>
+ <tr>
+ <td>{@link android.app.Dialog app.Dialog}</td>
+ <td>A generic floating dialog box with a layout that you design. </td>
+ </tr>
+ <tr>
+ <td><p>{@link android.app.AlertDialog app.AlertDialog}</p></td>
+ <td>A popup alert dialog with two buttons (typically OK and Cancel) that
+ take callback handlers. See the section after this table for more details. </td>
+ </tr>
+ <tr>
+ <td>{@link android.app.ProgressDialog ProgressDialog} </td>
+ <td>A dialog box used to indicate progress of an operation with a known progress
+ value or an indeterminate length (setProgress(bool)). See <strong>Views</strong> > <strong>Progress Bar</strong> in
+ ApiDemos for examples. </td>
+ </tr>
+ <tr>
+ <td>Activity</td>
+ <td>By setting the theme of an activity to
+ {@link android.R.style#Theme_Dialog
+ android:theme="@android:style/Theme.Dialog"},
+ your activity will take on
+ the appearance of a normal dialog, floating on top of whatever was
+ underneath it. You usually set the theme through the
+ {@link android.R.attr#theme android:theme} attribute in your AndroidManifest.xml.
+ The advantage of this
+ over Dialog and AlertDialog is that Application has a much better managed
+ life cycle than dialogs: if a dialog goes to the background and is killed,
+ you cannot recapture state, whereas Application exposes a {@link android.os.Bundle
+ Bundle} of saved values in <code>onCreate()</code> to help you maintain state.</td>
+ </tr>
+</table>
+<h3>AlertDialog</h3>
+<p>This is a basic warning dialog box that lets you configure a message, button text,
+ and callback. You can create one by calling using the {@link
+ android.app.AlertDialog.Builder} class, as shown here. </p>
+<pre>private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case ACCEPT_CALL:
+ answer(msg.obj);
+ break;
+
+ case BOUNCE_TO_VOICEMAIL:
+ voicemail(msg.obj);
+ break;
+
+ }
+ }
+};
+
+
+private void IncomingMotherInlawCall(Connection c) {
+ String Text;
+
+ // "Answer" callback.
+ Message acceptMsg = Message.obtain();
+ acceptMsg.target = mHandler;
+ acceptMsg.what = ACCEPT_CALL;
+ acceptMsg.obj = c.getCall();
+
+ // "Cancel" callback.
+ final Message rejectMsg = Message.obtain();
+ rejectMsg.target = mHandler;
+ rejectMsg.what = BOUNCE_TO_VOICEMAIL;
+ rejectMsg.obj = c.getCall();
+
+ new AlertDialog.Builder(this)
+ .setMessage("Phyllis is calling")
+ .setPositiveButton("Answer", acceptMsg)
+ .setOnCanceListener(new OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ rejectMsg.sendToTarget();
+ }});
+ .show();
+} </pre>
+
+<h3>Notifications</h3>
+
+<p>Out-of-band alerts should always be displayed using the
+{@link android.app.NotificationManager}, which allows you to tell the user
+about something they may be interested in without disrupting what they are
+currently doing. A notification can be anything from a brief pop-up box
+informing the user of the new information, through displaying a persistent
+icon in the status bar, to vibrating, playing sounds, or flashing lights to
+get the user's attention. In all cases, the user must explicitly shift their
+focus to the notification before they can interact with it.</p>
+
+<p>The following code demonstrates using NotificationManager to display a basic text
+ popup when a new SMS message arrives in a listening service, and provides the
+ current message count. You can see several more examples in the ApiDemos application,
+ under app/ (named <em>notification</em>*.java).</p>
+<pre>static void setNewMessageIndicator(Context context, int messageCount){
+ // Get the static global NotificationManager object.
+ NotificationManager nm = NotificationManager.getDefault();</p>
+
+ // If we're being called because a new message has been received,
+ // then display an icon and a count. Otherwise, delete the persistent
+ // message.
+ if (messageCount > 0) {
+ nm.notifyWithText(myApp.NOTIFICATION_GUID, // ID for this notification.
+ messageCount + " new message" + messageCount > 1 ? "s":"", // Text to display.
+ NotificationManager.LENGTH_SHORT); // Show it for a short time only.
+ }
+}</pre>
+<p>To display a notification in the status bar and have it launch an intent when
+ the user selects it (such as the new text message notification does), call {@link
+ android.app.NotificationManager#notify(int, android.app.Notification) NotificationManager.notify()},
+ and pass in vibration patterns, status bar icons, or Intents to associate with
+ the notification. </p>
+<a name="progressbar" id="progressbar"></a><h2>Displaying a Progress Bar</h2>
+<p>An activity can display a progress bar to notify the user that something is happening.
+ To display a progress bar in a screen, call {@link android.app.Activity#requestWindowFeature(int)
+ Activity.requestWindowFeature(Window.FEATURE_PROGRESS)}. To set the value
+ of the progress bar, call {@link android.view.Window#setFeatureInt(int,int)
+ Activity.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, <em>level</em>)}.
+ Progress bar values are from 0 to 9,999, or set the value to 10,000 to make the
+ progress bar invisible. </p>
+<p>You can also use the {@link android.app.ProgressDialog ProgressDialog} class,
+ which enables a dialog box with an embedded progress bar to send a "I'm working
+ on it" notification to the user. </p>
+<a name="addmenuitems" id="addmenuitems"></a><h2>Adding Items to the Screen Menu</h2>
+<p>See <a href="{@docRoot}guide/topics/ui/menus.html">Creating Menus</a>.</p>
+
+<a name="webpage" id="webpage"></a><h2>Display a Web Page</h2>
+<p>Use the {@link android.webkit.WebView webkit.WebView} object. </p>
+<a name="binding" id="binding"></a><h2>Binding to Data</h2>
+<p>You can bind a ListView to a set of underlying data by using a shim class called
+ {@link android.widget.ListAdapter ListAdapter} (or a subclass). ListAdapter subclasses
+ bind to a variety of data sources, and expose a common set of methods such as
+ getItem() and getView(), and uses them to pick View items to display in its list.
+ You can extend ListAdapter and override getView() to create your own custom list
+ items. There are essentially only two steps you need to perform to bind to data: </p>
+<ol>
+ <li>Create a ListAdapter object and specify its data source</li>
+ <li>Give the ListAdapter to your ListView object.</li>
+</ol>
+<p>That's it!</p>
+<p>Here's an example of binding a ListActivity screen to the results from a cursor
+ query. (Note that the setListAdapter() method shown is a convenience method that
+ gets the page's ListView object and calls setAdapter() on it.)</p>
+<pre>// Run a query and get a Cursor pointing to the results.
+Cursor c = People.query(this.getContentResolver(), null);
+startManagingCursor(c);
+
+// Create the ListAdapter. A SimpleCursorAdapter lets you specify two interesting things:
+// an XML template for your list item, and
+// The column to map to a specific item, by ID, in your template.
+ListAdapter adapter = new SimpleCursorAdapter(this,
+ android.R.layout.simple_list_item_1, // Use a template that displays a text view
+ c, // Give the cursor to the list adapter
+ new String[] {People.NAME} , // Map the NAME column in the people database to...
+ new String[] {"text1"}); // The "text1" view defined in the XML template
+setListAdapter(adapter);</pre>
+<p>See view/List4 in the ApiDemos project for an example of extending ListAdapter
+ for a new data type. </p>
+
+<a name="handle"></a>
+
+<h2>Getting a Handle to a Screen Element</h2>
+<p>You can get a handle to a screen element by calling {@link
+android.app.Activity#findViewById(int) Activity.findViewById}. You can then use
+the handle to set or retrieve any values exposed by the object. </p>
+<a name="captureimages" id="captureimages"></a><h2>Capture Images from the Phone Camera</h2>
+<p>You can hook into the device's camera onto your own Canvas object by using the
+ {@link android.hardware.Camera Camera} class. See that class's documentation,
+ and the ApiDemos project's Camera Preview application (Graphics/Camera Preview)
+ for example code. </p>
+
+
+<a name="threading" id="threading"></a><h2>Handling Expensive Operations in the UI Thread</h2>
+<p>Avoid performing long-running operations (such as network I/O) directly in the UI thread —
+the main thread of an application where the UI is run — or your application may be blocked
+and become unresponsive. Here is a brief summary of the recommended approach for handling expensive operations:</p>
+<ol>
+<li>Create a Handler object in your UI thread</li>
+<li>Spawn off worker threads to perform any required expensive operations</li>
+<li>Post results from a worker thread back to the UI thread's handler either through a Runnable or a {@link android.os.Message}</li>
+<li>Update the views on the UI thread as needed</li>
+</ol>
+
+<p>The following outline illustrates a typical implementation:</p>
+
+<pre>
+public class MyActivity extends Activity {
+
+ [ . . . ]
+ // Need handler for callbacks to the UI thread
+ final Handler mHandler = new Handler();
+
+ // Create runnable for posting
+ final Runnable mUpdateResults = new Runnable() {
+ public void run() {
+ updateResultsInUi();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ [ . . . ]
+ }
+
+ protected void startLongRunningOperation() {
+
+ // Fire off a thread to do some work that we shouldn't do directly in the UI thread
+ Thread t = new Thread() {
+ public void run() {
+ mResults = doSomethingExpensive();
+ mHandler.post(mUpdateResults);
+ }
+ };
+ t.start();
+ }
+
+ private void updateResultsInUi() {
+
+ // Back in the UI thread -- update our UI elements based on the data in mResults
+ [ . . . ]
+ }
+}
+</pre>
+
+<p>For further discussions on this topic, see
+<a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a>
+and the {@link android.os.Handler} documentation.</p>
+
+<a name="selectingtext" id="selectingtext"></a><h2>Selecting, Highlighting, or Styling Portions of Text</h2>
+<p>You can highlight or style the formatting of strings or substrings of text in
+ a TextView object. There are two ways to do this:</p>
+<ul>
+ <li>If you use a <a href="{@docRoot}guide/topics/resources/available-resources.html#stringresources">string resource</a>,
+ you can add some simple styling, such as bold or italic using HTML notation.
+ The currently supported tags are: <code>B</code> (bold),
+ <code>I</code> (italic), <code>U</code> (underline),
+ <code>TT</code> (monospace), <code>BIG</code>, <code>SMALL</code>,
+ <code>SUP</code> (superscript), <code>SUB</code> (subscript),
+ and <code>STRIKE</code> (strikethrough).
+ So, for example, in res/values/strings.xml you could declare this:<br />
+ <code><resource><br />
+ <string>id="@+id/styled_welcome_message">We
+ are <b><i>so</i></b> glad to see you.</string><br />
+ </resources></code></li>
+ <li>To style text on the fly, or to add highlighting or more complex styling,
+ you must use the Spannable object as described next. </li>
+</ul>
+<p>To style text on the fly, you must make sure the TextView is using {@link android.text.Spannable}
+ storage for the text (this will always be true if the TextView is an EditText),
+ retrieve its text with {@link android.widget.TextView#getText}, and call {@link
+ android.text.Spannable#setSpan}, passing in a new style class from the {@link
+ android.text.style} package and the selection range. </p>
+<p>The following code snippet demonstrates creating a string with a highlighted section,
+ italic section, and bold section, and adding it to an EditText object. </p>
+<pre>// Get our EditText object.
+EditText vw = (EditText)findViewById(R.id.text);
+
+// Set the EditText's text.
+vw.setText("Italic, highlighted, bold.");
+
+// If this were just a TextView, we could do:
+// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
+// to force it to use Spannable storage so styles can be attached.
+// Or we could specify that in the XML.
+
+// Get the EditText's internal text storage
+Spannable str = vw.getText();
+
+// Create our span sections, and assign a format to each.
+str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+</pre>
+
+<a name="querymap" id="querymap"></a><h2>Utilizing attributes in a Map query</h2>
+<p>
+When using a search intent to ask the Maps activity to search for something, the Maps activity responds to the following attributes in the optional context bundle:
+</p>
+<pre>
+ float "centerLatitude" default 0.0f
+ float "centerLongitude" default 0.0f
+ float "latitudeSpan" default 0.0f
+ float "longitudeSpan" default 0.0f
+ int "zoomLevel" default 10
+</pre>
+<p>
+This context information is used to center the search result in a particular area, and is equivalent to adjusting the Map activity to the described location and zoom level before issuing the query.
+</p>
+<p>
+If the latitudeSpan, longitudeSpan, and zoomLevel attributes are not consistent, then it is undefined which one takes precedence.
+</p>
+
+<a name="filelist" id="filelist"></a><h2>List of Files for an Android Application</h2>
+<p>The following list describes the structure and files of an Android application.
+ Many of these files can be built for you (or stubbed out) by the android tool
+ shipped in the tools/ menu of the SDK. </p>
+<table width="100%" border="0">
+ <tr>
+ <td width="28%" valign="top">MyApp/<br /></td>
+ <td width="72%" valign="top"> </td>
+ </tr>
+ <tr>
+ <td valign="top"> AndroidManifest.xml</td>
+ <td valign="top">(<em>required</em>) Advertises the screens that this application provides,
+ where they can be launched (from the main program menu or elsewhere),
+ any content providers it implements and what kind of data they handle,
+ where the implementation classes are, and other application-wide
+ information. Syntax details for this file are described in <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>.</td>
+ </tr>
+ <tr>
+ <td valign="top"> src/<br />
+ /<em>myPackagePath</em>/.../<em>MyClass</em>.java</td>
+ <td valign="top">(<em>required</em>) This folder holds all the source code files for your
+ application, inside the appropriate package subfolders. </td>
+ </tr>
+ <tr>
+ <td valign="top"> res/</td>
+ <td valign="top">(<em>required</em>) This folder holds all the <em>resources</em> for
+ your application. Resources are external data files or description files
+ that are compiled into your code at build time. Files in different folders
+ are compiled differently, so you must put the proper resource into the
+ proper folder. (See <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a> for details.)</td>
+ </tr>
+ <tr>
+ <td valign="top"> anim/<br />
+ <em>animation1</em>.xml<br />
+ <em>...</em></td>
+ <td valign="top">(<em>optional</em>) Holds any animation XML description files that the
+ application uses. The format of these files is described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </td>
+ </tr>
+ <tr>
+ <td valign="top"> drawable/<br />
+ <em>some_picture</em>.png<br />
+ <em>some_stretchable</em>.9.png<br />
+ <em>some_background</em>.xml<br />
+ ...</td>
+ <td valign="top">(<em>optional</em>) Zero or more files that will be compiled to {@link
+ android.graphics.drawable android.graphics.drawable} resources. Files
+ can be image files (png, gif, or other) or XML files describing other
+ graphics such as bitmaps, stretchable bitmaps, or gradients. Supported
+ bitmap file formats are PNG (preferred), JPG, and GIF (discouraged),
+ as well as the custom 9-patch stretchable bitmap format. These formats
+ are described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </td>
+ </tr>
+ <tr>
+ <td valign="top"> layout/<br />
+ <em>screen_1_layout</em>.xml<br />
+ ...<br /></td>
+ <td valign="top">(<em>optional</em>) Holds all the XML files describing screens or parts
+ of screens. Although you could create a screen in Java, defining them
+ in XML files is typically easier. A layout file is similar in concept
+ to an HTML file that describes the screen layout and components. See <a href="{@docRoot}guide/topics/ui/index.html">User Interface</a> for more information about designing screens, and <a href="{@docRoot}guide/topics/resources/available-resources.html#layoutresources">Available Resource Types</a> for the syntax of these files.</td>
+ </tr>
+ <tr>
+ <td valign="top"> values/<br />
+ arrays<br />
+ classes.xml<br />
+ colors.xml<br />
+ dimens.xml<br />
+ strings.xml<br />
+ styles.xml<br />
+ values.xml<br /></td>
+ <td valign="top"><p>(<em>optional</em>) XML files describing additional resources
+ such as strings, colors, and styles. The naming, quantity, and number
+ of these files are not enforced--any XML file is compiled, but these
+ are the standard names given to these files. However, the syntax
+ of these files is prescribed by Android, and described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </p>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"> xml/</td>
+ <td valign="top">(<em>optional</em>) XML files that can be read at run time on the device. </td>
+ </tr>
+ <tr>
+ <td valign="top"> raw/</td>
+ <td valign="top">(<em>optional</em>) Any files to be copied directly to the device. </td>
+ </tr>
+</table>
+
+
+<a name="logging" ></a>
+<h2>Print Messages to a Log File</h2>
+
+<p>To write log messages from your application:</p>
+<ol><li>Import <code>android.util.Log</code>.</li>
+ <li>Use <code>Log.v()</code>, <code>Log.d()</code>, <code>Log.i()</code>,
+ <code>Log.w()</code>, or <code>Log.e()</code> to log messages.
+ (See the {@link android.util.Log} class.)<br/> E.g.,
+ <code>Log.e(this.toString(), "error: " + err.toString())</code></li>
+ <li>Launch <a href="{@docRoot}guide/developing/tools/ddms.html">DDMS</a> from a terminal
+ by executing <code>ddms</code> in your Android SDK <code>/tools</code> path.</li>
+ <li>Run your application in the Android emulator.</li>
+ <li>From the DDMS application, select the emulator
+ (e.g., "emulator-5554") and click <b>Device > Run logcat...</b>
+ to view all the log data.</li>
+</ol>
+<p class="note"><strong>Note:</strong> If you are running Eclipse and
+encounter a warning about the VM debug port when opening DDMS, you can ignore it
+if you're only interested in logs. However, if you want to further inspect and
+control your processes from DDMS, then you should close Eclipse before launching DDMS so that
+it may use the VM debugging port.</p>
+
+
diff --git a/docs/html/resources/faq/framework.jd b/docs/html/resources/faq/framework.jd
new file mode 100644
index 0000000..f4b8db0
--- /dev/null
+++ b/docs/html/resources/faq/framework.jd
@@ -0,0 +1,197 @@
+page.title=Android Application Framework FAQ
+parent.title=FAQs, Tips, and How-to
+parent.link=index.html
+@jd:body
+
+<ul>
+ <li><a href="#1">Do all the Activities and Services of an
+ application run in a single process?</a></li>
+ <li><a href="#2">Do all Activities run in the main thread of
+ an application process?</a></li>
+ <li><a href="#3">How do I pass complicated data structures
+ from one Activity/Service to another?</a></li>
+ <li><a href="#4">How can I check if an Activity is already
+ running before starting it?</a></li>
+ <li><a href="#5">If an Activity starts a remote service, is
+ there any way for the Service to pass a message back to the Activity?</a></li>
+ <li><a href="#6">How to avoid getting the Application not
+ responding dialog?</a></li>
+ <li><a href="#7">How does an application know if a package is
+ added or removed?</a></li>
+</ul>
+
+
+<a name="1" id="1"></a>
+
+<h2>Do all the Activities and Services of an application run in a
+single process?</h2>
+
+<p>All Activities and Services in an application run in a single process by
+default. If needed, you can declare an <code>android:process</code> attribute
+in your manifest file, to explicitly place a component (Activity/Service) in
+another process.</p>
+
+
+
+<a name="2" id="2"></a>
+
+<h2>Do all Activities run in the main thread of an application
+process?</h2>
+
+<p>By default, all of the application code in a single process runs
+in the main UI thread. This is the same thread
+that also handles UI events. The only exception is the code that handles
+IPC calls coming in from other processes. The system maintains a
+separate pool of transaction threads in each process to dispatch all
+incoming IPC calls. The developer should create separate threads for any
+long-running code, to avoid blocking the main UI thread.</p>
+
+
+
+<a name="3" id="3"></a>
+
+<h2>How do I pass data between Activities/Services within a single
+application?</h2>
+
+<p>It depends on the type of data that you want to share:</p>
+
+<h3>Primitive Data Types</h3>
+
+<p>To share primitive data between Activities/Services in an
+application, use Intent.putExtras(). For passing primitive data that
+needs to persist use the
+<a href="{@docRoot}guide/topics/data/data-storage.html#preferences">
+Preferences</a> storage mechanism.</p>
+
+<h3>Non-Persistent Objects</h3>
+
+<p>For sharing complex non-persistent user-defined objects for short
+duration, the following approaches are recommended:
+</p>
+ <h4>The android.app.Application class</h4>
+ <p>The android.app.Application is a base class for those who need to
+maintain global application state. It can be accessed via
+getApplication() from any Activity or Service. It has a couple of
+life-cycle methods and will be instantiated by Android automatically if
+your register it in AndroidManifest.xml.</p>
+
+ <h4>A public static field/method</h4>
+ <p>An alternate way to make data accessible across Activities/Services is to use <em>public static</em>
+fields and/or methods. You can access these static fields from any other
+class in your application. To share an object, the activity which creates your object sets a
+static field to point to this object and any other activity that wants to use
+this object just accesses this static field.</p>
+
+ <h4>A HashMap of WeakReferences to Objects</h4>
+ <p>You can also use a HashMap of WeakReferences to Objects with Long
+keys. When an activity wants to pass an object to another activity, it
+simply puts the object in the map and sends the key (which is a unique
+Long based on a counter or time stamp) to the recipient activity via
+intent extras. The recipient activity retrieves the object using this
+key.</p>
+
+ <h4>A Singleton class</h4>
+ <p>There are advantages to using a static Singleton, such as you can
+refer to them without casting getApplication() to an
+application-specific class, or going to the trouble of hanging an
+interface on all your Application subclasses so that your various
+modules can refer to that interface instead. </p>
+<p>But, the life cycle of a static is not well under your control; so
+to abide by the life-cycle model, the application class should initiate and
+tear down these static objects in the onCreate() and onTerminate() methods
+of the Application Class</p>
+</p>
+
+<h3>Persistent Objects</h3>
+
+<p>Even while an application appears to continue running, the system
+may choose to kill its process and restart it later. If you have data
+that you need to persist from one activity invocation to the next, you
+need to represent that data as state that gets saved by an activity when
+it is informed that it might go away.</p>
+
+<p>For sharing complex persistent user-defined objects, the
+following approaches are recommended:
+<ul>
+ <li>Application Preferences</li>
+ <li>Files</li>
+ <li>contentProviders</li>
+ <li>SQLite DB</li>
+</ul>
+</p>
+
+<p>If the shared data needs to be retained across points where the application
+process can be killed, then place that data in persistent storage like
+Application Preferences, SQLite DB, Files or ContentProviders. Please refer to
+the <a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a>
+for further details on how to use these components.</p>
+
+
+
+
+<a name="4" id="4"></a>
+
+<h2>How can I check if an Activity is already running before starting
+it?</h2>
+
+<p>The general mechanism to start a new activity if its not running—
+or to bring the activity stack to the front if is already running in the
+background— is the to use the NEW_TASK_LAUNCH flag in the startActivity()
+call.</p>
+
+
+
+<a name="5" id="5"></a>
+
+<h2>If an Activity starts a remote service, is there any way for the
+Service to pass a message back to the Activity?</h2>
+
+<p>The remote service can define a callback interface and register it with the
+clients to callback into the clients. The
+{@link android.os.RemoteCallbackList RemoteCallbackList} class provides methods to
+register and unregister clients with the service, and send and receive
+messages.</p>
+
+<p>The sample code for remote service callbacks is given in <a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">ApiDemos/RemoteService</a></p>
+
+
+
+<a name="6" id="6"></a>
+
+<h2>How to avoid getting the Application not responding dialog?</h2>
+
+<p>Please read the <a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a>
+document.</p>
+
+
+
+
+<a name="7" id="7"></a>
+
+<h2>How does an application know if a package is added or removed?
+</h2>
+
+<p>Whenever a package is added, an intent with PACKAGE_ADDED action
+is broadcast by the system. Similarly when a package is removed, an
+intent with PACKAGE_REMOVED action is broadcast. To receive these
+intents, you should write something like this:
+<pre>
+ <receiver android:name ="com.android.samples.app.PackageReceiver">
+ <intent-filter>
+ <action android:name="android.intent.action.PACKAGE_ADDED"/>
+ <action android:name="android.intent.action.PACKAGE_REMOVED"/>
+
+ <data android:scheme="package" />
+ </intent-filter>
+ </receiver>
+ </pre>
+ <br>
+Here PackageReceiver is a BroadcastReceiver class.Its onReceive()
+method is invoked, every time an application package is installed or
+removed.
+
+</p>
+
+
+
diff --git a/docs/html/resources/faq/index.jd b/docs/html/resources/faq/index.jd
new file mode 100644
index 0000000..9a2614b
--- /dev/null
+++ b/docs/html/resources/faq/index.jd
@@ -0,0 +1,11 @@
+page.title=Android FAQs
+@jd:body
+
+<dl>
+ <dt><a href="framework.html">Application Framework FAQ</a></dt>
+ <dd>Common questions about the Android Application Framework.</dd>
+ <dt><a href="licensingandoss.html">Open Source Licensing FAQ</a></dt>
+ <dd>Common topics around licensing and Android Open Source</dd>
+ <dt><a href="security.html">Android Security FAQ</a></dt>
+ <dd>Answers to common questions about Android security.</dd>
+</dl>
diff --git a/docs/html/resources/faq/licensingandoss.jd b/docs/html/resources/faq/licensingandoss.jd
new file mode 100644
index 0000000..c267fe81
--- /dev/null
+++ b/docs/html/resources/faq/licensingandoss.jd
@@ -0,0 +1,19 @@
+page.title=Android Open Source Licensing FAQ
+parent.title=FAQs, Tips, and How-to
+parent.link=index.html
+@jd:body
+
+<ul>
+ <li><a href="#mirror">Where can I find the open source components of Android?</a></li>
+ <li><a href="#timeline">When will we see more code released under open source licenses?</a></li>
+ <li><a href="#apache2">Why are you releasing the code under the Apache License instead of GPLv2?</a></li>
+</ul>
+
+<a name="mirror" id="mirror"></a><h2>Where can I find the open source components of Android?</h2>
+<p>The source code for the full Android stack is available from the <a href="http://source.android.com">Android Open Source Project </a> site.
+
+<p>Other mirrored GPL and LGPL'd components are available at <a href="http://code.google.com/p/android/downloads/list"><code>http://code.google.com/p/android/downloads/list</code></a>.</p>
+<p>Notices for other licenses can be found within the SDK.</p>
+
+<a name="apache2" id="apache2"></a><h2>Why are you releasing the code under the Apache License instead of GPLv2?</h2>
+<p>One of the best explanations for the reasoning behind releasing code under Apache2 can be found in a <a href="http://arstechnica.com/news.ars/post/20071106-why-google-chose-the-apache-software-license-over-gplv2.html">ArsTechnica article</a> by Ryan Paul.</p>
diff --git a/docs/html/resources/faq/security.jd b/docs/html/resources/faq/security.jd
new file mode 100644
index 0000000..b0d832b
--- /dev/null
+++ b/docs/html/resources/faq/security.jd
@@ -0,0 +1,156 @@
+page.title=Android Security FAQ
+parent.title=FAQs, Tips, and How-to
+parent.link=index.html
+@jd:body
+
+<ul>
+ <li><a href="#secure">Is Android Secure?</a></li>
+ <li><a href="#issue">I think I found a security flaw. How do I report
+ it?</a></li>
+ <li><a href="#informed">How can I stay informed of Android security
+ announcements?</a></li>
+ <li><a href="#use">How do I securely use my Android phone?</a></li>
+ <li><a href="#malware">I think I found malicious software being distributed
+ for Android. How can I help?</a></li>
+ <li><a href="#fixes">How will Android-powered devices receive security fixes?</a>
+ </li>
+ <li><a href="#directfix">Can I get a fix directly from the Android Platform
+ Project?</a></li>
+</ul>
+
+
+<a name="secure" id="secure"></a><h2>Is Android secure?</h2>
+
+<p>The security and privacy of our users' data is of primary importance to the
+Android Open Source Project. We are dedicated to building and maintaining one
+of the most secure mobile platforms available while still fulfilling our goal
+of opening the mobile device space to innovation and competition.</p>
+
+<p>The Android Platform provides a rich <a
+href="http://code.google.com/android/devel/security.html">security model</a>
+that allows developers to request the capabilities, or access, needed by their
+application and to define new capabilities that other applications can request.
+The Android user can choose to grant or deny an application's request for
+certain capabilities on the handset.</p>
+
+<p>We have made great efforts to secure the Android platform, but it is
+inevitable that security bugs will be found in any system of this complexity.
+Therefore, the Android team works hard to find new bugs internally and responds
+quickly and professionally to vulnerability reports from external researchers.
+</p>
+
+
+<a name="issue" id="issue"></a><h2>I think I found a security flaw. How do I
+report it?</h2>
+
+<p>You can reach the Android security team at <a
+href="mailto:security@android.com">security@android.com</a>. If you like, you
+can protect your message using our <a
+href="http://code.google.com/android/security_at_android_dot_com.txt">PGP
+key</a>.</p>
+
+<p>We appreciate researchers practicing responsible disclosure by emailing us
+with a detailed summary of the issue and keeping the issue confidential while
+users are at risk. In return, we will make sure to keep the researcher informed
+of our progress in issuing a fix and will properly credit the reporter(s) when
+we announce the patch. We will always move swiftly to mitigate or fix an
+externally-reported flaw and will publicly announce the fix once patches are
+available to users.</p>
+
+
+<a name="informed" id="informed"></a><h2>How can I stay informed of Android
+security announcements?</h2>
+
+<p>An important part of sustainably securing a platform, such as, Android is
+keeping the user and security community informed of bugs and fixes. We will
+publicly announce security bugs when the fixes are available via postings to
+the <a
+href="http://groups.google.com/group/android-security-announce">android-security-announce</a>
+group on Google Groups. You can subscribe to this group as you would a mailing
+list and view the archives here.</p>
+
+<p>For more general discussion of Android platform security, or how to use
+security features in your Android application, please subscribe to <a
+href="http://groups.google.com/group/android-security-discuss">android-security-discuss</a>.
+</p>
+
+
+<a name="use" id="use"></a><h2>How do I securely use my Android phone?</h2>
+
+<p>As an open platform, Android allows users to load software from any
+developer onto a device. As with a home PC, the user must be
+aware of who is providing the software they are downloading and must decide
+whether they want to grant the application the capabilities it requests.
+This decision can be informed by the user's judgment of the software
+developer's trustworthiness, and where the software came from.</p>
+
+<p>Despite the security protections in Android, it is important
+for users to only download and install software from developers they trust.
+More details on how Android users can make smart security decisions will be
+released when consumer devices become available.</p>
+
+
+<a name="malware" id="malware"></a><h2>I think I found malicious software being
+distributed for Android. How can I help?</h2>
+
+<p>Like any other open platform, it will be possible for unethical developers
+to create malicious software, known as <a
+href="http://en.wikipedia.org/wiki/Malware">malware</a>, for Android. If you
+think somebody is trying to spread malware, please let us know at <a
+href="mailto:security@android.com">security@android.com</a>. Please include as
+much detail about the application as possible, with the location it is
+being distributed from and why you suspect it of being malicious software.</p>
+
+<p>The term <i>malicious software</i> is subjective, and we cannot make an
+exhaustive definition. Some examples of what the Android Security Team believes
+to be malicious software is any application that:
+<ul>
+ <li>drains the device's battery very quickly;</li>
+ <li>shows the user unsolicited messages (especially messages urging the
+ user to buy something);</li>
+ <li>resists (or attempts to resist) the user's effort to uninstall it;</li>
+ <li>attempts to automatically spread itself to other devices;</li>
+ <li>hides its files and/or processes;</li>
+ <li>discloses the user's private information to a third party, without the
+ user's knowledge and consent;</li>
+ <li>destroys the user's data (or the device itself) without the user's
+ knowledge and consent;</li>
+ <li>impersonates the user (such as by sending email or buying things from a
+ web store) without the user's knowledge and consent; or</li>
+ <li>otherwise degrades the user's experience with the device.</li>
+</ul>
+</p>
+
+
+<a name="fixes" id="fixes"></a><h2>How will Android-powered devices receive security
+fixes?</h2>
+
+<p>The manufacturer of each device is responsible for distributing software
+upgrades for it, including security fixes. Many devices will update themselves
+automatically with software downloaded "over the air", while some devices
+require the user to upgrade them manually.</p>
+
+<p>When Android-powered devices are publicly available, this FAQ will provide links how
+Open Handset Alliance members release updates.</p>
+
+<a name="directfix" id="directfix"></a><h2>Can I get a fix directly from the
+Android Platform Project?</h2>
+
+<p>Android is a mobile platform that will be released as open source and
+available for free use by anybody. This means that there will be many
+Android-based products available to consumers, and most of them will be created
+without the knowledge or participation of the Android Open Source Project. Like
+the maintainers of other open source projects, we cannot build and release
+patches for the entire ecosystem of products using Android. Instead, we will
+work diligently to find and fix flaws as quickly as possible and to distribute
+those fixes to the manufacturers of the products.</p>
+
+<p>In addition, We will add security fixes to the open source distribution of
+Android and publicly announce the changes on <a
+href="http://groups.google.com/group/android-security-announce">android-security-announce</a>.
+</p>
+
+<p>If you are making an Android-powered device and would like to know how you can
+properly support your customers by keeping abreast of software updates, please
+contact us at <a
+href="mailto:info@openhandsetalliance.com">info@openhandsetalliance.com</a>.</p>
diff --git a/docs/html/resources/faq/troubleshooting.jd b/docs/html/resources/faq/troubleshooting.jd
new file mode 100644
index 0000000..f3252b0
--- /dev/null
+++ b/docs/html/resources/faq/troubleshooting.jd
@@ -0,0 +1,335 @@
+page.title=Troubleshooting
+parent.title=FAQs, Tips, and How-to
+parent.link=index.html
+@jd:body
+
+
+<p>Here are some tips and tricks for common Android errors. Don't forget to use the
+ ddms logcat capability to get a deeper view when errors occur. See <a href="{@docRoot}guide/developing/debug-tasks.html">Debugging</a> for more debugging tips. </p>
+<ul>
+ <li><a href="#installeclipsecomponents">ADT Installation Error: "requires plug-in org.eclipse.wst.sse.ui".</a></li>
+ <li><a href="#nodevice">ADB reports "no device" when an emulator is running</a></li>
+ <li><a href="#noapp">My new application/activity isn't showing up in the device application
+ list </a></li>
+ <li><a href="#noupdate">I updated my app, but the updates don't seem to be showing up on
+ the device</a></li>
+ <li><a href="#layout_wilih">I'm getting a "Binary XML file line #2: You must supply a layout_wilih
+ attribute" error when I start an application</a></li>
+ <li><a href="#permission">My request to (<em>make a call, catch an incoming SMS, receive
+ a notification, send an intent to an Android application</em>) is being
+ ignored</a></li>
+ <li><a href="#build">Help! My project won't build in Eclipse</a></li>
+ <li><a href="#eclipse">Eclipse isn't talking to the emulator</a></li>
+ <li><a href="#majorminor">When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported major.minor version 49.0.</a></li>
+ <li><a href="#apidemosreinstall">I can't install ApiDemos apps in my IDE because of a signing error</a></li>
+ <li><a href="#gesturebuilderinstall">I can't install the GestureBuilder sample
+app in the emulator</a></li>
+ <li><a href="#signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</a></li>
+ <li><a href="#manifestfiles">Unable to view manifest files from within Eclipse</a></li>
+</ul>
+
+<a name="installeclipsecomponents" id="installeclipsecomponents"></a><h2>ADT Installation Error: "requires plug-in org.eclipse.wst.sse.ui".</h2>
+<p>
+The "Android Editors" feature of the ADT Plugin requires specific Eclipse components, such as WST. If you
+encounter this error message during ADT installation, you need to install the
+required Eclipse components and then try the ADT installation again. Follow the steps below to install the required components for the
+Android Editors feature, based on the version of Eclipse that you are using.</p>
+
+<table style="font-size:100%">
+<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr>
+<tr>
+<td width="50%">
+<ol>
+<li>From the dialog where you select the <strong>Update sites to visit</strong>, select the checkboxes for both the
+ADT site, and the Callisto/Europa/Ganymede Discovery Site (you may want to
+check <strong>Automatically select mirrors</strong> at the bottom).</li>
+<li>Click <strong>Finish</strong>.</li>
+<li>In the <strong>Next</strong> dialog, select the Android Plugins.</li>
+<li>Now, expand the tree item of the discovery site. It seems that if you
+don't do it, it doesn't load the content of the discovery site.</li>
+<li>On the right, click <strong>Select required</strong>. This will select all the components
+that are required to install the Android plugin (wst, emf, etc...).</li>
+<li>Click <strong>Next</strong>, accept the agreement, click <strong>Install All</strong>, and restart Eclipse.</li>
+</ol>
+</td>
+<td>
+<ol>
+ <li>Select <strong>Help</strong> > <strong>Software Updates...</strong></li>
+ <li>Select the <strong>Installed Software</strong> tab.</li>
+ <li>Click <strong>Update...</strong></li>
+ <li>If an update for ADT is available, select it and click <strong>Finish</strong>.</li>
+</ol>
+</td>
+</tr>
+</table>
+
+
+</p>
+<a name="nodevice"></a><h2>ADB reports "no device" when an emulator is running</h2>
+ <p>Try restarting adb by stopping it (<code>adb
+ kill-server</code>) then any other adb command to restart it.</p>
+
+<a name="noapp"></a><h2>My new application/activity isn't showing up in the
+ applications list </h2>
+<ul>
+ <li>You often must restart your device or emulator before a new activity shows
+ up in the applications list. This is particularly true when it is a completely
+ new application with a new AndroidManifest.xml file.</li>
+ <li>If this is for a new activity in an existing AndroidManifest.xml file, did
+ you include an <code><activity></code> tag for your app (or a <code><service></code> tag
+ for a service, or a <code><receiver></code> tag for a receiver, etc.)? </li>
+ <li>Make sure that your AndroidManifest.xml file is valid. Errors in attribute
+ values, such as the <em>value </em> attribute in <code><action <em>value</em>="<em><something></em>"></code>
+ will often not be caught by compilers, but will prevent your application
+ from being displayed because the intent filter will not be matched. Extra
+ spaces or other characters can often sneak into these strings.</li>
+ <li>Did you send your .apk file to the device (<a href="{@docRoot}guide/developing/tools/adb.html#move">adb install</a>)?</li>
+ <li>Run logcat on your device (<code>adb logcat</code>)
+ and then install your .apk file. Check the logcat output to see whether the
+ application is being installed and recognized properly. Here's sample output
+ from a successful installation:
+<pre>I/FileObserver( 414): *** onEvent wfd: 3 mask: 8 path: MyRSSReader.apk
+D/PackageManager( 414): Scanning package: /data/app/MyRSSReader.apk
+D/PackageManager( 414): Adding package com.example.codelab.rssexample
+D/PackageManager( 414): Registered content provider: my_rss_item, className = com.example.codelab.rssexample.RssContentProvider, isSyncable = false
+D/PackageManager( 414): Providers: com.example.codelab.rssexample.RssContentProvider
+D/PackageManager( 414): Activities: com.example.codelab.rssexample.MyRssReader com.example.codelab.rssexample.MyRssReader2 </pre>
+ </li>
+ <li>If logcat shows that the package manager is having problems loading the manifest
+ file, force your manifest to be recompiled by adding a space in the file and
+ compiling it.</li>
+</ul>
+<a name="noupdate"></a><h2>I updated my app, but the updates don't seem to be showing up on the device</h2>
+ <p>Did you remember to send your .apk file to the device (<a href="{@docRoot}guide/developing/tools/adb.html#move">adb
+ install</a>)?</p>
+
+<a name="layout_wilih"></a><h2>I'm getting a "Binary XML file line #2: You must supply a layout_wilih
+ attribute" error
+ when I start an application (but I declare a layout_wilih attribute <em>right
+ there!!!</em>)</h2>
+<ul>
+ <li>Make sure that the SDK you are building with is the same version as the Android
+ OS that you are running on. </li>
+ <li>Make sure that you're calling setContentView() early in your onCreate() method.
+ Calling other methods, such as setListAdapter() before calling setContentView()
+ can sometimes create odd errors when Android tries to access screen elements
+ that haven't been set before.</li>
+</ul>
+<a name="permission"></a><h2>My request to (<em>make a call, catch an incoming SMS,
+receive a notification, send an intent to an Android application</em>) is being
+ignored</h2>
+ <p>You might not have permission (or might not have requested permission) to
+ call this activity or receive this intent. Many standard Android activities,
+ such as making a call, have a permission assigned to it to prevent arbitrary
+ applications from sending or receiving requests. See <a
+ href="{@docRoot}guide/topics/security/security.html">Security and
+ Permissions</a> for more information on permissions, and
+ {@link android.Manifest.permission Manifest.permission} for a list of
+ standard permissions supported by the Android platform.
+</p>
+<a name="build"></a><h2>Help! My project won't build in Eclipse</h2>
+<p>If your project doesn't build, you may notice symptoms such as new
+resources added in the <code>res/</code> sub-folders not showing up in the R class,
+the emulator not being started, not being able to run the application, or even seeming to run an old version of the application.</p>
+<p>To troubleshoot these types of problems, first try:</p>
+<ol>
+ <li>Switch to the DDMS view in Eclipse (if you don't already have it open):
+ <ol type="a">
+ <li>From the menu select <code>Window > Open Perspective > Other</code></li>
+ <li>Select DDMS from the list and hit OK</li>
+ </ol>
+ </li>
+ <li>In the Devices panel (top right panel by default), click on the down triangle
+ to bring up the panel menu</li>
+ <li>Select <code>Reset ADB</code> from the menu, and then try running the
+ application again</li>
+</ol>
+<p>If the above still doesn't work, you can try these steps:</p>
+<ol>
+ <li>
+ Check the console and problems tabs at the bottom of the Eclipse UI
+ </li>
+ <li>
+ If there are problems listed in either place, they should give you a clue
+ what is wrong
+ </li>
+ <li>
+ If you aren't sure if the problems are fresh or stale, clear the console
+ with a right click > Clear, then clean the project
+ </li>
+ <li>
+ To clean the project (a good idea with any kind of build error), select
+ Project > Clean from the eclipse main menu, then select the project you
+ are working on (or clean all)
+ </li>
+</ol>
+<a name="eclipse"></a><h2>Eclipse isn't talking to the emulator</h2>
+<p>When communication doesn't seem to be happening between Eclipse and the emulator, symptoms can include: nothing happening when you press run, the emulator hanging waiting
+for a debugger to connect, or errors that Eclipse reports about not being able
+to find the emulator or shell. By far the most common symptom is that when you press run, the emulator starts (or
+is already running), but the application doesn't start.</p>
+<p>
+You may find any of these steps will fix the problem and with practice you
+probably can figure out which one you need to do for your particular issue, but
+to start with, the safest option is to run through all of them in order:</p>
+<ol>
+ <li>
+ Quit the emulator if it is running
+ </li>
+ <li>
+ Check that any emulator processes are killed (sometimes they can hang, use ps on unix or mac, or task manager in the process view on
+ windows).
+ </li>
+ <li>
+ Quit Eclipse
+ </li>
+ <li>
+ From the command line, type:
+<pre>adb kill-server </pre>
+ </li>
+ <li>
+ Start Eclipse and try again
+ </li>
+</ol>
+
+<a name="majorminor"></a><h2>When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported major.minor version 49.0.</h2>
+<p>This error is displayed if you are using an older version of the JDK. Please make sure you are using JDK version 5 or 6.</p>
+
+<h2 id="apidemosreinstall">I can't install ApiDemos apps in my IDE because of a signing error</a></h2>
+
+<p>The Android system requires that all applications be signed, as described in
+ <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>. The ApiDemos
+applications included with the SDK are preinstalled on the emulator and for that reason have been
+compiled and signed with a private key.</p>
+
+If you want to modify or run one of the ApiDemos apps from Eclipse/ADT or other IDE, you can do so
+so only after you uninstall the <em>preinstalled</em> version of the app from the emulator. If
+you try to run an ApiDemos apps from your IDE without removing the preinstalled version first,
+you will get errors similar to: </p>
+
+<pre>[2008-08-13 15:14:15 - ApiDemos] Re-installation failed due to different application signatures.
+[2008-08-13 15:14:15 - ApiDemos] You must perform a full uninstall of the application. WARNING: ...This will remove the application data!
+[2008-08-13 15:14:15 - ApiDemos] Please execute 'adb uninstall com.android.samples' in a shell.</pre>
+
+<p>The error occurs because, in this case, you are attempting to install another copy of ApiDemos
+onto the emulator, a copy that is signed with a different certificate (the Android IDE tools will
+have signed the app with a debug certificate, where the existing version was already signed with
+a private certificate). The system does not allow this type of reinstallation. </p>
+
+<p>To resolve the issue, you need to fully uninstall the preinstalled and then reinstall it using
+the adb tool. Here's how to do that:</p>
+
+<ol>
+ <li>In a terminal, change to the tools directory of the SDK.</li>
+ <li>If no emulator instance is running, start an emulator using using the command <code>emulator &</code>.</li>
+ <li>Uninstall the preinstalled app using the command <code>adb uninstall com.android.samples</code>.</li>
+ <li>Reinstall the app using the command <code>adb install <path to the ApiDemos.apk></code>. If you are
+ working in Eclipse/ADT, you can just compile and run the app in the normal way. </li>
+</ol>
+
+<p>Note that if multiple emulator instances are running, you need to direct your uninstall/install
+commands to the emulator instance that you are targeting. To do that you can add the
+<code>-s <serialNumber></code> to the command, for example: </p>
+
+<pre>adb -s emulator-5556 install</pre>
+
+<p>For more information about adb, see the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a>
+documentation.</p>
+
+<h2 id="gesturebuilderinstall">I can't install the GestureBuilder sample
+app in the emulator</a></h2>
+
+<p>This is similar to the ApiDemos problem described above, except that
+you cannot fix it by uninstalling GestureBuilder from the emulator. The
+GestureBuilder app cannot be uninstalled because it is currently installed
+within the system files themselves.</p>
+
+<p><strong>Symptoms</strong></p>
+
+<ul><li><p>You cannot run GestureBuilder in the emulator:</p>
+
+<pre>[2009-12-10 14:57:19 - GestureBuilderActivity]Re-installation failed due to different application signatures.
+[2009-12-10 14:57:19 - GestureBuilderActivity]You must perform a full uninstall of the application. WARNING: This will remove the application data!
+[2009-12-10 14:57:19 - GestureBuilderActivity]Please execute 'adb uninstall com.android.gesture.builder' in a shell.</pre>
+</li>
+
+<li><p>Running <code>adb uninstall com.android.gesture.builder</code> fails:</p>
+<pre>$ adb uninstall com.android.gesture.builder
+ Failure</pre>
+</li></ul>
+
+<p>For now, the work-around is to change the sample's package name
+so that the system can install it as a new app rather than as a
+replacement for the existing GestureBuilder app. To change the
+package name, open the manifest file and modify the package attribute
+of the manifest element. Next, update imports and other references to
+the package name, rebuild the app, and run it in an AVD.</p>
+
+<p>For example, here's how you could do this in Eclipse:</p>
+
+<ol>
+ <li>Right-click on the package name
+(<code>src/com.android.gesture.builder</code>).</li>
+ <li>Select <strong>Refactor > Rename</strong> and change the name, for example to
+<code>com.android.gestureNEW.builder</code>. </li>
+ <li>Open the manifest file. Inside the <code><manifest></code>
+tag, change the package name to
+<code>com.android.gestureNEW.builder</code>.</li>
+ <li>Open each of the two Activity files and do Ctrl-Shift-O to add
+missing import packages, then save each file.</li>
+<li>Run the GestureBuilder application on the emulator.</li>
+</ol>
+
+<p>If you get an error message such as "Could not load /sdcard/gestures.
+Make sure you have a mounted SD card," be sure that your target AVD has an
+SD card. To create an AVD that has an SD card, use the
+<a href="{@docRoot}guide/developing/tools/avd.html#options"><code>-c</code>
+option</a> in the <code>android create avd</code> command.</p>
+
+<h2 id="signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</h2>
+
+<p>If your development machine uses a locale that has a non-Gregorian calendar, you may encounter problems when first trying to compile and run your application. Specifically, you may find that the Android build tools won't compile your application because the debug key is expired. </p>
+
+<p>The problem occurs because the Keytool utility — included in the JDK and used by the Android build tools — fails to properly handle non-Gregorian locales and may create validity dates that are in the past. That is, it may generate a debug key that is already expired, which results in the compile error.</p>
+
+<p>If you encounter this problem, follow these steps to work around it: </p>
+
+<ol>
+<li>First, delete the debug keystore/key already generated by the Android build tools. Specifically, delete the <code>debug.keystore</code> file. On Linux/Mac OSX, the file is stored in <code>~/.android</code>. On Windows XP, the file is stored in <code>
+C:\Documents and Settings\<user>\.android</code>. On Windows Vista, the file is stored in <code>
+C:\Users\<user>\.android</code></li>
+<li>Next, you can either
+<ul>
+<li>Temporarily change your development machine's locale (date and time) to one that uses a Gregorian calendar, for example, United States. Once the locale is changed, use the Android build tools to compile and install your app. The build tools will regenerate a new keystore and debug key with valid dates. Once the new debug key is generated, you can reset your development machine to the original locale. </li>
+<li>Alternatively, if you do not want to change your machine's locale settings, you can generate the keystore/key on any machine using the Gregorian calendar, then copy the <code>debug.keystore</code> file from that computer to the proper location on your development machine. </li>
+</ul>
+</li>
+</ol>
+
+<p>This problem has been verified on Windows and may apply to other platforms. </p>
+
+<p>For general information about signing Android applications, see
+<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>. </p>
+
+<h2 id="manifestfiles">Unable to view manifest files from within
+Eclipse</a></h2>
+
+<p>When you try to open an application's manifest file from within
+Eclipse, you might get an error such as this one:</p>
+<pre>An error has occurred. See error log for more details.
+org.eclipse.wst.sse.ui.StructuredTextEditor.isBlockSelectionModeEnabled()Z</pre>
+
+<p>Try reverting to the 3.0 version of the Eclipse XML Editors and
+Tools. If this does not work, remove the 3.1 version of the tool. To do
+this in Eclipse 3.4:</p>
+
+<ol>
+ <li>Select <strong>Help > Software Updates...</strong></li>
+ <li>Select the <strong>Installed Software</strong> tab.</li>
+ <li>Select <strong>Eclipse XML Editors and Tools</strong>.</li>
+ <li>Click <strong>Uninstall</strong>.</li>
+ <li>Click <strong>Finish</strong>.</li>
+</ol>
+
+<p>When you restart Eclipse, you should be able to view the manifest
+files. </p>
\ No newline at end of file
diff --git a/docs/html/resources/index.jd b/docs/html/resources/index.jd
new file mode 100644
index 0000000..5174dee
--- /dev/null
+++ b/docs/html/resources/index.jd
@@ -0,0 +1,38 @@
+page.title=Developer Resources
+@jd:body
+
+<p>
+This section provides technical articles, tutorials, sample code, and other
+information to help you quickly implement the features you want in your
+application.
+</p>
+
+<dl>
+<dt><b>Technical Articles</b></dt>
+<dd>Focused discussions about Android development subjects, including
+optimizations, tips, interesting implementations,
+and so on. Most of the articles provide "how-to" instructions for adding
+features or functionality to your app. The articles are drawn from posts to the
+Android Developers Blog.
+</dd>
+
+<dt><b>Tutorials</b></dt>
+<dd>Step-by-step instructions demonstrating how to build an Android application
+that has the specific features you want. </dd>
+
+<dt><b>Sample Code</b></dt>
+<dd>Fully-functioning sample applications that you can look at or build and run,
+to learn about how Android works. Feel free to reuse any of the code or
+techniques that you find in the samples!</dd>
+
+<dt><b>Community</b></dt>
+<dd>Links to the Android discussion groups and information about other ways to
+collaborate with other developers. </dd>
+
+<dt><b>More</b></dt>
+<dd>Quick development tips, troubleshooting information, and frequently asked
+questions (FAQs). </dd>
+</dl>
+
+<p>To return to this page later, just click the "Resources" tab while any
+Resources page is loaded. </p>
\ No newline at end of file
diff --git a/docs/html/resources/resources_toc.cs b/docs/html/resources/resources_toc.cs
new file mode 100644
index 0000000..f5c573e
--- /dev/null
+++ b/docs/html/resources/resources_toc.cs
@@ -0,0 +1,262 @@
+<ul>
+ <li>
+ <h2><span class="en">Community</span>
+ <span style="display:none" class="de"></span>
+ <span style="display:none" class="es">Comunidad</span>
+ <span style="display:none" class="fr">Communauté</span>
+ <span style="display:none" class="it"></span>
+ <span style="display:none" class="ja">コミュニティ</span>
+ <span style="display:none" class="zh-CN">社区</span>
+ <span style="display:none" class="zh-TW">社群</span>
+ </h2>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/community-groups.html">
+ <span class="en">Android Developer Groups</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/community-more.html">
+ <span class="en">IRC, Twitter</span>
+ </a></li>
+ </ul>
+ </li>
+
+ <li>
+ <h2><span class="en">Device Dashboard</span>
+ </h2>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/dashboard/platform-versions.html">
+ <span class="en">Platform Versions</span>
+ </a> <span class="new">new!</span></li>
+ </ul>
+ </li>
+
+ <li>
+ <h2><span class="en">Technical Articles</span>
+ </h2>
+ <ul>
+ <li class="toggle-list">
+ <div><a href="<?cs var:toroot ?>resources/articles/index.html">
+ <span class="en">List of Articles</span>
+ </a> <span class="new">new!</span></div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/articles/avoiding-memory-leaks.html">
+ <span class="en">Avoiding Memory Leaks</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/backward-compatibility.html">
+ <span class="en">Backward Compatibility</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/can-i-use-this-intent.html">
+ <span class="en">Can I Use this Intent?</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/creating-input-method.html">
+ <span class="en">Creating an Input Method</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/drawable-mutations.html">
+ <span class="en">Drawable Mutations</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/faster-screen-orientation-change.html">
+ <span class="en">Faster Screen Orientation Change</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/future-proofing.html">
+ <span class="en">Future-Proofing Your Apps</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/gestures.html">
+ <span class="en">Gestures</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/glsurfaceview.html">
+ <span class="en">Introducing GLSurfaceView</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/layout-tricks-reuse.html">
+ <span class="en">Layout Tricks: Reusing </span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/layout-tricks-efficiency.html">
+ <span class="en">Layout Tricks: Efficiency</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/layout-tricks-stubs.html">
+ <span class="en">Layout Tricks: ViewStubs </span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/layout-tricks-merge.html">
+ <span class="en">Layout Tricks: Merging </span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/listview-backgrounds.html">
+ <span class="en">ListView Backgrounds</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/live-folders.html">
+ <span class="en">Live Folders</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/on-screen-inputs.html">
+ <span class="en">Onscreen Input Methods</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/painless-threading.html">
+ <span class="en">Painless Threading</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/qsb.html">
+ <span class="en">Quick Search Box</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/touch-mode.html">
+ <span class="en">Touch Mode</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/track-mem.html">
+ <span class="en">Tracking Memory Allocations</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/ui-1.5.html">
+ <span class="en">UI Framework Changes in Android 1.5</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/ui-1.6.html">
+ <span class="en">UI Framework Changes in Android 1.6</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/timed-ui-updates.html">
+ <span class="en">Updating the UI from a Timer</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/tts.html">
+ <span class="en">Using Text-to-Speech</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/using-webviews.html">
+ <span class="en">Using WebViews</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/wikinotes-linkify.html">
+ <span class="en">WikiNotes: Linkify your Text!</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/wikinotes-intents.html">
+ <span class="en">WikiNotes: Routing Intents</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/window-bg-speed.html">
+ <span class="en">Window Backgrounds & UI Speed</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/articles/zipalign.html">
+ <span class="en">Zipalign: An Easy Optimization</span>
+ </a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <h2><span class="en">Tutorials</span>
+ <span class="de" style="display:none">Lernprogramme</span>
+ <span class="es" style="display:none">Tutoriales</span>
+ <span class="fr" style="display:none">Didacticiels</span>
+ <span class="it" style="display:none">Esercitazioni</span>
+ <span class="ja" style="display:none">チュートリアル</span>
+ <span class="zh-CN" style="display:none"></span>
+ <span class="zh-TW" style="display:none"></span>
+ </h2>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/tutorials/hello-world.html">
+ <span class="en">Hello World</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/tutorials/views/index.html">
+ <span class="en">Hello Views</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/tutorials/localization/index.html">
+ <span class="en">Hello Localization</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/tutorials/notepad/index.html">
+ <span class="en">Notepad Tutorial</span>
+ </a></li>
+ </ul>
+ </li>
+
+
+ <li>
+ <h2><span class="en">Sample Code</span>
+ <span class="de" style="display:none">Beispielcode</span>
+ <span class="es" style="display:none">Código de ejemplo</span>
+ <span class="fr" style="display:none">Exemple de code</span>
+ <span class="it" style="display:none">Codice di esempio</span>
+ <span class="ja" style="display:none">サンプル コード</span>
+ <span class="zh-CN" style="display:none"></span>
+ <span class="zh-TW" style="display:none"></span>
+ </h2>
+ <ul>
+ <li class="toggle-list">
+ <div><a href="<?cs var:toroot ?>resources/samples/index.html">
+ <span class="en">List of Sample Apps</span>
+ </a> <span class="new">new!</span></div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/samples/ApiDemos/index.html">
+ <span class="en">API Demos</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/BluetoothChat/index.html">
+ <span class="en">Bluetooth Chat</span>
+ </a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/BusinessCard/index.html">
+ <span class="en">Business Card</span>
+ </a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/ContactManager/index.html">
+ <span class="en">Contact Manager</span>
+ </a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/Home/index.html">
+ <span class="en">Home</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/JetBoy/index.html">
+ <span class="en">JetBoy</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/LunarLander/index.html">
+ <span class="en">Lunar Lander</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/MultiResolution/index.html">
+ <span class="en">Multiple Resolutions</span>
+ </a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/NotePad/index.html">
+ <span class="en">Note Pad</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/SearchableDictionary/index.html">
+ <span class="en">Searchable Dictionary</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/Snake/index.html">
+ <span class="en">Snake</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/SoftKeyboard/index.html">
+ <span class="en">Soft Keyboard</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/Wiktionary/index.html">
+ <span class="en">Wiktionary</span>
+ </a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>resources/samples/WiktionarySimple/index.html">
+ <span class="en">Wiktionary (Simplified)</span>
+ </a> <span class="new">new!</span></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+
+
+ <li>
+ <h2><span class="en">More</span>
+ </h2>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/faq/commontasks.html">
+ <span class="en">Common Tasks </span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/faq/troubleshooting.html">
+ <span class="en">Troubleshooting Tips</span>
+ </a></li>
+ <li class="toggle-list">
+ <div><a href="<?cs var:toroot ?>resources/faq/index.html">
+ <span class="en">FAQs</span>
+ </a></div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>resources/faq/framework.html">
+ <span class="en">App Framework FAQ</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/faq/licensingandoss.html">
+ <span class="en">Licensing FAQ</span>
+ </a></li>
+ <li><a href="<?cs var:toroot ?>resources/faq/security.html">
+ <span class="en">Security FAQ</span>
+ </a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+
+</ul>
+
+<script type="text/javascript">
+<!--
+ buildToggleLists();
+ changeNavLang(getLangPref());
+//-->
+</script>
diff --git a/docs/html/guide/samples/images/BluetoothChat1.png b/docs/html/resources/samples/images/BluetoothChat1.png
similarity index 100%
rename from docs/html/guide/samples/images/BluetoothChat1.png
rename to docs/html/resources/samples/images/BluetoothChat1.png
Binary files differ
diff --git a/docs/html/guide/samples/images/BluetoothChat2.png b/docs/html/resources/samples/images/BluetoothChat2.png
similarity index 100%
rename from docs/html/guide/samples/images/BluetoothChat2.png
rename to docs/html/resources/samples/images/BluetoothChat2.png
Binary files differ
diff --git a/docs/html/resources/samples/images/BusinessCard1.png b/docs/html/resources/samples/images/BusinessCard1.png
new file mode 100644
index 0000000..55ff7e5
--- /dev/null
+++ b/docs/html/resources/samples/images/BusinessCard1.png
Binary files differ
diff --git a/docs/html/resources/samples/images/BusinessCard2.png b/docs/html/resources/samples/images/BusinessCard2.png
new file mode 100644
index 0000000..347c317
--- /dev/null
+++ b/docs/html/resources/samples/images/BusinessCard2.png
Binary files differ
diff --git a/docs/html/resources/samples/images/ContactManager1.png b/docs/html/resources/samples/images/ContactManager1.png
new file mode 100644
index 0000000..d787ffd
--- /dev/null
+++ b/docs/html/resources/samples/images/ContactManager1.png
Binary files differ
diff --git a/docs/html/resources/samples/images/ContactManager2.png b/docs/html/resources/samples/images/ContactManager2.png
new file mode 100644
index 0000000..f783749
--- /dev/null
+++ b/docs/html/resources/samples/images/ContactManager2.png
Binary files differ
diff --git a/docs/html/resources/samples/images/HomeSample.png b/docs/html/resources/samples/images/HomeSample.png
new file mode 100644
index 0000000..990bebb
--- /dev/null
+++ b/docs/html/resources/samples/images/HomeSample.png
Binary files differ
diff --git a/docs/html/resources/samples/images/JetBoy.png b/docs/html/resources/samples/images/JetBoy.png
new file mode 100644
index 0000000..3da0448
--- /dev/null
+++ b/docs/html/resources/samples/images/JetBoy.png
Binary files differ
diff --git a/docs/html/guide/samples/images/MultiResolution.png b/docs/html/resources/samples/images/MultiResolution.png
similarity index 100%
rename from docs/html/guide/samples/images/MultiResolution.png
rename to docs/html/resources/samples/images/MultiResolution.png
Binary files differ
diff --git a/docs/html/resources/samples/images/SearchableDictionary1.png b/docs/html/resources/samples/images/SearchableDictionary1.png
new file mode 100644
index 0000000..ebb4604
--- /dev/null
+++ b/docs/html/resources/samples/images/SearchableDictionary1.png
Binary files differ
diff --git a/docs/html/resources/samples/images/SearchableDictionary2.png b/docs/html/resources/samples/images/SearchableDictionary2.png
new file mode 100644
index 0000000..34746cd
--- /dev/null
+++ b/docs/html/resources/samples/images/SearchableDictionary2.png
Binary files differ
diff --git a/docs/html/resources/samples/images/Snake.png b/docs/html/resources/samples/images/Snake.png
new file mode 100644
index 0000000..c5211d8
--- /dev/null
+++ b/docs/html/resources/samples/images/Snake.png
Binary files differ
diff --git a/docs/html/resources/samples/images/SoftKeyboard.png b/docs/html/resources/samples/images/SoftKeyboard.png
new file mode 100644
index 0000000..8a4ec63
--- /dev/null
+++ b/docs/html/resources/samples/images/SoftKeyboard.png
Binary files differ
diff --git a/docs/html/resources/samples/images/Wiktionary.png b/docs/html/resources/samples/images/Wiktionary.png
new file mode 100644
index 0000000..78fee7c
--- /dev/null
+++ b/docs/html/resources/samples/images/Wiktionary.png
Binary files differ
diff --git a/docs/html/resources/samples/images/WiktionarySimple.png b/docs/html/resources/samples/images/WiktionarySimple.png
new file mode 100644
index 0000000..57cd11d
--- /dev/null
+++ b/docs/html/resources/samples/images/WiktionarySimple.png
Binary files differ
diff --git a/docs/html/resources/samples/images/sample_lunarlander.png b/docs/html/resources/samples/images/sample_lunarlander.png
new file mode 100644
index 0000000..a2ff75a
--- /dev/null
+++ b/docs/html/resources/samples/images/sample_lunarlander.png
Binary files differ
diff --git a/docs/html/resources/samples/images/sample_note.png b/docs/html/resources/samples/images/sample_note.png
new file mode 100644
index 0000000..8fc9dcc
--- /dev/null
+++ b/docs/html/resources/samples/images/sample_note.png
Binary files differ
diff --git a/docs/html/resources/samples/images/sample_notepad.png b/docs/html/resources/samples/images/sample_notepad.png
new file mode 100644
index 0000000..46f2211
--- /dev/null
+++ b/docs/html/resources/samples/images/sample_notepad.png
Binary files differ
diff --git a/docs/html/resources/samples/index.jd b/docs/html/resources/samples/index.jd
new file mode 100644
index 0000000..0beb781
--- /dev/null
+++ b/docs/html/resources/samples/index.jd
@@ -0,0 +1,100 @@
+page.title=Sample Code
+@jd:body
+
+
+<p>Sometimes, the best way to learn how things are done is to look at some code.</p>
+
+<p>Here, you can browse the source of some sample Android applications. Also, each version of the
+Android platform available for the SDK includes a set of sample
+applications (which may vary between different versions of the platform).
+You can find the samples in your SDK at:</p>
+
+<p style="margin-left:2em">
+<code><em><sdk></em>/platforms/android-<em><version></em>/samples/</code>
+</p>
+
+<p>You can easily create new Android projects with these samples, modify them
+if you'd like, then run them on an emulator or device. For example, to create
+a project for the API Demos app from Eclipse,
+start a new Android Project, select "Create project from existing source", then select
+{@code ApiDemos} in the {@code samples/} directory. To create the API Demos project
+using the {@code android} tool, execute:</p>
+<pre>
+android update project -s -n API Demos -t <em><target_ID></em> -p <em><path-to-platform></em>/samples/ApiDemos/
+</pre>
+
+<p>The pages below provide an overview of each sample application (available with most
+platforms) and allow you to view the source files in your browser. </p>
+
+<div class="special">
+ <p>Some of the samples in this listing are not yet available in the
+ SDK. While we work to update the SDK, you can
+ <a href="{@docRoot}shareables/latest_samples.zip">download the latest samples</a> as a ZIP
+ archive.</p>
+</div>
+
+<dl>
+
+ <dt><a href="ApiDemos/index.html">API Demos</a></dt>
+ <dd>A variety of small applications that demonstrate an extensive collection of
+ framework topics.</dd>
+
+ <dt><a href="BluetoothChat/index.html">Bluetooth Chat</a></dt>
+ <dd>An application for two-way text messaging over Bluetooth.</dd>
+
+ <dt><a href="BusinessCard/index.html">BusinessCard</a></dt>
+ <dd>An application that demonstrates how to launch the built-in contact
+ picker from within an activity. This sample also uses reflection to ensure
+ that the correct version of the contacts API is used, depending on which
+ API level the application is running under.</dd>
+
+ <dt><a href="ContactManager/index.html">Contact Manager</a></dt>
+ <dd>An application that demonstrates how to query the system contacts provider
+ using the <code>ContactsContract</code> API, as
+ well as insert contacts into a specific account.</dd>
+
+ <dt><a href="Home/index.html">Home</a></dt>
+ <dd>A home screen replacement application.</dd>
+
+ <dt><a href="JetBoy/index.html">JetBoy</a></dt>
+ <dd>A game that demonstrates the SONiVOX JET interactive music technology,
+ with {@link android.media.JetPlayer}.</dd>
+
+ <dt><a href="LunarLander/index.html">Lunar Lander</a></dt>
+ <dd>A classic Lunar Lander game.</dd>
+
+ <dt><a href="MultiResolution/index.html">Multiple Resolutions</a></dt>
+ <dd>A sample application that shows how to use resource directory qualifiers to
+ provide different resources for different screen configurations.</dd>
+
+ <dt><a href="NotePad/index.html">Note Pad</a></dt>
+ <dd>An application for saving notes. Similar (but not identical) to the
+ <a href="{@docRoot}resources/tutorials/notepad/index.html">Notepad tutorial</a>.</dd>
+
+ <dt><a href="SearchableDictionary/index.html">Searchable Dictionary</a></dt>
+ <dd>A sample application that demonstrates Android's search framework,
+ including how to provide search suggestions for Quick Search Box.</dd>
+
+ <dt><a href="Snake/index.html">Snake</a></dt>
+ <dd>An implementation of the classic game "Snake."</dd>
+
+ <dt><a href="SoftKeyboard/index.html">Soft Keyboard</a></dt>
+ <dd>An example of writing an input method for a software keyboard.</dd>
+
+ <dt><a href="Wiktionary/index.html">Wiktionary</a></dt>
+ <dd>An example of creating interactive widgets for display on the Android
+ home screen.</dd>
+
+ <dt><a href="WiktionarySimple/index.html">Wiktionary (Simplified)</a></dt>
+ <dd>A simple Android home screen widgets example.</dd>
+</dl>
+
+
+<div class="special">
+<p>For more sample applications, check out
+<a href="http://code.google.com/p/apps-for-android/">apps-for-android</a>, a
+collection of open source applications that demonstrate various Android APIs.
+</p>
+</div>
+
+
diff --git a/docs/html/resources/tutorials/hello-world.jd b/docs/html/resources/tutorials/hello-world.jd
new file mode 100644
index 0000000..58d1a16
--- /dev/null
+++ b/docs/html/resources/tutorials/hello-world.jd
@@ -0,0 +1,564 @@
+page.title=Hello, World
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#avd">Create an AVD</a></li>
+ <li><a href="#create">Create the Project</a></li>
+ <li><a href="#ui">Construct the UI</a></li>
+ <li><a href="#run">Run the Code</a></li>
+ <li><a href="#upgrading">Upgrade the UI to an XML Layout</a></li>
+ <li><a href="#debugging">Debug Your Project</a></li>
+ <li><a href="#noeclipse">Creating the Project Without Eclipse</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>As a developer, you know that the first impression
+of a development framework is how easy it is to write "Hello,
+World." Well, on Android, it's pretty easy.
+It's particularly easy if you're using Eclipse as your IDE, because we've provided a
+great plugin that handles your project creation and management to greatly speed-up your
+development cycles.</p>
+
+<p>If you're not using Eclipse, that's okay. Familiarize yourself with
+<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>.
+You can then return to this tutorial and ignore anything about Eclipse.</p>
+
+<p>Before you start, you should already have the very latest SDK installed, and if you're using
+Eclipse, you should have installed the ADT plugin as well. If you have not installed these, see
+<a href="{@docRoot}sdk/installing.html">Installing the Android SDK</a> and return
+here when you've completed the installation.</p>
+
+<h2 id="avd">Create an AVD</h2>
+
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>To learn more about how to use AVDs and the options
+ available to you, refer to the
+ <a href="{@docRoot}guide/developing/tools/avd.html">Android
+ Virtual Devices</a> document.</p>
+ </div>
+</div>
+
+<p>In this tutorial, you will run your application in the Android Emulator.
+Before you can launch the emulator, you must create an
+Android Virtual Device (AVD). An AVD defines the system image and
+device settings used by the emulator.</p>
+
+<p>To create an AVD, use the "android" tool provided in the Android SDK.
+Open a command prompt or terminal, navigate to the
+<code>tools/</code> directory in the SDK package and execute:
+<pre>
+android create avd --target 2 --name my_avd
+</pre>
+
+<p>The tool now asks if you would like to create a custom hardware profile.
+For the time being, press Return to skip it ("no" is the default response).
+That's it. This configures an AVD named "my_avd" that uses the Android 1.5
+platform. The AVD is now ready for use in the emulator.</p>
+
+<p>In the above command, the <code>--target</code> option is required
+and specifies the deployment target to run on the emulator.
+The <code>--name</code> option is also required and defines the
+name for the new AVD.</p>
+
+
+<h2 id="create">Create a New Android Project</h2>
+
+<p>After you've created an AVD, the next step is to start a new
+Android project in Eclipse.</p>
+
+<ol>
+ <li>From Eclipse, select <strong>File > New > Project</strong>.
+ <p>If the ADT
+ Plugin for Eclipse has been successfully installed, the resulting dialog
+ should have a folder labeled "Android" which should contain
+ "Android Project". (After you create one or more Android projects, an entry for
+ "Android XML File" will also be available.)</p>
+ </li>
+
+ <li>Select "Android Project" and click <strong>Next</strong>.<br/>
+ <a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a>
+ </li>
+
+ <li>Fill in the project details with the following values:
+ <ul>
+ <li><em>Project name:</em> HelloAndroid</li>
+ <li><em>Application name:</em> Hello, Android</li>
+ <li><em>Package name:</em> com.example.helloandroid (or your own private namespace)</li>
+ <li><em>Create Activity:</em> HelloAndroid</li>
+ <li><em>Min SDK Version:</em> 2</li>
+ </ul>
+ <p>Click <strong>Finish</strong>.</p>
+
+ <a href="images/hello_world_1.png"><img src="images/hello_world_1.png" style="height:230px" alt="" /></a>
+
+ <p>Here is a description of each field:</p>
+
+ <dl>
+ <dt><em>Project Name</em></dt>
+ <dd>This is the Eclipse Project name — the name of the directory
+ that will contain the project files.</dd>
+ <dt><em>Application Name</em></dt>
+ <dd>This is the human-readable title for your application — the name that
+ will appear on the Android device.</dd>
+ <dt><em>Package Name</em></dt>
+ <dd>This is the package namespace (following the same rules as for
+ packages in the Java programming language) that you want all your source code to
+ reside under. This also sets the package name under which the stub
+ Activity will be generated.
+ <p>Your package name must be unique across
+ all packages installed on the Android system; for this reason, it's very
+ important to use a standard domain-style package for your
+ applications. The example above uses the "com.example" namespace, which is
+ a namespace reserved for example documentation —
+ when you develop your own applications, you should use a namespace that's
+ appropriate to your organization or entity.</p></dd>
+ <dt><em>Create Activity</em></dt>
+ <dd>This is the name for the class stub that will be generated by the plugin.
+ This will be a subclass of Android's {@link android.app.Activity} class. An
+ Activity is simply a class that can run and do work. It can create a UI if it
+ chooses, but it doesn't need to. As the checkbox suggests, this is optional, but an
+ Activity is almost always used as the basis for an application.</dd>
+ <dt><em>Min SDK Version</em></dt>
+ <dd>This value specifies the minimum API Level required by your application. If the API Level
+ entered here matches the API Level provided by one of the available targets,
+ then that Build Target will be automatically selected (in this case, entering
+ "2" as the API Level will select the Android 1.1 target). With each new
+ version of the Android system image and Android SDK, there have likely been
+ additions or changes made to the APIs. When this occurs, a new API Level is assigned
+ to the system image to regulate which applications are allowed to be run. If an
+ application requires an API Level that is <em>higher</em> than the level supported
+ by the device, then the application will not be installed.</dd>
+ </dl>
+
+ <p><em>Other fields</em>: The checkbox for "Use default location" allows you to change
+ the location on disk where the project's files will be generated and stored. "Build Target"
+ is the platform target that your application will be compiled against
+ (this should be selected automatically, based on your Min SDK Version).</p>
+
+ <p class="note">Notice that the "Build Target" you've selected uses the Android 1.1
+ platform. This means that your application will be compiled against the Android 1.1
+ platform library. If you recall, the AVD created above runs on the Android 1.5 platform.
+ These don't have to match; Android applications are forward-compatible, so an application
+ built against the 1.1 platform library will run normally on the 1.5 platform. The reverse
+ is not true.</p>
+ </li>
+</ol>
+
+<p>Your Android project is now ready. It should be visible in the Package
+Explorer on the left.
+Open the <code>HelloAndroid.java</code> file, located inside <em>HelloAndroid > src >
+com.example.helloandroid</em>). It should look like this:</p>
+
+<pre>
+package com.example.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>Notice that the class is based on the {@link android.app.Activity} class. An Activity is a
+single application entity that is used to perform actions. An application may have many separate
+activities, but the user interacts with them one at a time. The
+{@link android.app.Activity#onCreate(Bundle) onCreate()} method
+will be called by the Android system when your Activity starts —
+it is where you should perform all initialization and UI setup. An activity is not required to
+have a user interface, but usually will.</p>
+
+<p>Now let's modify some code! </p>
+
+
+<h2 id="ui">Construct the UI</h2>
+
+<p>Take a look at the revised code below and then make the same changes to your HelloAndroid class.
+The bold items are lines that have been added.</p>
+
+<pre>
+package com.android.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+<strong>import android.widget.TextView;</strong>
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ <strong>TextView tv = new TextView(this);
+ tv.setText("Hello, Android");
+ setContentView(tv);</strong>
+ }
+}</pre>
+
+<p class="note"><strong>Tip:</strong> An easy way to add import packages to your project is
+to press <strong>Ctrl-Shift-O</strong> (<strong>Cmd-Shift-O</strong>, on Mac). This is an Eclipse
+shortcut that identifies missing packages based on your code and adds them for you.</p>
+
+<p>An Android user interface is composed of hierarchies of objects called
+Views. A {@link android.view.View} is a drawable object used as an element in your UI layout,
+such as a button, image, or (in this case) a text label. Each of these objects is a subclass
+of the View class and the subclass that handles text is {@link android.widget.TextView}.</p>
+
+<p>In this change, you create a TextView with the class constructor, which accepts
+an Android {@link android.content.Context} instance as its parameter. A
+Context is a handle to the system; it provides services like
+resolving resources, obtaining access to databases and preferences, and so
+on. The Activity class inherits from Context, and because your
+HelloAndroid class is a subclass of Activity, it is also a Context. So, you can
+pass <code>this</code> as your Context reference to the TextView.</p>
+
+<p>Next, you define the text content with
+{@link android.widget.TextView setText(CharSequence) setText()}.</p>
+
+<p>Finally, you pass the TextView to
+{@link android.app.Activity#setContentView(View) setContentView()} in order to
+display it as the content for the Activity UI. If your Activity doesn't
+call this method, then no UI is present and the system will display a blank
+screen.</p>
+
+<p>There it is — "Hello, World" in Android! The next step, of course, is
+to see it running.</p>
+
+
+<h2 id="run">Run the Application</h2>
+
+<p>The Eclipse plugin makes it very easy to run your applications:</p>
+
+<ol>
+ <li>Select <strong>Run > Run</strong>.</li>
+ <li>Select "Android Application".</li>
+</ol>
+
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>To learn more about creating and editing run configurations in Eclipse, refer to
+ <a href="{@docRoot}guide/developing/eclipse-adt.html#RunConfig">Developing In Eclipse,
+ with ADT</a>.</p>
+ </div>
+</div>
+
+<p>The Eclipse ADT will automatically create a new run configuration for your project
+and the Android Emulator will automatically launch. Once the emulator is booted up,
+your application will appear after a moment. You should now see something like this:</p>
+
+ <a href="images/hello_world_5.png"><img src="images/hello_world_5.png" style="height:230px" alt="" /></a>
+
+<p>The "Hello, Android" you see in the grey bar is actually the application title. The Eclipse plugin
+creates this automatically (the string is defined in the <code>res/values/strings.xml</code> file and referenced
+by your <code>AndroidManifest.xml</code> file). The text below the title is the actual text that you have
+created in the TextView object.</p>
+
+<p>That concludes the basic "Hello World" tutorial, but you should continue reading for some more
+valuable information about developing Android applications.</p>
+
+
+<h2 id="upgrading">Upgrade the UI to an XML Layout</h2>
+
+<p>The "Hello, World" example you just completed uses what is called a "programmatic"
+UI layout. This means that you constructed and built your application's UI
+directly in source code. If you've done much UI programming, you're
+probably familiar with how brittle that approach can sometimes be: small
+changes in layout can result in big source-code headaches. It's also very
+easy to forget to properly connect Views together, which can result in errors in
+your layout and wasted time debugging your code.</p>
+
+<p>That's why Android provides an alternate UI construction model: XML-based
+layout files. The easiest way to explain this concept is to show an
+example. Here's an XML layout file that is identical in behavior to the
+programmatically-constructed example:</p>
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="@string/hello"/></pre>
+
+<p>The general structure of an Android XML layout file is simple: it's a tree
+of XML elements, wherein each node is the name of a View class
+(this example, however, is just one View element). You can use the
+name of any class that extends {@link android.view.View} as an element in your XML layouts,
+including custom View classes you define in your own code. This
+structure makes it very easy to quickly build up UIs, using a more simple
+structure and syntax than you would use in a programmatic layout. This model is inspired
+by the web development model, wherein you can separate the presentation of your
+application (its UI) from the application logic used to fetch and fill in data.</p>
+
+<p>In the above XML example, there's just one View element: the <code>TextView</code>,
+which has four XML attributes. Here's a summary of what they mean:</p>
+
+<table>
+ <tbody>
+ <tr>
+ <th>
+ Attribute
+ </th>
+ <th>
+ Meaning
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <code>xmlns:android</code>
+ </td>
+ <td>
+ This is an XML namespace declaration that tells the Android tools that you are going to refer to common attributes defined in the Android namespace. The outermost tag in every Android layout file must have this attribute.<br>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:layout_width</code>
+ </td>
+ <td>
+ This attribute defines how much of the available width on the screen this View should consume.
+In this case, it's the only View so you want it to take up the entire screen, which is what a value of "fill_parent" means.<br>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:layout_height</code>
+ </td>
+ <td>
+ This is just like android:layout_width, except that it refers to available screen height.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>android:text</code>
+ </td>
+ <td>
+ This sets the text that the TextView should display. In this example, you use a string
+ resource instead of a hard-coded string value.
+ The <em>hello</em> string is defined in the <em>res/values/strings.xml</em> file. This is the
+ recommended practice for inserting strings to your application, because it makes the localization
+ of your application to other languages graceful, without need to hard-code changes to the layout file.
+ For more information, see <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources
+ and Internationalization</a>.
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+
+<p>These XML layout files belong in the <code>res/layout/</code> directory of your project. The "res" is
+short for "resources" and the directory contains all the non-code assets that
+your application requires. In addition to layout files, resources also include assets
+such as images, sounds, and localized strings.</p>
+
+<div class="sidebox">
+ <h2>Landscape layout</h2>
+ <p>When you want a different design for landscape, put your layout XML file
+ inside /res/layout-land. Android will automatically look here when the layout changes.
+ Without this special landscape layout defined, Android will stretch the default layout.</p>
+</div>
+
+<p>The Eclipse plugin automatically creates one of these layout files for you: main.xml.
+In the "Hello World" application you just completed, this file was ignored and you created a
+layout programmatically. This was meant to teach you more
+about the Android framework, but you should almost always define your layout
+in an XML file instead of in your code.
+The following procedures will instruct you how to change your
+existing application to use an XML layout.</p>
+
+<ol>
+ <li>In the Eclipse Package Explorer, expand the
+<code>/res/layout/</code> folder and open <code>main.xml</code> (once opened, you might need to click
+the "main.xml" tab at the bottom of the window to see the XML source). Replace the contents with
+the following XML:
+
+<pre><?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="@string/hello"/></pre>
+<p>Save the file.</p>
+</li>
+
+<li>Inside the <code>res/values/</code> folder, open <code>strings.xml</code>.
+This is where you should save all default text strings for your user interface. If you're using Eclipse, then
+ADT will have started you with two strings, <em>hello</em> and <em>app_name</em>.
+Revise <em>hello</em> to something else. Perhaps "Hello, Android! I am a string resource!"
+The entire file should now look like this:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="hello">Hello, Android! I am a string resource!</string>
+ <string name="app_name">Hello, Android</string>
+</resources>
+</pre>
+</li>
+
+<li>Now open and modify your <code>HelloAndroid</code> class use the
+XML layout. Edit the file to look like this:
+<pre>
+package com.example.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>When you make this change, type it by hand to try the
+code-completion feature. As you begin typing "R.layout.main" the plugin will offer you
+suggestions. You'll find that it helps in a lot of situations.</p>
+
+<p>Instead of passing <code>setContentView()</code> a View object, you give it a reference
+to the layout resource.
+The resource is identified as <code>R.layout.main</code>, which is actually a compiled object representation of
+the layout defined in <code>/res/layout/main.xml</code>. The Eclipse plugin automatically creates this reference for
+you inside the project's R.java class. If you're not using Eclipse, then the R.java class will be generated for you
+when you run Ant to build the application. (More about the R class in a moment.)</p>
+</li>
+</ol>
+
+<p>Now re-run your application — because you've created a launch configuration, all
+you need to do is click the green arrow icon to run, or select
+<strong>Run > Run History > Android Activity</strong>. Other than the change to the TextView
+string, the application looks the same. After all, the point was to show that the two different
+layout approaches produce identical results.</p>
+
+<p class="note"><strong>Tip:</strong> Use the shortcut <strong>Ctrl-F11</strong>
+(<strong>Cmd-Shift-F11</strong>, on Mac) to run your currently visible application.</p>
+
+<p>Continue reading for an introduction
+to debugging and a little more information on using other IDEs. When you're ready to learn more,
+read <a href="{@docRoot}guide/topics/fundamentals.html">Application
+Fundamentals</a> for an introduction to all the elements that make Android applications work.
+Also refer to the <a href="{@docRoot}guide/index.html">Developer's Guide</a>
+introduction page for an overview of the <em>Dev Guide</em> documentation.</p>
+
+
+<div class="special">
+<h3>R class</h3>
+<p>In Eclipse, open the file named <code>R.java</code> (in the <code>gen/</code> [Generated Java Files] folder).
+It should look something like this:</p>
+
+<pre>
+package com.example.helloandroid;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class drawable {
+ public static final int icon=0x7f020000;
+ }
+ public static final class layout {
+ public static final int main=0x7f030000;
+ }
+ public static final class string {
+ public static final int app_name=0x7f040001;
+ public static final int hello=0x7f040000;
+ }
+}
+</pre>
+
+<p>A project's <code>R.java</code> file is an index into all the resources defined in the
+file. You use this class in your source code as a sort of short-hand
+way to refer to resources you've included in your project. This is
+particularly powerful with the code-completion features of IDEs like Eclipse
+because it lets you quickly and interactively locate the specific reference
+you're looking for.</p>
+
+<p>It's possible yours looks slighly different than this (perhaps the hexadecimal values are different).
+For now, notice the inner class named "layout", and its
+member field "main". The Eclipse plugin noticed the XML
+layout file named main.xml and generated a class for it here. As you add other
+resources to your project (such as strings in the <code>res/values/string.xml</code> file or drawables inside
+the <code>res/drawable/</code> direcory) you'll see <code>R.java</code> change to keep up.</p>
+<p>When not using Eclipse, this class file will be generated for you at build time (with the Ant tool).</p>
+<p><em>You should never edit this file by hand.</em></p>
+</div>
+
+<h2 id="debugging">Debug Your Project</h2>
+
+<p>The Android Plugin for Eclipse also has excellent integration with the Eclipse
+debugger. To demonstrate this, introduce a bug into
+your code. Change your HelloAndroid source code to look like this:</p>
+
+<pre>
+package com.android.helloandroid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HelloAndroid extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Object o = null;
+ o.toString();
+ setContentView(R.layout.main);
+ }
+}</pre>
+
+<p>This change simply introduces a NullPointerException into your code. If
+you run your application again, you'll eventually see this:</p>
+
+ <a href="images/hello_world_8.png"><img src="images/hello_world_8.png" style="height:230px" alt="" /></a>
+
+<p>Press "Force Quit" to terminate the application and close the emulator window.</p>
+
+<p>To find out more about the error, set a breakpoint in your source code
+on the line <code>Object o = null;</code> (double-click on the marker bar next to the source code line). Then select <strong>Run > Debug History > Hello,
+Android</strong> from the menu to enter debug mode. Your app will restart in the
+emulator, but this time it will suspend when it reaches the breakpoint you
+set. You can then step through the code in Eclipse's Debug Perspective,
+just as you would for any other application.</p>
+
+ <a href="images/hello_world_9.png"><img src="images/hello_world_9.png" style="height:230px" alt="" /></a>
+
+
+<h2 id="noeclipse">Creating the Project without Eclipse</h2>
+
+ <p>If you don't use Eclipse (such as if you prefer another IDE, or simply use text
+ editors and command line tools) then the Eclipse plugin can't help you.
+ Don't worry though — you don't lose any functionality just because you don't
+ use Eclipse.</p>
+
+ <p>The Android Plugin for Eclipse is really just a wrapper around a set of tools
+ included with the Android SDK. (These tools, like the emulator, aapt, adb,
+ ddms, and others are <a href="{@docRoot}guide/developing/tools/index.html">documented elsewhere.</a>)
+ Thus, it's possible to
+ wrap those tools with another tool, such as an 'ant' build file.</p>
+
+ <p>The Android SDK includes a tool named "android" that can be
+ used to create all the source code and directory stubs for your project, as well
+ as an ant-compatible <code>build.xml</code> file. This allows you to build your project
+ from the command line, or integrate it with the IDE of your choice.</p>
+
+ <p>For example, to create a HelloAndroid project similar to the one created
+ in Eclipse, use this command:</p>
+
+ <pre>
+android create project \
+ --package com.android.helloandroid \
+ --activity HelloAndroid \
+ --target 2 \
+ --path <em><path-to-your-project></em>/HelloAndroid
+</pre>
+
+ <p>This creates the required folders and files for the project at the location
+ defined by the <em>path</em>.</p>
+
+ <p>For more information on how to use the SDK tools to create and build projects, please read
+<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>.</p>
diff --git a/docs/html/resources/tutorials/images/hello_world_0.png b/docs/html/resources/tutorials/images/hello_world_0.png
new file mode 100644
index 0000000..330a07c
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_0.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_1.png b/docs/html/resources/tutorials/images/hello_world_1.png
new file mode 100644
index 0000000..1e5f7b0c
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_1.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_2.png b/docs/html/resources/tutorials/images/hello_world_2.png
new file mode 100644
index 0000000..3e9c58b
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_2.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_3.png b/docs/html/resources/tutorials/images/hello_world_3.png
new file mode 100644
index 0000000..22901a9
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_3.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_4.png b/docs/html/resources/tutorials/images/hello_world_4.png
new file mode 100644
index 0000000..5c41e80
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_4.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_5.png b/docs/html/resources/tutorials/images/hello_world_5.png
new file mode 100644
index 0000000..96b830a
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_5.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_8.png b/docs/html/resources/tutorials/images/hello_world_8.png
new file mode 100644
index 0000000..07db360
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_8.png
Binary files differ
diff --git a/docs/html/resources/tutorials/images/hello_world_9.png b/docs/html/resources/tutorials/images/hello_world_9.png
new file mode 100644
index 0000000..a66526a
--- /dev/null
+++ b/docs/html/resources/tutorials/images/hello_world_9.png
Binary files differ
diff --git a/docs/html/resources/tutorials/index.html b/docs/html/resources/tutorials/index.html
new file mode 100644
index 0000000..4881acf
--- /dev/null
+++ b/docs/html/resources/tutorials/index.html
@@ -0,0 +1,8 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=../index.html">
+</head>
+<body>
+<a href="../index.html">click here</a> if you are not redirected.
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/resources/tutorials/localization/index.jd b/docs/html/resources/tutorials/localization/index.jd
new file mode 100755
index 0000000..8a60814
--- /dev/null
+++ b/docs/html/resources/tutorials/localization/index.jd
@@ -0,0 +1,593 @@
+page.title=Hello, L10N
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#unlocalized">Create an Unlocalized App</a>
+ <ol>
+ <li><a href="#create">Create the Project and Layout</a></li>
+ <li><a href="#default">Create Default Resources</a></li>
+ </ol>
+ </li>
+ <li><a href="#run">Run the Unlocalized App</a></li>
+ <li><a href="#plan">Plan the Localization</a></li>
+ <li><a href="#localize">Localize the App</a>
+ <ol>
+ <li><a href="#localize_strings">Localize the Strings</a></li>
+ <li><a href="#localize_images">Localize the Images</a></li>
+ </ol>
+ </li>
+ <li><a href="#test_localized">Run and Test the Localized App</a></li>
+ </ol>
+ <h2>See also</h2>
+ <ol>
+<li>{@link android.widget.Button}</li>
+<li>{@link android.widget.TextView}</li>
+<li>{@link android.app.AlertDialog}</li>
+</ol>
+ </div>
+</div>
+
+<p>In this tutorial, we will create a Hello, L10N application that uses the
+Android framework to selectively load resources. Then we will localize the
+application by adding resources to the <code>res/</code> directory. </p>
+
+<p>This tutorial uses the practices described in the <a
+href="{@docRoot}guide/topics/resources/localization.html">Localization</a>
+document. </p>
+
+
+<h2 id="unlocalized">Create an Unlocalized Application</h2>
+
+<p>The first version of the Hello, L10N application will use only the default
+resource directories (<code>res/drawable</code>, <code>res/layout</code>, and
+<code>res/values</code>). These resources are not localized — they are the
+graphics, layout, and strings that we expect the application to use most often.
+When a user runs the application in the default locale, or in a locale that the
+application does not specifically support, the application will load resources
+from these default directories.</p>
+
+<p>The application consists of a simple user interface that displays two
+{@link android.widget.TextView} objects and a {@link android.widget.Button} image with a
+ background image of a national flag. When clicked, the button displays an
+{@link android.app.AlertDialog} object that shows additional text. </p>
+
+<h3 id="create">Create the Project and Layout</h3>
+
+<p>For this application, the default language will be British English and the
+default location the United Kingdom. </p>
+
+<ol>
+ <li>Start a new project and Activity called "HelloL10N." If you are
+using Eclipse, fill out these values in the New Android Project wizard:
+ <ul>
+ <li><em>Project name:</em> HelloL10N</li>
+ <li><em>Application name:</em> Hello, L10N</li>
+ <li><em>Package name:</em> com.example.hellol10n (or your own private
+namespace)</li>
+ <li><em>Create Activity:</em> HelloL10N</li>
+ <li><em>Min SDK Version:</em> 3</li>
+ </ul>
+ <p>The basic project contains a <code>res/</code> directory with
+subdirectories for the three most common types of resources: graphics
+(<code>res/drawable/</code>), layouts (<code>res/layout/</code>) and strings
+(<code>res/values/</code>). Most of the localization work you do later in this
+tutorial will involve adding more subdirectories to the <code>res/</code>
+directory.</p>
+ <img src="{@docRoot}images/hello_l10n/plain_project.png" alt="plain project" width="194"
+height="229">
+ </li>
+ <li>Open the <code>res/layout/main.xml</code> file and replace it with the
+following code:
+ <pre><?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ >
+<TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:text="@string/text_a"
+ />
+<TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:text="@string/text_b"
+ />
+<Button
+ android:id="@+id/flag_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ />
+</LinearLayout>
+ </pre>
+
+ <p>The LinearLayout has two {@link android.widget.TextView} objects that will
+display localized text and one {@link android.widget.Button} that shows a flag.
+</p>
+ </li>
+</ol>
+
+<h3 id="default">Create Default Resources</h3>
+
+<p>The layout refers to resources that need to be defined. </p>
+
+<ol>
+ <li>Create default text strings. To do this, open the <code>res/values/strings.xml</code> file and replace it with the following code:<br>
+ <pre><?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Hello, L10N</string>
+ <string name="text_a">Shall I compare thee to a summer"'"s day?</string>
+ <string name="text_b">Thou art more lovely and more temperate.</string>
+ <string name="dialog_title">No Localisation</string>
+ <string name="dialog_text">This dialog box"'"s strings are not localised. For every locale, the text here will come from values/strings.xml.</string>
+</resources></pre>
+
+ <p>This code provides British English text for each string that the application
+will use. When we localize this application, we will provide alternate text in
+German, French, and Japanese for some of the strings.</p>
+ </li>
+ <li>Add a default flag graphic to the <code>res/drawable</code> folder by
+saving <a href="../../../images/hello_l10n/flag.png">flag.png</a> as
+<code>res/drawable/flag.png</code>. When the application is not localized, it
+will show a British flag.<br>
+
+ </li>
+ <li>Open HelloL10N.java (in the <code>src/</code> directory) and add the
+following code inside the <code>onCreate()</code> method (after
+<code>setContentView</code>).
+
+ <pre>// assign flag.png to the button, loading correct flag image for current locale
+Button b;
+(b = (Button)findViewById(R.id.flag_button)).setBackgroundDrawable(this.getResources().getDrawable(R.drawable.flag));
+
+// build dialog box to display when user clicks the flag
+AlertDialog.Builder builder = new AlertDialog.Builder(this);
+builder.setMessage(R.string.dialog_text)
+ .setCancelable(false)
+ .setTitle(R.string.dialog_title)
+ .setPositiveButton("Done", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.dismiss();
+ }
+ });
+final AlertDialog alert = builder.create();
+
+// set click listener on the flag to show the dialog box
+b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ alert.show();
+ }
+ });</pre>
+
+ <p class="note"><strong>Tip:</strong> In Eclipse, use
+<strong>Ctrl-Shift-O</strong> (<strong>Cmd-Shift-O</strong>, on Mac) to find and
+add missing import packages to your project, then save the HelloL10N.java
+file.</p>
+
+ <p>The code that you added does the following:</p>
+
+ <ul>
+ <li>It assigns the correct flag icon to the button.
+ For now, no resources are defined other than the default, so this code
+will always assign the contents of <code>res/drawable/flag.png</code> (the
+British flag) as the flag icon, no matter what the locale. Once we add more
+flags for different locales, this code will sometimes assign a different flag.
+</li>
+ <li>It creates an {@link android.app.AlertDialog} object and sets a click listener so that when the
+user clicks the button, the AlertDialog will display.
+ We will not localize the dialog text;
+the AlertDialog will always display the <code>dialog_text</code> that is located
+within <code>res/values/strings.xml</code>. </li>
+ </ul>
+
+ </li>
+</ol>
+
+<p>The project structure now looks like this:</p>
+
+ <img src="{@docRoot}images/hello_l10n/nonlocalized_project.png" alt="nonlocalized" width="394"
+height="320">
+
+<p class="note"><strong>Tip:</strong> If you will want to run the application on
+a device and not just on an emulator, open <code>AndroidManifest.xml</code> and
+add <code>android:debuggable="true"</code> inside the
+<code><application></code> element. For information about setting up the
+device itself so it can run applications from your system, see <a
+href="{@docRoot}guide/developing/device.html">Developing on a Device</a>.</p>
+
+
+<h2 id="run">Run the Unlocalized Application</h2>
+
+<p>Save the project and run the application to see how it works. No matter what
+locale your device or emulator is set to, the application runs the same way. It
+should look something like this:</p>
+
+<table border="0" cellspacing="0" cellpadding="30">
+ <tr>
+ <th scope="col">The unlocalized application, running in any locale:</th>
+ <th scope="col">After clicking the flag, in any locale:</th>
+ </tr>
+ <tr>
+ <td valign="top"><img src="{@docRoot}images/hello_l10n/nonlocalized_screenshot1.png"
+alt="nonlocalized" width="321" height="366"></td>
+ <td><img src="{@docRoot}images/hello_l10n/nonlocalized_screenshot2.png" alt="nonlocalized2"
+width="321" height="366"></td>
+ </tr>
+</table>
+<h2 id="plan">Plan the Localization</h2>
+<p>The first step in localizing an application is to plan how the application
+will render differently in different locales. In this application, the default
+locale will be the United Kingdom. We will add some locale-specific information
+for Germany, France, Canada, Japan, and the United States. Table 1 shows the
+plan for how the application will appear in different locales.</p>
+
+<p class="caption">Table 1</p>
+
+<table border="0" cellspacing="0" cellpadding="10">
+ <tr>
+ <th scope="col" valign="bottom">Region /<br />
+ Language</th>
+ <th scope="col">United Kingdom</th>
+ <th scope="col">Germany</th>
+ <th scope="col">France</th>
+ <th scope="col">Canada</th>
+ <th scope="col">Japan</th>
+ <th scope="col">United States</th>
+ <th scope="col">Other Location</th>
+ </tr>
+ <tr>
+ <th scope="row"><br>
+ English</th>
+ <td> British English text; British flag <em>(default)</em></td>
+ <td><em>-</em></td>
+ <td><em>-</em></td>
+ <td> British English text; Canadian flag</td>
+ <td>-</td>
+ <td> British English text; U.S. flag</td>
+ <td> British English text; British flag <em>(default)</em></td>
+ </tr>
+ <tr>
+ <th scope="row">German</th>
+ <td>-</td>
+ <td>German text for <code>app_name</code>, <code>text_a</code> and
+<code>text_b</code>; German flag</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>German text for <code>app_name</code>, <code>text_a</code> and
+<code>text_b</code>; British flag</td>
+ </tr>
+ <tr>
+ <th scope="row">French</th>
+ <td>-</td>
+ <td>-</td>
+ <td>French text for <code>app_name</code>, <code>text_a</code> and
+<code>text_b</code>; French flag</td>
+ <td>French text for <code>app_name</code>, <code>text_a</code> and
+<code>text_b</code>; Canadian flag</td>
+ <td>-</td>
+ <td>-</td>
+ <td>French text for <code>app_name</code>, <code>text_a</code> and
+<code>text_b</code>; British flag</td>
+ </tr>
+ <tr>
+ <th scope="row">Japanese</th>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>Japanese text for <code>text_a</code> and <code>text_b</code>; Japanese
+flag</td>
+ <td>-</td>
+ <td>Japanese text for <code>text_a</code> and <code>text_b</code>; British
+flag</td>
+ </tr>
+ <tr>
+ <th scope="row">Other Language</th>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td>-</td>
+ <td> British English text; British flag <em>(default)</em></td>
+ </tr>
+</table>
+
+<p class="note"> Note that other behaviors are possible; for example, the
+application could support Canadian English or U.S. English text. But given the
+small amount of text involved, adding more versions of English would not make
+this application more useful.</p>
+
+<p>As shown in the table above, the plan calls for five flag icons in addition
+to the British flag that is already in the <code>res/drawable/</code> folder. It
+also calls for three sets of text strings other than the text that is in
+<code>res/values/strings.xml</code>.</p>
+
+<p>Table 2 shows where the needed text strings and flag icons will go, and
+specifies which ones will be loaded for which locales. (For more about the
+locale codes, <em></em>see <a
+href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">
+Alternate Resources</a>.)</p>
+<p class="caption" id="table2">Table 2</p>
+
+<table border="1" cellspacing="0" cellpadding="5">
+ <tr>
+ <th scope="col">Locale Code</th>
+ <th scope="col">Language / Country</th>
+ <th scope="col">Location of strings.xml</th>
+ <th scope="col">Location of flag.png</th>
+ </tr>
+ <tr>
+ <td><em>Default</em></td>
+ <td>English / United Kingdom</td>
+ <td>res/values/</td>
+ <td>res/drawable/</td>
+ </tr>
+ <tr>
+ <td>de-rDE</td>
+ <td>German / Germany</td>
+ <td>res/values-de/</td>
+ <td>res/drawable-de-rDE/</td>
+ </tr>
+ <tr>
+ <td>fr-rFR</td>
+ <td>French / France</td>
+ <td>res/values-fr/</td>
+ <td>res/drawable-fr-rFR/</td>
+ </tr>
+ <tr>
+ <td>fr-rCA</td>
+ <td>French / Canada</td>
+ <td>res/values-fr/</td>
+ <td>res/drawable-fr-rCA/</td>
+ </tr>
+ <tr>
+ <td>en-rCA</td>
+ <td>English / Canada</td>
+ <td><em>(res/values/)</em></td>
+ <td>res/drawable-en-rCA/</td>
+ </tr>
+ <tr>
+ <td>ja-rJP</td>
+ <td>Japanese / Japan</td>
+ <td>res/values-ja/</td>
+ <td>res/drawable-ja-rJP/</td>
+ </tr>
+ <tr>
+ <td>en-rUS</td>
+ <td>English / United States</td>
+ <td><em>(res/values/)</em></td>
+ <td>res/drawable-en-rUS/</td>
+ </tr>
+</table>
+
+<p class="note"><strong>Tip: </strong>A folder qualifer cannot specify a region
+without a language. Having a folder named <code>res/drawable-rCA/</code>,
+for example, will prevent the application from compiling. </p>
+
+<p>At run time, the application will select a set of resources to load based on the locale
+that is set in the user's device. In cases where no locale-specific resources
+are available, the application will fall back on the defaults. </p>
+
+<p>For example, assume that the device's language is set to German and its
+location to Switzerland. Because this application does not have a
+<code>res/drawable-de-rCH/</code> directory with a <code>flag.png</code> file in it, the system
+will fall back on the default, which is the UK flag located in
+<code>res/drawable/flag.png</code>. The language used will be German. Showing a
+British flag to German speakers in Switzerland is not ideal, but for now we will
+just leave the behavior as it is. There are several ways you could improve this
+application's behavior if you wanted to:</p>
+
+<ul>
+ <li>Use a generic default icon. In this application, it might be something
+that represents Shakespeare. </li>
+ <li>Create a <code>res/drawable-de/</code> folder that includes an icon that
+the application will use whenever the language is set to German but the location
+is not Germany. </li>
+</ul>
+
+
+<h2 id="localize">Localize the Application</h2>
+
+<h3 id="localize_strings">Localize the Strings</h3>
+
+<p>The application requires three more <code>strings.xml</code> files, one
+each for German, French, and Japanese. To create these resource files within
+Eclipse:</p>
+
+<ol>
+<li>Select <strong>File</strong> > <strong>New</strong> > <strong>Android
+XML File</strong> to open the New Android XML File wizard. You can also open
+the wizard by clicking its icon in the toolbar:<br />
+<img src="{@docRoot}images/hello_l10n/xml_file_wizard_shortcut.png"
+alt="file_wizard_shortcut" width="297"
+height="90" style="margin:15px"></li>
+ <li>Select L10N for the Project field, and type <code>strings.xml</code> into
+the File field. In the left-hand list, select Language, then click the right arrow.<br>
+<img src="{@docRoot}images/hello_l10n/xml_wizard1.png" alt="res_file_copy" width="335"
+height="406" style="margin:15px"></li>
+ <li>Type <code>de</code> in the Language box and click Finish.<br>
+ <img src="{@docRoot}images/hello_l10n/xml_wizard2.png" alt="res_file_copy" width="306"
+height="179">
+<p>A new file, <code>res/values-de/strings.xml</code>, now appears among the project
+files.</p></li>
+<li>Repeat the steps twice more, for the language codes <code>fr</code> and
+ <code>ja</code>.
+Now the project includes these new skeleton files: <br />
+ <code>res/<strong>values-de</strong>/strings.xml</code><br />
+ <code>res/<strong>values-fr</strong>/strings.xml</code><br />
+ <code>res/<strong>values-ja</strong>/strings.xml</code><br />
+ </li>
+ <li>Add localized text to the new files. To do
+this, open the <code>res/values-<em><qualifier></em>/strings.xml</code> files and
+replace the code as follows:</li>
+</ol>
+
+<table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th scope="col">File</th>
+ <th scope="col">Replace the contents with the following code:</th>
+ </tr>
+ <tr>
+ <td><code>res/values-de/strings.xml</code></td>
+ <td><pre><?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Hallo, Lokalisierung</string>
+ <string name="text_a">Soll ich dich einem Sommertag vergleichen,</string>
+ <string name="text_b">Der du viel lieblicher und sanfter bist?</string>
+</resources></pre></td>
+ </tr>
+ <tr>
+ <td><code>res/values-fr/strings.xml</code></td>
+ <td><pre><?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Bonjour, Localisation</string>
+ <string name="text_a">Irai-je te comparer au jour d'été?</string>
+ <string name="text_b">Tu es plus tendre et bien plus tempéré.</string>
+</resources> </pre></td>
+ </tr>
+ <tr>
+ <td><code>res/values-ja/strings.xml</code></td>
+ <td>
+<pre><?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="text_a">あなたをなにかにたとえるとしたら夏の一日でしょうか?</string>
+ <string name="text_b">だがあなたはもっと美しく、もっとおだやかです。</string>
+</resources></pre></td>
+ </tr>
+</table>
+
+<p class="note"><b>Tip:</b> In the
+<code>values-<em><qualifier></em>/strings.xml</code> files, you only need to
+include text for strings that are different from the default strings. For
+example, when the application runs on a device that is configured for Japanese,
+the plan is for <code>text_a</code> and <code>text_b</code> to be in Japanese
+while all the other text is in English, so
+<code>res/values-ja/strings.xml</code> only needs to include <code>text_a</code>
+and <code>text_b</code>.</p>
+
+<h3 id="localize_images">Localize the Images</h3>
+
+<p>As shown in <a href="#table2">Table 2</a>, the application needs six more
+drawable folders, each containing a <code>flag.png</code> icon. Add the needed
+icons and folders to your project:</p>
+
+<ol>
+ <li>Save this <a href="../../../images/hello_l10n/drawable-de-rDE/flag.png">German flag icon</a>
+as <code>res/drawable-de-rDE/flag.png</code> in the application's project
+workspace.
+ <p>For example:</p>
+ <ol>
+ <li>Click the link to open the flag image.</li>
+ <li>Save the image in
+<code><em>your-workspace</em>/HelloL10N/res/drawable-de-rDE/</code> .</li>
+ </ol>
+ </li>
+ <li>Save this <a href="../../../images/hello_l10n/drawable-fr-rFR/flag.png">French flag icon</a>
+as <code>res/drawable-fr-rFR/flag.png</code> in the application's project
+workspace. </li>
+ <li>Save this <a href="../../../images/hello_l10n/drawable-fr-rCA/flag.png">Canadian flag icon</a>
+as <code>res/drawable-fr-rCA/flag.png</code> in the project workspace. </li>
+ <li>Save the <a href="../../../images/hello_l10n/drawable-en-rCA/flag.png">Canadian flag icon</a>
+again, this time as <code>res/drawable-en-rCA/flag.png</code> in the project
+workspace. (Why not have just <em>one</em> folder that contains the Canadian
+flag? Because a folder qualifer cannot specify a region without a language.
+You cannot have a folder named <code>drawable-rCA/</code>; instead you must
+create two separate folders, one for each of the Canadian languages represented
+in the application.)</li>
+ <li>Save this <a href="../../../images/hello_l10n/drawable-ja-rJP/flag.png">Japanese flag icon</a>
+as <code>res/drawable-ja-rJP/flag.png</code> in the project workspace. </li>
+ <li>Save this <a href="../../../images/hello_l10n/drawable-en-rUS/flag.png">United States flag
+icon</a> as <code>res/drawable-en-rUS/flag.png</code> in the project workspace.
+ </li>
+</ol>
+
+<p>If you are using Eclipse, refresh the project (F5). The new
+<code>res/drawable-<em><qualifier></em>/</code> folders should appear in the
+project view. </p>
+
+
+<h2 id="test_localized">Run and Test the Localized Application</h2>
+
+<p>Once you've added the localized string and image resources, you are ready to
+ run the application and test its handling of them. To change the locale
+ on a device or in the emulator, use the Settings
+application (Home > Menu > Settings > Locale & text > Select
+locale). Depending on how a device was configured, it might not offer any
+alternate locales via the Settings application, or might offer only a few. The
+emulator, on the other hand, will offer a selection of all the locales that are
+available in the Android system image. </p>
+
+<p>To set the emulator to a locale that is not available in the system image,
+use the Custom Locale application, which is available in the Application
+tab:</p>
+
+<p><img src="{@docRoot}images/hello_l10n/custom_locale_app.png" alt="custom locale app" width="163"
+height="158" style="margin-left:15px"></p>
+
+<p>To switch to a new locale, long-press a locale name:</p>
+
+<p><img src="{@docRoot}images/hello_l10n/using_custom_locale.png" alt="using custom locale"
+width="512" height="299" style="margin-left:15px"></p>
+
+<p>For a list of locales available on different versions of the Android platform,
+refer to the platform notes documents, listed under "Downloadable SDK Components"
+in the "SDK" tab. For example, <a
+href="{@docRoot}sdk/android-2.0.html#locs">Android 2.0 locales</a>.</p>
+
+<p>Run the application for each of the expected locales, plus one unexpected
+locale. Here are some of the results you should see:</p>
+
+<table border="0" cellspacing="0" cellpadding="05">
+ <tr>
+ <th scope="col">Locale</th>
+ <th scope="col">Opening screen of application</th>
+ </tr>
+ <tr>
+ <td>German / Germany
+ <br />Specifically supported by the Hello, L10N application.</td>
+ <td><img src="{@docRoot}images/hello_l10n/german_screenshot.png" alt="custom locale app"
+width="321" height="175" align="right"
+style="margin-left:10px;margin-right:20px"></td>
+ </tr>
+ <tr>
+ <td>French / Canada
+ <br />Specifically supported by the Hello, L10N application.</td>
+ <td><img src="{@docRoot}images/hello_l10n/frenchCA_screenshot.png" alt="custom locale app"
+width="321" height="175" align="right"
+style="margin-left:10px;margin-right:20px"></td>
+ </tr>
+ <tr>
+ <td>German / Switzerland
+ <br />Only the language is specifically supported by
+the Hello, L10N application.</td>
+ <td><img src="{@docRoot}images/hello_l10n/germanCH_screenshot.png" alt="custom locale app"
+width="321" height="175" align="right"
+style="margin-left:10px;margin-right:20px">`</td>
+ </tr>
+ <tr>
+ <td>Japanese
+ <br />Specifically supported by the Hello, L10N application.
+ </td>
+ <td><img src="{@docRoot}images/hello_l10n/japanese_screenshot.png" alt="custom locale app"
+width="321" height="220" align="right"
+style="margin-left:10px;margin-right:20px">`</td>
+ </tr>
+ <tr>
+ <td>Romansh / Switzerland (custom locale <code>rm_CH</code>)
+ <br />Not specifically supported by the Hello, L10N
+application, so the application uses the default resources.</td>
+ <td><img src="{@docRoot}images/hello_l10n/romanshCH_screenshot.png" alt="custom locale app"
+width="321" height="175" align="right"
+style="margin-left:10px;margin-right:20px"></td>
+ </tr>
+</table>
diff --git a/docs/html/resources/tutorials/notepad/codelab/NotepadCodeLab.zip b/docs/html/resources/tutorials/notepad/codelab/NotepadCodeLab.zip
new file mode 100644
index 0000000..502a326
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/codelab/NotepadCodeLab.zip
Binary files differ
diff --git a/docs/html/resources/tutorials/notepad/index.jd b/docs/html/resources/tutorials/notepad/index.jd
new file mode 100644
index 0000000..f569314
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/index.jd
@@ -0,0 +1,142 @@
+page.title=Notepad Tutorial
+@jd:body
+
+
+<p>This tutorial on writing a notepad application gives you a "hands-on" introduction
+to the Android framework and the tools you use to build applications on it.
+Starting from a preconfigured project file, it guides you through the process of
+developing a simple notepad application and provides concrete examples of how to
+set up the project, develop the application logic and user interface, and then
+compile and run the application. </p>
+
+<p>The tutorial presents the application development as a set of
+exercises (see below), each consisting of several steps. You should follow
+the steps in each exercise to gradually build and refine your
+application. The exercises explain each step in detail and provide all the
+sample code you need to complete the application. </p>
+
+<p>When you are finished with the tutorial, you will have created a functioning
+Android application and will have learned many of the most important
+concepts in Android development. If you want to add more complex features to
+your application, you can examine the code in an alternative implementation
+of a Note Pad application, in the
+<a href="{@docRoot}resources/samples/index.html">Sample Code</a> section. </p>
+
+
+<a name="who"></a>
+<h2>Who Should Use this Tutorial</h2>
+
+<p>This tutorial is designed for experienced developers, especially those with
+knowledge of the Java programming language. If you haven't written Java
+applications before, you can still use the tutorial, but you might need to work
+at a slower pace. </p>
+
+<p>Also note that this tutorial uses
+the Eclipse development environment, with the Android plugin installed. If you
+are not using Eclipse, you can follow the exercises and build the application,
+but you will need to determine how to accomplish the Eclipse-specific
+steps in your environment. </p>
+
+<a name="preparing"></a>
+<h2>Preparing for the Exercises</h2>
+
+<p>The tutorial assumes that you have some familiarity with basic Android
+application concepts and terminology. If you are not, you
+should read <a href="{@docRoot}guide/topics/fundamentals.html">Application
+Fundamentals</a> before continuing. </p>
+
+<p>This tutorial also builds on the introductory information provided in the
+<a href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a>
+tutorial, which explains how to set up your Eclipse environment
+for building Android applications. We recommend you complete the Hello World
+tutorial before starting this one.</p>
+
+<p>To prepare for this lesson:</p>
+
+<ol>
+ <li>Download the <a href="codelab/NotepadCodeLab.zip">project
+ exercises archive (.zip)</a>.</li>
+ <li>Unpack the archive file to a suitable location on your machine.</li>
+ <li>Open the <code>NotepadCodeLab</code> folder.</li>
+</ol>
+
+<p>Inside the <code>NotepadCodeLab</code> folder, you should see six project
+files: <code>Notepadv1</code>,
+ <code>Notepadv2</code>, <code>Notepadv3</code>,
+ <code>Notepadv1Solution</code>, <code>Notepadv2Solution</code>
+ and <code>Notepadv3Solution</code>. The <code>Notepadv#</code> projects are
+the starting points for each of the exercises, while the
+<code>Notepadv#Solution</code> projects are the exercise
+ solutions. If you are having trouble with a particular exercise, you
+ can compare your current work against the exercise solution.</p>
+
+<a name="exercises"></a>
+<h2> Exercises</h2>
+
+ <p>The table below lists the tutorial exercises and describes the development
+areas that each covers. Each exercise assumes that you have completed any
+previous exercises.</p>
+
+ <table border="0" style="padding:4px;spacing:2px;" summary="This
+table lists the
+tutorial examples and describes what each covers. ">
+ <tr>
+ <th width="120"><a href="{@docRoot}resources/tutorials/notepad/notepad-ex1.html">Exercise
+1</a></th>
+ <td>Start here. Construct a simple notes list that lets the user add new notes but not
+edit them. Demonstrates the basics of <code>ListActivity</code> and creating
+and handling
+ menu options. Uses a SQLite database to store the notes.</td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}resources/tutorials/notepad/notepad-ex2.html">Exercise 2</a></th>
+ <td>Add a second Activity to the
+application. Demonstrates constructing a
+new Activity, adding it to the Android manifest, passing data between the
+activities, and using more advanced screen layout. Also shows how to
+invoke another Activity to return a result, using
+<code>startActivityForResult()</code>.</td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}resources/tutorials/notepad/notepad-ex3.html">Exercise 3</a></th>
+ <td>Add handling of life-cycle events to
+the application, to let it
+maintain application state across the life cycle. </td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}resources/tutorials/notepad/notepad-extra-credit.html">Extra
+Credit</a></th>
+ <td>Demonstrates how to use the Eclipse
+debugger and how you can use it to
+view life-cycle events as they are generated. This section is optional but
+highly recommended.</td>
+ </tr>
+</table>
+
+
+<a name="other"></a>
+<h2>Other Resources and Further Learning</h2>
+<ul>
+<li>For a lighter but broader introduction to concepts not covered in the
+tutorial,
+take a look at <a href="{@docRoot}resources/faq/commontasks.html">Common Android Tasks</a>.</li>
+<li>The Android SDK includes a variety of fully functioning sample applications
+that make excellent opportunities for further learning. You can find the sample
+applications in the <code>samples/</code> directory of your downloaded SDK, or browser them
+here, in the <a href="{@docRoot}resources/samples/index.html">Sample Code</a> section.</li>
+<li>This tutorial draws from the full Notepad application included in the
+<code>samples/</code> directory of the SDK, though it does not match it exactly.
+When you are done with the tutorial,
+it is highly recommended that you take a closer look at this version of the Notepad
+application,
+as it demonstrates a variety of interesting additions for your application,
+such as:</li>
+ <ul>
+ <li>Setting up a custom striped list for the list of notes.</li>
+ <li>Creating a custom text edit view that overrides the <code>draw()</code>
+ method to make it look like a lined notepad.</li>
+ <li>Implementing a full <code>ContentProvider</code> for notes.</li>
+ <li>Reverting and discarding edits instead of just automatically saving
+ them.</li>
+ </ul>
+</ul>
diff --git a/docs/html/resources/tutorials/notepad/notepad-ex1.jd b/docs/html/resources/tutorials/notepad/notepad-ex1.jd
new file mode 100644
index 0000000..b26440b
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/notepad-ex1.jd
@@ -0,0 +1,591 @@
+page.title=Notepad Exercise 1
+parent.title=Notepad Tutorial
+parent.link=index.html
+@jd:body
+
+
+<p><em>In this exercise, you will construct a simple notes list that lets the
+user add new notes but not edit them. The exercise demonstrates:</em></p>
+<ul>
+<li><em>The basics of <code>ListActivities</code> and creating and handling menu
+options. </em></li>
+<li><em>How to use a SQLite database to store the notes.</em></li>
+<li><em>How to bind data from a database cursor into a ListView using a
+SimpleCursorAdapter.</em></li>
+<li><em>The basics of screen layouts, including how to lay out a list view, how
+you can add items to the activity menu, and how the activity handles those menu
+selections. </em></li>
+</ul>
+
+<div style="float:right;white-space:nowrap">
+<span style="color:#BBB;">
+ [<a href="notepad-ex1.html" style="color:#BBB;">Exercise 1</a>]</span>
+ [<a href="notepad-ex2.html">Exercise 2</a>]
+ [<a href="notepad-ex3.html">Exercise 3</a>]
+ [<a href="notepad-extra-credit.html">Extra Credit</a>]
+</div>
+
+
+
+<h2>Step 1</h2>
+
+ <p>Open up the <code>Notepadv1</code> project in Eclipse.</p>
+
+ <p><code>Notepadv1</code> is a project that is provided as a starting point. It
+ takes care of some of the boilerplate work that you have already seen if you
+ followed the <a href="{@docRoot}resources/tutorials/hello-world.html">Hello,
+ World</a> tutorial.</p>
+
+ <ol>
+ <li>
+ Start a new Android Project by clicking <strong>File</strong> >
+ <strong>New</strong> > <strong>Android Project</strong>.</li>
+ <li>
+ In the New Android Project dialog, select <strong>Create project from existing source</strong>.</li>
+ <li>
+ Click <strong>Browse</strong> and navigate to where you copied the <code>NotepadCodeLab</code>
+ (downloaded during <a href="{@docRoot}resources/tutorials/notepad/index.html#preparing">setup</a>)
+ and select <code>Notepadv1</code>.</li>
+ <li>
+ The Project Name and other properties should be automatically filled for you.
+ You must select the Build Target—we recommend selecting a target with the
+ lowest platform version available. Also add an integer to the Min SDK Version field
+ that matches the API Level of the selected Build Target.</li>
+ <li>
+ Click <strong>Finish</strong>. The <code>Notepadv1</code> project should open and be
+ visible in your Eclipse package explorer.</li>
+ </ol>
+
+ <p>If you see an error about <code>AndroidManifest.xml</code>, or some
+ problems related to an Android zip file, right click on the project and
+ select <strong>Android Tools</strong> > <strong>Fix Project Properties</strong>.
+ (The project is looking in the wrong location for the library file,
+ this will fix it for you.)</p>
+
+ <h2>Step 2</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">Accessing and modifying data</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0; padding:.0em .5em .5em 1em;">For this
+ exercise, we are using a SQLite database to store our data. This is useful
+ if only <em>your</em> application will need to access or modify the data. If you wish for
+ other activities to access or modify the data, you have to expose the data using a
+ {@link android.content.ContentProvider ContentProvider}.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">If you are interested, you can find out more about
+ <a href="{@docRoot}guide/topics/providers/content-providers.html">content providers</a> or the whole
+ subject of <a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a>.
+ The NotePad sample in the <code>samples/</code> folder of the SDK also has an example of how
+ to create a ContentProvider.</p>
+ </div>
+
+ <p>Take a look at the <code>NotesDbAdapter</code> class — this class is provided to
+ encapsulate data access to a SQLite database that will hold our notes data
+ and allow us to update it.</p>
+ <p>At the top of the class are some constant definitions that will be used in the application
+ to look up data from the proper field names in the database. There is also a database creation
+ string defined, which is used to create a new database schema if one doesn't exist already.</p>
+ <p>Our database will have the name <code>data</code>, and have a single table called
+ <code>notes</code>, which in turn has three fields: <code>_id</code>, <code>title</code> and
+ <code>body</code>. The <code>_id</code> is named with an underscore convention used in a number of
+ places inside the Android SDK and helps keep a track of state. The <code>_id</code>
+ usually has to be specified when querying or updating the database (in the column projections
+ and so on). The other two fields are simple text fields that will store data.
+ </p>
+ <p>The constructor for <code>NotesDbAdapter</code> takes a Context, which allows it to communicate with aspects
+ of the Android operating system. This is quite common for classes that need to touch the
+ Android system in some way. The Activity class implements the Context class, so usually you will just pass
+ <code>this</code> from your Activity, when needing a Context.</p>
+ <p>The <code>open()</code> method calls up an instance of DatabaseHelper, which is our local
+ implementation of the SQLiteOpenHelper class. It calls <code>getWritableDatabase()</code>,
+ which handles creating/opening a database for us.</p>
+ <p><code>close()</code> just closes the database, releasing resources related to the
+ connection.</p>
+ <p><code>createNote()</code> takes strings for the title and body of a new note,
+ then creates that note in the database. Assuming the new note is created successfully, the
+ method also returns the row <code>_id</code> value for the newly created note.</p>
+ <p><code>deleteNote()</code> takes a <var>rowId</var> for a particular note, and deletes that note from
+ the database.</p>
+
+ <p><code>fetchAllNotes()</code> issues a query to return a {@link android.database.Cursor} over all notes in the
+ database. The <code>query()</code> call is worth examination and understanding. The first field is the
+ name of the database table to query (in this case <code>DATABASE_TABLE</code> is "notes").
+ The next is the list of columns we want returned, in this case we want the <code>_id</code>,
+ <code>title</code> and <code>body</code> columns so these are specified in the String array.
+ The remaining fields are, in order: <code>selection</code>,
+ <code>selectionArgs</code>, <code>groupBy</code>, <code>having</code> and <code>orderBy</code>.
+ Having these all <code>null</code> means we want all data, need no grouping, and will take the default
+ order. See {@link android.database.sqlite.SQLiteDatabase SQLiteDatabase} for more details.</p>
+ <p class="note"><b>Note:</b> A Cursor is returned rather than a collection of rows. This allows
+ Android to use resources efficiently -- instead of putting lots of data straight into memory
+ the cursor will retrieve and release data as it is needed, which is much more efficient for
+ tables with lots of rows.</p>
+
+ <p><code>fetchNote()</code> is similar to <code>fetchAllNotes()</code> but just gets one note
+ with the <var>rowId</var> we specify. It uses a slightly different version of the
+ {@link android.database.sqlite.SQLiteDatabase} <code>query()</code> method.
+ The first parameter (set <em>true</em>) indicates that we are interested
+ in one distinct result. The <var>selection</var> parameter (the fourth parameter) has been specified to search
+ only for the row "where _id =" the <var>rowId</var> we passed in. So we are returned a Cursor on
+ the one row.</p>
+ <p>And finally, <code>updateNote()</code> takes a <var>rowId</var>, <var>title</var> and <var>body</var>, and uses a
+ {@link android.content.ContentValues ContentValues} instance to update the note of the given
+ <var>rowId</var>.</p>
+
+<h2 style="clear:right;">Step 3</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">Layouts and activities</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">Most Activity classes will have a layout associated with them. The layout
+ will be the "face" of the Activity to the user. In this case our layout will
+ take over the whole screen and provide a list of notes.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">Full screen layouts are not the only option for an Activity however. You
+ might also want to use a <a
+href="{@docRoot}resources/faq/commontasks.html#floatingorfull">floating
+ layout</a> (for example, a <a
+href="{@docRoot}resources/faq/commontasks.html#dialogsandalerts">dialog
+ or alert</a>),
+ or perhaps you don't need a layout at all (the Activity will be invisible
+ to the user unless you specify some kind of layout for it to use).</p>
+ </div>
+
+ <p>Open the <code>notepad_list.xml</code> file in <code>res/layout</code>
+and
+ take a look at it. (You may have to
+ hit the <em>xml</em> tab, at the bottom, in order to view the XML markup.)</p>
+
+ <p>This is a mostly-empty layout definition file. Here are some
+ things you should know about a layout file:</p>
+
+
+ <ul>
+ <li>
+ All Android layout files must start with the XML header line:
+ <code><?xml version="1.0" encoding="utf-8"?></code>. </li>
+ <li>
+ The next definition will often (but not always) be a layout
+ definition of some kind, in this case a <code>LinearLayout</code>. </li>
+ <li>
+ The XML namespace of Android should always be defined in
+ the top level component or layout in the XML so that <code>android:</code> tags can
+ be used through the rest of the file:
+ <p><code>xmlns:android="http://schemas.android.com/apk/res/android"</code></p>
+ </li>
+ </ul>
+
+ <h2 style="clear:right;">Step 4</h2>
+ <p>We need to create the layout to hold our list. Add code inside
+ of the <code>LinearLayout</code> element so the whole file looks like this: </p>
+ <pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+ <TextView android:id="@android:id/empty"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/no_notes"/>
+
+</LinearLayout>
+</pre>
+ <ul>
+ <li>
+ The <strong>@</strong> symbol in the id strings of the <code>ListView</code> and
+ <code>TextView</code> tags means
+ that the XML parser should parse and expand the rest of
+ the id string and use an ID resource.</li>
+ <li>
+ The <code>ListView</code> and <code>TextView</code> can be
+ thought as two alternative views, only one of which will be displayed at once.
+ ListView will be used when there are notes to be shown, while the TextView
+ (which has a default value of "No Notes Yet!" defined as a string
+ resource in <code>res/values/strings.xml</code>) will be displayed if there
+ aren't any notes to display.</li>
+ <li>The <code>list</code> and <code>empty</code> IDs are
+ provided for us by the Android platform, so, we must
+ prefix the <code>id</code> with <code>android:</code> (e.g., <code>@android:id/list</code>).</li>
+ <li>The View with the <code>empty</code> id is used
+ automatically when the {@link android.widget.ListAdapter} has no data for the ListView. The
+ ListAdapter knows to look for this name by default. Alternatively, you could change the
+ default empty view by using {@link android.widget.AdapterView#setEmptyView(View)}
+ on the ListView.
+ <p>
+ More broadly, the <code>android.R</code> class is a set of predefined
+ resources provided for you by the platform, while your project's
+ <code>R</code> class is the set of resources your project has defined.
+ Resources found in the <code>android.R</code> resource class can be
+ used in the XML files by using the <code>android:</code> name space prefix
+ (as we see here).</p>
+ </li>
+ </ul>
+
+ <h2 style="clear:right;">Step 5</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">Resources and the R class</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">The folders under res/ in the Eclipse project are for resources.
+ There is a <a href="{@docRoot}resources/faq/commontasks.html#filelist">specific structure</a> to the
+ folders and files under res/.</p>
+ <p style="padding-left:.5em;font-size:12px;
+margin:0; padding:.0em .5em .5em 1em;">Resources defined in these folders and files will have
+ corresponding entries in the R class allowing them to be easily accessed
+ and used from your application. The R class is automatically generated using the contents
+ of the res/ folder by the eclipse plugin (or by aapt if you use the command line tools).
+ Furthermore, they will be bundled and deployed for you as part of the application.</p>
+ </p>
+ </div>
+ <p>To make the list of notes in the ListView, we also need to define a View for each row:</p>
+ <ol>
+ <li>
+ Create a new file under <code>res/layout</code> called
+ <code>notes_row.xml</code>. </li>
+ <li>
+ Add the following contents (note: again the XML header is used, and the
+ first node defines the Android XML namespace)<br>
+ <pre style="overflow:auto">
+<?xml version="1.0" encoding="utf-8"?>
+<TextView android:id="@+id/text1"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/></pre>
+ <p>
+ This is the View that will be used for each notes title row — it has only
+ one text field in it. </p>
+ <p>In this case we create a new id called <code>text1</code>. The
+ <strong>+</strong> after the <strong>@</strong> in the id string indicates that the id should
+ be automatically created as a resource if it does not already exist, so we are defining
+ <code>text1</code> on the fly and then using it.</p>
+ </li>
+ <li>Save the file.</li>
+ </ol>
+ <p>Open the <code>R.java</code> class in the
+ project and look at it, you should see new definitions for
+ <code>notes_row</code> and <code>text1</code> (our new definitions)
+ meaning we can now gain access to these from the our code. </p>
+
+ <h2 style="clear:right;">Step 6</h2>
+<p>Next, open the <code>Notepadv1</code> class in the source. In the following steps, we are going to
+ alter this class to become a list adapter and display our notes, and also
+ allow us to add new notes.</p>
+
+<p><code>Notepadv1</code> will inherit from a subclass
+ of <code>Activity</code> called a <code>ListActivity</code>,
+ which has extra functionality to accommodate the kinds of
+ things you might want to do with a list, for
+ example: displaying an arbitrary number of list items in rows on the screen,
+ moving through the list items, and allowing them to be selected.</p>
+
+<p>Take a look through the existing code in <code>Notepadv1</code> class.
+ There is a currently an unused private field called <code>mNoteNumber</code> that
+ we will use to create numbered note titles.</p>
+ <p>There are also three override methods defined:
+ <code>onCreate</code>, <code>onCreateOptionsMenu</code> and
+ <code>onOptionsItemSelected</code>; we need to fill these
+ out:</p>
+ <ul>
+ <li><code>onCreate()</code> is called when the activity is
+ started — it is a little like the "main" method for an Activity. We use
+ this to set up resources and state for the activity when it is
+ running.</li>
+ <li><code>onCreateOptionsMenu()</code> is used to populate the
+ menu for the Activity. This is shown when the user hits the menu button,
+and
+ has a list of options they can select (like "Create
+ Note"). </li>
+ <li><code>onOptionsItemSelected()</code> is the other half of the
+ menu equation, it is used to handle events generated from the menu (e.g.,
+ when the user selects the "Create Note" item).
+ </li>
+ </ul>
+
+ <h2>Step 7</h2>
+ <p>Change the inheritance of <code>Notepadv1</code> from
+<code>Activity</code>
+ to <code>ListActivity</code>:</p>
+ <pre>public class Notepadv1 extends ListActivity</pre>
+ <p>Note: you will have to import <code>ListActivity</code> into the
+Notepadv1
+ class using Eclipse, <strong>ctrl-shift-O</strong> on Windows or Linux, or
+ <strong>cmd-shift-O</strong> on the Mac (organize imports) will do this for you
+ after you've written the above change.</p>
+
+ <h2>Step 8</h2>
+ <p>Fill out the body of the <code>onCreate()</code> method.</p>
+ <p>Here we will set the title for the Activity (shown at the top of the
+ screen), use the <code>notepad_list</code> layout we created in XML,
+ set up the <code>NotesDbAdapter</code> instance that will
+ access notes data, and populate the list with the available note
+ titles:</p>
+ <ol>
+ <li>
+ In the <code>onCreate</code> method, call <code>super.onCreate()</code> with the
+ <code>savedInstanceState</code> parameter that's passed in.</li>
+ <li>
+ Call <code>setContentView()</code> and pass <code>R.layout.notepad_list</code>.</li>
+ <li>
+ At the top of the class, create a new private class field called <code>mDbHelper</code> of class
+ <code>NotesDbAdapter</code>.
+ </li>
+ <li>
+ Back in the <code>onCreate</code> method, construct a new
+<code>NotesDbAdapter</code>
+ instance and assign it to the <code>mDbHelper</code> field (pass
+ <code>this</code> into the constructor for <code>DBHelper</code>)
+ </li>
+ <li>
+ Call the <code>open()</code> method on <code>mDbHelper</code> to open (or create) the
+ database.
+ </li>
+ <li>
+ Finally, call a new method <code>fillData()</code>, which will get the data and
+ populate the ListView using the helper — we haven't defined this method yet. </li>
+ </ol>
+ <p>
+ <code>onCreate()</code> should now look like this:</p>
+ <pre>
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.notepad_list);
+ mDbHelper = new NotesDbAdapter(this);
+ mDbHelper.open();
+ fillData();
+ }</pre>
+ <p>And be sure you have the <code>mDbHelper</code> field definition (right
+ under the mNoteNumber definition): </p>
+ <pre> private NotesDbAdapter mDbHelper;</pre>
+
+ <h2>Step 9</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">More on menus</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">The notepad application we are constructing only scratches the
+ surface with <a href="{@docRoot}resources/faq/commontasks.html#addmenuitems">menus</a>. </p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">You can also <a href="{@docRoot}resources/faq/commontasks.html#menukeyshortcuts">add
+shortcut keys for menu items</a>, <a href="{@docRoot}resources/faq/commontasks.html#menukeyshortcuts">create
+submenus</a> and even <a href="{@docRoot}resources/faq/commontasks.html#addingtoothermenus">add
+menu items to other applications!</a>. </p>
+ </div>
+
+<p>Fill out the body of the <code>onCreateOptionsMenu()</code> method.</p>
+
+<p>We will now create the "Add Item" button that can be accessed by pressing the menu
+button on the device. We'll specify that it occupy the first position in the menu.</p>
+
+ <ol>
+ <li>
+ In <code>strings.xml</code> resource (under <code>res/values</code>), add
+ a new string named "menu_insert" with its value set to <code>Add Item</code>:
+ <pre><string name="menu_insert">Add Item</string></pre>
+ <p>Then save the file and return to <code>Notepadv1</code>.</p>
+ </li>
+ <li>Create a menu position constant at the top of the class:
+ <pre>public static final int INSERT_ID = Menu.FIRST;</pre>
+ </li>
+ <li>In the <code>onCreateOptionsMenu()</code> method, change the
+ <code>super</code> call so we capture the boolean return as <code>result</code>. We'll return this value at the end.</li>
+ <li>Then add the menu item with <code>menu.add()</code>.</li>
+ </ol>
+ <p>The whole method should now look like this:
+ <pre>
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ boolean result = super.onCreateOptionsMenu(menu);
+ menu.add(0, INSERT_ID, 0, R.string.menu_insert);
+ return result;
+ }</pre>
+ <p>The arguments passed to <code>add()</code> indicate: a group identifier for this menu (none,
+ in this case), a unique ID (defined above), the order of the item (zero indicates no preference),
+ and the resource of the string to use for the item.</p>
+
+<h2 style="clear:right;">Step 10</h2>
+ <p>Fill out the body of the <code>onOptionsItemSelected()</code> method:</p>
+ <p>This is going
+ to handle our new "Add Note" menu item. When this is selected, the
+ <code>onOptionsItemSelected()</code> method will be called with the
+ <code>item.getId()</code> set to <code>INSERT_ID</code> (the constant we
+ used to identify the menu item). We can detect this, and take the
+ appropriate actions:</p>
+ <ol>
+ <li>
+ The <code>super.onOptionsItemSelected(item)</code> method call goes at the
+ end of this method — we want to catch our events first! </li>
+ <li>
+ Write a switch statement on <code>item.getItemId()</code>.
+ <p>In the case of <var>INSERT_ID</var>, call a new method, <code>createNote()</code>,
+ and return true, because we have handled this event and do not want to
+ propagate it through the system.</p>
+ </li>
+ <li>Return the result of the superclass' <code>onOptionsItemSelected()</code>
+ method at the end.</li>
+ </ol>
+ <p>
+ The whole <code>onOptionsItemSelect()</code> method should now look like
+ this:</p>
+ <pre>
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case INSERT_ID:
+ createNote();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }</pre>
+
+<h2>Step 11</h2>
+ <p>Add a new <code>createNote()</code> method:</p>
+ <p>In this first version of
+ our application, <code>createNote()</code> is not going to be very useful.
+We will simply
+ create a new note with a title assigned to it based on a counter ("Note 1",
+ "Note 2"...) and with an empty body. At present we have no way of editing
+ the contents of a note, so for now we will have to be content making one
+ with some default values:</p>
+ <ol>
+ <li>Construct the name using "Note" and the counter we defined in the class: <code>
+ String noteName = "Note " + mNoteNumber++</code></li>
+ <li>
+ Call <code>mDbHelper.createNote()</code> using <code>noteName</code> as the
+ title and <code>""</code> for the body
+ </li>
+ <li>
+ Call <code>fillData()</code> to populate the list of notes (inefficient but
+ simple) — we'll create this method next.</li>
+ </ol>
+ <p>
+ The whole <code>createNote()</code> method should look like this: </p>
+ <pre>
+ private void createNote() {
+ String noteName = "Note " + mNoteNumber++;
+ mDbHelper.createNote(noteName, "");
+ fillData();
+ }</pre>
+
+
+<h2>Step 12</h2>
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">List adapters</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">Our example uses a {@link android.widget.SimpleCursorAdapter
+ SimpleCursorAdapter} to bind a database {@link android.database.Cursor Cursor}
+ into a ListView, and this is a common way to use a {@link android.widget.ListAdapter
+ ListAdapter}. Other options exist like {@link android.widget.ArrayAdapter ArrayAdapter} which
+ can be used to take a List or Array of in-memory data and bind it in to
+ a list as well.</p>
+ </div>
+
+ <p>Define the <code>fillData()</code> method:</p>
+ <p>This
+ method uses <code>SimpleCursorAdapter,</code> which takes a database <code>Cursor</code>
+ and binds it to fields provided in the layout. These fields define the row elements of our list
+ (in this case we use the <code>text1</code> field in our
+ <code>notes_row.xml</code> layout), so this allows us to easily populate the list with
+ entries from our database.</p>
+ <p>To do this we have to provide a mapping from the <code>title</code> field in the returned Cursor, to
+ our <code>text1</code> TextView, which is done by defining two arrays: the first a string array
+ with the list of columns to map <em>from</em> (just "title" in this case, from the constant
+ <code>NotesDbAdapter.KEY_TITLE</code>) and, the second, an int array
+ containing references to the views that we'll bind the data <em>into</em>
+ (the <code>R.id.text1</code> TextView).</p>
+ <p>This is a bigger chunk of code, so let's first take a look at it:</p>
+
+ <pre>
+ private void fillData() {
+ // Get all of the notes from the database and create the item list
+ Cursor c = mDbHelper.fetchAllNotes();
+ startManagingCursor(c);
+
+ String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
+ int[] to = new int[] { R.id.text1 };
+
+ // Now create an array adapter and set it to display using our row
+ SimpleCursorAdapter notes =
+ new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
+ setListAdapter(notes);
+ }</pre>
+
+ <p>Here's what we've done:</p>
+ <ol>
+ <li>
+ After obtaining the Cursor from <code>mDbHelper.fetchAllNotes()</code>, we
+ use an Activity method called
+ <code>startManagingCursor()</code> that allows Android to take care of the
+ Cursor lifecycle instead of us needing to worry about it. (We will cover the implications
+ of the lifecycle in exercise 3, but for now just know that this allows Android to do some
+ of our resource management work for us.)</li>
+ <li>
+ Then we create a string array in which we declare the column(s) we want
+ (just the title, in this case), and an int array that defines the View(s)
+ to which we'd like to bind the columns (these should be in order, respective to
+ the string array, but here we only have one for each).</li>
+ <li>
+ Next is the SimpleCursorAdapter instantiation.
+ Like many classes in Android, the SimpleCursorAdapter needs a Context in order to do its
+ work, so we pass in <code>this</code> for the context (since subclasses of Activity
+ implement Context). We pass the <code>notes_row</code> View we created as the receptacle
+ for the data, the Cursor we just created, and then our arrays.</li>
+ </ol>
+ <p>
+ In the future, remember that the mapping between the <strong>from</strong> columns and <strong>to</strong> resources
+ is done using the respective ordering of the two arrays. If we had more columns we wanted
+ to bind, and more Views to bind them in to, we would specify them in order, for example we
+ might use <code>{ NotesDbAdapter.KEY_TITLE, NotesDbAdapter.KEY_BODY }</code> and
+ <code>{ R.id.text1, R.id.text2 }</code> to bind two fields into the row (and we would also need
+ to define text2 in the notes_row.xml, for the body text). This is how you can bind multiple fields
+ into a single row (and get a custom row layout as well).</p>
+ <p>
+ If you get compiler errors about classes not being found, ctrl-shift-O or
+ (cmd-shift-O on the mac) to organize imports.
+ </p>
+
+<h2 style="clear:right;">Step 13</h2>
+ <p>Run it!
+ <ol>
+ <li>
+ Right click on the <code>Notepadv1</code> project.</li>
+ <li>
+ From the popup menu, select <strong>Run As</strong> >
+ <strong>Android Application</strong>.</li>
+ <li>
+ If you see a dialog come up, select Android Launcher as the way of running
+ the application (you can also use the link near the top of the dialog to
+ set this as your default for the workspace; this is recommended as it will
+ stop the plugin from asking you this every time).</li>
+ <li>Add new notes by hitting the menu button and selecting <em>Add
+ Item</em> from the menu.</li>
+ </ol>
+
+<h2 style="clear:right;">Solution and Next Steps</h2>
+ <p>You can see the solution to this class in <code>Notepadv1Solution</code>
+from
+the zip file to compare with your own.</p>
+
+<p>Once you are ready, move on to <a href="notepad-ex2.html">Tutorial
+Exercise 2</a> to add the ability to create, edit and delete notes.</p>
+
diff --git a/docs/html/resources/tutorials/notepad/notepad-ex2.jd b/docs/html/resources/tutorials/notepad/notepad-ex2.jd
new file mode 100644
index 0000000..44a04ab
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/notepad-ex2.jd
@@ -0,0 +1,647 @@
+Rpage.title=Notepad Exercise 2
+parent.title=Notepad Tutorial
+parent.link=index.html
+@jd:body
+
+
+<p><em>In this exercise, you will add a second Activity to your notepad application, to let the user
+create and edit notes. You will also allow the user to delete existing notes through a context menu.
+The new Activity assumes responsibility for creating new notes by
+collecting user input and packing it into a return Bundle provided by the intent. This exercise
+demonstrates:</em></p>
+<ul>
+<li><em>Constructing a new Activity and adding it to the Android manifest</em></li>
+<li><em>Invoking another Activity asynchronously using <code>startActivityForResult()</code></em></li>
+<li><em>Passing data between Activity in Bundle objects</em></li>
+<li><em>How to use a more advanced screen layout</em></li>
+<li><em>How to create a context menu</em></li>
+</ul>
+
+<div style="float:right;white-space:nowrap">
+ [<a href="notepad-ex1.html">Exercise 1</a>]
+ <span style="color:#BBB;">
+ [<a href="notepad-ex2.html" style="color:#DDD;">Exercise 2</a>]
+ </span>
+ [<a href="notepad-ex3.html">Exercise 3</a>]
+ [<a href="notepad-extra-credit.html">Extra Credit</a>]
+</div>
+
+<h2>Step 1</h2>
+
+<p>Create a new Android project using the sources from <code>Notepadv2</code> under the
+<code>NotepadCodeLab</code> folder, just like you did for the first exercise. If you see an error about
+<code>AndroidManifest.xml</code>, or some problems related to an
+<code>android.zip</code> file, right click on the project and select <strong>Android
+Tools</strong> > <strong>Fix Project Properties</strong>.</p>
+
+<p>Open the <code>Notepadv2</code> project and take a look around:</p>
+<ul>
+ <li>
+ Open and look at the <code>strings.xml</code> file under
+ <code>res/values</code> — there are several new strings which we will use
+ for our new functionality
+ </li>
+ <li>
+ Also, open and take a look at the top of the <code>Notepadv2</code> class,
+ you will notice several new constants have been defined along with a new <code>mNotesCursor</code>
+ field used to hold the cursor we are using.
+ </li>
+ <li>
+ Note also that the <code>fillData()</code> method has a few more comments and now uses
+ the new field to store the notes Cursor. The <code>onCreate()</code> method is
+ unchanged from the first exercise. Also notice that the member field used to store the
+ notes Cursor is now called <code>mNotesCursor</code>. The <code>m</code> denotes a member
+ field and is part of the Android coding style standards.
+ </li>
+ <li>
+ There are also a couple of new overridden methods
+ (<code>onCreateContextMenu()</code>, <code>onContextItemSelected()</code>,
+ <code>onListItemClick()</code> and <code>onActivityResult()</code>)
+ which we will be filling in below.
+ </li>
+</ul>
+
+
+<h2>Step 2</h2>
+
+<div class="sidebox">
+<p>Context menus should always be used when performing actions upon specific elements in the UI.
+When you register a View to a context menu, the context menu is revealed by performing a "long-click"
+on the UI component (press and hold the touchscreen or highlight and hold down the selection key for about two seconds).</p>
+</div>
+
+<p>First, let's create the context menu that will allow users to delete individual notes.
+Open the Notepadv2 class.</p>
+
+<ol>
+ <li>In order for each list item in the ListView to register for the context menu, we call
+ <code>registerForContextMenu()</code> and pass it our ListView. So, at the very end of
+ the <code>onCreate()</code> method add this line:
+ <pre>registerForContextMenu(getListView());</pre>
+ <p>Because our Activity extends the ListActivity class, <code>getListView()</code> will return us
+ the local ListView object for the Activity. Now, each list item in this ListView will activate the
+ context menu.
+ <li>
+ Now fill in the <code>onCreateContextMenu()</code> method. This callback is similar to the other
+ menu callback used for the options menu. Here, we add just one line, which will add a menu item
+ to delete a note. Call <code>menu.add()</code> like so:
+ <pre>
+public boolean onCreateContextMenu(Menu menu, View v
+ ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ menu.add(0, DELETE_ID, 0, R.string.menu_delete);
+}</pre>
+ <p>The <code>onCreateContextMenu()</code> callback passes some other information in addition to the Menu object,
+ such as the View that has been triggered for the menu and
+ an extra object that may contain additional information about the object selected. However, we don't care about
+ these here, because we only have one kind of object in the Activity that uses context menus. In the next
+ step, we'll handle the menu item selection.</p>
+ </li>
+</ol>
+
+<h2>Step 3</h2>
+ <p>Now that the we've registered our ListView for a context menu and defined our context menu item, we need
+ to handle the callback when it is selected. For this, we need to identify the list ID of the
+ selected item, then delete it. So fill in the
+ <code>onContextItemSelected()</code> method like this:</p>
+<pre>
+public boolean onContextItemSelected(MenuItem item) {
+ switch(item.getItemId()) {
+ case DELETE_ID:
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+ mDbHelper.deleteNote(info.id);
+ fillData();
+ return true;
+ }
+ return super.onContextItemSelected(item);
+}</pre>
+<p>Here, we retrieve the {@link android.widget.AdapterView.AdapterContextMenuInfo AdapterContextMenuInfo}
+with {@link android.view.MenuItem#getMenuInfo()}. The <var>id</var> field of this object tells us
+the position of the item in the ListView. We then pass this to the <code>deleteNote()</code>
+method of our NotesDbAdapter and the note is deleted. That's it for the context menu — notes
+can now be deleted.</p>
+
+<h2 style="clear:right;">Step 4</h2>
+<div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">Starting Other Activities</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">In this example our Intent uses a class name specifically.
+ As well as
+ <a href="{@docRoot}resources/faq/commontasks.html#intentexamples">starting intents</a> in
+ classes we already know about, be they in our own application or another
+ application, we can also create Intents without knowing exactly which
+ application will handle it.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">For example, we might want to open a page in a
+ browser, and for this we still use
+ an Intent. But instead of specifying a class to handle it, we use
+ a predefined Intent constant, and a content URI that describes what we
+ want to do. See {@link android.content.Intent
+ android.content.Intent} for more information.</p>
+</div>
+
+ <p>Fill in the body of the <code>createNote()</code> method:
+ <p>Create a new <code>Intent</code> to create a note
+ (<code>ACTIVITY_CREATE</code>) using the <code>NoteEdit</code> class.
+ Then fire the Intent using the <code>startActivityForResult()</code> method
+ call:</p>
+ <pre style="overflow:auto">
+Intent i = new Intent(this, NoteEdit.class);
+startActivityForResult(i, ACTIVITY_CREATE);</pre>
+ <p>This form of the Intent call targets a specific class in our Activity, in this case
+ <code>NoteEdit</code>. Since the Intent class will need to communicate with the Android
+ operating system to route requests, we also have to provide a Context (<code>this</code>).</p>
+ <p>The <code>startActivityForResult()</code> method fires the Intent in a way that causes a method
+ in our Activity to be called when the new Activity is completed. The method in our Activity
+ that receives the callback is called
+ <code>onActivityResult()</code> and we will implement it in a later step. The other way
+ to call an Activity is using <code>startActivity()</code> but this is a "fire-and-forget" way
+ of calling it — in this manner, our Activity is not informed when the Activity is completed, and there is
+ no way to return result information from the called Activity with <code>startActivity()</code>.
+ <p>Don't worry about the fact that <code>NoteEdit</code> doesn't exist yet,
+ we will fix that soon. </p>
+ </li>
+
+
+<h2>Step 5</h2>
+
+ <p>Fill in the body of the <code>onListItemClick()</code> override.</p>
+ <p><code>onListItemClick()</code> is a callback method that we'll override. It is called when
+ the user selects an item from the list. It is passed four parameters: the
+ <code>ListView</code> object it was invoked from, the <code>View</code>
+ inside the <code>ListView</code> that was clicked on, the
+ <code>position</code> in the list that was clicked, and the
+ <code>mRowId</code> of the item that was clicked. In this instance we can
+ ignore the first two parameters (we only have one <code>ListView</code> it
+ could be), and we ignore the <code>mRowId</code> as well. All we are
+ interested in is the <code>position</code> that the user selected. We use
+ this to get the data from the correct row, and bundle it up to send to
+ the <code>NoteEdit</code> Activity.</p>
+ <p>In our implementation of the callback, the method creates an
+ <code>Intent</code> to edit the note using
+ the <code>NoteEdit</code> class. It then adds data into the extras Bundle of
+ the Intent, which will be passed to the called Activity. We use it
+ to pass in the title and body text, and the <code>mRowId</code> for the note we are
+ editing. Finally, it will fire the Intent using the
+ <code>startActivityForResult()</code> method call. Here's the code that
+ belongs in <code>onListItemClick()</code>:</p>
+ <pre>
+super.onListItemClick(l, v, position, id);
+Cursor c = mNotesCursor;
+c.moveToPosition(position);
+Intent i = new Intent(this, NoteEdit.class);
+i.putExtra(NotesDbAdapter.KEY_ROWID, id);
+i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
+ c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
+i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
+ c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
+startActivityForResult(i, ACTIVITY_EDIT);</pre>
+ <ul>
+ <li>
+ <code>putExtra()</code> is the method to add items into the extras Bundle
+ to pass in to intent invocations. Here, we are
+ using the Bundle to pass in the title, body and mRowId of the note we want to edit.
+ </li>
+ <li>
+ The details of the note are pulled out from our query Cursor, which we move to the
+ proper position for the element that was selected in the list, with
+ the <code>moveToPosition()</code> method.</li>
+ <li>With the extras added to the Intent, we invoke the Intent on the
+ <code>NoteEdit</code> class by passing <code>startActivityForResult()</code>
+ the Intent and the request code. (The request code will be
+ returned to <code>onActivityResult</code> as the <code>requestCode</code> parameter.)</li>
+ </ul>
+ <p class="note"><b>Note:</b> We assign the mNotesCursor field to a local variable at the
+ start of the method. This is done as an optimization of the Android code. Accessing a local
+ variable is much more efficient than accessing a field in the Dalvik VM, so by doing this
+ we make only one access to the field, and five accesses to the local variable, making the
+ routine much more efficient. It is recommended that you use this optimization when possible.</p>
+
+
+<h2>Step 6</h2>
+
+<p>The above <code>createNote()</code> and <code>onListItemClick()</code>
+ methods use an asynchronous Intent invocation. We need a handler for the callback, so here we fill
+ in the body of the <code>onActivityResult()</code>. </p>
+<p><code>onActivityResult()</code> is the overridden method
+ which will be called when an Activity returns with a result. (Remember, an Activity
+ will only return a result if launched with <code>startActivityForResult</code>.) The parameters provided
+ to the callback are: </p>
+ <ul>
+ <li><code>requestCode</code> — the original request code
+ specified in the Intent invocation (either <code>ACTIVITY_CREATE</code> or
+ <code>ACTIVITY_EDIT</code> for us).
+ </li>
+ <li><code>resultCode</code> — the result (or error code) of the call, this
+ should be zero if everything was OK, but may have a non-zero code indicating
+ that something failed. There are standard result codes available, and you
+ can also create your own constants to indicate specific problems.
+ </li>
+ <li><code>intent</code> — this is an Intent created by the Activity returning
+ results. It can be used to return data in the Intent "extras."
+ </li>
+ </ul>
+ <p>The combination of <code>startActivityForResult()</code> and
+ <code>onActivityResult()</code> can be thought of as an asynchronous RPC
+ (remote procedure call) and forms the recommended way for an Activity to invoke
+ another and share services.</p>
+ <p>Here's the code that belongs in your <code>onActivityResult()</code>:</p>
+ <pre>
+super.onActivityResult(requestCode, resultCode, intent);
+Bundle extras = intent.getExtras();
+
+switch(requestCode) {
+case ACTIVITY_CREATE:
+ String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String body = extras.getString(NotesDbAdapter.KEY_BODY);
+ mDbHelper.createNote(title, body);
+ fillData();
+ break;
+case ACTIVITY_EDIT:
+ Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+ if (mRowId != null) {
+ String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
+ mDbHelper.updateNote(mRowId, editTitle, editBody);
+ }
+ fillData();
+ break;
+}</pre>
+
+ <ul>
+ <li>
+ We are handling both the <code>ACTIVITY_CREATE</code> and
+ <code>ACTIVITY_EDIT</code> activity results in this method.
+ </li>
+ <li>
+ In the case of a create, we pull the title and body from the extras (retrieved from the
+ returned Intent) and use them to create a new note.
+ </li>
+ <li>
+ In the case of an edit, we pull the mRowId as well, and use that to update
+ the note in the database.
+ </li>
+ <li>
+ <code>fillData()</code> at the end ensures everything is up to date .
+ </li>
+ </ul>
+
+
+<h2>Step 7</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">The Art of Layout</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0; padding:.0em .5em .5em 1em;">The provided
+ note_edit.xml layout file is the most sophisticated one in the application we will be building,
+ but that doesn't mean it is even close to the kind of sophistication you will be likely to want
+ in real Android applications.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0; padding:.0em .5em .5em 1em;">Creating a
+ good UI is part art and part science, and the rest is work. Mastery of <a
+ href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout</a> is an essential part of creating
+ a good looking Android application.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">Take a look at the
+ <a href="{@docRoot}resources/tutorials/views/index.html">Hello Views</a>
+ for some example layouts and how to use them. The ApiDemos sample project is also a
+ great resource from which to learn how to create different layouts.</p>
+ </div>
+
+<p>Open the file <code>note_edit.xml</code> that has been provided and take a
+ look at it. This is the UI code for the Note Editor.</p>
+ <p>This is the most
+ sophisticated UI we have dealt with yet. The file is given to you to avoid
+ problems that may sneak in when typing the code. (The XML is very strict
+ about case sensitivity and structure, mistakes in these are the usual cause
+ of problems with layout.)</p>
+ <p>There is a new parameter used
+ here that we haven't seen before: <code>android:layout_weight</code> (in
+ this case set to use the value 1 in each case).</p>
+ <p><code>layout_weight</code> is used in LinearLayouts
+ to assign "importance" to Views within the layout. All Views have a default
+ <code>layout_weight</code> of zero, meaning they take up only as much room
+ on the screen as they need to be displayed. Assigning a value higher than
+ zero will split up the rest of the available space in the parent View, according
+ to the value of each View's <code>layout_weight</code> and its ratio to the
+ overall <code>layout_weight</code> specified in the current layout for this
+ and other View elements.</p>
+ <p>To give an example: let's say we have a text label
+ and two text edit elements in a horizontal row. The label has no
+ <code>layout_weight</code> specified, so it takes up the minimum space
+ required to render. If the <code>layout_weight</code> of each of the two
+ text edit elements is set to 1, the remaining width in the parent layout will
+ be split equally between them (because we claim they are equally important).
+ If the first one has a <code>layout_weight</code> of 1
+ and the second has a <code>layout_weight</code> of 2, then one third of the
+ remaining space will be given to the first, and two thirds to the
+ second (because we claim the second one is more important).</p>
+ <p>This layout also demonstrates how to nest multiple layouts
+ inside each other to achieve a more complex and pleasant layout. In this
+ example, a horizontal linear layout is nested inside the vertical one to
+ allow the title label and text field to be alongside each other,
+ horizontally.</p>
+
+
+<h2 style="clear:right;">Step 8</h2>
+
+ <p>Create a <code>NoteEdit</code> class that extends
+ <code>android.app.Activity</code>.</p>
+ <p>This is the first time we will have
+ created an Activity without the Android Eclipse plugin doing it for us. When
+ you do so, the <code>onCreate()</code> method is not automatically
+ overridden for you. It is hard to imagine an Activity that doesn't override
+ the <code>onCreate()</code> method, so this should be the first thing you do.</p>
+ <ol>
+ <li>Right click on the <code>com.android.demo.notepad2</code> package
+ in the Package Explorer, and select <strong>New</strong> > <strong>Class</strong> from the popup
+ menu.</li>
+ <li>Fill in <code>NoteEdit</code> for the <code>Name:</code> field in the
+ dialog.</li>
+ <li>In the <code>Superclass:</code> field, enter
+ <code>android.app.Activity</code> (you can also just type Activity and hit
+ Ctrl-Space on Windows and Linux or Cmd-Space on the Mac, to invoke code
+ assist and find the right package and class).</li>
+ <li>Click <strong>Finish</strong>.</li>
+ <li>In the resulting <code>NoteEdit</code> class, right click in the editor
+ window and select <strong>Source</strong> > <strong>Override/Implement Methods...</strong></li>
+ <li>Scroll down through the checklist in the dialog until you see
+ <code>onCreate(Bundle)</code> — and check the box next to it.</li>
+ <li>Click <strong>OK</strong>.<p>The method should now appear in your class.</p></li>
+ </ol>
+
+<h2>Step 9</h2>
+
+<p>Fill in the body of the <code>onCreate()</code> method for <code>NoteEdit</code>.</p>
+
+<p>This will set the title of our new Activity to say "Edit Note" (one
+ of the strings defined in <code>strings.xml</code>). It will also set the
+ content view to use our <code>note_edit.xml</code> layout file. We can then
+ grab handles to the title and body text edit views, and the confirm button,
+ so that our class can use them to set and get the note title and body,
+ and attach an event to the confirm button for when it is pressed by the
+ user.</p>
+ <p>We can then unbundle the values that were passed in to the Activity
+ with the extras Bundle attached to the calling Intent. We'll use them to pre-populate
+ the title and body text edit views so that the user can edit them.
+ Then we will grab and store the <code>mRowId</code> so we can keep
+ track of what note the user is editing.</p>
+
+ <ol>
+ <li>
+ Inside <code>onCreate()</code>, set up the layout:<br>
+ <pre>setContentView(R.layout.note_edit);</pre>
+ </li>
+ <li>
+ Find the edit and button components we need:
+ <p>These are found by the
+ IDs associated to them in the R class, and need to be cast to the right
+ type of <code>View</code> (<code>EditText</code> for the two text views,
+ and <code>Button</code> for the confirm button):</p>
+ <pre>
+mTitleText = (EditText) findViewById(R.id.title);
+mBodyText = (EditText) findViewById(R.id.body);
+Button confirmButton = (Button) findViewById(R.id.confirm);</pre>
+ <p>Note that <code>mTitleText</code> and <code>mBodyText</code> are member
+ fields (you need to declare them at the top of the class definition).</p>
+ </li>
+ <li>At the top of the class, declare a <code>Long mRowId</code> private field to store
+ the current <code>mRowId</code> being edited (if any).
+ </li>
+ <li>Continuing inside <code>onCreate()</code>,
+ add code to initialize the <code>title</code>, <code>body</code> and
+ <code>mRowId</code> from the extras Bundle in
+ the Intent (if it is present):<br>
+ <pre>
+mRowId = null;
+Bundle extras = getIntent().getExtras();
+if (extras != null) {
+ String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String body = extras.getString(NotesDbAdapter.KEY_BODY);
+ mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+
+ if (title != null) {
+ mTitleText.setText(title);
+ }
+ if (body != null) {
+ mBodyText.setText(body);
+ }
+}</pre>
+ <ul>
+ <li>
+ We are pulling the <code>title</code> and
+ <code>body</code> out of the
+ <code>extras</code> Bundle that was set from the
+ Intent invocation.
+ </li><li>
+ We also null-protect the text field setting (i.e., we don't want to set
+ the text fields to null accidentally).</li>
+ </ul>
+ </li>
+ <li>
+ Create an <code>onClickListener()</code> for the button:
+ <p>Listeners can be one of the more confusing aspects of UI
+ implementation, but
+ what we are trying to achieve in this case is simple. We want an
+ <code>onClick()</code> method to be called when the user presses the
+ confirm button, and use that to do some work and return the values
+ of the edited note to the Intent caller. We do this using something called
+ an anonymous inner class. This is a bit confusing to look at unless you
+ have seen them before, but all you really need to take away from this is
+ that you can refer to this code in the future to see how to create a
+ listener and attach it to a button. (Listeners are a common idiom
+ in Java development, particularly for user interfaces.) Here's the empty listener:<br>
+ <pre>
+confirmButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+
+ }
+
+});</pre>
+ </li>
+ </ol>
+<h2>Step 10</h2>
+
+<p>Fill in the body of the <code>onClick()</code> method of the <code>OnClickListener</code> created in the last step.</p>
+
+ <p>This is the code that will be run when the user clicks on the
+ confirm button. We want this to grab the title and body text from the edit
+ text fields, and put them into the return Bundle so that they can be passed
+ back to the Activity that invoked this <code>NoteEdit</code> Activity. If the
+ operation is an edit rather than a create, we also want to put the
+ <code>mRowId</code> into the Bundle so that the
+ <code>Notepadv2</code> class can save the changes back to the correct
+ note.</p>
+ <ol>
+ <li>
+ Create a <code>Bundle</code> and put the title and body text into it using the
+ constants defined in Notepadv2 as keys:<br>
+ <pre>
+Bundle bundle = new Bundle();
+
+bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
+bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
+if (mRowId != null) {
+ bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
+}</pre>
+ </li>
+ <li>
+ Set the result information (the Bundle) in a new Intent and finish the Activity:
+ <pre>
+Intent mIntent = new Intent();
+mIntent.putExtras(bundle);
+setResult(RESULT_OK, mIntent);
+finish();</pre>
+ <ul>
+ <li>The Intent is simply our data carrier that carries our Bundle
+ (with the title, body and mRowId).</li>
+ <li>The <code>setResult()</code> method is used to set the result
+ code and return Intent to be passed back to the
+ Intent caller. In this case everything worked, so we return RESULT_OK for the
+ result code.</li>
+ <li>The <code>finish()</code> call is used to signal that the Activity
+ is done (like a return call). Anything set in the Result will then be
+ returned to the caller, along with execution control.</li>
+ </ul>
+ </li>
+ </ol>
+ <p>The full <code>onCreate()</code> method (plus supporting class fields) should
+ now look like this:</p>
+ <pre>
+private EditText mTitleText;
+private EditText mBodyText;
+private Long mRowId;
+
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.note_edit);
+
+ mTitleText = (EditText) findViewById(R.id.title);
+ mBodyText = (EditText) findViewById(R.id.body);
+
+ Button confirmButton = (Button) findViewById(R.id.confirm);
+
+ mRowId = null;
+ Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String body = extras.getString(NotesDbAdapter.KEY_BODY);
+ mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+
+ if (title != null) {
+ mTitleText.setText(title);
+ }
+ if (body != null) {
+ mBodyText.setText(body);
+ }
+ }
+
+ confirmButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+ Bundle bundle = new Bundle();
+
+ bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
+ bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
+ if (mRowId != null) {
+ bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
+ }
+
+ Intent mIntent = new Intent();
+ mIntent.putExtras(bundle);
+ setResult(RESULT_OK, mIntent);
+ finish();
+ }
+ });
+}</pre>
+ </li>
+ </ol>
+
+<h2>Step 11</h2>
+
+<div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;
+ margin-bottom:.5em;margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">The All-Important Android Manifest File</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">The AndroidManifest.xml file is the way in which Android sees your
+ application. This file defines the category of the application, where
+ it shows up (or even if it shows up) in the launcher or settings, what
+ activities, services, and content providers it defines, what intents it can
+ receive, and more. </p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">For more information, see the reference document
+ <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></p>
+ </div>
+
+<p>Finally, the new Activity has to be defined in the manifest file:</p>
+ <p>Before the new Activity can be seen by Android, it needs its own
+ Activity entry in the <code>AndroidManifest.xml</code> file. This is to let
+ the system know that it is there and can be called. We could also specify
+ which IntentFilters the activity implements here, but we are going to skip
+ this for now and just let Android know that the Activity is
+ defined.</p>
+ <p>There is a Manifest editor included in the Eclipse plugin that makes it much easier
+ to edit the AndroidManifest file, and we will use this. If you prefer to edit the file directly
+ or are not using the Eclipse plugin, see the box at the end for information on how to do this
+ without using the new Manifest editor.<p>
+ <ol>
+ <li>Double click on the <code>AndroidManifest.xml</code> file in the package explorer to open it.
+ </li>
+ <li>Click the <strong>Application</strong> tab at the bottom of the Manifest editor.</li>
+ <li>Click <strong>Add...</strong> in the Application Nodes section.
+ <p>If you see a dialog with radiobuttons at the top, select the top radio button:
+ "Create a new element at the top level, in Application".</p></li>
+ <li>Make sure "(A) Activity" is selected in the selection pane of the dialog, and click <strong>OK</strong>.</li>
+ <li>Click on the new "Activity" node, in the Application Nodes section, then
+ type <code>.NoteEdit</code> into the <em>Name*</em>
+ field to the right. Press Return/Enter.</li>
+ </ol>
+ <p>The Android Manifest editor helps you add more complex entries into the AndroidManifest.xml
+ file, have a look around at some of the other options available (but be careful not to select
+ them otherwise they will be added to your Manifest). This editor should help you understand
+ and alter the AndroidManifest.xml file as you move on to more advanced Android applications.</p>
+
+ <p class="note">If you prefer to edit this file directly, simply open the
+ <code>AndroidManifest.xml</code> file and look at the source (use the
+ <code>AndroidManifest.xml</code> tab in the eclipse editor to see the source code directly).
+ Then edit the file as follows:<br>
+ <code><activity android:name=".NoteEdit" /></code><br><br>
+ This should be placed just below the line that reads:<br>
+ <code></activity></code> for the <code>.Notepadv2</code> activity.</p>
+
+<h2 style="clear:right;">Step 12</h2>
+
+<p>Now Run it!</p>
+<p>You should now be able to add real notes from
+the menu, as well as delete an existing one. Notice that in order to delete, you must
+first use the directional controls on the device to highlight the note.
+Furthermore, selecting a note title from the list should bring up the note
+editor to let you edit it. Press confirm when finished to save the changes
+back to the database.
+
+<h2>Solution and Next Steps</h2>
+
+<p>You can see the solution to this exercise in <code>Notepadv2Solution</code>
+from the zip file to compare with your own.</p>
+<p>Now try editing a note, and then hitting the back button on the emulator
+instead of the confirm button (the back button is below the menu button). You
+will see an error come up. Clearly our application still has some problems.
+Worse still, if you did make some changes and hit the back button, when you go
+back into the notepad to look at the note you changed, you will find that all
+your changes have been lost. In the next exercise we will fix these
+problems.</p>
+
+<p>
+Once you are ready, move on to <a href="notepad-ex3.html">Tutorial
+Exercise 3</a> where you will fix the problems with the back button and lost
+edits by introducing a proper life cycle into the NoteEdit Activity.</p>
+
+
diff --git a/docs/html/resources/tutorials/notepad/notepad-ex3.jd b/docs/html/resources/tutorials/notepad/notepad-ex3.jd
new file mode 100644
index 0000000..2da113f
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/notepad-ex3.jd
@@ -0,0 +1,367 @@
+page.title=Notepad Exercise 3
+parent.title=Notepad Tutorial
+parent.link=index.html
+@jd:body
+
+
+<p><em>In this exercise, you will use life-cycle event callbacks to store and
+retrieve application state data. This exercise demonstrates:</em></p>
+<ul>
+<li><em>Life-cycle events and how your application can use them</em></li>
+<li><em>Techniques for maintaining application state</em></li>
+</ul>
+
+<div style="float:right;white-space:nowrap">
+ [<a href="notepad-ex1.html">Exercise 1</a>]
+ [<a href="notepad-ex2.html">Exercise 2</a>]
+ <span style="color:#BBB;">
+ [<a href="notepad-ex3.html" style="color:#BBB;">Exercise 3</a>]
+ </span>
+ [<a href="notepad-extra-credit.html">Extra Credit</a>]
+</div>
+
+<h2>Step 1</h2>
+
+<p>Import <code>Notepadv3</code> into Eclipse. If you see an error about
+<code>AndroidManifest.xml,</code> or some problems related to an Android zip
+file, right click on the project and select <strong>Android Tools</strong> >
+<strong>Fix Project Properties</strong> from the popup menu. The starting point for this exercise is
+exactly where we left off at the end of the Notepadv2. </p>
+<p>The current application has some problems — hitting the back button when editing
+causes a crash, and anything else that happens during editing will cause the
+edits to be lost.</p>
+<p>To fix this, we will move most of the functionality for creating and editing
+the note into the NoteEdit class, and introduce a full life cycle for editing
+notes.</p>
+
+ <ol>
+ <li>Remove the code in <code>NoteEdit</code> that parses the title and body
+ from the extras Bundle.
+ <p>Instead, we are going to use the <code>DBHelper</code> class
+ to access the notes from the database directly. All we need passed into the
+ NoteEdit Activity is a <code>mRowId</code> (but only if we are editing, if creating we pass
+ nothing). Remove these lines:</p>
+ <pre>
+String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+String body = extras.getString(NotesDbAdapter.KEY_BODY);</pre>
+ </li>
+ <li>We will also get rid of the properties that were being passed in
+ the <code>extras</code> Bundle, which we were using to set the title
+ and body text edit values in the UI. So delete:
+ <pre>
+if (title != null) {
+ mTitleText.setText(title);
+}
+if (body != null) {
+ mBodyText.setText(body);
+}</pre>
+ </li>
+ </ol>
+
+<h2>Step 2</h2>
+
+<p>Create a class field for a <code>NotesDbAdapter</code> at the top of the NoteEdit class:</p>
+ <pre> private NotesDbAdapter mDbHelper;</pre>
+<p>Also add an instance of <code>NotesDbAdapter</code> in the
+ <code>onCreate()</code> method (right below the <code>super.onCreate()</code> call):</p>
+ <pre>
+ mDbHelper = new NotesDbAdapter(this);<br>
+ mDbHelper.open();</pre>
+
+<h2>Step 3</h2>
+
+<p>In <code>NoteEdit</code>, we need to check the <var>savedInstanceState</var> for the
+<code>mRowId</code>, in case the note
+ editing contains a saved state in the Bundle, which we should recover (this would happen
+ if our Activity lost focus and then restarted).</p>
+ <ol>
+ <li>
+ Replace the code that currently initializes the <code>mRowId</code>:<br>
+ <pre>
+ mRowId = null;
+
+ Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+ }
+ </pre>
+ with this:
+ <pre>
+ mRowId = (savedInstanceState == null) ? null :
+ (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
+ if (mRowId == null) {
+ Bundle extras = getIntent().getExtras();
+ mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
+ : null;
+ }
+ </pre>
+ </li>
+ <li>
+ Note the null check for <code>savedInstanceState</code>, and we still need to load up
+ <code>mRowId</code> from the <code>extras</code> Bundle if it is not
+ provided by the <code>savedInstanceState</code>. This is a ternary operator shorthand
+ to safely either use the value or null if it is not present.
+ </li>
+ <li>
+ Note the use of <code>Bundle.getSerializable()</code> instead of
+ <code>Bundle.getLong()</code>. The latter encoding returns a <code>long</code> primitive and
+ so can not be used to represent the case when <code>mRowId</code> is <code>null</code>.
+ </li>
+ </ol>
+
+<h2>Step 4</h2>
+
+<p>Next, we need to populate the fields based on the <code>mRowId</code> if we
+ have it:</p>
+ <pre>populateFields();</pre>
+ <p>This goes before the <code>confirmButton.setOnClickListener()</code> line.
+ We'll define this method in a moment.</p>
+
+<h2>Step 5</h2>
+
+<p>Get rid of the Bundle creation and Bundle value settings from the
+ <code>onClick()</code> handler method. The Activity no longer needs to
+ return any extra information to the caller. And because we no longer have
+ an Intent to return, we'll use the shorter version
+ of <code>setResult()</code>:</p>
+ <pre>
+public void onClick(View view) {
+ setResult(RESULT_OK);
+ finish();
+}</pre>
+ <p>We will take care of storing the updates or new notes in the database
+ ourselves, using the life-cycle methods.</p>
+
+ <p>The whole <code>onCreate()</code> method should now look like this:</p>
+ <pre>
+super.onCreate(savedInstanceState);
+
+mDbHelper = new NotesDbAdapter(this);
+mDbHelper.open();
+
+setContentView(R.layout.note_edit);
+
+mTitleText = (EditText) findViewById(R.id.title);
+mBodyText = (EditText) findViewById(R.id.body);
+
+Button confirmButton = (Button) findViewById(R.id.confirm);
+
+mRowId = (savedInstanceState == null) ? null :
+ (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
+if (mRowId == null) {
+ Bundle extras = getIntent().getExtras();
+ mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
+ : null;
+}
+
+populateFields();
+
+confirmButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+ setResult(RESULT_OK);
+ finish();
+ }
+
+});</pre>
+
+<h2>Step 6</h2>
+
+<p>Define the <code>populateFields()</code> method.</p>
+ <pre>
+private void populateFields() {
+ if (mRowId != null) {
+ Cursor note = mDbHelper.fetchNote(mRowId);
+ startManagingCursor(note);
+ mTitleText.setText(note.getString(
+ note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
+ mBodyText.setText(note.getString(
+ note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
+ }
+}</pre>
+<p>This method uses the <code>NotesDbAdapter.fetchNote()</code> method to find the right note to
+edit, then it calls <code>startManagingCursor()</code> from the <code>Activity</code> class, which
+is an Android convenience method provided to take care of the Cursor life-cycle. This will release
+and re-create resources as dictated by the Activity life-cycle, so we don't need to worry about
+doing that ourselves. After that, we just look up the title and body values from the Cursor
+and populate the View elements with them.</p>
+
+
+<h2>Step 7</h2>
+
+ <div class="sidebox" style="border:2px solid #FFFFDD;float:right;
+ background-color:#FFFFEE;margin-right:0px;margin-bottom:.5em;
+ margin-top:1em;padding:0em;width:240px;">
+ <h2 style="border:0;font-size:12px;padding:.5em .5em .5em 1em;margin:0;
+ background-color:#FFFFDD;">Why handling life-cycle events is important</h2>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">If you are used to always having control in your applications, you
+ might not understand why all this life-cycle work is necessary. The reason
+ is that in Android, you are not in control of your Activity, the
+ operating system is!</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;
+ padding:.0em .5em .5em 1em;">As we have already seen, the Android model is based around activities
+ calling each other. When one Activity calls another, the current Activity
+ is paused at the very least, and may be killed altogether if the
+ system starts to run low on resources. If this happens, your Activity will
+ have to store enough state to come back up later, preferably in the same
+ state it was in when it was killed.</p>
+ <p style="padding-left:.5em;font-size:12px;margin:0;padding:.0em .5em .5em 1em;">
+ Android has a <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">well-defined life cycle</a>.
+ Lifecycle events can happen even if you are not handing off control to
+ another Activity explicitly. For example, perhaps a call comes in to the
+ handset. If this happens, and your Activity is running, it will be swapped
+ out while the call Activity takes over.</p>
+ </div>
+
+<p>Still in the <code>NoteEdit</code> class, we now override the methods
+ <code>onSaveInstanceState()</code>, <code>onPause()</code> and
+ <code>onResume()</code>. These are our life-cycle methods
+ (along with <code>onCreate()</code> which we already have).</p>
+
+<p><code>onSaveInstanceState()</code> is called by Android if the
+ Activity is being stopped and <strong>may be killed before it is
+ resumed!</strong> This means it should store any state necessary to
+ re-initialize to the same condition when the Activity is restarted. It is
+ the counterpart to the <code>onCreate()</code> method, and in fact the
+ <code>savedInstanceState</code> Bundle passed in to <code>onCreate()</code> is the same
+ Bundle that you construct as <code>outState</code> in the
+ <code>onSaveInstanceState()</code> method.</p>
+
+<p><code>onPause()</code> and <code>onResume()</code> are also
+ complimentary methods. <code>onPause()</code> is always called when the
+ Activity ends, even if we instigated that (with a <code>finish()</code> call for example).
+ We will use this to save the current note back to the database. Good
+ practice is to release any resources that can be released during an
+ <code>onPause()</code> as well, to take up less resources when in the
+ passive state. <code>onResume()</code> will call our <code>populateFields()</code> method
+ to read the note out of the database again and populate the fields.</p>
+
+<p>So, add some space after the <code>populateFields()</code> method
+ and add the following life-cycle methods:</p>
+ <ol type="a">
+ <li><code>
+ onSaveInstanceState()</code>:
+ <pre>
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ saveState();
+ outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
+ }</pre>
+ <p>We'll define <code>saveState()</code> next.</p>
+ </li>
+ <li><code>
+ onPause()</code>:
+ <pre>
+ @Override
+ protected void onPause() {
+ super.onPause();
+ saveState();
+ }</pre>
+ </li>
+ <li><code>
+ onResume()</code>:
+ <pre>
+ @Override
+ protected void onResume() {
+ super.onResume();
+ populateFields();
+ }</pre>
+ </li>
+ </ol>
+<p>Note that <code>saveState()</code> must be called in both <code>onSaveInstanceState()</code>
+and <code>onPause()</code> to ensure that the data is saved. This is because there is no
+guarantee that <code>onSaveInstanceState()</code> will be called and because when it <em>is</em>
+called, it is called before <code>onPause()</code>.</p>
+
+
+<h2 style="clear:right;">Step 8</h2>
+
+<p>Define the <code>saveState()</code> method to put the data out to the
+database.</p>
+ <pre>
+ private void saveState() {
+ String title = mTitleText.getText().toString();
+ String body = mBodyText.getText().toString();
+
+ if (mRowId == null) {
+ long id = mDbHelper.createNote(title, body);
+ if (id > 0) {
+ mRowId = id;
+ }
+ } else {
+ mDbHelper.updateNote(mRowId, title, body);
+ }
+ }</pre>
+ <p>Note that we capture the return value from <code>createNote()</code> and if a valid row ID is
+ returned, we store it in the <code>mRowId</code> field so that we can update the note in future
+ rather than create a new one (which otherwise might happen if the life-cycle events are
+ triggered).</p>
+
+
+<h2 style="clear:right;">Step 9</h2>
+
+<p>Now pull out the previous handling code from the
+ <code>onActivityResult()</code> method in the <code>Notepadv3</code>
+ class.</p>
+<p>All of the note retrieval and updating now happens within the
+ <code>NoteEdit</code> life cycle, so all the <code>onActivityResult()</code>
+ method needs to do is update its view of the data, no other work is
+ necessary. The resulting method should look like this:</p>
+<pre>
+@Override
+protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ super.onActivityResult(requestCode, resultCode, intent);
+ fillData();
+}</pre>
+
+<p>Because the other class now does the work, all this has to do is refresh
+ the data.</p>
+
+<h2>Step 10</h2>
+
+<p>Also remove the lines which set the title and body from the
+ <code>onListItemClick()</code> method (again they are no longer needed,
+ only the <code>mRowId</code> is):</p>
+<pre>
+ Cursor c = mNotesCursor;
+ c.moveToPosition(position);</pre>
+<br>
+and also remove:
+<br>
+<pre>
+ i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
+ c.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
+ i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
+ c.getColumnIndex(NotesDbAdapter.KEY_BODY)));</pre>
+<br>
+so that all that should be left in that method is:
+<br>
+<pre>
+ super.onListItemClick(l, v, position, id);
+ Intent i = new Intent(this, NoteEdit.class);
+ i.putExtra(NotesDbAdapter.KEY_ROWID, id);
+ startActivityForResult(i, ACTIVITY_EDIT);</pre>
+
+ <p>You can also now remove the mNotesCursor field from the class, and set it back to using
+ a local variable in the <code>fillData()</code> method:
+<br><pre>
+ Cursor notesCursor = mDbHelper.fetchAllNotes();</pre></p>
+ <p>Note that the <code>m</code> in <code>mNotesCursor</code> denotes a member field, so when we
+ make <code>notesCursor</code> a local variable, we drop the <code>m</code>. Remember to rename the
+ other occurrences of <code>mNotesCursor</code> in your <code>fillData()</code> method.
+</ol>
+<p>
+Run it! (use <em>Run As -> Android Application</em> on the project right
+click menu again)</p>
+
+<h2>Solution and Next Steps</h2>
+
+<p>You can see the solution to this exercise in <code>Notepadv3Solution</code>
+from
+the zip file to compare with your own.</p>
+<p>
+When you are ready, move on to the <a href="notepad-extra-credit.html">Tutorial
+Extra Credit</a> exercise, where you can use the Eclipse debugger to
+examine the life-cycle events as they happen.</p>
diff --git a/docs/html/resources/tutorials/notepad/notepad-extra-credit.jd b/docs/html/resources/tutorials/notepad/notepad-extra-credit.jd
new file mode 100644
index 0000000..0d59b56
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/notepad-extra-credit.jd
@@ -0,0 +1,70 @@
+page.title=Notepad Extra Credit
+parent.title=Notepad Tutorial
+parent.link=index.html
+@jd:body
+
+
+<p><em>In this exercise, you will use the debugger to look at the work you did
+in Exercise 3. This exercise demonstrates:</em></p>
+<ul>
+<li><em>How to set breakpoints to observe execution</em> </li>
+<li><em>How to run your application in debug mode</code></em></li>
+</ul>
+
+<div style="float:right;white-space:nowrap">
+
+ [<a href="notepad-ex1.html">Exercise 1</a>]
+ [<a href="notepad-ex2.html">Exercise 2</a>]
+ [<a href="notepad-ex3.html">Exercise 3</a>]
+ <span style="color:#BBB;">
+ [<a href="notepad-extra-credit.html" style="color:#BBB;">Extra Credit</a>]
+ </span>
+</div>
+
+<h2>Step 1</h2>
+
+<p>Using the working <code>Notepadv3</code>, put breakpoints in the code at the
+ beginning of the <code>onCreate()</code>, <code>onPause()</code>,
+ <code>onSaveInstanceState()</code> and <code>onResume()</code> methods in the
+ <code>NoteEdit</code> class (if you are not familiar with Eclipse, just
+ right click in the narrow grey border on the left of the edit window at the
+ line you want a breakpoint, and select <em>Toggle Breakpoint</em>, you
+should see a blue dot appear).</p>
+
+<h2>Step 2</h2>
+
+<p>Now start the notepad demo in debug mode:</p>
+
+<ol type="a">
+ <li>
+ Right click on the <code>Notepadv3</code> project and from the Debug menu
+ select <em>Debug As -> Android Application.</em></li>
+ <li>
+ The Android emulator should say <em>"waiting for debugger to connect"</em>
+ briefly and then run the application.</li>
+ <li>
+ If it gets stuck on the waiting... screen, quit the emulator and Eclipse,
+ from the command line do an <code>adb kill-server</code>, and then restart
+Eclipse and try again.</li></ol>
+
+ <h2>Step 3</h2>
+
+<p>When you edit or create a new note you should see the breakpoints getting
+ hit and the execution stopping.</p>
+
+ <h2>Step 4</h2>
+
+<p>Hit the Resume button to let execution continue (yellow rectangle with a
+green triangle to its right in the Eclipse toolbars near the top).</p>
+
+<h2>Step 5</h2>
+
+<p>Experiment a bit with the confirm and back buttons, and try pressing Home and
+ making other mode changes. Watch what life-cycle events are generated and
+when.</p>
+
+<p>The Android Eclipse plugin not only offers excellent debugging support for
+your application development, but also superb profiling support. You can also
+try using <a href="{@docRoot}guide/developing/tools/traceview.html">Traceview</a> to profile your application. If your application is running too slow, this can help you
+find the bottlenecks and fix them.</p>
+
diff --git a/docs/html/resources/tutorials/notepad/notepad-index.jd b/docs/html/resources/tutorials/notepad/notepad-index.jd
new file mode 100644
index 0000000..151c50d
--- /dev/null
+++ b/docs/html/resources/tutorials/notepad/notepad-index.jd
@@ -0,0 +1,143 @@
+page.title=Notepad Tutorial
+@jd:body
+
+
+<p>The tutorial in this section gives you a "hands-on" introduction
+to the Android framework and the tools you use to build applications on it.
+Starting from a preconfigured project file, it guides you through the process of
+developing a simple notepad application and provides concrete examples of how to
+set up the project, develop the application logic and user interface, and then
+compile and run the application. </p>
+
+<p>The tutorial presents the notepad application development as a set of
+exercises (see below), each consisting of several steps. You can follow along
+with the steps in each exercise and gradually build up and refine your
+application. The exercises explain each step in detail and provide all the
+sample code you need to complete the application. </p>
+
+<p>When you are finished with the tutorial, you will have created a functioning
+Android application and learned in depth about many of the most important
+concepts in Android development. If you want to add more complex features to
+your application, you can examine the code in an alternative implementation
+of a notepad application, in the
+<a href="{@docRoot}samples/NotePad/index.html">Sample Code</a> documentation. </p>
+
+
+<a name="who"></a>
+<h2>Who Should Use this Tutorial</h2>
+
+<p>This tutorial is designed for experienced developers, especially those with
+knowledge of the Java programming language. If you haven't written Java
+applications before, you can still use the tutorial, but you might need to work
+at a slower pace. </p>
+
+<p>The tutorial assumes that you have some familiarity with the basic Android
+application concepts and terminology. If you aren't yet familiar with those, you
+should read <a href="{@docRoot}intro/anatomy.html">Overview of an Android
+Application</a> before continuing. </p>
+
+<p>Also note that this tutorial uses
+the Eclipse development environment, with the Android plugin installed. If you
+are not using Eclipse, you can follow the exercises and build the application,
+but you will need to determine how to accomplish the Eclipse-specific
+steps in your environment. </p>
+
+<a name="preparing"></a>
+<h2>Preparing for the Exercises</h2>
+
+<p>This tutorial builds on the information provided in the <a
+href="{@docRoot}intro/installing.html">Installing the SDK</a> and <a
+href="{@docRoot}intro/hello-android.html">Hello Android</a>
+documents, which explain in detail how to set up your development environment
+for building Android applications. Before you start this tutorial, you should
+read both these documents, have the SDK installed, and your work environment set up.</p>
+
+<p>To prepare for this lesson:</p>
+
+<ol>
+ <li>Download the <a href="codelab/NotepadCodeLab.zip">project
+ exercises archive (.zip)</a></li>
+ <li>Unpack the archive file to a suitable location on your machine</li>
+ <li>Open the <code>NotepadCodeLab</code> folder</li>
+</ol>
+
+<p>Inside the <code>NotepadCodeLab</code> folder, you should see six project
+files: <code>Notepadv1</code>,
+ <code>Notepadv2</code>, <code>Notepadv3</code>,
+ <code>Notepadv1Solution</code>, <code>Notepadv2Solution</code>
+ and <code>Notepadv3Solution</code>. The <code>Notepadv#</code> projects are
+the starting points for each of the exercises, while the
+<code>Notepadv#Solution</code> projects are the exercise
+ solutions. If you are having trouble with a particular exercise, you
+ can compare your current work against the exercise solution.</p>
+
+<a name="exercises"></a>
+<h2> Exercises</h2>
+
+ <p>The table below lists the tutorial exercises and describes the development
+areas that each covers. Each exercise assumes that you have completed any
+previous exercises.</p>
+
+ <table border="0" style="padding:4px;spacing:2px;" summary="This
+table lists the
+tutorial examples and describes what each covers. ">
+ <tr>
+ <th width="120"><a href="{@docRoot}intro/tutorial-ex1.html">Exercise
+1</a></th>
+ <td>Start here. Construct a simple notes list that lets the user add new notes but not
+edit them. Demonstrates the basics of <code>ListActivity</code> and creating
+and handling
+ menu options. Uses a SQLite database to store the notes.</td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}intro/tutorial-ex2.html">Exercise 2</a></th>
+ <td>Add a second Activity to the
+application. Demonstrates constructing a
+new Activity, adding it to the Android manifest, passing data between the
+activities, and using more advanced screen layout. Also shows how to
+invoke another Activity to return a result, using
+<code>startActivityForResult()</code>.</td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}intro/tutorial-ex3.html">Exercise 3</a></th>
+ <td>Add handling of life-cycle events to
+the application, to let it
+maintain application state across the life cycle. </td>
+ </tr>
+ <tr>
+ <th><a href="{@docRoot}intro/tutorial-extra-credit.html">Extra
+Credit</a></th>
+ <td>Demonstrates how to use the Eclipse
+debugger and how you can use it to
+view life-cycle events as they are generated. This section is optional but
+highly recommended.</td>
+ </tr>
+</table>
+
+
+<a name="other"></a>
+<h2>Other Resources and Further Learning</h2>
+<ul>
+<li>For a lighter but broader introduction to concepts not covered in the
+tutorial,
+take a look at <a href="{@docRoot}kb/commontasks.html">Common Android Tasks</a>.</li>
+<li>The Android SDK includes a variety of fully functioning sample applications
+that make excellent opportunities for further learning. You can find the sample
+applications in the <code>samples/</code> directory of your downloaded SDK.</li>
+<li>This tutorial draws from the full Notepad application included in the
+<code>samples/</code> directory of the SDK, though it does not match it exactly.
+When you are done with the tutorial,
+it is highly recommended that you take a closer look at this version of the Notepad
+application,
+as it demonstrates a variety of interesting additions for your application,
+such as:</li>
+ <ul>
+ <li>Setting up a custom striped list for the list of notes.</li>
+ <li>Creating a custom text edit view that overrides the <code>draw()</code>
+method to
+ make it look like a lined notepad.</li>
+ <li>Implementing a full <code>ContentProvider</code> for notes.</li>
+ <li>Reverting and discarding edits instead of just automatically saving
+them.</li>
+</ul>
+</ul>
diff --git a/docs/html/resources/tutorials/views/hello-autocomplete.jd b/docs/html/resources/tutorials/views/hello-autocomplete.jd
new file mode 100644
index 0000000..fba1ad8
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-autocomplete.jd
@@ -0,0 +1,116 @@
+page.title=Hello, AutoCompleteTextView
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>{@link android.widget.AutoCompleteTextView} is an implementation of the EditText widget that will provide
+auto-complete suggestions as the user types. The suggestions are extracted from a collection of strings.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloAutoComplete.</li>
+ <li>Open the layout file.
+ Make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Country" />
+
+ <AutoCompleteTextView android:id="@+id/edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+</LinearLayout>
+</pre>
+</li>
+
+<li>Open HelloAutoComplete.java and insert the following as the <code>onCreate</code> method:
+<pre>
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit);
+ ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
+ android.R.layout.simple_dropdown_item_1line, COUNTRIES);
+ textView.setAdapter(adapter);
+}
+</pre>
+ <p>Here, we create an AutoComplteteTextView from our layout. We then
+ create an {@link android.widget.ArrayAdapter} that binds a <code>simple_dropdown_item_1line</code>
+ layout item to each entry in the <code>COUNTRIES</code> array (which we'll add next).
+ The last part sets the ArrayAdapter to associate with our AutoCompleteTextView.</p>
+</li>
+
+<li>After the <code>onCreate()</code> method, add the String array:
+<pre>
+static final String[] COUNTRIES = new String[] {
+ "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
+ "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
+ "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
+ "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
+ "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
+ "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory",
+ "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
+ "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
+ "Cayman Islands", "Central African Republic", "Chad", "Chile", "China",
+ "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo",
+ "Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic",
+ "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic",
+ "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
+ "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland",
+ "Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia",
+ "French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar",
+ "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau",
+ "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", "Hungary",
+ "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Jamaica",
+ "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",
+ "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
+ "Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands",
+ "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova",
+ "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",
+ "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand",
+ "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "Northern Marianas",
+ "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru",
+ "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",
+ "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", "Saint Helena",
+ "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon",
+ "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Saudi Arabia", "Senegal",
+ "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
+ "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea",
+ "Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden",
+ "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "The Bahamas",
+ "The Gambia", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey",
+ "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
+ "Ukraine", "United Arab Emirates", "United Kingdom",
+ "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan",
+ "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis and Futuna", "Western Sahara",
+ "Yemen", "Yugoslavia", "Zambia", "Zimbabwe"
+};
+</pre>
+ <p>This is the list of suggestions that will be offered as the user types into the
+ AutoCompleteTextView.</p>
+</li>
+
+<li>Now run it.</li>
+</ol>
+<p>As you type, you should see something like this:</p>
+<img src="images/hello-autocomplete.png" width="150px" />
+
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.R.layout}</li>
+ <li>{@link android.widget.ArrayAdapter}</li>
+ <li>{@link android.widget.AutoCompleteTextView}</li>
+</ul>
+
+
diff --git a/docs/html/resources/tutorials/views/hello-datepicker.jd b/docs/html/resources/tutorials/views/hello-datepicker.jd
new file mode 100644
index 0000000..fcd43f3
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-datepicker.jd
@@ -0,0 +1,151 @@
+page.title=Hello, DatePicker
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.DatePicker} is a widget that allows the user to select a month, day and year.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloDatePicker.</li>
+ <li>Open the layout file and make it like so:
+ <pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/dateDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text=""/>
+
+ <Button android:id="@+id/pickDate"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Change the date"/>
+
+</LinearLayout>
+</pre>
+ <p>For the layout, we're using a vertical LinearLayout, with a {@link android.widget.TextView} that
+ will display the date and a {@link android.widget.Button} that will initiate the DatePicker dialog.
+ With this layout, the TextView will sit above the Button.
+ The text value in the TextView is set empty, as it will be filled
+ with the current date when our Activity runs.</p>
+ </li>
+
+ <li>Open HelloDatePicker.java. Insert the following to the HelloDatePicker class:
+<pre>
+ private TextView mDateDisplay;
+ private Button mPickDate;
+
+ private int mYear;
+ private int mMonth;
+ private int mDay;
+
+ static final int DATE_DIALOG_ID = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ // capture our View elements
+ mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
+ mPickDate = (Button) findViewById(R.id.pickDate);
+
+ // add a click listener to the button
+ mPickDate.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ showDialog(DATE_DIALOG_ID);
+ }
+ });
+
+ // get the current date
+ final Calendar c = Calendar.getInstance();
+ mYear = c.get(Calendar.YEAR);
+ mMonth = c.get(Calendar.MONTH);
+ mDay = c.get(Calendar.DAY_OF_MONTH);
+
+ // display the current date
+ updateDisplay();
+ }
+</pre>
+<p class="note"><strong>Tip:</strong> Press Ctrl(or Cmd) + Shift + O to import all needed packages.</p>
+ <p>We start by instantiating variables for our Views and date fields.
+ The <code>DATE_DIALOG_ID</code> is a static integer that uniquely identifies the Dialog. In the
+ <code>onCreate()</code> method, we get prepared by setting the layout and capturing the View elements.
+ Then we create an on-click listener for the Button, so that when it is clicked it will
+ show our DatePicker dialog. The <code>showDialog()</code> method will pop-up the date picker dialog
+ by calling the <code>onCreateDialog()</code> callback method
+ (which we'll define in the next section). We then create an
+ instance of {@link java.util.Calendar} and get the current year, month and day. Finally, we call
+ <code>updateDisplay()</code>—our own method (defined later) that will fill the TextView.</p>
+</li>
+
+<li>After the <code>onCreate()</code> method, add the <code>onCreateDialog()</code> callback method
+(which is called by <code>showDialog()</code>)
+<pre>
+@Override
+protected Dialog onCreateDialog(int id) {
+ switch (id) {
+ case DATE_DIALOG_ID:
+ return new DatePickerDialog(this,
+ mDateSetListener,
+ mYear, mMonth, mDay);
+ }
+ return null;
+}
+</pre>
+ <p>This method is passed the identifier we gave <code>showDialog()</code> and initializes
+ the DatePicker to the date we retrieved from our Calendar instance.</p>
+</li>
+
+<li>Following that, add the <code>updateDisplay()</code> method:
+<pre>
+ // updates the date we display in the TextView
+ private void updateDisplay() {
+ mDateDisplay.setText(
+ new StringBuilder()
+ // Month is 0 based so add 1
+ .append(mMonth + 1).append("-")
+ .append(mDay).append("-")
+ .append(mYear).append(" "));
+ }
+</pre>
+<p>This uses the member date values to write the date to our TextView.</p>
+</li>
+<li>Finally, add a listener that will be called when the user sets a new date:
+<pre>
+ // the callback received when the user "sets" the date in the dialog
+ private DatePickerDialog.OnDateSetListener mDateSetListener =
+ new DatePickerDialog.OnDateSetListener() {
+
+ public void onDateSet(DatePicker view, int year,
+ int monthOfYear, int dayOfMonth) {
+ mYear = year;
+ mMonth = monthOfYear;
+ mDay = dayOfMonth;
+ updateDisplay();
+ }
+ };
+</pre>
+ <p>This <code>OnDateSetListener</code> method listens for when the user is done setting the date
+ (clicks the "Set" button). At that time, this fires and we update our member fields with
+ the new date defined by the user and update our TextView by calling <code>updateDisplay()</code>.</p>
+</li>
+
+<li>Now run it.</li>
+</ol>
+<p>When you press the "Change the date" button, you should see the following:</p>
+<img src="images/hello-datepicker.png" width="150px" />
+
+<h3>References</h3>
+<ul>
+<li>{@link android.widget.DatePicker}</li>
+<li>{@link android.widget.Button}</li>
+<li>{@link android.widget.TextView}</li>
+<li>{@link java.util.Calendar}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-formstuff.jd b/docs/html/resources/tutorials/views/hello-formstuff.jd
new file mode 100644
index 0000000..da4289c
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-formstuff.jd
@@ -0,0 +1,262 @@
+page.title=Hello, Form Stuff
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>This page introduces a variety of widgets, like image buttons,
+text fields, checkboxes and radio buttons.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloFormStuff.</li>
+ <li>Your layout file should have a basic LinearLayout:
+ <pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+</LinearLayout>
+</pre>
+ <p>For each widget you want to add, just put the respective View inside here.</p>
+</li>
+</ol>
+<p class="note"><strong>Tip:</strong> As you add new Android code, press Ctrl(or Cmd) + Shift + O
+to import all needed packages.</p>
+
+
+<h2>ImageButton</h2>
+<p>A button with a custom image on it.
+We'll make it display a message when pressed.</p>
+<ol>
+ <li><img src="images/android.png" align="right"/>
+ Drag the Android image on the right (or your own image) into the
+ res/drawable/ directory of your project.
+ We'll use this for the button.</li>
+ <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.ImageButton} element:
+<pre>
+<ImageButton
+ android:id="@+id/android_button"
+ android:layout_width="100dip"
+ android:layout_height="wrap_content"
+ android:src="@drawable/android" />
+</pre>
+ <p>The source of the button
+ is from the res/drawable/ directory, where we've placed the android.png.</p>
+ <p class="note"><strong>Tip:</strong> You can also reference some of the many built-in
+ images from the Android {@link android.R.drawable} resources,
+ like <code>ic_media_play</code>, for a "play" button image. To do so, change the source
+ attribute to <code>android:src="@android:drawable/ic_media_play"</code>.</p>
+</li>
+<li>To make the button to actually do something, add the following
+code at the end of the <code>onCreate()</code> method:
+<pre>
+final ImageButton button = (ImageButton) findViewById(R.id.android_button);
+button.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ // Perform action on clicks
+ Toast.makeText(HelloFormStuff.this, "Beep Bop", Toast.LENGTH_SHORT).show();
+ }
+});
+</pre>
+<p>This captures our ImageButton from the layout, then adds an on-click listener to it.
+The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
+defines the action to be made when the button is clicked. Here, we show a
+{@link android.widget.Toast} message when clicked.</p>
+</li>
+<li>Run it.</li>
+</ol>
+
+
+<h2>EditText</h2>
+<p>A text field for user input. We'll make it display the text entered so far when the "Enter" key is pressed.</p>
+
+<ol>
+ <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.EditText} element:
+<pre>
+<EditText
+ android:id="@+id/edittext"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+</pre>
+</li>
+<li>To do something with the text that the user enters, add the following code
+to the end of the <code>onCreate()</code> method:
+<pre>
+final EditText edittext = (EditText) findViewById(R.id.edittext);
+edittext.setOnKeyListener(new OnKeyListener() {
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
+ // Perform action on key press
+ Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ return false;
+ }
+});
+</pre>
+<p>This captures our EditText element from the layout, then adds an on-key listener to it.
+The {@link android.view.View.OnKeyListener} must define the <code>onKey()</code> method, which
+defines the action to be made when a key is pressed. In this case, we want to listen for the
+Enter key (when pressed down), then pop up a {@link android.widget.Toast} message with the
+text from the EditText field. Be sure to return <var>true</var> after the event is handled,
+so that the event doesn't bubble-up and get handled by the View (which would result in a
+carriage return in the text field).</p>
+<li>Run it.</li>
+</ol>
+
+
+<h2>CheckBox</h2>
+<p>A checkbox for selecting items. We'll make it display the the current state when pressed.</p>
+
+<ol>
+ <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.CheckBox} element:
+<pre>
+<CheckBox android:id="@+id/checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="check it out" />
+</pre>
+</li>
+<li>To do something when the state is changed, add the following code
+to the end of the <code>onCreate()</code> method:
+<pre>
+final CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox);
+checkbox.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ // Perform action on clicks
+ if (checkbox.isChecked()) {
+ Toast.makeText(HelloFormStuff.this, "Selected", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(HelloFormStuff.this, "Not selected", Toast.LENGTH_SHORT).show();
+ }
+ }
+});
+</pre>
+<p>This captures our CheckBox element from the layout, then adds an on-click listener to it.
+The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
+defines the action to be made when the checkbox is clicked. Here, we query the current state of the
+checkbox, then pop up a {@link android.widget.Toast} message that displays the current state.
+Notice that the CheckBox handles its own state change between checked and un-checked, so we just
+ask which it currently is.</p>
+<li>Run it.</li>
+</ol>
+<p class="note"><strong>Tip:</strong> If you find that you need to change the state
+in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
+use <code>setChecked(true)</code> or <code>toggle()</code>.</p>
+
+
+<h2>RadioButton</h2>
+<p>Two mutually-exclusive radio buttons—enabling one disables the other.
+When each is pressed, we'll pop up a message.</p>
+
+<ol>
+ <li>Open the layout file and, inside the LinearLayout, add two {@link android.widget.RadioButton}s,
+inside a {@link android.widget.RadioGroup}:
+<pre>
+<RadioGroup
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <RadioButton android:id="@+id/radio_red"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Red" />
+
+ <RadioButton android:id="@+id/radio_blue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Blue" />
+
+</RadioGroup>
+</pre>
+</li>
+<li>To do something when each is selected, we'll need an OnClickListener. Unlike the other
+listeners we've created, instead of creating this one as an anonymous inner class,
+we'll create it as a new object. This way, we can re-use the OnClickLIstener for
+both RadioButtons. So, add the following code in the HelloFormStuff Activity
+(<em>outside</em> the <code>onCreate()</code> method):
+<pre>
+OnClickListener radio_listener = new OnClickListener() {
+ public void onClick(View v) {
+ // Perform action on clicks
+ RadioButton rb = (RadioButton) v;
+ Toast.makeText(HelloFormStuff.this, rb.getText(), Toast.LENGTH_SHORT).show();
+ }
+};
+</pre>
+<p>Our <code>onClick()</code> method will be handed the View clicked, so the first thing to do
+is cast it into a RadioButton. Then we pop up a
+{@link android.widget.Toast} message that displays the selection.</p>
+<li>Now, at the bottom of the <code>onCreate()</code> method, add the following:
+<pre>
+ final RadioButton radio_red = (RadioButton) findViewById(R.id.radio_red);
+ final RadioButton radio_blue = (RadioButton) findViewById(R.id.radio_blue);
+ radio_red.setOnClickListener(radio_listener);
+ radio_blue.setOnClickListener(radio_listener);
+</pre>
+<p>This captures each of the RadioButtons from our layout and adds the newly-created
+OnClickListener to each.</p>
+<li>Run it.</li>
+</ol>
+<p class="note"><strong>Tip:</strong> If you find that you need to change the state of a
+RadioButton in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
+use <code>setChecked(true)</code> or <code>toggle()</code>.</p>
+
+
+<h2>ToggleButton</h2>
+<p>A button used specifically for toggling something on and off.</p>
+
+<ol>
+ <li>Open the layout file and, inside the LinearLayout, add the {@link android.widget.ToggleButton} element:
+<pre>
+<ToggleButton android:id="@+id/togglebutton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+</pre>
+</li>
+<li>To do something when the state is changed, add the following code
+to the end of the <code>onCreate()</code> method:
+<pre>
+final ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton);
+togglebutton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ // Perform action on clicks
+ if (togglebutton.isChecked()) {
+ Toast.makeText(HelloFormStuff.this, "ON", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(HelloFormStuff.this, "OFF", Toast.LENGTH_SHORT).show();
+ }
+ }
+});
+</pre>
+<p>This captures our ToggleButton element from the layout, then adds an on-click listener to it.
+The {@link android.view.View.OnClickListener} must define the <code>onClick()</code> method, which
+defines the action to be made when the button is clicked. Here, we query the current state of the
+ToggleButton, then pop up a {@link android.widget.Toast} message that displays the current state.
+Notice that the ToggleButton handles its own state change between checked and un-checked, so we just
+ask which it is.</p>
+<li>Run it.</li>
+</ol>
+
+<p class="note"><strong>Tip:</strong> By default, the text on the button is "ON" and "OFF", but
+you can change each of these with <code>setTextOn(<var>CharSequence</var>)</code> and
+<code>setTextOff(<var>CharSequence</var>)</code>. And, if you find that you need to change the state
+in another way (such as when loading a saved {@link android.preference.CheckBoxPreference}),
+use <code>setChecked(true)</code> or <code>toggle()</code>. </p>
+
+
+<p>If you've added all the form items above, your application should look something like this:</p>
+<img src="images/hello-formstuff.png" width="150px" />
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.ImageButton}</li>
+ <li>{@link android.widget.EditText}</li>
+ <li>{@link android.widget.CheckBox}</li>
+ <li>{@link android.widget.RadioButton}</li>
+ <li>{@link android.widget.ToggleButton}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-gallery.jd b/docs/html/resources/tutorials/views/hello-gallery.jd
new file mode 100644
index 0000000..084f912
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-gallery.jd
@@ -0,0 +1,135 @@
+page.title=Hello, Gallery
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.Gallery} is a View commonly used to display items in a horizontally scrolling list
+that locks the current selection at the center. When one is selected, we'll show a message.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloGallery.</li>
+ <li>Add some images to your res/drawable/ directory.</li>
+ <li>Open the layout file and make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gallery"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+/>
+</pre>
+</li>
+
+
+<li>Open the HelloGallery.java file. Insert the following for the <code>onCreate()</code> method:
+<pre>
+@Override
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ Gallery g = (Gallery) findViewById(R.id.gallery);
+ g.setAdapter(new ImageAdapter(this));
+
+ g.setOnItemClickListener(new OnItemClickListener() {
+ public void onItemClick(AdapterView parent, View v, int position, long id) {
+ Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show();
+ }
+ });
+}
+</pre>
+ <p>We start as usual: set the layout and capture the View we want (our Gallery).
+We then set an Adapter, called ImageAdapter for the Gallery—this is a new class that
+we'll create next. Then we create an item click listener for the Gallery. This is like a normal
+on-click listener (which you might be familiar with for buttons), but it listens to each item
+that we've added to the Gallery. The <code>onItemClick()</code> callback method
+receives the AdapterView where the click occurred, the specific View that received the click, the
+position of the View clicked (zero-based), and the row id of the item clicked (if applicable). All
+that we care about is the position, so that we can pop up a {@link android.widget.Toast} message that
+tells us the index position of the item clicked. We do this with <code>Toast.makeText().show()</code>.
+</p>
+</li>
+
+<li>After the <code>onCreate()</code> method, add the <code>ImageAdapter</code> class:
+<pre>
+public class ImageAdapter extends BaseAdapter {
+ int mGalleryItemBackground;
+ private Context mContext;
+
+ private Integer[] mImageIds = {
+ R.drawable.sample_1,
+ R.drawable.sample_2,
+ R.drawable.sample_3,
+ R.drawable.sample_4,
+ R.drawable.sample_5,
+ R.drawable.sample_6,
+ R.drawable.sample_7
+ };
+
+ public ImageAdapter(Context c) {
+ mContext = c;
+ TypedArray a = obtainStyledAttributes(android.R.styleable.Theme);
+ mGalleryItemBackground = a.getResourceId(
+ android.R.styleable.Theme_galleryItemBackground, 0);
+ a.recycle();
+ }
+
+ public int getCount() {
+ return mImageIds.length;
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ImageView i = new ImageView(mContext);
+
+ i.setImageResource(mImageIds[position]);
+ i.setLayoutParams(new Gallery.LayoutParams(150, 100));
+ i.setScaleType(ImageView.ScaleType.FIT_XY);
+ i.setBackgroundResource(mGalleryItemBackground);
+
+ return i;
+ }
+}
+</pre>
+<p>First, there are a few member variables, including an array of IDs that reference
+the images we placed in our drawable resources directory.</p>
+<p>Next is the constructor, where we define the member Context. The rest of the constructor
+sets up a reference for our Gallery them, which adds the nice framing for each Gallery item.
+Once we have our <code>mGalleryItemBackground</code>, it's important to recycle the
+StyledAttribute for later re-use.</p>
+<p>The next three methods are required for basic member queries.
+But then we have the <code>getView()</code> method, which is called
+for each item read by our ImageAdapter, when the Gallery is being built. Here, we
+use our member Context to create a new {@link android.widget.ImageView}. We then define
+the image resource with the current position of the Gallery items (corresponding to our
+array of drawables), set the dimensions for the ImageView,
+set the image scaling to fit the ImageView dimensions, then finally set the
+background theme for the ImageView.</p>
+
+<p>See {@link android.widget.ImageView.ScaleType}
+for other image scaling options, in case you want to avoid stretching images that don't
+exactly match the ImageView dimensions.</p>
+
+<li>Now run it.</li>
+</ol>
+<p>You should see something like this:</p>
+<img src="images/hello-gallery.png" width="150px" />
+
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.BaseAdapter}</li>
+ <li>{@link android.widget.Gallery}</li>
+ <li>{@link android.widget.ImageView}</li>
+ <li>{@link android.widget.Toast}</li>
+</ul>
+
+
diff --git a/docs/html/resources/tutorials/views/hello-gridview.jd b/docs/html/resources/tutorials/views/hello-gridview.jd
new file mode 100644
index 0000000..ffb6c93
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-gridview.jd
@@ -0,0 +1,129 @@
+page.title=Hello, GridView
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.GridView} displays items in a two-dimensional, scrolling grid. The items
+are acquired from a {@link android.widget.ListAdapter}.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloGridView.</li>
+ <li>Find some photos you'd like to use, or copy some from the SDK samples res/drawable/
+ folder of your project.</li>
+ <li>Open the layout and make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gridview"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:numColumns="auto_fit"
+ android:verticalSpacing="10dp"
+ android:horizontalSpacing="10dp"
+ android:columnWidth="90dp"
+ android:stretchMode="columnWidth"
+ android:gravity="center"
+/>
+</pre>
+</li>
+ <li>Open the HelloGridView Java file. Insert the following for the <code>onCreate()</code> method:
+<pre>
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ GridView gridview = (GridView) findViewById(R.id.gridview);
+ gridview.setAdapter(new ImageAdapter(this));
+}
+</pre>
+ <p>Here, we get a handle on our GridView, from the layout, and give it an Adapter.
+ We're actually going to create our own Adapter called ImageAdapter.</p>
+</li>
+<li>Create a new class (nested or otherwise), called ImageAdapter, which extends {@link android.widget.BaseAdapter}:
+<pre>
+public class ImageAdapter extends BaseAdapter {
+ private Context mContext;
+
+ public ImageAdapter(Context c) {
+ mContext = c;
+ }
+
+ public int getCount() {
+ return mThumbIds.length;
+ }
+
+ public Object getItem(int position) {
+ return null;
+ }
+
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ // create a new ImageView for each item referenced by the Adapter
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ImageView imageView;
+ if (convertView == null) { // if it's not recycled, initialize some attributes
+ imageView = new ImageView(mContext);
+ imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
+ imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ imageView.setPadding(8, 8, 8, 8);
+ } else {
+ imageView = (ImageView) convertView;
+ }
+
+ imageView.setImageResource(mThumbIds[position]);
+ return imageView;
+ }
+
+ // references to our images
+ private Integer[] mThumbIds = {
+ R.drawable.sample_2, R.drawable.sample_3,
+ R.drawable.sample_4, R.drawable.sample_5,
+ R.drawable.sample_6, R.drawable.sample_7,
+ R.drawable.sample_0, R.drawable.sample_1,
+ R.drawable.sample_2, R.drawable.sample_3,
+ R.drawable.sample_4, R.drawable.sample_5,
+ R.drawable.sample_6, R.drawable.sample_7,
+ R.drawable.sample_0, R.drawable.sample_1,
+ R.drawable.sample_2, R.drawable.sample_3,
+ R.drawable.sample_4, R.drawable.sample_5,
+ R.drawable.sample_6, R.drawable.sample_7
+ };
+}
+</pre>
+ <p>First we take care of some required methods inherited from BaseAdapter.
+ The constructor and <code>getCount()</code> are self-explanitory. Normally, <code>getItem()</code>
+ should return the actual object at the specified position in our Adapter, but for this Hello World,
+ we're not going to bother. Likewise, <code>getItemId()</code> should return the row id of
+ the item, but right now we don't care.</p>
+ <p>However, <code>getView()</code> is the method we care about. This one creates a new View for each image that we
+ put in our ImageAdapter. So we're going to create an ImageView each time. When this is called, we're
+ going to receive a View, which is likely a recycled View object (at least after the first call), so we
+ check for this—if it's null, we initialize the ImageView and setup all the properties we want.
+ The <code>LayoutParams()</code> initialization sets the height and width of the View—this ensures
+ that no matter the drawable size, each image is resized and cropped to fit in the ImageView (if necessary).
+ With <code>setScaleType()</code>, we say that images should be cropped toward the center (if necessary).
+ And finally, we set the padding within the ImageView. (Note that, if the images have various aspect-ratios,
+ as they do in this demo, then less padding will cause for more cropping of the image, if it does not match
+ the dimensions given to the ImageView.) At the end of <code>getView()</code> we set the image resource and
+ return the ImageView.</p>
+ <p>All that's left is our array or drawable resources at the bottom.</p>
+</li>
+<li>Run it.</li>
+</ol>
+<p>Your grid layout should look something like this:</p>
+<img src="images/hello-gridview.png" width="150px" />
+
+<p>Try experimenting with the behaviors of the GridView and ImageView by adjusting their properties. For example,
+ instead of setting the ImageView LayoutParams, you can try using
+ {@link android.widget.ImageView#setAdjustViewBounds(boolean)}. </p>
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.GridView}</li>
+ <li>{@link android.widget.ImageView}</li>
+ <li>{@link android.widget.BaseAdapter}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-linearlayout.jd b/docs/html/resources/tutorials/views/hello-linearlayout.jd
new file mode 100644
index 0000000..0e8947c
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-linearlayout.jd
@@ -0,0 +1,130 @@
+page.title=Hello, LinearLayout
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.LinearLayout} is a GroupView that will lay child View elements
+vertically or horizontally.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloLinearLayout.</li>
+ <li>Open the layout file.
+ Make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_weight="1">
+
+ <TextView
+ android:text="red"
+ android:gravity="center_horizontal"
+ android:background="#aa0000"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="green"
+ android:gravity="center_horizontal"
+ android:background="#00aa00"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="blue"
+ android:gravity="center_horizontal"
+ android:background="#0000aa"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="yellow"
+ android:gravity="center_horizontal"
+ android:background="#aaaa00"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_weight="1">
+
+ <TextView
+ android:text="row one"
+ android:textSize="15pt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="row two"
+ android:textSize="15pt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="row three"
+ android:textSize="15pt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+ <TextView
+ android:text="row four"
+ android:textSize="15pt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+ </LinearLayout>
+
+</LinearLayout>
+</pre>
+ <p>Carefully inspect the XML. You'll notice how this layout works a lot like
+ an HTML layout. There is one parent LinearLayout that is defined to lay
+ its child elements vertically. The first child is another LinearLayout that uses a horizontal layout
+ and the second uses a vertical layout. Each LinearLayout contains several {@link android.widget.TextView}
+ elements.</p>
+</li>
+<li>Now open the HelloLinearLayout Activity and be sure it loads this layout in the <code>onCreate()</code> method:</p>
+<pre>
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+}
+</pre>
+<p><code>R.layout.main</code> refers to the <code>main.xml</code> layout file.</p>
+</li>
+<li>Run it.</li>
+</ol>
+<p>You should see the following:</p>
+<img src="images/hello-linearlayout.png" width="150px" />
+
+<p>Notice how the various XML attributes define the View's behavior.
+Pay attention to the effect of the <code>layout_weight</code>. Try
+ experimenting with different values to see how the screen real estate is
+ distributed based on the weight of each element.</p>
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.LinearLayout}</li>
+<li>{@link android.widget.TextView}</li>
+</ul>
+
+
diff --git a/docs/html/resources/tutorials/views/hello-listview.jd b/docs/html/resources/tutorials/views/hello-listview.jd
new file mode 100644
index 0000000..d90005b
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-listview.jd
@@ -0,0 +1,90 @@
+page.title=Hello, ListView
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.ListView} is a View that shows items in a vertically scrolling list. The items are
+ acquired from a {@link android.widget.ListAdapter}.</p>
+
+
+<ol>
+ <li>Start a new project/ListActivity called HelloListView.</li>
+ <li>Open the HelloListView Java file. Make the class extend ListActivity (instead of Activity).
+ <pre>public class HelloListView extends ListActivity {</pre>
+ </li>
+ <li>Insert the following for the <code>onCreate()</code> method:
+<pre>
+@Override
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setListAdapter(new ArrayAdapter<String>(this,
+ android.R.layout.simple_list_item_1, COUNTRIES));
+ getListView().setTextFilterEnabled(true);
+}
+</pre>
+ <p>Notice that we don't need to load a layout (at least, not in this case, because we're using
+ the whole screen for our list). Instead, we just call <code>setListAdapter()</code> (which automatically
+ adds a ListView to the ListActivity), and provide it with an ArrayAdapter that binds a
+ <code>simple_list_item_1</code> layout item to each entry in the <code>COUNTRIES</code>
+ array (added next). The next line of code adds a text filter to the ListView, so that when the user
+ begins typing, the list will filter the entire view to display only the items that match the entry.</p>
+ </li>
+ <li>Following the <code>onCreate()</code> method, add the String array:
+<pre>
+ static final String[] COUNTRIES = new String[] {
+ "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
+ "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
+ "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
+ "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
+ "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
+ "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory",
+ "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
+ "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
+ "Cayman Islands", "Central African Republic", "Chad", "Chile", "China",
+ "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo",
+ "Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic",
+ "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic",
+ "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
+ "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland",
+ "Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia",
+ "French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar",
+ "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau",
+ "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", "Hungary",
+ "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Jamaica",
+ "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",
+ "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
+ "Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands",
+ "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova",
+ "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",
+ "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand",
+ "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "Northern Marianas",
+ "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru",
+ "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",
+ "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", "Saint Helena",
+ "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon",
+ "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Saudi Arabia", "Senegal",
+ "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
+ "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea",
+ "Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden",
+ "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "The Bahamas",
+ "The Gambia", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey",
+ "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
+ "Ukraine", "United Arab Emirates", "United Kingdom",
+ "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan",
+ "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis and Futuna", "Western Sahara",
+ "Yemen", "Yugoslavia", "Zambia", "Zimbabwe"
+ };
+</pre>
+</li>
+<li> Run it.</li>
+</ol>
+<p>You can scroll the list, or type to filter it. You should see something like this:</p>
+<img src="images/hello-listview.png" width="150px" />
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.ListView}</li>
+ <li>{@link android.widget.ListAdapter}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-mapview.jd b/docs/html/resources/tutorials/views/hello-mapview.jd
new file mode 100644
index 0000000..531300f
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-mapview.jd
@@ -0,0 +1,273 @@
+page.title=Hello, MapView
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<div class="special">
+<p>This tutorial requires that you have the Google Maps external library
+installed in your SDK environment. By default the Android SDK includes the
+Google APIs add-on, which in turn includes the Maps external library. If you
+don't have the Google APIs SDK add-on, you can download it from this
+location:</p>
+
+<p style="margin-left:2em;"><a
+href="http://code.google.com/android/add-ons/google-apis">http://code.google.com/android/add-ons/google-apis</a></p>
+
+<p>The Google APIs add-on requires Android 1.5 SDK or later release. After
+installing the add-on in your SDK, set your project properties to use the build
+target called "Google APIs Add-on". See the instructions for setting a build
+target in <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>
+
+<p>You will also need to use the android tool to set up an AVD that uses the
+Google APIs deployment target. See <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a> for
+more information. Once you have set up your environment, you will be able to
+build and run the project described in this tutorial</a></p>
+
+</div>
+
+<p>A MapView allows you to create your own map-viewing Activity.
+First, we'll create a simple Activity that can view and navigate a map. Then we will add some overlay items.</p>
+
+<ol>
+ <li>Start a new project/Activity called HelloMapView.
+
+ <li>Because we're using the Google Maps library,
+ which is not a part of the standard Android library, we need to
+ declare it in the Android Manifest. Open the AndroidManifest.xml
+ file and add the following as a child of the <code><application></code> element:
+
+ <pre><uses-library android:name="com.google.android.maps" /></pre>
+ </li>
+ <li>We also need access to the internet in order to retrieve the Google Maps tiles,
+ so the application must request the {@link android.Manifest.permission#INTERNET INTERNET} permissions.
+ In the manifest file, add the following as a child of the <code><manifest></code> element:
+ <pre><uses-permission android:name="android.permission.INTERNET" /></pre>
+ </li>
+ <li>Now open the main layout file for your project. Define a layout with a com.google.android.maps.MapView
+ inside a android.widget.RelativeLayout:
+
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/mainlayout"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <com.google.android.maps.MapView
+ android:id="@+id/mapview"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:clickable="true"
+ android:apiKey="<em>Your Maps API Key</em>"
+ />
+
+</RelativeLayout>
+</pre>
+ <p>The <code>clickable</code> attribute defines whether you want to allow user-interaction with the map.
+ In this case, we set it "true" so that the user can navigate.</p>
+
+ <p>The <code>apiKey</code> attribute holds the Google Maps API Key that proves your application and signer
+ certificate has been registered with the Google Maps service. Because MapView uses Google Maps data, this key is required
+ in order to receive the map data, even while you are developing. Registration is free and it only takes a couple
+ minutes to register your certificate and receive a Maps API Key. For instructions on getting a key, read
+ <a href="http://code.google.com/android/add-ons/google-apis/mapkey.html">Obtaining a Maps API Key</a>.
+ (For the purpose of this tutorial, you should register with the fingerprint of the SDK debug certificate.)
+ Once you've acquired the Maps API Key, insert it for the <code>apiKey</code> value.</p></li>
+
+ <li>Now open the HelloMapView.java file. For this Activity, we're going to extend the special sub-class of
+ Activity called MapActivity, so change the class declaration to extend
+ MapActicity, instead of Activity:</p>
+
+ <pre>public class HelloMapView extends MapActivity {</pre>
+
+ <li>The <code>isRouteDisplayed()</code> method is required, so add it inside the class:
+<pre>
+@Override
+protected boolean isRouteDisplayed() {
+ return false;
+}
+</pre>
+<p>You can actually run this now, but all it does is allow you to pan around the map.</p>
+<p>Android provides a handy {@link android.widget.ZoomControls} widget for zooming in and out of a View.
+MapView can automatically hook one for us by requesting it with the <code>getZoomControls()</code>
+method. Let's do this.</p>
+
+<li>Go back to the layout file. We need a new ViewGroup element, in which we'll
+ place the ZoomControls. Just below the MapView element (but inside the RelativeLayout), add this element:
+<pre>
+<LinearLayout
+ android:id="@+id/zoomview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBottom="@id/mapview"
+ android:layout_centerHorizontal="true"
+/></pre>
+
+ <p>It doesn't really matter what kind of ViewGroup we use, because we just want a
+ container that we can position within our root RelativeLayout.</p>
+
+ <p>The last two attributes are available only to an element that's a child of a
+ RelativeLayout. <code>layout_alignBottom</code> aligns the bottom of this element to the bottom of
+ the element identified with a resource tag (which must be a sibling to this element).
+ <code>layout_centerHorizontal</code> centers this on the horizontal plane.</p></li>
+
+ <li>Now go back to the HelloMapView class. We'll now retrieve the ZoomControls object from
+ the MapView and add it to our new layout element. First, at the top of the HelloMapView,
+ instantiate handles for the MapView and LinearLayout, plus a ZoomControl object:
+<pre>
+LinearLayout linearLayout;
+MapView mapView;
+ZoomControls mZoom;</pre></li>
+
+ <li>Then initialize each of these in <code>onCreate()</code>. We'll capture the LinearLayout and
+ MapView through their layout resources. Then get the ZoomControls from the MapView::
+<pre>
+linearLayout = (LinearLayout) findViewById(R.id.zoomview);
+mapView = (MapView) findViewById(R.id.mapview);
+mZoom = (ZoomControls) mapView.getZoomControls();</pre>
+
+ <p>By using the ZoomControls object provided by MapView, we don't have to do any of the work
+ required to actually perform the zoom operations. The ZoomControls widget that MapView
+ returns for us is already hooked into the MapView and works as soon as we add it to the
+ layout. The controls will appear whenever the user touches the map, then dissapear after
+ a few moments of inactivity.</p></li>
+
+ <li>Now just plug our ZoomControls into the LinearLayout we added:
+
+ <pre>linearLayout.addView(mZoom);</pre></li>
+
+ <li>Run it.</li>
+</ol>
+
+<hr/>
+
+<p>So, we now have full interaction controls. All well and good, but what we really want our map
+for is custom markers and layovers. Let's add some Overlay
+objects to our map. To do this, we're going to
+implement the ItemizedOverlay
+class, which can manage a whole set of Overlay items for us.</p>
+
+<ol>
+ <li>Create a new Java class named HelloItemizedOverlay that implements ItemizedOverlay.
+
+ <p>When using Eclipse, right-click the package name in the Eclipse Package Explorer, and select New > Class. Fill-in
+ the Name field as <em>HelloItemizedOverlay</em>. For the Superclass, enter
+ <em>com.google.android.maps.ItemizedOverlay</em>. Click the checkbox for <em>Constructors from
+ superclass</em>. Click Finish.</p></li>
+
+ <li> First thing, we need an OverlayItem ArrayList, in which we'll put each of the OverlayItem
+ objects we want on our map. Add this at the top of the HelloItemizedOverlay class:
+
+ <pre>private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();</pre></li>
+
+ <li>All the constructor does is define the default marker to be used on each of the OverlayItems.
+ In order for the Drawable to actually get drawn, it must have its bounds defined. And we want the
+ center-point at the bottom of the image to be the point at which it's attached to the map
+ coordinates. We handle all this with the boundCenterBottom() method. Wrap this around our
+ defaultMarker, so the super constructor call looks like this:
+
+ <pre>super(boundCenterBottom(defaultMarker));</pre></li>
+
+ <li>In order to add new OverlayItems to our ArrayList, we need a new public method. We'll handle
+ this with the following method:
+
+<pre>
+public void addOverlay(OverlayItem overlay) {
+ mOverlays.add(overlay);
+ populate();
+}</pre>
+
+ <p>Each time we add a new OverlayItem, we must call <code>populate()</code>, which will read each of out
+ OverlayItems and prepare them to be drawn.</p></li>
+
+ <li>In order for the <code>populate()</code> method to read each OverlayItem, it will make a request to
+ <code>createItem(int)</code>. We must define this method to properly read from our ArrayList. Replace the
+ existing contents of the createItem method with a <code>get()</code> call to our ArrayList:
+
+<pre>
+@Override
+protected OverlayItem createItem(int i) {
+ return mOverlays.get(i);
+}
+</pre></li>
+
+ <li>We're also required to override the <code>size()</code> method. Replace the existing contents of the
+ method with a size request to our ArrayList:
+
+ <pre>return mOverlays.size();</pre></li>
+</ol>
+
+
+<p>That's it for the HelloItemizedOverlay class. We're now ready to use it.</p>
+
+<hr/>
+<p>Go back to the HelloMapView
+class. We'll start by creating one OverlayItem, adding to an instance of our HelloItemizedOverlay,
+and then adding this to the MapView.</p>
+
+<img src="images/androidmarker.png" align="right" />
+<p>First, we need the image that we'll use for our map overlay. Here, we'll use the Android on the
+right as our marker. Drag this image (or your own) to the res/drawable/ directory of your project workspace.</p>
+
+<p>Now we're ready to work in the HelloMapView:</p>
+
+<ol>
+ <li>First we need some more types. Add the following at the top of the HelloMapView class:
+
+<pre>
+List<Overlay> mapOverlays;
+Drawable drawable;
+HelloItemizedOverlay itemizedOverlay;</pre></li>
+
+ <li>Now pick up where we left off in the <code>onCreate()</code> method. Instantiate the
+ new fields:
+
+<pre>
+mapOverlays = mapView.getOverlays();
+drawable = this.getResources().getDrawable(R.drawable.androidmarker);
+itemizedoverlay = new HelloItemizedOverlay(drawable);</pre>
+
+ <p>All overlay elements on a map are held by the MapView, so when we want to add some, we must
+ first retrieve the List with <code>getOverlays()</code> methods. We instantiate the Drawable, which will
+ be used as our map marker, by using our Context resources to get the Drawable we placed in
+ the res/drawable/ directory (androidmarker.png). Our HelloItemizedOverlay takes the Drawable in order to set the
+ default marker.</p></li>
+
+ <li>Now let's make our first OverlayItem by creating a GeoPoint
+ that defines our map coordinates, then pass it to a new OverlayItem:
+
+<pre>
+GeoPoint point = new GeoPoint(19240000,-99120000);
+OverlayItem overlayitem = new OverlayItem(point, "", "");</pre>
+
+ <p>GeoPoint coordinates are based in microdegrees (degrees * 1e6). The OverlayItem takes this
+ GeoPoint and two strings. Here, we won't concern ourselves with the strings, which can display
+ text when we click our marker, because we haven't yet written the click handler for the OverlayItem.</p></li>
+
+ <li>All that's left is for us to add this OverlayItem to our collection in the HelloItemizedOverlay,
+ and add this to the List of Overlay objects retrieved from the MapView:
+
+<pre>
+itemizedoverlay.addOverlay(overlayitem);
+mapOverlays.add(itemizedoverlay);</pre></li>
+
+ <li>Run it!</li>
+</ol>
+
+<p>We've sent our droid to Mexico City. Hola, Mundo!</p>
+<p>You should see the following:</p>
+<img src="images/hello-mapview.png" width="150px" />
+
+<p>Because we created our ItemizedOverlay class with an ArrayList, we can continue adding new
+OverlayItems. Try adding another one. Before the <code>addOverlay()</code> method is called, add these lines:</p>
+<pre>
+GeoPoint point2 = new GeoPoint(35410000, 139460000);
+OverlayItem overlayitem2 = new OverlayItem(point2, "", "");
+</pre>
+<p>Run it again... We've sent a new droid to Tokyo. Sekai, konichiwa!</p>
+
diff --git a/docs/html/resources/tutorials/views/hello-relativelayout.jd b/docs/html/resources/tutorials/views/hello-relativelayout.jd
new file mode 100644
index 0000000..1b91537
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-relativelayout.jd
@@ -0,0 +1,75 @@
+page.title=Hello, RelativeLayout
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.RelativeLayout} is a ViewGroup that allows you to layout child elements
+in positions relative to the parent or siblings elements.</p>
+
+<ol>
+ <li>Start a new project/Activity called HelloRelativeLayout.</li>
+ <li>Open the layout file. Make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Type here:"/>
+
+ <EditText
+ android:id="@+id/entry"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_below="@id/label"/>
+
+ <Button
+ android:id="@+id/ok"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/entry"
+ android:layout_alignParentRight="true"
+ android:layout_marginLeft="10dip"
+ android:text="OK" />
+
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/ok"
+ android:layout_alignTop="@id/ok"
+ android:text="Cancel" />
+
+</RelativeLayout>
+</pre>
+<p>Pay attention to each of the additional <code>layout_*</code> attributes (besides the
+usual width and height, which are required for all elements). When using relative layout,
+we use attributes like <code>layout_below</code> and <code>layout_toLeftOf</code> to describe
+how we'd like to position each View. Naturally, these are different relative positions, and the
+value of the attribute is the id of the element we want the position relative to.</p>
+</li>
+<li>Make sure your Activity loads this layout in the <code>onCreate()</code> method:</p>
+<pre>
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+}
+</pre>
+<p><code>R.layout.main</code> refers to the <code>main.xml</code> layout file.</p>
+</li>
+<li>Run it.</li>
+</ol>
+<p>You should see the following:</p>
+<img src="images/hello-relativelayout.png" width="150px" />
+
+<h3>Resources</h3>
+<ul>
+ <li>{@link android.widget.RelativeLayout}</li>
+ <li>{@link android.widget.TextView}</li>
+ <li>{@link android.widget.EditText}</li>
+ <li>{@link android.widget.Button}</li>
+</ul>
diff --git a/docs/html/resources/tutorials/views/hello-spinner.jd b/docs/html/resources/tutorials/views/hello-spinner.jd
new file mode 100644
index 0000000..3a04214
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-spinner.jd
@@ -0,0 +1,106 @@
+page.title=Hello, Spinner
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.Spinner} is a widget that allows the user to select an item from a group.
+It is similar to a dropdown list and will allow scrolling when the
+list exceeds the available vertical space on the screen.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloSpinner.</li>
+ <li>Open the layout file.
+ Make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:padding="10dip"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10dip"
+ android:text="Please select a planet:"
+ />
+
+ <Spinner
+ android:id="@+id/spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:drawSelectorOnTop="true"
+ android:prompt="@string/planet_prompt"
+ />
+
+</LinearLayout>
+</pre>
+ <p>Notice that the Spinner's <code>android:prompt</code> is a string resource. In
+ this case, Android does not allow it to be a string, it must be a reference to a resource.
+ So...</p>
+</li>
+
+<li>Open the strings.xml file in res/values/ and add the following <code><string></code>
+element inside the <code><resources></code> element:
+<pre>
+<string name="planet_prompt">Choose a planet</string>
+</pre>
+</li>
+
+<li>Create a new XML file in res/values/ called arrays.xml. Insert the following:
+<pre>
+<resources>
+
+ <string-array name="planets">
+ <item>Mercury</item>
+ <item>Venus</item>
+ <item>Earth</item>
+ <item>Mars</item>
+ <item>Jupiter</item>
+ <item>Saturn</item>
+ <item>Uranus</item>
+ <item>Neptune</item>
+ </string-array>
+
+</resources>
+</pre>
+ <p>This is the list of items (planets) that the user can select from in the Spinner widget.</p>
+</li>
+
+<li>Now open the HelloSpinner.java file. Insert the following code into the HelloSpinner class:
+<pre>
+@Override
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ Spinner s = (Spinner) findViewById(R.id.spinner);
+ ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
+ this, R.array.planets, android.R.layout.simple_spinner_item);
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ s.setAdapter(adapter);
+}
+</pre>
+ <p>That's it. We start by creating a Spinner from our layout. We then create an {@link android.widget.ArrayAdapter}
+ that binds each element of our string array to a layout view—we pass <code>createFromResource</code> our Context,
+ the array of selectable items and the type of layout we'd like each one bound to. We then call
+ <code>setDropDownViewResource()</code> to define the type of layout in which to present the
+ entire collection. Finally, we set this Adapter to associate with our Spinner,
+ so the string items have a place to go.</p>
+</li>
+
+<li>Now run it.</li>
+</ol>
+<p>It should look like this:</p>
+<img src="images/hello-spinner.png" width="150px" />
+
+
+<h3>Resources</h3>
+<ul>
+ <li>{@link android.R.layout}</li>
+ <li>{@link android.widget.ArrayAdapter}</li>
+ <li>{@link android.widget.Spinner}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-tablelayout.jd b/docs/html/resources/tutorials/views/hello-tablelayout.jd
new file mode 100644
index 0000000..83d6f5d
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-tablelayout.jd
@@ -0,0 +1,118 @@
+page.title=Hello, TableLayout
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.TableLayout} is a ViewGroup that
+will lay child View elements into rows and columns.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloTableLayout.</li>
+ <li>Open the layout file.
+ Make it like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:stretchColumns="1">
+
+ <TableRow>
+ <TextView
+ android:layout_column="1"
+ android:text="Open..."
+ android:padding="3dip" />
+ <TextView
+ android:text="Ctrl-O"
+ android:gravity="right"
+ android:padding="3dip" />
+ </TableRow>
+
+ <TableRow>
+ <TextView
+ android:layout_column="1"
+ android:text="Save..."
+ android:padding="3dip" />
+ <TextView
+ android:text="Ctrl-S"
+ android:gravity="right"
+ android:padding="3dip" />
+ </TableRow>
+
+ <TableRow>
+ <TextView
+ android:layout_column="1"
+ android:text="Save As..."
+ android:padding="3dip" />
+ <TextView
+ android:text="Ctrl-Shift-S"
+ android:gravity="right"
+ android:padding="3dip" />
+ </TableRow>
+
+ <View
+ android:layout_height="2dip"
+ android:background="#FF909090" />
+
+ <TableRow>
+ <TextView
+ android:text="X"
+ android:padding="3dip" />
+ <TextView
+ android:text="Import..."
+ android:padding="3dip" />
+ </TableRow>
+
+ <TableRow>
+ <TextView
+ android:text="X"
+ android:padding="3dip" />
+ <TextView
+ android:text="Export..."
+ android:padding="3dip" />
+ <TextView
+ android:text="Ctrl-E"
+ android:gravity="right"
+ android:padding="3dip" />
+ </TableRow>
+
+ <View
+ android:layout_height="2dip"
+ android:background="#FF909090" />
+
+ <TableRow>
+ <TextView
+ android:layout_column="1"
+ android:text="Quit"
+ android:padding="3dip" />
+ </TableRow>
+</TableLayout>
+</pre>
+<p>Notice how this resembles the structure of an HTML table. <code>TableLayout</code> is like the
+<code>table</code> element; <code>TableRow</code> is like a <code>tr</code> element; but for our cells like
+the html <code>td</code> element, we can use any kind of View. Here, we use <code>TextView</code> for the cells.</p>
+
+</li>
+<li>Make sure your Activity loads this layout in the <code>onCreate()</code> method:
+<pre>
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+}
+</pre>
+<p><code>R.layout.main</code> refers to the <code>main.xml</code> layout file.</p>
+</li>
+<li>Run it.</li>
+</ol>
+<p>You should see the following:</p>
+<img src="images/hello-tablelayout.png" width="150px" />
+
+<h3>References</h3>
+<ul>
+ <li>{@link android.widget.TableLayout}</li>
+ <li>{@link android.widget.TableRow}</li>
+ <li>{@link android.widget.TextView}</li>
+</ul>
+
+
diff --git a/docs/html/resources/tutorials/views/hello-tabwidget.jd b/docs/html/resources/tutorials/views/hello-tabwidget.jd
new file mode 100644
index 0000000..8424616
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-tabwidget.jd
@@ -0,0 +1,124 @@
+page.title=Hello, TabWidget
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.TabWidget} offers the ability to easily draw an interface that uses
+tabs to navigate between different views.</p>
+
+<ol>
+ <li>Start a new project/Activity called HelloTabWidget.</li>
+ <li>Open the layout file and make it like so:</li>
+ <pre>
+<?xml version="1.0" encoding="utf-8"?>
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/tabhost"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <TabWidget
+ android:id="@android:id/tabs"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <FrameLayout
+ android:id="@android:id/tabcontent"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <TextView
+ android:id="@+id/textview1"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="this is a tab" />
+ <TextView
+ android:id="@+id/textview2"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="this is another tab" />
+ <TextView
+ android:id="@+id/textview3"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="this is a third tab" />
+ </FrameLayout>
+ </LinearLayout>
+</TabHost>
+</pre>
+ <p>Here, we've created a {@link android.widget.TabHost} that contains the entire layout of the Activity.
+ A TabHost requires two descendant elements: a {@link android.widget.TabWidget} and a {@link android.widget.FrameLayout}.
+ In order to properly layout these elements, we've put them inside a vertical {@link android.widget.LinearLayout}.
+ The FrameLayout is where we keep the content that will change with each tab. Each child in the FrameLayout will
+ be associated with a different tab.
+ In this case, each tab simply shows a different {@link android.widget.TextView} with some text. </p>
+ <p>Notice that the TabWidget and the FrameLayout elements have specific <code>android</code> namespace IDs. These are necessary
+ so that the TabHost can automatically retireve references to them, populate the TabWidget with the tabs that we'll define
+ in our code, and swap the views in the FrameLayout. We've also defined our own IDs for each TextView, which we'll use to
+ associate each tab with the view that it should reveal.</p>
+ <p>Of course, you can
+ make these child views as large as complex as you'd like — instead of the TextView elements,
+ you could start with other layout views and build a unique layout hierarchy for each tab.</p>
+ </li>
+ <li>Now we'll add our code. Open HelloTabWidget.java and make it a <code>TabActivity</code>.
+ <p>By default, Eclipse creates a class that extends <code>Activity</code>. Change it to
+ extend <code>TabActivity</code>:</p>
+ <pre>
+public class HelloTabWidget extends TabActivity {
+</pre>
+ </li>
+ <li>Now fill in the the <code>onCreate</code> method like this:
+ <pre>
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ mTabHost = getTabHost();
+
+ mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 1").setContent(R.id.textview1));
+ mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB 2").setContent(R.id.textview2));
+ mTabHost.addTab(mTabHost.newTabSpec("tab_test3").setIndicator("TAB 3").setContent(R.id.textview3));
+
+ mTabHost.setCurrentTab(0);
+}
+</pre>
+ <p>As usual, we start by setting our layout.</p>
+ <p>We then call the TabActivity method <code>getTabHost()</code>,
+ which returns us a reference to the TabHost we created in our layout. Upon our TabHost, we call <code>addTab()</code>
+ for each of the tabs that we want to add to the TabWidget. Each time we call this, we pass a
+ {@link android.widget.TabHost.TabSpec} that we build on the fly, and with it, chain together two necessary methods:
+ <code>setIndicator()</code> to set the text for the tab button, and <code>setContent()</code> to define
+ which View we want to associate with the tab and reveal when pressed. Our indicator is just a text string and
+ our content is an ID reference to the TextView elements we inserted in the FrameLayout.</p>
+ <p>At the end, we call <code>setCurrentTab()</code> to define which tab should be opened by default. The tabs
+ are saved like a zero-based array, so to open the first tab, we pass zero (<var>0</var>).</p>
+ </li>
+ <li>To clean-up the presentation a bit more, let's remove the window title that appears at the top of the layout.
+ Android includes a theme that removes that title for us. To add it, open the Android Manifest file and add
+ the <var>NoTitleBar</var> theme to the <code><application></code> tag. It should end up like this:
+ <pre>
+<application android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar">
+</pre>
+ </li>
+ <li>That's it. Run your application.</li>
+
+</ol>
+
+
+<p>Your application should look like this:</p>
+<img src="images/hello-tabwidget.png" width="150px" />
+
+<div class="special"><p>You can include icons in your tabs by passing a
+{@link android.graphics.drawable.Drawable} when you call <code>setIndicator()</code>. Here's an example
+that uses a Drawable created from an image in the project resources:</p>
+<pre>setIndicator("TAB 1", getResources().getDrawable(R.drawable.tab_icon))</pre>
+</div>
+
+<h3>References</h3>
+<ul>
+<li>{@link android.widget.TabWidget}</li>
+<li>{@link android.widget.TabHost}</li>
+<li>{@link android.widget.TabHost.TabSpec}</li>
+<li>{@link android.widget.FrameLayout}</li>
+</ul>
+
diff --git a/docs/html/resources/tutorials/views/hello-timepicker.jd b/docs/html/resources/tutorials/views/hello-timepicker.jd
new file mode 100644
index 0000000..1a6c8f9
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-timepicker.jd
@@ -0,0 +1,159 @@
+page.title=Hello, TimePicker
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.widget.TimePicker} is a widget that allows the
+user to select the time by hour, minute and AM or PM.</p>
+
+
+<ol>
+ <li>Start a new project/Activity called HelloTimePicker.</li>
+ <li>Open the layout file and make it like so:
+ <pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/timeDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text=""/>
+
+ <Button android:id="@+id/pickTime"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Change the time"/>
+
+</LinearLayout>
+</pre>
+ <p>For the layout, we're using a vertical LinearLayout, with a {@link android.widget.TextView} that
+ will display the time and a {@link android.widget.Button} that will initiate the
+ {@link android.widget.TimePicker} dialog.
+ With this layout, the TextView will sit above the Button.
+ The text value in the TextView is set empty, as it will be filled by our Activity
+ with the current time.</p>
+ </li>
+
+ <li>Open HelloTimePicker.java. Insert the following to the HelloTimePicker class:
+<pre>
+private TextView mTimeDisplay;
+private Button mPickTime;
+
+private int mHour;
+private int mMinute;
+
+static final int TIME_DIALOG_ID = 0;
+
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ // capture our View elements
+ mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
+ mPickTime = (Button) findViewById(R.id.pickTime);
+
+ // add a click listener to the button
+ mPickTime.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ showDialog(TIME_DIALOG_ID);
+ }
+ });
+
+ // get the current time
+ final Calendar c = Calendar.getInstance();
+ mHour = c.get(Calendar.HOUR_OF_DAY);
+ mMinute = c.get(Calendar.MINUTE);
+
+ // display the current date
+ updateDisplay();
+}
+</pre>
+<p class="note"><strong>Tip:</strong> Press Ctrl(or Cmd) + Shift + O to import all needed packages.</p>
+ <p>We start by instantiating variables for our View elements and time fields.
+ The <code>TIME_DIALOG_ID</code> is a static integer that uniquely identifies the dialog. In the
+ <code>onCreate()</code> method, we get prepared by setting the layout and capturing the View elements.
+ We then set an on-click listener for the Button, so that when it is clicked, it will
+ show our TimePicker dialog. The <code>showDialog()</code> method will perform a callback
+ to our Activity. (We'll define this callback in the next section.) We then create an
+ instance of {@link java.util.Calendar} and get the current hour and minute. Finally, we call
+ <code>updateDisplay()</code>—our own method that will fill the TextView with the time.</p>
+</li>
+
+<li>After the <code>onCreate()</code> method, add the <code>onCreateDialog()</code> callback method:
+<pre>
+@Override
+protected Dialog onCreateDialog(int id) {
+ switch (id) {
+ case TIME_DIALOG_ID:
+ return new TimePickerDialog(this,
+ mTimeSetListener, mHour, mMinute, false);
+ }
+ return null;
+}
+</pre>
+ <p>This is passed the identifier we gave <code>showDialog()</code> and initializes
+ the TimePicker to the time we retrieved from our Calendar instance. It will be called by
+ <code>showDialog()</code>.</p>
+</li>
+
+<li>Now add our <code>updateDisplay()</code> method:
+<pre>
+// updates the time we display in the TextView
+private void updateDisplay() {
+ mTimeDisplay.setText(
+ new StringBuilder()
+ .append(pad(mHour)).append(":")
+ .append(pad(mMinute)));
+}
+</pre>
+ <p>This simply takes our member fields for the time and inserts them in
+ the <code>mTimeDisplay</code> TextView. Note that we call a new method, <code>pad()</code>,
+ on the hour and minute. (We'll create this method in the last step.)</p>
+</li>
+
+<li>Next, add a listener to be called when the time is reset:
+<pre>
+// the callback received when the user "sets" the time in the dialog
+private TimePickerDialog.OnTimeSetListener mTimeSetListener =
+ new TimePickerDialog.OnTimeSetListener() {
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ mHour = hourOfDay;
+ mMinute = minute;
+ updateDisplay();
+ }
+ };
+</pre>
+ <p>Now when the user is done setting the time (clicks the "Set" button), we update our member fields with
+ the new time and update our TextView.</p>
+</li>
+<li>Finally, add the <code>pad()</code> method that we called from the <code>updateDisplay()</code>:
+<pre>
+private static String pad(int c) {
+ if (c >= 10)
+ return String.valueOf(c);
+ else
+ return "0" + String.valueOf(c);
+}
+</pre>
+ <p>This method returns the appropriate String representation of the hour or minute.
+ It will prefix a zero to the number if it's a single digit.
+ </p>
+</li>
+
+<li>Now run it.</li>
+</ol>
+<p>When you press the "Change the time" button, you should see the following:</p>
+<img src="images/hello-timepicker.png" width="150px" />
+
+<h3>References</h3>
+<ol>
+ <li>{@link android.widget.TimePicker}</li>
+ <li>{@link android.widget.Button}</li>
+ <li>{@link android.widget.TextView}</li>
+ <li>{@link java.util.Calendar}</li>
+</ol>
+
diff --git a/docs/html/resources/tutorials/views/hello-webview.jd b/docs/html/resources/tutorials/views/hello-webview.jd
new file mode 100644
index 0000000..c4388ea
--- /dev/null
+++ b/docs/html/resources/tutorials/views/hello-webview.jd
@@ -0,0 +1,118 @@
+page.title=Hello, WebView
+parent.title=Hello, Views
+parent.link=index.html
+@jd:body
+
+<p>A {@link android.webkit.WebView} allows you to create your own web browser Activity. In this tutorial,
+we'll create a simple Activity that can view web pages.</p>
+
+<ol>
+ <li>Create a new project/Activity called HelloWebView.</li>
+ <li>Open the layout file. Insert a WebView so it looks like so:
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <WebView
+ android:id="@+id/webview"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ />
+
+</LinearLayout>
+</pre></li>
+
+ <li>Now open the HelloWebView.java file.
+ At the top of the class, instantiate a WebView object:
+<pre>WebView webview;</pre>
+ <p> Then add the following at the end of the <code>onCreate()</code> method:</p>
+<pre>
+webview = (WebView) findViewById(R.id.webview);
+webview.getSettings().setJavaScriptEnabled(true);
+webview.loadUrl("http://www.google.com");
+</pre>
+
+ <p>This captures the WebView we created in our layout, then requests a
+ {@link android.webkit.WebSettings} object and enables JavaScript.
+ Then we load a URL.</p></li>
+
+ <li>Because we're accessing the internet, we need to add the appropriate
+ permissions to the Android manifest file. So open the AndroidManifest.xml file
+ and, add the following as a child of the <code><manifest></code> element:
+
+ <pre><uses-permission android:name="android.permission.INTERNET" /></pre></li>
+
+ <li>Now run it.</li>
+</ol>
+<p> You now have the world's simplest web page viewer.
+ It's not quite a browser yet. It only loads the page we've requested.</p>
+
+<hr/>
+
+<p>We can load a page, but as soon as we click a link, the default Android web browser
+handles the Intent, instead of our own WebView handling the action. So now we'll
+override the {@link android.webkit.WebViewClient} to enable us to handle our own URL loading.</p>
+
+<ol>
+ <li>In the HelloAndroid Activity, add this nested private class:
+<pre>
+private class HelloWebViewClient extends WebViewClient {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ view.loadUrl(url);
+ return true;
+ }
+}</pre></li>
+
+ <li>Now, in the <code>onCreate()</code> method, set an instance of the <code>HelloWebViewClient</code>
+ as our WebViewClient:
+ <pre>webview.setWebViewClient(new WebViewClientDemo());</pre>
+
+ <p>This line should immediately follow the initialization of our WebView object.</p>
+ <p>What we've done is create a WebViewClient that will load any URL selected in our
+WebView in the same WebView. You can see this in the <code>shouldOverrideUrlLoading()</code>
+method, above—it is passed the current WebView and the URL, so all we do
+is load the URL in the given view. Returning <var>true</var> says that we've handled the URL
+ourselves and the event should not bubble-up.</p>
+ <p>If you try it again, new pages will now load in the HelloWebView Activity. However, you'll notice that
+we can't navigate back. We need to handle the back button
+on the device, so that it will return to the previous page, rather than exit the application.</p>
+ </li>
+
+ <li>To handle the back button key press, add the following method inside the HelloWebView
+Activity:
+<pre>
+@Override
+public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
+ webview.goBack();
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+}</pre>
+ <p>The condition uses a {@link android.view.KeyEvent} to check
+ whether the key pressed is the BACK button and whether the
+ WebView is actually capable of navigating back (if it has a history). If both are
+ <em>not</em> true, then we send the event up the chain (and the Activity will close).
+ But if both <em>are</em> true, then we call <code>goBack()</code>,
+ which will navigate back one step in the history. We then return true to indicate
+ that we've handled the event.</p>
+</li>
+</ol>
+<p>When you open the application, it should look like this:</p>
+<img src="images/hello-webview.png" width="150px" />
+
+<h3>Resource</h3>
+<ul>
+<li>{@link android.webkit.WebView}</li>
+<li>{@link android.webkit.WebViewClient}</li>
+<li>{@link android.view.KeyEvent}</li>
+</ul>
+
+
+
+
+
diff --git a/docs/html/resources/tutorials/views/images/android.png b/docs/html/resources/tutorials/views/images/android.png
new file mode 100755
index 0000000..39a1ac7
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/android.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/androidmarker.png b/docs/html/resources/tutorials/views/images/androidmarker.png
new file mode 100755
index 0000000..8c43d46
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/androidmarker.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-autocomplete.png b/docs/html/resources/tutorials/views/images/hello-autocomplete.png
new file mode 100755
index 0000000..e1fd80d
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-autocomplete.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-datepicker.png b/docs/html/resources/tutorials/views/images/hello-datepicker.png
new file mode 100755
index 0000000..2075066
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-datepicker.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-formstuff.png b/docs/html/resources/tutorials/views/images/hello-formstuff.png
new file mode 100755
index 0000000..3b4bf54
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-formstuff.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-gallery.png b/docs/html/resources/tutorials/views/images/hello-gallery.png
new file mode 100755
index 0000000..22d1eaf
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-gallery.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-gridview.png b/docs/html/resources/tutorials/views/images/hello-gridview.png
new file mode 100755
index 0000000..2def0df
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-gridview.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-linearlayout.png b/docs/html/resources/tutorials/views/images/hello-linearlayout.png
new file mode 100755
index 0000000..dfef819
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-linearlayout.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-listview.png b/docs/html/resources/tutorials/views/images/hello-listview.png
new file mode 100755
index 0000000..a1cf7aa
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-listview.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-mapview.png b/docs/html/resources/tutorials/views/images/hello-mapview.png
new file mode 100755
index 0000000..0956760
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-mapview.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-relativelayout.png b/docs/html/resources/tutorials/views/images/hello-relativelayout.png
new file mode 100755
index 0000000..ec4d9d4
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-relativelayout.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-spinner.png b/docs/html/resources/tutorials/views/images/hello-spinner.png
new file mode 100755
index 0000000..42e2a91
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-spinner.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-tablelayout.png b/docs/html/resources/tutorials/views/images/hello-tablelayout.png
new file mode 100755
index 0000000..3d80e7f
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-tablelayout.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-tabwidget.png b/docs/html/resources/tutorials/views/images/hello-tabwidget.png
new file mode 100644
index 0000000..6a52356
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-tabwidget.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-timepicker.png b/docs/html/resources/tutorials/views/images/hello-timepicker.png
new file mode 100755
index 0000000..bd5a1ee
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-timepicker.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/images/hello-webview.png b/docs/html/resources/tutorials/views/images/hello-webview.png
new file mode 100755
index 0000000..283ce7d
--- /dev/null
+++ b/docs/html/resources/tutorials/views/images/hello-webview.png
Binary files differ
diff --git a/docs/html/resources/tutorials/views/index.jd b/docs/html/resources/tutorials/views/index.jd
new file mode 100644
index 0000000..2cb5d3a
--- /dev/null
+++ b/docs/html/resources/tutorials/views/index.jd
@@ -0,0 +1,118 @@
+page.title=Hello, Views
+@jd:body
+
+<style>
+.view {float:left; margin:10px; font-size:120%; font-weight:bold;}
+.view img {border:1px solid black; margin:5px 0 0; padding:5px;}
+</style>
+
+<p>This collection of "Hello World"-style tutorials is designed
+to get you quickly started with common Android Views and widgets. The aim is to let you copy and paste
+these kinds of boring bits so you can focus on developing the code that makes your Android application rock.
+Of course, we'll discuss some of the given code so that it all makes sense.</p>
+
+<p>Note that a certain amount of knowledge is assumed for these tutorials. If you haven't
+completed the <a href="{@docRoot}resources/tutorials/hello-world.html">Hello, World</a> tutorial,
+please do so—it will teach you many things you should know about basic
+Android development and Eclipse features. More specifically, you should know:</p>
+<ul>
+ <li>How to create a new Android project.</li>
+ <li>The basic structure of an Android project (resource files, layout files, etc.).</li>
+ <li>The essential components of an {@link android.app.Activity}.</li>
+ <li>How to build and run a project.</li>
+</ul>
+<p>Please, also notice that, in order to make these tutorials simple, some may
+not convey the better Android coding practices. In particular, many of them
+use hard-coded strings in the layout files—the better practice is to reference strings from
+your strings.xml file.</p>
+<p>With this knowledge, you're ready to begin, so take your pick.</p>
+
+<div>
+
+<div class="view">
+<a href="hello-linearlayout.html">LinearLayout</a><br/>
+<a href="hello-linearlayout.html"><img src="images/hello-linearlayout.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-relativelayout.html">RelativeLayout</a><br/>
+<a href="hello-relativelayout.html"><img src="images/hello-relativelayout.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-tablelayout.html">TableLayout</a><br/>
+<a href="hello-tablelayout.html"><img src="images/hello-tablelayout.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-datepicker.html">DatePicker</a><br/>
+<a href="hello-datepicker.html"><img src="images/hello-datepicker.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-timepicker.html">TimePicker</a><br/>
+<a href="hello-timepicker.html"><img src="images/hello-timepicker.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-formstuff.html">Form Stuff</a><br/>
+<a href="hello-formstuff.html"><img src="images/hello-formstuff.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-spinner.html">Spinner</a><br/>
+<a href="hello-spinner.html"><img src="images/hello-spinner.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-autocomplete.html">AutoComplete</a><br/>
+<a href="hello-autocomplete.html"><img src="images/hello-autocomplete.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-listview.html">ListView</a><br/>
+<a href="hello-listview.html"><img src="images/hello-listview.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-gridview.html">GridView</a><br/>
+<a href="hello-gridview.html"><img src="images/hello-gridview.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-gallery.html">Gallery</a><br/>
+<a href="hello-gallery.html"><img src="images/hello-gallery.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-tabwidget.html">TabWidget</a><br/>
+<a href="hello-tabwidget.html"><img src="images/hello-tabwidget.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-mapview.html">MapView</a><br/>
+<a href="hello-mapview.html"><img src="images/hello-mapview.png" height="285" width="200" /></a>
+</div>
+
+<div class="view">
+<a href="hello-webview.html">WebView</a><br/>
+<a href="hello-webview.html"><img src="images/hello-webview.png" height="285" width="200" /></a>
+</div>
+
+<!--
+TODO
+
+<div class="view">
+<a href="hello-popupwindow.html">PopupWindow<br/>
+<img src="images/hello-popupwindow.png" height="285" width="200" /></a>
+</div>
+<div class="view">
+<a href="hello-tabhost.html">TabHost / TabWidget<br/>
+<img src="images/hello-tabhost.png" height="285" width="200" /></a>
+</div>
+ProgressBar; RatingBar; FrameLayout
+
+-->
+
+<p class="note" style="clear:left">
+There are plenty more Views and widgets available. See the {@link android.view.View} class
+for more on View layouts, and the {@link android.widget widget package}
+for more useful widgets. And for more raw code samples, visit the
+<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/index.html">Api Demos</a>.
+These can also be found offline, in <code>/<sdk>/samples/ApiDemos</code>.</p>
+</div>
+
diff --git a/docs/html/robots.txt b/docs/html/robots.txt
index 878996f..503e4b1 100644
--- a/docs/html/robots.txt
+++ b/docs/html/robots.txt
@@ -12,4 +12,6 @@
Disallow: /sdk/1.5_r3/
Disallow: /sdk/1.6_r1/
Disallow: /shareables/
+Disallow: /guide/tutorials/
+Disallow: /guide/samples/
Sitemap: http://developer.android.com/sitemap.txt
diff --git a/docs/html/sdk/1.1_r1/upgrading.jd b/docs/html/sdk/1.1_r1/upgrading.jd
index 19095c0..5628d04 100644
--- a/docs/html/sdk/1.1_r1/upgrading.jd
+++ b/docs/html/sdk/1.1_r1/upgrading.jd
@@ -145,6 +145,6 @@
to the new SDK, note that you will need to uninstall the version of ApiDemos that comes
preinstalled in the emulator. For more information, or if you encounter an "reinstallation"
error when running or installing ApiDemos, see the troubleshooting topic
-<a href="{@docRoot}guide/appendix/faq/troubleshooting.html#apidemosreinstall">I can't install ApiDemos
+<a href="{@docRoot}resources/faq/troubleshooting.html#apidemosreinstall">I can't install ApiDemos
apps in my IDE because of a signing error</a> for information about how to solve the problem.</p>
diff --git a/docs/html/sdk/1.5_r3/upgrading.jd b/docs/html/sdk/1.5_r3/upgrading.jd
index f853d25..18c1314 100644
--- a/docs/html/sdk/1.5_r3/upgrading.jd
+++ b/docs/html/sdk/1.5_r3/upgrading.jd
@@ -174,7 +174,7 @@
<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)
+ <li>Expand the entry for the Android 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"
@@ -272,7 +272,7 @@
your AIDL Java files will be generated in here. You <strong>must</strong> remove
the old <code>R.java</code> and old auto-generated AIDL java files from the
<code>src/</code> folder. (This
-does not apply to your own hand-crafted parcelabe AIDL java files.)</p>
+does not apply to your own hand-crafted parcelable AIDL java files.)</p>
<p class="note"><strong>Note:</strong> The "activitycreator" tool has been replaced
by the new "android" tool. For information on creating new projects with the android tool,
@@ -368,7 +368,7 @@
listens for special keypress events that only occur on a keypad, then your application
should degrade gracefully when there is no keyboard available.
</li>
- <li>Performs its own layout orientation changes based on the acceletometer (or via other
+ <li>Performs its own layout orientation changes based on the accelerometer (or via other
sensors). Some devices running Android 1.5 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
diff --git a/docs/html/sdk/RELEASENOTES.jd b/docs/html/sdk/RELEASENOTES.jd
index fdaba61..ae86a4b 100644
--- a/docs/html/sdk/RELEASENOTES.jd
+++ b/docs/html/sdk/RELEASENOTES.jd
@@ -328,7 +328,7 @@
<ul>
<li>Multiple versions of the Android platform are included (Android 1.1,
Android 1.5). The tools are updated to let you deploy your application
-on any platform in the SDK, which helps you ensure forward-compitility and,
+on any platform in the SDK, which helps you ensure forward-compatibility and,
if applicable, backward-compatibility.</li>
<li>Introduces <a href="{@docRoot}guide/developing/tools/avd.html">Android
Virtual Devices</a> — (AVD) configurations of options that you
@@ -339,7 +339,7 @@
Android SDK to give you access to one or more external Android libraries and/or
a customized (but compliant) system image that can run in the emulator. </li>
<li>The new Eclipse ADT plugin (version 0.9.x) offers new Wizards to let you
-create projects targetted for specific Android configurations, generate XML
+create projects targeted for specific Android configurations, generate XML
resources (such as layouts, animations, and menus), generate alternate layouts,
and export and sign your application for publishing.</li>
<li>Improved JUnit support in ADT</li>
@@ -604,7 +604,7 @@
classes, you can do so. However, you need to set up a custom JUnit configuration
before your tests will run properly. For detailed information about how to set
up the JUnit configuration, see the troubleshooting topic <a
-href="{@docRoot}guide/appendix/faq/troubleshooting.html#addjunit">Running a Junit test class
+href="{@docRoot}resources/faq/troubleshooting.html#addjunit">Running a Junit test class
in Eclipse</a>.</li>
</ul>
@@ -655,9 +655,9 @@
<h3>Other Notes</h3>
-<p><strong>T-Mobile G1 Compatability</strong></p>
+<p><strong>T-Mobile G1 Compatibility</strong></p>
-<p>This version of the SDK has been tested for compatability with the first
+<p>This version of the SDK has been tested for compatibility with the first
Android-powered mobile device, the <a href="http://www.t-mobileg1.com">T-Mobile
G1</a>. </p>
diff --git a/docs/html/sdk/android-2.0.1.jd b/docs/html/sdk/android-2.0.1.jd
index fbce45e..43b1710 100644
--- a/docs/html/sdk/android-2.0.1.jd
+++ b/docs/html/sdk/android-2.0.1.jd
@@ -297,9 +297,8 @@
<p>For a detailed view of API changes in Android {@sdkPlatformVersion} (API Level {@sdkPlatformApiLevel}), as compared to
API Level 5, see the <a
href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API
-Differences Report</a>. Note that this difference report compares only to
-the most recent API Level, and there are few changes, so to see changes
-introduces in Android 2.0 (API Level 5), see the <a
+Differences Report</a>. There are very few API changes in API Level 6,
+so you might also be interested in reviewing the <a
href="{@docRoot}sdk/api_diff/5/changes.html">API
-Differences between 4 and 5</a>.</p>
+differences between 4 and 5</a>.</p>
diff --git a/docs/html/sdk/android-2.1.jd b/docs/html/sdk/android-2.1.jd
new file mode 100644
index 0000000..7f9141e
--- /dev/null
+++ b/docs/html/sdk/android-2.1.jd
@@ -0,0 +1,280 @@
+page.title=Android 2.1, Release 1
+sdk.platform.version=2.1
+sdk.platform.apiLevel=7
+sdk.platform.majorMinor=minor
+sdk.platform.releaseDate=January 2010
+sdk.platform.deployableDate=January 2010
+
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>In this document</h2>
+<ol>
+ <li><a href="#features">Platform Highlights</a></li>
+ <li><a href="#apps">Built-in Applications</a></li>
+ <li><a href="#locs">Locales</a></li>
+ <li><a href="#skins">Emulator Skins</a></li>
+ <li><a href="#api">Framework API</a>
+ <ol>
+ <li><a href="#api-level">API level</a></li>
+ <li><a href="#api-changes">API changes summary</a></li>
+ <li><a
+href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API
+differences report »</a> </li>
+ </ol>
+ </li>
+</ol>
+
+<h2>See Also</h2>
+<ol>
+ <li><a href="{@docRoot}sdk/adding-components.html">Adding SDK Components</a></li>
+</ol>
+
+</div>
+</div>
+
+<p>
+<em>Date:</em> {@sdkPlatformReleaseDate}<br />
+<em>API Level:</em> <strong>{@sdkPlatformApiLevel}</strong></p>
+
+<p>Android {@sdkPlatformVersion} is a {@sdkPlatformMajorMinor} platform release
+deployable to Android-powered handsets starting in {@sdkPlatformDeployableDate}.
+This release includes new API
+changes and bug fixes. For information on changes, see the <a href="#api">Framework API</a>
+section.</p>
+
+<p>For developers, the Android {@sdkPlatformVersion} platform is available as a
+downloadable component for the Android SDK. The downloadable platform includes a
+fully compliant Android library and system image, as well as a set of emulator
+skins, sample applications, and more. The downloadable platform
+includes no external libraries. </p>
+
+<p>To get started developing or testing against the Android
+{@sdkPlatformVersion} platform, use the Android SDK and AVD Manager tool to
+download the platform into your Android SDK. For more information,
+see <a href="{@docRoot}sdk/adding-components.html">Adding SDK
+Components</a>.</p>
+
+
+<h2 id="features">Platform Highlights</h2>
+
+<p>Android {@sdkPlatformVersion} does not add significant user features, see the <a
+href="http://developer.android.com/sdk/android-2.0-highlights.html">Android
+2.0 Platform Highlights</a> document for the latest user features.</p>
+
+<h2 id="apps">Built-in Applications</h2>
+
+<p>The system image included in the downloadable platform provides these
+built-in applications:</p>
+
+<table style="border:0;padding-bottom:0;margin-bottom:0;">
+<tr>
+<td style="border:0;padding-bottom:0;margin-bottom:0;">
+ <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>
+ </ul>
+</td>
+<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
+ <ul>
+ <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>
+</td>
+</tr>
+</table>
+
+<h2 id="locs" style="margin-top:.75em;">Locales</h2>
+
+<p>The system image included in the downloadable platform 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 are available in the Android {@sdkPlatformVersion} system
+image are listed below (with <em>language</em>_<em>country/region</em> locale
+descriptor).</p>
+
+<table style="border:0;padding-bottom:0;margin-bottom:0;">
+<tr>
+<td style="border:0;padding-bottom:0;margin-bottom:0;">
+<ul>
+<li>Chinese, PRC (zh_CN)</li>
+<li>Chinese, Taiwan (zh_TW)</li>
+<li>Czech (cs_CZ)</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, New Zealand (en_NZ)</li>
+<li>English, Singapore(en_SG)</li>
+<li>French, France (fr_FR)</li>
+<li>French, Belgium (fr_BE)</li>
+</ul>
+</td>
+<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
+<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>
+<li>Italian, Italy (it_IT)</li>
+<li>Italian, Switzerland (it_CH)</li>
+<li>Japanese (ja_JP)</li>
+<li>Korean (ko_KR)</li>
+<li>Polish (pl_PL)</li>
+<li>Russian (ru_RU)</li>
+<li>Spanish (es_ES)</li>
+</td>
+</tr>
+</table>
+
+<p>Localized UI strings match the locales that are accessible
+through Settings.</p>
+
+<h2 id="skins">Emulator Skins</h2>
+
+<p>The downloadable platform includes a set of emulator skins that you can use
+for modeling your application in different screen sizes and resolutions. The
+emulator skins are:</p>
+
+<ul>
+ <li>
+ QVGA (240x320, low density, small screen)
+ </li>
+ <li>
+ WQVGA (240x400, low density, normal screen)
+ </li>
+ <li>
+ FWQVGA (240x432, low density, normal screen)
+ </li>
+ <li>
+ HVGA (320x480, medium density, normal screen)
+ </li>
+ <li>
+ WVGA800 (480x800, high density, normal screen)
+ </li>
+ <li>
+ WVGA854 (480x854 high density, normal screen)
+ </li>
+</ul>
+
+<p>For more information about how to develop an application that displays
+and functions properly on all Android-powered devices, see <a
+href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
+Screens</a>.</p>
+
+<h2 id="api">Framework API</h2>
+
+<p>The sections below provide information about changes made to the application
+framework API provided by the Android {@sdkPlatformVersion} platform.</p>
+
+
+<h3 id="api-level">API level</h3>
+
+<p>The Android {@sdkPlatformVersion} platform delivers an updated version of
+the framework API. The Android {@sdkPlatformVersion} API
+is assigned an integer identifier —
+<strong>{@sdkPlatformApiLevel}</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>To use APIs introduced in Android {@sdkPlatformVersion} in your
+application, you need to set the proper value, "{@sdkPlatformApiLevel}", in the
+attributes of the <code><uses-sdk></code> element in your application's
+manifest. </p>
+
+<p>For more information about how to use API Level, see the <a
+href="{@docRoot}guide/appendix/api-levels.html">API Levels</a> document. </p>
+
+
+<h3 id="api-changes">API changes summary</h3>
+
+<p>The following is a summary of some notable changes to the framework APIs.</p>
+
+<h4>Live Wallpapers</h4>
+
+<p>The following additions provide APIs for you to develop animated wallpapers:</p>
+<ul>
+<li>New {@link android.service.wallpaper} package.</li>
+<li>New {@link android.app.WallpaperInfo} class.</li>
+<li>Updated {@link android.app.WallpaperManager}.</li>
+</ul>
+
+<h4>Telephony</h4>
+
+<ul>
+<li>New {@link android.telephony.SignalStrength} class provides information
+about the device's current network signal. This can be acquired from the
+new {@link
+android.telephony.PhoneStateListener#onSignalStrengthsChanged(SignalStrength)}
+callback.</li>
+
+<li>New {@link
+android.telephony.PhoneStateListener#onDataConnectionStateChanged(int,int)}
+callback.</li>
+</ul>
+
+<h4>Views</h4>
+
+<ul>
+<li>New {@link android.view.View} methods {@link android.view.View#isOpaque()}
+and {@link android.view.View#onDrawScrollBars(Canvas)}.</li>
+
+<li>New {@link android.widget.RemoteViews} methods {@link
+android.widget.RemoteViews#addView(int,RemoteViews)} and {@link
+android.widget.RemoteViews#removeAllViews(int)}.</li>
+
+<li>New {@link android.view.ViewGroup} methods {@link
+android.view.ViewGroup#isChildrenDrawingOrderEnabled()} and {@link
+android.view.ViewGroup#setChildrenDrawingOrderEnabled(boolean)}.</li>
+</ul>
+
+<h4>WebKit</h4>
+
+<ul>
+<li>New {@link android.webkit.WebStorage} methods to manipulate web
+storage databases.</li>
+
+<li>New {@link android.webkit.GeolocationPermissions} methods to
+get Geolocation permissions from, and set them on the WebView.</li>
+
+<li>New {@link android.webkit.WebSettings} methods to manage settings for
+app cache, web storage, and zooming based on screen density.</li>
+
+<li>New {@link android.webkit.WebChromeClient} methods for handling video,
+browsing history, custom Views, app cache limits, and more.</li>
+</ul>
+
+</ul>
+
+<!--
+<h3 id="behavior-changes">Behavior changes</h3>
+
+<h3 id="bug-fixes">Bug fixes</h3>
+-->
+
+<h3 id="api-diff">API differences report</h3>
+
+<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API
+Level {@sdkPlatformApiLevel}), as compared to API Level 6, see the <a
+href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API
+Differences Report</a>.</p>
+
diff --git a/docs/html/sdk/api_diff/7/changes.html b/docs/html/sdk/api_diff/7/changes.html
new file mode 100644
index 0000000..3e5a746
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes.html
@@ -0,0 +1,45 @@
+<!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) -->
+<!-- on Fri Dec 18 22:29:37 PST 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 6 and 7
+</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>
+<frameset cols="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
+<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
+ <frame src="changes/jdiff_topleftframe.html" scrolling="no" name="topleftframe" frameborder="1">
+ <frame src="changes/alldiffs_index_all.html" scrolling="auto" name="bottomleftframe" frameborder="1">
+ </frameset>
+ <frame src="changes/changes-summary.html" scrolling="auto" name="rightframe" frameborder="1">
+</frameset>
+<noframes>
+<h2>
+Frame Alert
+</h2>
+
+<p>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<br>
+Link to <a href="changes/changes-summary.html" target="_top">Non-frame version.</A>
+</noframes>
+</html>
diff --git a/docs/html/sdk/api_diff/7/changes/alldiffs_index_additions.html b/docs/html/sdk/api_diff/7/changes/alldiffs_index_additions.html
new file mode 100644
index 0000000..5f2347a4
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/alldiffs_index_additions.html
@@ -0,0 +1,574 @@
+<!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>
+All Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Field ACTION_LIVE_WALLPAPER_CHOOSER -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER" class="hiddenlink" target="rightframe">ACTION_LIVE_WALLPAPER_CHOOSER</A>
+</nobr><br>
+<!-- Field ACTION_LOCALE_CHANGED -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.ACTION_LOCALE_CHANGED" class="hiddenlink" target="rightframe">ACTION_LOCALE_CHANGED</A>
+</nobr><br>
+<!-- Method addView -->
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)" class="hiddenlink" target="rightframe"><b>addView</b>
+(<code>int, RemoteViews</code>)</A></nobr><br>
+<!-- Method allow -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.allow_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>allow</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Package android.service.wallpaper -->
+<A HREF="changes-summary.html#android.service.wallpaper" class="hiddenlink" target="rightframe"><b>android.service.wallpaper</b></A><br>
+<!-- Field author -->
+<nobr><A HREF="android.R.attr.html#android.R.attr.author" class="hiddenlink" target="rightframe">author</A>
+</nobr><br>
+<!-- Field autoStart -->
+<nobr><A HREF="android.R.attr.html#android.R.attr.autoStart" class="hiddenlink" target="rightframe">autoStart</A>
+</nobr><br>
+<!-- Field CAMCORDER -->
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.CAMCORDER" class="hiddenlink" target="rightframe">CAMCORDER</A>
+</nobr><br>
+<!-- Method clear -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clear_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>clear</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Method clearAll -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clearAll_added()" class="hiddenlink" target="rightframe"><b>clearAll</b>
+()</A></nobr><br>
+<!-- Field COMMAND_DROP -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_DROP" class="hiddenlink" target="rightframe">COMMAND_DROP</A>
+</nobr><br>
+<!-- Field COMMAND_TAP -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_TAP" class="hiddenlink" target="rightframe">COMMAND_TAP</A>
+</nobr><br>
+<!-- Method deleteAllData -->
+<A NAME="D"></A>
+<br><font size="+2">D</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteAllData_added()" class="hiddenlink" target="rightframe"><b>deleteAllData</b>
+()</A></nobr><br>
+<!-- Method deleteOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteOrigin_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>deleteOrigin</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Field ECLAIR_MR1 -->
+<A NAME="E"></A>
+<br><font size="+2">E</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ECLAIR_MR1" class="hiddenlink" target="rightframe">ECLAIR_MR1</A>
+</nobr><br>
+<!-- Field EXTRA_CHANGED_COMPONENT_NAME_LIST -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME_LIST</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA -->
+<A NAME="F"></A>
+<br><font size="+2">F</font>
+<a href="#A"><font size="-2">A</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="#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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA" class="hiddenlink" target="rightframe">FEATURE_CAMERA</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA_AUTOFOCUS -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS" class="hiddenlink" target="rightframe">FEATURE_CAMERA_AUTOFOCUS</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA_FLASH -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_FLASH" class="hiddenlink" target="rightframe">FEATURE_CAMERA_FLASH</A>
+</nobr><br>
+<!-- Field FEATURE_LIVE_WALLPAPER -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER" class="hiddenlink" target="rightframe">FEATURE_LIVE_WALLPAPER</A>
+</nobr><br>
+<!-- Field FEATURE_SENSOR_LIGHT -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT" class="hiddenlink" target="rightframe">FEATURE_SENSOR_LIGHT</A>
+</nobr><br>
+<!-- Field FEATURE_SENSOR_PROXIMITY -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY" class="hiddenlink" target="rightframe">FEATURE_SENSOR_PROXIMITY</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY_CDMA -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_CDMA</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY_GSM -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_GSM</A>
+</nobr><br>
+<!-- Field FEATURE_TOUCHSCREEN_MULTITOUCH -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH" class="hiddenlink" target="rightframe">FEATURE_TOUCHSCREEN_MULTITOUCH</A>
+</nobr><br>
+<!-- Field FILL_IN_SOURCE_BOUNDS -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SOURCE_BOUNDS" class="hiddenlink" target="rightframe">FILL_IN_SOURCE_BOUNDS</A>
+</nobr><br>
+<!-- Method flattenToString -->
+<nobr><A HREF="android.graphics.Rect.html#android.graphics.Rect.flattenToString_added()" class="hiddenlink" target="rightframe"><b>flattenToString</b>
+()</A></nobr><br>
+<!-- Method freeMemory -->
+<nobr><A HREF="android.webkit.WebView.html#android.webkit.WebView.freeMemory_added()" class="hiddenlink" target="rightframe"><b>freeMemory</b>
+()</A></nobr><br>
+<!-- Method getAllowed -->
+<A NAME="G"></A>
+<br><font size="+2">G</font>
+<a href="#A"><font size="-2">A</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="#I"><font size="-2">I</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)" class="hiddenlink" target="rightframe"><b>getAllowed</b>
+(<code>String, ValueCallback<Boolean></code>)</A></nobr><br>
+<!-- Method getContentDisposition -->
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getContentDisposition_added()" class="hiddenlink" target="rightframe"><b>getContentDisposition</b>
+()</A></nobr><br>
+<!-- Method getDefaultVideoPoster -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getDefaultVideoPoster_added()" class="hiddenlink" target="rightframe"><b>getDefaultVideoPoster</b>
+()</A></nobr><br>
+<!-- Method getDefaultZoom -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDefaultZoom_added()" class="hiddenlink" target="rightframe"><b>getDefaultZoom</b>
+()</A></nobr><br>
+<!-- Method getDomStorageEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDomStorageEnabled_added()" class="hiddenlink" target="rightframe"><b>getDomStorageEnabled</b>
+()</A></nobr><br>
+<!-- Method getExpiresString -->
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getExpiresString_added()" class="hiddenlink" target="rightframe"><b>getExpiresString</b>
+()</A></nobr><br>
+<!-- Method getInstance -->
+<i>getInstance</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+<!-- Method getInstance -->
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.WebStorage
+</A></nobr><br>
+<!-- Method getLoadWithOverviewMode -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLoadWithOverviewMode_added()" class="hiddenlink" target="rightframe"><b>getLoadWithOverviewMode</b>
+()</A></nobr><br>
+<!-- Method getOrigins -->
+<i>getOrigins</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Set<String>></code>)</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+<!-- Method getOrigins -->
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Map></code>)</b> in android.webkit.WebStorage
+</A></nobr><br>
+<!-- Method getQuotaForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getQuotaForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<!-- Method getSourceBounds -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSourceBounds_added()" class="hiddenlink" target="rightframe"><b>getSourceBounds</b>
+()</A></nobr><br>
+<!-- Method getUsageForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getUsageForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<!-- Method getVideoLoadingProgressView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVideoLoadingProgressView_added()" class="hiddenlink" target="rightframe"><b>getVideoLoadingProgressView</b>
+()</A></nobr><br>
+<!-- Method getVisitedHistory -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)" class="hiddenlink" target="rightframe"><b>getVisitedHistory</b>
+(<code>ValueCallback<String[]></code>)</A></nobr><br>
+<!-- Method getWallpaperInfo -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.getWallpaperInfo_added()" class="hiddenlink" target="rightframe"><b>getWallpaperInfo</b>
+()</A></nobr><br>
+<!-- Method isAutoStart -->
+<A NAME="I"></A>
+<br><font size="+2">I</font>
+<a href="#A"><font size="-2">A</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="#L"><font size="-2">L</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.isAutoStart_added()" class="hiddenlink" target="rightframe"><b>isAutoStart</b>
+()</A></nobr><br>
+<!-- Method isChildrenDrawingOrderEnabled -->
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()" class="hiddenlink" target="rightframe"><b>isChildrenDrawingOrderEnabled</b>
+()</A></nobr><br>
+<!-- Method isOpaque -->
+<nobr><A HREF="android.view.View.html#android.view.View.isOpaque_added()" class="hiddenlink" target="rightframe"><b>isOpaque</b>
+()</A></nobr><br>
+<!-- Method isScreenOn -->
+<nobr><A HREF="android.os.PowerManager.html#android.os.PowerManager.isScreenOn_added()" class="hiddenlink" target="rightframe"><b>isScreenOn</b>
+()</A></nobr><br>
+<!-- Field LISTEN_SIGNAL_STRENGTHS -->
+<A NAME="L"></A>
+<br><font size="+2">L</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTHS</A>
+</nobr><br>
+<!-- Constructor NeighboringCellInfo -->
+<A NAME="N"></A>
+<br><font size="+2">N</font>
+<a href="#A"><font size="-2">A</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.telephony.NeighboringCellInfo.html#android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)" class="hiddenlink" target="rightframe"><b>NeighboringCellInfo</b>
+(<code>int, String, int</code>)</A></nobr> constructor<br>
+<!-- Method onConsoleMessage -->
+<A NAME="O"></A>
+<br><font size="+2">O</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)" class="hiddenlink" target="rightframe"><b>onConsoleMessage</b>
+(<code>String, int, String</code>)</A></nobr><br>
+<!-- Method onDataConnectionStateChanged -->
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)" class="hiddenlink" target="rightframe"><b>onDataConnectionStateChanged</b>
+(<code>int, int</code>)</A></nobr><br>
+<!-- Method onDrawScrollBars -->
+<nobr><A HREF="android.view.View.html#android.view.View.onDrawScrollBars_added(android.graphics.Canvas)" class="hiddenlink" target="rightframe"><b>onDrawScrollBars</b>
+(<code>Canvas</code>)</A></nobr><br>
+<!-- Method onHideCustomView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onHideCustomView_added()" class="hiddenlink" target="rightframe"><b>onHideCustomView</b>
+()</A></nobr><br>
+<!-- Method onJsTimeout -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onJsTimeout_added()" class="hiddenlink" target="rightframe"><b>onJsTimeout</b>
+()</A></nobr><br>
+<!-- Method onReachedMaxAppCacheSize -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)" class="hiddenlink" target="rightframe"><b>onReachedMaxAppCacheSize</b>
+(<code>long, long, QuotaUpdater</code>)</A></nobr><br>
+<!-- Method onReceivedTouchIconUrl -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)" class="hiddenlink" target="rightframe"><b>onReceivedTouchIconUrl</b>
+(<code>WebView, String, boolean</code>)</A></nobr><br>
+<!-- Method onShowCustomView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)" class="hiddenlink" target="rightframe"><b>onShowCustomView</b>
+(<code>View, CustomViewCallback</code>)</A></nobr><br>
+<!-- Method onSignalStrengthsChanged -->
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)" class="hiddenlink" target="rightframe"><b>onSignalStrengthsChanged</b>
+(<code>SignalStrength</code>)</A></nobr><br>
+<!-- Method removeAllViews -->
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.removeAllViews_added(int)" class="hiddenlink" target="rightframe"><b>removeAllViews</b>
+(<code>int</code>)</A></nobr><br>
+<!-- Method sendWallpaperCommand -->
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</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">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>sendWallpaperCommand</b>
+(<code>IBinder, String, int, int, int, Bundle</code>)</A></nobr><br>
+<!-- Method setAppCacheEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setAppCacheEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setAppCacheMaxSize -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheMaxSize_added(long)" class="hiddenlink" target="rightframe"><b>setAppCacheMaxSize</b>
+(<code>long</code>)</A></nobr><br>
+<!-- Method setAppCachePath -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCachePath_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>setAppCachePath</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Method setAutoStart -->
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.setAutoStart_added(boolean)" class="hiddenlink" target="rightframe"><b>setAutoStart</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setChildrenDrawingOrderEnabled -->
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setChildrenDrawingOrderEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setDefaultZoom -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)" class="hiddenlink" target="rightframe"><b>setDefaultZoom</b>
+(<code>ZoomDensity</code>)</A></nobr><br>
+<!-- Method setDomStorageEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDomStorageEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setDomStorageEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setLoadWithOverviewMode -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)" class="hiddenlink" target="rightframe"><b>setLoadWithOverviewMode</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setQuotaForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)" class="hiddenlink" target="rightframe"><b>setQuotaForOrigin</b>
+(<code>String, long</code>)</A></nobr><br>
+<!-- Method setSourceBounds -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSourceBounds_added(android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>setSourceBounds</b>
+(<code>Rect</code>)</A></nobr><br>
+<!-- Method setWallpaperOffsetSteps -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)" class="hiddenlink" target="rightframe"><b>setWallpaperOffsetSteps</b>
+(<code>float, float</code>)</A></nobr><br>
+<!-- Class SignalStrength -->
+<A HREF="pkg_android.telephony.html#SignalStrength" class="hiddenlink" target="rightframe"><b>SignalStrength</b></A><br>
+<!-- Method unflattenFromString -->
+<A NAME="U"></A>
+<br><font size="+2">U</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</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">
+<nobr><A HREF="android.graphics.Rect.html#android.graphics.Rect.unflattenFromString_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>unflattenFromString</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Class ValueCallback -->
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</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.webkit.html#ValueCallback" class="hiddenlink" target="rightframe"><b><i>ValueCallback</i></b></A><br>
+<!-- Field VOICE_RECOGNITION -->
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION" class="hiddenlink" target="rightframe">VOICE_RECOGNITION</A>
+</nobr><br>
+<!-- Class WallpaperInfo -->
+<A NAME="W"></A>
+<br><font size="+2">W</font>
+<a href="#A"><font size="-2">A</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="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.app.html#WallpaperInfo" class="hiddenlink" target="rightframe"><b>WallpaperInfo</b></A><br>
+<!-- Class WebChromeClient.CustomViewCallback -->
+<A HREF="pkg_android.webkit.html#WebChromeClient.CustomViewCallback" class="hiddenlink" target="rightframe"><b><i>WebChromeClient.CustomViewCallback</i></b></A><br>
+<!-- Class WebSettings.ZoomDensity -->
+<A HREF="pkg_android.webkit.html#WebSettings.ZoomDensity" class="hiddenlink" target="rightframe"><b>WebSettings.ZoomDensity</b></A><br>
+<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/7/changes/alldiffs_index_all.html b/docs/html/sdk/api_diff/7/changes/alldiffs_index_all.html
new file mode 100644
index 0000000..f0df458
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/alldiffs_index_all.html
@@ -0,0 +1,762 @@
+<!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>
+All Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>All Differences</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Field ACTION_LIVE_WALLPAPER_CHOOSER -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER" class="hiddenlink" target="rightframe">ACTION_LIVE_WALLPAPER_CHOOSER</A>
+</nobr><br>
+<!-- Field ACTION_LOCALE_CHANGED -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.ACTION_LOCALE_CHANGED" class="hiddenlink" target="rightframe">ACTION_LOCALE_CHANGED</A>
+</nobr><br>
+<!-- Method addPackageToPreferred -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">addPackageToPreferred
+(<code>String</code>)</A></nobr><br>
+<!-- Method addView -->
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)" class="hiddenlink" target="rightframe"><b>addView</b>
+(<code>int, RemoteViews</code>)</A></nobr><br>
+<!-- Method allow -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.allow_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>allow</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Package android -->
+<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br>
+<!-- Package android.app -->
+<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br>
+<!-- Package android.content -->
+<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br>
+<!-- Package android.content.pm -->
+<A HREF="pkg_android.content.pm.html" class="hiddenlink" target="rightframe">android.content.pm</A><br>
+<!-- Package android.graphics -->
+<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br>
+<!-- Package android.media -->
+<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br>
+<!-- Package android.os -->
+<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br>
+<!-- Package android.service.wallpaper -->
+<A HREF="changes-summary.html#android.service.wallpaper" class="hiddenlink" target="rightframe"><b>android.service.wallpaper</b></A><br>
+<!-- Package android.telephony -->
+<A HREF="pkg_android.telephony.html" class="hiddenlink" target="rightframe">android.telephony</A><br>
+<!-- Package android.view -->
+<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br>
+<!-- Package android.webkit -->
+<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br>
+<!-- Package android.widget -->
+<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br>
+<!-- Field author -->
+<nobr><A HREF="android.R.attr.html#android.R.attr.author" class="hiddenlink" target="rightframe">author</A>
+</nobr><br>
+<!-- Field autoStart -->
+<nobr><A HREF="android.R.attr.html#android.R.attr.autoStart" class="hiddenlink" target="rightframe">autoStart</A>
+</nobr><br>
+<!-- Class Build.VERSION_CODES -->
+<A NAME="B"></A>
+<br><font size="+2">B</font>
+<a href="#A"><font size="-2">A</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br>
+<!-- Class CacheManager.CacheResult -->
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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="android.webkit.CacheManager.CacheResult.html" class="hiddenlink" target="rightframe">CacheManager.CacheResult</A><br>
+<!-- Field CAMCORDER -->
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.CAMCORDER" class="hiddenlink" target="rightframe">CAMCORDER</A>
+</nobr><br>
+<!-- Method clear -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clear_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>clear</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Method clearAll -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clearAll_added()" class="hiddenlink" target="rightframe"><b>clearAll</b>
+()</A></nobr><br>
+<!-- Field COMMAND_DROP -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_DROP" class="hiddenlink" target="rightframe">COMMAND_DROP</A>
+</nobr><br>
+<!-- Field COMMAND_TAP -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_TAP" class="hiddenlink" target="rightframe">COMMAND_TAP</A>
+</nobr><br>
+<!-- Method deleteAllData -->
+<A NAME="D"></A>
+<br><font size="+2">D</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="#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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteAllData_added()" class="hiddenlink" target="rightframe"><b>deleteAllData</b>
+()</A></nobr><br>
+<!-- Method deleteOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteOrigin_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>deleteOrigin</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Field ECLAIR_MR1 -->
+<A NAME="E"></A>
+<br><font size="+2">E</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="#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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ECLAIR_MR1" class="hiddenlink" target="rightframe">ECLAIR_MR1</A>
+</nobr><br>
+<!-- Field EXTRA_CHANGED_COMPONENT_NAME -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME</A>
+</nobr><br>
+<!-- Field EXTRA_CHANGED_COMPONENT_NAME_LIST -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME_LIST</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA -->
+<A NAME="F"></A>
+<br><font size="+2">F</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="#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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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">
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA" class="hiddenlink" target="rightframe">FEATURE_CAMERA</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA_AUTOFOCUS -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS" class="hiddenlink" target="rightframe">FEATURE_CAMERA_AUTOFOCUS</A>
+</nobr><br>
+<!-- Field FEATURE_CAMERA_FLASH -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_FLASH" class="hiddenlink" target="rightframe">FEATURE_CAMERA_FLASH</A>
+</nobr><br>
+<!-- Field FEATURE_LIVE_WALLPAPER -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER" class="hiddenlink" target="rightframe">FEATURE_LIVE_WALLPAPER</A>
+</nobr><br>
+<!-- Field FEATURE_SENSOR_LIGHT -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT" class="hiddenlink" target="rightframe">FEATURE_SENSOR_LIGHT</A>
+</nobr><br>
+<!-- Field FEATURE_SENSOR_PROXIMITY -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY" class="hiddenlink" target="rightframe">FEATURE_SENSOR_PROXIMITY</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY_CDMA -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_CDMA</A>
+</nobr><br>
+<!-- Field FEATURE_TELEPHONY_GSM -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_GSM</A>
+</nobr><br>
+<!-- Field FEATURE_TOUCHSCREEN_MULTITOUCH -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH" class="hiddenlink" target="rightframe">FEATURE_TOUCHSCREEN_MULTITOUCH</A>
+</nobr><br>
+<!-- Field FILL_IN_SOURCE_BOUNDS -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SOURCE_BOUNDS" class="hiddenlink" target="rightframe">FILL_IN_SOURCE_BOUNDS</A>
+</nobr><br>
+<!-- Method flattenToString -->
+<nobr><A HREF="android.graphics.Rect.html#android.graphics.Rect.flattenToString_added()" class="hiddenlink" target="rightframe"><b>flattenToString</b>
+()</A></nobr><br>
+<!-- Method freeMemory -->
+<nobr><A HREF="android.webkit.WebView.html#android.webkit.WebView.freeMemory_added()" class="hiddenlink" target="rightframe"><b>freeMemory</b>
+()</A></nobr><br>
+<!-- Class GeolocationPermissions -->
+<A NAME="G"></A>
+<br><font size="+2">G</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="#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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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="android.webkit.GeolocationPermissions.html" class="hiddenlink" target="rightframe">GeolocationPermissions</A><br>
+<!-- Method getAllowed -->
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)" class="hiddenlink" target="rightframe"><b>getAllowed</b>
+(<code>String, ValueCallback<Boolean></code>)</A></nobr><br>
+<!-- Method getContentDisposition -->
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getContentDisposition_added()" class="hiddenlink" target="rightframe"><b>getContentDisposition</b>
+()</A></nobr><br>
+<!-- Method getDefaultVideoPoster -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getDefaultVideoPoster_added()" class="hiddenlink" target="rightframe"><b>getDefaultVideoPoster</b>
+()</A></nobr><br>
+<!-- Method getDefaultZoom -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDefaultZoom_added()" class="hiddenlink" target="rightframe"><b>getDefaultZoom</b>
+()</A></nobr><br>
+<!-- Method getDomStorageEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDomStorageEnabled_added()" class="hiddenlink" target="rightframe"><b>getDomStorageEnabled</b>
+()</A></nobr><br>
+<!-- Method getExpiresString -->
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getExpiresString_added()" class="hiddenlink" target="rightframe"><b>getExpiresString</b>
+()</A></nobr><br>
+<!-- Method getInstance -->
+<i>getInstance</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+<!-- Method getInstance -->
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.WebStorage
+</A></nobr><br>
+<!-- Method getLoadWithOverviewMode -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLoadWithOverviewMode_added()" class="hiddenlink" target="rightframe"><b>getLoadWithOverviewMode</b>
+()</A></nobr><br>
+<!-- Method getOrigins -->
+<i>getOrigins</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Set<String>></code>)</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+<!-- Method getOrigins -->
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Map></code>)</b> in android.webkit.WebStorage
+</A></nobr><br>
+<!-- Method getQuotaForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getQuotaForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<!-- Method getSourceBounds -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSourceBounds_added()" class="hiddenlink" target="rightframe"><b>getSourceBounds</b>
+()</A></nobr><br>
+<!-- Method getUsageForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getUsageForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<!-- Method getVideoLoadingProgressView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVideoLoadingProgressView_added()" class="hiddenlink" target="rightframe"><b>getVideoLoadingProgressView</b>
+()</A></nobr><br>
+<!-- Method getVisitedHistory -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)" class="hiddenlink" target="rightframe"><b>getVisitedHistory</b>
+(<code>ValueCallback<String[]></code>)</A></nobr><br>
+<!-- Method getWallpaperInfo -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.getWallpaperInfo_added()" class="hiddenlink" target="rightframe"><b>getWallpaperInfo</b>
+()</A></nobr><br>
+<!-- Class Intent -->
+<A NAME="I"></A>
+<br><font size="+2">I</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="#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="#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="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br>
+<!-- Method isAutoStart -->
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.isAutoStart_added()" class="hiddenlink" target="rightframe"><b>isAutoStart</b>
+()</A></nobr><br>
+<!-- Method isChildrenDrawingOrderEnabled -->
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()" class="hiddenlink" target="rightframe"><b>isChildrenDrawingOrderEnabled</b>
+()</A></nobr><br>
+<!-- Method isOpaque -->
+<nobr><A HREF="android.view.View.html#android.view.View.isOpaque_added()" class="hiddenlink" target="rightframe"><b>isOpaque</b>
+()</A></nobr><br>
+<!-- Method isScreenOn -->
+<nobr><A HREF="android.os.PowerManager.html#android.os.PowerManager.isScreenOn_added()" class="hiddenlink" target="rightframe"><b>isScreenOn</b>
+()</A></nobr><br>
+<!-- Field LISTEN_SIGNAL_STRENGTH -->
+<A NAME="L"></A>
+<br><font size="+2">L</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="#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="#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">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTH</A>
+</nobr><br>
+<!-- Field LISTEN_SIGNAL_STRENGTHS -->
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTHS</A>
+</nobr><br>
+<!-- Class Manifest.permission -->
+<A NAME="M"></A>
+<br><font size="+2">M</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="#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="#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="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
+<!-- Class MediaRecorder.AudioSource -->
+<A HREF="android.media.MediaRecorder.AudioSource.html" class="hiddenlink" target="rightframe">MediaRecorder.AudioSource</A><br>
+<!-- Class NeighboringCellInfo -->
+<A NAME="N"></A>
+<br><font size="+2">N</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="#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="#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">
+<i>NeighboringCellInfo</i><br>
+ <A HREF="android.telephony.NeighboringCellInfo.html" class="hiddenlink" target="rightframe">android.telephony</A><br>
+<!-- Constructor NeighboringCellInfo -->
+ <nobr><A HREF="android.telephony.NeighboringCellInfo.html#android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)" class="hiddenlink" target="rightframe"><b>NeighboringCellInfo</b>
+(<code>int, String, int</code>)</A></nobr> constructor<br>
+<!-- Method onConsoleMessage -->
+<A NAME="O"></A>
+<br><font size="+2">O</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="#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="#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">
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)" class="hiddenlink" target="rightframe"><b>onConsoleMessage</b>
+(<code>String, int, String</code>)</A></nobr><br>
+<!-- Method onDataConnectionStateChanged -->
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)" class="hiddenlink" target="rightframe"><b>onDataConnectionStateChanged</b>
+(<code>int, int</code>)</A></nobr><br>
+<!-- Method onDrawScrollBars -->
+<nobr><A HREF="android.view.View.html#android.view.View.onDrawScrollBars_added(android.graphics.Canvas)" class="hiddenlink" target="rightframe"><b>onDrawScrollBars</b>
+(<code>Canvas</code>)</A></nobr><br>
+<!-- Method onHideCustomView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onHideCustomView_added()" class="hiddenlink" target="rightframe"><b>onHideCustomView</b>
+()</A></nobr><br>
+<!-- Method onJsTimeout -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onJsTimeout_added()" class="hiddenlink" target="rightframe"><b>onJsTimeout</b>
+()</A></nobr><br>
+<!-- Method onReachedMaxAppCacheSize -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)" class="hiddenlink" target="rightframe"><b>onReachedMaxAppCacheSize</b>
+(<code>long, long, QuotaUpdater</code>)</A></nobr><br>
+<!-- Method onReceivedTouchIconUrl -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)" class="hiddenlink" target="rightframe"><b>onReceivedTouchIconUrl</b>
+(<code>WebView, String, boolean</code>)</A></nobr><br>
+<!-- Method onShowCustomView -->
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)" class="hiddenlink" target="rightframe"><b>onShowCustomView</b>
+(<code>View, CustomViewCallback</code>)</A></nobr><br>
+<!-- Method onSignalStrengthsChanged -->
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)" class="hiddenlink" target="rightframe"><b>onSignalStrengthsChanged</b>
+(<code>SignalStrength</code>)</A></nobr><br>
+<!-- Class PackageManager -->
+<A NAME="P"></A>
+<br><font size="+2">P</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
+<!-- Class PhoneStateListener -->
+<A HREF="android.telephony.PhoneStateListener.html" class="hiddenlink" target="rightframe">PhoneStateListener</A><br>
+<!-- Class PowerManager -->
+<A HREF="android.os.PowerManager.html" class="hiddenlink" target="rightframe">PowerManager</A><br>
+<!-- Class R.attr -->
+<A NAME="R"></A>
+<br><font size="+2">R</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="#S"><font size="-2">S</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="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
+<!-- Class Rect -->
+<A HREF="android.graphics.Rect.html" class="hiddenlink" target="rightframe">Rect</A><br>
+<!-- Class RemoteViews -->
+<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br>
+<!-- Method removeAllViews -->
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.removeAllViews_added(int)" class="hiddenlink" target="rightframe"><b>removeAllViews</b>
+(<code>int</code>)</A></nobr><br>
+<!-- Method removePackageFromPreferred -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">removePackageFromPreferred
+(<code>String</code>)</A></nobr><br>
+<!-- Method sendWallpaperCommand -->
+<A NAME="S"></A>
+<br><font size="+2">S</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="#R"><font size="-2">R</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">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>sendWallpaperCommand</b>
+(<code>IBinder, String, int, int, int, Bundle</code>)</A></nobr><br>
+<!-- Field SET_PREFERRED_APPLICATIONS -->
+<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.SET_PREFERRED_APPLICATIONS" class="hiddenlink" target="rightframe">SET_PREFERRED_APPLICATIONS</A>
+</nobr><br>
+<!-- Method setAppCacheEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setAppCacheEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setAppCacheMaxSize -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheMaxSize_added(long)" class="hiddenlink" target="rightframe"><b>setAppCacheMaxSize</b>
+(<code>long</code>)</A></nobr><br>
+<!-- Method setAppCachePath -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCachePath_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>setAppCachePath</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Method setAutoStart -->
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.setAutoStart_added(boolean)" class="hiddenlink" target="rightframe"><b>setAutoStart</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setChildrenDrawingOrderEnabled -->
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setChildrenDrawingOrderEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setDefaultZoom -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)" class="hiddenlink" target="rightframe"><b>setDefaultZoom</b>
+(<code>ZoomDensity</code>)</A></nobr><br>
+<!-- Method setDomStorageEnabled -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDomStorageEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setDomStorageEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setLoadWithOverviewMode -->
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)" class="hiddenlink" target="rightframe"><b>setLoadWithOverviewMode</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setQuotaForOrigin -->
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)" class="hiddenlink" target="rightframe"><b>setQuotaForOrigin</b>
+(<code>String, long</code>)</A></nobr><br>
+<!-- Method setSourceBounds -->
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSourceBounds_added(android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>setSourceBounds</b>
+(<code>Rect</code>)</A></nobr><br>
+<!-- Method setWallpaperOffsetSteps -->
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)" class="hiddenlink" target="rightframe"><b>setWallpaperOffsetSteps</b>
+(<code>float, float</code>)</A></nobr><br>
+<!-- Class SignalStrength -->
+<A HREF="pkg_android.telephony.html#SignalStrength" class="hiddenlink" target="rightframe"><b>SignalStrength</b></A><br>
+<!-- Method unflattenFromString -->
+<A NAME="U"></A>
+<br><font size="+2">U</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="#R"><font size="-2">R</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">
+<nobr><A HREF="android.graphics.Rect.html#android.graphics.Rect.unflattenFromString_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>unflattenFromString</b>
+(<code>String</code>)</A></nobr><br>
+<!-- Class ValueCallback -->
+<A NAME="V"></A>
+<br><font size="+2">V</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</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.webkit.html#ValueCallback" class="hiddenlink" target="rightframe"><b><i>ValueCallback</i></b></A><br>
+<!-- Class View -->
+<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br>
+<!-- Class ViewFlipper -->
+<A HREF="android.widget.ViewFlipper.html" class="hiddenlink" target="rightframe">ViewFlipper</A><br>
+<!-- Class ViewGroup -->
+<A HREF="android.view.ViewGroup.html" class="hiddenlink" target="rightframe">ViewGroup</A><br>
+<!-- Field VOICE_RECOGNITION -->
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION" class="hiddenlink" target="rightframe">VOICE_RECOGNITION</A>
+</nobr><br>
+<!-- Class WallpaperInfo -->
+<A NAME="W"></A>
+<br><font size="+2">W</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.app.html#WallpaperInfo" class="hiddenlink" target="rightframe"><b>WallpaperInfo</b></A><br>
+<!-- Class WallpaperManager -->
+<A HREF="android.app.WallpaperManager.html" class="hiddenlink" target="rightframe">WallpaperManager</A><br>
+<!-- Class WebChromeClient -->
+<A HREF="android.webkit.WebChromeClient.html" class="hiddenlink" target="rightframe">WebChromeClient</A><br>
+<!-- Class WebChromeClient.CustomViewCallback -->
+<A HREF="pkg_android.webkit.html#WebChromeClient.CustomViewCallback" class="hiddenlink" target="rightframe"><b><i>WebChromeClient.CustomViewCallback</i></b></A><br>
+<!-- Class WebSettings -->
+<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br>
+<!-- Class WebSettings.ZoomDensity -->
+<A HREF="pkg_android.webkit.html#WebSettings.ZoomDensity" class="hiddenlink" target="rightframe"><b>WebSettings.ZoomDensity</b></A><br>
+<!-- Class WebStorage -->
+<A HREF="android.webkit.WebStorage.html" class="hiddenlink" target="rightframe">WebStorage</A><br>
+<!-- Class WebView -->
+<A HREF="android.webkit.WebView.html" class="hiddenlink" target="rightframe">WebView</A><br>
+<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/7/changes/alldiffs_index_changes.html b/docs/html/sdk/api_diff/7/changes/alldiffs_index_changes.html
new file mode 100644
index 0000000..173d8e9
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/alldiffs_index_changes.html
@@ -0,0 +1,378 @@
+<!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>
+All Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Method addPackageToPreferred -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</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="#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="#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">
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">addPackageToPreferred
+(<code>String</code>)</A></nobr><br>
+<!-- Package android -->
+<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br>
+<!-- Package android.app -->
+<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br>
+<!-- Package android.content -->
+<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br>
+<!-- Package android.content.pm -->
+<A HREF="pkg_android.content.pm.html" class="hiddenlink" target="rightframe">android.content.pm</A><br>
+<!-- Package android.graphics -->
+<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br>
+<!-- Package android.media -->
+<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br>
+<!-- Package android.os -->
+<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br>
+<!-- Package android.telephony -->
+<A HREF="pkg_android.telephony.html" class="hiddenlink" target="rightframe">android.telephony</A><br>
+<!-- Package android.view -->
+<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br>
+<!-- Package android.webkit -->
+<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br>
+<!-- Package android.widget -->
+<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br>
+<!-- Class Build.VERSION_CODES -->
+<A NAME="B"></A>
+<br><font size="+2">B</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</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="#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="#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="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br>
+<!-- Class CacheManager.CacheResult -->
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#E"><font size="-2">E</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="#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="#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="android.webkit.CacheManager.CacheResult.html" class="hiddenlink" target="rightframe">CacheManager.CacheResult</A><br>
+<!-- Field EXTRA_CHANGED_COMPONENT_NAME -->
+<A NAME="E"></A>
+<br><font size="+2">E</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="#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="#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="#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">
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME</A>
+</nobr><br>
+<!-- Class GeolocationPermissions -->
+<A NAME="G"></A>
+<br><font size="+2">G</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="#E"><font size="-2">E</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="#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="#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="android.webkit.GeolocationPermissions.html" class="hiddenlink" target="rightframe">GeolocationPermissions</A><br>
+<!-- Class Intent -->
+<A NAME="I"></A>
+<br><font size="+2">I</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="#E"><font size="-2">E</font></a>
+<a href="#G"><font size="-2">G</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="#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="#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="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br>
+<!-- Field LISTEN_SIGNAL_STRENGTH -->
+<A NAME="L"></A>
+<br><font size="+2">L</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="#E"><font size="-2">E</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTH</A>
+</nobr><br>
+<!-- Class Manifest.permission -->
+<A NAME="M"></A>
+<br><font size="+2">M</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="#E"><font size="-2">E</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="#N"><font size="-2">N</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="#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="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
+<!-- Class MediaRecorder.AudioSource -->
+<A HREF="android.media.MediaRecorder.AudioSource.html" class="hiddenlink" target="rightframe">MediaRecorder.AudioSource</A><br>
+<!-- Class NeighboringCellInfo -->
+<A NAME="N"></A>
+<br><font size="+2">N</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="#E"><font size="-2">E</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="#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="#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="android.telephony.NeighboringCellInfo.html" class="hiddenlink" target="rightframe">NeighboringCellInfo</A><br>
+<!-- Class PackageManager -->
+<A NAME="P"></A>
+<br><font size="+2">P</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="#E"><font size="-2">E</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="#R"><font size="-2">R</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="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
+<!-- Class PhoneStateListener -->
+<A HREF="android.telephony.PhoneStateListener.html" class="hiddenlink" target="rightframe">PhoneStateListener</A><br>
+<!-- Class PowerManager -->
+<A HREF="android.os.PowerManager.html" class="hiddenlink" target="rightframe">PowerManager</A><br>
+<!-- Class R.attr -->
+<A NAME="R"></A>
+<br><font size="+2">R</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="#E"><font size="-2">E</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="#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="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
+<!-- Class Rect -->
+<A HREF="android.graphics.Rect.html" class="hiddenlink" target="rightframe">Rect</A><br>
+<!-- Class RemoteViews -->
+<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br>
+<!-- Method removePackageFromPreferred -->
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">removePackageFromPreferred
+(<code>String</code>)</A></nobr><br>
+<!-- Field SET_PREFERRED_APPLICATIONS -->
+<A NAME="S"></A>
+<br><font size="+2">S</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="#E"><font size="-2">E</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="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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">
+<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.SET_PREFERRED_APPLICATIONS" class="hiddenlink" target="rightframe">SET_PREFERRED_APPLICATIONS</A>
+</nobr><br>
+<!-- Class View -->
+<A NAME="V"></A>
+<br><font size="+2">V</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="#E"><font size="-2">E</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="#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="#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="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br>
+<!-- Class ViewFlipper -->
+<A HREF="android.widget.ViewFlipper.html" class="hiddenlink" target="rightframe">ViewFlipper</A><br>
+<!-- Class ViewGroup -->
+<A HREF="android.view.ViewGroup.html" class="hiddenlink" target="rightframe">ViewGroup</A><br>
+<!-- Class WallpaperManager -->
+<A NAME="W"></A>
+<br><font size="+2">W</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="#E"><font size="-2">E</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="#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="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.app.WallpaperManager.html" class="hiddenlink" target="rightframe">WallpaperManager</A><br>
+<!-- Class WebChromeClient -->
+<A HREF="android.webkit.WebChromeClient.html" class="hiddenlink" target="rightframe">WebChromeClient</A><br>
+<!-- Class WebSettings -->
+<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br>
+<!-- Class WebStorage -->
+<A HREF="android.webkit.WebStorage.html" class="hiddenlink" target="rightframe">WebStorage</A><br>
+<!-- Class WebView -->
+<A HREF="android.webkit.WebView.html" class="hiddenlink" target="rightframe">WebView</A><br>
+<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/7/changes/alldiffs_index_removals.html b/docs/html/sdk/api_diff/7/changes/alldiffs_index_removals.html
new file mode 100644
index 0000000..68d2c20
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/alldiffs_index_removals.html
@@ -0,0 +1,61 @@
+<!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>
+All Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/android.Manifest.permission.html b/docs/html/sdk/api_diff/7/changes/android.Manifest.permission.html
new file mode 100644
index 0000000..48b3bb0
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.Manifest.permission.html
@@ -0,0 +1,124 @@
+<!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.Manifest.permission
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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/Manifest.permission.html" target="_top"><font size="+2"><code>Manifest.permission</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<a NAME="fields"></a>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Fields" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Fields</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.Manifest.permission.SET_PREFERRED_APPLICATIONS"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/Manifest.permission.html#SET_PREFERRED_APPLICATIONS" target="_top"><code>SET_PREFERRED_APPLICATIONS</code></font></A></nobr> </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </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/7/changes/android.R.attr.html b/docs/html/sdk/api_diff/7/changes/android.R.attr.html
new file mode 100644
index 0000000..609b2fc
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.R.attr.html
@@ -0,0 +1,129 @@
+<!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.attr
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.attr.html" target="_top"><font size="+2"><code>R.attr</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.attr.author"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#author" target="_top"><code>author</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.R.attr.autoStart"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#autoStart" target="_top"><code>autoStart</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/7/changes/android.app.WallpaperManager.html b/docs/html/sdk/api_diff/7/changes/android.app.WallpaperManager.html
new file mode 100644
index 0000000..45db50d
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.app.WallpaperManager.html
@@ -0,0 +1,165 @@
+<!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.app.WallpaperManager
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.app.<A HREF="../../../../reference/android/app/WallpaperManager.html" target="_top"><font size="+2"><code>WallpaperManager</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app.WallpaperManager.getWallpaperInfo_added()"></A>
+ <nobr><code>WallpaperInfo</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#getWallpaperInfo()" target="_top"><code>getWallpaperInfo</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)" target="_top"><code>sendWallpaperCommand</code></A>(<code>IBinder,</nobr> String<nobr>,</nobr> int<nobr>,</nobr> int<nobr>,</nobr> int<nobr>,</nobr> Bundle<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#setWallpaperOffsetSteps(float, float)" target="_top"><code>setWallpaperOffsetSteps</code></A>(<code>float,</nobr> float<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<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.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#ACTION_LIVE_WALLPAPER_CHOOSER" target="_top"><code>ACTION_LIVE_WALLPAPER_CHOOSER</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app.WallpaperManager.COMMAND_DROP"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#COMMAND_DROP" target="_top"><code>COMMAND_DROP</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app.WallpaperManager.COMMAND_TAP"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/app/WallpaperManager.html#COMMAND_TAP" target="_top"><code>COMMAND_TAP</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/7/changes/android.content.Intent.html b/docs/html/sdk/api_diff/7/changes/android.content.Intent.html
new file mode 100644
index 0000000..4eb6058
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.content.Intent.html
@@ -0,0 +1,175 @@
+<!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.content.Intent
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.content.<A HREF="../../../../reference/android/content/Intent.html" target="_top"><font size="+2"><code>Intent</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.Intent.getSourceBounds_added()"></A>
+ <nobr><code>Rect</code> <A HREF="../../../../reference/android/content/Intent.html#getSourceBounds()" target="_top"><code>getSourceBounds</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.Intent.setSourceBounds_added(android.graphics.Rect)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/content/Intent.html#setSourceBounds(android.graphics.Rect)" target="_top"><code>setSourceBounds</code></A>(<code>Rect</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<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.content.Intent.ACTION_LOCALE_CHANGED"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#ACTION_LOCALE_CHANGED" target="_top"><code>ACTION_LOCALE_CHANGED</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#EXTRA_CHANGED_COMPONENT_NAME_LIST" target="_top"><code>EXTRA_CHANGED_COMPONENT_NAME_LIST</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.Intent.FILL_IN_SOURCE_BOUNDS"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/content/Intent.html#FILL_IN_SOURCE_BOUNDS" target="_top"><code>FILL_IN_SOURCE_BOUNDS</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Fields" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Fields</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#EXTRA_CHANGED_COMPONENT_NAME" target="_top"><code>EXTRA_CHANGED_COMPONENT_NAME</code></font></A></nobr> </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </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/7/changes/android.content.pm.PackageManager.html b/docs/html/sdk/api_diff/7/changes/android.content.pm.PackageManager.html
new file mode 100644
index 0000000..58b17ee
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.content.pm.PackageManager.html
@@ -0,0 +1,213 @@
+<!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.content.pm.PackageManager
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.content.pm.<A HREF="../../../../reference/android/content/pm/PackageManager.html" target="_top"><font size="+2"><code>PackageManager</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#addPackageToPreferred(java.lang.String)" target="_top"><code>addPackageToPreferred</code></A>(<code>String</code>) </nobr>
+ </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#removePackageFromPreferred(java.lang.String)" target="_top"><code>removePackageFromPreferred</code></A>(<code>String</code>) </nobr>
+ </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<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.content.pm.PackageManager.FEATURE_CAMERA"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_CAMERA" target="_top"><code>FEATURE_CAMERA</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_CAMERA_AUTOFOCUS" target="_top"><code>FEATURE_CAMERA_AUTOFOCUS</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_CAMERA_FLASH"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_CAMERA_FLASH" target="_top"><code>FEATURE_CAMERA_FLASH</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_LIVE_WALLPAPER" target="_top"><code>FEATURE_LIVE_WALLPAPER</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_SENSOR_LIGHT" target="_top"><code>FEATURE_SENSOR_LIGHT</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_SENSOR_PROXIMITY" target="_top"><code>FEATURE_SENSOR_PROXIMITY</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_TELEPHONY"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_TELEPHONY" target="_top"><code>FEATURE_TELEPHONY</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_TELEPHONY_CDMA" target="_top"><code>FEATURE_TELEPHONY_CDMA</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_TELEPHONY_GSM" target="_top"><code>FEATURE_TELEPHONY_GSM</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/content/pm/PackageManager.html#FEATURE_TOUCHSCREEN_MULTITOUCH" target="_top"><code>FEATURE_TOUCHSCREEN_MULTITOUCH</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/7/changes/android.graphics.Rect.html b/docs/html/sdk/api_diff/7/changes/android.graphics.Rect.html
new file mode 100644
index 0000000..dad11c7
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.graphics.Rect.html
@@ -0,0 +1,129 @@
+<!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.graphics.Rect
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.graphics.<A HREF="../../../../reference/android/graphics/Rect.html" target="_top"><font size="+2"><code>Rect</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.graphics.Rect.flattenToString_added()"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/graphics/Rect.html#flattenToString()" target="_top"><code>flattenToString</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.graphics.Rect.unflattenFromString_added(java.lang.String)"></A>
+ <nobr><code>Rect</code> <A HREF="../../../../reference/android/graphics/Rect.html#unflattenFromString(java.lang.String)" target="_top"><code>unflattenFromString</code></A>(<code>String</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.media.MediaRecorder.AudioSource.html b/docs/html/sdk/api_diff/7/changes/android.media.MediaRecorder.AudioSource.html
new file mode 100644
index 0000000..b08003c
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.media.MediaRecorder.AudioSource.html
@@ -0,0 +1,129 @@
+<!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.media.MediaRecorder.AudioSource
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.media.<A HREF="../../../../reference/android/media/MediaRecorder.AudioSource.html" target="_top"><font size="+2"><code>MediaRecorder.AudioSource</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.media.MediaRecorder.AudioSource.CAMCORDER"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/media/MediaRecorder.AudioSource.html#CAMCORDER" target="_top"><code>CAMCORDER</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/media/MediaRecorder.AudioSource.html#VOICE_RECOGNITION" target="_top"><code>VOICE_RECOGNITION</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/7/changes/android.os.Build.VERSION_CODES.html b/docs/html/sdk/api_diff/7/changes/android.os.Build.VERSION_CODES.html
new file mode 100644
index 0000000..26b054be
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.os.Build.VERSION_CODES.html
@@ -0,0 +1,122 @@
+<!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.os.Build.VERSION_CODES
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.os.<A HREF="../../../../reference/android/os/Build.VERSION_CODES.html" target="_top"><font size="+2"><code>Build.VERSION_CODES</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.os.Build.VERSION_CODES.ECLAIR_MR1"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/os/Build.VERSION_CODES.html#ECLAIR_MR1" target="_top"><code>ECLAIR_MR1</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/7/changes/android.os.PowerManager.html b/docs/html/sdk/api_diff/7/changes/android.os.PowerManager.html
new file mode 100644
index 0000000..f766c93
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.os.PowerManager.html
@@ -0,0 +1,122 @@
+<!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.os.PowerManager
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.os.<A HREF="../../../../reference/android/os/PowerManager.html" target="_top"><font size="+2"><code>PowerManager</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.os.PowerManager.isScreenOn_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/os/PowerManager.html#isScreenOn()" target="_top"><code>isScreenOn</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.telephony.NeighboringCellInfo.html b/docs/html/sdk/api_diff/7/changes/android.telephony.NeighboringCellInfo.html
new file mode 100644
index 0000000..e59d1e8
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.telephony.NeighboringCellInfo.html
@@ -0,0 +1,122 @@
+<!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.telephony.NeighboringCellInfo
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.telephony.<A HREF="../../../../reference/android/telephony/NeighboringCellInfo.html" target="_top"><font size="+2"><code>NeighboringCellInfo</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Constructors" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Constructors</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)"></A>
+ <nobr><A HREF="../../../../reference/android/telephony/NeighboringCellInfo.html#NeighboringCellInfo(int, java.lang.String, int)" target="_top"><code>NeighboringCellInfo</code></A>(<code>int,</nobr> String<nobr>,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="methods"></a>
+<a NAME="fields"></a>
+ </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/7/changes/android.telephony.PhoneStateListener.html b/docs/html/sdk/api_diff/7/changes/android.telephony.PhoneStateListener.html
new file mode 100644
index 0000000..aa87eb8
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.telephony.PhoneStateListener.html
@@ -0,0 +1,161 @@
+<!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.telephony.PhoneStateListener
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.telephony.<A HREF="../../../../reference/android/telephony/PhoneStateListener.html" target="_top"><font size="+2"><code>PhoneStateListener</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/telephony/PhoneStateListener.html#onDataConnectionStateChanged(int, int)" target="_top"><code>onDataConnectionStateChanged</code></A>(<code>int,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/telephony/PhoneStateListener.html#onSignalStrengthsChanged(android.telephony.SignalStrength)" target="_top"><code>onSignalStrengthsChanged</code></A>(<code>SignalStrength</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<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.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/telephony/PhoneStateListener.html#LISTEN_SIGNAL_STRENGTHS" target="_top"><code>LISTEN_SIGNAL_STRENGTHS</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Fields" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Fields</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH"></A>
+ <nobr><code>int</code> <A HREF="../../../../reference/android/telephony/PhoneStateListener.html#LISTEN_SIGNAL_STRENGTH" target="_top"><code>LISTEN_SIGNAL_STRENGTH</code></font></A></nobr> </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </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/7/changes/android.view.View.html b/docs/html/sdk/api_diff/7/changes/android.view.View.html
new file mode 100644
index 0000000..1194d59
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.view.View.html
@@ -0,0 +1,129 @@
+<!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.view.View
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.view.<A HREF="../../../../reference/android/view/View.html" target="_top"><font size="+2"><code>View</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.view.View.isOpaque_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/view/View.html#isOpaque()" target="_top"><code>isOpaque</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.view.View.onDrawScrollBars_added(android.graphics.Canvas)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/view/View.html#onDrawScrollBars(android.graphics.Canvas)" target="_top"><code>onDrawScrollBars</code></A>(<code>Canvas</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.view.ViewGroup.html b/docs/html/sdk/api_diff/7/changes/android.view.ViewGroup.html
new file mode 100644
index 0000000..d7c030c
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.view.ViewGroup.html
@@ -0,0 +1,129 @@
+<!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.view.ViewGroup
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.view.<A HREF="../../../../reference/android/view/ViewGroup.html" target="_top"><font size="+2"><code>ViewGroup</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/view/ViewGroup.html#isChildrenDrawingOrderEnabled()" target="_top"><code>isChildrenDrawingOrderEnabled</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/view/ViewGroup.html#setChildrenDrawingOrderEnabled(boolean)" target="_top"><code>setChildrenDrawingOrderEnabled</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.CacheManager.CacheResult.html b/docs/html/sdk/api_diff/7/changes/android.webkit.CacheManager.CacheResult.html
new file mode 100644
index 0000000..869421e
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.CacheManager.CacheResult.html
@@ -0,0 +1,129 @@
+<!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.webkit.CacheManager.CacheResult
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/CacheManager.CacheResult.html" target="_top"><font size="+2"><code>CacheManager.CacheResult</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.CacheManager.CacheResult.getContentDisposition_added()"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/webkit/CacheManager.CacheResult.html#getContentDisposition()" target="_top"><code>getContentDisposition</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.CacheManager.CacheResult.getExpiresString_added()"></A>
+ <nobr><code>String</code> <A HREF="../../../../reference/android/webkit/CacheManager.CacheResult.html#getExpiresString()" target="_top"><code>getExpiresString</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.GeolocationPermissions.html b/docs/html/sdk/api_diff/7/changes/android.webkit.GeolocationPermissions.html
new file mode 100644
index 0000000..2dacbba
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.GeolocationPermissions.html
@@ -0,0 +1,157 @@
+<!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.webkit.GeolocationPermissions
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/GeolocationPermissions.html" target="_top"><font size="+2"><code>GeolocationPermissions</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.allow_added(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#allow(java.lang.String)" target="_top"><code>allow</code></A>(<code>String</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.clear_added(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#clear(java.lang.String)" target="_top"><code>clear</code></A>(<code>String</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.clearAll_added()"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#clearAll()" target="_top"><code>clearAll</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#getAllowed(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)" target="_top"><code>getAllowed</code></A>(<code>String,</nobr> ValueCallback<Boolean><nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.getInstance_added()"></A>
+ <nobr><code>GeolocationPermissions</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#getInstance()" target="_top"><code>getInstance</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/GeolocationPermissions.html#getOrigins(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)" target="_top"><code>getOrigins</code></A>(<code>ValueCallback<Set<String>></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.WebChromeClient.html b/docs/html/sdk/api_diff/7/changes/android.webkit.WebChromeClient.html
new file mode 100644
index 0000000..5bc64b34
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.WebChromeClient.html
@@ -0,0 +1,178 @@
+<!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.webkit.WebChromeClient
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/WebChromeClient.html" target="_top"><font size="+2"><code>WebChromeClient</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.getDefaultVideoPoster_added()"></A>
+ <nobr><code>Bitmap</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#getDefaultVideoPoster()" target="_top"><code>getDefaultVideoPoster</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.getVideoLoadingProgressView_added()"></A>
+ <nobr><code>View</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#getVideoLoadingProgressView()" target="_top"><code>getVideoLoadingProgressView</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#getVisitedHistory(android.webkit.ValueCallback<java.lang.String[]>)" target="_top"><code>getVisitedHistory</code></A>(<code>ValueCallback<String[]></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onConsoleMessage(java.lang.String, int, java.lang.String)" target="_top"><code>onConsoleMessage</code></A>(<code>String,</nobr> int<nobr>,</nobr> String<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onHideCustomView_added()"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onHideCustomView()" target="_top"><code>onHideCustomView</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onJsTimeout_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onJsTimeout()" target="_top"><code>onJsTimeout</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onReachedMaxAppCacheSize(long, long, android.webkit.WebStorage.QuotaUpdater)" target="_top"><code>onReachedMaxAppCacheSize</code></A>(<code>long,</nobr> long<nobr>,</nobr> QuotaUpdater<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onReceivedTouchIconUrl(android.webkit.WebView, java.lang.String, boolean)" target="_top"><code>onReceivedTouchIconUrl</code></A>(<code>WebView,</nobr> String<nobr>,</nobr> boolean<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebChromeClient.html#onShowCustomView(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)" target="_top"><code>onShowCustomView</code></A>(<code>View,</nobr> CustomViewCallback<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.WebSettings.html b/docs/html/sdk/api_diff/7/changes/android.webkit.WebSettings.html
new file mode 100644
index 0000000..f763d8b
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.WebSettings.html
@@ -0,0 +1,178 @@
+<!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.webkit.WebSettings
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/WebSettings.html" target="_top"><font size="+2"><code>WebSettings</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.getDefaultZoom_added()"></A>
+ <nobr><code>ZoomDensity</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#getDefaultZoom()" target="_top"><code>getDefaultZoom</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.getDomStorageEnabled_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#getDomStorageEnabled()" target="_top"><code>getDomStorageEnabled</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.getLoadWithOverviewMode_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#getLoadWithOverviewMode()" target="_top"><code>getLoadWithOverviewMode</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setAppCacheEnabled_added(boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setAppCacheEnabled(boolean)" target="_top"><code>setAppCacheEnabled</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setAppCacheMaxSize_added(long)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setAppCacheMaxSize(long)" target="_top"><code>setAppCacheMaxSize</code></A>(<code>long</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setAppCachePath_added(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setAppCachePath(java.lang.String)" target="_top"><code>setAppCachePath</code></A>(<code>String</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setDefaultZoom(android.webkit.WebSettings.ZoomDensity)" target="_top"><code>setDefaultZoom</code></A>(<code>ZoomDensity</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setDomStorageEnabled_added(boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setDomStorageEnabled(boolean)" target="_top"><code>setDomStorageEnabled</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setLoadWithOverviewMode(boolean)" target="_top"><code>setLoadWithOverviewMode</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.WebStorage.html b/docs/html/sdk/api_diff/7/changes/android.webkit.WebStorage.html
new file mode 100644
index 0000000..0b20ec2
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.WebStorage.html
@@ -0,0 +1,164 @@
+<!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.webkit.WebStorage
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/WebStorage.html" target="_top"><font size="+2"><code>WebStorage</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.deleteAllData_added()"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#deleteAllData()" target="_top"><code>deleteAllData</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.deleteOrigin_added(java.lang.String)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#deleteOrigin(java.lang.String)" target="_top"><code>deleteOrigin</code></A>(<code>String</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.getInstance_added()"></A>
+ <nobr><code>WebStorage</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#getInstance()" target="_top"><code>getInstance</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#getOrigins(android.webkit.ValueCallback<java.util.Map>)" target="_top"><code>getOrigins</code></A>(<code>ValueCallback<Map></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#getQuotaForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" target="_top"><code>getQuotaForOrigin</code></A>(<code>String,</nobr> ValueCallback<Long><nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#getUsageForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" target="_top"><code>getUsageForOrigin</code></A>(<code>String,</nobr> ValueCallback<Long><nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebStorage.html#setQuotaForOrigin(java.lang.String, long)" target="_top"><code>setQuotaForOrigin</code></A>(<code>String,</nobr> long<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.webkit.WebView.html b/docs/html/sdk/api_diff/7/changes/android.webkit.WebView.html
new file mode 100644
index 0000000..e927bc6
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.webkit.WebView.html
@@ -0,0 +1,122 @@
+<!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.webkit.WebView
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.webkit.<A HREF="../../../../reference/android/webkit/WebView.html" target="_top"><font size="+2"><code>WebView</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit.WebView.freeMemory_added()"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebView.html#freeMemory()" target="_top"><code>freeMemory</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.widget.RemoteViews.html b/docs/html/sdk/api_diff/7/changes/android.widget.RemoteViews.html
new file mode 100644
index 0000000..2651c5e
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.widget.RemoteViews.html
@@ -0,0 +1,129 @@
+<!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.widget.RemoteViews
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.widget.<A HREF="../../../../reference/android/widget/RemoteViews.html" target="_top"><font size="+2"><code>RemoteViews</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/widget/RemoteViews.html#addView(int, android.widget.RemoteViews)" target="_top"><code>addView</code></A>(<code>int,</nobr> RemoteViews<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.widget.RemoteViews.removeAllViews_added(int)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/widget/RemoteViews.html#removeAllViews(int)" target="_top"><code>removeAllViews</code></A>(<code>int</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/android.widget.ViewFlipper.html b/docs/html/sdk/api_diff/7/changes/android.widget.ViewFlipper.html
new file mode 100644
index 0000000..fe92777
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/android.widget.ViewFlipper.html
@@ -0,0 +1,129 @@
+<!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.widget.ViewFlipper
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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.widget.<A HREF="../../../../reference/android/widget/ViewFlipper.html" target="_top"><font size="+2"><code>ViewFlipper</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.widget.ViewFlipper.isAutoStart_added()"></A>
+ <nobr><code>boolean</code> <A HREF="../../../../reference/android/widget/ViewFlipper.html#isAutoStart()" target="_top"><code>isAutoStart</code></A>()</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.widget.ViewFlipper.setAutoStart_added(boolean)"></A>
+ <nobr><code>void</code> <A HREF="../../../../reference/android/widget/ViewFlipper.html#setAutoStart(boolean)" target="_top"><code>setAutoStart</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<a NAME="fields"></a>
+ </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/7/changes/changes-summary.html b/docs/html/sdk/api_diff/7/changes/changes-summary.html
new file mode 100644
index 0000000..330f727
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/changes-summary.html
@@ -0,0 +1,220 @@
+<!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 API Differences Report
+</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 class="gc-documentation">
+<!-- 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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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">
+ <div id="docTitleContainer">
+<h1>Android API Differences Report</h1>
+<p>This report details the changes in the core Android framework API between two <a
+href="http://developer.android.com/guide/appendix/api-levels.html" target="_top">API Level</a>
+specifications. It shows additions, modifications, and removals for packages, classes, methods, and fields.
+The report also includes general statistics that characterize the extent and type of the differences.</p>
+<p>This report is based a comparison of the Android API specifications
+whose API Level identifiers are given in the upper-right corner of this page. It compares a
+newer "to" API to an older "from" API, noting all changes relative to the
+older API. So, for example, API elements marked as removed are no longer present in the "to"
+API specification.</p>
+<p>To navigate the report, use the "Select a Diffs Index" and "Filter the Index"
+controls on the left. The report uses text formatting to indicate <em>interface names</em>,
+<a href= ><code>links to reference documentation</code></a>, and <a href= >links to change
+description</a>. The statistics are accessible from the "Statistics" link in the upper-right corner.</p>
+<p>For more information about the Android framework API and SDK,
+see the <a href="http://developer.android.com/index.html" target="_top">Android Developers site</a>.</p>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Packages" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Packages</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.service.wallpaper"></A>
+ <nobr><A HREF="../../../../reference/android/service/wallpaper/package-summary.html" target="_top"><code>android.service.wallpaper</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Packages" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Packages</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android"></A>
+ <nobr><A HREF="pkg_android.html">android</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.app"></A>
+ <nobr><A HREF="pkg_android.app.html">android.app</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content"></A>
+ <nobr><A HREF="pkg_android.content.html">android.content</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.content.pm"></A>
+ <nobr><A HREF="pkg_android.content.pm.html">android.content.pm</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.graphics"></A>
+ <nobr><A HREF="pkg_android.graphics.html">android.graphics</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.media"></A>
+ <nobr><A HREF="pkg_android.media.html">android.media</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.os"></A>
+ <nobr><A HREF="pkg_android.os.html">android.os</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.telephony"></A>
+ <nobr><A HREF="pkg_android.telephony.html">android.telephony</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.view"></A>
+ <nobr><A HREF="pkg_android.view.html">android.view</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.webkit"></A>
+ <nobr><A HREF="pkg_android.webkit.html">android.webkit</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.widget"></A>
+ <nobr><A HREF="pkg_android.widget.html">android.widget</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<!-- End of API section -->
+<!-- Start of packages section -->
+ </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/7/changes/classes_index_additions.html b/docs/html/sdk/api_diff/7/changes/classes_index_additions.html
new file mode 100644
index 0000000..db5459e
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/classes_index_additions.html
@@ -0,0 +1,84 @@
+<!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>
+Class Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<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.telephony.html#SignalStrength" class="hiddenlink" target="rightframe"><b>SignalStrength</b></A><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#S"><font size="-2">S</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.webkit.html#ValueCallback" class="hiddenlink" target="rightframe"><b><i>ValueCallback</i></b></A><br>
+<A NAME="W"></A>
+<br><font size="+2">W</font>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.app.html#WallpaperInfo" class="hiddenlink" target="rightframe"><b>WallpaperInfo</b></A><br>
+<A HREF="pkg_android.webkit.html#WebChromeClient.CustomViewCallback" class="hiddenlink" target="rightframe"><b><i>WebChromeClient.CustomViewCallback</i></b></A><br>
+<A HREF="pkg_android.webkit.html#WebSettings.ZoomDensity" class="hiddenlink" target="rightframe"><b>WebSettings.ZoomDensity</b></A><br>
+<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/7/changes/classes_index_all.html b/docs/html/sdk/api_diff/7/changes/classes_index_all.html
new file mode 100644
index 0000000..49b9728
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/classes_index_all.html
@@ -0,0 +1,241 @@
+<!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>
+Class Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Classes</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="B"></A>
+<br><font size="+2">B</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<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="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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="android.webkit.CacheManager.CacheResult.html" class="hiddenlink" target="rightframe">CacheManager.CacheResult</A><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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="android.webkit.GeolocationPermissions.html" class="hiddenlink" target="rightframe">GeolocationPermissions</A><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br>
+<A NAME="M"></A>
+<br><font size="+2">M</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</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="#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="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
+<A HREF="android.media.MediaRecorder.AudioSource.html" class="hiddenlink" target="rightframe">MediaRecorder.AudioSource</A><br>
+<A NAME="N"></A>
+<br><font size="+2">N</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</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="#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="android.telephony.NeighboringCellInfo.html" class="hiddenlink" target="rightframe">NeighboringCellInfo</A><br>
+<A NAME="P"></A>
+<br><font size="+2">P</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</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="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
+<A HREF="android.telephony.PhoneStateListener.html" class="hiddenlink" target="rightframe">PhoneStateListener</A><br>
+<A HREF="android.os.PowerManager.html" class="hiddenlink" target="rightframe">PowerManager</A><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
+<A HREF="android.graphics.Rect.html" class="hiddenlink" target="rightframe">Rect</A><br>
+<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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.telephony.html#SignalStrength" class="hiddenlink" target="rightframe"><b>SignalStrength</b></A><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#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.webkit.html#ValueCallback" class="hiddenlink" target="rightframe"><b><i>ValueCallback</i></b></A><br>
+<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br>
+<A HREF="android.widget.ViewFlipper.html" class="hiddenlink" target="rightframe">ViewFlipper</A><br>
+<A HREF="android.view.ViewGroup.html" class="hiddenlink" target="rightframe">ViewGroup</A><br>
+<A NAME="W"></A>
+<br><font size="+2">W</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</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="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.app.html#WallpaperInfo" class="hiddenlink" target="rightframe"><b>WallpaperInfo</b></A><br>
+<A HREF="android.app.WallpaperManager.html" class="hiddenlink" target="rightframe">WallpaperManager</A><br>
+<A HREF="android.webkit.WebChromeClient.html" class="hiddenlink" target="rightframe">WebChromeClient</A><br>
+<A HREF="pkg_android.webkit.html#WebChromeClient.CustomViewCallback" class="hiddenlink" target="rightframe"><b><i>WebChromeClient.CustomViewCallback</i></b></A><br>
+<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br>
+<A HREF="pkg_android.webkit.html#WebSettings.ZoomDensity" class="hiddenlink" target="rightframe"><b>WebSettings.ZoomDensity</b></A><br>
+<A HREF="android.webkit.WebStorage.html" class="hiddenlink" target="rightframe">WebStorage</A><br>
+<A HREF="android.webkit.WebView.html" class="hiddenlink" target="rightframe">WebView</A><br>
+<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/7/changes/classes_index_changes.html b/docs/html/sdk/api_diff/7/changes/classes_index_changes.html
new file mode 100644
index 0000000..f40db15
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/classes_index_changes.html
@@ -0,0 +1,212 @@
+<!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>
+Class Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="B"></A>
+<br><font size="+2">B</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<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="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.webkit.CacheManager.CacheResult.html" class="hiddenlink" target="rightframe">CacheManager.CacheResult</A><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.webkit.GeolocationPermissions.html" class="hiddenlink" target="rightframe">GeolocationPermissions</A><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br>
+<A NAME="M"></A>
+<br><font size="+2">M</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
+<A HREF="android.media.MediaRecorder.AudioSource.html" class="hiddenlink" target="rightframe">MediaRecorder.AudioSource</A><br>
+<A NAME="N"></A>
+<br><font size="+2">N</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.telephony.NeighboringCellInfo.html" class="hiddenlink" target="rightframe">NeighboringCellInfo</A><br>
+<A NAME="P"></A>
+<br><font size="+2">P</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</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="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
+<A HREF="android.telephony.PhoneStateListener.html" class="hiddenlink" target="rightframe">PhoneStateListener</A><br>
+<A HREF="android.os.PowerManager.html" class="hiddenlink" target="rightframe">PowerManager</A><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<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="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
+<A HREF="android.graphics.Rect.html" class="hiddenlink" target="rightframe">Rect</A><br>
+<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</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="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br>
+<A HREF="android.widget.ViewFlipper.html" class="hiddenlink" target="rightframe">ViewFlipper</A><br>
+<A HREF="android.view.ViewGroup.html" class="hiddenlink" target="rightframe">ViewGroup</A><br>
+<A NAME="W"></A>
+<br><font size="+2">W</font>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.app.WallpaperManager.html" class="hiddenlink" target="rightframe">WallpaperManager</A><br>
+<A HREF="android.webkit.WebChromeClient.html" class="hiddenlink" target="rightframe">WebChromeClient</A><br>
+<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br>
+<A HREF="android.webkit.WebStorage.html" class="hiddenlink" target="rightframe">WebStorage</A><br>
+<A HREF="android.webkit.WebView.html" class="hiddenlink" target="rightframe">WebView</A><br>
+<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/7/changes/classes_index_removals.html b/docs/html/sdk/api_diff/7/changes/classes_index_removals.html
new file mode 100644
index 0000000..e6da73f
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/classes_index_removals.html
@@ -0,0 +1,61 @@
+<!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>
+Class Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/constructors_index_additions.html b/docs/html/sdk/api_diff/7/changes/constructors_index_additions.html
new file mode 100644
index 0000000..1858441
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/constructors_index_additions.html
@@ -0,0 +1,67 @@
+<!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>
+Constructor Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="N"></A>
+<br><font size="+2">N</font>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.telephony.NeighboringCellInfo.html#android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)" class="hiddenlink" target="rightframe"><b>NeighboringCellInfo</b>
+(<code>int, String, int</code>)</A></nobr> constructor<br>
+<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/7/changes/constructors_index_all.html b/docs/html/sdk/api_diff/7/changes/constructors_index_all.html
new file mode 100644
index 0000000..4975970
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/constructors_index_all.html
@@ -0,0 +1,67 @@
+<!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>
+Constructor Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Constructors</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="N"></A>
+<br><font size="+2">N</font>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.telephony.NeighboringCellInfo.html#android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)" class="hiddenlink" target="rightframe"><b>NeighboringCellInfo</b>
+(<code>int, String, int</code>)</A></nobr> constructor<br>
+<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/7/changes/constructors_index_changes.html b/docs/html/sdk/api_diff/7/changes/constructors_index_changes.html
new file mode 100644
index 0000000..a5ca2ef
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/constructors_index_changes.html
@@ -0,0 +1,61 @@
+<!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>
+Constructor Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/constructors_index_removals.html b/docs/html/sdk/api_diff/7/changes/constructors_index_removals.html
new file mode 100644
index 0000000..74a09ba
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/constructors_index_removals.html
@@ -0,0 +1,61 @@
+<!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>
+Constructor Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/fields_index_additions.html b/docs/html/sdk/api_diff/7/changes/fields_index_additions.html
new file mode 100644
index 0000000..3148f4c
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/fields_index_additions.html
@@ -0,0 +1,159 @@
+<!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>
+Field Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER" class="hiddenlink" target="rightframe">ACTION_LIVE_WALLPAPER_CHOOSER</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.ACTION_LOCALE_CHANGED" class="hiddenlink" target="rightframe">ACTION_LOCALE_CHANGED</A>
+</nobr><br>
+<nobr><A HREF="android.R.attr.html#android.R.attr.author" class="hiddenlink" target="rightframe">author</A>
+</nobr><br>
+<nobr><A HREF="android.R.attr.html#android.R.attr.autoStart" class="hiddenlink" target="rightframe">autoStart</A>
+</nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.CAMCORDER" class="hiddenlink" target="rightframe">CAMCORDER</A>
+</nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_DROP" class="hiddenlink" target="rightframe">COMMAND_DROP</A>
+</nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_TAP" class="hiddenlink" target="rightframe">COMMAND_TAP</A>
+</nobr><br>
+<A NAME="E"></A>
+<br><font size="+2">E</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#V"><font size="-2">V</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.VERSION_CODES.html#android.os.Build.VERSION_CODES.ECLAIR_MR1" class="hiddenlink" target="rightframe">ECLAIR_MR1</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME_LIST</A>
+</nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#V"><font size="-2">V</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.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA" class="hiddenlink" target="rightframe">FEATURE_CAMERA</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS" class="hiddenlink" target="rightframe">FEATURE_CAMERA_AUTOFOCUS</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_FLASH" class="hiddenlink" target="rightframe">FEATURE_CAMERA_FLASH</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER" class="hiddenlink" target="rightframe">FEATURE_LIVE_WALLPAPER</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT" class="hiddenlink" target="rightframe">FEATURE_SENSOR_LIGHT</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY" class="hiddenlink" target="rightframe">FEATURE_SENSOR_PROXIMITY</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_CDMA</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_GSM</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH" class="hiddenlink" target="rightframe">FEATURE_TOUCHSCREEN_MULTITOUCH</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SOURCE_BOUNDS" class="hiddenlink" target="rightframe">FILL_IN_SOURCE_BOUNDS</A>
+</nobr><br>
+<A NAME="L"></A>
+<br><font size="+2">L</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTHS</A>
+</nobr><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION" class="hiddenlink" target="rightframe">VOICE_RECOGNITION</A>
+</nobr><br>
+<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/7/changes/fields_index_all.html b/docs/html/sdk/api_diff/7/changes/fields_index_all.html
new file mode 100644
index 0000000..c782afc
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/fields_index_all.html
@@ -0,0 +1,181 @@
+<!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>
+Field Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Fields</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER" class="hiddenlink" target="rightframe">ACTION_LIVE_WALLPAPER_CHOOSER</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.ACTION_LOCALE_CHANGED" class="hiddenlink" target="rightframe">ACTION_LOCALE_CHANGED</A>
+</nobr><br>
+<nobr><A HREF="android.R.attr.html#android.R.attr.author" class="hiddenlink" target="rightframe">author</A>
+</nobr><br>
+<nobr><A HREF="android.R.attr.html#android.R.attr.autoStart" class="hiddenlink" target="rightframe">autoStart</A>
+</nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.CAMCORDER" class="hiddenlink" target="rightframe">CAMCORDER</A>
+</nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_DROP" class="hiddenlink" target="rightframe">COMMAND_DROP</A>
+</nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.COMMAND_TAP" class="hiddenlink" target="rightframe">COMMAND_TAP</A>
+</nobr><br>
+<A NAME="E"></A>
+<br><font size="+2">E</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</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.VERSION_CODES.html#android.os.Build.VERSION_CODES.ECLAIR_MR1" class="hiddenlink" target="rightframe">ECLAIR_MR1</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME_LIST</A>
+</nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</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.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA" class="hiddenlink" target="rightframe">FEATURE_CAMERA</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS" class="hiddenlink" target="rightframe">FEATURE_CAMERA_AUTOFOCUS</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_CAMERA_FLASH" class="hiddenlink" target="rightframe">FEATURE_CAMERA_FLASH</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER" class="hiddenlink" target="rightframe">FEATURE_LIVE_WALLPAPER</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT" class="hiddenlink" target="rightframe">FEATURE_SENSOR_LIGHT</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY" class="hiddenlink" target="rightframe">FEATURE_SENSOR_PROXIMITY</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_CDMA</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM" class="hiddenlink" target="rightframe">FEATURE_TELEPHONY_GSM</A>
+</nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH" class="hiddenlink" target="rightframe">FEATURE_TOUCHSCREEN_MULTITOUCH</A>
+</nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SOURCE_BOUNDS" class="hiddenlink" target="rightframe">FILL_IN_SOURCE_BOUNDS</A>
+</nobr><br>
+<A NAME="L"></A>
+<br><font size="+2">L</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTH</A>
+</nobr><br>
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTHS</A>
+</nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#V"><font size="-2">V</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.SET_PREFERRED_APPLICATIONS" class="hiddenlink" target="rightframe">SET_PREFERRED_APPLICATIONS</A>
+</nobr><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.media.MediaRecorder.AudioSource.html#android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION" class="hiddenlink" target="rightframe">VOICE_RECOGNITION</A>
+</nobr><br>
+<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/7/changes/fields_index_changes.html b/docs/html/sdk/api_diff/7/changes/fields_index_changes.html
new file mode 100644
index 0000000..88f77de
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/fields_index_changes.html
@@ -0,0 +1,85 @@
+<!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>
+Field Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="E"></A>
+<br><font size="+2">E</font>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#S"><font size="-2">S</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.EXTRA_CHANGED_COMPONENT_NAME" class="hiddenlink" target="rightframe">EXTRA_CHANGED_COMPONENT_NAME</A>
+</nobr><br>
+<A NAME="L"></A>
+<br><font size="+2">L</font>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH" class="hiddenlink" target="rightframe">LISTEN_SIGNAL_STRENGTH</A>
+</nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#L"><font size="-2">L</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.SET_PREFERRED_APPLICATIONS" class="hiddenlink" target="rightframe">SET_PREFERRED_APPLICATIONS</A>
+</nobr><br>
+<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/7/changes/fields_index_removals.html b/docs/html/sdk/api_diff/7/changes/fields_index_removals.html
new file mode 100644
index 0000000..9f62d88
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/fields_index_removals.html
@@ -0,0 +1,61 @@
+<!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>
+Field Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/jdiff_help.html b/docs/html/sdk/api_diff/7/changes/jdiff_help.html
new file mode 100644
index 0000000..6cc80dc
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/jdiff_help.html
@@ -0,0 +1,134 @@
+<!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>
+JDiff Help
+</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 -->
+<TABLE summary="Navigation bar" BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<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>7</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>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="jdiff_statistics.html"><FONT CLASS="NavBarFont1"><B>Statistics</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+ </TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Generated by<br><a href="http://www.jdiff.org" class="staysblack" target="_top">JDiff</a></b></EM></TD>
+</TR>
+<TR>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2"></FONT>
+</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../changes.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="jdiff_help.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<HR>
+<!-- End of nav bar -->
+<center>
+<H1>JDiff Documentation</H1>
+</center>
+<BLOCKQUOTE>
+JDiff is a <a href="http://java.sun.com/j2se/javadoc/" target="_top">Javadoc</a> doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does.
+This help page describes the different parts of the output from JDiff.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+ See the reference page in the <a href="http://www.jdiff.org">source for JDiff</a> for information about how to generate a report like this one.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+The indexes shown in the top-left frame help show each type of change in more detail. The index "All Differences" contains all the differences between the APIs, in alphabetical order.
+These indexes all use the same format:
+<ul>
+<li>Removed packages, classes, constructors, methods and fields are <strike>struck through</strike>.</li>
+<li>Added packages, classes, constructors, methods and fields appear in <b>bold</b>.</li>
+<li>Changed packages, classes, constructors, methods and fields appear in normal text.</li>
+</ul>
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background.
+Links which take you to a Javadoc page are always in a <code>typewriter</code> font.
+Just like Javadoc, all interface names are in <i>italic</i>, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3><b><code>Javadoc</code></b></H3>
+This is a link to the <a href="../../../../reference/index.html" target="_top">top-level</a> Javadoc page for the new version of the product.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Overview</H3>
+The <a href="changes-summary.html">overview</a> is the top-level summary of what was removed, added and changed between versions.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Package</H3>
+This is a link to the package containing the current changed class or interface.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Class</H3>
+This is highlighted when you are looking at the changed class or interface.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Text Changes</H3>
+This is a link to the top-level index of all documentation changes for the current package or class.
+If it is not present, then there are no documentation changes for the current package or class.
+This link can be removed entirely by not using the <code>-docchanges</code> option.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Statistics</H3>
+This is a link to a page which shows statistics about the changes between the two APIs.
+This link can be removed entirely by not using the <code>-stats</code> option.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Help</H3>
+A link to this Help page for JDiff.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Prev/Next</H3>
+These links take you to the previous and next changed package or class.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H2>Complex Changes</H2>
+There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass.
+In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes.
+</BLOCKQUOTE>
+<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/7/changes/jdiff_statistics.html b/docs/html/sdk/api_diff/7/changes/jdiff_statistics.html
new file mode 100644
index 0000000..ba81aec
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/jdiff_statistics.html
@@ -0,0 +1,342 @@
+<!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>
+API Change Statistics
+</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 class="gc-documentation">
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;xborder-bottom:none;">
+<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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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="../changes.html" target="_top">Top of Report</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<h1>API Change Statistics</h1>
+<p>The overall difference between API Levels 6 and 7 is approximately <span style="color:222;font-weight:bold;">0.48%</span>.
+</p>
+<br>
+<a name="numbers"></a>
+<h2>Total of Differences, by Number and Type</h2>
+<p>
+The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements — that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class.
+</p>
+<TABLE summary="Number of differences" WIDTH="100%">
+<TR>
+ <th>Type</th>
+ <TH ALIGN="center"><b>Additions</b></TH>
+ <TH ALIGN="center"><b>Changes</b></TH>
+ <TH ALIGN="center">Removals</TH>
+ <TH ALIGN="center"><b>Total</b></TH>
+</TR>
+<TR>
+ <TD>Packages</TD>
+ <TD ALIGN="right">1</TD>
+ <TD ALIGN="right">11</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">12</TD>
+</TR>
+<TR>
+ <TD>Classes and <i>Interfaces</i></TD>
+ <TD ALIGN="right">5</TD>
+ <TD ALIGN="right">21</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">26</TD>
+</TR>
+<TR>
+ <TD>Constructors</TD>
+ <TD ALIGN="right">1</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">1</TD>
+</TR>
+<TR>
+ <TD>Methods</TD>
+ <TD ALIGN="right">52</TD>
+ <TD ALIGN="right">2</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">54</TD>
+</TR>
+<TR>
+ <TD>Fields</TD>
+ <TD ALIGN="right">22</TD>
+ <TD ALIGN="right">3</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">25</TD>
+</TR>
+<TR>
+ <TD style="background-color:#FAFAFA"><b>Total</b></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>81</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>37</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>0</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>118</strong></TD>
+</TR>
+</TABLE>
+<br>
+<a name="packages"></a>
+<h2>Changed Packages, Sorted by Percentage Difference</h2>
+<TABLE summary="Packages sorted by percentage difference" WIDTH="100%">
+<TR>
+ <TH WIDTH="10%">Percentage Difference*</TH>
+ <TH>Package</TH>
+</TR>
+<TR>
+ <TD ALIGN="center">8</TD>
+ <TD><A HREF="pkg_android.webkit.html">android.webkit</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="pkg_android.telephony.html">android.telephony</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="pkg_android.app.html">android.app</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="pkg_android.media.html">android.media</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="pkg_android.content.pm.html">android.content.pm</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="pkg_android.os.html">android.os</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.graphics.html">android.graphics</A></TD>
+</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.content.html">android.content</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="pkg_android.view.html">android.view</A></TD>
+</TR>
+</TABLE>
+<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p>
+<br>
+<a name="classes"></a>
+<h2>Changed Classes and <i>Interfaces</i>, Sorted by Percentage Difference</h2>
+<TABLE summary="Classes sorted by percentage difference" WIDTH="100%">
+<TR WIDTH="20%">
+ <TH WIDTH="10%">Percentage<br>Difference*</TH>
+ <TH><b>Class or <i>Interface</i></b></TH>
+</TR>
+<TR>
+ <TD ALIGN="center">77</TD>
+ <TD><A HREF="android.webkit.WebStorage.html">
+android.webkit.WebStorage</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">75</TD>
+ <TD><A HREF="android.webkit.GeolocationPermissions.html">
+android.webkit.GeolocationPermissions</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">24</TD>
+ <TD><A HREF="android.webkit.WebChromeClient.html">
+android.webkit.WebChromeClient</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">17</TD>
+ <TD><A HREF="android.app.WallpaperManager.html">
+android.app.WallpaperManager</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">16</TD>
+ <TD><A HREF="android.media.MediaRecorder.AudioSource.html">
+android.media.MediaRecorder.AudioSource</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">14</TD>
+ <TD><A HREF="android.widget.ViewFlipper.html">
+android.widget.ViewFlipper</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">10</TD>
+ <TD><A HREF="android.telephony.PhoneStateListener.html">
+android.telephony.PhoneStateListener</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">6</TD>
+ <TD><A HREF="android.webkit.CacheManager.CacheResult.html">
+android.webkit.CacheManager.CacheResult</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">6</TD>
+ <TD><A HREF="android.content.pm.PackageManager.html">
+android.content.pm.PackageManager</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.os.Build.VERSION_CODES.html">
+android.os.Build.VERSION_CODES</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.webkit.WebSettings.html">
+android.webkit.WebSettings</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.os.PowerManager.html">
+android.os.PowerManager</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">3</TD>
+ <TD><A HREF="android.telephony.NeighboringCellInfo.html">
+android.telephony.NeighboringCellInfo</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">3</TD>
+ <TD><A HREF="android.widget.RemoteViews.html">
+android.widget.RemoteViews</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">2</TD>
+ <TD><A HREF="android.graphics.Rect.html">
+android.graphics.Rect</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="android.content.Intent.html">
+android.content.Intent</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="android.view.ViewGroup.html">
+android.view.ViewGroup</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="android.webkit.WebView.html">
+android.webkit.WebView</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="android.Manifest.permission.html">
+android.Manifest.permission</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="android.view.View.html">
+android.view.View</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
+ <TD><A HREF="android.R.attr.html">
+android.R.attr</A></TD>
+</TR>
+</TABLE>
+<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p>
+<br>
+<h2 id="calculation">Calculation of Change Percentages</h2>
+<p>
+The percent change statistic reported for all elements in the "to" API Level specification is defined recursively as follows:</p>
+<pre>
+Percentage difference = 100 * (added + removed + 2*changed)
+ -----------------------------------
+ sum of public elements in BOTH APIs
+</pre>
+<p>where <code>added</code> is the number of packages added, <code>removed</code> is the number of packages removed, and <code>changed</code> is the number of packages changed.
+This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed.
+The definition ensures that if all packages are removed and all new packages are
+added, the change will be 100%.</p>
+ </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/7/changes/jdiff_topleftframe.html b/docs/html/sdk/api_diff/7/changes/jdiff_topleftframe.html
new file mode 100644
index 0000000..36f9836
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/jdiff_topleftframe.html
@@ -0,0 +1,63 @@
+<!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 API Version Differences
+</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 class="gc-documentation" style="padding:12px;">
+<table class="jdiffIndex" summary="Links to diff index files" BORDER="0" WIDTH="100%" cellspacing="0" cellpadding="0" style="margin:0">
+<TR>
+ <th class="indexHeader" nowrap>
+ Select a Diffs Index:</th>
+</TR>
+<TR>
+ <TD><FONT CLASS="indexText" size="-2"><A HREF="alldiffs_index_all.html" TARGET="bottomleftframe">All Differences</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="packages_index_all.html" TARGET="bottomleftframe">By Package</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="classes_index_all.html" TARGET="bottomleftframe">By Class</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="constructors_index_all.html" TARGET="bottomleftframe">By Constructor</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="methods_index_all.html" TARGET="bottomleftframe">By Method</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="fields_index_all.html" TARGET="bottomleftframe">By Field</A></FONT><br></TD>
+</TR>
+</TABLE>
+<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/7/changes/methods_index_additions.html b/docs/html/sdk/api_diff/7/changes/methods_index_additions.html
new file mode 100644
index 0000000..1623337
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/methods_index_additions.html
@@ -0,0 +1,301 @@
+<!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>
+Method Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)" class="hiddenlink" target="rightframe"><b>addView</b>
+(<code>int, RemoteViews</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.allow_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>allow</b>
+(<code>String</code>)</A></nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clear_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>clear</b>
+(<code>String</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clearAll_added()" class="hiddenlink" target="rightframe"><b>clearAll</b>
+()</A></nobr><br>
+<A NAME="D"></A>
+<br><font size="+2">D</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteAllData_added()" class="hiddenlink" target="rightframe"><b>deleteAllData</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteOrigin_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>deleteOrigin</b>
+(<code>String</code>)</A></nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>
+<a href="#A"><font size="-2">A</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</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.Rect.html#android.graphics.Rect.flattenToString_added()" class="hiddenlink" target="rightframe"><b>flattenToString</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebView.html#android.webkit.WebView.freeMemory_added()" class="hiddenlink" target="rightframe"><b>freeMemory</b>
+()</A></nobr><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)" class="hiddenlink" target="rightframe"><b>getAllowed</b>
+(<code>String, ValueCallback<Boolean></code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getContentDisposition_added()" class="hiddenlink" target="rightframe"><b>getContentDisposition</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getDefaultVideoPoster_added()" class="hiddenlink" target="rightframe"><b>getDefaultVideoPoster</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDefaultZoom_added()" class="hiddenlink" target="rightframe"><b>getDefaultZoom</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDomStorageEnabled_added()" class="hiddenlink" target="rightframe"><b>getDomStorageEnabled</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getExpiresString_added()" class="hiddenlink" target="rightframe"><b>getExpiresString</b>
+()</A></nobr><br>
+<i>getInstance</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.WebStorage
+</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLoadWithOverviewMode_added()" class="hiddenlink" target="rightframe"><b>getLoadWithOverviewMode</b>
+()</A></nobr><br>
+<i>getOrigins</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Set<String>></code>)</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Map></code>)</b> in android.webkit.WebStorage
+</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getQuotaForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSourceBounds_added()" class="hiddenlink" target="rightframe"><b>getSourceBounds</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getUsageForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVideoLoadingProgressView_added()" class="hiddenlink" target="rightframe"><b>getVideoLoadingProgressView</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)" class="hiddenlink" target="rightframe"><b>getVisitedHistory</b>
+(<code>ValueCallback<String[]></code>)</A></nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.getWallpaperInfo_added()" class="hiddenlink" target="rightframe"><b>getWallpaperInfo</b>
+()</A></nobr><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.isAutoStart_added()" class="hiddenlink" target="rightframe"><b>isAutoStart</b>
+()</A></nobr><br>
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()" class="hiddenlink" target="rightframe"><b>isChildrenDrawingOrderEnabled</b>
+()</A></nobr><br>
+<nobr><A HREF="android.view.View.html#android.view.View.isOpaque_added()" class="hiddenlink" target="rightframe"><b>isOpaque</b>
+()</A></nobr><br>
+<nobr><A HREF="android.os.PowerManager.html#android.os.PowerManager.isScreenOn_added()" class="hiddenlink" target="rightframe"><b>isScreenOn</b>
+()</A></nobr><br>
+<A NAME="O"></A>
+<br><font size="+2">O</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)" class="hiddenlink" target="rightframe"><b>onConsoleMessage</b>
+(<code>String, int, String</code>)</A></nobr><br>
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)" class="hiddenlink" target="rightframe"><b>onDataConnectionStateChanged</b>
+(<code>int, int</code>)</A></nobr><br>
+<nobr><A HREF="android.view.View.html#android.view.View.onDrawScrollBars_added(android.graphics.Canvas)" class="hiddenlink" target="rightframe"><b>onDrawScrollBars</b>
+(<code>Canvas</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onHideCustomView_added()" class="hiddenlink" target="rightframe"><b>onHideCustomView</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onJsTimeout_added()" class="hiddenlink" target="rightframe"><b>onJsTimeout</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)" class="hiddenlink" target="rightframe"><b>onReachedMaxAppCacheSize</b>
+(<code>long, long, QuotaUpdater</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)" class="hiddenlink" target="rightframe"><b>onReceivedTouchIconUrl</b>
+(<code>WebView, String, boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)" class="hiddenlink" target="rightframe"><b>onShowCustomView</b>
+(<code>View, CustomViewCallback</code>)</A></nobr><br>
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)" class="hiddenlink" target="rightframe"><b>onSignalStrengthsChanged</b>
+(<code>SignalStrength</code>)</A></nobr><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.removeAllViews_added(int)" class="hiddenlink" target="rightframe"><b>removeAllViews</b>
+(<code>int</code>)</A></nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>sendWallpaperCommand</b>
+(<code>IBinder, String, int, int, int, Bundle</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setAppCacheEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheMaxSize_added(long)" class="hiddenlink" target="rightframe"><b>setAppCacheMaxSize</b>
+(<code>long</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCachePath_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>setAppCachePath</b>
+(<code>String</code>)</A></nobr><br>
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.setAutoStart_added(boolean)" class="hiddenlink" target="rightframe"><b>setAutoStart</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setChildrenDrawingOrderEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)" class="hiddenlink" target="rightframe"><b>setDefaultZoom</b>
+(<code>ZoomDensity</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDomStorageEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setDomStorageEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)" class="hiddenlink" target="rightframe"><b>setLoadWithOverviewMode</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)" class="hiddenlink" target="rightframe"><b>setQuotaForOrigin</b>
+(<code>String, long</code>)</A></nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSourceBounds_added(android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>setSourceBounds</b>
+(<code>Rect</code>)</A></nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)" class="hiddenlink" target="rightframe"><b>setWallpaperOffsetSteps</b>
+(<code>float, float</code>)</A></nobr><br>
+<A NAME="U"></A>
+<br><font size="+2">U</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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.Rect.html#android.graphics.Rect.unflattenFromString_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>unflattenFromString</b>
+(<code>String</code>)</A></nobr><br>
+<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/7/changes/methods_index_all.html b/docs/html/sdk/api_diff/7/changes/methods_index_all.html
new file mode 100644
index 0000000..7258ab1
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/methods_index_all.html
@@ -0,0 +1,305 @@
+<!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>
+Method Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Methods</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</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.pm.PackageManager.html#android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">addPackageToPreferred
+(<code>String</code>)</A></nobr><br>
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)" class="hiddenlink" target="rightframe"><b>addView</b>
+(<code>int, RemoteViews</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.allow_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>allow</b>
+(<code>String</code>)</A></nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clear_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>clear</b>
+(<code>String</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.clearAll_added()" class="hiddenlink" target="rightframe"><b>clearAll</b>
+()</A></nobr><br>
+<A NAME="D"></A>
+<br><font size="+2">D</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteAllData_added()" class="hiddenlink" target="rightframe"><b>deleteAllData</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.deleteOrigin_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>deleteOrigin</b>
+(<code>String</code>)</A></nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>
+<a href="#A"><font size="-2">A</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</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.Rect.html#android.graphics.Rect.flattenToString_added()" class="hiddenlink" target="rightframe"><b>flattenToString</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebView.html#android.webkit.WebView.freeMemory_added()" class="hiddenlink" target="rightframe"><b>freeMemory</b>
+()</A></nobr><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)" class="hiddenlink" target="rightframe"><b>getAllowed</b>
+(<code>String, ValueCallback<Boolean></code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getContentDisposition_added()" class="hiddenlink" target="rightframe"><b>getContentDisposition</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getDefaultVideoPoster_added()" class="hiddenlink" target="rightframe"><b>getDefaultVideoPoster</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDefaultZoom_added()" class="hiddenlink" target="rightframe"><b>getDefaultZoom</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getDomStorageEnabled_added()" class="hiddenlink" target="rightframe"><b>getDomStorageEnabled</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.CacheManager.CacheResult.html#android.webkit.CacheManager.CacheResult.getExpiresString_added()" class="hiddenlink" target="rightframe"><b>getExpiresString</b>
+()</A></nobr><br>
+<i>getInstance</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getInstance_added()" class="hiddenlink" target="rightframe">type <b>
+()</b> in android.webkit.WebStorage
+</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLoadWithOverviewMode_added()" class="hiddenlink" target="rightframe"><b>getLoadWithOverviewMode</b>
+()</A></nobr><br>
+<i>getOrigins</i><br>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html#android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Set<String>></code>)</b> in android.webkit.GeolocationPermissions
+</A></nobr><br>
+ <nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)" class="hiddenlink" target="rightframe">type <b>
+(<code>ValueCallback<Map></code>)</b> in android.webkit.WebStorage
+</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getQuotaForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSourceBounds_added()" class="hiddenlink" target="rightframe"><b>getSourceBounds</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)" class="hiddenlink" target="rightframe"><b>getUsageForOrigin</b>
+(<code>String, ValueCallback<Long></code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVideoLoadingProgressView_added()" class="hiddenlink" target="rightframe"><b>getVideoLoadingProgressView</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)" class="hiddenlink" target="rightframe"><b>getVisitedHistory</b>
+(<code>ValueCallback<String[]></code>)</A></nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.getWallpaperInfo_added()" class="hiddenlink" target="rightframe"><b>getWallpaperInfo</b>
+()</A></nobr><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.isAutoStart_added()" class="hiddenlink" target="rightframe"><b>isAutoStart</b>
+()</A></nobr><br>
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()" class="hiddenlink" target="rightframe"><b>isChildrenDrawingOrderEnabled</b>
+()</A></nobr><br>
+<nobr><A HREF="android.view.View.html#android.view.View.isOpaque_added()" class="hiddenlink" target="rightframe"><b>isOpaque</b>
+()</A></nobr><br>
+<nobr><A HREF="android.os.PowerManager.html#android.os.PowerManager.isScreenOn_added()" class="hiddenlink" target="rightframe"><b>isScreenOn</b>
+()</A></nobr><br>
+<A NAME="O"></A>
+<br><font size="+2">O</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)" class="hiddenlink" target="rightframe"><b>onConsoleMessage</b>
+(<code>String, int, String</code>)</A></nobr><br>
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)" class="hiddenlink" target="rightframe"><b>onDataConnectionStateChanged</b>
+(<code>int, int</code>)</A></nobr><br>
+<nobr><A HREF="android.view.View.html#android.view.View.onDrawScrollBars_added(android.graphics.Canvas)" class="hiddenlink" target="rightframe"><b>onDrawScrollBars</b>
+(<code>Canvas</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onHideCustomView_added()" class="hiddenlink" target="rightframe"><b>onHideCustomView</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onJsTimeout_added()" class="hiddenlink" target="rightframe"><b>onJsTimeout</b>
+()</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)" class="hiddenlink" target="rightframe"><b>onReachedMaxAppCacheSize</b>
+(<code>long, long, QuotaUpdater</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)" class="hiddenlink" target="rightframe"><b>onReceivedTouchIconUrl</b>
+(<code>WebView, String, boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebChromeClient.html#android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)" class="hiddenlink" target="rightframe"><b>onShowCustomView</b>
+(<code>View, CustomViewCallback</code>)</A></nobr><br>
+<nobr><A HREF="android.telephony.PhoneStateListener.html#android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)" class="hiddenlink" target="rightframe"><b>onSignalStrengthsChanged</b>
+(<code>SignalStrength</code>)</A></nobr><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.removeAllViews_added(int)" class="hiddenlink" target="rightframe"><b>removeAllViews</b>
+(<code>int</code>)</A></nobr><br>
+<nobr><A HREF="android.content.pm.PackageManager.html#android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">removePackageFromPreferred
+(<code>String</code>)</A></nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#U"><font size="-2">U</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>sendWallpaperCommand</b>
+(<code>IBinder, String, int, int, int, Bundle</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setAppCacheEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCacheMaxSize_added(long)" class="hiddenlink" target="rightframe"><b>setAppCacheMaxSize</b>
+(<code>long</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setAppCachePath_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>setAppCachePath</b>
+(<code>String</code>)</A></nobr><br>
+<nobr><A HREF="android.widget.ViewFlipper.html#android.widget.ViewFlipper.setAutoStart_added(boolean)" class="hiddenlink" target="rightframe"><b>setAutoStart</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.view.ViewGroup.html#android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setChildrenDrawingOrderEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)" class="hiddenlink" target="rightframe"><b>setDefaultZoom</b>
+(<code>ZoomDensity</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setDomStorageEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setDomStorageEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)" class="hiddenlink" target="rightframe"><b>setLoadWithOverviewMode</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.webkit.WebStorage.html#android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)" class="hiddenlink" target="rightframe"><b>setQuotaForOrigin</b>
+(<code>String, long</code>)</A></nobr><br>
+<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSourceBounds_added(android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>setSourceBounds</b>
+(<code>Rect</code>)</A></nobr><br>
+<nobr><A HREF="android.app.WallpaperManager.html#android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)" class="hiddenlink" target="rightframe"><b>setWallpaperOffsetSteps</b>
+(<code>float, float</code>)</A></nobr><br>
+<A NAME="U"></A>
+<br><font size="+2">U</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</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="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</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.Rect.html#android.graphics.Rect.unflattenFromString_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>unflattenFromString</b>
+(<code>String</code>)</A></nobr><br>
+<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/7/changes/methods_index_changes.html b/docs/html/sdk/api_diff/7/changes/methods_index_changes.html
new file mode 100644
index 0000000..35867b1
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/methods_index_changes.html
@@ -0,0 +1,75 @@
+<!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>
+Method Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>
+<a href="#R"><font size="-2">R</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.pm.PackageManager.html#android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">addPackageToPreferred
+(<code>String</code>)</A></nobr><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>
+<a href="#A"><font size="-2">A</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.pm.PackageManager.html#android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)" class="hiddenlink" target="rightframe">removePackageFromPreferred
+(<code>String</code>)</A></nobr><br>
+<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/7/changes/methods_index_removals.html b/docs/html/sdk/api_diff/7/changes/methods_index_removals.html
new file mode 100644
index 0000000..b5aea4f
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/methods_index_removals.html
@@ -0,0 +1,61 @@
+<!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>
+Method Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<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/7/changes/packages_index_additions.html b/docs/html/sdk/api_diff/7/changes/packages_index_additions.html
new file mode 100644
index 0000000..d6ad068
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/packages_index_additions.html
@@ -0,0 +1,65 @@
+<!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>
+Package Additions Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="changes-summary.html#android.service.wallpaper" class="hiddenlink" target="rightframe"><b>android.service.wallpaper</b></A><br>
+<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/7/changes/packages_index_all.html b/docs/html/sdk/api_diff/7/changes/packages_index_all.html
new file mode 100644
index 0000000..5ab8b40
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/packages_index_all.html
@@ -0,0 +1,76 @@
+<!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>
+Package Differences Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Packages</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br>
+<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br>
+<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br>
+<A HREF="pkg_android.content.pm.html" class="hiddenlink" target="rightframe">android.content.pm</A><br>
+<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br>
+<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br>
+<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br>
+<A HREF="changes-summary.html#android.service.wallpaper" class="hiddenlink" target="rightframe"><b>android.service.wallpaper</b></A><br>
+<A HREF="pkg_android.telephony.html" class="hiddenlink" target="rightframe">android.telephony</A><br>
+<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br>
+<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br>
+<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br>
+<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/7/changes/packages_index_changes.html b/docs/html/sdk/api_diff/7/changes/packages_index_changes.html
new file mode 100644
index 0000000..2331bb2
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/packages_index_changes.html
@@ -0,0 +1,75 @@
+<!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>
+Package Changes Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br>
+<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br>
+<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br>
+<A HREF="pkg_android.content.pm.html" class="hiddenlink" target="rightframe">android.content.pm</A><br>
+<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br>
+<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br>
+<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br>
+<A HREF="pkg_android.telephony.html" class="hiddenlink" target="rightframe">android.telephony</A><br>
+<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br>
+<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br>
+<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br>
+<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/7/changes/packages_index_removals.html b/docs/html/sdk/api_diff/7/changes/packages_index_removals.html
new file mode 100644
index 0000000..d0ffabc
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/packages_index_removals.html
@@ -0,0 +1,63 @@
+<!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>
+Package Removals Index
+</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 class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<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/7/changes/pkg_android.app.html b/docs/html/sdk/api_diff/7/changes/pkg_android.app.html
new file mode 100644
index 0000000..f05a62f
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.app.html
@@ -0,0 +1,134 @@
+<!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.app
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/app/package-summary.html" target="_top"><font size="+1"><code>android.app</code></font></A>
+</H2>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WallpaperInfo"></A>
+ <nobr><A HREF="../../../../reference/android/app/WallpaperInfo.html" target="_top"><code>WallpaperInfo</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WallpaperManager"></A>
+ <nobr><A HREF="android.app.WallpaperManager.html">WallpaperManager</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/7/changes/pkg_android.content.html b/docs/html/sdk/api_diff/7/changes/pkg_android.content.html
new file mode 100644
index 0000000..4920ce3
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.content.html
@@ -0,0 +1,119 @@
+<!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.content
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/content/package-summary.html" target="_top"><font size="+1"><code>android.content</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="Intent"></A>
+ <nobr><A HREF="android.content.Intent.html">Intent</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/7/changes/pkg_android.content.pm.html b/docs/html/sdk/api_diff/7/changes/pkg_android.content.pm.html
new file mode 100644
index 0000000..c5c3b2e
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.content.pm.html
@@ -0,0 +1,119 @@
+<!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.content.pm
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/content/pm/package-summary.html" target="_top"><font size="+1"><code>android.content.pm</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PackageManager"></A>
+ <nobr><A HREF="android.content.pm.PackageManager.html">PackageManager</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/7/changes/pkg_android.graphics.html b/docs/html/sdk/api_diff/7/changes/pkg_android.graphics.html
new file mode 100644
index 0000000..732481f
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.graphics.html
@@ -0,0 +1,119 @@
+<!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.graphics
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/graphics/package-summary.html" target="_top"><font size="+1"><code>android.graphics</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="Rect"></A>
+ <nobr><A HREF="android.graphics.Rect.html">Rect</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/7/changes/pkg_android.html b/docs/html/sdk/api_diff/7/changes/pkg_android.html
new file mode 100644
index 0000000..fa07ac1
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.html
@@ -0,0 +1,126 @@
+<!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
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/package-summary.html" target="_top"><font size="+1"><code>android</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="Manifest.permission"></A>
+ <nobr><A HREF="android.Manifest.permission.html">Manifest.permission</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>
+ <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/7/changes/pkg_android.media.html b/docs/html/sdk/api_diff/7/changes/pkg_android.media.html
new file mode 100644
index 0000000..d5cd679
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.media.html
@@ -0,0 +1,119 @@
+<!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.media
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/media/package-summary.html" target="_top"><font size="+1"><code>android.media</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="MediaRecorder.AudioSource"></A>
+ <nobr><A HREF="android.media.MediaRecorder.AudioSource.html">MediaRecorder.AudioSource</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/7/changes/pkg_android.os.html b/docs/html/sdk/api_diff/7/changes/pkg_android.os.html
new file mode 100644
index 0000000..bfaa1eb
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.os.html
@@ -0,0 +1,126 @@
+<!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.os
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/os/package-summary.html" target="_top"><font size="+1"><code>android.os</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="Build.VERSION_CODES"></A>
+ <nobr><A HREF="android.os.Build.VERSION_CODES.html">Build.VERSION_CODES</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PowerManager"></A>
+ <nobr><A HREF="android.os.PowerManager.html">PowerManager</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/7/changes/pkg_android.telephony.html b/docs/html/sdk/api_diff/7/changes/pkg_android.telephony.html
new file mode 100644
index 0000000..adc1ceb
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.telephony.html
@@ -0,0 +1,141 @@
+<!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.telephony
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/telephony/package-summary.html" target="_top"><font size="+1"><code>android.telephony</code></font></A>
+</H2>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="SignalStrength"></A>
+ <nobr><A HREF="../../../../reference/android/telephony/SignalStrength.html" target="_top"><code>SignalStrength</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="NeighboringCellInfo"></A>
+ <nobr><A HREF="android.telephony.NeighboringCellInfo.html">NeighboringCellInfo</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PhoneStateListener"></A>
+ <nobr><A HREF="android.telephony.PhoneStateListener.html">PhoneStateListener</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/7/changes/pkg_android.view.html b/docs/html/sdk/api_diff/7/changes/pkg_android.view.html
new file mode 100644
index 0000000..40a8f57
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.view.html
@@ -0,0 +1,126 @@
+<!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.view
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/view/package-summary.html" target="_top"><font size="+1"><code>android.view</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="View"></A>
+ <nobr><A HREF="android.view.View.html">View</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewGroup"></A>
+ <nobr><A HREF="android.view.ViewGroup.html">ViewGroup</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/7/changes/pkg_android.webkit.html b/docs/html/sdk/api_diff/7/changes/pkg_android.webkit.html
new file mode 100644
index 0000000..8c37e6f
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.webkit.html
@@ -0,0 +1,183 @@
+<!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.webkit
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/webkit/package-summary.html" target="_top"><font size="+1"><code>android.webkit</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="ValueCallback"></A>
+ <nobr><A HREF="../../../../reference/android/webkit/ValueCallback.html" target="_top"><code><I>ValueCallback</I></code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebChromeClient.CustomViewCallback"></A>
+ <nobr><A HREF="../../../../reference/android/webkit/WebChromeClient.CustomViewCallback.html" target="_top"><code><I>WebChromeClient.CustomViewCallback</I></code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebSettings.ZoomDensity"></A>
+ <nobr><A HREF="../../../../reference/android/webkit/WebSettings.ZoomDensity.html" target="_top"><code>WebSettings.ZoomDensity</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="CacheManager.CacheResult"></A>
+ <nobr><A HREF="android.webkit.CacheManager.CacheResult.html">CacheManager.CacheResult</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="GeolocationPermissions"></A>
+ <nobr><A HREF="android.webkit.GeolocationPermissions.html">GeolocationPermissions</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebChromeClient"></A>
+ <nobr><A HREF="android.webkit.WebChromeClient.html">WebChromeClient</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebSettings"></A>
+ <nobr><A HREF="android.webkit.WebSettings.html">WebSettings</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebStorage"></A>
+ <nobr><A HREF="android.webkit.WebStorage.html">WebStorage</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="WebView"></A>
+ <nobr><A HREF="android.webkit.WebView.html">WebView</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/7/changes/pkg_android.widget.html b/docs/html/sdk/api_diff/7/changes/pkg_android.widget.html
new file mode 100644
index 0000000..e404840
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/changes/pkg_android.widget.html
@@ -0,0 +1,126 @@
+<!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.widget
+</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">7</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">6</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2009.12.18 22:29</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>
+Package <A HREF="../../../../reference/android/widget/package-summary.html" target="_top"><font size="+1"><code>android.widget</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="RemoteViews"></A>
+ <nobr><A HREF="android.widget.RemoteViews.html">RemoteViews</A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewFlipper"></A>
+ <nobr><A HREF="android.widget.ViewFlipper.html">ViewFlipper</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/7/missingSinces.txt b/docs/html/sdk/api_diff/7/missingSinces.txt
new file mode 100644
index 0000000..b95fb6b
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/missingSinces.txt
@@ -0,0 +1,80 @@
+NO DOC BLOCK: android.telephony.SignalStrength Class
+NO DOC BLOCK: android.webkit.ValueCallback Interface
+NO DOC BLOCK: android.app.WallpaperInfo Class
+NO DOC BLOCK: android.webkit.WebChromeClient.CustomViewCallback Interface
+NO DOC BLOCK: android.webkit.WebSettings.ZoomDensity Class
+NO DOC BLOCK: android.telephony.NeighboringCellInfo Constructor (int, java.lang.String, int)
+NO DOC BLOCK: android.widget.RemoteViews Method addView(int, android.widget.RemoteViews)
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method allow(java.lang.String)
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method clear(java.lang.String)
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method clearAll()
+NO DOC BLOCK: android.webkit.WebStorage Method deleteAllData()
+NO DOC BLOCK: android.webkit.WebStorage Method deleteOrigin(java.lang.String)
+NO DOC BLOCK: android.graphics.Rect Method flattenToString()
+NO DOC BLOCK: android.webkit.WebView Method freeMemory()
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method getAllowed(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)
+NO DOC BLOCK: android.webkit.CacheManager.CacheResult Method getContentDisposition()
+NO DOC BLOCK: android.webkit.WebChromeClient Method getDefaultVideoPoster()
+NO DOC BLOCK: android.webkit.WebSettings Method getDefaultZoom()
+NO DOC BLOCK: android.webkit.WebSettings Method getDomStorageEnabled()
+NO DOC BLOCK: android.webkit.CacheManager.CacheResult Method getExpiresString()
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method getInstance()
+NO DOC BLOCK: android.webkit.WebStorage Method getInstance()
+NO DOC BLOCK: android.webkit.WebSettings Method getLoadWithOverviewMode()
+NO DOC BLOCK: android.webkit.GeolocationPermissions Method getOrigins(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)
+NO DOC BLOCK: android.webkit.WebStorage Method getOrigins(android.webkit.ValueCallback<java.util.Map>)
+NO DOC BLOCK: android.webkit.WebStorage Method getQuotaForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)
+NO DOC BLOCK: android.content.Intent Method getSourceBounds()
+NO DOC BLOCK: android.webkit.WebStorage Method getUsageForOrigin(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)
+NO DOC BLOCK: android.webkit.WebChromeClient Method getVideoLoadingProgressView()
+NO DOC BLOCK: android.webkit.WebChromeClient Method getVisitedHistory(android.webkit.ValueCallback<java.lang.String[]>)
+NO DOC BLOCK: android.app.WallpaperManager Method getWallpaperInfo()
+NO DOC BLOCK: android.widget.ViewFlipper Method isAutoStart()
+NO DOC BLOCK: android.view.ViewGroup Method isChildrenDrawingOrderEnabled()
+NO DOC BLOCK: android.view.View Method isOpaque()
+NO DOC BLOCK: android.os.PowerManager Method isScreenOn()
+NO DOC BLOCK: android.webkit.WebChromeClient Method onConsoleMessage(java.lang.String, int, java.lang.String)
+NO DOC BLOCK: android.telephony.PhoneStateListener Method onDataConnectionStateChanged(int, int)
+NO DOC BLOCK: android.view.View Method onDrawScrollBars(android.graphics.Canvas)
+NO DOC BLOCK: android.webkit.WebChromeClient Method onHideCustomView()
+NO DOC BLOCK: android.webkit.WebChromeClient Method onJsTimeout()
+NO DOC BLOCK: android.webkit.WebChromeClient Method onReachedMaxAppCacheSize(long, long, android.webkit.WebStorage.QuotaUpdater)
+NO DOC BLOCK: android.webkit.WebChromeClient Method onReceivedTouchIconUrl(android.webkit.WebView, java.lang.String, boolean)
+NO DOC BLOCK: android.webkit.WebChromeClient Method onShowCustomView(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)
+NO DOC BLOCK: android.telephony.PhoneStateListener Method onSignalStrengthsChanged(android.telephony.SignalStrength)
+NO DOC BLOCK: android.widget.RemoteViews Method removeAllViews(int)
+NO DOC BLOCK: android.app.WallpaperManager Method sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)
+NO DOC BLOCK: android.webkit.WebSettings Method setAppCacheEnabled(boolean)
+NO DOC BLOCK: android.webkit.WebSettings Method setAppCacheMaxSize(long)
+NO DOC BLOCK: android.webkit.WebSettings Method setAppCachePath(java.lang.String)
+NO DOC BLOCK: android.widget.ViewFlipper Method setAutoStart(boolean)
+NO DOC BLOCK: android.view.ViewGroup Method setChildrenDrawingOrderEnabled(boolean)
+NO DOC BLOCK: android.webkit.WebSettings Method setDefaultZoom(android.webkit.WebSettings.ZoomDensity)
+NO DOC BLOCK: android.webkit.WebSettings Method setDomStorageEnabled(boolean)
+NO DOC BLOCK: android.webkit.WebSettings Method setLoadWithOverviewMode(boolean)
+NO DOC BLOCK: android.webkit.WebStorage Method setQuotaForOrigin(java.lang.String, long)
+NO DOC BLOCK: android.content.Intent Method setSourceBounds(android.graphics.Rect)
+NO DOC BLOCK: android.app.WallpaperManager Method setWallpaperOffsetSteps(float, float)
+NO DOC BLOCK: android.graphics.Rect Method unflattenFromString(java.lang.String)
+NO DOC BLOCK: android.app.WallpaperManager Field ACTION_LIVE_WALLPAPER_CHOOSER
+NO DOC BLOCK: android.content.Intent Field ACTION_LOCALE_CHANGED
+NO DOC BLOCK: android.R.attr Field author
+NO DOC BLOCK: android.R.attr Field autoStart
+NO DOC BLOCK: android.media.MediaRecorder.AudioSource Field CAMCORDER
+NO DOC BLOCK: android.app.WallpaperManager Field COMMAND_DROP
+NO DOC BLOCK: android.app.WallpaperManager Field COMMAND_TAP
+NO DOC BLOCK: android.os.Build.VERSION_CODES Field ECLAIR_MR1
+NO DOC BLOCK: android.content.Intent Field EXTRA_CHANGED_COMPONENT_NAME_LIST
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_CAMERA
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_CAMERA_AUTOFOCUS
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_CAMERA_FLASH
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_LIVE_WALLPAPER
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_SENSOR_LIGHT
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_SENSOR_PROXIMITY
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_TELEPHONY
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_TELEPHONY_CDMA
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_TELEPHONY_GSM
+NO DOC BLOCK: android.content.pm.PackageManager Field FEATURE_TOUCHSCREEN_MULTITOUCH
+NO DOC BLOCK: android.content.Intent Field FILL_IN_SOURCE_BOUNDS
+NO DOC BLOCK: android.telephony.PhoneStateListener Field LISTEN_SIGNAL_STRENGTHS
+NO DOC BLOCK: android.media.MediaRecorder.AudioSource Field VOICE_RECOGNITION
diff --git a/docs/html/sdk/api_diff/7/stylesheet-jdiff.css b/docs/html/sdk/api_diff/7/stylesheet-jdiff.css
new file mode 100644
index 0000000..edafaa3
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/stylesheet-jdiff.css
@@ -0,0 +1,44 @@
+
+/* (http://www.jdiff.org) */
+
+div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}
+table.diffspectable {border:1px;padding:0px;margin:0px;}
+.diffspechead {background-color:#eee;}
+.diffspectable tr {border:0px;padding:0px;}
+.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}
+td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffvaluenew {color:green;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;}
+tt {font-size:11pt;font-family:monospace;}
+.indexHeader {
+ font-size:96%;
+ line-height:.8em;}
+.jdiffIndex td {
+ font-size:96%;
+ xline-height:.8em;
+ padding:2px;
+ padding-left:1em;}
+.indexText {
+ font-size:100%;
+ padding-left:1em;}
+#indexTableCaption {
+ font-size:96%;
+ margin-top:.25em;
+ margin-bottom:0;
+ }
+.hiddenlink {
+ font-size:96%;
+ line-height:.8em;
+ text-decoration:none;}
+a {
+ text-decoration:none;}
+a:hover {
+ text-decoration:underline;}
+.indexBox {
+ border: 1px solid red;
+ margin:1em 0 0 0;}
+.letterIndexHead {
+ font-size: 1.5em;font-weight:9;
+ margin:0 0 0em 0;
+ border: 1px solid red;}
diff --git a/docs/html/sdk/api_diff/7/user_comments_for_6_to_7.xml b/docs/html/sdk/api_diff/7/user_comments_for_6_to_7.xml
new file mode 100644
index 0000000..8a7495a
--- /dev/null
+++ b/docs/html/sdk/api_diff/7/user_comments_for_6_to_7.xml
@@ -0,0 +1,739 @@
+<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
+<comments
+ xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
+ xsi:noNamespaceSchemaLocation='comments.xsd'
+ name="6_to_7"
+ jdversion="1.1.0">
+
+<!-- Use this file to enter an API change description. For example, when you remove a class,
+ you can enter a comment for that class that points developers to the replacement class.
+ You can also provide a change summary for modified API, to give an overview of the changes
+ why they were made, workarounds, etc. -->
+
+<!-- When the API diffs report is generated, the comments in this file get added to the tables of
+ removed, added, and modified packages, classes, methods, and fields. This file does not ship
+ with the final report. -->
+
+<!-- The id attribute in an identifier element identifies the change as noted in the report.
+ An id has the form package[.class[.[ctor|method|field].signature]], where [] indicates optional
+ text. A comment element can have multiple identifier elements, which will will cause the same
+ text to appear at each place in the report, but will be converted to separate comments when the
+ comments file is used. -->
+
+<!-- HTML tags in the text field will appear in the report. You also need to close p HTML elements,
+ used for paragraphs - see the top-level documentation. -->
+
+<!-- You can include standard javadoc links in your change descriptions. You can use the @first command
+ to cause jdiff to include the first line of the API documentation. You also need to close p HTML
+ elements, used for paragraphs - see the top-level documentation. -->
+
+<comment>
+ <identifier id="android"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.Manifest.permission"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.Manifest.permission.SET_PREFERRED_APPLICATIONS"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.R.attr"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.R.attr.author"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.R.attr.autoStart"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperInfo"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.COMMAND_DROP"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.COMMAND_TAP"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.getWallpaperInfo_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.sendWallpaperCommand_added(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.app.WallpaperManager.setWallpaperOffsetSteps_added(float, float)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.ACTION_LOCALE_CHANGED"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.FILL_IN_SOURCE_BOUNDS"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.getSourceBounds_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.Intent.setSourceBounds_added(android.graphics.Rect)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_CAMERA"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_CAMERA_AUTOFOCUS"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_CAMERA_FLASH"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_LIVE_WALLPAPER"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_SENSOR_LIGHT"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_SENSOR_PROXIMITY"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_TELEPHONY"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_TELEPHONY_CDMA"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_TELEPHONY_GSM"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.addPackageToPreferred_changed(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.content.pm.PackageManager.removePackageFromPreferred_changed(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.graphics"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.graphics.Rect"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.graphics.Rect.flattenToString_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.graphics.Rect.unflattenFromString_added(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.media"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.media.MediaRecorder.AudioSource"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.media.MediaRecorder.AudioSource.CAMCORDER"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.os"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.os.Build.VERSION_CODES"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.os.Build.VERSION_CODES.ECLAIR_MR1"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.os.PowerManager"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.os.PowerManager.isScreenOn_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.service.wallpaper"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.NeighboringCellInfo"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.NeighboringCellInfo.ctor_added(int, java.lang.String, int)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.PhoneStateListener"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTH"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.PhoneStateListener.LISTEN_SIGNAL_STRENGTHS"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.PhoneStateListener.onDataConnectionStateChanged_added(int, int)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.PhoneStateListener.onSignalStrengthsChanged_added(android.telephony.SignalStrength)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.telephony.SignalStrength"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.View"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.View.isOpaque_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.View.onDrawScrollBars_added(android.graphics.Canvas)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.ViewGroup"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.ViewGroup.isChildrenDrawingOrderEnabled_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.view.ViewGroup.setChildrenDrawingOrderEnabled_added(boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.CacheManager.CacheResult"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.CacheManager.CacheResult.getContentDisposition_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.CacheManager.CacheResult.getExpiresString_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.allow_added(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.clearAll_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.clear_added(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.getAllowed_added(java.lang.String, android.webkit.ValueCallback<java.lang.Boolean>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.getInstance_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.GeolocationPermissions.getOrigins_added(android.webkit.ValueCallback<java.util.Set<java.lang.String>>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.ValueCallback"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.CustomViewCallback"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.getDefaultVideoPoster_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.getVideoLoadingProgressView_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.getVisitedHistory_added(android.webkit.ValueCallback<java.lang.String[]>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onConsoleMessage_added(java.lang.String, int, java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onHideCustomView_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onJsTimeout_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onReachedMaxAppCacheSize_added(long, long, android.webkit.WebStorage.QuotaUpdater)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onReceivedTouchIconUrl_added(android.webkit.WebView, java.lang.String, boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebChromeClient.onShowCustomView_added(android.view.View, android.webkit.WebChromeClient.CustomViewCallback)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.ZoomDensity"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.getDefaultZoom_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.getDomStorageEnabled_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.getLoadWithOverviewMode_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setAppCacheEnabled_added(boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setAppCacheMaxSize_added(long)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setAppCachePath_added(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setDefaultZoom_added(android.webkit.WebSettings.ZoomDensity)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setDomStorageEnabled_added(boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebSettings.setLoadWithOverviewMode_added(boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.deleteAllData_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.deleteOrigin_added(java.lang.String)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.getInstance_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.getOrigins_added(android.webkit.ValueCallback<java.util.Map>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.getQuotaForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.getUsageForOrigin_added(java.lang.String, android.webkit.ValueCallback<java.lang.Long>)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebStorage.setQuotaForOrigin_added(java.lang.String, long)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebView"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.webkit.WebView.freeMemory_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.RemoteViews"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.RemoteViews.addView_added(int, android.widget.RemoteViews)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.RemoteViews.removeAllViews_added(int)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.ViewFlipper"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.ViewFlipper.isAutoStart_added()"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.ViewFlipper.setAutoStart_added(boolean)"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+
+</comments>
diff --git a/docs/html/sdk/eclipse-adt.jd b/docs/html/sdk/eclipse-adt.jd
index 7d9efdb..f861afd 100644
--- a/docs/html/sdk/eclipse-adt.jd
+++ b/docs/html/sdk/eclipse-adt.jd
@@ -53,6 +53,11 @@
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 ADT Plugin</h2>
@@ -196,7 +201,7 @@
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
+<a href="{@docRoot}resources/faq/troubleshooting.html#installeclipsecomponents">ADT
Installation Error: "requires plug-in org.eclipse.wst.sse.ui"</a>.</p>
<h4>For Linux users</h4>
@@ -263,9 +268,10 @@
<p>If you encounter problems during the update of ADT, you
can try removing the existing ADT plugin and then performing a fresh
-installation. Fully remove your existing ADT Plugin as described in <a
-href="#uninstalling">Uninstalling the ADT Plugin</a>, below, and then follow the guide to <a
-href="#installing">Installing the ADT Plugin</a>.</p>
+installation. To remove the plugin, follow the instructions in <a
+href="#uninstalling">Uninstalling the ADT Plugin</a>, below. To reinstall
+the plugin, follow the instructions in <a
+href="#installing">Installing the ADT Plugin</a>, above.</p>
<h2 id="uninstalling">Uninstalling the ADT plugin</h2>
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index 6ca02b6..25d0a82 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -68,7 +68,8 @@
the latest documentation package. The documentation covers all versions of the
API and lets you filter out those versions that your application won't support.
Once installed, the documentation is also available to you directly from the
-Eclipse IDE. </p>
+Eclipse IDE. When you are online, you can always access the latest documentation
+at the Android Developers site.</p>
<p><strong>5. Download other SDK components</strong></p>
@@ -84,6 +85,6 @@
project or move existing applications into the new SDK.</p>
<p>If you are new to Android, you can use the <a
-href="{@docRoot}guide/tutorials/hello-world.html">Hello World</a> tutorial to
+href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a> tutorial to
get started quickly. <a href="{@docRoot}sdk/installing.html#NextSteps">Next
Steps</a> offers other suggestions of how to begin. Welcome!</p>
diff --git a/docs/html/sdk/installing.jd b/docs/html/sdk/installing.jd
index 261b49f..698c347 100644
--- a/docs/html/sdk/installing.jd
+++ b/docs/html/sdk/installing.jd
@@ -186,7 +186,7 @@
</ul>
<p>To develop <em>any</em> Android application, even if you are following the <a
-href="{@docRoot}guide/tutorials/hello-world.html">Hello World</a> tutorial, you
+href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a> tutorial, you
<strong>must download at least one Android platform</strong> into your SDK.
Typically, you will want to download multiple platforms, so that you can build
your application on the lowest version you want to support, but test against
@@ -342,9 +342,9 @@
<p><strong>Explore some code</strong></p>
<ul>
- <li>Set up a <a href="{@docRoot}guide/tutorials/hello-world.html">Hello
+ <li>Set up a <a href="{@docRoot}resources/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">
+ <li>Follow the <a href="{@docRoot}resources/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>,
@@ -354,7 +354,7 @@
<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
+ href="{@docRoot}resources/community-groups.html">Community</a> pages 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
diff --git a/docs/html/sdk/ndk/1.5_r1/index.jd b/docs/html/sdk/ndk/1.5_r1/index.jd
index 7ccbbcd..16d543d 100644
--- a/docs/html/sdk/ndk/1.5_r1/index.jd
+++ b/docs/html/sdk/ndk/1.5_r1/index.jd
@@ -146,7 +146,7 @@
<p>The sections below describe the system and software requirements for using
the Android NDK, as well as platform compatibility considerations that affect
-appplications using libraries produced with the NDK. </p>
+applications using libraries produced with the NDK. </p>
<h4>The Android SDK</h4>
<ul>
diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs
index 1690995..556f781 100644
--- a/docs/html/sdk/sdk_toc.cs
+++ b/docs/html/sdk/sdk_toc.cs
@@ -61,15 +61,18 @@
</li>
</ul>
<ul>
- <li><a href="<?cs var:toroot ?>sdk/android-2.0.1.html">Android 2.0.1
+ <li><a href="<?cs var:toroot ?>sdk/android-2.1.html">Android 2.1
Platform</a> <span class="new">new!</span>
</li>
<li><a href="<?cs var:toroot ?>sdk/android-1.6.html">Android 1.6
- Platform</a> <span class="new">new!</span></li>
+ Platform</a></li>
<li><a href="<?cs var:toroot ?>sdk/android-1.5.html">Android 1.5 Platform</a></li>
<li class="toggle-list">
<div><a href="#" onclick="toggle(this.parentNode.parentNode,true); return false;">Older Platforms</a></div>
<ul>
+ <li><a href="<?cs var:toroot ?>sdk/android-2.0.1.html">Android 2.0.1
+ Platform</a>
+ </li>
<li><a href="<?cs var:toroot ?>sdk/android-2.0.html">Android 2.0
Platform</a>
</li>
@@ -80,10 +83,9 @@
</ul>
<ul>
<li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r4</a>
- <span class="new">new!</span>
</li>
<li><a href="<?cs var:toroot ?>sdk/win-usb.html">USB Driver for
-Windows, r2</a>
+Windows, r3</a> <span class="new">new!</span>
</li>
</ul>
</li>
@@ -109,7 +111,7 @@
<span style="display:none" class="zh-TW"></span></a>
</li>
<li><a href="<?cs var:toroot ?>sdk/adt-notes.html">ADT <?cs var:adt.zip.version ?>
- <span class="new">new!</span></a>
+ </a>
</li>
</ul>
</li>
diff --git a/docs/html/sdk/win-usb.jd b/docs/html/sdk/win-usb.jd
index 3a5a30f..e0c2431 100644
--- a/docs/html/sdk/win-usb.jd
+++ b/docs/html/sdk/win-usb.jd
@@ -36,6 +36,9 @@
<h2 id="RevisionNotes">Revision Notes</h2>
+<h4>Revision 3</h4>
+<p>Adds support for the Nexus One. Released January 2010.</p>
+
<h4>Revision 2</h4>
<p>Adds support for the Verizon Droid (or similar hardware on
other carriers). Released November 2009.</p>
@@ -55,6 +58,7 @@
<li>T-Mobile G1* / ADP1</li>
<li>T-Mobile myTouch 3G* / Google Ion</li>
<li>Verizon Droid*</li>
+ <li>Nexus One</li>
</ul>
<p>* <em>Or similar hardware on other carriers</em></p>
<p>Any additional devices will require Windows drivers provided by
diff --git a/docs/html/shareables/latest_samples.zip b/docs/html/shareables/latest_samples.zip
index 585d6f2..42fad99 100644
--- a/docs/html/shareables/latest_samples.zip
+++ b/docs/html/shareables/latest_samples.zip
Binary files differ
diff --git a/docs/html/sitemap.txt b/docs/html/sitemap.txt
index a227d09..f82b2fe 100644
--- a/docs/html/sitemap.txt
+++ b/docs/html/sitemap.txt
@@ -1,11 +1,87 @@
+http://developer.android.com/
http://developer.android.com/index.html
-http://developer.android.com/favicon.ico
-http://developer.android.com/sdk/1.5_r1/index.html
+http://developer.android.com/sdk/index.html
http://developer.android.com/guide/index.html
http://developer.android.com/reference/packages.html
-http://developer.android.com/community/index.html
-http://developer.android.com/sdk/index.html
+http://developer.android.com/resources/index.html
+http://developer.android.com/videos/index.html
+http://developer.android.com/resources/dashboard/platform-versions.html
http://developer.android.com/license.html
+http://developer.android.com/sdk/terms.html
+http://developer.android.com/resources/community-groups.html
+http://developer.android.com/resources/community-more.html
+http://developer.android.com/resources/articles/index.html
+http://developer.android.com/resources/articles/avoiding-memory-leaks.html
+http://developer.android.com/resources/articles/backward-compatibility.html
+http://developer.android.com/resources/articles/can-i-use-this-intent.html
+http://developer.android.com/resources/articles/creating-input-method.html
+http://developer.android.com/resources/articles/drawable-mutations.html
+http://developer.android.com/resources/articles/faster-screen-orientation-change.html
+http://developer.android.com/resources/articles/future-proofing.html
+http://developer.android.com/resources/articles/gestures.html
+http://developer.android.com/resources/articles/glsurfaceview.html
+http://developer.android.com/resources/articles/layout-tricks-reuse.html
+http://developer.android.com/resources/articles/layout-tricks-efficiency.html
+http://developer.android.com/resources/articles/layout-tricks-stubs.html
+http://developer.android.com/resources/articles/layout-tricks-merge.html
+http://developer.android.com/resources/articles/listview-backgrounds.html
+http://developer.android.com/resources/articles/live-folders.html
+http://developer.android.com/resources/articles/on-screen-inputs.html
+http://developer.android.com/resources/articles/painless-threading.html
+http://developer.android.com/resources/articles/qsb.html
+http://developer.android.com/resources/articles/touch-mode.html
+http://developer.android.com/resources/articles/track-mem.html
+http://developer.android.com/resources/articles/ui-1.5.html
+http://developer.android.com/resources/articles/ui-1.6.html
+http://developer.android.com/resources/articles/timed-ui-updates.html
+http://developer.android.com/resources/articles/tts.html
+http://developer.android.com/resources/articles/using-webviews.html
+http://developer.android.com/resources/articles/wikinotes-linkify.html
+http://developer.android.com/resources/articles/wikinotes-intents.html
+http://developer.android.com/resources/articles/window-bg-speed.html
+http://developer.android.com/resources/articles/zipalign.html
+http://developer.android.com/resources/tutorials/hello-world.html
+http://developer.android.com/resources/tutorials/views/index.html
+http://developer.android.com/resources/tutorials/localization/index.html
+http://developer.android.com/resources/tutorials/notepad/index.html
+http://developer.android.com/resources/samples/index.html
+http://developer.android.com/resources/samples/ApiDemos/index.html
+http://developer.android.com/resources/samples/BluetoothChat/index.html
+http://developer.android.com/resources/samples/ContactManager/index.html
+http://developer.android.com/resources/samples/Home/index.html
+http://developer.android.com/resources/samples/JetBoy/index.html
+http://developer.android.com/resources/samples/LunarLander/index.html
+http://developer.android.com/resources/samples/MultiResolution/index.html
+http://developer.android.com/resources/samples/NotePad/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/index.html
+http://developer.android.com/resources/samples/Snake/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/index.html
+http://developer.android.com/resources/samples/Wiktionary/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/index.html
+http://developer.android.com/resources/faq/commontasks.html
+http://developer.android.com/resources/faq/troubleshooting.html
+http://developer.android.com/resources/faq/index.html
+http://developer.android.com/resources/faq/framework.html
+http://developer.android.com/resources/faq/licensingandoss.html
+http://developer.android.com/resources/faq/security.html
+http://developer.android.com/sdk/installing.html
+http://developer.android.com/sdk/adding-components.html
+http://developer.android.com/sdk/android-2.0.1.html
+http://developer.android.com/sdk/android-1.6.html
+http://developer.android.com/sdk/android-1.5.html
+http://developer.android.com/sdk/android-2.0.html
+http://developer.android.com/sdk/android-1.1.html
+http://developer.android.com/sdk/tools-notes.html
+http://developer.android.com/sdk/win-usb.html
+http://developer.android.com/sdk/eclipse-adt.html
+http://developer.android.com/sdk/adt-notes.html
+http://developer.android.com/sdk/ndk/1.6_r1/index.html
+http://developer.android.com/sdk/requirements.html
+http://developer.android.com/sdk/RELEASENOTES.html
+http://developer.android.com/sdk/older_releases.html
+http://developer.android.com/sdk/download.html?v=android-sdk_r04-windows.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_r04-mac_86.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_r04-linux_86.tgz
http://developer.android.com/guide/basics/what-is-android.html
http://developer.android.com/guide/topics/fundamentals.html
http://developer.android.com/guide/topics/ui/index.html
@@ -22,6 +98,7 @@
http://developer.android.com/guide/topics/resources/index.html
http://developer.android.com/guide/topics/resources/resources-i18n.html
http://developer.android.com/guide/topics/resources/available-resources.html
+http://developer.android.com/guide/topics/resources/localization.html
http://developer.android.com/guide/topics/intents/intents-filters.html
http://developer.android.com/guide/topics/data/data-storage.html
http://developer.android.com/guide/topics/providers/content-providers.html
@@ -38,13 +115,16 @@
http://developer.android.com/guide/topics/manifest/intent-filter-element.html
http://developer.android.com/guide/topics/manifest/manifest-element.html
http://developer.android.com/guide/topics/manifest/meta-data-element.html
+http://developer.android.com/guide/topics/manifest/path-permission-element.html
http://developer.android.com/guide/topics/manifest/permission-element.html
http://developer.android.com/guide/topics/manifest/permission-group-element.html
http://developer.android.com/guide/topics/manifest/permission-tree-element.html
http://developer.android.com/guide/topics/manifest/provider-element.html
http://developer.android.com/guide/topics/manifest/receiver-element.html
http://developer.android.com/guide/topics/manifest/service-element.html
+http://developer.android.com/guide/topics/manifest/supports-screens-element.html
http://developer.android.com/guide/topics/manifest/uses-configuration-element.html
+http://developer.android.com/guide/topics/manifest/uses-feature-element.html
http://developer.android.com/guide/topics/manifest/uses-library-element.html
http://developer.android.com/guide/topics/manifest/uses-permission-element.html
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
@@ -54,6 +134,7 @@
http://developer.android.com/guide/topics/media/index.html
http://developer.android.com/guide/topics/location/index.html
http://developer.android.com/guide/topics/appwidgets/index.html
+http://developer.android.com/guide/topics/wireless/bluetooth.html
http://developer.android.com/guide/developing/eclipse-adt.html
http://developer.android.com/guide/developing/other-ide.html
http://developer.android.com/guide/developing/device.html
@@ -68,53 +149,40 @@
http://developer.android.com/guide/developing/tools/draw9patch.html
http://developer.android.com/guide/developing/tools/emulator.html
http://developer.android.com/guide/developing/tools/hierarchy-viewer.html
+http://developer.android.com/guide/developing/tools/layoutopt.html
http://developer.android.com/guide/developing/tools/monkey.html
http://developer.android.com/guide/developing/tools/traceview.html
+http://developer.android.com/guide/developing/tools/zipalign.html
http://developer.android.com/guide/publishing/app-signing.html
http://developer.android.com/guide/publishing/versioning.html
http://developer.android.com/guide/publishing/preparing.html
http://developer.android.com/guide/publishing/publishing.html
+http://developer.android.com/guide/practices/screens_support.html
http://developer.android.com/guide/practices/ui_guidelines/index.html
http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
+http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html
+http://developer.android.com/guide/practices/ui_guidelines/menu_design.html
http://developer.android.com/guide/practices/design/performance.html
http://developer.android.com/guide/practices/design/responsiveness.html
http://developer.android.com/guide/practices/design/seamlessness.html
-http://developer.android.com/guide/tutorials/hello-world.html
-http://developer.android.com/guide/tutorials/views/index.html
-http://developer.android.com/guide/tutorials/notepad/index.html
-http://developer.android.com/guide/samples/index.html
-http://developer.android.com/guide/samples/ApiDemos/index.html
-http://developer.android.com/guide/samples/LunarLander/index.html
-http://developer.android.com/guide/samples/NotePad/index.html
+http://developer.android.com/guide/appendix/api-levels.html
http://developer.android.com/guide/appendix/media-formats.html
http://developer.android.com/guide/appendix/g-app-intents.html
http://developer.android.com/guide/appendix/glossary.html
-http://developer.android.com/guide/appendix/faq/index.html
-http://developer.android.com/sdk/terms.html
-http://developer.android.com/sdk/1.5_r1/installing.html
-http://developer.android.com/sdk/1.5_r1/upgrading.html
-http://developer.android.com/sdk/1.5_r1/requirements.html
-http://developer.android.com/sdk/RELEASENOTES.html
-http://developer.android.com/sdk/android-1.5.html
-http://developer.android.com/sdk/android-1.1.html
-http://developer.android.com/sdk/1.1_r1/index.html
-http://developer.android.com/sdk/1.0_r2/index.html
-http://developer.android.com/sdk/1.0_r1/index.html
-http://developer.android.com/sdk/older_releases.html
-http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.5_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.5_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.5_r1.zip
-http://developer.android.com/reference/android/location/Geocoder.html
http://developer.android.com/reference/classes.html
http://developer.android.com/reference/android/package-summary.html
+http://developer.android.com/reference/android/accessibilityservice/package-summary.html
+http://developer.android.com/reference/android/accounts/package-summary.html
http://developer.android.com/reference/android/app/package-summary.html
http://developer.android.com/reference/android/appwidget/package-summary.html
+http://developer.android.com/reference/android/bluetooth/package-summary.html
http://developer.android.com/reference/android/content/package-summary.html
http://developer.android.com/reference/android/content/pm/package-summary.html
http://developer.android.com/reference/android/content/res/package-summary.html
http://developer.android.com/reference/android/database/package-summary.html
http://developer.android.com/reference/android/database/sqlite/package-summary.html
+http://developer.android.com/reference/android/gesture/package-summary.html
http://developer.android.com/reference/android/graphics/package-summary.html
http://developer.android.com/reference/android/graphics/drawable/package-summary.html
http://developer.android.com/reference/android/graphics/drawable/shapes/package-summary.html
@@ -131,7 +199,9 @@
http://developer.android.com/reference/android/provider/package-summary.html
http://developer.android.com/reference/android/sax/package-summary.html
http://developer.android.com/reference/android/speech/package-summary.html
+http://developer.android.com/reference/android/speech/tts/package-summary.html
http://developer.android.com/reference/android/telephony/package-summary.html
+http://developer.android.com/reference/android/telephony/cdma/package-summary.html
http://developer.android.com/reference/android/telephony/gsm/package-summary.html
http://developer.android.com/reference/android/test/package-summary.html
http://developer.android.com/reference/android/test/mock/package-summary.html
@@ -143,6 +213,7 @@
http://developer.android.com/reference/android/text/util/package-summary.html
http://developer.android.com/reference/android/util/package-summary.html
http://developer.android.com/reference/android/view/package-summary.html
+http://developer.android.com/reference/android/view/accessibility/package-summary.html
http://developer.android.com/reference/android/view/animation/package-summary.html
http://developer.android.com/reference/android/view/inputmethod/package-summary.html
http://developer.android.com/reference/android/webkit/package-summary.html
@@ -236,237 +307,167 @@
http://developer.android.com/reference/org/xmlpull/v1/package-summary.html
http://developer.android.com/reference/org/xmlpull/v1/sax2/package-summary.html
http://developer.android.com/reference/org/apache/http/message/AbstractHttpMessage.html
-http://developer.android.com/reference/android/view/ViewGroup.html
+http://developer.android.com/reference/android/app/Activity.html
+http://developer.android.com/reference/android/view/View.html
+http://developer.android.com/reference/android/widget/TextView.html
+http://developer.android.com/reference/android/content/Context.html
+http://developer.android.com/resources/samples/Wiktionary/res/index.html
+http://developer.android.com/resources/samples/Wiktionary/src/index.html
+http://developer.android.com/resources/samples/Wiktionary/AndroidManifest.html
+http://developer.android.com/reference/android/app/Application.html
+http://developer.android.com/reference/android/graphics/drawable/Drawable.html
+http://developer.android.com/reference/java/lang/ref/WeakReference.html
+http://developer.android.com/resources/samples/ApiDemos/assets/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/index.html
+http://developer.android.com/resources/samples/ApiDemos/AndroidManifest.html
+http://developer.android.com/reference/android/provider/LiveFolders.html
+http://developer.android.com/resources/samples/NotePad/res/index.html
+http://developer.android.com/resources/samples/NotePad/src/index.html
+http://developer.android.com/resources/samples/NotePad/tests/index.html
+http://developer.android.com/resources/samples/NotePad/AndroidManifest.html
http://developer.android.com/reference/android/widget/FrameLayout.html
-http://developer.android.com/reference/android/widget/LinearLayout.html
-http://developer.android.com/guide/tutorials/views/hello-linearlayout.html
-http://developer.android.com/reference/android/widget/TableLayout.html
-http://developer.android.com/reference/android/widget/TableRow.html
-http://developer.android.com/guide/tutorials/views/hello-tablelayout.html
-http://developer.android.com/reference/android/widget/AbsoluteLayout.html
-http://developer.android.com/reference/android/widget/RelativeLayout.html
-http://developer.android.com/guide/tutorials/views/hello-relativelayout.html
-http://developer.android.com/reference/android/widget/Gallery.html
-http://developer.android.com/reference/android/widget/GridView.html
-http://developer.android.com/reference/android/widget/ListView.html
-http://developer.android.com/reference/android/widget/ScrollView.html
-http://developer.android.com/reference/android/widget/Spinner.html
-http://developer.android.com/reference/android/view/SurfaceView.html
-http://developer.android.com/reference/android/widget/TabHost.html
-http://developer.android.com/reference/android/widget/ViewFlipper.html
-http://developer.android.com/reference/android/widget/ViewSwitcher.html
+http://developer.android.com/reference/android/widget/ImageView.html
+http://developer.android.com/reference/android/view/LayoutInflater.html
+http://developer.android.com/reference/android/view/View.OnClickListener.html
+http://developer.android.com/reference/android/os/Handler.html
+http://developer.android.com/reference/android/os/AsyncTask.html
+http://developer.android.com/reference/android/app/SearchManager.html
+http://developer.android.com/reference/android/content/ContentProvider.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/AndroidManifest.html
+http://developer.android.com/reference/android/view/ContextThemeWrapper.html
+http://developer.android.com/reference/android/R.style.html
+http://developer.android.com/reference/android/app/AliasActivity.html
+http://developer.android.com/reference/android/util/Log.html
+http://developer.android.com/reference/android/os/Debug.html
http://developer.android.com/reference/android/R.attr.html
http://developer.android.com/reference/android/R.styleable.html
-http://developer.android.com/reference/android/content/Context.html
http://developer.android.com/reference/java/lang/SecurityException.html
http://developer.android.com/reference/android/Manifest.permission.html
http://developer.android.com/reference/android/Manifest.permission_group.html
-http://developer.android.com/reference/android/app/Activity.html
http://developer.android.com/reference/android/app/Service.html
http://developer.android.com/reference/android/content/BroadcastReceiver.html
-http://developer.android.com/reference/android/content/ContentProvider.html
http://developer.android.com/reference/android/content/ContentResolver.html
http://developer.android.com/reference/android/content/pm/PackageManager.html
http://developer.android.com/reference/android/content/Intent.html
-http://developer.android.com/reference/android/os/Debug.html
+http://developer.android.com/reference/java/util/zip/Checksum.html
+http://developer.android.com/reference/java/util/zip/Adler32.html
+http://developer.android.com/reference/java/util/zip/CheckedInputStream.html
+http://developer.android.com/reference/java/util/zip/CheckedOutputStream.html
+http://developer.android.com/reference/java/util/zip/CRC32.html
+http://developer.android.com/reference/java/util/zip/Deflater.html
+http://developer.android.com/reference/java/util/zip/DeflaterOutputStream.html
+http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
+http://developer.android.com/reference/java/util/zip/GZIPOutputStream.html
+http://developer.android.com/reference/java/util/zip/Inflater.html
+http://developer.android.com/reference/java/util/zip/InflaterInputStream.html
+http://developer.android.com/reference/java/util/zip/ZipEntry.html
+http://developer.android.com/reference/java/util/zip/ZipFile.html
+http://developer.android.com/reference/java/util/zip/ZipInputStream.html
+http://developer.android.com/reference/java/util/zip/ZipOutputStream.html
+http://developer.android.com/reference/java/util/zip/DataFormatException.html
+http://developer.android.com/reference/java/util/zip/ZipException.html
+http://developer.android.com/reference/java/util/zip/package-descr.html
+http://developer.android.com/reference/android/os/Parcelable.html
+http://developer.android.com/reference/android/os/Parcelable.Creator.html
+http://developer.android.com/reference/android/graphics/Rect.html
+http://developer.android.com/reference/android/os/Parcel.html
+http://developer.android.com/reference/android/content/ServiceConnection.html
+http://developer.android.com/reference/android/os/IBinder.html
+http://developer.android.com/reference/android/os/DeadObjectException.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractClientConnAdapter.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPooledConnAdapter.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPoolEntry.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnection.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnectionOperator.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultHttpRoutePlanner.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultResponseParser.html
+http://developer.android.com/reference/org/apache/http/impl/conn/IdleConnectionHandler.html
+http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionInputBuffer.html
+http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionOutputBuffer.html
+http://developer.android.com/reference/org/apache/http/impl/conn/ProxySelectorRoutePlanner.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.ConnAdapter.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.PoolEntry.html
+http://developer.android.com/reference/org/apache/http/impl/conn/Wire.html
+http://developer.android.com/reference/org/apache/http/conn/OperatedClientConnection.html
+http://developer.android.com/reference/org/apache/http/conn/ManagedClientConnection.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionOperator.html
+http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoutePlanner.html
+http://developer.android.com/reference/android/view/ViewGroup.html
+http://developer.android.com/reference/android/widget/Button.html
+http://developer.android.com/reference/android/widget/EditText.html
+http://developer.android.com/reference/android/widget/ListView.html
+http://developer.android.com/reference/android/widget/CheckBox.html
+http://developer.android.com/reference/android/widget/RadioButton.html
+http://developer.android.com/reference/android/widget/Gallery.html
+http://developer.android.com/reference/android/widget/Spinner.html
+http://developer.android.com/reference/android/widget/AutoCompleteTextView.html
+http://developer.android.com/reference/android/widget/ImageSwitcher.html
+http://developer.android.com/reference/android/widget/TextSwitcher.html
+http://developer.android.com/reference/android/widget/LinearLayout.html
+http://developer.android.com/reference/android/widget/RelativeLayout.html
+http://developer.android.com/reference/android/app/ListActivity.html
http://developer.android.com/reference/android/graphics/Canvas.html
-http://developer.android.com/reference/android/app/Dialog.html
-http://developer.android.com/reference/android/view/Surface.html
-http://developer.android.com/reference/android/R.style.html
-http://developer.android.com/reference/android/view/View.html
-http://developer.android.com/reference/android/view/Window.html
-http://developer.android.com/reference/android/os/PatternMatcher.html
-http://developer.android.com/reference/android/view/ContextThemeWrapper.html
-http://developer.android.com/reference/android/app/Instrumentation.html
-http://developer.android.com/reference/android/util/Log.html
-http://developer.android.com/reference/android/graphics/drawable/Drawable.html
+http://developer.android.com/reference/android/view/SurfaceView.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/custom_view_1.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html
+http://developer.android.com/reference/java/util/regex/MatchResult.html
+http://developer.android.com/reference/java/util/regex/Matcher.html
+http://developer.android.com/reference/java/util/regex/Pattern.html
+http://developer.android.com/reference/java/util/regex/PatternSyntaxException.html
+http://developer.android.com/reference/java/util/regex/package-descr.html
+http://developer.android.com/reference/android/text/Editable.html
+http://developer.android.com/reference/android/text/GetChars.html
+http://developer.android.com/reference/android/text/Html.ImageGetter.html
+http://developer.android.com/reference/android/text/Html.TagHandler.html
+http://developer.android.com/reference/android/text/InputFilter.html
+http://developer.android.com/reference/android/text/InputType.html
+http://developer.android.com/reference/android/text/NoCopySpan.html
+http://developer.android.com/reference/android/text/ParcelableSpan.html
+http://developer.android.com/reference/android/text/Spannable.html
+http://developer.android.com/reference/android/text/Spanned.html
+http://developer.android.com/reference/android/text/SpanWatcher.html
+http://developer.android.com/reference/android/text/TextUtils.EllipsizeCallback.html
+http://developer.android.com/reference/android/text/TextUtils.StringSplitter.html
+http://developer.android.com/reference/android/text/TextWatcher.html
+http://developer.android.com/reference/android/text/AlteredCharSequence.html
+http://developer.android.com/reference/android/text/AndroidCharacter.html
+http://developer.android.com/reference/android/text/Annotation.html
+http://developer.android.com/reference/android/text/AutoText.html
+http://developer.android.com/reference/android/text/BoringLayout.html
+http://developer.android.com/reference/android/text/BoringLayout.Metrics.html
+http://developer.android.com/reference/android/text/ClipboardManager.html
+http://developer.android.com/reference/android/text/DynamicLayout.html
+http://developer.android.com/reference/android/text/Editable.Factory.html
+http://developer.android.com/reference/android/text/Html.html
+http://developer.android.com/reference/android/text/InputFilter.AllCaps.html
+http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
+http://developer.android.com/reference/android/text/Layout.html
+http://developer.android.com/reference/android/text/Layout.Directions.html
+http://developer.android.com/reference/android/text/LoginFilter.html
+http://developer.android.com/reference/android/text/LoginFilter.PasswordFilterGMail.html
+http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGeneric.html
+http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGMail.html
+http://developer.android.com/reference/android/text/NoCopySpan.Concrete.html
+http://developer.android.com/reference/android/text/Selection.html
+http://developer.android.com/reference/android/text/Spannable.Factory.html
+http://developer.android.com/reference/android/text/SpannableString.html
+http://developer.android.com/reference/android/text/SpannableStringBuilder.html
+http://developer.android.com/reference/android/text/SpannedString.html
+http://developer.android.com/reference/android/text/StaticLayout.html
+http://developer.android.com/reference/android/text/TextPaint.html
+http://developer.android.com/reference/android/text/TextUtils.html
+http://developer.android.com/reference/android/text/TextUtils.SimpleStringSplitter.html
+http://developer.android.com/reference/android/text/Layout.Alignment.html
+http://developer.android.com/reference/android/text/TextUtils.TruncateAt.html
+http://developer.android.com/reference/android/text/package-descr.html
http://developer.android.com/reference/android/graphics/drawable/BitmapDrawable.html
http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/PictureDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/LayerDrawable.html
-http://developer.android.com/reference/android/widget/ImageView.html
-http://developer.android.com/reference/android/content/res/Resources.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/OvalShape.html
-http://developer.android.com/reference/android/graphics/drawable/NinePatchDrawable.html
-http://developer.android.com/reference/android/view/animation/AnimationSet.html
-http://developer.android.com/reference/android/view/animation/Animation.html
-http://developer.android.com/reference/android/view/animation/Interpolator.html
-http://developer.android.com/reference/android/view/animation/AccelerateInterpolator.html
-http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
-http://developer.android.com/guide/appendix/faq/troubleshooting.html
-http://developer.android.com/reference/android/database/Cursor.html
-http://developer.android.com/reference/android/net/Uri.html
-http://developer.android.com/reference/android/content/ContentUris.html
-http://developer.android.com/reference/android/provider/Contacts.Phones.html
-http://developer.android.com/reference/android/provider/BaseColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PeopleColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PhonesColumns.html
-http://developer.android.com/reference/android/provider/Contacts.People.html
-http://developer.android.com/reference/java/io/InputStream.html
-http://developer.android.com/reference/android/content/ContentValues.html
-http://developer.android.com/reference/android/provider/MediaStore.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteCursor.html
-http://developer.android.com/reference/android/database/MatrixCursor.html
-http://developer.android.com/guide/tutorials/views/hello-spinner.html
-http://developer.android.com/guide/tutorials/views/hello-listview.html
-http://developer.android.com/guide/tutorials/views/hello-gridview.html
-http://developer.android.com/reference/android/widget/AdapterView.html
-http://developer.android.com/reference/android/widget/Adapter.html
-http://developer.android.com/reference/android/widget/ArrayAdapter.html
-http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html
-http://developer.android.com/reference/android/app/NotificationManager.html
-http://developer.android.com/sdk/api_diff/3/changes.html
-http://developer.android.com/reference/android/provider/Settings.Secure.html
-http://developer.android.com/reference/android/media/MediaPlayer.html
-http://developer.android.com/reference/android/media/MediaRecorder.html
-http://developer.android.com/reference/android/media/JetPlayer.html
-http://developer.android.com/reference/android/media/SoundPool.html
-http://developer.android.com/guide/topics/media/jet/jetcreator_manual.html
-http://developer.android.com/reference/android/graphics/NinePatch.html
-http://developer.android.com/guide/developing/tools/adt.html
-http://developer.android.com/reference/android/graphics/AvoidXfermode.html
-http://developer.android.com/reference/android/graphics/Bitmap.html
-http://developer.android.com/reference/android/graphics/BitmapFactory.html
-http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
-http://developer.android.com/reference/android/graphics/BitmapShader.html
-http://developer.android.com/reference/android/graphics/BlurMaskFilter.html
-http://developer.android.com/reference/android/graphics/Camera.html
-http://developer.android.com/reference/android/graphics/Color.html
-http://developer.android.com/reference/android/graphics/ColorFilter.html
-http://developer.android.com/reference/android/graphics/ColorMatrix.html
-http://developer.android.com/reference/android/graphics/ColorMatrixColorFilter.html
-http://developer.android.com/reference/android/graphics/ComposePathEffect.html
-http://developer.android.com/reference/android/graphics/ComposeShader.html
-http://developer.android.com/reference/android/graphics/CornerPathEffect.html
-http://developer.android.com/reference/android/graphics/DashPathEffect.html
-http://developer.android.com/reference/android/graphics/DiscretePathEffect.html
-http://developer.android.com/reference/android/graphics/DrawFilter.html
-http://developer.android.com/reference/android/graphics/EmbossMaskFilter.html
-http://developer.android.com/reference/android/graphics/Interpolator.html
-http://developer.android.com/reference/android/graphics/LayerRasterizer.html
-http://developer.android.com/reference/android/graphics/LightingColorFilter.html
-http://developer.android.com/reference/android/graphics/LinearGradient.html
-http://developer.android.com/reference/android/graphics/MaskFilter.html
-http://developer.android.com/reference/android/graphics/Matrix.html
-http://developer.android.com/reference/android/graphics/Movie.html
-http://developer.android.com/reference/android/graphics/Paint.html
-http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html
-http://developer.android.com/reference/android/graphics/Paint.FontMetricsInt.html
-http://developer.android.com/reference/android/graphics/PaintFlagsDrawFilter.html
-http://developer.android.com/reference/android/graphics/Path.html
-http://developer.android.com/reference/android/graphics/PathDashPathEffect.html
-http://developer.android.com/reference/android/graphics/PathEffect.html
-http://developer.android.com/reference/android/graphics/PathMeasure.html
-http://developer.android.com/reference/android/graphics/Picture.html
-http://developer.android.com/reference/android/graphics/PixelFormat.html
-http://developer.android.com/reference/android/graphics/PixelXorXfermode.html
-http://developer.android.com/reference/android/graphics/Point.html
-http://developer.android.com/reference/android/graphics/PointF.html
-http://developer.android.com/reference/android/graphics/PorterDuff.html
-http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html
-http://developer.android.com/reference/android/graphics/PorterDuffXfermode.html
-http://developer.android.com/reference/android/graphics/RadialGradient.html
-http://developer.android.com/reference/android/graphics/Rasterizer.html
-http://developer.android.com/reference/android/graphics/Rect.html
-http://developer.android.com/reference/android/graphics/RectF.html
-http://developer.android.com/reference/android/graphics/Region.html
-http://developer.android.com/reference/android/graphics/RegionIterator.html
-http://developer.android.com/reference/android/graphics/Shader.html
-http://developer.android.com/reference/android/graphics/SumPathEffect.html
-http://developer.android.com/reference/android/graphics/SweepGradient.html
-http://developer.android.com/reference/android/graphics/Typeface.html
-http://developer.android.com/reference/android/graphics/Xfermode.html
-http://developer.android.com/reference/android/graphics/AvoidXfermode.Mode.html
-http://developer.android.com/reference/android/graphics/Bitmap.CompressFormat.html
-http://developer.android.com/reference/android/graphics/Bitmap.Config.html
-http://developer.android.com/reference/android/graphics/BlurMaskFilter.Blur.html
-http://developer.android.com/reference/android/graphics/Canvas.EdgeType.html
-http://developer.android.com/reference/android/graphics/Canvas.VertexMode.html
-http://developer.android.com/reference/android/graphics/Interpolator.Result.html
-http://developer.android.com/reference/android/graphics/Matrix.ScaleToFit.html
-http://developer.android.com/reference/android/graphics/Paint.Align.html
-http://developer.android.com/reference/android/graphics/Paint.Cap.html
-http://developer.android.com/reference/android/graphics/Paint.Join.html
-http://developer.android.com/reference/android/graphics/Paint.Style.html
-http://developer.android.com/reference/android/graphics/Path.Direction.html
-http://developer.android.com/reference/android/graphics/Path.FillType.html
-http://developer.android.com/reference/android/graphics/PathDashPathEffect.Style.html
-http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
-http://developer.android.com/reference/android/graphics/Region.Op.html
-http://developer.android.com/reference/android/graphics/Shader.TileMode.html
-http://developer.android.com/reference/java/lang/Object.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL.html
-http://developer.android.com/reference/java/lang/String.html
-http://developer.android.com/reference/java/lang/CharSequence.html
-http://developer.android.com/reference/java/lang/Class.html
-http://developer.android.com/reference/java/lang/ref/ReferenceQueue.html
-http://developer.android.com/reference/java/lang/Throwable.html
-http://developer.android.com/reference/android/test/PerformanceTestCase.html
-http://developer.android.com/reference/android/test/PerformanceTestCase.Intermediates.html
-http://developer.android.com/reference/android/test/TestSuiteProvider.html
-http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase.html
-http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html
-http://developer.android.com/reference/android/test/ActivityTestCase.html
-http://developer.android.com/reference/android/test/ActivityUnitTestCase.html
-http://developer.android.com/reference/android/test/AndroidTestCase.html
-http://developer.android.com/reference/android/test/AndroidTestRunner.html
-http://developer.android.com/reference/android/test/ApplicationTestCase.html
-http://developer.android.com/reference/android/app/Application.html
-http://developer.android.com/reference/android/test/InstrumentationTestCase.html
-http://developer.android.com/reference/android/test/InstrumentationTestRunner.html
-http://developer.android.com/reference/android/test/InstrumentationTestSuite.html
-http://developer.android.com/reference/android/test/IsolatedContext.html
-http://developer.android.com/reference/android/test/MoreAsserts.html
-http://developer.android.com/reference/android/test/ProviderTestCase.html
-http://developer.android.com/reference/android/test/ProviderTestCase2.html
-http://developer.android.com/reference/android/test/RenamingDelegatingContext.html
-http://developer.android.com/reference/android/test/ServiceTestCase.html
-http://developer.android.com/reference/android/test/SingleLaunchActivityTestCase.html
-http://developer.android.com/reference/android/test/SyncBaseInstrumentation.html
-http://developer.android.com/reference/android/test/TouchUtils.html
-http://developer.android.com/reference/android/test/ViewAsserts.html
-http://developer.android.com/reference/android/test/AssertionFailedError.html
-http://developer.android.com/reference/android/test/ComparisonFailure.html
-http://developer.android.com/reference/android/test/package-descr.html
-http://developer.android.com/reference/junit/framework/TestCase.html
-http://developer.android.com/reference/junit/framework/TestSuite.html
-http://developer.android.com/reference/android/Manifest.html
-http://developer.android.com/reference/android/R.html
-http://developer.android.com/reference/android/R.anim.html
-http://developer.android.com/reference/android/R.array.html
-http://developer.android.com/reference/android/R.bool.html
-http://developer.android.com/reference/android/R.color.html
-http://developer.android.com/reference/android/R.dimen.html
-http://developer.android.com/reference/android/R.drawable.html
-http://developer.android.com/reference/android/R.id.html
-http://developer.android.com/reference/android/R.integer.html
-http://developer.android.com/reference/android/R.layout.html
-http://developer.android.com/reference/android/R.plurals.html
-http://developer.android.com/reference/android/R.raw.html
-http://developer.android.com/reference/android/R.string.html
-http://developer.android.com/reference/android/R.xml.html
-http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
-http://developer.android.com/reference/junit/runner/TestSuiteLoader.html
-http://developer.android.com/reference/junit/runner/BaseTestRunner.html
-http://developer.android.com/reference/junit/runner/Version.html
-http://developer.android.com/reference/junit/runner/package-descr.html
-http://developer.android.com/reference/org/apache/http/auth/AuthScheme.html
-http://developer.android.com/reference/org/apache/http/auth/AuthSchemeFactory.html
-http://developer.android.com/reference/org/apache/http/auth/Credentials.html
-http://developer.android.com/reference/org/apache/http/auth/AUTH.html
-http://developer.android.com/reference/org/apache/http/auth/AuthSchemeRegistry.html
-http://developer.android.com/reference/org/apache/http/auth/AuthScope.html
-http://developer.android.com/reference/org/apache/http/auth/AuthState.html
-http://developer.android.com/reference/org/apache/http/auth/BasicUserPrincipal.html
-http://developer.android.com/reference/org/apache/http/auth/NTCredentials.html
-http://developer.android.com/reference/org/apache/http/auth/NTUserPrincipal.html
-http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html
-http://developer.android.com/reference/org/apache/http/auth/AuthenticationException.html
-http://developer.android.com/reference/org/apache/http/auth/InvalidCredentialsException.html
-http://developer.android.com/reference/org/apache/http/auth/MalformedChallengeException.html
-http://developer.android.com/reference/org/apache/http/auth/package-descr.html
http://developer.android.com/reference/android/view/ContextMenu.html
http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html
http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html
@@ -480,7 +481,6 @@
http://developer.android.com/reference/android/view/SubMenu.html
http://developer.android.com/reference/android/view/SurfaceHolder.html
http://developer.android.com/reference/android/view/SurfaceHolder.Callback.html
-http://developer.android.com/reference/android/view/View.OnClickListener.html
http://developer.android.com/reference/android/view/View.OnCreateContextMenuListener.html
http://developer.android.com/reference/android/view/View.OnFocusChangeListener.html
http://developer.android.com/reference/android/view/View.OnKeyListener.html
@@ -507,12 +507,13 @@
http://developer.android.com/reference/android/view/KeyCharacterMap.html
http://developer.android.com/reference/android/view/KeyCharacterMap.KeyData.html
http://developer.android.com/reference/android/view/KeyEvent.html
-http://developer.android.com/reference/android/view/LayoutInflater.html
+http://developer.android.com/reference/android/view/KeyEvent.DispatcherState.html
http://developer.android.com/reference/android/view/MenuInflater.html
http://developer.android.com/reference/android/view/MotionEvent.html
http://developer.android.com/reference/android/view/OrientationEventListener.html
http://developer.android.com/reference/android/view/OrientationListener.html
http://developer.android.com/reference/android/view/SoundEffectConstants.html
+http://developer.android.com/reference/android/view/Surface.html
http://developer.android.com/reference/android/view/TouchDelegate.html
http://developer.android.com/reference/android/view/VelocityTracker.html
http://developer.android.com/reference/android/view/View.BaseSavedState.html
@@ -523,6 +524,7 @@
http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html
http://developer.android.com/reference/android/view/ViewStub.html
http://developer.android.com/reference/android/view/ViewTreeObserver.html
+http://developer.android.com/reference/android/view/Window.html
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
http://developer.android.com/reference/android/view/ViewDebug.HierarchyTraceType.html
http://developer.android.com/reference/android/view/ViewDebug.RecyclerTraceType.html
@@ -530,94 +532,227 @@
http://developer.android.com/reference/android/view/Surface.OutOfResourcesException.html
http://developer.android.com/reference/android/view/SurfaceHolder.BadSurfaceTypeException.html
http://developer.android.com/reference/android/view/WindowManager.BadTokenException.html
+http://developer.android.com/reference/java/lang/Object.html
http://developer.android.com/reference/android/graphics/drawable/Drawable.Callback.html
+http://developer.android.com/reference/android/view/accessibility/AccessibilityEventSource.html
http://developer.android.com/reference/android/widget/AnalogClock.html
http://developer.android.com/reference/android/inputmethodservice/KeyboardView.html
http://developer.android.com/reference/android/widget/ProgressBar.html
-http://developer.android.com/reference/android/widget/TextView.html
http://developer.android.com/reference/android/inputmethodservice/Keyboard.html
http://developer.android.com/reference/android/widget/AbsListView.html
http://developer.android.com/reference/android/widget/AbsSeekBar.html
http://developer.android.com/reference/android/widget/AbsSpinner.html
+http://developer.android.com/reference/android/widget/AbsoluteLayout.html
+http://developer.android.com/reference/android/widget/AdapterView.html
+http://developer.android.com/reference/android/widget/Adapter.html
http://developer.android.com/reference/android/appwidget/AppWidgetHostView.html
-http://developer.android.com/reference/android/widget/AutoCompleteTextView.html
-http://developer.android.com/reference/android/widget/Button.html
-http://developer.android.com/reference/android/widget/CheckBox.html
http://developer.android.com/reference/android/widget/CheckedTextView.html
http://developer.android.com/reference/android/widget/Chronometer.html
http://developer.android.com/reference/android/widget/CompoundButton.html
http://developer.android.com/reference/android/widget/DatePicker.html
http://developer.android.com/reference/android/widget/DialerFilter.html
http://developer.android.com/reference/android/widget/DigitalClock.html
-http://developer.android.com/reference/android/widget/EditText.html
http://developer.android.com/reference/android/widget/ExpandableListView.html
http://developer.android.com/reference/android/inputmethodservice/ExtractEditText.html
http://developer.android.com/reference/android/opengl/GLSurfaceView.html
+http://developer.android.com/reference/android/gesture/GestureOverlayView.html
+http://developer.android.com/reference/android/widget/GridView.html
http://developer.android.com/reference/android/widget/HorizontalScrollView.html
http://developer.android.com/reference/android/widget/ImageButton.html
-http://developer.android.com/reference/android/widget/ImageSwitcher.html
http://developer.android.com/reference/android/widget/MediaController.html
http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.html
-http://developer.android.com/reference/android/widget/RadioButton.html
+http://developer.android.com/reference/android/widget/QuickContactBadge.html
http://developer.android.com/reference/android/widget/RadioGroup.html
http://developer.android.com/reference/android/widget/RatingBar.html
+http://developer.android.com/reference/android/widget/ScrollView.html
http://developer.android.com/reference/android/widget/SeekBar.html
http://developer.android.com/reference/android/widget/SlidingDrawer.html
+http://developer.android.com/reference/android/widget/TabHost.html
http://developer.android.com/reference/android/widget/TabWidget.html
-http://developer.android.com/reference/android/widget/TextSwitcher.html
+http://developer.android.com/reference/android/widget/TableLayout.html
+http://developer.android.com/reference/android/widget/TableRow.html
http://developer.android.com/reference/android/widget/TimePicker.html
http://developer.android.com/reference/android/widget/ToggleButton.html
http://developer.android.com/reference/android/widget/TwoLineListItem.html
http://developer.android.com/reference/android/widget/VideoView.html
http://developer.android.com/reference/android/widget/ViewAnimator.html
+http://developer.android.com/reference/android/widget/ViewFlipper.html
+http://developer.android.com/reference/android/widget/ViewSwitcher.html
http://developer.android.com/reference/android/webkit/WebView.html
http://developer.android.com/reference/android/widget/ZoomButton.html
http://developer.android.com/reference/android/widget/ZoomControls.html
http://developer.android.com/reference/android/widget/Checkable.html
-http://developer.android.com/reference/android/os/Handler.html
+http://developer.android.com/reference/android/view/animation/Animation.html
http://developer.android.com/reference/java/lang/RuntimeException.html
+http://developer.android.com/reference/java/lang/String.html
http://developer.android.com/reference/android/util/AttributeSet.html
http://developer.android.com/reference/java/util/ArrayList.html
http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html
-http://developer.android.com/reference/android/os/IBinder.html
+http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html
+http://developer.android.com/reference/java/lang/CharSequence.html
+http://developer.android.com/reference/android/graphics/Bitmap.html
+http://developer.android.com/reference/android/graphics/Point.html
+http://developer.android.com/reference/android/content/res/Resources.html
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html
http://developer.android.com/reference/java/lang/Runnable.html
http://developer.android.com/reference/android/util/SparseArray.html
-http://developer.android.com/reference/android/os/Parcelable.html
http://developer.android.com/reference/android/content/res/TypedArray.html
-http://developer.android.com/
+http://developer.android.com/reference/java/lang/Class.html
http://developer.android.com/reference/android/widget/Scroller.html
http://developer.android.com/reference/android/os/SystemClock.html
-http://developer.android.com/reference/android/util/Printer.html
-http://developer.android.com/reference/android/util/Config.html
-http://developer.android.com/reference/android/util/DebugUtils.html
-http://developer.android.com/reference/android/util/DisplayMetrics.html
-http://developer.android.com/reference/android/util/EventLogTags.html
-http://developer.android.com/reference/android/util/EventLogTags.Description.html
-http://developer.android.com/reference/android/util/FloatMath.html
-http://developer.android.com/reference/android/util/LogPrinter.html
-http://developer.android.com/reference/android/util/MonthDisplayHelper.html
-http://developer.android.com/reference/android/util/PrintStreamPrinter.html
-http://developer.android.com/reference/android/util/PrintWriterPrinter.html
-http://developer.android.com/reference/android/util/SparseBooleanArray.html
-http://developer.android.com/reference/android/util/SparseIntArray.html
-http://developer.android.com/reference/android/util/StateSet.html
-http://developer.android.com/reference/android/util/StringBuilderPrinter.html
-http://developer.android.com/reference/android/util/TimeUtils.html
-http://developer.android.com/reference/android/util/TimingLogger.html
-http://developer.android.com/reference/android/util/TypedValue.html
-http://developer.android.com/reference/android/util/Xml.html
-http://developer.android.com/reference/android/util/Xml.Encoding.html
-http://developer.android.com/reference/android/util/AndroidException.html
-http://developer.android.com/reference/android/util/AndroidRuntimeException.html
-http://developer.android.com/reference/android/util/TimeFormatException.html
-http://developer.android.com/reference/android/util/package-descr.html
-http://developer.android.com/reference/java/lang/Math.html
-http://developer.android.com/reference/java/io/PrintStream.html
-http://developer.android.com/reference/java/io/PrintWriter.html
-http://developer.android.com/reference/java/lang/StringBuilder.html
+http://developer.android.com/reference/android/view/accessibility/AccessibilityManager.html
+http://developer.android.com/reference/java/lang/IllegalArgumentException.html
+http://developer.android.com/reference/java/lang/ref/ReferenceQueue.html
+http://developer.android.com/reference/java/lang/Throwable.html
+http://developer.android.com/reference/android/speech/tts/TextToSpeech.OnInitListener.html
+http://developer.android.com/reference/android/speech/tts/TextToSpeech.OnUtteranceCompletedListener.html
+http://developer.android.com/reference/android/speech/tts/TextToSpeech.html
+http://developer.android.com/reference/android/speech/tts/TextToSpeech.Engine.html
+http://developer.android.com/reference/org/apache/http/impl/AbstractHttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/impl/AbstractHttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultConnectionReuseStrategy.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultHttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultHttpRequestFactory.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultHttpResponseFactory.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultHttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/impl/EnglishReasonPhraseCatalog.html
+http://developer.android.com/reference/org/apache/http/impl/HttpConnectionMetricsImpl.html
+http://developer.android.com/reference/org/apache/http/impl/NoConnectionReuseStrategy.html
+http://developer.android.com/reference/org/apache/http/impl/SocketHttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/impl/SocketHttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/impl/package-descr.html
+http://developer.android.com/reference/org/apache/http/io/SessionInputBuffer.html
+http://developer.android.com/reference/org/apache/http/io/SessionOutputBuffer.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderResult.html
+http://developer.android.com/reference/java/security/cert/CertPathParameters.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorResult.html
+http://developer.android.com/reference/java/security/cert/CertSelector.html
+http://developer.android.com/reference/java/security/cert/CertStoreParameters.html
+http://developer.android.com/reference/java/security/cert/CRLSelector.html
+http://developer.android.com/reference/java/security/cert/PolicyNode.html
+http://developer.android.com/reference/java/security/cert/X509Extension.html
+http://developer.android.com/reference/java/security/cert/Certificate.html
+http://developer.android.com/reference/java/security/cert/Certificate.CertificateRep.html
+http://developer.android.com/reference/java/security/cert/CertificateFactory.html
+http://developer.android.com/reference/java/security/cert/CertificateFactorySpi.html
+http://developer.android.com/reference/java/security/cert/CertPath.html
+http://developer.android.com/reference/java/security/cert/CertPath.CertPathRep.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilder.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderSpi.html
+http://developer.android.com/reference/java/security/cert/CertPathValidator.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorSpi.html
+http://developer.android.com/reference/java/security/cert/CertStore.html
+http://developer.android.com/reference/java/security/cert/CertStoreSpi.html
+http://developer.android.com/reference/java/security/cert/CollectionCertStoreParameters.html
+http://developer.android.com/reference/java/security/cert/CRL.html
+http://developer.android.com/reference/java/security/cert/LDAPCertStoreParameters.html
+http://developer.android.com/reference/java/security/cert/PKIXBuilderParameters.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathBuilderResult.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathChecker.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathValidatorResult.html
+http://developer.android.com/reference/java/security/cert/PKIXParameters.html
+http://developer.android.com/reference/java/security/cert/PolicyQualifierInfo.html
+http://developer.android.com/reference/java/security/cert/TrustAnchor.html
+http://developer.android.com/reference/java/security/cert/X509Certificate.html
+http://developer.android.com/reference/java/security/cert/X509CertSelector.html
+http://developer.android.com/reference/java/security/cert/X509CRL.html
+http://developer.android.com/reference/java/security/cert/X509CRLEntry.html
+http://developer.android.com/reference/java/security/cert/X509CRLSelector.html
+http://developer.android.com/reference/java/security/cert/CertificateEncodingException.html
+http://developer.android.com/reference/java/security/cert/CertificateException.html
+http://developer.android.com/reference/java/security/cert/CertificateExpiredException.html
+http://developer.android.com/reference/java/security/cert/CertificateNotYetValidException.html
+http://developer.android.com/reference/java/security/cert/CertificateParsingException.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderException.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorException.html
+http://developer.android.com/reference/java/security/cert/CertStoreException.html
+http://developer.android.com/reference/java/security/cert/CRLException.html
+http://developer.android.com/reference/java/security/cert/package-descr.html
http://developer.android.com/reference/android/location/LocationManager.html
+http://developer.android.com/reference/android/os/Handler.Callback.html
+http://developer.android.com/reference/android/os/IBinder.DeathRecipient.html
+http://developer.android.com/reference/android/os/IInterface.html
+http://developer.android.com/reference/android/os/MessageQueue.IdleHandler.html
+http://developer.android.com/reference/android/os/BatteryManager.html
+http://developer.android.com/reference/android/os/Binder.html
+http://developer.android.com/reference/android/os/Build.html
+http://developer.android.com/reference/android/os/Build.VERSION.html
+http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
+http://developer.android.com/reference/android/os/Bundle.html
+http://developer.android.com/reference/android/os/ConditionVariable.html
+http://developer.android.com/reference/android/os/CountDownTimer.html
+http://developer.android.com/reference/android/os/Debug.InstructionCount.html
+http://developer.android.com/reference/android/os/Debug.MemoryInfo.html
+http://developer.android.com/reference/android/os/Environment.html
+http://developer.android.com/reference/android/os/FileObserver.html
+http://developer.android.com/reference/android/os/HandlerThread.html
+http://developer.android.com/reference/android/os/Looper.html
+http://developer.android.com/reference/android/os/MemoryFile.html
+http://developer.android.com/reference/android/os/Message.html
+http://developer.android.com/reference/android/os/MessageQueue.html
+http://developer.android.com/reference/android/os/Messenger.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseInputStream.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseOutputStream.html
+http://developer.android.com/reference/android/os/ParcelUuid.html
+http://developer.android.com/reference/android/os/PatternMatcher.html
+http://developer.android.com/reference/android/os/PowerManager.html
+http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
+http://developer.android.com/reference/android/os/Process.html
+http://developer.android.com/reference/android/os/RemoteCallbackList.html
+http://developer.android.com/reference/android/os/ResultReceiver.html
+http://developer.android.com/reference/android/os/StatFs.html
+http://developer.android.com/reference/android/os/TokenWatcher.html
+http://developer.android.com/reference/android/os/Vibrator.html
+http://developer.android.com/reference/android/os/AsyncTask.Status.html
+http://developer.android.com/reference/android/os/BadParcelableException.html
+http://developer.android.com/reference/android/os/ParcelFormatException.html
+http://developer.android.com/reference/android/os/RemoteException.html
+http://developer.android.com/reference/java/lang/Void.html
+http://developer.android.com/reference/java/util/concurrent/TimeUnit.html
+http://developer.android.com/reference/java/lang/IllegalStateException.html
+http://developer.android.com/reference/java/util/concurrent/CancellationException.html
+http://developer.android.com/reference/java/util/concurrent/ExecutionException.html
+http://developer.android.com/reference/java/lang/InterruptedException.html
+http://developer.android.com/reference/java/util/concurrent/TimeoutException.html
+http://developer.android.com/reference/java/security/spec/AlgorithmParameterSpec.html
+http://developer.android.com/reference/java/security/spec/ECField.html
+http://developer.android.com/reference/java/security/spec/KeySpec.html
+http://developer.android.com/reference/java/security/spec/DSAParameterSpec.html
+http://developer.android.com/reference/java/security/spec/DSAPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/DSAPublicKeySpec.html
+http://developer.android.com/reference/java/security/spec/ECFieldF2m.html
+http://developer.android.com/reference/java/security/spec/ECFieldFp.html
+http://developer.android.com/reference/java/security/spec/ECGenParameterSpec.html
+http://developer.android.com/reference/java/security/spec/ECParameterSpec.html
+http://developer.android.com/reference/java/security/spec/ECPoint.html
+http://developer.android.com/reference/java/security/spec/ECPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/ECPublicKeySpec.html
+http://developer.android.com/reference/java/security/spec/EllipticCurve.html
+http://developer.android.com/reference/java/security/spec/EncodedKeySpec.html
+http://developer.android.com/reference/java/security/spec/MGF1ParameterSpec.html
+http://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec.html
+http://developer.android.com/reference/java/security/spec/PSSParameterSpec.html
+http://developer.android.com/reference/java/security/spec/RSAKeyGenParameterSpec.html
+http://developer.android.com/reference/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.html
+http://developer.android.com/reference/java/security/spec/RSAOtherPrimeInfo.html
+http://developer.android.com/reference/java/security/spec/RSAPrivateCrtKeySpec.html
+http://developer.android.com/reference/java/security/spec/RSAPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/RSAPublicKeySpec.html
+http://developer.android.com/reference/java/security/spec/X509EncodedKeySpec.html
+http://developer.android.com/reference/java/security/spec/InvalidKeySpecException.html
+http://developer.android.com/reference/java/security/spec/InvalidParameterSpecException.html
+http://developer.android.com/reference/java/security/spec/package-descr.html
+http://developer.android.com/reference/android/app/Instrumentation.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/ArcShape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/OvalShape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/RectShape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/RoundRectShape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/Shape.html
+http://developer.android.com/reference/android/graphics/drawable/shapes/package-descr.html
+http://developer.android.com/reference/android/graphics/Path.html
http://developer.android.com/reference/org/apache/http/client/protocol/ClientContext.html
http://developer.android.com/reference/org/apache/http/client/protocol/ClientContextConfigurer.html
http://developer.android.com/reference/org/apache/http/client/protocol/RequestAddCookies.html
@@ -628,247 +763,369 @@
http://developer.android.com/reference/org/apache/http/client/protocol/package-descr.html
http://developer.android.com/reference/org/apache/http/protocol/HttpContext.html
http://developer.android.com/reference/org/apache/http/client/CookieStore.html
-http://developer.android.com/reference/android/net/http/SslCertificate.html
-http://developer.android.com/reference/android/net/http/SslCertificate.DName.html
-http://developer.android.com/images/widget_design/Music_widget_button_states.psd
-http://developer.android.com/images/widget_design/4x1_Widget_Frame_Portrait.psd
-http://developer.android.com/images/widget_design/3x3_Widget_Frame_Portrait.psd
-http://developer.android.com/images/widget_design/2x2_Widget_Frame_Portrait.psd
-http://developer.android.com/images/widget_design/4x1_Widget_Frame_Landscape.psd
-http://developer.android.com/images/widget_design/3x3_Widget_Frame_Landscape.psd
-http://developer.android.com/images/widget_design/2x2_Widget_Frame_Landscape.psd
-http://developer.android.com/reference/javax/security/auth/login/LoginException.html
-http://developer.android.com/reference/javax/security/auth/login/package-descr.html
-http://developer.android.com/reference/javax/security/auth/callback/Callback.html
-http://developer.android.com/reference/javax/security/auth/callback/CallbackHandler.html
-http://developer.android.com/reference/javax/security/auth/callback/PasswordCallback.html
-http://developer.android.com/reference/javax/security/auth/callback/UnsupportedCallbackException.html
-http://developer.android.com/reference/javax/security/auth/callback/package-descr.html
-http://developer.android.com/reference/org/apache/http/util/ByteArrayBuffer.html
-http://developer.android.com/reference/org/apache/http/util/CharArrayBuffer.html
-http://developer.android.com/reference/org/apache/http/util/EncodingUtils.html
-http://developer.android.com/reference/org/apache/http/util/EntityUtils.html
-http://developer.android.com/reference/org/apache/http/util/ExceptionUtils.html
-http://developer.android.com/reference/org/apache/http/util/LangUtils.html
-http://developer.android.com/reference/org/apache/http/util/VersionInfo.html
-http://developer.android.com/reference/org/apache/http/util/package-descr.html
-http://developer.android.com/reference/org/apache/http/HttpEntity.html
-http://developer.android.com/reference/android/app/DatePickerDialog.OnDateSetListener.html
-http://developer.android.com/reference/android/app/KeyguardManager.OnKeyguardExitResult.html
-http://developer.android.com/reference/android/app/PendingIntent.OnFinished.html
-http://developer.android.com/reference/android/app/SearchManager.OnCancelListener.html
-http://developer.android.com/reference/android/app/SearchManager.OnDismissListener.html
-http://developer.android.com/reference/android/app/TimePickerDialog.OnTimeSetListener.html
-http://developer.android.com/reference/android/app/ActivityGroup.html
-http://developer.android.com/reference/android/app/ActivityManager.html
-http://developer.android.com/reference/android/app/ActivityManager.MemoryInfo.html
-http://developer.android.com/reference/android/app/ActivityManager.ProcessErrorStateInfo.html
-http://developer.android.com/reference/android/app/ActivityManager.RecentTaskInfo.html
-http://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html
-http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html
-http://developer.android.com/reference/android/app/ActivityManager.RunningTaskInfo.html
-http://developer.android.com/reference/android/app/AlarmManager.html
-http://developer.android.com/reference/android/app/AlertDialog.html
-http://developer.android.com/reference/android/app/AlertDialog.Builder.html
-http://developer.android.com/reference/android/app/AliasActivity.html
-http://developer.android.com/reference/android/app/DatePickerDialog.html
-http://developer.android.com/reference/android/app/ExpandableListActivity.html
-http://developer.android.com/reference/android/app/Instrumentation.ActivityMonitor.html
-http://developer.android.com/reference/android/app/Instrumentation.ActivityResult.html
-http://developer.android.com/reference/android/app/IntentService.html
-http://developer.android.com/reference/android/app/KeyguardManager.html
-http://developer.android.com/reference/android/app/KeyguardManager.KeyguardLock.html
-http://developer.android.com/reference/android/app/LauncherActivity.html
-http://developer.android.com/reference/android/app/LauncherActivity.IconResizer.html
-http://developer.android.com/reference/android/app/LauncherActivity.ListItem.html
-http://developer.android.com/reference/android/app/ListActivity.html
-http://developer.android.com/reference/android/app/LocalActivityManager.html
-http://developer.android.com/reference/android/app/Notification.html
-http://developer.android.com/reference/android/app/PendingIntent.html
-http://developer.android.com/reference/android/app/ProgressDialog.html
-http://developer.android.com/reference/android/app/SearchManager.html
-http://developer.android.com/reference/android/app/TabActivity.html
-http://developer.android.com/reference/android/app/TimePickerDialog.html
-http://developer.android.com/reference/android/app/PendingIntent.CanceledException.html
-http://developer.android.com/reference/android/content/ContextWrapper.html
-http://developer.android.com/reference/android/content/ComponentCallbacks.html
-http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.html
-http://developer.android.com/reference/android/media/AudioManager.html
-http://developer.android.com/reference/android/text/ClipboardManager.html
-http://developer.android.com/reference/android/net/ConnectivityManager.html
-http://developer.android.com/reference/android/os/PowerManager.html
-http://developer.android.com/reference/android/hardware/SensorManager.html
-http://developer.android.com/reference/android/telephony/TelephonyManager.html
-http://developer.android.com/reference/android/os/Vibrator.html
-http://developer.android.com/reference/android/net/wifi/WifiManager.html
-http://developer.android.com/reference/android/content/res/Configuration.html
-http://developer.android.com/reference/java/io/FileDescriptor.html
-http://developer.android.com/reference/android/content/ServiceConnection.html
-http://developer.android.com/reference/android/content/res/AssetManager.html
-http://developer.android.com/reference/java/io/File.html
-http://developer.android.com/reference/java/lang/ClassLoader.html
-http://developer.android.com/reference/android/os/Looper.html
-http://developer.android.com/reference/android/content/SharedPreferences.html
-http://developer.android.com/reference/android/content/res/Resources.Theme.html
-http://developer.android.com/reference/java/io/FileInputStream.html
-http://developer.android.com/reference/java/io/FileOutputStream.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.CursorFactory.html
-http://developer.android.com/reference/android/content/IntentFilter.html
-http://developer.android.com/reference/android/os/Bundle.html
-http://developer.android.com/reference/android/content/ComponentName.html
-http://developer.android.com/reference/java/util/Formatter.html
-http://developer.android.com/sdk/1.1_r1/installing.html
-http://developer.android.com/reference/java/util/zip/Checksum.html
-http://developer.android.com/reference/java/util/zip/Adler32.html
-http://developer.android.com/reference/java/util/zip/CheckedInputStream.html
-http://developer.android.com/reference/java/util/zip/CheckedOutputStream.html
-http://developer.android.com/reference/java/util/zip/CRC32.html
-http://developer.android.com/reference/java/util/zip/Deflater.html
-http://developer.android.com/reference/java/util/zip/DeflaterOutputStream.html
-http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
-http://developer.android.com/reference/java/util/zip/GZIPOutputStream.html
-http://developer.android.com/reference/java/util/zip/Inflater.html
-http://developer.android.com/reference/java/util/zip/InflaterInputStream.html
-http://developer.android.com/reference/java/util/zip/ZipEntry.html
-http://developer.android.com/reference/java/util/zip/ZipFile.html
-http://developer.android.com/reference/java/util/zip/ZipInputStream.html
-http://developer.android.com/reference/java/util/zip/ZipOutputStream.html
-http://developer.android.com/reference/java/util/zip/DataFormatException.html
-http://developer.android.com/reference/java/util/zip/ZipException.html
-http://developer.android.com/reference/java/util/zip/package-descr.html
-http://developer.android.com/reference/javax/crypto/interfaces/DHKey.html
-http://developer.android.com/reference/javax/crypto/interfaces/DHPrivateKey.html
-http://developer.android.com/reference/javax/crypto/interfaces/DHPublicKey.html
-http://developer.android.com/reference/javax/crypto/interfaces/PBEKey.html
-http://developer.android.com/reference/javax/crypto/interfaces/package-descr.html
-http://developer.android.com/sdk/1.1_r1/upgrading.html
-http://developer.android.com/sdk/1.0_r2/upgrading.html
-http://developer.android.com/sdk/1.0_r2/installing.html
-http://developer.android.com/sdk/1.0_r1/upgrading.html
-http://developer.android.com/sdk/1.0_r1/installing.html
-http://developer.android.com/guide/tutorials/views/hello-formstuff.html
-http://developer.android.com/reference/java/net/ContentHandlerFactory.html
-http://developer.android.com/reference/java/net/DatagramSocketImplFactory.html
-http://developer.android.com/reference/java/net/FileNameMap.html
-http://developer.android.com/reference/java/net/SocketImplFactory.html
-http://developer.android.com/reference/java/net/SocketOptions.html
-http://developer.android.com/reference/java/net/URLStreamHandlerFactory.html
-http://developer.android.com/reference/java/net/Authenticator.html
-http://developer.android.com/reference/java/net/CacheRequest.html
-http://developer.android.com/reference/java/net/CacheResponse.html
-http://developer.android.com/reference/java/net/ContentHandler.html
-http://developer.android.com/reference/java/net/CookieHandler.html
-http://developer.android.com/reference/java/net/DatagramPacket.html
-http://developer.android.com/reference/java/net/DatagramSocket.html
-http://developer.android.com/reference/java/net/DatagramSocketImpl.html
-http://developer.android.com/reference/java/net/HttpURLConnection.html
-http://developer.android.com/reference/java/net/Inet4Address.html
-http://developer.android.com/reference/java/net/Inet6Address.html
-http://developer.android.com/reference/java/net/InetAddress.html
-http://developer.android.com/reference/java/net/InetSocketAddress.html
-http://developer.android.com/reference/java/net/JarURLConnection.html
-http://developer.android.com/reference/java/net/MulticastSocket.html
-http://developer.android.com/reference/java/net/NetPermission.html
-http://developer.android.com/reference/java/net/NetworkInterface.html
-http://developer.android.com/reference/java/net/PasswordAuthentication.html
-http://developer.android.com/reference/java/net/Proxy.html
-http://developer.android.com/reference/java/net/ProxySelector.html
-http://developer.android.com/reference/java/net/ResponseCache.html
-http://developer.android.com/reference/java/net/SecureCacheResponse.html
-http://developer.android.com/reference/java/net/ServerSocket.html
-http://developer.android.com/reference/java/net/Socket.html
-http://developer.android.com/reference/java/net/SocketAddress.html
-http://developer.android.com/reference/java/net/SocketImpl.html
-http://developer.android.com/reference/java/net/SocketPermission.html
-http://developer.android.com/reference/java/net/URI.html
-http://developer.android.com/reference/java/net/URL.html
-http://developer.android.com/reference/java/net/URLClassLoader.html
-http://developer.android.com/reference/java/net/URLConnection.html
-http://developer.android.com/reference/java/net/URLDecoder.html
-http://developer.android.com/reference/java/net/URLEncoder.html
-http://developer.android.com/reference/java/net/URLStreamHandler.html
-http://developer.android.com/reference/java/net/Authenticator.RequestorType.html
-http://developer.android.com/reference/java/net/Proxy.Type.html
-http://developer.android.com/reference/java/net/BindException.html
-http://developer.android.com/reference/java/net/ConnectException.html
-http://developer.android.com/reference/java/net/HttpRetryException.html
-http://developer.android.com/reference/java/net/MalformedURLException.html
-http://developer.android.com/reference/java/net/NoRouteToHostException.html
-http://developer.android.com/reference/java/net/PortUnreachableException.html
-http://developer.android.com/reference/java/net/ProtocolException.html
-http://developer.android.com/reference/java/net/SocketException.html
-http://developer.android.com/reference/java/net/SocketTimeoutException.html
-http://developer.android.com/reference/java/net/UnknownHostException.html
-http://developer.android.com/reference/java/net/UnknownServiceException.html
-http://developer.android.com/reference/java/net/URISyntaxException.html
-http://developer.android.com/reference/java/net/package-descr.html
-http://developer.android.com/reference/android/graphics/drawable/ClipDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/ColorDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html
-http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.html
-http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.DrawableContainerState.html
-http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/PaintDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/RotateDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/ScaleDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.ShaderFactory.html
-http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.Orientation.html
-http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractInterruptibleChannel.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectableChannel.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectionKey.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelector.html
+http://developer.android.com/reference/java/nio/channels/spi/SelectorProvider.html
+http://developer.android.com/reference/java/nio/channels/spi/package-descr.html
+http://developer.android.com/reference/java/nio/channels/DatagramChannel.html
+http://developer.android.com/reference/java/nio/channels/Pipe.html
+http://developer.android.com/reference/java/nio/channels/Selector.html
+http://developer.android.com/reference/java/nio/channels/ServerSocketChannel.html
+http://developer.android.com/reference/java/nio/channels/SocketChannel.html
+http://developer.android.com/reference/android/content/pm/PackageItemInfo.html
+http://developer.android.com/reference/android/location/Geocoder.html
+http://developer.android.com/reference/android/media/SoundPool.html
+http://developer.android.com/reference/android/graphics/AvoidXfermode.html
+http://developer.android.com/reference/android/graphics/BitmapFactory.html
+http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
+http://developer.android.com/reference/android/graphics/BitmapShader.html
+http://developer.android.com/reference/android/graphics/BlurMaskFilter.html
+http://developer.android.com/reference/android/graphics/Camera.html
+http://developer.android.com/reference/android/graphics/Color.html
+http://developer.android.com/reference/android/graphics/ColorFilter.html
+http://developer.android.com/reference/android/graphics/ColorMatrix.html
+http://developer.android.com/reference/android/graphics/ColorMatrixColorFilter.html
+http://developer.android.com/reference/android/graphics/ComposePathEffect.html
+http://developer.android.com/reference/android/graphics/ComposeShader.html
+http://developer.android.com/reference/android/graphics/CornerPathEffect.html
+http://developer.android.com/reference/android/graphics/DashPathEffect.html
+http://developer.android.com/reference/android/graphics/DiscretePathEffect.html
+http://developer.android.com/reference/android/graphics/DrawFilter.html
+http://developer.android.com/reference/android/graphics/EmbossMaskFilter.html
+http://developer.android.com/reference/android/graphics/Interpolator.html
+http://developer.android.com/reference/android/graphics/LayerRasterizer.html
+http://developer.android.com/reference/android/graphics/LightingColorFilter.html
+http://developer.android.com/reference/android/graphics/LinearGradient.html
+http://developer.android.com/reference/android/graphics/MaskFilter.html
+http://developer.android.com/reference/android/graphics/Matrix.html
+http://developer.android.com/reference/android/graphics/Movie.html
+http://developer.android.com/reference/android/graphics/NinePatch.html
+http://developer.android.com/reference/android/graphics/Paint.html
+http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html
+http://developer.android.com/reference/android/graphics/Paint.FontMetricsInt.html
+http://developer.android.com/reference/android/graphics/PaintFlagsDrawFilter.html
+http://developer.android.com/reference/android/graphics/PathDashPathEffect.html
+http://developer.android.com/reference/android/graphics/PathEffect.html
+http://developer.android.com/reference/android/graphics/PathMeasure.html
+http://developer.android.com/reference/android/graphics/Picture.html
+http://developer.android.com/reference/android/graphics/PixelFormat.html
+http://developer.android.com/reference/android/graphics/PixelXorXfermode.html
+http://developer.android.com/reference/android/graphics/PointF.html
+http://developer.android.com/reference/android/graphics/PorterDuff.html
+http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html
+http://developer.android.com/reference/android/graphics/PorterDuffXfermode.html
+http://developer.android.com/reference/android/graphics/RadialGradient.html
+http://developer.android.com/reference/android/graphics/Rasterizer.html
+http://developer.android.com/reference/android/graphics/RectF.html
+http://developer.android.com/reference/android/graphics/Region.html
+http://developer.android.com/reference/android/graphics/RegionIterator.html
+http://developer.android.com/reference/android/graphics/Shader.html
+http://developer.android.com/reference/android/graphics/SumPathEffect.html
+http://developer.android.com/reference/android/graphics/SweepGradient.html
+http://developer.android.com/reference/android/graphics/Typeface.html
+http://developer.android.com/reference/android/graphics/Xfermode.html
+http://developer.android.com/reference/android/graphics/AvoidXfermode.Mode.html
+http://developer.android.com/reference/android/graphics/Bitmap.CompressFormat.html
+http://developer.android.com/reference/android/graphics/Bitmap.Config.html
+http://developer.android.com/reference/android/graphics/BlurMaskFilter.Blur.html
+http://developer.android.com/reference/android/graphics/Canvas.EdgeType.html
+http://developer.android.com/reference/android/graphics/Canvas.VertexMode.html
+http://developer.android.com/reference/android/graphics/Interpolator.Result.html
+http://developer.android.com/reference/android/graphics/Matrix.ScaleToFit.html
+http://developer.android.com/reference/android/graphics/Paint.Align.html
+http://developer.android.com/reference/android/graphics/Paint.Cap.html
+http://developer.android.com/reference/android/graphics/Paint.Join.html
+http://developer.android.com/reference/android/graphics/Paint.Style.html
+http://developer.android.com/reference/android/graphics/Path.Direction.html
+http://developer.android.com/reference/android/graphics/Path.FillType.html
+http://developer.android.com/reference/android/graphics/PathDashPathEffect.Style.html
+http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
+http://developer.android.com/reference/android/graphics/Region.Op.html
+http://developer.android.com/reference/android/graphics/Shader.TileMode.html
+http://developer.android.com/reference/android/graphics/package-descr.html
+http://developer.android.com/reference/android/text/util/Linkify.MatchFilter.html
+http://developer.android.com/reference/android/text/util/Linkify.TransformFilter.html
+http://developer.android.com/reference/android/text/util/Linkify.html
+http://developer.android.com/reference/android/text/util/Rfc822Token.html
+http://developer.android.com/reference/android/text/util/Rfc822Tokenizer.html
+http://developer.android.com/reference/android/text/util/package-descr.html
+http://developer.android.com/reference/android/text/method/MetaKeyKeyListener.html
+http://developer.android.com/reference/android/widget/AbsListView.OnScrollListener.html
+http://developer.android.com/reference/android/widget/AbsListView.RecyclerListener.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemLongClickListener.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html
+http://developer.android.com/reference/android/widget/AutoCompleteTextView.Validator.html
+http://developer.android.com/reference/android/widget/Chronometer.OnChronometerTickListener.html
+http://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html
+http://developer.android.com/reference/android/widget/DatePicker.OnDateChangedListener.html
+http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnChildClickListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupClickListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupCollapseListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupExpandListener.html
+http://developer.android.com/reference/android/widget/Filter.FilterListener.html
+http://developer.android.com/reference/android/widget/Filterable.html
+http://developer.android.com/reference/android/widget/FilterQueryProvider.html
+http://developer.android.com/reference/android/widget/ListAdapter.html
+http://developer.android.com/reference/android/widget/MediaController.MediaPlayerControl.html
+http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.Tokenizer.html
+http://developer.android.com/reference/android/widget/PopupWindow.OnDismissListener.html
+http://developer.android.com/reference/android/widget/RadioGroup.OnCheckedChangeListener.html
+http://developer.android.com/reference/android/widget/RatingBar.OnRatingBarChangeListener.html
+http://developer.android.com/reference/android/widget/SectionIndexer.html
+http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.html
+http://developer.android.com/reference/android/widget/SimpleAdapter.ViewBinder.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.CursorToStringConverter.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
+http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.ViewBinder.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerCloseListener.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerOpenListener.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerScrollListener.html
+http://developer.android.com/reference/android/widget/SpinnerAdapter.html
+http://developer.android.com/reference/android/widget/TabHost.OnTabChangeListener.html
+http://developer.android.com/reference/android/widget/TabHost.TabContentFactory.html
+http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html
+http://developer.android.com/reference/android/widget/TimePicker.OnTimeChangedListener.html
+http://developer.android.com/reference/android/widget/ViewSwitcher.ViewFactory.html
+http://developer.android.com/reference/android/widget/WrapperListAdapter.html
+http://developer.android.com/reference/android/widget/ZoomButtonsController.OnZoomListener.html
+http://developer.android.com/reference/android/widget/AbsListView.LayoutParams.html
+http://developer.android.com/reference/android/widget/AbsoluteLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
+http://developer.android.com/reference/android/widget/AlphabetIndexer.html
+http://developer.android.com/reference/android/widget/ArrayAdapter.html
+http://developer.android.com/reference/android/widget/BaseAdapter.html
+http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
+http://developer.android.com/reference/android/widget/CursorAdapter.html
+http://developer.android.com/reference/android/widget/CursorTreeAdapter.html
+http://developer.android.com/reference/android/widget/ExpandableListView.ExpandableListContextMenuInfo.html
+http://developer.android.com/reference/android/widget/Filter.html
+http://developer.android.com/reference/android/widget/Filter.FilterResults.html
+http://developer.android.com/reference/android/widget/FrameLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/Gallery.LayoutParams.html
+http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html
+http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/ListView.FixedViewInfo.html
+http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.CommaTokenizer.html
+http://developer.android.com/reference/android/widget/PopupWindow.html
+http://developer.android.com/reference/android/widget/RadioGroup.LayoutParams.html
+http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/RemoteViews.html
+http://developer.android.com/reference/android/widget/ResourceCursorAdapter.html
+http://developer.android.com/reference/android/widget/ResourceCursorTreeAdapter.html
+http://developer.android.com/reference/android/widget/SimpleAdapter.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
+http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
+http://developer.android.com/reference/android/widget/SimpleExpandableListAdapter.html
+http://developer.android.com/reference/android/widget/TabHost.TabSpec.html
+http://developer.android.com/reference/android/widget/TableLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html
+http://developer.android.com/reference/android/widget/TextView.SavedState.html
+http://developer.android.com/reference/android/widget/Toast.html
+http://developer.android.com/reference/android/widget/ZoomButtonsController.html
+http://developer.android.com/reference/android/widget/ImageView.ScaleType.html
+http://developer.android.com/reference/android/widget/TextView.BufferType.html
+http://developer.android.com/reference/android/widget/RemoteViews.ActionException.html
+http://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html
+http://developer.android.com/reference/android/view/inputmethod/ExtractedTextRequest.html
+http://developer.android.com/reference/android/view/inputmethod/ExtractedText.html
+http://developer.android.com/reference/android/content/res/ColorStateList.html
+http://developer.android.com/reference/android/text/method/KeyListener.html
+http://developer.android.com/reference/android/text/method/LinkMovementMethod.html
+http://developer.android.com/reference/android/text/method/MovementMethod.html
+http://developer.android.com/reference/android/text/method/TransformationMethod.html
+http://developer.android.com/reference/android/text/style/URLSpan.html
+http://developer.android.com/reference/android/view/inputmethod/CompletionInfo.html
+http://developer.android.com/reference/android/R.id.html
http://developer.android.com/reference/org/xmlpull/v1/XmlPullParserException.html
http://developer.android.com/reference/java/io/IOException.html
-http://developer.android.com/reference/android/content/DialogInterface.html
-http://developer.android.com/reference/android/content/DialogInterface.OnCancelListener.html
-http://developer.android.com/reference/android/content/DialogInterface.OnClickListener.html
-http://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html
-http://developer.android.com/reference/android/content/DialogInterface.OnKeyListener.html
-http://developer.android.com/reference/android/content/DialogInterface.OnMultiChoiceClickListener.html
-http://developer.android.com/reference/android/content/SharedPreferences.Editor.html
-http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html
-http://developer.android.com/reference/android/content/AsyncQueryHandler.html
-http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerArgs.html
-http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerHandler.html
-http://developer.android.com/reference/android/content/ContentQueryMap.html
-http://developer.android.com/reference/android/content/Intent.FilterComparison.html
-http://developer.android.com/reference/android/content/Intent.ShortcutIconResource.html
-http://developer.android.com/reference/android/content/IntentFilter.AuthorityEntry.html
-http://developer.android.com/reference/android/content/MutableContextWrapper.html
-http://developer.android.com/reference/android/content/SearchRecentSuggestionsProvider.html
-http://developer.android.com/reference/android/content/UriMatcher.html
-http://developer.android.com/reference/android/content/ActivityNotFoundException.html
-http://developer.android.com/reference/android/content/IntentFilter.MalformedMimeTypeException.html
-http://developer.android.com/reference/android/content/ReceiverCallNotAllowedException.html
-http://developer.android.com/reference/android/test/mock/MockContext.html
-http://developer.android.com/reference/android/test/mock/MockApplication.html
-http://developer.android.com/reference/android/preference/PreferenceActivity.html
-http://developer.android.com/reference/android/preference/Preference.html
-http://developer.android.com/reference/android/os/Binder.html
-http://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html
+http://developer.android.com/reference/android/util/TypedValue.html
+http://developer.android.com/reference/org/apache/http/io/HttpMessageParser.html
+http://developer.android.com/reference/org/apache/http/io/HttpMessageWriter.html
+http://developer.android.com/reference/org/apache/http/io/HttpTransportMetrics.html
+http://developer.android.com/reference/org/apache/http/io/package-descr.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManager.html
+http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoute.html
+http://developer.android.com/reference/org/apache/http/params/HttpParams.html
+http://developer.android.com/reference/org/apache/http/HttpHost.html
+http://developer.android.com/reference/java/net/InetAddress.html
+http://developer.android.com/reference/org/apache/http/HttpConnectionMetrics.html
+http://developer.android.com/reference/javax/net/ssl/SSLSession.html
+http://developer.android.com/reference/org/apache/http/HttpResponse.html
+http://developer.android.com/reference/org/apache/http/HttpEntityEnclosingRequest.html
+http://developer.android.com/reference/org/apache/http/HttpRequest.html
+http://developer.android.com/reference/org/apache/http/HttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/HttpConnection.html
+http://developer.android.com/reference/org/apache/http/HttpInetConnection.html
+http://developer.android.com/reference/org/apache/http/conn/ConnectionReleaseTrigger.html
+http://developer.android.com/reference/android/content/res/XmlResourceParser.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseInputStream.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseOutputStream.html
+http://developer.android.com/reference/android/content/res/AssetManager.html
+http://developer.android.com/reference/android/content/res/AssetManager.AssetInputStream.html
+http://developer.android.com/reference/android/content/res/Configuration.html
+http://developer.android.com/reference/android/content/res/Resources.Theme.html
http://developer.android.com/reference/android/content/res/Resources.NotFoundException.html
-http://developer.android.com/reference/java/io/FileNotFoundException.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteException.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/ArcShape.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/RectShape.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/RoundRectShape.html
-http://developer.android.com/reference/android/graphics/drawable/shapes/Shape.html
-http://developer.android.com/reference/java/lang/annotation/Annotation.html
-http://developer.android.com/reference/java/lang/annotation/ElementType.html
-http://developer.android.com/reference/java/lang/annotation/RetentionPolicy.html
-http://developer.android.com/reference/java/lang/annotation/AnnotationTypeMismatchException.html
-http://developer.android.com/reference/java/lang/annotation/IncompleteAnnotationException.html
-http://developer.android.com/reference/java/lang/annotation/AnnotationFormatError.html
-http://developer.android.com/reference/java/lang/annotation/package-descr.html
-http://developer.android.com/reference/java/lang/ref/PhantomReference.html
-http://developer.android.com/reference/java/lang/ref/Reference.html
-http://developer.android.com/reference/java/lang/ref/SoftReference.html
-http://developer.android.com/reference/java/lang/ref/WeakReference.html
+http://developer.android.com/reference/android/test/mock/MockResources.html
+http://developer.android.com/reference/android/util/DisplayMetrics.html
+http://developer.android.com/reference/java/util/Formatter.html
+http://developer.android.com/reference/java/io/InputStream.html
+http://developer.android.com/reference/android/accounts/AccountAuthenticatorActivity.html
+http://developer.android.com/reference/android/app/ActivityGroup.html
+http://developer.android.com/reference/android/app/AlertDialog.html
+http://developer.android.com/reference/android/text/method/CharacterPickerDialog.html
+http://developer.android.com/reference/android/app/DatePickerDialog.html
+http://developer.android.com/reference/android/app/Dialog.html
+http://developer.android.com/reference/android/app/ExpandableListActivity.html
+http://developer.android.com/reference/android/app/LauncherActivity.html
+http://developer.android.com/reference/android/preference/PreferenceActivity.html
+http://developer.android.com/reference/android/app/ProgressDialog.html
+http://developer.android.com/reference/android/app/TabActivity.html
+http://developer.android.com/reference/android/app/TimePickerDialog.html
+http://developer.android.com/reference/android/preference/Preference.html
+http://developer.android.com/reference/android/view/animation/Interpolator.html
+http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-hdpi-v6/index.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-ldpi-v6/index.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi-v6/index.html
+http://developer.android.com/resources/samples/NotePad/res/layout/index.html
+http://developer.android.com/resources/samples/NotePad/res/values/index.html
+http://developer.android.com/reference/org/apache/http/client/methods/AbortableHttpRequest.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpUriRequest.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpDelete.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpEntityEnclosingRequestBase.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpGet.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpHead.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpOptions.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpPost.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpPut.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpRequestBase.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpTrace.html
+http://developer.android.com/reference/org/apache/http/client/methods/package-descr.html
+http://developer.android.com/reference/java/util/concurrent/BlockingQueue.html
+http://developer.android.com/reference/java/util/concurrent/Callable.html
+http://developer.android.com/reference/java/util/concurrent/CompletionService.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html
+http://developer.android.com/reference/java/util/concurrent/Delayed.html
+http://developer.android.com/reference/java/util/concurrent/Executor.html
+http://developer.android.com/reference/java/util/concurrent/ExecutorService.html
+http://developer.android.com/reference/java/util/concurrent/Future.html
+http://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledFuture.html
+http://developer.android.com/reference/java/util/concurrent/ThreadFactory.html
+http://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html
+http://developer.android.com/reference/java/util/concurrent/ArrayBlockingQueue.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html
+http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArrayList.html
+http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArraySet.html
+http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html
+http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html
+http://developer.android.com/reference/java/util/concurrent/DelayQueue.html
+http://developer.android.com/reference/java/util/concurrent/Exchanger.html
+http://developer.android.com/reference/java/util/concurrent/ExecutorCompletionService.html
+http://developer.android.com/reference/java/util/concurrent/Executors.html
+http://developer.android.com/reference/java/util/concurrent/FutureTask.html
+http://developer.android.com/reference/java/util/concurrent/LinkedBlockingQueue.html
+http://developer.android.com/reference/java/util/concurrent/PriorityBlockingQueue.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html
+http://developer.android.com/reference/java/util/concurrent/Semaphore.html
+http://developer.android.com/reference/java/util/concurrent/SynchronousQueue.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.AbortPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.CallerRunsPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardOldestPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardPolicy.html
+http://developer.android.com/reference/java/util/concurrent/BrokenBarrierException.html
+http://developer.android.com/reference/java/util/concurrent/RejectedExecutionException.html
+http://developer.android.com/reference/java/lang/Exception.html
+http://developer.android.com/reference/java/lang/StackTraceElement.html
+http://developer.android.com/reference/java/io/PrintWriter.html
+http://developer.android.com/reference/java/io/PrintStream.html
+http://developer.android.com/reference/java/lang/Enum.html
+http://developer.android.com/reference/java/lang/Comparable.html
+http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html
+http://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator.html
+http://developer.android.com/reference/android/view/animation/AccelerateInterpolator.html
+http://developer.android.com/reference/android/view/animation/AlphaAnimation.html
+http://developer.android.com/reference/android/view/animation/Animation.Description.html
+http://developer.android.com/reference/android/view/animation/AnimationSet.html
+http://developer.android.com/reference/android/view/animation/AnimationUtils.html
+http://developer.android.com/reference/android/view/animation/AnticipateInterpolator.html
+http://developer.android.com/reference/android/view/animation/AnticipateOvershootInterpolator.html
+http://developer.android.com/reference/android/view/animation/BounceInterpolator.html
+http://developer.android.com/reference/android/view/animation/CycleInterpolator.html
+http://developer.android.com/reference/android/view/animation/DecelerateInterpolator.html
+http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.html
+http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.AnimationParameters.html
+http://developer.android.com/reference/android/view/animation/LayoutAnimationController.html
+http://developer.android.com/reference/android/view/animation/LayoutAnimationController.AnimationParameters.html
+http://developer.android.com/reference/android/view/animation/LinearInterpolator.html
+http://developer.android.com/reference/android/view/animation/OvershootInterpolator.html
+http://developer.android.com/reference/android/view/animation/RotateAnimation.html
+http://developer.android.com/reference/android/view/animation/ScaleAnimation.html
+http://developer.android.com/reference/android/view/animation/Transformation.html
+http://developer.android.com/reference/android/view/animation/TranslateAnimation.html
+http://developer.android.com/reference/android/view/animation/package-descr.html
+http://developer.android.com/reference/android/widget/package-descr.html
+http://developer.android.com/reference/android/database/Cursor.html
+http://developer.android.com/reference/java/security/PublicKey.html
+http://developer.android.com/reference/java/lang/NullPointerException.html
+http://developer.android.com/reference/javax/security/auth/Destroyable.html
+http://developer.android.com/reference/javax/security/auth/AuthPermission.html
+http://developer.android.com/reference/javax/security/auth/PrivateCredentialPermission.html
+http://developer.android.com/reference/javax/security/auth/Subject.html
+http://developer.android.com/reference/javax/security/auth/SubjectDomainCombiner.html
+http://developer.android.com/reference/javax/security/auth/DestroyFailedException.html
+http://developer.android.com/reference/javax/security/auth/package-descr.html
+http://developer.android.com/reference/java/util/logging/Filter.html
+http://developer.android.com/reference/java/util/logging/LoggingMXBean.html
+http://developer.android.com/reference/java/util/logging/ConsoleHandler.html
+http://developer.android.com/reference/java/util/logging/ErrorManager.html
+http://developer.android.com/reference/java/util/logging/FileHandler.html
+http://developer.android.com/reference/java/util/logging/Formatter.html
+http://developer.android.com/reference/java/util/logging/Handler.html
+http://developer.android.com/reference/java/util/logging/Level.html
+http://developer.android.com/reference/java/util/logging/Logger.html
+http://developer.android.com/reference/java/util/logging/LoggingPermission.html
+http://developer.android.com/reference/java/util/logging/LogManager.html
+http://developer.android.com/reference/java/util/logging/LogRecord.html
+http://developer.android.com/reference/java/util/logging/MemoryHandler.html
+http://developer.android.com/reference/java/util/logging/SimpleFormatter.html
+http://developer.android.com/reference/java/util/logging/SocketHandler.html
+http://developer.android.com/reference/java/util/logging/StreamHandler.html
+http://developer.android.com/reference/java/util/logging/XMLFormatter.html
+http://developer.android.com/reference/java/util/logging/package-descr.html
+http://developer.android.com/reference/java/io/OutputStream.html
+http://developer.android.com/reference/android/Manifest.html
+http://developer.android.com/reference/android/R.html
+http://developer.android.com/reference/android/R.anim.html
+http://developer.android.com/reference/android/R.array.html
+http://developer.android.com/reference/android/R.bool.html
+http://developer.android.com/reference/android/R.color.html
+http://developer.android.com/reference/android/R.dimen.html
+http://developer.android.com/reference/android/R.drawable.html
+http://developer.android.com/reference/android/R.integer.html
+http://developer.android.com/reference/android/R.layout.html
+http://developer.android.com/reference/android/R.plurals.html
+http://developer.android.com/reference/android/R.raw.html
+http://developer.android.com/reference/android/R.string.html
+http://developer.android.com/reference/android/R.xml.html
+http://developer.android.com/reference/android/media/MediaPlayer.html
+http://developer.android.com/reference/android/media/MediaRecorder.html
+http://developer.android.com/reference/android/media/JetPlayer.html
+http://developer.android.com/guide/topics/media/jet/jetcreator_manual.html
+http://developer.android.com/reference/android/content/ContentValues.html
http://developer.android.com/reference/java/lang/Appendable.html
http://developer.android.com/reference/java/lang/Cloneable.html
-http://developer.android.com/reference/java/lang/Comparable.html
http://developer.android.com/reference/java/lang/Iterable.html
http://developer.android.com/reference/java/lang/Readable.html
http://developer.android.com/reference/java/lang/Thread.UncaughtExceptionHandler.html
@@ -877,13 +1134,14 @@
http://developer.android.com/reference/java/lang/Character.html
http://developer.android.com/reference/java/lang/Character.Subset.html
http://developer.android.com/reference/java/lang/Character.UnicodeBlock.html
+http://developer.android.com/reference/java/lang/ClassLoader.html
http://developer.android.com/reference/java/lang/Compiler.html
http://developer.android.com/reference/java/lang/Double.html
-http://developer.android.com/reference/java/lang/Enum.html
http://developer.android.com/reference/java/lang/Float.html
http://developer.android.com/reference/java/lang/InheritableThreadLocal.html
http://developer.android.com/reference/java/lang/Integer.html
http://developer.android.com/reference/java/lang/Long.html
+http://developer.android.com/reference/java/lang/Math.html
http://developer.android.com/reference/java/lang/Number.html
http://developer.android.com/reference/java/lang/Package.html
http://developer.android.com/reference/java/lang/Process.html
@@ -892,14 +1150,13 @@
http://developer.android.com/reference/java/lang/RuntimePermission.html
http://developer.android.com/reference/java/lang/SecurityManager.html
http://developer.android.com/reference/java/lang/Short.html
-http://developer.android.com/reference/java/lang/StackTraceElement.html
http://developer.android.com/reference/java/lang/StrictMath.html
http://developer.android.com/reference/java/lang/StringBuffer.html
+http://developer.android.com/reference/java/lang/StringBuilder.html
http://developer.android.com/reference/java/lang/System.html
http://developer.android.com/reference/java/lang/Thread.html
http://developer.android.com/reference/java/lang/ThreadGroup.html
http://developer.android.com/reference/java/lang/ThreadLocal.html
-http://developer.android.com/reference/java/lang/Void.html
http://developer.android.com/reference/java/lang/Thread.State.html
http://developer.android.com/reference/java/lang/ArithmeticException.html
http://developer.android.com/reference/java/lang/ArrayIndexOutOfBoundsException.html
@@ -908,19 +1165,14 @@
http://developer.android.com/reference/java/lang/ClassNotFoundException.html
http://developer.android.com/reference/java/lang/CloneNotSupportedException.html
http://developer.android.com/reference/java/lang/EnumConstantNotPresentException.html
-http://developer.android.com/reference/java/lang/Exception.html
http://developer.android.com/reference/java/lang/IllegalAccessException.html
-http://developer.android.com/reference/java/lang/IllegalArgumentException.html
http://developer.android.com/reference/java/lang/IllegalMonitorStateException.html
-http://developer.android.com/reference/java/lang/IllegalStateException.html
http://developer.android.com/reference/java/lang/IllegalThreadStateException.html
http://developer.android.com/reference/java/lang/IndexOutOfBoundsException.html
http://developer.android.com/reference/java/lang/InstantiationException.html
-http://developer.android.com/reference/java/lang/InterruptedException.html
http://developer.android.com/reference/java/lang/NegativeArraySizeException.html
http://developer.android.com/reference/java/lang/NoSuchFieldException.html
http://developer.android.com/reference/java/lang/NoSuchMethodException.html
-http://developer.android.com/reference/java/lang/NullPointerException.html
http://developer.android.com/reference/java/lang/NumberFormatException.html
http://developer.android.com/reference/java/lang/StringIndexOutOfBoundsException.html
http://developer.android.com/reference/java/lang/TypeNotPresentException.html
@@ -947,46 +1199,90 @@
http://developer.android.com/reference/java/lang/UnsupportedClassVersionError.html
http://developer.android.com/reference/java/lang/VerifyError.html
http://developer.android.com/reference/java/lang/VirtualMachineError.html
+http://developer.android.com/reference/java/nio/channels/AlreadyConnectedException.html
+http://developer.android.com/reference/java/nio/channels/CancelledKeyException.html
+http://developer.android.com/reference/java/nio/channels/ClosedSelectorException.html
+http://developer.android.com/reference/java/nio/channels/ConnectionPendingException.html
+http://developer.android.com/reference/java/util/FormatterClosedException.html
+http://developer.android.com/reference/java/nio/channels/IllegalBlockingModeException.html
+http://developer.android.com/reference/java/nio/InvalidMarkException.html
+http://developer.android.com/reference/java/nio/channels/NoConnectionPendingException.html
+http://developer.android.com/reference/java/nio/channels/NonReadableChannelException.html
+http://developer.android.com/reference/java/nio/channels/NonWritableChannelException.html
+http://developer.android.com/reference/java/nio/channels/NotYetBoundException.html
+http://developer.android.com/reference/java/nio/channels/NotYetConnectedException.html
+http://developer.android.com/reference/java/nio/channels/OverlappingFileLockException.html
+http://developer.android.com/reference/org/apache/http/protocol/ExecutionContext.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpExpectationVerifier.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpProcessor.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandler.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerResolver.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestInterceptorList.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpResponseInterceptorList.html
+http://developer.android.com/reference/org/apache/http/protocol/BasicHttpContext.html
+http://developer.android.com/reference/org/apache/http/protocol/BasicHttpProcessor.html
+http://developer.android.com/reference/org/apache/http/protocol/DefaultedHttpContext.html
+http://developer.android.com/reference/org/apache/http/protocol/HTTP.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpDateGenerator.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestExecutor.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerRegistry.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpService.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestConnControl.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestContent.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestDate.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestExpectContinue.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestTargetHost.html
+http://developer.android.com/reference/org/apache/http/protocol/RequestUserAgent.html
+http://developer.android.com/reference/org/apache/http/protocol/ResponseConnControl.html
+http://developer.android.com/reference/org/apache/http/protocol/ResponseContent.html
+http://developer.android.com/reference/org/apache/http/protocol/ResponseDate.html
+http://developer.android.com/reference/org/apache/http/protocol/ResponseServer.html
+http://developer.android.com/reference/org/apache/http/protocol/SyncBasicHttpContext.html
+http://developer.android.com/reference/org/apache/http/protocol/UriPatternMatcher.html
+http://developer.android.com/reference/org/apache/http/auth/AUTH.html
+http://developer.android.com/reference/android/accounts/AbstractAccountAuthenticator.html
http://developer.android.com/reference/org/apache/http/impl/client/AbstractAuthenticationHandler.html
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractClientConnAdapter.html
http://developer.android.com/reference/java/util/AbstractCollection.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/AbstractConnPool.html
http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieAttributeHandler.html
http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieSpec.html
http://developer.android.com/reference/android/database/AbstractCursor.html
-http://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html
http://developer.android.com/reference/org/apache/http/impl/client/AbstractHttpClient.html
-http://developer.android.com/reference/org/apache/http/impl/AbstractHttpClientConnection.html
http://developer.android.com/reference/org/apache/http/entity/AbstractHttpEntity.html
http://developer.android.com/reference/org/apache/http/params/AbstractHttpParams.html
-http://developer.android.com/reference/org/apache/http/impl/AbstractHttpServerConnection.html
http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.AbstractInputMethodImpl.html
http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.AbstractInputMethodSessionImpl.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractInterruptibleChannel.html
http://developer.android.com/reference/java/util/AbstractMap.html
http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageParser.html
http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageWriter.html
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPoolEntry.html
http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.html
http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.ConditionObject.html
http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionInputBuffer.html
http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionOutputBuffer.html
+http://developer.android.com/reference/android/content/AbstractThreadedSyncAdapter.html
http://developer.android.com/reference/org/apache/http/conn/ssl/AbstractVerifier.html
-http://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator.html
http://developer.android.com/reference/java/security/AccessControlContext.html
http://developer.android.com/reference/java/security/AccessController.html
+http://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo.html
http://developer.android.com/reference/java/lang/reflect/AccessibleObject.html
-http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
+http://developer.android.com/reference/android/accounts/Account.html
+http://developer.android.com/reference/android/accounts/AccountAuthenticatorResponse.html
+http://developer.android.com/reference/android/accounts/AccountManager.html
+http://developer.android.com/reference/android/app/ActivityManager.html
+http://developer.android.com/reference/android/app/ActivityManager.MemoryInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.ProcessErrorStateInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.RecentTaskInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.RunningTaskInfo.html
http://developer.android.com/reference/android/location/Address.html
+http://developer.android.com/reference/android/app/AlarmManager.html
+http://developer.android.com/reference/android/app/AlertDialog.Builder.html
http://developer.android.com/reference/java/security/AlgorithmParameterGenerator.html
http://developer.android.com/reference/java/security/AlgorithmParameterGeneratorSpi.html
http://developer.android.com/reference/java/security/AlgorithmParameters.html
http://developer.android.com/reference/java/security/AlgorithmParametersSpi.html
http://developer.android.com/reference/android/text/style/AlignmentSpan.Standard.html
-http://developer.android.com/reference/android/text/AlteredCharSequence.html
-http://developer.android.com/reference/android/text/AndroidCharacter.html
-http://developer.android.com/reference/android/view/animation/Animation.Description.html
-http://developer.android.com/reference/android/view/animation/AnimationUtils.html
http://developer.android.com/reference/java/text/Annotation.html
http://developer.android.com/reference/android/appwidget/AppWidgetHost.html
http://developer.android.com/reference/android/appwidget/AppWidgetManager.html
@@ -996,9 +1292,8 @@
http://developer.android.com/reference/java/util/Arrays.html
http://developer.android.com/reference/android/text/method/ArrowKeyMovementMethod.html
http://developer.android.com/reference/junit/framework/Assert.html
-http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
http://developer.android.com/reference/android/media/AsyncPlayer.html
-http://developer.android.com/reference/android/os/AsyncTask.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerArgs.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicIntegerArray.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.html
@@ -1016,15 +1311,18 @@
http://developer.android.com/reference/java/util/jar/Attributes.Name.html
http://developer.android.com/reference/org/xml/sax/helpers/AttributesImpl.html
http://developer.android.com/reference/android/media/AudioFormat.html
+http://developer.android.com/reference/android/media/AudioManager.html
http://developer.android.com/reference/android/media/AudioRecord.html
http://developer.android.com/reference/android/media/AudioTrack.html
http://developer.android.com/reference/org/apache/http/auth/params/AuthParams.html
http://developer.android.com/reference/org/apache/http/client/params/AuthPolicy.html
http://developer.android.com/reference/org/apache/http/impl/auth/AuthSchemeBase.html
-http://developer.android.com/reference/android/text/AutoText.html
-http://developer.android.com/reference/android/widget/BaseAdapter.html
-http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
-http://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html
+http://developer.android.com/reference/org/apache/http/auth/AuthSchemeRegistry.html
+http://developer.android.com/reference/org/apache/http/auth/AuthScope.html
+http://developer.android.com/reference/org/apache/http/auth/AuthState.html
+http://developer.android.com/reference/java/net/Authenticator.html
+http://developer.android.com/reference/android/accounts/AuthenticatorDescription.html
+http://developer.android.com/reference/junit/runner/BaseTestRunner.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie.html
http://developer.android.com/reference/org/apache/http/impl/client/BasicCookieStore.html
http://developer.android.com/reference/org/apache/http/impl/client/BasicCredentialsProvider.html
@@ -1036,8 +1334,6 @@
http://developer.android.com/reference/org/apache/http/message/BasicHeaderIterator.html
http://developer.android.com/reference/org/apache/http/message/BasicHeaderValueFormatter.html
http://developer.android.com/reference/org/apache/http/message/BasicHeaderValueParser.html
-http://developer.android.com/reference/org/apache/http/protocol/BasicHttpContext.html
-http://developer.android.com/reference/org/apache/http/protocol/BasicHttpProcessor.html
http://developer.android.com/reference/org/apache/http/message/BasicLineFormatter.html
http://developer.android.com/reference/org/apache/http/message/BasicLineParser.html
http://developer.android.com/reference/org/apache/http/message/BasicListHeaderIterator.html
@@ -1049,11 +1345,18 @@
http://developer.android.com/reference/org/apache/http/impl/auth/BasicSchemeFactory.html
http://developer.android.com/reference/org/apache/http/message/BasicStatusLine.html
http://developer.android.com/reference/org/apache/http/message/BasicTokenIterator.html
-http://developer.android.com/reference/android/os/BatteryManager.html
+http://developer.android.com/reference/org/apache/http/auth/BasicUserPrincipal.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpec.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpecFactory.html
http://developer.android.com/reference/java/text/Bidi.html
http://developer.android.com/reference/java/util/BitSet.html
+http://developer.android.com/reference/android/bluetooth/BluetoothClass.html
+http://developer.android.com/reference/android/bluetooth/BluetoothClass.Device.html
+http://developer.android.com/reference/android/bluetooth/BluetoothClass.Device.Major.html
+http://developer.android.com/reference/android/bluetooth/BluetoothClass.Service.html
+http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html
+http://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html
+http://developer.android.com/reference/android/bluetooth/BluetoothSocket.html
http://developer.android.com/reference/java/text/BreakIterator.html
http://developer.android.com/reference/android/provider/Browser.html
http://developer.android.com/reference/android/provider/Browser.BookmarkColumns.html
@@ -1061,33 +1364,23 @@
http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpecFactory.html
http://developer.android.com/reference/java/nio/Buffer.html
http://developer.android.com/reference/org/apache/http/message/BufferedHeader.html
-http://developer.android.com/reference/android/os/Build.html
-http://developer.android.com/reference/android/os/Build.VERSION.html
http://developer.android.com/reference/android/text/style/BulletSpan.html
+http://developer.android.com/reference/org/apache/http/util/ByteArrayBuffer.html
http://developer.android.com/reference/java/nio/ByteOrder.html
-http://developer.android.com/reference/java/security/cert/CRL.html
http://developer.android.com/reference/android/webkit/CacheManager.html
http://developer.android.com/reference/android/webkit/CacheManager.CacheResult.html
+http://developer.android.com/reference/java/net/CacheRequest.html
+http://developer.android.com/reference/java/net/CacheResponse.html
http://developer.android.com/reference/java/util/Calendar.html
http://developer.android.com/reference/android/provider/CallLog.html
http://developer.android.com/reference/android/provider/CallLog.Calls.html
http://developer.android.com/reference/android/hardware/Camera.Parameters.html
http://developer.android.com/reference/android/hardware/Camera.Size.html
http://developer.android.com/reference/android/telephony/CellLocation.html
-http://developer.android.com/reference/java/security/cert/CertPath.html
-http://developer.android.com/reference/java/security/cert/CertPath.CertPathRep.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilder.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilderSpi.html
http://developer.android.com/reference/javax/net/ssl/CertPathTrustManagerParameters.html
-http://developer.android.com/reference/java/security/cert/CertPathValidator.html
-http://developer.android.com/reference/java/security/cert/CertPathValidatorSpi.html
-http://developer.android.com/reference/java/security/cert/CertStore.html
-http://developer.android.com/reference/java/security/cert/CertStoreSpi.html
http://developer.android.com/reference/javax/security/cert/Certificate.html
-http://developer.android.com/reference/java/security/cert/Certificate.CertificateRep.html
-http://developer.android.com/reference/java/security/cert/CertificateFactory.html
-http://developer.android.com/reference/java/security/cert/CertificateFactorySpi.html
http://developer.android.com/reference/java/nio/channels/Channels.html
+http://developer.android.com/reference/org/apache/http/util/CharArrayBuffer.html
http://developer.android.com/reference/android/text/style/CharacterStyle.html
http://developer.android.com/reference/java/nio/charset/Charset.html
http://developer.android.com/reference/java/nio/charset/CharsetDecoder.html
@@ -1103,16 +1396,14 @@
http://developer.android.com/reference/java/text/CollationElementIterator.html
http://developer.android.com/reference/java/text/CollationKey.html
http://developer.android.com/reference/java/text/Collator.html
-http://developer.android.com/reference/java/security/cert/CollectionCertStoreParameters.html
http://developer.android.com/reference/java/util/Collections.html
-http://developer.android.com/reference/android/content/res/ColorStateList.html
-http://developer.android.com/reference/android/view/inputmethod/CompletionInfo.html
-http://developer.android.com/reference/android/os/ConditionVariable.html
+http://developer.android.com/reference/android/content/ComponentName.html
+http://developer.android.com/reference/android/util/Config.html
http://developer.android.com/reference/android/content/pm/ConfigurationInfo.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerParams.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnPerRouteBean.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnRouteParams.html
-http://developer.android.com/reference/android/provider/Contacts.html
+http://developer.android.com/reference/android/net/ConnectivityManager.html
http://developer.android.com/reference/android/provider/Contacts.ContactMethods.html
http://developer.android.com/reference/android/provider/Contacts.Extensions.html
http://developer.android.com/reference/android/provider/Contacts.GroupMembership.html
@@ -1121,12 +1412,54 @@
http://developer.android.com/reference/android/provider/Contacts.Intents.Insert.html
http://developer.android.com/reference/android/provider/Contacts.Intents.UI.html
http://developer.android.com/reference/android/provider/Contacts.Organizations.html
+http://developer.android.com/reference/android/provider/Contacts.People.html
http://developer.android.com/reference/android/provider/Contacts.People.ContactMethods.html
http://developer.android.com/reference/android/provider/Contacts.People.Extensions.html
http://developer.android.com/reference/android/provider/Contacts.People.Phones.html
+http://developer.android.com/reference/android/provider/Contacts.Phones.html
http://developer.android.com/reference/android/provider/Contacts.Photos.html
http://developer.android.com/reference/android/provider/Contacts.Settings.html
+http://developer.android.com/reference/android/provider/ContactsContract.html
+http://developer.android.com/reference/android/provider/ContactsContract.AggregationExceptions.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Email.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Event.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.GroupMembership.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Im.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Nickname.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Note.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Organization.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Photo.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Relation.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.StructuredName.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.StructuredPostal.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Website.html
+http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html
+http://developer.android.com/reference/android/provider/ContactsContract.Contacts.AggregationSuggestions.html
+http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Data.html
+http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html
+http://developer.android.com/reference/android/provider/ContactsContract.Data.html
+http://developer.android.com/reference/android/provider/ContactsContract.Groups.html
+http://developer.android.com/reference/android/provider/ContactsContract.Intents.html
+http://developer.android.com/reference/android/provider/ContactsContract.Intents.Insert.html
+http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html
+http://developer.android.com/reference/android/provider/ContactsContract.QuickContact.html
+http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html
+http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.Data.html
+http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.Entity.html
+http://developer.android.com/reference/android/provider/ContactsContract.RawContactsEntity.html
+http://developer.android.com/reference/android/provider/ContactsContract.Settings.html
+http://developer.android.com/reference/android/provider/ContactsContract.StatusUpdates.html
+http://developer.android.com/reference/android/provider/ContactsContract.SyncState.html
+http://developer.android.com/reference/java/net/ContentHandler.html
http://developer.android.com/reference/android/database/ContentObserver.html
+http://developer.android.com/reference/android/content/ContentProviderClient.html
+http://developer.android.com/reference/android/content/ContentProviderOperation.html
+http://developer.android.com/reference/android/content/ContentProviderOperation.Builder.html
+http://developer.android.com/reference/android/content/ContentProviderResult.html
+http://developer.android.com/reference/android/content/ContentUris.html
+http://developer.android.com/reference/java/net/CookieHandler.html
http://developer.android.com/reference/org/apache/http/cookie/CookieIdentityComparator.html
http://developer.android.com/reference/android/webkit/CookieManager.html
http://developer.android.com/reference/org/apache/http/cookie/CookieOrigin.html
@@ -1134,138 +1467,115 @@
http://developer.android.com/reference/org/apache/http/client/params/CookiePolicy.html
http://developer.android.com/reference/org/apache/http/cookie/CookieSpecRegistry.html
http://developer.android.com/reference/android/webkit/CookieSyncManager.html
-http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArrayList.html
-http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html
-http://developer.android.com/reference/android/os/CountDownTimer.html
-http://developer.android.com/reference/android/net/Credentials.html
http://developer.android.com/reference/android/location/Criteria.html
http://developer.android.com/reference/java/util/Currency.html
http://developer.android.com/reference/android/database/CursorJoiner.html
http://developer.android.com/reference/android/database/CursorWrapper.html
-http://developer.android.com/reference/android/view/animation/CycleInterpolator.html
-http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html
http://developer.android.com/reference/javax/crypto/spec/DESKeySpec.html
http://developer.android.com/reference/javax/crypto/spec/DESedeKeySpec.html
http://developer.android.com/reference/javax/crypto/spec/DHGenParameterSpec.html
http://developer.android.com/reference/javax/crypto/spec/DHParameterSpec.html
http://developer.android.com/reference/javax/crypto/spec/DHPrivateKeySpec.html
http://developer.android.com/reference/javax/crypto/spec/DHPublicKeySpec.html
-http://developer.android.com/reference/java/security/spec/DSAParameterSpec.html
-http://developer.android.com/reference/java/security/spec/DSAPrivateKeySpec.html
-http://developer.android.com/reference/java/security/spec/DSAPublicKeySpec.html
http://developer.android.com/reference/android/database/DataSetObserver.html
http://developer.android.com/reference/android/database/DatabaseUtils.html
http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
+http://developer.android.com/reference/java/net/DatagramPacket.html
+http://developer.android.com/reference/java/net/DatagramSocket.html
+http://developer.android.com/reference/java/net/DatagramSocketImpl.html
http://developer.android.com/reference/java/util/Date.html
http://developer.android.com/reference/android/text/format/DateFormat.html
http://developer.android.com/reference/java/text/DateFormatSymbols.html
http://developer.android.com/reference/android/webkit/DateSorter.html
http://developer.android.com/reference/org/apache/http/impl/cookie/DateUtils.html
-http://developer.android.com/reference/android/os/Debug.InstructionCount.html
-http://developer.android.com/reference/android/os/Debug.MemoryInfo.html
-http://developer.android.com/reference/android/view/animation/DecelerateInterpolator.html
+http://developer.android.com/reference/android/util/DebugUtils.html
http://developer.android.com/reference/java/text/DecimalFormatSymbols.html
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnectionOperator.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy.html
-http://developer.android.com/reference/org/apache/http/impl/DefaultConnectionReuseStrategy.html
http://developer.android.com/reference/org/xml/sax/helpers/DefaultHandler.html
-http://developer.android.com/reference/org/apache/http/impl/DefaultHttpRequestFactory.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.html
-http://developer.android.com/reference/org/apache/http/impl/DefaultHttpResponseFactory.html
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultHttpRoutePlanner.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultRedirectHandler.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultRequestDirector.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultUserTokenHandler.html
-http://developer.android.com/reference/org/apache/http/protocol/DefaultedHttpContext.html
http://developer.android.com/reference/dalvik/system/DexFile.html
http://developer.android.com/reference/android/net/DhcpInfo.html
http://developer.android.com/reference/java/util/Dictionary.html
http://developer.android.com/reference/org/apache/http/impl/auth/DigestSchemeFactory.html
http://developer.android.com/reference/javax/xml/parsers/DocumentBuilder.html
http://developer.android.com/reference/javax/xml/parsers/DocumentBuilderFactory.html
+http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html
http://developer.android.com/reference/android/text/style/DrawableMarginSpan.html
http://developer.android.com/reference/org/xmlpull/v1/sax2/Driver.html
http://developer.android.com/reference/java/sql/DriverManager.html
http://developer.android.com/reference/java/sql/DriverPropertyInfo.html
-http://developer.android.com/reference/java/security/spec/ECFieldF2m.html
-http://developer.android.com/reference/java/security/spec/ECFieldFp.html
-http://developer.android.com/reference/java/security/spec/ECGenParameterSpec.html
-http://developer.android.com/reference/java/security/spec/ECParameterSpec.html
-http://developer.android.com/reference/java/security/spec/ECPoint.html
-http://developer.android.com/reference/java/security/spec/ECPrivateKeySpec.html
-http://developer.android.com/reference/java/security/spec/ECPublicKeySpec.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGLConfig.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGLContext.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGLDisplay.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGLSurface.html
-http://developer.android.com/reference/android/text/Editable.Factory.html
http://developer.android.com/reference/android/sax/Element.html
-http://developer.android.com/reference/java/security/spec/EllipticCurve.html
-http://developer.android.com/reference/java/security/spec/EncodedKeySpec.html
+http://developer.android.com/reference/org/apache/http/util/EncodingUtils.html
http://developer.android.com/reference/javax/crypto/EncryptedPrivateKeyInfo.html
-http://developer.android.com/reference/org/apache/http/impl/EnglishReasonPhraseCatalog.html
http://developer.android.com/reference/org/apache/http/impl/entity/EntityDeserializer.html
http://developer.android.com/reference/org/apache/http/impl/entity/EntitySerializer.html
-http://developer.android.com/reference/android/os/Environment.html
-http://developer.android.com/reference/java/util/logging/ErrorManager.html
+http://developer.android.com/reference/org/apache/http/util/EntityUtils.html
http://developer.android.com/reference/java/util/EventListenerProxy.html
+http://developer.android.com/reference/android/util/EventLogTags.html
+http://developer.android.com/reference/android/util/EventLogTags.Description.html
http://developer.android.com/reference/java/util/EventObject.html
-http://developer.android.com/reference/java/util/concurrent/Exchanger.html
-http://developer.android.com/reference/java/util/concurrent/ExecutorCompletionService.html
-http://developer.android.com/reference/java/util/concurrent/Executors.html
+http://developer.android.com/reference/org/apache/http/util/ExceptionUtils.html
http://developer.android.com/reference/javax/crypto/ExemptionMechanism.html
http://developer.android.com/reference/javax/crypto/ExemptionMechanismSpi.html
-http://developer.android.com/reference/android/widget/ExpandableListView.ExpandableListContextMenuInfo.html
-http://developer.android.com/reference/android/view/inputmethod/ExtractedText.html
-http://developer.android.com/reference/android/view/inputmethod/ExtractedTextRequest.html
+http://developer.android.com/reference/android/media/ExifInterface.html
http://developer.android.com/reference/android/media/FaceDetector.html
http://developer.android.com/reference/android/media/FaceDetector.Face.html
+http://developer.android.com/reference/android/content/pm/FeatureInfo.html
http://developer.android.com/reference/java/text/FieldPosition.html
+http://developer.android.com/reference/java/io/File.html
http://developer.android.com/reference/java/nio/channels/FileChannel.MapMode.html
+http://developer.android.com/reference/java/io/FileDescriptor.html
http://developer.android.com/reference/java/nio/channels/FileLock.html
-http://developer.android.com/reference/android/os/FileObserver.html
-http://developer.android.com/reference/android/widget/Filter.html
-http://developer.android.com/reference/android/widget/Filter.FilterResults.html
+http://developer.android.com/reference/android/util/FloatMath.html
http://developer.android.com/reference/java/text/Format.html
http://developer.android.com/reference/java/util/FormattableFlags.html
-http://developer.android.com/reference/java/util/concurrent/FutureTask.html
http://developer.android.com/reference/android/opengl/GLDebugHelper.html
+http://developer.android.com/reference/android/opengl/GLES10.html
+http://developer.android.com/reference/android/opengl/GLES10Ext.html
+http://developer.android.com/reference/android/opengl/GLES11Ext.html
http://developer.android.com/reference/android/opengl/GLU.html
http://developer.android.com/reference/android/opengl/GLUtils.html
+http://developer.android.com/reference/android/webkit/GeolocationPermissions.html
http://developer.android.com/reference/android/hardware/GeomagneticField.html
+http://developer.android.com/reference/android/gesture/Gesture.html
+http://developer.android.com/reference/android/gesture/GestureLibraries.html
+http://developer.android.com/reference/android/gesture/GestureLibrary.html
+http://developer.android.com/reference/android/gesture/GesturePoint.html
+http://developer.android.com/reference/android/gesture/GestureStore.html
+http://developer.android.com/reference/android/gesture/GestureStroke.html
http://developer.android.com/reference/android/location/GpsSatellite.html
http://developer.android.com/reference/android/location/GpsStatus.html
http://developer.android.com/reference/java/security/GuardedObject.html
-http://developer.android.com/reference/org/apache/http/protocol/HTTP.html
-http://developer.android.com/reference/java/util/logging/Handler.html
http://developer.android.com/reference/org/xml/sax/HandlerBase.html
http://developer.android.com/reference/org/apache/http/message/HeaderGroup.html
-http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html
-http://developer.android.com/reference/android/text/Html.html
http://developer.android.com/reference/org/apache/http/params/HttpAbstractParamBean.html
http://developer.android.com/reference/org/apache/http/client/params/HttpClientParams.html
-http://developer.android.com/reference/org/apache/http/impl/HttpConnectionMetricsImpl.html
http://developer.android.com/reference/org/apache/http/params/HttpConnectionParams.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpDateGenerator.html
http://developer.android.com/reference/org/apache/http/entity/HttpEntityWrapper.html
-http://developer.android.com/reference/org/apache/http/HttpHost.html
http://developer.android.com/reference/org/apache/http/params/HttpProtocolParams.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestExecutor.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerRegistry.html
-http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoute.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpService.html
http://developer.android.com/reference/org/apache/http/impl/io/HttpTransportMetricsImpl.html
http://developer.android.com/reference/android/text/style/IconMarginSpan.html
http://developer.android.com/reference/java/security/Identity.html
-http://developer.android.com/reference/org/apache/http/impl/conn/IdleConnectionHandler.html
http://developer.android.com/reference/org/apache/http/conn/util/InetAddressUtils.html
http://developer.android.com/reference/android/view/inputmethod/InputBinding.html
http://developer.android.com/reference/android/view/inputmethod/InputConnectionWrapper.html
-http://developer.android.com/reference/android/text/InputFilter.AllCaps.html
-http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
http://developer.android.com/reference/android/view/inputmethod/InputMethodInfo.html
http://developer.android.com/reference/android/inputmethodservice/InputMethodService.Insets.html
http://developer.android.com/reference/org/xml/sax/InputSource.html
+http://developer.android.com/reference/android/app/Instrumentation.ActivityMonitor.html
+http://developer.android.com/reference/android/app/Instrumentation.ActivityResult.html
+http://developer.android.com/reference/android/content/Intent.FilterComparison.html
+http://developer.android.com/reference/android/content/Intent.ShortcutIconResource.html
+http://developer.android.com/reference/android/content/IntentFilter.html
+http://developer.android.com/reference/android/content/IntentFilter.AuthorityEntry.html
+http://developer.android.com/reference/android/content/IntentSender.html
http://developer.android.com/reference/javax/crypto/spec/IvParameterSpec.html
http://developer.android.com/reference/org/json/JSONArray.html
http://developer.android.com/reference/org/json/JSONObject.html
@@ -1294,18 +1604,14 @@
http://developer.android.com/reference/java/security/KeyStoreSpi.html
http://developer.android.com/reference/android/inputmethodservice/Keyboard.Key.html
http://developer.android.com/reference/android/inputmethodservice/Keyboard.Row.html
-http://developer.android.com/reference/java/security/cert/LDAPCertStoreParameters.html
+http://developer.android.com/reference/android/app/KeyguardManager.html
+http://developer.android.com/reference/android/app/KeyguardManager.KeyguardLock.html
+http://developer.android.com/reference/org/apache/http/util/LangUtils.html
+http://developer.android.com/reference/android/app/LauncherActivity.IconResizer.html
+http://developer.android.com/reference/android/app/LauncherActivity.ListItem.html
http://developer.android.com/reference/org/apache/http/impl/entity/LaxContentLengthStrategy.html
-http://developer.android.com/reference/android/text/Layout.html
-http://developer.android.com/reference/android/text/Layout.Directions.html
-http://developer.android.com/reference/android/view/animation/LayoutAnimationController.html
-http://developer.android.com/reference/android/view/animation/LayoutAnimationController.AnimationParameters.html
http://developer.android.com/reference/android/text/style/LeadingMarginSpan.Standard.html
-http://developer.android.com/reference/java/util/logging/Level.html
-http://developer.android.com/reference/android/view/animation/LinearInterpolator.html
-http://developer.android.com/reference/android/text/util/Linkify.html
-http://developer.android.com/reference/android/widget/ListView.FixedViewInfo.html
-http://developer.android.com/reference/android/provider/LiveFolders.html
+http://developer.android.com/reference/android/app/LocalActivityManager.html
http://developer.android.com/reference/android/net/LocalServerSocket.html
http://developer.android.com/reference/android/net/LocalSocket.html
http://developer.android.com/reference/android/net/LocalSocketAddress.html
@@ -1314,17 +1620,10 @@
http://developer.android.com/reference/android/location/LocationProvider.html
http://developer.android.com/reference/org/xml/sax/helpers/LocatorImpl.html
http://developer.android.com/reference/java/util/concurrent/locks/LockSupport.html
-http://developer.android.com/reference/java/util/logging/LogManager.html
-http://developer.android.com/reference/java/util/logging/LogRecord.html
-http://developer.android.com/reference/java/util/logging/Logger.html
-http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionInputBuffer.html
-http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionOutputBuffer.html
-http://developer.android.com/reference/android/text/LoginFilter.html
-http://developer.android.com/reference/java/security/spec/MGF1ParameterSpec.html
+http://developer.android.com/reference/android/util/LogPrinter.html
http://developer.android.com/reference/javax/crypto/Mac.html
http://developer.android.com/reference/javax/crypto/MacSpi.html
http://developer.android.com/reference/android/net/MailTo.html
-http://developer.android.com/reference/java/util/regex/Matcher.html
http://developer.android.com/reference/java/math/MathContext.html
http://developer.android.com/reference/android/opengl/Matrix.html
http://developer.android.com/reference/android/database/MatrixCursor.RowBuilder.html
@@ -1334,6 +1633,7 @@
http://developer.android.com/reference/android/media/MediaRecorder.VideoEncoder.html
http://developer.android.com/reference/android/media/MediaRecorder.VideoSource.html
http://developer.android.com/reference/android/media/MediaScannerConnection.html
+http://developer.android.com/reference/android/provider/MediaStore.html
http://developer.android.com/reference/android/provider/MediaStore.Audio.html
http://developer.android.com/reference/android/provider/MediaStore.Audio.Albums.html
http://developer.android.com/reference/android/provider/MediaStore.Audio.Artists.html
@@ -1348,24 +1648,24 @@
http://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html
http://developer.android.com/reference/android/provider/MediaStore.Video.html
http://developer.android.com/reference/android/provider/MediaStore.Video.Media.html
-http://developer.android.com/reference/android/os/MemoryFile.html
-http://developer.android.com/reference/android/os/Message.html
+http://developer.android.com/reference/android/provider/MediaStore.Video.Thumbnails.html
http://developer.android.com/reference/java/security/MessageDigestSpi.html
-http://developer.android.com/reference/android/os/MessageQueue.html
-http://developer.android.com/reference/android/os/Messenger.html
-http://developer.android.com/reference/android/text/method/MetaKeyKeyListener.html
http://developer.android.com/reference/android/webkit/MimeTypeMap.html
http://developer.android.com/reference/android/test/mock/MockDialogInterface.html
http://developer.android.com/reference/java/lang/reflect/Modifier.html
-http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.CommaTokenizer.html
+http://developer.android.com/reference/android/util/MonthDisplayHelper.html
+http://developer.android.com/reference/android/test/MoreAsserts.html
http://developer.android.com/reference/org/apache/http/conn/MultihomePlainSocketFactory.html
+http://developer.android.com/reference/org/apache/http/auth/NTCredentials.html
+http://developer.android.com/reference/org/apache/http/auth/NTUserPrincipal.html
http://developer.android.com/reference/org/xml/sax/helpers/NamespaceSupport.html
http://developer.android.com/reference/android/telephony/NeighboringCellInfo.html
http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftHeaderParser.html
http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpecFactory.html
http://developer.android.com/reference/android/net/NetworkInfo.html
-http://developer.android.com/reference/org/apache/http/impl/NoConnectionReuseStrategy.html
-http://developer.android.com/reference/android/text/NoCopySpan.Concrete.html
+http://developer.android.com/reference/java/net/NetworkInterface.html
+http://developer.android.com/reference/android/app/Notification.html
+http://developer.android.com/reference/android/app/NotificationManager.html
http://developer.android.com/reference/java/awt/font/NumericShaper.html
http://developer.android.com/reference/javax/crypto/spec/OAEPParameterSpec.html
http://developer.android.com/reference/java/io/ObjectInputStream.GetField.html
@@ -1373,48 +1673,44 @@
http://developer.android.com/reference/java/io/ObjectStreamClass.html
http://developer.android.com/reference/java/io/ObjectStreamField.html
http://developer.android.com/reference/java/util/Observable.html
-http://developer.android.com/reference/java/io/OutputStream.html
+http://developer.android.com/reference/android/gesture/OrientedBoundingBox.html
http://developer.android.com/reference/javax/crypto/spec/PBEKeySpec.html
http://developer.android.com/reference/javax/crypto/spec/PBEParameterSpec.html
-http://developer.android.com/reference/java/security/cert/PKIXCertPathChecker.html
-http://developer.android.com/reference/java/security/cert/PKIXCertPathValidatorResult.html
-http://developer.android.com/reference/java/security/cert/PKIXParameters.html
-http://developer.android.com/reference/java/security/spec/PSSParameterSpec.html
http://developer.android.com/reference/javax/crypto/spec/PSource.html
http://developer.android.com/reference/java/util/jar/Pack200.html
http://developer.android.com/reference/android/content/pm/PackageInfo.html
-http://developer.android.com/reference/android/content/pm/PackageItemInfo.html
http://developer.android.com/reference/android/content/pm/PackageItemInfo.DisplayNameComparator.html
http://developer.android.com/reference/android/content/pm/PackageStats.html
-http://developer.android.com/reference/android/os/Parcel.html
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.html
+http://developer.android.com/reference/android/util/Pair.html
http://developer.android.com/reference/java/text/ParsePosition.html
http://developer.android.com/reference/org/xml/sax/helpers/ParserAdapter.html
http://developer.android.com/reference/org/apache/http/message/ParserCursor.html
http://developer.android.com/reference/org/xml/sax/helpers/ParserFactory.html
+http://developer.android.com/reference/java/net/PasswordAuthentication.html
+http://developer.android.com/reference/javax/security/auth/callback/PasswordCallback.html
http://developer.android.com/reference/android/text/method/PasswordTransformationMethod.html
-http://developer.android.com/reference/java/util/regex/Pattern.html
+http://developer.android.com/reference/android/app/PendingIntent.html
http://developer.android.com/reference/java/security/Permission.html
http://developer.android.com/reference/java/security/PermissionCollection.html
http://developer.android.com/reference/android/telephony/PhoneNumberFormattingTextWatcher.html
http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html
http://developer.android.com/reference/android/telephony/PhoneStateListener.html
-http://developer.android.com/reference/java/nio/channels/Pipe.html
http://developer.android.com/reference/org/apache/http/conn/scheme/PlainSocketFactory.html
http://developer.android.com/reference/android/webkit/Plugin.html
http://developer.android.com/reference/android/webkit/PluginData.html
http://developer.android.com/reference/android/webkit/PluginList.html
http://developer.android.com/reference/java/security/Policy.html
-http://developer.android.com/reference/java/security/cert/PolicyQualifierInfo.html
-http://developer.android.com/reference/android/widget/PopupWindow.html
-http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
+http://developer.android.com/reference/android/gesture/Prediction.html
http://developer.android.com/reference/android/preference/PreferenceManager.html
http://developer.android.com/reference/java/util/prefs/Preferences.html
+http://developer.android.com/reference/android/util/PrintStreamPrinter.html
+http://developer.android.com/reference/android/util/PrintWriterPrinter.html
http://developer.android.com/reference/java/beans/PropertyChangeSupport.html
http://developer.android.com/reference/java/security/ProtectionDomain.html
http://developer.android.com/reference/org/apache/http/ProtocolVersion.html
http://developer.android.com/reference/java/security/Provider.Service.html
-http://developer.android.com/reference/org/apache/http/impl/conn/ProxySelectorRoutePlanner.html
+http://developer.android.com/reference/java/net/Proxy.html
+http://developer.android.com/reference/java/net/ProxySelector.html
http://developer.android.com/reference/android/text/style/QuoteSpan.html
http://developer.android.com/reference/javax/crypto/spec/RC2ParameterSpec.html
http://developer.android.com/reference/javax/crypto/spec/RC5ParameterSpec.html
@@ -1426,10 +1722,6 @@
http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965PortAttributeHandler.html
http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965SpecFactory.html
http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965VersionAttributeHandler.html
-http://developer.android.com/reference/java/security/spec/RSAKeyGenParameterSpec.html
-http://developer.android.com/reference/java/security/spec/RSAOtherPrimeInfo.html
-http://developer.android.com/reference/java/security/spec/RSAPrivateKeySpec.html
-http://developer.android.com/reference/java/security/spec/RSAPublicKeySpec.html
http://developer.android.com/reference/java/util/Random.html
http://developer.android.com/reference/java/io/RandomAccessFile.html
http://developer.android.com/reference/java/io/Reader.html
@@ -1440,26 +1732,12 @@
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantReadWriteLock.ReadLock.html
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueWorker.html
-http://developer.android.com/reference/android/os/RemoteCallbackList.html
-http://developer.android.com/reference/android/os/IInterface.html
-http://developer.android.com/reference/android/widget/RemoteViews.html
+http://developer.android.com/reference/java/lang/ref/Reference.html
http://developer.android.com/reference/android/text/method/ReplacementTransformationMethod.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestConnControl.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestContent.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestDate.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestExpectContinue.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestTargetHost.html
-http://developer.android.com/reference/org/apache/http/protocol/RequestUserAgent.html
http://developer.android.com/reference/android/content/pm/ResolveInfo.html
http://developer.android.com/reference/android/content/pm/ResolveInfo.DisplayNameComparator.html
http://developer.android.com/reference/java/util/ResourceBundle.html
-http://developer.android.com/reference/org/apache/http/protocol/ResponseConnControl.html
-http://developer.android.com/reference/org/apache/http/protocol/ResponseContent.html
-http://developer.android.com/reference/org/apache/http/protocol/ResponseDate.html
-http://developer.android.com/reference/org/apache/http/protocol/ResponseServer.html
-http://developer.android.com/reference/android/os/ResultReceiver.html
-http://developer.android.com/reference/android/text/util/Rfc822Token.html
-http://developer.android.com/reference/android/text/util/Rfc822Tokenizer.html
+http://developer.android.com/reference/java/net/ResponseCache.html
http://developer.android.com/reference/android/media/Ringtone.html
http://developer.android.com/reference/android/media/RingtoneManager.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RouteSpecificPool.html
@@ -1468,6 +1746,7 @@
http://developer.android.com/reference/javax/xml/parsers/SAXParser.html
http://developer.android.com/reference/javax/xml/parsers/SAXParserFactory.html
http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html
http://developer.android.com/reference/javax/net/ssl/SSLContext.html
http://developer.android.com/reference/javax/net/ssl/SSLContextSpi.html
@@ -1486,88 +1765,101 @@
http://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html
http://developer.android.com/reference/java/security/SecureRandomSpi.html
http://developer.android.com/reference/java/security/Security.html
-http://developer.android.com/reference/android/text/Selection.html
http://developer.android.com/reference/java/nio/channels/SelectionKey.html
-http://developer.android.com/reference/java/nio/channels/Selector.html
-http://developer.android.com/reference/java/nio/channels/spi/SelectorProvider.html
-http://developer.android.com/reference/java/util/concurrent/Semaphore.html
http://developer.android.com/reference/android/hardware/Sensor.html
http://developer.android.com/reference/android/hardware/SensorEvent.html
+http://developer.android.com/reference/android/hardware/SensorManager.html
+http://developer.android.com/reference/java/net/ServerSocket.html
http://developer.android.com/reference/javax/net/ServerSocketFactory.html
http://developer.android.com/reference/android/telephony/ServiceState.html
http://developer.android.com/reference/android/provider/Settings.html
http://developer.android.com/reference/android/provider/Settings.NameValueTable.html
+http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.ShaderFactory.html
http://developer.android.com/reference/android/content/pm/Signature.html
http://developer.android.com/reference/java/security/SignatureSpi.html
http://developer.android.com/reference/java/security/SignedObject.html
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.html
-http://developer.android.com/reference/android/telephony/gsm/SmsManager.html
+http://developer.android.com/reference/android/telephony/SmsManager.html
http://developer.android.com/reference/android/telephony/gsm/SmsMessage.html
http://developer.android.com/reference/android/telephony/gsm/SmsMessage.SubmitPdu.html
+http://developer.android.com/reference/java/net/Socket.html
+http://developer.android.com/reference/java/net/SocketAddress.html
http://developer.android.com/reference/javax/net/SocketFactory.html
-http://developer.android.com/reference/android/text/Spannable.Factory.html
-http://developer.android.com/reference/android/text/SpannableString.html
-http://developer.android.com/reference/android/text/SpannableStringBuilder.html
-http://developer.android.com/reference/android/text/SpannedString.html
-http://developer.android.com/reference/android/os/StatFs.html
+http://developer.android.com/reference/java/net/SocketImpl.html
+http://developer.android.com/reference/android/util/SparseBooleanArray.html
+http://developer.android.com/reference/android/util/SparseIntArray.html
+http://developer.android.com/reference/android/net/http/SslCertificate.html
+http://developer.android.com/reference/android/net/http/SslCertificate.DName.html
+http://developer.android.com/reference/android/util/StateSet.html
http://developer.android.com/reference/java/io/StreamTokenizer.html
http://developer.android.com/reference/org/apache/http/impl/entity/StrictContentLengthStrategy.html
+http://developer.android.com/reference/android/util/StringBuilderPrinter.html
http://developer.android.com/reference/java/text/StringCharacterIterator.html
http://developer.android.com/reference/java/util/StringTokenizer.html
-http://developer.android.com/reference/javax/security/auth/Subject.html
-http://developer.android.com/reference/javax/security/auth/SubjectDomainCombiner.html
-http://developer.android.com/reference/android/widget/TabHost.TabSpec.html
+http://developer.android.com/reference/android/content/SyncAdapterType.html
+http://developer.android.com/reference/android/content/SyncContext.html
+http://developer.android.com/reference/android/content/SyncResult.html
+http://developer.android.com/reference/android/provider/SyncStateContract.html
+http://developer.android.com/reference/android/provider/SyncStateContract.Constants.html
+http://developer.android.com/reference/android/provider/SyncStateContract.Helpers.html
http://developer.android.com/reference/android/text/style/TabStopSpan.Standard.html
+http://developer.android.com/reference/android/telephony/TelephonyManager.html
http://developer.android.com/reference/dalvik/system/TemporaryDirectory.html
http://developer.android.com/reference/junit/framework/TestFailure.html
http://developer.android.com/reference/android/test/suitebuilder/TestMethod.html
http://developer.android.com/reference/junit/framework/TestResult.html
+http://developer.android.com/reference/junit/framework/TestSuite.html
http://developer.android.com/reference/android/test/suitebuilder/TestSuiteBuilder.html
-http://developer.android.com/reference/android/text/TextUtils.html
-http://developer.android.com/reference/android/text/TextUtils.SimpleStringSplitter.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.AbortPolicy.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.CallerRunsPolicy.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardOldestPolicy.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardPolicy.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.html
http://developer.android.com/reference/android/text/format/Time.html
+http://developer.android.com/reference/android/util/TimeUtils.html
http://developer.android.com/reference/java/util/TimeZone.html
http://developer.android.com/reference/java/util/Timer.html
http://developer.android.com/reference/java/util/TimerTask.html
http://developer.android.com/reference/java/security/Timestamp.html
-http://developer.android.com/reference/android/widget/Toast.html
-http://developer.android.com/reference/android/os/TokenWatcher.html
+http://developer.android.com/reference/android/util/TimingLogger.html
http://developer.android.com/reference/android/media/ToneGenerator.html
http://developer.android.com/reference/android/text/method/Touch.html
http://developer.android.com/reference/dalvik/system/TouchDex.html
-http://developer.android.com/reference/android/view/animation/Transformation.html
-http://developer.android.com/reference/java/security/cert/TrustAnchor.html
+http://developer.android.com/reference/android/test/TouchUtils.html
http://developer.android.com/reference/javax/net/ssl/TrustManagerFactory.html
http://developer.android.com/reference/javax/net/ssl/TrustManagerFactorySpi.html
http://developer.android.com/reference/java/sql/Types.html
+http://developer.android.com/reference/java/net/URI.html
http://developer.android.com/reference/org/apache/http/client/utils/URIUtils.html
+http://developer.android.com/reference/java/net/URL.html
+http://developer.android.com/reference/java/net/URLConnection.html
+http://developer.android.com/reference/java/net/URLDecoder.html
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html
+http://developer.android.com/reference/java/net/URLEncoder.html
+http://developer.android.com/reference/java/net/URLStreamHandler.html
http://developer.android.com/reference/android/webkit/URLUtil.html
http://developer.android.com/reference/java/util/UUID.html
+http://developer.android.com/reference/android/net/Uri.html
http://developer.android.com/reference/android/net/Uri.Builder.html
-http://developer.android.com/reference/org/apache/http/protocol/UriPatternMatcher.html
+http://developer.android.com/reference/android/content/UriMatcher.html
http://developer.android.com/reference/android/webkit/UrlInterceptRegistry.html
http://developer.android.com/reference/android/net/UrlQuerySanitizer.html
http://developer.android.com/reference/android/net/UrlQuerySanitizer.IllegalCharacterValueSanitizer.html
http://developer.android.com/reference/android/net/UrlQuerySanitizer.ParameterValuePair.html
http://developer.android.com/reference/android/provider/UserDictionary.html
http://developer.android.com/reference/android/provider/UserDictionary.Words.html
+http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html
http://developer.android.com/reference/dalvik/system/VMDebug.html
http://developer.android.com/reference/dalvik/system/VMRuntime.html
http://developer.android.com/reference/dalvik/system/VMStack.html
+http://developer.android.com/reference/junit/runner/Version.html
+http://developer.android.com/reference/org/apache/http/util/VersionInfo.html
+http://developer.android.com/reference/android/test/ViewAsserts.html
http://developer.android.com/reference/android/opengl/Visibility.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThread.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThreadAborter.html
+http://developer.android.com/reference/android/app/WallpaperManager.html
http://developer.android.com/reference/android/webkit/WebBackForwardList.html
http://developer.android.com/reference/android/webkit/WebChromeClient.html
http://developer.android.com/reference/android/webkit/WebHistoryItem.html
http://developer.android.com/reference/android/webkit/WebIconDatabase.html
http://developer.android.com/reference/android/webkit/WebSettings.html
+http://developer.android.com/reference/android/webkit/WebStorage.html
http://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
http://developer.android.com/reference/android/webkit/WebView.WebViewTransport.html
http://developer.android.com/reference/android/webkit/WebViewClient.html
@@ -1580,121 +1872,109 @@
http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Protocol.html
http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Status.html
http://developer.android.com/reference/android/net/wifi/WifiInfo.html
+http://developer.android.com/reference/android/net/wifi/WifiManager.html
+http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
-http://developer.android.com/reference/org/apache/http/impl/conn/Wire.html
http://developer.android.com/reference/java/io/Writer.html
http://developer.android.com/reference/javax/security/auth/x500/X500Principal.html
-http://developer.android.com/reference/java/security/cert/X509CRLEntry.html
-http://developer.android.com/reference/java/security/cert/X509CRLSelector.html
-http://developer.android.com/reference/java/security/cert/X509CertSelector.html
http://developer.android.com/reference/javax/net/ssl/X509ExtendedKeyManager.html
http://developer.android.com/reference/javax/xml/XMLConstants.html
http://developer.android.com/reference/org/xml/sax/helpers/XMLFilterImpl.html
http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderAdapter.html
http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderFactory.html
+http://developer.android.com/reference/android/util/Xml.html
http://developer.android.com/reference/org/xmlpull/v1/XmlPullParserFactory.html
http://developer.android.com/reference/dalvik/system/Zygote.html
-http://developer.android.com/reference/org/apache/http/conn/OperatedClientConnection.html
-http://developer.android.com/reference/org/apache/http/conn/ManagedClientConnection.html
http://developer.android.com/reference/org/apache/http/cookie/CookieAttributeHandler.html
-http://developer.android.com/reference/java/util/concurrent/ExecutorService.html
-http://developer.android.com/reference/org/apache/http/io/SessionInputBuffer.html
-http://developer.android.com/reference/org/apache/http/io/SessionOutputBuffer.html
http://developer.android.com/reference/android/view/inputmethod/InputMethod.html
http://developer.android.com/reference/android/view/inputmethod/InputMethodSession.html
http://developer.android.com/reference/java/util/concurrent/locks/Lock.html
http://developer.android.com/reference/org/apache/http/conn/ssl/X509HostnameVerifier.html
+http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
http://developer.android.com/reference/org/xml/sax/AttributeList.html
http://developer.android.com/reference/org/xml/sax/Attributes.html
-http://developer.android.com/reference/org/apache/http/params/HttpParams.html
-http://developer.android.com/reference/android/widget/ListAdapter.html
-http://developer.android.com/reference/android/widget/SpinnerAdapter.html
-http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
+http://developer.android.com/reference/org/apache/http/auth/Credentials.html
http://developer.android.com/reference/org/apache/http/client/CredentialsProvider.html
http://developer.android.com/reference/org/apache/http/conn/EofSensorWatcher.html
http://developer.android.com/reference/org/apache/http/HeaderElementIterator.html
http://developer.android.com/reference/org/apache/http/HeaderIterator.html
http://developer.android.com/reference/java/util/List.html
-http://developer.android.com/reference/org/apache/http/HttpRequest.html
http://developer.android.com/reference/org/apache/http/client/ResponseHandler.html
http://developer.android.com/reference/org/apache/http/conn/routing/HttpRouteDirector.html
http://developer.android.com/reference/org/apache/http/TokenIterator.html
-http://developer.android.com/reference/android/telephony/gsm/GsmCellLocation.html
http://developer.android.com/reference/javax/net/ssl/TrustManager.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManager.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionOperator.html
http://developer.android.com/reference/org/apache/http/client/HttpRequestRetryHandler.html
-http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoutePlanner.html
http://developer.android.com/reference/org/apache/http/client/RedirectHandler.html
http://developer.android.com/reference/org/apache/http/client/RequestDirector.html
-http://developer.android.com/reference/java/util/concurrent/CompletionService.html
-http://developer.android.com/reference/java/util/concurrent/Executor.html
-http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html
-http://developer.android.com/reference/java/util/concurrent/ThreadFactory.html
-http://developer.android.com/reference/java/util/concurrent/Callable.html
+http://developer.android.com/reference/org/apache/http/HttpEntity.html
http://developer.android.com/reference/java/util/Formattable.html
http://developer.android.com/reference/org/xml/sax/DocumentHandler.html
-http://developer.android.com/reference/org/apache/http/io/HttpTransportMetrics.html
http://developer.android.com/reference/java/security/Principal.html
http://developer.android.com/reference/java/security/KeyPairGenerator.html
http://developer.android.com/reference/java/security/Key.html
+http://developer.android.com/reference/javax/security/auth/callback/CallbackHandler.html
+http://developer.android.com/reference/android/util/Printer.html
http://developer.android.com/reference/java/math/BigDecimal.html
http://developer.android.com/reference/java/security/MessageDigest.html
+http://developer.android.com/reference/android/content/DialogInterface.html
http://developer.android.com/reference/java/util/jar/Pack200.Packer.html
http://developer.android.com/reference/java/util/jar/Pack200.Unpacker.html
http://developer.android.com/reference/org/xml/sax/Parser.html
http://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.html
http://developer.android.com/reference/org/xml/sax/XMLReader.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
+http://developer.android.com/reference/android/content/SearchRecentSuggestionsProvider.html
http://developer.android.com/reference/java/security/SecureRandom.html
http://developer.android.com/reference/java/nio/channels/SelectableChannel.html
-http://developer.android.com/reference/java/nio/channels/DatagramChannel.html
-http://developer.android.com/reference/java/nio/channels/ServerSocketChannel.html
-http://developer.android.com/reference/java/nio/channels/SocketChannel.html
http://developer.android.com/reference/java/security/Signature.html
http://developer.android.com/reference/java/text/CharacterIterator.html
-http://developer.android.com/reference/android/widget/AbsListView.LayoutParams.html
-http://developer.android.com/reference/android/widget/AbsoluteLayout.LayoutParams.html
http://developer.android.com/reference/android/text/style/AbsoluteSizeSpan.html
http://developer.android.com/reference/android/database/AbstractCursor.SelfContentObserver.html
+http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.html
http://developer.android.com/reference/java/util/AbstractList.html
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPooledConnAdapter.html
http://developer.android.com/reference/java/util/prefs/AbstractPreferences.html
http://developer.android.com/reference/java/util/AbstractQueue.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectableChannel.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectionKey.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelector.html
http://developer.android.com/reference/java/util/AbstractSequentialList.html
http://developer.android.com/reference/java/util/AbstractSet.html
http://developer.android.com/reference/android/database/AbstractWindowedCursor.html
http://developer.android.com/reference/java/security/AccessControlException.html
+http://developer.android.com/reference/android/accounts/AccountsException.html
http://developer.android.com/reference/java/security/acl/AclNotFoundException.html
http://developer.android.com/reference/android/content/pm/ActivityInfo.html
+http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase.html
+http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html
+http://developer.android.com/reference/android/content/ActivityNotFoundException.html
+http://developer.android.com/reference/android/test/ActivityTestCase.html
+http://developer.android.com/reference/android/test/ActivityUnitTestCase.html
http://developer.android.com/reference/java/security/AllPermission.html
http://developer.android.com/reference/dalvik/system/AllocationLimitError.html
http://developer.android.com/reference/org/apache/http/conn/ssl/AllowAllHostnameVerifier.html
-http://developer.android.com/reference/android/view/animation/AlphaAnimation.html
-http://developer.android.com/reference/android/widget/AlphabetIndexer.html
-http://developer.android.com/reference/java/nio/channels/AlreadyConnectedException.html
+http://developer.android.com/reference/android/util/AndroidException.html
+http://developer.android.com/reference/android/util/AndroidRuntimeException.html
+http://developer.android.com/reference/android/test/AndroidTestCase.html
+http://developer.android.com/reference/android/test/AndroidTestRunner.html
+http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
+http://developer.android.com/reference/java/lang/annotation/AnnotationFormatError.html
+http://developer.android.com/reference/java/lang/annotation/AnnotationTypeMismatchException.html
http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html
http://developer.android.com/reference/android/content/pm/ApplicationInfo.html
-http://developer.android.com/reference/java/util/concurrent/ArrayBlockingQueue.html
+http://developer.android.com/reference/android/test/ApplicationTestCase.html
http://developer.android.com/reference/junit/framework/AssertionFailedError.html
-http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseInputStream.html
-http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseOutputStream.html
-http://developer.android.com/reference/android/content/res/AssetManager.AssetInputStream.html
-http://developer.android.com/reference/android/os/AsyncTask.Status.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerHandler.html
http://developer.android.com/reference/java/nio/channels/AsynchronousCloseException.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicInteger.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicLong.html
http://developer.android.com/reference/org/xml/sax/ext/Attributes2Impl.html
http://developer.android.com/reference/org/apache/http/auth/params/AuthParamBean.html
-http://developer.android.com/reference/javax/security/auth/AuthPermission.html
http://developer.android.com/reference/java/security/AuthProvider.html
+http://developer.android.com/reference/org/apache/http/auth/AuthenticationException.html
+http://developer.android.com/reference/java/net/Authenticator.RequestorType.html
+http://developer.android.com/reference/android/accounts/AuthenticatorException.html
http://developer.android.com/reference/android/text/style/BackgroundColorSpan.html
http://developer.android.com/reference/java/util/prefs/BackingStoreException.html
http://developer.android.com/reference/javax/crypto/BadPaddingException.html
-http://developer.android.com/reference/android/os/BadParcelableException.html
http://developer.android.com/reference/android/text/method/BaseKeyListener.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie2.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BasicCommentHandler.html
@@ -1709,14 +1989,11 @@
http://developer.android.com/reference/java/security/BasicPermission.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntry.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntryRef.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter.html
http://developer.android.com/reference/org/apache/http/impl/auth/BasicScheme.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BasicSecureHandler.html
http://developer.android.com/reference/java/sql/BatchUpdateException.html
http://developer.android.com/reference/java/math/BigInteger.html
-http://developer.android.com/reference/android/text/BoringLayout.html
-http://developer.android.com/reference/android/text/BoringLayout.Metrics.html
-http://developer.android.com/reference/java/util/concurrent/BrokenBarrierException.html
+http://developer.android.com/reference/java/net/BindException.html
http://developer.android.com/reference/org/apache/http/conn/ssl/BrowserCompatHostnameVerifier.html
http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpec.html
http://developer.android.com/reference/java/nio/BufferOverflowException.html
@@ -1730,12 +2007,7 @@
http://developer.android.com/reference/java/io/ByteArrayInputStream.html
http://developer.android.com/reference/java/io/ByteArrayOutputStream.html
http://developer.android.com/reference/java/nio/ByteBuffer.html
-http://developer.android.com/reference/java/security/cert/CRLException.html
-http://developer.android.com/reference/java/util/concurrent/CancellationException.html
-http://developer.android.com/reference/java/nio/channels/CancelledKeyException.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilderException.html
-http://developer.android.com/reference/java/security/cert/CertPathValidatorException.html
-http://developer.android.com/reference/java/security/cert/CertStoreException.html
+http://developer.android.com/reference/android/telephony/cdma/CdmaCellLocation.html
http://developer.android.com/reference/javax/security/cert/CertificateEncodingException.html
http://developer.android.com/reference/javax/security/cert/CertificateException.html
http://developer.android.com/reference/javax/security/cert/CertificateExpiredException.html
@@ -1746,7 +2018,6 @@
http://developer.android.com/reference/java/nio/CharBuffer.html
http://developer.android.com/reference/java/io/CharConversionException.html
http://developer.android.com/reference/java/nio/charset/CharacterCodingException.html
-http://developer.android.com/reference/android/text/method/CharacterPickerDialog.html
http://developer.android.com/reference/android/preference/CheckBoxPreference.html
http://developer.android.com/reference/java/text/ChoiceFormat.html
http://developer.android.com/reference/org/apache/http/impl/io/ChunkedInputStream.html
@@ -1758,35 +2029,33 @@
http://developer.android.com/reference/org/apache/http/client/params/ClientParamBean.html
http://developer.android.com/reference/org/apache/http/impl/client/ClientParamsStack.html
http://developer.android.com/reference/org/apache/http/client/ClientProtocolException.html
+http://developer.android.com/reference/android/graphics/drawable/ClipDrawable.html
http://developer.android.com/reference/java/nio/channels/ClosedByInterruptException.html
http://developer.android.com/reference/java/nio/channels/ClosedChannelException.html
-http://developer.android.com/reference/java/nio/channels/ClosedSelectorException.html
http://developer.android.com/reference/java/nio/charset/CoderMalfunctionError.html
+http://developer.android.com/reference/android/graphics/drawable/ColorDrawable.html
http://developer.android.com/reference/junit/framework/ComparisonFailure.html
http://developer.android.com/reference/android/content/pm/ComponentInfo.html
-http://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html
-http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html
http://developer.android.com/reference/java/util/ConcurrentModificationException.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnConnectionParamBean.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerParamBean.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnRouteParamBean.html
+http://developer.android.com/reference/java/net/ConnectException.html
http://developer.android.com/reference/org/apache/http/conn/ConnectTimeoutException.html
http://developer.android.com/reference/org/apache/http/ConnectionClosedException.html
http://developer.android.com/reference/javax/sql/ConnectionEvent.html
-http://developer.android.com/reference/java/nio/channels/ConnectionPendingException.html
http://developer.android.com/reference/org/apache/http/conn/ConnectionPoolTimeoutException.html
-http://developer.android.com/reference/java/util/logging/ConsoleHandler.html
http://developer.android.com/reference/java/lang/reflect/Constructor.html
+http://developer.android.com/reference/android/provider/ContactsContract.Presence.html
http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthInputStream.html
http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthOutputStream.html
http://developer.android.com/reference/android/database/ContentObservable.html
+http://developer.android.com/reference/android/content/ContentQueryMap.html
+http://developer.android.com/reference/android/content/ContextWrapper.html
http://developer.android.com/reference/org/apache/http/impl/cookie/CookieSpecBase.html
http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecParamBean.html
-http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArraySet.html
-http://developer.android.com/reference/android/widget/CursorAdapter.html
http://developer.android.com/reference/android/database/CursorIndexOutOfBoundsException.html
http://developer.android.com/reference/android/database/CursorJoiner.Result.html
-http://developer.android.com/reference/android/widget/CursorTreeAdapter.html
http://developer.android.com/reference/android/database/CursorWindow.html
http://developer.android.com/reference/org/w3c/dom/DOMException.html
http://developer.android.com/reference/java/io/DataInputStream.html
@@ -1799,20 +2068,12 @@
http://developer.android.com/reference/android/text/method/DateKeyListener.html
http://developer.android.com/reference/org/apache/http/impl/cookie/DateParseException.html
http://developer.android.com/reference/android/text/method/DateTimeKeyListener.html
-http://developer.android.com/reference/android/os/DeadObjectException.html
http://developer.android.com/reference/java/text/DecimalFormat.html
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnection.html
http://developer.android.com/reference/org/xml/sax/ext/DefaultHandler2.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html
-http://developer.android.com/reference/org/apache/http/impl/DefaultHttpClientConnection.html
-http://developer.android.com/reference/org/apache/http/impl/DefaultHttpServerConnection.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultProxyAuthenticationHandler.html
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultResponseParser.html
http://developer.android.com/reference/org/apache/http/impl/client/DefaultTargetAuthenticationHandler.html
http://developer.android.com/reference/org/apache/http/params/DefaultedHttpParams.html
-http://developer.android.com/reference/java/util/concurrent/DelayQueue.html
-http://developer.android.com/reference/java/util/concurrent/Delayed.html
-http://developer.android.com/reference/javax/security/auth/DestroyFailedException.html
http://developer.android.com/reference/dalvik/system/DexClassLoader.html
http://developer.android.com/reference/android/text/method/DialerKeyListener.html
http://developer.android.com/reference/android/preference/DialogPreference.html
@@ -1822,25 +2083,28 @@
http://developer.android.com/reference/org/apache/http/impl/auth/DigestScheme.html
http://developer.android.com/reference/android/text/method/DigitsKeyListener.html
http://developer.android.com/reference/java/nio/DoubleBuffer.html
+http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.html
+http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.DrawableContainerState.html
http://developer.android.com/reference/java/util/DuplicateFormatFlagsException.html
http://developer.android.com/reference/android/text/style/DynamicDrawableSpan.html
-http://developer.android.com/reference/android/text/DynamicLayout.html
http://developer.android.com/reference/java/io/EOFException.html
http://developer.android.com/reference/android/preference/EditTextPreference.html
+http://developer.android.com/reference/java/lang/annotation/ElementType.html
http://developer.android.com/reference/java/util/EmptyStackException.html
http://developer.android.com/reference/org/apache/http/impl/client/EntityEnclosingRequestWrapper.html
http://developer.android.com/reference/org/apache/http/entity/EntityTemplate.html
http://developer.android.com/reference/java/util/EnumMap.html
http://developer.android.com/reference/java/util/EnumSet.html
http://developer.android.com/reference/org/apache/http/conn/EofSensorInputStream.html
-http://developer.android.com/reference/java/util/concurrent/ExecutionException.html
http://developer.android.com/reference/javax/crypto/ExemptionMechanismException.html
http://developer.android.com/reference/javax/xml/parsers/FactoryConfigurationError.html
http://developer.android.com/reference/java/lang/reflect/Field.html
http://developer.android.com/reference/java/nio/channels/FileChannel.html
http://developer.android.com/reference/org/apache/http/entity/FileEntity.html
-http://developer.android.com/reference/java/util/logging/FileHandler.html
+http://developer.android.com/reference/java/io/FileInputStream.html
http://developer.android.com/reference/java/nio/channels/FileLockInterruptionException.html
+http://developer.android.com/reference/java/io/FileNotFoundException.html
+http://developer.android.com/reference/java/io/FileOutputStream.html
http://developer.android.com/reference/java/io/FilePermission.html
http://developer.android.com/reference/java/io/FileReader.html
http://developer.android.com/reference/java/io/FileWriter.html
@@ -1853,16 +2117,14 @@
http://developer.android.com/reference/java/text/Format.Field.html
http://developer.android.com/reference/java/util/FormatFlagsConversionMismatchException.html
http://developer.android.com/reference/java/util/Formatter.BigDecimalLayoutForm.html
-http://developer.android.com/reference/java/util/FormatterClosedException.html
-http://developer.android.com/reference/android/widget/FrameLayout.LayoutParams.html
+http://developer.android.com/reference/android/opengl/GLES11.html
http://developer.android.com/reference/android/opengl/GLException.html
-http://developer.android.com/reference/android/widget/Gallery.LayoutParams.html
http://developer.android.com/reference/java/security/GeneralSecurityException.html
http://developer.android.com/reference/java/lang/reflect/GenericSignatureFormatError.html
+http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.Orientation.html
http://developer.android.com/reference/java/util/GregorianCalendar.html
-http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.html
-http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.AnimationParameters.html
-http://developer.android.com/reference/android/os/HandlerThread.html
+http://developer.android.com/reference/android/telephony/gsm/GsmCellLocation.html
http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedEvent.html
http://developer.android.com/reference/java/util/HashMap.html
http://developer.android.com/reference/java/util/HashSet.html
@@ -1870,32 +2132,23 @@
http://developer.android.com/reference/android/text/method/HideReturnsTransformationMethod.html
http://developer.android.com/reference/android/webkit/HttpAuthHandler.html
http://developer.android.com/reference/org/apache/http/params/HttpConnectionParamBean.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpDelete.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpEntityEnclosingRequestBase.html
http://developer.android.com/reference/org/apache/http/HttpException.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpGet.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpHead.html
http://developer.android.com/reference/org/apache/http/conn/HttpHostConnectException.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpOptions.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpPost.html
http://developer.android.com/reference/org/apache/http/params/HttpProtocolParamBean.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpPut.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpRequestBase.html
http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestParser.html
http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestWriter.html
http://developer.android.com/reference/org/apache/http/client/HttpResponseException.html
http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseParser.html
http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseWriter.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpTrace.html
+http://developer.android.com/reference/java/net/HttpRetryException.html
+http://developer.android.com/reference/java/net/HttpURLConnection.html
http://developer.android.com/reference/org/apache/http/HttpVersion.html
http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html
-http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.Stub.html
http://developer.android.com/reference/java/util/IdentityHashMap.html
http://developer.android.com/reference/org/apache/http/impl/io/IdentityInputStream.html
http://developer.android.com/reference/org/apache/http/impl/io/IdentityOutputStream.html
http://developer.android.com/reference/java/security/IdentityScope.html
http://developer.android.com/reference/javax/crypto/IllegalBlockSizeException.html
-http://developer.android.com/reference/java/nio/channels/IllegalBlockingModeException.html
http://developer.android.com/reference/java/nio/charset/IllegalCharsetNameException.html
http://developer.android.com/reference/java/util/IllegalFormatCodePointException.html
http://developer.android.com/reference/java/util/IllegalFormatConversionException.html
@@ -1905,45 +2158,55 @@
http://developer.android.com/reference/java/util/IllegalFormatWidthException.html
http://developer.android.com/reference/java/nio/channels/IllegalSelectorException.html
http://developer.android.com/reference/android/text/style/ImageSpan.html
-http://developer.android.com/reference/android/widget/ImageView.ScaleType.html
+http://developer.android.com/reference/java/lang/annotation/IncompleteAnnotationException.html
http://developer.android.com/reference/java/beans/IndexedPropertyChangeEvent.html
+http://developer.android.com/reference/java/net/Inet4Address.html
+http://developer.android.com/reference/java/net/Inet6Address.html
+http://developer.android.com/reference/java/net/InetSocketAddress.html
+http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
http://developer.android.com/reference/android/inputmethodservice/InputMethodService.InputMethodImpl.html
http://developer.android.com/reference/android/inputmethodservice/InputMethodService.InputMethodSessionImpl.html
http://developer.android.com/reference/java/util/InputMismatchException.html
http://developer.android.com/reference/org/apache/http/entity/InputStreamEntity.html
http://developer.android.com/reference/java/io/InputStreamReader.html
+http://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html
http://developer.android.com/reference/android/content/pm/InstrumentationInfo.html
+http://developer.android.com/reference/android/test/InstrumentationTestCase.html
+http://developer.android.com/reference/android/test/InstrumentationTestRunner.html
+http://developer.android.com/reference/android/test/InstrumentationTestSuite.html
http://developer.android.com/reference/java/nio/IntBuffer.html
+http://developer.android.com/reference/android/content/IntentFilter.MalformedMimeTypeException.html
+http://developer.android.com/reference/android/content/IntentSender.SendIntentException.html
+http://developer.android.com/reference/android/app/IntentService.html
http://developer.android.com/reference/java/io/InterruptedIOException.html
http://developer.android.com/reference/java/security/InvalidAlgorithmParameterException.html
http://developer.android.com/reference/java/io/InvalidClassException.html
+http://developer.android.com/reference/org/apache/http/auth/InvalidCredentialsException.html
http://developer.android.com/reference/java/security/InvalidKeyException.html
-http://developer.android.com/reference/java/security/spec/InvalidKeySpecException.html
-http://developer.android.com/reference/java/nio/InvalidMarkException.html
http://developer.android.com/reference/java/io/InvalidObjectException.html
http://developer.android.com/reference/java/security/InvalidParameterException.html
-http://developer.android.com/reference/java/security/spec/InvalidParameterSpecException.html
http://developer.android.com/reference/java/util/prefs/InvalidPreferencesFormatException.html
http://developer.android.com/reference/java/util/InvalidPropertiesFormatException.html
http://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html
+http://developer.android.com/reference/android/test/IsolatedContext.html
http://developer.android.com/reference/org/json/JSONException.html
http://developer.android.com/reference/java/util/jar/JarEntry.html
http://developer.android.com/reference/java/util/jar/JarException.html
http://developer.android.com/reference/java/util/jar/JarFile.html
http://developer.android.com/reference/java/util/jar/JarInputStream.html
http://developer.android.com/reference/java/util/jar/JarOutputStream.html
+http://developer.android.com/reference/java/net/JarURLConnection.html
http://developer.android.com/reference/android/webkit/JsPromptResult.html
http://developer.android.com/reference/java/security/KeyException.html
http://developer.android.com/reference/java/security/KeyManagementException.html
http://developer.android.com/reference/java/security/KeyRep.Type.html
http://developer.android.com/reference/java/security/KeyStoreException.html
+http://developer.android.com/reference/android/content/pm/LabeledIntent.html
http://developer.android.com/reference/java/security/acl/LastOwnerException.html
-http://developer.android.com/reference/android/text/Layout.Alignment.html
+http://developer.android.com/reference/android/graphics/drawable/LayerDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html
http://developer.android.com/reference/java/io/LineNumberInputStream.html
http://developer.android.com/reference/java/io/LineNumberReader.html
-http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
-http://developer.android.com/reference/android/text/method/LinkMovementMethod.html
-http://developer.android.com/reference/java/util/concurrent/LinkedBlockingQueue.html
http://developer.android.com/reference/java/util/LinkedHashMap.html
http://developer.android.com/reference/java/util/LinkedHashSet.html
http://developer.android.com/reference/java/util/LinkedList.html
@@ -1951,18 +2214,17 @@
http://developer.android.com/reference/java/util/ListResourceBundle.html
http://developer.android.com/reference/android/net/LocalSocketAddress.Namespace.html
http://developer.android.com/reference/org/xml/sax/ext/Locator2Impl.html
-http://developer.android.com/reference/java/util/logging/LoggingPermission.html
-http://developer.android.com/reference/android/text/LoginFilter.PasswordFilterGMail.html
-http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGMail.html
-http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGeneric.html
+http://developer.android.com/reference/javax/security/auth/login/LoginException.html
http://developer.android.com/reference/java/nio/LongBuffer.html
+http://developer.android.com/reference/org/apache/http/auth/MalformedChallengeException.html
http://developer.android.com/reference/org/apache/http/MalformedChunkCodingException.html
http://developer.android.com/reference/org/apache/http/cookie/MalformedCookieException.html
http://developer.android.com/reference/java/nio/charset/MalformedInputException.html
http://developer.android.com/reference/java/lang/reflect/MalformedParameterizedTypeException.html
+http://developer.android.com/reference/java/net/MalformedURLException.html
http://developer.android.com/reference/java/nio/MappedByteBuffer.html
http://developer.android.com/reference/android/text/style/MaskFilterSpan.html
-http://developer.android.com/reference/java/util/logging/MemoryHandler.html
+http://developer.android.com/reference/android/database/MatrixCursor.html
http://developer.android.com/reference/android/database/MergeCursor.html
http://developer.android.com/reference/java/text/MessageFormat.html
http://developer.android.com/reference/java/text/MessageFormat.Field.html
@@ -1972,31 +2234,33 @@
http://developer.android.com/reference/java/util/MissingFormatArgumentException.html
http://developer.android.com/reference/java/util/MissingFormatWidthException.html
http://developer.android.com/reference/java/util/MissingResourceException.html
+http://developer.android.com/reference/android/test/mock/MockApplication.html
http://developer.android.com/reference/android/test/mock/MockContentResolver.html
+http://developer.android.com/reference/android/test/mock/MockContext.html
http://developer.android.com/reference/android/test/mock/MockPackageManager.html
-http://developer.android.com/reference/android/test/mock/MockResources.html
http://developer.android.com/reference/android/text/method/MultiTapKeyListener.html
+http://developer.android.com/reference/java/net/MulticastSocket.html
+http://developer.android.com/reference/android/content/MutableContextWrapper.html
http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngineException.html
http://developer.android.com/reference/org/apache/http/impl/auth/NTLMScheme.html
+http://developer.android.com/reference/java/net/NetPermission.html
http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDomainHandler.html
http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpec.html
+http://developer.android.com/reference/android/accounts/NetworkErrorException.html
http://developer.android.com/reference/android/net/NetworkInfo.DetailedState.html
http://developer.android.com/reference/android/net/NetworkInfo.State.html
-http://developer.android.com/reference/java/nio/channels/NoConnectionPendingException.html
+http://developer.android.com/reference/android/graphics/drawable/NinePatchDrawable.html
http://developer.android.com/reference/org/apache/http/NoHttpResponseException.html
+http://developer.android.com/reference/java/net/NoRouteToHostException.html
http://developer.android.com/reference/java/security/NoSuchAlgorithmException.html
http://developer.android.com/reference/java/util/NoSuchElementException.html
http://developer.android.com/reference/javax/crypto/NoSuchPaddingException.html
http://developer.android.com/reference/java/security/NoSuchProviderException.html
http://developer.android.com/reference/java/util/prefs/NodeChangeEvent.html
-http://developer.android.com/reference/java/nio/channels/NonReadableChannelException.html
http://developer.android.com/reference/org/apache/http/client/NonRepeatableRequestException.html
-http://developer.android.com/reference/java/nio/channels/NonWritableChannelException.html
http://developer.android.com/reference/java/io/NotActiveException.html
http://developer.android.com/reference/java/security/acl/NotOwnerException.html
http://developer.android.com/reference/java/io/NotSerializableException.html
-http://developer.android.com/reference/java/nio/channels/NotYetBoundException.html
-http://developer.android.com/reference/java/nio/channels/NotYetConnectedException.html
http://developer.android.com/reference/javax/crypto/NullCipher.html
http://developer.android.com/reference/java/text/NumberFormat.html
http://developer.android.com/reference/java/text/NumberFormat.Field.html
@@ -2004,47 +2268,50 @@
http://developer.android.com/reference/java/io/ObjectInputStream.html
http://developer.android.com/reference/java/io/ObjectOutputStream.html
http://developer.android.com/reference/java/io/ObjectStreamException.html
+http://developer.android.com/reference/android/content/OperationApplicationException.html
+http://developer.android.com/reference/android/accounts/OperationCanceledException.html
http://developer.android.com/reference/java/io/OptionalDataException.html
http://developer.android.com/reference/java/io/OutputStreamWriter.html
-http://developer.android.com/reference/java/nio/channels/OverlappingFileLockException.html
-http://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec.html
-http://developer.android.com/reference/java/security/cert/PKIXBuilderParameters.html
-http://developer.android.com/reference/java/security/cert/PKIXCertPathBuilderResult.html
http://developer.android.com/reference/javax/crypto/spec/PSource.PSpecified.html
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseInputStream.html
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseOutputStream.html
-http://developer.android.com/reference/android/os/ParcelFormatException.html
+http://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html
+http://developer.android.com/reference/android/graphics/drawable/PaintDrawable.html
http://developer.android.com/reference/java/text/ParseException.html
http://developer.android.com/reference/javax/xml/parsers/ParserConfigurationException.html
http://developer.android.com/reference/dalvik/system/PathClassLoader.html
-http://developer.android.com/reference/java/util/regex/PatternSyntaxException.html
+http://developer.android.com/reference/android/content/pm/PathPermission.html
+http://developer.android.com/reference/android/app/PendingIntent.CanceledException.html
http://developer.android.com/reference/android/content/pm/PermissionGroupInfo.html
http://developer.android.com/reference/android/content/pm/PermissionInfo.html
http://developer.android.com/reference/java/security/Permissions.html
+http://developer.android.com/reference/java/lang/ref/PhantomReference.html
+http://developer.android.com/reference/android/graphics/drawable/PictureDrawable.html
http://developer.android.com/reference/java/nio/channels/Pipe.SinkChannel.html
http://developer.android.com/reference/java/nio/channels/Pipe.SourceChannel.html
http://developer.android.com/reference/java/io/PipedInputStream.html
http://developer.android.com/reference/java/io/PipedOutputStream.html
http://developer.android.com/reference/java/io/PipedReader.html
http://developer.android.com/reference/java/io/PipedWriter.html
+http://developer.android.com/reference/java/net/PortUnreachableException.html
http://developer.android.com/reference/dalvik/system/PotentialDeadlockError.html
http://developer.android.com/reference/android/preference/Preference.BaseSavedState.html
http://developer.android.com/reference/android/preference/PreferenceCategory.html
http://developer.android.com/reference/java/util/prefs/PreferenceChangeEvent.html
http://developer.android.com/reference/android/preference/PreferenceGroup.html
http://developer.android.com/reference/android/preference/PreferenceScreen.html
-http://developer.android.com/reference/java/util/concurrent/PriorityBlockingQueue.html
http://developer.android.com/reference/java/util/PriorityQueue.html
-http://developer.android.com/reference/javax/security/auth/PrivateCredentialPermission.html
http://developer.android.com/reference/java/security/PrivilegedActionException.html
http://developer.android.com/reference/java/util/Properties.html
http://developer.android.com/reference/java/beans/PropertyChangeEvent.html
http://developer.android.com/reference/java/beans/PropertyChangeListenerProxy.html
http://developer.android.com/reference/java/util/PropertyPermission.html
http://developer.android.com/reference/java/util/PropertyResourceBundle.html
+http://developer.android.com/reference/java/net/ProtocolException.html
http://developer.android.com/reference/java/security/Provider.html
http://developer.android.com/reference/java/security/ProviderException.html
http://developer.android.com/reference/android/content/pm/ProviderInfo.html
+http://developer.android.com/reference/android/test/ProviderTestCase.html
+http://developer.android.com/reference/android/test/ProviderTestCase2.html
+http://developer.android.com/reference/java/net/Proxy.Type.html
http://developer.android.com/reference/java/io/PushbackInputStream.html
http://developer.android.com/reference/java/io/PushbackReader.html
http://developer.android.com/reference/android/text/method/QwertyKeyListener.html
@@ -2052,25 +2319,19 @@
http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109VersionHandler.html
http://developer.android.com/reference/org/apache/http/impl/auth/RFC2617Scheme.html
http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965Spec.html
-http://developer.android.com/reference/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.html
-http://developer.android.com/reference/java/security/spec/RSAPrivateCrtKeySpec.html
-http://developer.android.com/reference/android/widget/RadioGroup.LayoutParams.html
http://developer.android.com/reference/android/text/style/RasterizerSpan.html
http://developer.android.com/reference/java/nio/ReadOnlyBufferException.html
+http://developer.android.com/reference/android/content/ReceiverCallNotAllowedException.html
http://developer.android.com/reference/org/apache/http/client/RedirectException.html
http://developer.android.com/reference/java/lang/reflect/ReflectPermission.html
-http://developer.android.com/reference/java/util/concurrent/RejectedExecutionException.html
-http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
http://developer.android.com/reference/android/text/style/RelativeSizeSpan.html
-http://developer.android.com/reference/android/os/RemoteException.html
-http://developer.android.com/reference/android/widget/RemoteViews.ActionException.html
+http://developer.android.com/reference/android/test/RenamingDelegatingContext.html
http://developer.android.com/reference/android/text/style/ReplacementSpan.html
http://developer.android.com/reference/org/apache/http/impl/client/RequestWrapper.html
-http://developer.android.com/reference/android/widget/ResourceCursorAdapter.html
-http://developer.android.com/reference/android/widget/ResourceCursorTreeAdapter.html
+http://developer.android.com/reference/java/lang/annotation/RetentionPolicy.html
http://developer.android.com/reference/android/preference/RingtonePreference.html
http://developer.android.com/reference/android/sax/RootElement.html
-http://developer.android.com/reference/android/view/animation/RotateAnimation.html
+http://developer.android.com/reference/android/graphics/drawable/RotateDrawable.html
http://developer.android.com/reference/java/math/RoundingMode.html
http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.LayerType.html
http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.TunnelType.html
@@ -2085,9 +2346,11 @@
http://developer.android.com/reference/java/sql/SQLWarning.html
http://developer.android.com/reference/android/database/sqlite/SQLiteAbortException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteConstraintException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteCursor.html
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabaseCorruptException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteDiskIOException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteDoneException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteFullException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteMisuseException.html
http://developer.android.com/reference/android/database/sqlite/SQLiteProgram.html
@@ -2107,44 +2370,40 @@
http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingEvent.html
http://developer.android.com/reference/javax/net/ssl/SSLSocket.html
http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html
-http://developer.android.com/reference/android/view/animation/ScaleAnimation.html
+http://developer.android.com/reference/android/graphics/drawable/ScaleDrawable.html
http://developer.android.com/reference/android/text/style/ScaleXSpan.html
-http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html
+http://developer.android.com/reference/java/net/SecureCacheResponse.html
http://developer.android.com/reference/java/security/SecureClassLoader.html
http://developer.android.com/reference/java/security/SecurityPermission.html
http://developer.android.com/reference/java/io/SequenceInputStream.html
http://developer.android.com/reference/org/apache/http/entity/SerializableEntity.html
http://developer.android.com/reference/java/io/SerializablePermission.html
http://developer.android.com/reference/android/content/pm/ServiceInfo.html
+http://developer.android.com/reference/android/test/ServiceTestCase.html
+http://developer.android.com/reference/android/provider/Settings.Secure.html
http://developer.android.com/reference/android/provider/Settings.SettingNotFoundException.html
http://developer.android.com/reference/android/provider/Settings.System.html
http://developer.android.com/reference/java/nio/ShortBuffer.html
http://developer.android.com/reference/javax/crypto/ShortBufferException.html
http://developer.android.com/reference/java/security/SignatureException.html
http://developer.android.com/reference/java/security/Signer.html
-http://developer.android.com/reference/android/widget/SimpleAdapter.html
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
-http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
http://developer.android.com/reference/java/text/SimpleDateFormat.html
-http://developer.android.com/reference/android/widget/SimpleExpandableListAdapter.html
-http://developer.android.com/reference/java/util/logging/SimpleFormatter.html
http://developer.android.com/reference/java/util/SimpleTimeZone.html
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.ConnAdapter.html
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.PoolEntry.html
+http://developer.android.com/reference/android/test/SingleLaunchActivityTestCase.html
http://developer.android.com/reference/android/text/method/SingleLineTransformationMethod.html
http://developer.android.com/reference/android/telephony/gsm/SmsMessage.MessageClass.html
-http://developer.android.com/reference/java/util/logging/SocketHandler.html
-http://developer.android.com/reference/org/apache/http/impl/SocketHttpClientConnection.html
-http://developer.android.com/reference/org/apache/http/impl/SocketHttpServerConnection.html
+http://developer.android.com/reference/java/net/SocketException.html
http://developer.android.com/reference/org/apache/http/impl/io/SocketInputBuffer.html
http://developer.android.com/reference/org/apache/http/impl/io/SocketOutputBuffer.html
+http://developer.android.com/reference/java/net/SocketPermission.html
+http://developer.android.com/reference/java/net/SocketTimeoutException.html
+http://developer.android.com/reference/java/lang/ref/SoftReference.html
http://developer.android.com/reference/android/webkit/SslErrorHandler.html
http://developer.android.com/reference/java/util/Stack.html
http://developer.android.com/reference/android/database/StaleDataException.html
http://developer.android.com/reference/dalvik/system/StaleDexCacheError.html
-http://developer.android.com/reference/android/text/StaticLayout.html
+http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html
http://developer.android.com/reference/java/io/StreamCorruptedException.html
-http://developer.android.com/reference/java/util/logging/StreamHandler.html
http://developer.android.com/reference/org/apache/http/conn/ssl/StrictHostnameVerifier.html
http://developer.android.com/reference/android/text/style/StrikethroughSpan.html
http://developer.android.com/reference/java/io/StringBufferInputStream.html
@@ -2155,44 +2414,40 @@
http://developer.android.com/reference/android/text/style/SubscriptSpan.html
http://developer.android.com/reference/android/text/style/SuperscriptSpan.html
http://developer.android.com/reference/android/net/wifi/SupplicantState.html
-http://developer.android.com/reference/org/apache/http/protocol/SyncBasicHttpContext.html
+http://developer.android.com/reference/android/test/SyncBaseInstrumentation.html
http://developer.android.com/reference/java/io/SyncFailedException.html
-http://developer.android.com/reference/java/util/concurrent/SynchronousQueue.html
-http://developer.android.com/reference/android/widget/TableLayout.LayoutParams.html
-http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html
+http://developer.android.com/reference/junit/framework/TestCase.html
http://developer.android.com/reference/android/test/suitebuilder/TestSuiteBuilder.FailedToCreateTests.html
http://developer.android.com/reference/android/text/style/TextAppearanceSpan.html
http://developer.android.com/reference/java/awt/font/TextAttribute.html
http://developer.android.com/reference/android/text/method/TextKeyListener.html
http://developer.android.com/reference/android/text/method/TextKeyListener.Capitalize.html
-http://developer.android.com/reference/android/text/TextPaint.html
-http://developer.android.com/reference/android/text/TextUtils.TruncateAt.html
-http://developer.android.com/reference/android/widget/TextView.BufferType.html
-http://developer.android.com/reference/android/widget/TextView.SavedState.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
http://developer.android.com/reference/java/sql/Time.html
+http://developer.android.com/reference/android/util/TimeFormatException.html
http://developer.android.com/reference/android/text/method/TimeKeyListener.html
-http://developer.android.com/reference/java/util/concurrent/TimeUnit.html
-http://developer.android.com/reference/java/util/concurrent/TimeoutException.html
http://developer.android.com/reference/java/sql/Timestamp.html
http://developer.android.com/reference/java/util/TooManyListenersException.html
-http://developer.android.com/reference/android/view/animation/TranslateAnimation.html
+http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html
http://developer.android.com/reference/java/util/TreeMap.html
http://developer.android.com/reference/java/util/TreeSet.html
http://developer.android.com/reference/org/apache/http/impl/client/TunnelRefusedException.html
http://developer.android.com/reference/android/text/style/TypefaceSpan.html
-http://developer.android.com/reference/android/text/style/URLSpan.html
+http://developer.android.com/reference/java/net/URISyntaxException.html
+http://developer.android.com/reference/java/net/URLClassLoader.html
http://developer.android.com/reference/java/io/UTFDataFormatException.html
http://developer.android.com/reference/java/lang/reflect/UndeclaredThrowableException.html
http://developer.android.com/reference/android/text/style/UnderlineSpan.html
http://developer.android.com/reference/java/util/UnknownFormatConversionException.html
http://developer.android.com/reference/java/util/UnknownFormatFlagsException.html
+http://developer.android.com/reference/java/net/UnknownHostException.html
+http://developer.android.com/reference/java/net/UnknownServiceException.html
http://developer.android.com/reference/java/nio/charset/UnmappableCharacterException.html
http://developer.android.com/reference/java/security/UnrecoverableEntryException.html
http://developer.android.com/reference/java/security/UnrecoverableKeyException.html
http://developer.android.com/reference/java/nio/channels/UnresolvedAddressException.html
http://developer.android.com/reference/java/security/UnresolvedPermission.html
http://developer.android.com/reference/java/nio/channels/UnsupportedAddressTypeException.html
+http://developer.android.com/reference/javax/security/auth/callback/UnsupportedCallbackException.html
http://developer.android.com/reference/java/nio/charset/UnsupportedCharsetException.html
http://developer.android.com/reference/org/apache/http/impl/auth/UnsupportedDigestAlgorithmException.html
http://developer.android.com/reference/java/io/UnsupportedEncodingException.html
@@ -2204,111 +2459,123 @@
http://developer.android.com/reference/android/webkit/WebSettings.RenderPriority.html
http://developer.android.com/reference/android/webkit/WebSettings.TextSize.html
http://developer.android.com/reference/java/io/WriteAbortedException.html
-http://developer.android.com/reference/java/security/cert/X509CRL.html
http://developer.android.com/reference/javax/security/cert/X509Certificate.html
-http://developer.android.com/reference/java/security/spec/X509EncodedKeySpec.html
-http://developer.android.com/reference/java/util/logging/XMLFormatter.html
+http://developer.android.com/reference/android/util/Xml.Encoding.html
http://developer.android.com/reference/java/util/Queue.html
-http://developer.android.com/reference/java/util/concurrent/BlockingQueue.html
http://developer.android.com/reference/org/xml/sax/ext/Attributes2.html
http://developer.android.com/reference/javax/sql/PooledConnection.html
http://developer.android.com/reference/java/util/Set.html
http://developer.android.com/reference/org/xml/sax/ext/LexicalHandler.html
http://developer.android.com/reference/org/xml/sax/ext/DeclHandler.html
http://developer.android.com/reference/org/xml/sax/ext/EntityResolver2.html
-http://developer.android.com/reference/javax/security/auth/Destroyable.html
-http://developer.android.com/reference/org/apache/http/HttpEntityEnclosingRequest.html
http://developer.android.com/reference/org/xml/sax/ext/Locator2.html
http://developer.android.com/reference/javax/sql/RowSet.html
-http://developer.android.com/reference/javax/net/ssl/SSLSession.html
-http://developer.android.com/reference/java/security/Certificate.html
-http://developer.android.com/reference/java/security/DomainCombiner.html
-http://developer.android.com/reference/java/security/Guard.html
-http://developer.android.com/reference/java/security/KeyStore.Entry.html
-http://developer.android.com/reference/java/security/KeyStore.LoadStoreParameter.html
-http://developer.android.com/reference/java/security/KeyStore.ProtectionParameter.html
-http://developer.android.com/reference/java/security/PrivateKey.html
+http://developer.android.com/reference/javax/security/auth/callback/Callback.html
+http://developer.android.com/reference/org/apache/http/ConnectionReuseStrategy.html
+http://developer.android.com/reference/org/apache/http/FormattedHeader.html
+http://developer.android.com/reference/org/apache/http/Header.html
+http://developer.android.com/reference/org/apache/http/HeaderElement.html
+http://developer.android.com/reference/org/apache/http/HttpMessage.html
+http://developer.android.com/reference/org/apache/http/HttpRequestFactory.html
+http://developer.android.com/reference/org/apache/http/HttpRequestInterceptor.html
+http://developer.android.com/reference/org/apache/http/HttpResponseFactory.html
+http://developer.android.com/reference/org/apache/http/HttpResponseInterceptor.html
+http://developer.android.com/reference/org/apache/http/HttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/HttpStatus.html
+http://developer.android.com/reference/org/apache/http/NameValuePair.html
+http://developer.android.com/reference/org/apache/http/ReasonPhraseCatalog.html
+http://developer.android.com/reference/org/apache/http/RequestLine.html
+http://developer.android.com/reference/org/apache/http/StatusLine.html
+http://developer.android.com/reference/org/apache/http/ParseException.html
+http://developer.android.com/reference/org/apache/http/ProtocolException.html
+http://developer.android.com/reference/android/net/wifi/package-descr.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/AndroidManifest.html
+http://developer.android.com/reference/org/apache/http/auth/AuthScheme.html
+http://developer.android.com/reference/org/apache/http/auth/AuthSchemeFactory.html
+http://developer.android.com/reference/org/apache/http/auth/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManagerFactory.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionRequest.html
+http://developer.android.com/reference/org/apache/http/conn/ConnectionKeepAliveStrategy.html
+http://developer.android.com/reference/android/graphics/drawable/Animatable.html
+http://developer.android.com/reference/android/graphics/drawable/package-descr.html
+http://developer.android.com/reference/android/test/PerformanceTestCase.html
+http://developer.android.com/reference/android/test/PerformanceTestCase.Intermediates.html
+http://developer.android.com/reference/android/test/TestSuiteProvider.html
+http://developer.android.com/reference/android/test/AssertionFailedError.html
+http://developer.android.com/reference/android/test/ComparisonFailure.html
+http://developer.android.com/reference/android/test/package-descr.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi-v6/app_notes.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi-v6/live_folder_notes.html
+http://developer.android.com/reference/java/util/Collection.html
http://developer.android.com/reference/java/security/PrivilegedAction.html
-http://developer.android.com/reference/java/security/PrivilegedExceptionAction.html
-http://developer.android.com/reference/java/security/PublicKey.html
-http://developer.android.com/reference/java/security/package-descr.html
-http://developer.android.com/reference/android/widget/AbsListView.OnScrollListener.html
-http://developer.android.com/reference/android/widget/AbsListView.RecyclerListener.html
-http://developer.android.com/reference/android/widget/AdapterView.OnItemLongClickListener.html
-http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html
-http://developer.android.com/reference/android/widget/AutoCompleteTextView.Validator.html
-http://developer.android.com/reference/android/widget/Chronometer.OnChronometerTickListener.html
-http://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html
-http://developer.android.com/reference/android/widget/DatePicker.OnDateChangedListener.html
-http://developer.android.com/reference/android/widget/ExpandableListView.OnChildClickListener.html
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupClickListener.html
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupCollapseListener.html
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupExpandListener.html
-http://developer.android.com/reference/android/widget/Filter.FilterListener.html
-http://developer.android.com/reference/android/widget/Filterable.html
-http://developer.android.com/reference/android/widget/FilterQueryProvider.html
-http://developer.android.com/reference/android/widget/MediaController.MediaPlayerControl.html
-http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.Tokenizer.html
-http://developer.android.com/reference/android/widget/PopupWindow.OnDismissListener.html
-http://developer.android.com/reference/android/widget/RadioGroup.OnCheckedChangeListener.html
-http://developer.android.com/reference/android/widget/RatingBar.OnRatingBarChangeListener.html
-http://developer.android.com/reference/android/widget/SectionIndexer.html
-http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.html
-http://developer.android.com/reference/android/widget/SimpleAdapter.ViewBinder.html
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.CursorToStringConverter.html
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
-http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerCloseListener.html
-http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerOpenListener.html
-http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerScrollListener.html
-http://developer.android.com/reference/android/widget/TabHost.OnTabChangeListener.html
-http://developer.android.com/reference/android/widget/TabHost.TabContentFactory.html
-http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html
-http://developer.android.com/reference/android/widget/TimePicker.OnTimeChangedListener.html
-http://developer.android.com/reference/android/widget/ViewSwitcher.ViewFactory.html
-http://developer.android.com/reference/android/widget/WrapperListAdapter.html
-http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html
+http://developer.android.com/reference/java/io/Serializable.html
+http://developer.android.com/reference/java/lang/reflect/AnnotatedElement.html
+http://developer.android.com/reference/java/lang/reflect/GenericDeclaration.html
+http://developer.android.com/reference/java/lang/reflect/Type.html
+http://developer.android.com/reference/java/lang/annotation/Annotation.html
+http://developer.android.com/reference/java/lang/reflect/TypeVariable.html
+http://developer.android.com/reference/java/util/Comparator.html
+http://developer.android.com/reference/java/util/Enumeration.html
+http://developer.android.com/reference/java/util/EventListener.html
+http://developer.android.com/reference/java/util/Iterator.html
+http://developer.android.com/reference/java/util/ListIterator.html
+http://developer.android.com/reference/java/util/Map.html
+http://developer.android.com/reference/java/util/Map.Entry.html
+http://developer.android.com/reference/java/util/Observer.html
+http://developer.android.com/reference/java/util/RandomAccess.html
+http://developer.android.com/reference/java/util/SortedMap.html
+http://developer.android.com/reference/java/util/SortedSet.html
+http://developer.android.com/reference/android/provider/BaseColumns.html
+http://developer.android.com/reference/android/provider/Contacts.ContactMethodsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.ExtensionsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.GroupsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.OrganizationColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PeopleColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PhonesColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PhotosColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PresenceColumns.html
+http://developer.android.com/reference/android/provider/Contacts.SettingsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.BaseSyncColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.BaseTypes.html
+http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.CommonColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.ContactOptionsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.ContactStatusColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.DataColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.DataColumnsWithJoins.html
+http://developer.android.com/reference/android/provider/ContactsContract.GroupsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.PresenceColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.RawContactsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.SettingsColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.StatusColumns.html
+http://developer.android.com/reference/android/provider/ContactsContract.SyncColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.AlbumColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.ArtistColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.GenresColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.PlaylistsColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Video.VideoColumns.html
+http://developer.android.com/reference/android/provider/OpenableColumns.html
+http://developer.android.com/reference/android/provider/SyncStateContract.Columns.html
http://developer.android.com/reference/java/io/Closeable.html
+http://developer.android.com/reference/java/io/Flushable.html
http://developer.android.com/reference/java/io/DataInput.html
http://developer.android.com/reference/java/io/DataOutput.html
http://developer.android.com/reference/java/io/Externalizable.html
http://developer.android.com/reference/java/io/FileFilter.html
http://developer.android.com/reference/java/io/FilenameFilter.html
-http://developer.android.com/reference/java/io/Flushable.html
http://developer.android.com/reference/java/io/ObjectInput.html
http://developer.android.com/reference/java/io/ObjectInputValidation.html
http://developer.android.com/reference/java/io/ObjectOutput.html
http://developer.android.com/reference/java/io/ObjectStreamConstants.html
-http://developer.android.com/reference/java/io/Serializable.html
-http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html
-http://developer.android.com/reference/org/xml/sax/ContentHandler.html
-http://developer.android.com/reference/java/security/acl/Acl.html
-http://developer.android.com/reference/java/security/acl/AclEntry.html
-http://developer.android.com/reference/java/security/acl/Group.html
-http://developer.android.com/reference/java/security/acl/Owner.html
-http://developer.android.com/reference/java/security/acl/Permission.html
-http://developer.android.com/reference/java/security/acl/package-descr.html
-http://developer.android.com/reference/android/os/Parcelable.Creator.html
-http://developer.android.com/reference/org/apache/http/client/AuthenticationHandler.html
-http://developer.android.com/reference/org/apache/http/client/HttpClient.html
-http://developer.android.com/reference/org/apache/http/client/UserTokenHandler.html
-http://developer.android.com/reference/org/apache/http/client/package-descr.html
-http://developer.android.com/reference/org/apache/http/HttpResponse.html
-http://developer.android.com/reference/android/hardware/Camera.AutoFocusCallback.html
-http://developer.android.com/reference/android/hardware/Camera.ErrorCallback.html
-http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html
-http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html
-http://developer.android.com/reference/android/hardware/Camera.ShutterCallback.html
-http://developer.android.com/reference/android/hardware/SensorEventListener.html
-http://developer.android.com/reference/android/hardware/SensorListener.html
-http://developer.android.com/reference/android/hardware/Camera.html
-http://developer.android.com/reference/android/hardware/package-descr.html
-http://developer.android.com/reference/java/nio/charset/package-descr.html
-http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html
-http://developer.android.com/reference/android/preference/Preference.OnPreferenceClickListener.html
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityDestroyListener.html
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityResultListener.html
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityStopListener.html
-http://developer.android.com/reference/android/preference/package-descr.html
+http://developer.android.com/reference/android/accounts/AccountManagerCallback.html
+http://developer.android.com/reference/android/accounts/AccountManagerFuture.html
+http://developer.android.com/reference/android/accounts/OnAccountsUpdateListener.html
http://developer.android.com/reference/java/nio/channels/ByteChannel.html
http://developer.android.com/reference/java/nio/channels/Channel.html
http://developer.android.com/reference/java/nio/channels/GatheringByteChannel.html
@@ -2316,49 +2583,65 @@
http://developer.android.com/reference/java/nio/channels/ReadableByteChannel.html
http://developer.android.com/reference/java/nio/channels/ScatteringByteChannel.html
http://developer.android.com/reference/java/nio/channels/WritableByteChannel.html
-http://developer.android.com/reference/java/util/Map.Entry.html
-http://developer.android.com/reference/org/apache/http/message/HeaderValueFormatter.html
-http://developer.android.com/reference/org/apache/http/message/HeaderValueParser.html
-http://developer.android.com/reference/org/apache/http/message/LineFormatter.html
-http://developer.android.com/reference/org/apache/http/message/LineParser.html
-http://developer.android.com/reference/org/apache/http/HeaderElement.html
-http://developer.android.com/reference/org/apache/http/NameValuePair.html
-http://developer.android.com/reference/javax/crypto/SecretKey.html
-http://developer.android.com/reference/java/security/spec/AlgorithmParameterSpec.html
+http://developer.android.com/reference/org/apache/http/client/AuthenticationHandler.html
+http://developer.android.com/reference/org/apache/http/client/UserTokenHandler.html
+http://developer.android.com/reference/org/apache/http/client/HttpClient.html
+http://developer.android.com/reference/android/util/package-descr.html
+http://developer.android.com/reference/android/app/DatePickerDialog.OnDateSetListener.html
+http://developer.android.com/reference/android/app/KeyguardManager.OnKeyguardExitResult.html
+http://developer.android.com/reference/android/app/PendingIntent.OnFinished.html
+http://developer.android.com/reference/android/app/SearchManager.OnCancelListener.html
+http://developer.android.com/reference/android/app/SearchManager.OnDismissListener.html
+http://developer.android.com/reference/android/app/TimePickerDialog.OnTimeSetListener.html
+http://developer.android.com/guide/topics/ui/notifiers/notifications.html
+http://developer.android.com/reference/java/text/AttributedCharacterIterator.html
+http://developer.android.com/reference/org/xml/sax/helpers/package-descr.html
+http://developer.android.com/reference/org/apache/http/params/CoreConnectionPNames.html
+http://developer.android.com/reference/org/apache/http/params/CoreProtocolPNames.html
+http://developer.android.com/reference/java/security/Certificate.html
+http://developer.android.com/reference/java/security/DomainCombiner.html
+http://developer.android.com/reference/java/security/Guard.html
+http://developer.android.com/reference/java/security/KeyStore.Entry.html
+http://developer.android.com/reference/java/security/KeyStore.LoadStoreParameter.html
+http://developer.android.com/reference/java/security/KeyStore.ProtectionParameter.html
+http://developer.android.com/reference/java/security/PrivateKey.html
+http://developer.android.com/reference/java/security/PrivilegedExceptionAction.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethod.SessionCallback.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethodSession.EventCallback.html
http://developer.android.com/reference/android/database/CrossProcessCursor.html
http://developer.android.com/reference/android/database/CharArrayBuffer.html
http://developer.android.com/reference/android/database/Observable.html
http://developer.android.com/reference/android/database/SQLException.html
-http://developer.android.com/reference/java/util/Collection.html
-http://developer.android.com/reference/java/util/Comparator.html
-http://developer.android.com/reference/java/util/Enumeration.html
-http://developer.android.com/reference/java/util/EventListener.html
-http://developer.android.com/reference/java/util/Iterator.html
-http://developer.android.com/reference/java/util/ListIterator.html
-http://developer.android.com/reference/java/util/Map.html
-http://developer.android.com/reference/java/util/Observer.html
-http://developer.android.com/reference/java/util/RandomAccess.html
-http://developer.android.com/reference/java/util/SortedMap.html
-http://developer.android.com/reference/java/util/SortedSet.html
-http://developer.android.com/reference/org/apache/http/cookie/ClientCookie.html
-http://developer.android.com/reference/org/apache/http/cookie/Cookie.html
-http://developer.android.com/reference/org/apache/http/cookie/CookieSpec.html
-http://developer.android.com/reference/org/apache/http/cookie/CookieSpecFactory.html
-http://developer.android.com/reference/org/apache/http/cookie/SetCookie.html
-http://developer.android.com/reference/org/apache/http/cookie/SetCookie2.html
-http://developer.android.com/reference/org/apache/http/cookie/SM.html
-http://developer.android.com/reference/android/content/res/XmlResourceParser.html
-http://developer.android.com/reference/org/apache/http/conn/params/ConnConnectionPNames.html
-http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerPNames.html
-http://developer.android.com/reference/org/apache/http/conn/params/ConnPerRoute.html
-http://developer.android.com/reference/org/apache/http/conn/params/ConnRoutePNames.html
-http://developer.android.com/reference/org/apache/http/client/methods/AbortableHttpRequest.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpUriRequest.html
-http://developer.android.com/reference/org/apache/http/RequestLine.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionRequest.html
-http://developer.android.com/reference/org/apache/http/conn/ConnectionReleaseTrigger.html
-http://developer.android.com/reference/org/apache/http/Header.html
-http://developer.android.com/reference/org/apache/http/HttpMessage.html
+http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
+http://developer.android.com/reference/android/text/style/AlignmentSpan.html
+http://developer.android.com/reference/android/text/style/LeadingMarginSpan.html
+http://developer.android.com/reference/android/text/style/LineBackgroundSpan.html
+http://developer.android.com/reference/android/text/style/LineHeightSpan.html
+http://developer.android.com/reference/android/text/style/LineHeightSpan.WithDensity.html
+http://developer.android.com/reference/android/text/style/ParagraphStyle.html
+http://developer.android.com/reference/android/text/style/TabStopSpan.html
+http://developer.android.com/reference/android/text/style/UpdateAppearance.html
+http://developer.android.com/reference/android/text/style/UpdateLayout.html
+http://developer.android.com/reference/android/text/style/WrapTogetherSpan.html
+http://developer.android.com/reference/android/content/ComponentCallbacks.html
+http://developer.android.com/reference/android/content/DialogInterface.OnCancelListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnClickListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnKeyListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnMultiChoiceClickListener.html
+http://developer.android.com/reference/android/content/IntentSender.OnFinished.html
+http://developer.android.com/reference/android/content/SharedPreferences.html
+http://developer.android.com/reference/android/content/SharedPreferences.Editor.html
+http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html
+http://developer.android.com/reference/android/content/SyncStatusObserver.html
+http://developer.android.com/reference/android/webkit/DownloadListener.html
+http://developer.android.com/reference/android/webkit/GeolocationPermissions.Callback.html
+http://developer.android.com/reference/android/webkit/Plugin.PreferencesClickHandler.html
+http://developer.android.com/reference/android/webkit/PluginStub.html
+http://developer.android.com/reference/android/webkit/UrlInterceptHandler.html
+http://developer.android.com/reference/android/webkit/WebIconDatabase.IconListener.html
+http://developer.android.com/reference/android/webkit/WebStorage.QuotaUpdater.html
+http://developer.android.com/reference/android/webkit/WebView.PictureListener.html
http://developer.android.com/reference/android/media/AudioRecord.OnRecordPositionUpdateListener.html
http://developer.android.com/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener.html
http://developer.android.com/reference/android/media/JetPlayer.OnJetEventListener.html
@@ -2372,1011 +2655,1209 @@
http://developer.android.com/reference/android/media/MediaRecorder.OnErrorListener.html
http://developer.android.com/reference/android/media/MediaRecorder.OnInfoListener.html
http://developer.android.com/reference/android/media/MediaScannerConnection.MediaScannerConnectionClient.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManagerFactory.html
-http://developer.android.com/reference/org/apache/http/conn/ConnectionKeepAliveStrategy.html
-http://developer.android.com/reference/org/apache/http/HttpConnection.html
-http://developer.android.com/reference/android/net/UrlQuerySanitizer.ValueSanitizer.html
-http://developer.android.com/reference/android/net/Proxy.html
-http://developer.android.com/reference/android/net/ParseException.html
-http://developer.android.com/reference/java/util/regex/MatchResult.html
-http://developer.android.com/reference/org/apache/http/ConnectionReuseStrategy.html
-http://developer.android.com/reference/org/apache/http/FormattedHeader.html
-http://developer.android.com/reference/org/apache/http/HttpClientConnection.html
-http://developer.android.com/reference/org/apache/http/HttpConnectionMetrics.html
-http://developer.android.com/reference/org/apache/http/HttpInetConnection.html
-http://developer.android.com/reference/org/apache/http/HttpRequestFactory.html
-http://developer.android.com/reference/org/apache/http/HttpRequestInterceptor.html
-http://developer.android.com/reference/org/apache/http/HttpResponseFactory.html
-http://developer.android.com/reference/org/apache/http/HttpResponseInterceptor.html
-http://developer.android.com/reference/org/apache/http/HttpServerConnection.html
-http://developer.android.com/reference/org/apache/http/HttpStatus.html
-http://developer.android.com/reference/org/apache/http/ReasonPhraseCatalog.html
-http://developer.android.com/reference/org/apache/http/StatusLine.html
-http://developer.android.com/reference/org/apache/http/ParseException.html
-http://developer.android.com/reference/org/apache/http/ProtocolException.html
-http://developer.android.com/reference/android/provider/Contacts.ContactMethodsColumns.html
-http://developer.android.com/reference/android/provider/Contacts.ExtensionsColumns.html
-http://developer.android.com/reference/android/provider/Contacts.GroupsColumns.html
-http://developer.android.com/reference/android/provider/Contacts.OrganizationColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PhotosColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PresenceColumns.html
-http://developer.android.com/reference/android/provider/Contacts.SettingsColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.AlbumColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.ArtistColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.GenresColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.PlaylistsColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Video.VideoColumns.html
-http://developer.android.com/reference/android/provider/OpenableColumns.html
-http://developer.android.com/reference/java/security/cert/Certificate.html
-http://developer.android.com/reference/junit/framework/TestListener.html
-http://developer.android.com/reference/junit/framework/Test.html
-http://developer.android.com/reference/android/os/Handler.Callback.html
-http://developer.android.com/reference/android/os/IBinder.DeathRecipient.html
-http://developer.android.com/reference/android/os/MessageQueue.IdleHandler.html
-http://developer.android.com/reference/android/os/Process.html
-http://developer.android.com/reference/android/view/inputmethod/InputMethod.SessionCallback.html
-http://developer.android.com/reference/android/view/inputmethod/InputMethodSession.EventCallback.html
-http://developer.android.com/reference/org/apache/http/io/HttpMessageParser.html
-http://developer.android.com/reference/org/apache/http/io/HttpMessageWriter.html
-http://developer.android.com/reference/android/text/style/AlignmentSpan.html
-http://developer.android.com/reference/android/text/style/LeadingMarginSpan.html
-http://developer.android.com/reference/android/text/style/LineBackgroundSpan.html
-http://developer.android.com/reference/android/text/style/LineHeightSpan.html
-http://developer.android.com/reference/android/text/style/ParagraphStyle.html
-http://developer.android.com/reference/android/text/style/TabStopSpan.html
-http://developer.android.com/reference/android/text/style/UpdateAppearance.html
-http://developer.android.com/reference/android/text/style/UpdateLayout.html
-http://developer.android.com/reference/android/text/style/WrapTogetherSpan.html
-http://developer.android.com/reference/android/text/style/package-descr.html
-http://developer.android.com/reference/android/text/TextWatcher.html
-http://developer.android.com/reference/android/text/method/MovementMethod.html
-http://developer.android.com/reference/android/text/Editable.html
-http://developer.android.com/reference/android/text/InputFilter.html
-http://developer.android.com/reference/android/text/method/KeyListener.html
-http://developer.android.com/reference/android/text/method/TransformationMethod.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteCursorDriver.html
-http://developer.android.com/reference/java/util/concurrent/locks/Condition.html
-http://developer.android.com/reference/org/apache/http/protocol/ExecutionContext.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpExpectationVerifier.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpProcessor.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandler.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerResolver.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestInterceptorList.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpResponseInterceptorList.html
-http://developer.android.com/reference/java/text/AttributedCharacterIterator.html
-http://developer.android.com/reference/android/provider/package-descr.html
-http://developer.android.com/reference/org/apache/http/impl/entity/package-descr.html
-http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedListener.html
-http://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html
-http://developer.android.com/reference/javax/net/ssl/KeyManager.html
-http://developer.android.com/reference/javax/net/ssl/ManagerFactoryParameters.html
-http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingListener.html
-http://developer.android.com/reference/javax/net/ssl/SSLSessionContext.html
-http://developer.android.com/reference/javax/net/ssl/X509KeyManager.html
-http://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
-http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html
-http://developer.android.com/reference/java/util/concurrent/Future.html
-http://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html
-http://developer.android.com/reference/java/util/concurrent/ScheduledFuture.html
+http://developer.android.com/reference/android/webkit/package-descr.html
+http://developer.android.com/reference/java/lang/reflect/GenericArrayType.html
+http://developer.android.com/reference/java/lang/reflect/InvocationHandler.html
+http://developer.android.com/reference/java/lang/reflect/Member.html
+http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html
+http://developer.android.com/reference/java/lang/reflect/WildcardType.html
+http://developer.android.com/reference/java/lang/reflect/Proxy.html
+http://developer.android.com/reference/org/apache/http/conn/params/ConnRoutePNames.html
+http://developer.android.com/reference/org/apache/http/cookie/Cookie.html
+http://developer.android.com/reference/org/apache/http/cookie/SetCookie.html
+http://developer.android.com/reference/org/xml/sax/ContentHandler.html
http://developer.android.com/reference/org/xml/sax/DTDHandler.html
http://developer.android.com/reference/org/xml/sax/EntityResolver.html
http://developer.android.com/reference/org/xml/sax/ErrorHandler.html
http://developer.android.com/reference/org/xml/sax/Locator.html
http://developer.android.com/reference/org/xml/sax/XMLFilter.html
-http://developer.android.com/reference/java/security/cert/CertPathParameters.html
-http://developer.android.com/reference/android/location/GpsStatus.Listener.html
-http://developer.android.com/reference/android/location/LocationListener.html
-http://developer.android.com/reference/org/apache/http/params/CoreConnectionPNames.html
-http://developer.android.com/reference/org/apache/http/params/CoreProtocolPNames.html
-http://developer.android.com/reference/android/text/method/package-descr.html
-http://developer.android.com/guide/samples/NotePad/res/index.html
-http://developer.android.com/guide/samples/NotePad/src/index.html
-http://developer.android.com/guide/samples/NotePad/tests/index.html
-http://developer.android.com/guide/samples/NotePad/AndroidManifest.html
-http://developer.android.com/guide/samples/NotePad/sample_note.html
-http://developer.android.com/guide/samples/NotePad/sample_notepad.html
-http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.html
-http://developer.android.com/guide/samples/LunarLander/res/index.html
-http://developer.android.com/guide/samples/LunarLander/src/index.html
-http://developer.android.com/guide/samples/LunarLander/tests/index.html
-http://developer.android.com/guide/samples/LunarLander/AndroidManifest.html
-http://developer.android.com/guide/samples/LunarLander/sample_lunarlander.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilderResult.html
-http://developer.android.com/reference/java/security/cert/CertPathValidatorResult.html
-http://developer.android.com/reference/java/security/cert/CertSelector.html
-http://developer.android.com/reference/java/security/cert/CertStoreParameters.html
-http://developer.android.com/reference/java/security/cert/CRLSelector.html
-http://developer.android.com/reference/java/security/cert/PolicyNode.html
-http://developer.android.com/reference/java/security/cert/X509Extension.html
-http://developer.android.com/reference/java/security/cert/X509Certificate.html
-http://developer.android.com/reference/java/security/cert/CertificateEncodingException.html
-http://developer.android.com/reference/java/security/cert/CertificateException.html
-http://developer.android.com/reference/java/security/cert/CertificateExpiredException.html
-http://developer.android.com/reference/java/security/cert/CertificateNotYetValidException.html
-http://developer.android.com/reference/java/security/cert/CertificateParsingException.html
-http://developer.android.com/reference/java/security/spec/ECField.html
-http://developer.android.com/reference/java/security/spec/KeySpec.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/PoolEntryRequest.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueHandler.html
-http://developer.android.com/reference/org/apache/http/params/package-descr.html
-http://developer.android.com/sdk/android-1.5-highlights.html
-http://developer.android.com/reference/javax/security/auth/package-descr.html
-http://developer.android.com/reference/java/beans/PropertyChangeListener.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.CursorFactory.html
+http://developer.android.com/reference/java/security/acl/Acl.html
+http://developer.android.com/reference/java/security/acl/AclEntry.html
+http://developer.android.com/reference/org/apache/http/client/params/AllClientPNames.html
+http://developer.android.com/reference/java/sql/Array.html
+http://developer.android.com/reference/org/w3c/dom/Attr.html
+http://developer.android.com/reference/org/apache/http/auth/params/AuthPNames.html
+http://developer.android.com/reference/java/sql/Blob.html
+http://developer.android.com/reference/java/sql/CallableStatement.html
+http://developer.android.com/reference/android/hardware/Camera.html
+http://developer.android.com/reference/android/hardware/Camera.AutoFocusCallback.html
+http://developer.android.com/reference/android/hardware/Camera.ErrorCallback.html
+http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html
+http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html
+http://developer.android.com/reference/android/hardware/Camera.ShutterCallback.html
+http://developer.android.com/reference/org/w3c/dom/CDATASection.html
+http://developer.android.com/reference/org/w3c/dom/CharacterData.html
+http://developer.android.com/reference/org/apache/http/cookie/ClientCookie.html
+http://developer.android.com/reference/org/apache/http/client/params/ClientPNames.html
+http://developer.android.com/reference/java/sql/Clob.html
+http://developer.android.com/reference/org/w3c/dom/Comment.html
+http://developer.android.com/reference/java/util/concurrent/locks/Condition.html
+http://developer.android.com/reference/org/apache/http/conn/params/ConnConnectionPNames.html
+http://developer.android.com/reference/java/sql/Connection.html
+http://developer.android.com/reference/javax/sql/ConnectionEventListener.html
+http://developer.android.com/reference/javax/sql/ConnectionPoolDataSource.html
+http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerPNames.html
+http://developer.android.com/reference/org/apache/http/conn/params/ConnPerRoute.html
+http://developer.android.com/reference/java/net/ContentHandlerFactory.html
+http://developer.android.com/reference/org/apache/http/entity/ContentLengthStrategy.html
+http://developer.android.com/reference/org/apache/http/entity/ContentProducer.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieSpec.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieSpecFactory.html
+http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecPNames.html
+http://developer.android.com/reference/android/net/Credentials.html
+http://developer.android.com/reference/java/sql/DatabaseMetaData.html
+http://developer.android.com/reference/java/net/DatagramSocketImplFactory.html
+http://developer.android.com/reference/javax/sql/DataSource.html
+http://developer.android.com/reference/android/text/format/DateUtils.html
+http://developer.android.com/reference/java/lang/Deprecated.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHPrivateKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHPublicKey.html
+http://developer.android.com/reference/org/w3c/dom/Document.html
+http://developer.android.com/reference/java/lang/annotation/Documented.html
+http://developer.android.com/reference/org/w3c/dom/DocumentFragment.html
+http://developer.android.com/reference/org/w3c/dom/DocumentType.html
+http://developer.android.com/reference/org/w3c/dom/DOMImplementation.html
+http://developer.android.com/reference/java/sql/Driver.html
+http://developer.android.com/reference/java/security/interfaces/DSAKey.html
+http://developer.android.com/reference/java/security/interfaces/DSAKeyPairGenerator.html
+http://developer.android.com/reference/java/security/interfaces/DSAParams.html
+http://developer.android.com/reference/java/security/interfaces/DSAPrivateKey.html
+http://developer.android.com/reference/java/security/interfaces/DSAPublicKey.html
+http://developer.android.com/reference/java/security/interfaces/ECKey.html
+http://developer.android.com/reference/java/security/interfaces/ECPrivateKey.html
+http://developer.android.com/reference/java/security/interfaces/ECPublicKey.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGL.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGL10.html
http://developer.android.com/reference/javax/microedition/khronos/egl/EGL11.html
-http://developer.android.com/reference/android/text/GetChars.html
-http://developer.android.com/reference/android/text/Html.ImageGetter.html
-http://developer.android.com/reference/android/text/Html.TagHandler.html
-http://developer.android.com/reference/android/text/InputType.html
-http://developer.android.com/reference/android/text/NoCopySpan.html
-http://developer.android.com/reference/android/text/ParcelableSpan.html
-http://developer.android.com/reference/android/text/Spannable.html
-http://developer.android.com/reference/android/text/Spanned.html
-http://developer.android.com/reference/android/text/SpanWatcher.html
-http://developer.android.com/reference/android/text/TextUtils.EllipsizeCallback.html
-http://developer.android.com/reference/android/text/TextUtils.StringSplitter.html
-http://developer.android.com/reference/android/text/Annotation.html
-http://developer.android.com/reference/org/apache/http/conn/scheme/LayeredSocketFactory.html
+http://developer.android.com/reference/org/w3c/dom/Element.html
+http://developer.android.com/reference/android/sax/ElementListener.html
+http://developer.android.com/reference/android/sax/EndElementListener.html
+http://developer.android.com/reference/android/sax/EndTextElementListener.html
+http://developer.android.com/reference/org/w3c/dom/Entity.html
+http://developer.android.com/reference/org/w3c/dom/EntityReference.html
+http://developer.android.com/reference/java/net/FileNameMap.html
+http://developer.android.com/reference/android/test/FlakyTest.html
+http://developer.android.com/reference/android/text/format/Formatter.html
+http://developer.android.com/reference/android/gesture/GestureOverlayView.OnGestureListener.html
+http://developer.android.com/reference/android/gesture/GestureOverlayView.OnGesturePerformedListener.html
+http://developer.android.com/reference/android/gesture/GestureOverlayView.OnGesturingListener.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10Ext.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11Ext.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.EGLConfigChooser.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.EGLContextFactory.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.EGLWindowSurfaceFactory.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.GLWrapper.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html
+http://developer.android.com/reference/android/location/GpsStatus.Listener.html
+http://developer.android.com/reference/android/location/GpsStatus.NmeaListener.html
+http://developer.android.com/reference/java/security/acl/Group.html
+http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedListener.html
+http://developer.android.com/reference/org/apache/http/message/HeaderValueFormatter.html
+http://developer.android.com/reference/org/apache/http/message/HeaderValueParser.html
http://developer.android.com/reference/org/apache/http/conn/scheme/HostNameResolver.html
+http://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html
+http://developer.android.com/reference/java/lang/annotation/Inherited.html
+http://developer.android.com/reference/android/inputmethodservice/KeyboardView.OnKeyboardActionListener.html
+http://developer.android.com/reference/javax/net/ssl/KeyManager.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/LargeTest.html
+http://developer.android.com/reference/org/apache/http/conn/scheme/LayeredSocketFactory.html
http://developer.android.com/reference/org/apache/http/conn/scheme/SocketFactory.html
-http://developer.android.com/reference/java/lang/reflect/AnnotatedElement.html
-http://developer.android.com/reference/java/lang/reflect/GenericArrayType.html
-http://developer.android.com/reference/java/lang/reflect/GenericDeclaration.html
-http://developer.android.com/reference/java/lang/reflect/InvocationHandler.html
-http://developer.android.com/reference/java/lang/reflect/Member.html
-http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html
-http://developer.android.com/reference/java/lang/reflect/Type.html
-http://developer.android.com/reference/java/lang/reflect/TypeVariable.html
-http://developer.android.com/reference/java/lang/reflect/WildcardType.html
-http://developer.android.com/reference/java/lang/reflect/Proxy.html
-http://developer.android.com/reference/org/apache/http/client/params/AllClientPNames.html
+http://developer.android.com/reference/org/apache/http/message/LineFormatter.html
+http://developer.android.com/reference/org/apache/http/message/LineParser.html
+http://developer.android.com/reference/android/location/LocationListener.html
+http://developer.android.com/reference/javax/net/ssl/ManagerFactoryParameters.html
+http://developer.android.com/reference/java/util/jar/Manifest.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/MediumTest.html
+http://developer.android.com/reference/org/w3c/dom/NamedNodeMap.html
+http://developer.android.com/reference/org/w3c/dom/Node.html
+http://developer.android.com/reference/java/util/prefs/NodeChangeListener.html
+http://developer.android.com/reference/org/w3c/dom/NodeList.html
+http://developer.android.com/reference/org/w3c/dom/Notation.html
+http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngine.html
+http://developer.android.com/reference/dalvik/bytecode/Opcodes.html
+http://developer.android.com/reference/java/lang/Override.html
+http://developer.android.com/reference/java/security/acl/Owner.html
+http://developer.android.com/reference/java/sql/ParameterMetaData.html
+http://developer.android.com/reference/android/net/ParseException.html
+http://developer.android.com/reference/javax/crypto/interfaces/PBEKey.html
+http://developer.android.com/reference/java/security/acl/Permission.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/PoolEntryRequest.html
+http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html
+http://developer.android.com/reference/android/preference/Preference.OnPreferenceClickListener.html
+http://developer.android.com/reference/java/util/prefs/PreferenceChangeListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityDestroyListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityResultListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityStopListener.html
+http://developer.android.com/reference/java/util/prefs/PreferencesFactory.html
+http://developer.android.com/reference/java/sql/PreparedStatement.html
+http://developer.android.com/reference/org/w3c/dom/ProcessingInstruction.html
+http://developer.android.com/reference/java/beans/PropertyChangeListener.html
http://developer.android.com/reference/junit/framework/Protectable.html
-http://developer.android.com/reference/javax/sql/ConnectionEventListener.html
-http://developer.android.com/reference/javax/sql/ConnectionPoolDataSource.html
-http://developer.android.com/reference/javax/sql/DataSource.html
+http://developer.android.com/reference/android/net/Proxy.html
+http://developer.android.com/reference/java/sql/Ref.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueHandler.html
+http://developer.android.com/reference/android/widget/RemoteViews.RemoteView.html
+http://developer.android.com/reference/java/sql/ResultSet.html
+http://developer.android.com/reference/java/sql/ResultSetMetaData.html
+http://developer.android.com/reference/java/lang/annotation/Retention.html
+http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.html
http://developer.android.com/reference/javax/sql/RowSetInternal.html
http://developer.android.com/reference/javax/sql/RowSetListener.html
http://developer.android.com/reference/javax/sql/RowSetMetaData.html
http://developer.android.com/reference/javax/sql/RowSetReader.html
http://developer.android.com/reference/javax/sql/RowSetWriter.html
-http://developer.android.com/reference/java/sql/Connection.html
-http://developer.android.com/reference/java/util/logging/Filter.html
-http://developer.android.com/reference/java/util/logging/LoggingMXBean.html
-http://developer.android.com/reference/java/util/logging/Formatter.html
-http://developer.android.com/reference/android/package-descr.html
-http://developer.android.com/reference/android/webkit/DownloadListener.html
-http://developer.android.com/reference/android/webkit/Plugin.PreferencesClickHandler.html
-http://developer.android.com/reference/android/webkit/UrlInterceptHandler.html
-http://developer.android.com/reference/android/webkit/WebIconDatabase.IconListener.html
-http://developer.android.com/reference/android/webkit/WebView.PictureListener.html
-http://developer.android.com/reference/java/security/cert/package-descr.html
-http://developer.android.com/reference/android/inputmethodservice/KeyboardView.OnKeyboardActionListener.html
-http://developer.android.com/reference/android/graphics/drawable/package-descr.html
-http://developer.android.com/reference/java/sql/Array.html
-http://developer.android.com/reference/java/sql/Blob.html
-http://developer.android.com/reference/java/sql/CallableStatement.html
-http://developer.android.com/reference/java/sql/Clob.html
-http://developer.android.com/reference/java/sql/DatabaseMetaData.html
-http://developer.android.com/reference/java/sql/Driver.html
-http://developer.android.com/reference/java/sql/ParameterMetaData.html
-http://developer.android.com/reference/java/sql/PreparedStatement.html
-http://developer.android.com/reference/java/sql/Ref.html
-http://developer.android.com/reference/java/sql/ResultSet.html
-http://developer.android.com/reference/java/sql/ResultSetMetaData.html
-http://developer.android.com/reference/java/sql/Savepoint.html
-http://developer.android.com/reference/java/sql/SQLData.html
-http://developer.android.com/reference/java/sql/SQLInput.html
-http://developer.android.com/reference/java/sql/SQLOutput.html
-http://developer.android.com/reference/java/sql/Statement.html
-http://developer.android.com/reference/java/sql/Struct.html
-http://developer.android.com/reference/android/opengl/GLSurfaceView.EGLConfigChooser.html
-http://developer.android.com/reference/android/opengl/GLSurfaceView.GLWrapper.html
-http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html
-http://developer.android.com/reference/org/apache/http/entity/ContentLengthStrategy.html
-http://developer.android.com/reference/javax/xml/parsers/package-descr.html
-http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngine.html
-http://developer.android.com/reference/java/lang/package-descr.html
-http://developer.android.com/reference/android/webkit/package-descr.html
-http://developer.android.com/reference/java/util/concurrent/locks/package-descr.html
-http://developer.android.com/reference/dalvik/system/package-descr.html
-http://developer.android.com/reference/org/apache/http/client/params/ClientPNames.html
-http://developer.android.com/reference/org/apache/http/entity/ContentProducer.html
-http://developer.android.com/reference/java/util/jar/Manifest.html
-http://developer.android.com/reference/javax/security/cert/package-descr.html
-http://developer.android.com/reference/org/apache/http/conn/params/package-descr.html
-http://developer.android.com/reference/android/view/ViewDebug.CapturedViewProperty.html
-http://developer.android.com/reference/android/view/ViewDebug.ExportedProperty.html
-http://developer.android.com/reference/android/view/ViewDebug.IntToString.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/LargeTest.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/MediumTest.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/SmallTest.html
-http://developer.android.com/reference/android/content/pm/package-descr.html
-http://developer.android.com/reference/org/xml/sax/ext/package-descr.html
-http://developer.android.com/reference/java/io/package-descr.html
-http://developer.android.com/reference/android/widget/RemoteViews.RemoteView.html
-http://developer.android.com/reference/javax/crypto/package-descr.html
-http://developer.android.com/reference/org/apache/http/auth/params/AuthPNames.html
-http://developer.android.com/reference/org/apache/http/auth/params/package-descr.html
-http://developer.android.com/reference/javax/net/package-descr.html
-http://developer.android.com/reference/java/util/prefs/NodeChangeListener.html
-http://developer.android.com/reference/java/util/prefs/PreferenceChangeListener.html
-http://developer.android.com/reference/java/util/prefs/PreferencesFactory.html
-http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.html
-http://developer.android.com/reference/org/apache/http/entity/package-descr.html
-http://developer.android.com/sdk/1.0_r2/requirements.html
-http://developer.android.com/sdk/adt_download.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html
-http://developer.android.com/reference/android/inputmethodservice/package-descr.html
-http://developer.android.com/reference/javax/net/ssl/package-descr.html
-http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecPNames.html
-http://developer.android.com/reference/org/apache/http/cookie/params/package-descr.html
-http://developer.android.com/reference/java/security/spec/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/index.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable-land/index.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable-port/index.html
-http://developer.android.com/guide/samples/LunarLander/res/layout/index.html
-http://developer.android.com/guide/samples/LunarLander/res/values/index.html
-http://developer.android.com/reference/java/sql/package-descr.html
-http://developer.android.com/reference/android/graphics/package-descr.html
-http://developer.android.com/reference/android/content/res/package-descr.html
-http://developer.android.com/reference/java/security/interfaces/DSAPublicKey.html
-http://developer.android.com/reference/java/security/interfaces/ECPublicKey.html
-http://developer.android.com/reference/java/security/interfaces/RSAPublicKey.html
-http://developer.android.com/reference/junit/framework/package-descr.html
-http://developer.android.com/reference/org/apache/http/impl/package-descr.html
-http://developer.android.com/guide/appendix/faq/commontasks.html
-http://developer.android.com/guide/appendix/faq/framework.html
-http://developer.android.com/guide/appendix/faq/licensingandoss.html
-http://developer.android.com/guide/appendix/faq/security.html
-http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.0_r2.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.0_r2.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.0_r2.zip
-http://developer.android.com/reference/android/opengl/package-descr.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10Ext.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11Ext.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html
-http://developer.android.com/reference/android/view/package-descr.html
-http://developer.android.com/reference/org/w3c/dom/Attr.html
-http://developer.android.com/reference/org/w3c/dom/CDATASection.html
-http://developer.android.com/reference/org/w3c/dom/CharacterData.html
-http://developer.android.com/reference/org/w3c/dom/Comment.html
-http://developer.android.com/reference/org/w3c/dom/Document.html
-http://developer.android.com/reference/org/w3c/dom/DocumentFragment.html
-http://developer.android.com/reference/org/w3c/dom/DocumentType.html
-http://developer.android.com/reference/org/w3c/dom/DOMImplementation.html
-http://developer.android.com/reference/org/w3c/dom/Element.html
-http://developer.android.com/reference/org/w3c/dom/Entity.html
-http://developer.android.com/reference/org/w3c/dom/EntityReference.html
-http://developer.android.com/reference/org/w3c/dom/NamedNodeMap.html
-http://developer.android.com/reference/org/w3c/dom/Node.html
-http://developer.android.com/reference/org/w3c/dom/NodeList.html
-http://developer.android.com/reference/org/w3c/dom/Notation.html
-http://developer.android.com/reference/org/w3c/dom/ProcessingInstruction.html
-http://developer.android.com/reference/org/w3c/dom/Text.html
-http://developer.android.com/reference/org/apache/http/message/package-descr.html
-http://developer.android.com/reference/java/util/concurrent/package-descr.html
-http://developer.android.com/guide/tutorials/views/hello-datepicker.html
-http://developer.android.com/guide/tutorials/views/hello-timepicker.html
-http://developer.android.com/reference/android/net/wifi/package-descr.html
-http://developer.android.com/reference/android/content/package-descr.html
-http://developer.android.com/guide/samples/NotePad/src/com/index.html
-http://developer.android.com/guide/samples/LunarLander/src/com/index.html
-http://developer.android.com/reference/org/apache/http/impl/io/package-descr.html
-http://developer.android.com/reference/android/text/format/DateUtils.html
-http://developer.android.com/reference/android/text/format/Formatter.html
-http://developer.android.com/reference/java/security/interfaces/DSAKey.html
-http://developer.android.com/reference/java/security/interfaces/DSAKeyPairGenerator.html
-http://developer.android.com/reference/java/security/interfaces/DSAParams.html
-http://developer.android.com/reference/java/security/interfaces/DSAPrivateKey.html
-http://developer.android.com/reference/java/security/interfaces/ECKey.html
-http://developer.android.com/reference/java/security/interfaces/ECPrivateKey.html
http://developer.android.com/reference/java/security/interfaces/RSAKey.html
http://developer.android.com/reference/java/security/interfaces/RSAMultiPrimePrivateCrtKey.html
http://developer.android.com/reference/java/security/interfaces/RSAPrivateCrtKey.html
http://developer.android.com/reference/java/security/interfaces/RSAPrivateKey.html
-http://developer.android.com/reference/java/security/interfaces/package-descr.html
-http://developer.android.com/reference/org/apache/http/client/params/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/res/layout/lunar_layout.html
-http://developer.android.com/reference/android/net/package-descr.html
-http://developer.android.com/reference/android/text/util/Linkify.MatchFilter.html
-http://developer.android.com/reference/android/text/util/Linkify.TransformFilter.html
-http://developer.android.com/reference/android/text/util/package-descr.html
-http://developer.android.com/reference/android/appwidget/package-descr.html
-http://developer.android.com/sdk/1.1_r1/requirements.html
-http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.1_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.1_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.1_r1.zip
-http://developer.android.com/reference/android/graphics/drawable/shapes/package-descr.html
-http://developer.android.com/reference/javax/xml/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable-land/earthrise.html
-http://developer.android.com/reference/android/test/mock/package-descr.html
-http://developer.android.com/reference/org/apache/http/protocol/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/tests/src/index.html
-http://developer.android.com/guide/samples/LunarLander/tests/AndroidManifest.html
-http://developer.android.com/guide/samples/NotePad/tests/src/index.html
-http://developer.android.com/guide/samples/NotePad/tests/AndroidManifest.html
-http://developer.android.com/reference/java/lang/annotation/Retention.html
-http://developer.android.com/reference/java/util/prefs/package-descr.html
-http://developer.android.com/reference/android/view/animation/package-descr.html
-http://developer.android.com/reference/java/nio/charset/spi/package-descr.html
-http://developer.android.com/reference/javax/security/auth/x500/package-descr.html
-http://developer.android.com/reference/org/apache/http/conn/package-descr.html
-http://developer.android.com/reference/java/util/package-descr.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/index.html
-http://developer.android.com/guide/samples/NotePad/src/com/google/index.html
-http://developer.android.com/reference/android/telephony/gsm/package-descr.html
-http://developer.android.com/reference/android/sax/ElementListener.html
-http://developer.android.com/reference/android/sax/EndElementListener.html
-http://developer.android.com/reference/android/sax/EndTextElementListener.html
+http://developer.android.com/reference/java/security/interfaces/RSAPublicKey.html
+http://developer.android.com/reference/java/sql/Savepoint.html
+http://developer.android.com/reference/javax/crypto/SecretKey.html
+http://developer.android.com/reference/android/hardware/SensorEventListener.html
+http://developer.android.com/reference/android/hardware/SensorListener.html
+http://developer.android.com/reference/org/apache/http/cookie/SetCookie2.html
+http://developer.android.com/reference/org/apache/http/cookie/SM.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/SmallTest.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/Smoke.html
+http://developer.android.com/reference/android/telephony/gsm/SmsManager.html
+http://developer.android.com/reference/android/telephony/SmsMessage.html
+http://developer.android.com/reference/android/telephony/SmsMessage.MessageClass.html
+http://developer.android.com/reference/android/telephony/SmsMessage.SubmitPdu.html
+http://developer.android.com/reference/java/net/SocketImplFactory.html
+http://developer.android.com/reference/java/net/SocketOptions.html
+http://developer.android.com/reference/java/sql/SQLData.html
+http://developer.android.com/reference/java/sql/SQLInput.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteCursorDriver.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteTransactionListener.html
+http://developer.android.com/reference/java/sql/SQLOutput.html
+http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingListener.html
+http://developer.android.com/reference/javax/net/ssl/SSLSessionContext.html
http://developer.android.com/reference/android/sax/StartElementListener.html
-http://developer.android.com/reference/android/sax/TextElementListener.html
-http://developer.android.com/reference/android/sax/package-descr.html
-http://developer.android.com/reference/index.html
-http://developer.android.com/reference/org/apache/http/client/methods/package-descr.html
-http://developer.android.com/reference/android/database/sqlite/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html
-http://developer.android.com/guide/samples/LunarLander/res/values/strings.html
-http://developer.android.com/reference/android/telephony/package-descr.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/index.html
-http://developer.android.com/reference/org/apache/http/package-descr.html
-http://developer.android.com/reference/java/util/regex/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable-port/earthrise.html
-http://developer.android.com/reference/android/location/package-descr.html
+http://developer.android.com/reference/java/sql/Statement.html
+http://developer.android.com/reference/java/sql/Struct.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/Suppress.html
+http://developer.android.com/reference/java/lang/SuppressWarnings.html
http://developer.android.com/reference/java/lang/annotation/Target.html
+http://developer.android.com/reference/junit/framework/Test.html
+http://developer.android.com/reference/junit/framework/TestListener.html
+http://developer.android.com/reference/junit/runner/TestSuiteLoader.html
+http://developer.android.com/reference/dalvik/annotation/TestTarget.html
+http://developer.android.com/reference/dalvik/annotation/TestTargetClass.html
+http://developer.android.com/reference/org/w3c/dom/Text.html
+http://developer.android.com/reference/android/sax/TextElementListener.html
+http://developer.android.com/reference/android/test/UiThreadTest.html
+http://developer.android.com/reference/android/net/UrlQuerySanitizer.ValueSanitizer.html
+http://developer.android.com/reference/java/net/URLStreamHandlerFactory.html
+http://developer.android.com/reference/android/view/ViewDebug.CapturedViewProperty.html
+http://developer.android.com/reference/android/view/ViewDebug.ExportedProperty.html
+http://developer.android.com/reference/android/view/ViewDebug.FlagToString.html
+http://developer.android.com/reference/android/view/ViewDebug.IntToString.html
+http://developer.android.com/reference/javax/net/ssl/X509KeyManager.html
+http://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
+http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html
+http://developer.android.com/reference/org/apache/http/cookie/params/package-descr.html
+http://developer.android.com/reference/java/util/concurrent/locks/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/routing/package-descr.html
+http://developer.android.com/guide/samples/index.html
http://developer.android.com/guide/tutorials/notepad/notepad-ex1.html
http://developer.android.com/guide/tutorials/notepad/notepad-ex2.html
http://developer.android.com/guide/tutorials/notepad/notepad-ex3.html
http://developer.android.com/guide/tutorials/notepad/notepad-extra-credit.html
-http://developer.android.com/reference/java/math/package-descr.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/app_lunar_lander.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_crashed.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_firing.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_plain.html
-http://developer.android.com/reference/android/test/UiThreadTest.html
-http://developer.android.com/guide/topics/ui/notifiers/notifications.html
-http://developer.android.com/guide/samples/NotePad/tests/src/com/index.html
-http://developer.android.com/reference/java/util/jar/package-descr.html
-http://developer.android.com/reference/org/apache/http/io/package-descr.html
-http://developer.android.com/reference/org/xml/sax/helpers/package-descr.html
-http://developer.android.com/reference/android/database/package-descr.html
-http://developer.android.com/reference/javax/sql/package-descr.html
-http://developer.android.com/reference/java/nio/package-descr.html
-http://developer.android.com/sdk/OLD_RELEASENOTES.html
-http://developer.android.com/sdk/download.html?v=android-sdk-windows-0.9_beta.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-0.9_beta.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-0.9_beta.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_windows.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_mac-x86.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_linux-x86.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_windows.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_mac-x86.zip
-http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_linux-x86.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc37a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc37a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc37a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc22a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc22a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc22a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc20a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc20a.zip
-http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc20a.zip
-http://developer.android.com/reference/javax/crypto/spec/package-descr.html
-http://developer.android.com/reference/java/nio/channels/spi/package-descr.html
-http://developer.android.com/reference/dalvik/bytecode/Opcodes.html
-http://developer.android.com/reference/dalvik/bytecode/package-descr.html
-http://developer.android.com/reference/org/apache/http/conn/ssl/package-descr.html
-http://developer.android.com/sdk/api_diff/3/changes/jdiff_topleftframe.html
-http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_all.html
-http://developer.android.com/sdk/api_diff/3/changes/changes-summary.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/index.html
-http://developer.android.com/guide/samples/ApiDemos/assets/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/index.html
-http://developer.android.com/guide/samples/ApiDemos/AndroidManifest.html
-http://developer.android.com/reference/org/xml/sax/package-descr.html
-http://developer.android.com/reference/android/widget/package-descr.html
-http://developer.android.com/reference/android/test/suitebuilder/package-descr.html
-http://developer.android.com/reference/android/media/package-descr.html
-http://developer.android.com/reference/java/util/logging/package-descr.html
-http://developer.android.com/reference/java/nio/channels/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/assets/fonts/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/StyledText.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/hello_world.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/surface_view_overlay.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.html
-http://developer.android.com/reference/org/apache/http/client/utils/package-descr.html
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.java
-http://developer.android.com/guide/developing/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_view_1.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.java
+http://developer.android.com/guide/appendix/faq/commontasks.html
+http://developer.android.com/reference/javax/security/cert/package-descr.html
+http://developer.android.com/reference/org/xml/sax/ext/package-descr.html
+http://developer.android.com/reference/java/security/package-descr.html
+http://developer.android.com/guide/topics/ui/notifiers/toasts.html
+http://developer.android.com/guide/appendix/faq/index.html
+http://developer.android.com/reference/org/apache/http/message/package-descr.html
+http://developer.android.com/resources/samples/ContactManager/res/index.html
+http://developer.android.com/resources/samples/ContactManager/src/index.html
+http://developer.android.com/resources/samples/ContactManager/AndroidManifest.html
+http://developer.android.com/guide/developing/tools/adt.html
+http://developer.android.com/resources/samples/BluetoothChat/res/index.html
+http://developer.android.com/resources/samples/BluetoothChat/src/index.html
+http://developer.android.com/resources/samples/BluetoothChat/AndroidManifest.html
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.java
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePad.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotesList.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/TitleEditor.html
+http://developer.android.com/reference/android/content/pm/package-descr.html
+http://developer.android.com/reference/org/apache/http/auth/params/package-descr.html
+http://developer.android.com/reference/org/apache/http/cookie/package-descr.html
+http://developer.android.com/reference/java/net/package-descr.html
+http://developer.android.com/reference/java/util/prefs/package-descr.html
+http://developer.android.com/reference/android/sax/package-descr.html
+http://developer.android.com/resources/samples/LunarLander/res/index.html
+http://developer.android.com/resources/samples/LunarLander/src/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/index.html
+http://developer.android.com/resources/samples/LunarLander/AndroidManifest.html
+http://developer.android.com/reference/java/io/package-descr.html
+http://developer.android.com/reference/javax/xml/parsers/package-descr.html
+http://developer.android.com/reference/java/nio/channels/package-descr.html
+http://developer.android.com/resources/tutorials/views/hello-datepicker.html
+http://developer.android.com/resources/tutorials/views/hello-timepicker.html
+http://developer.android.com/reference/java/util/concurrent/package-descr.html
+http://developer.android.com/reference/org/apache/http/client/utils/package-descr.html
+http://developer.android.com/reference/android/database/sqlite/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/AndroidManifest.html
+http://developer.android.com/resources/samples/LunarLander/src/com/index.html
+http://developer.android.com/reference/junit/framework/package-descr.html
+http://developer.android.com/reference/java/util/concurrent/atomic/package-descr.html
+http://developer.android.com/reference/org/xml/sax/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/index.html
+http://developer.android.com/reference/java/lang/package-descr.html
+http://developer.android.com/reference/android/bluetooth/package-descr.html
+http://developer.android.com/guide/appendix/faq/framework.html
+http://developer.android.com/guide/appendix/faq/troubleshooting.html
+http://developer.android.com/guide/appendix/faq/licensingandoss.html
+http://developer.android.com/guide/appendix/faq/security.html
+http://developer.android.com/resources/samples/ApiDemos/assets/fonts/index.html
+http://developer.android.com/reference/android/telephony/package-descr.html
+http://developer.android.com/reference/android/hardware/package-descr.html
+http://developer.android.com/reference/android/package-descr.html
+http://developer.android.com/reference/java/sql/package-descr.html
+http://developer.android.com/reference/org/apache/http/impl/io/package-descr.html
+http://developer.android.com/resources/tutorials/views/hello-spinner.html
+http://developer.android.com/resources/tutorials/views/hello-listview.html
+http://developer.android.com/resources/tutorials/views/hello-gridview.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-nodpi/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/raw/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large-long/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large-notlong/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-long/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal-long/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal-notlong/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-notlong/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small-long/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small-notlong/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/index.html
+http://developer.android.com/reference/android/view/inputmethod/package-descr.html
+http://developer.android.com/resources/samples/NotePad/res/layout/note_editor.html
+http://developer.android.com/resources/samples/NotePad/res/layout/noteslist_item.html
+http://developer.android.com/resources/samples/NotePad/res/layout/title_editor.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/alert_dialog_icon.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/app_sample_code.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/arrow_down_float.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/arrow_up_float.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/btn_check_off.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/btn_check_on.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/btn_circle_normal.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/btn_default_normal.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/button.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/ic_contact_picture.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/ic_popup_reminder.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/icon48x48_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/progress_circular_background.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/progress_particle.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/robot.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/scrollbar_state2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/star_big_on.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/stat_happy.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/stat_neutral.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/stat_sad.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-mdpi/stat_sample.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html
+http://developer.android.com/resources/samples/Snake/res/index.html
+http://developer.android.com/resources/samples/Snake/src/index.html
+http://developer.android.com/resources/samples/Snake/tests/index.html
+http://developer.android.com/resources/samples/Snake/AndroidManifest.html
+http://developer.android.com/sdk/api_diff/6/changes/jdiff_topleftframe.html
+http://developer.android.com/sdk/api_diff/6/changes/alldiffs_index_all.html
+http://developer.android.com/sdk/api_diff/6/changes/changes-summary.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/logo120dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/npatch120dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/reslogo120dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/smlnpatch120dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-ldpi/stylogo120dpi.html
+http://developer.android.com/sdk/api_diff/3/changes.html
+http://developer.android.com/sdk/android-1.5-highlights.html
+http://developer.android.com/sdk/api_diff/6/changes/jdiff_statistics.html
+http://developer.android.com/sdk/api_diff/6/changes/pkg_android.html
+http://developer.android.com/sdk/api_diff/6/changes/pkg_android.accounts.html
+http://developer.android.com/sdk/api_diff/6/changes/pkg_android.os.html
+http://developer.android.com/sdk/api_diff/6/changes/pkg_android.view.html
+http://developer.android.com/sdk/api_diff/4/changes.html
+http://developer.android.com/sdk/android-1.6-highlights.html
+http://developer.android.com/reference/android/content/res/package-descr.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-hdpi-v6/app_notes.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-hdpi-v6/live_folder_notes.html
+http://developer.android.com/reference/android/test/mock/package-descr.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/AndroidManifest.html
+http://developer.android.com/sdk/api_diff/4/changes/jdiff_topleftframe.html
+http://developer.android.com/sdk/api_diff/4/changes/alldiffs_index_all.html
+http://developer.android.com/sdk/api_diff/4/changes/changes-summary.html
+http://developer.android.com/resources/samples/NotePad/tests/src/index.html
+http://developer.android.com/resources/samples/NotePad/tests/AndroidManifest.html
+http://developer.android.com/reference/java/nio/charset/package-descr.html
+http://developer.android.com/reference/javax/crypto/interfaces/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/params/package-descr.html
+http://developer.android.com/resources/samples/MultiResolution/res/index.html
+http://developer.android.com/resources/samples/MultiResolution/src/index.html
+http://developer.android.com/resources/samples/MultiResolution/AndroidManifest.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small-long/strings.html
+http://developer.android.com/sdk/api_diff/4/changes/packages_index_all.html
+http://developer.android.com/sdk/api_diff/4/changes/classes_index_all.html
+http://developer.android.com/sdk/api_diff/4/changes/constructors_index_all.html
+http://developer.android.com/sdk/api_diff/4/changes/methods_index_all.html
+http://developer.android.com/sdk/api_diff/4/changes/fields_index_all.html
+http://developer.android.com/reference/android/view/package-descr.html
+http://developer.android.com/sdk/api_diff/6/changes/android.os.Build.VERSION_CODES.html
+http://developer.android.com/reference/android/database/package-descr.html
+http://developer.android.com/sdk/adt_download.html
+http://developer.android.com/reference/javax/security/auth/x500/package-descr.html
+http://developer.android.com/sdk/api_diff/6/changes/android.view.WindowManager.LayoutParams.html
+http://developer.android.com/reference/android/net/package-descr.html
+http://developer.android.com/reference/org/apache/http/client/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.6_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.6_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.6_r1.tgz
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.5_r3.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.5_r3.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.5_r3.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.1_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.1_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.1_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.0_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.0_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.0_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.5_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.5_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.5_r2.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.5_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.5_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.5_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-1.0_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-1.0_r1.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-1.0_r1.zip
+http://developer.android.com/sdk/OLD_RELEASENOTES.html
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-windows-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-mac_x86-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk-linux_x86-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc15_windows.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc15_mac-x86.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc15_linux-x86.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc14_windows.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc14_mac-x86.zip
+http://developer.android.com/sdk/download.html?v=archives/android-sdk_m5-rc14_linux-x86.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_windows_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_darwin_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_linux_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_windows_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_darwin_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_linux_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_windows_m3-rc20a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_darwin_m3-rc20a.zip
+http://developer.android.com/sdk/download.html?v=archives/android_sdk_linux_m3-rc20a.zip
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/animated_gif.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/balloons.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/beach.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/black_box.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/black_opaque_box.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/box.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/circular_progress.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/filled_box.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/frog.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_background_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/gallery_photo_8.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/icon48x48_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/line.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/logo160dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/npatch160dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo3.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo4.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo5.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/photo6.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/picture_frame.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/reslogo160dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_0.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_0.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/sample_thumb_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/scrollbar_vertical_thumb.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/scrollbar_vertical_track.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/shape_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/shape_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/shape_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/shape_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/shape_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/smlnpatch160dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable/stylogo160dpi.html
+http://developer.android.com/resources/samples/JetBoy/JETBOY_content/index.html
+http://developer.android.com/resources/samples/JetBoy/res/index.html
+http://developer.android.com/resources/samples/JetBoy/src/index.html
+http://developer.android.com/resources/samples/JetBoy/AndroidManifest.html
+http://developer.android.com/sdk/api_diff/4/changes/methods_index_removals.html
+http://developer.android.com/sdk/api_diff/4/changes/methods_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/methods_index_changes.html
+http://developer.android.com/sdk/api_diff/4/changes/android.view.View.html
+http://developer.android.com/sdk/api_diff/4/changes/android.test.AndroidTestCase.html
+http://developer.android.com/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.ComponentName.html
+http://developer.android.com/sdk/api_diff/4/changes/android.view.VelocityTracker.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.Typeface.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.drawable.Drawable.html
+http://developer.android.com/sdk/api_diff/4/changes/android.net.wifi.WifiManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.BitmapFactory.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.Activity.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.Dialog.html
+http://developer.android.com/sdk/api_diff/4/changes/android.view.Window.Callback.html
+http://developer.android.com/sdk/api_diff/4/changes/android.telephony.gsm.SmsManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.Context.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.ContextWrapper.html
+http://developer.android.com/sdk/api_diff/4/changes/android.test.mock.MockContext.html
+http://developer.android.com/sdk/api_diff/4/changes/android.media.MediaRecorder.html
+http://developer.android.com/sdk/api_diff/4/changes/android.os.RemoteCallbackList.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.ListView.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.TabWidget.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.Bitmap.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.Canvas.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.NinePatch.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.AutoCompleteTextView.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.pm.ConfigurationInfo.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.Intent.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.PendingIntent.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.pm.PackageManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.test.mock.MockPackageManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.view.ViewConfiguration.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.ContentProvider.html
+http://developer.android.com/sdk/api_diff/4/changes/android.location.Address.html
+http://developer.android.com/sdk/api_diff/4/changes/android.media.AudioManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.PopupWindow.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.TabHost.TabSpec.html
+http://developer.android.com/sdk/api_diff/4/changes/android.inputmethodservice.KeyboardView.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.LauncherActivity.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.SearchManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.drawable.BitmapDrawable.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.drawable.NinePatchDrawable.html
+http://developer.android.com/sdk/api_diff/6/changes/android.accounts.AbstractAccountAuthenticator.html
+http://developer.android.com/resources/samples/Home/res/index.html
+http://developer.android.com/resources/samples/Home/src/index.html
+http://developer.android.com/resources/samples/Home/AndroidManifest.html
+http://developer.android.com/sdk/api_diff/4/changes/jdiff_statistics.html
+http://developer.android.com/reference/java/security/acl/package-descr.html
+http://developer.android.com/reference/javax/crypto/spec/package-descr.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/index.html
+http://developer.android.com/reference/android/telephony/cdma/package-descr.html
+http://developer.android.com/reference/android/content/package-descr.html
+http://developer.android.com/reference/android/app/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-notlong/strings.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-long/strings.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/layout/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values-land/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/xml/index.html
+http://developer.android.com/reference/java/util/package-descr.html
http://developer.android.com/reference/java/text/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.java
+http://developer.android.com/resources/samples/BluetoothChat/src/com/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/advanced_preferences.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/appwidget_provider.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/default_values.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/preference_dependencies.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/preferences.html
+http://developer.android.com/resources/samples/ApiDemos/res/xml/searchable.html
+http://developer.android.com/sdk/api_diff/4/changes/classes_index_removals.html
+http://developer.android.com/sdk/api_diff/4/changes/classes_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/classes_index_changes.html
+http://developer.android.com/sdk/api_diff/4/changes/java.util.concurrent.locks.AbstractQueuedSynchronizer.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.pm.ActivityInfo.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.graphics.drawable.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.drawable.AnimationDrawable.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.view.animation.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.pm.ApplicationInfo.html
+http://developer.android.com/sdk/api_diff/4/changes/android.graphics.BitmapFactory.Options.html
+http://developer.android.com/sdk/api_diff/4/changes/android.os.Build.html
+http://developer.android.com/sdk/api_diff/4/changes/android.os.Build.VERSION.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.os.html
+http://developer.android.com/sdk/api_diff/4/changes/android.widget.CheckedTextView.html
+http://developer.android.com/sdk/api_diff/4/changes/android.util.Config.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.res.Configuration.html
+http://developer.android.com/sdk/api_diff/4/changes/android.util.DisplayMetrics.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.opengl.html
+http://developer.android.com/sdk/api_diff/4/changes/android.text.style.ImageSpan.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.content.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.content.pm.html
+http://developer.android.com/sdk/api_diff/4/changes/android.app.LauncherActivity.ListItem.html
+http://developer.android.com/sdk/api_diff/4/changes/android.Manifest.permission.html
+http://developer.android.com/sdk/api_diff/4/changes/android.Manifest.permission_group.html
+http://developer.android.com/sdk/api_diff/4/changes/android.media.MediaRecorder.AudioSource.html
+http://developer.android.com/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Genres.Members.html
+http://developer.android.com/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Media.html
+http://developer.android.com/sdk/api_diff/4/changes/android.content.pm.ProviderInfo.html
+http://developer.android.com/sdk/api_diff/4/changes/android.R.anim.html
+http://developer.android.com/sdk/api_diff/4/changes/android.R.attr.html
+http://developer.android.com/sdk/api_diff/4/changes/android.R.drawable.html
+http://developer.android.com/sdk/api_diff/4/changes/android.R.style.html
+http://developer.android.com/sdk/api_diff/4/changes/android.hardware.SensorManager.html
+http://developer.android.com/sdk/api_diff/4/changes/android.provider.Settings.Secure.html
+http://developer.android.com/sdk/api_diff/4/changes/android.provider.Settings.System.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.telephony.html
+http://developer.android.com/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.MessageClass.html
+http://developer.android.com/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.SubmitPdu.html
+http://developer.android.com/sdk/api_diff/4/changes/android.view.Surface.html
+http://developer.android.com/sdk/api_diff/4/changes/android.telephony.TelephonyManager.html
+http://developer.android.com/sdk/api_diff/4/changes/java.util.concurrent.TimeUnit.html
+http://developer.android.com/sdk/api_diff/4/changes/android.media.ToneGenerator.html
+http://developer.android.com/sdk/api_diff/4/changes/android.util.TypedValue.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.view.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.net.wifi.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.widget.html
+http://developer.android.com/reference/org/apache/http/protocol/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large-long/strings.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values-land/dimens.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large/strings.html
+http://developer.android.com/reference/java/security/interfaces/package-descr.html
+http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html
+http://developer.android.com/resources/tutorials/notepad/notepad-ex2.html
+http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html
+http://developer.android.com/resources/tutorials/notepad/notepad-extra-credit.html
+http://developer.android.com/reference/android/text/style/package-descr.html
+http://developer.android.com/resources/samples/BluetoothChat/res/drawable/index.html
+http://developer.android.com/resources/samples/BluetoothChat/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/index.html
+http://developer.android.com/resources/samples/BluetoothChat/res/menu/index.html
+http://developer.android.com/resources/samples/BluetoothChat/res/values/index.html
+http://developer.android.com/resources/tutorials/views/hello-linearlayout.html
+http://developer.android.com/resources/tutorials/views/hello-tablelayout.html
+http://developer.android.com/resources/tutorials/views/hello-relativelayout.html
+http://developer.android.com/reference/dalvik/system/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/arrays.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/attrs.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/colors.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/ids.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/strings.html
+http://developer.android.com/resources/samples/ApiDemos/res/values/styles.html
+http://developer.android.com/reference/javax/net/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/index.html
+http://developer.android.com/sdk/api_diff/6/changes/android.R.attr.html
+http://developer.android.com/reference/android/provider/package-descr.html
+http://developer.android.com/sdk/terms_body.html
+http://developer.android.com/reference/java/util/jar/package-descr.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/AndroidManifest.html
+http://developer.android.com/resources/samples/BluetoothChat/res/menu/option_menu.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values/colors.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values/dimens.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/values/strings.html
+http://developer.android.com/resources/tutorials/views/hello-formstuff.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-ldpi/index.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/ContactManager/res/layout/index.html
+http://developer.android.com/resources/samples/ContactManager/res/values/index.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-hdpi/app_notes.html
+http://developer.android.com/reference/dalvik/bytecode/package-descr.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/custom_title.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/device_list.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/device_name.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/main.html
+http://developer.android.com/resources/samples/BluetoothChat/res/layout/message.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-ldpi-v6/app_notes.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-ldpi-v6/live_folder_notes.html
+http://developer.android.com/guide/tutorials/views/index.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.app.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.content.res.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.graphics.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.hardware.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.inputmethodservice.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.location.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.media.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.provider.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.telephony.gsm.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.test.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.test.mock.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.text.style.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_android.util.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_java.util.concurrent.html
+http://developer.android.com/sdk/api_diff/4/changes/pkg_java.util.concurrent.locks.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/category_order.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/checkable.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/disabled.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/groups.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/order.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/shortcuts.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/submenu.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/title_icon.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/title_only.html
+http://developer.android.com/resources/samples/ApiDemos/res/menu/visible.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/activity_animation.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/alarm_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/alarm_service.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/alert_dialog.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/alert_dialog_text_entry.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/animation_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/animation_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/animation_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/animations_main_screen.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/appwidget_configure.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/appwidget_provider.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/autocomplete_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_nested_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_nested_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/baseline_nested_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/buttons_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/chronometer.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/contacts_filter.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/controls_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/custom_dialog_activity.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/custom_title.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/custom_title_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/date_widgets_example_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/date_widgets_example_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/density_image_views.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/density_styled_image_views.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/dialog_activity.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/focus_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/focus_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/focus_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/foreground_service_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/forward_target.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/forwarding.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/gallery_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/gallery_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/google_login.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/grid_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/grid_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/hello_world.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/image_button_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/image_switcher_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/image_view_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/incoming_message.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/incoming_message_info.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/incoming_message_panel.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/incoming_message_view.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/intents.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/launcher_shortcuts.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/layout_animation_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_10.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_8.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_9.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/link.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_12.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_13.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_8.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_item_checkbox.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_item_icon_text.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/list_position.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/local_sample.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/local_service_binding.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/local_service_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/log_text_box_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/mapview.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/marquee.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/mediaplayer_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/mediaplayer_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/morse_code.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/notify_with_text.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/notifying_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/preference_widget_mypreference.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/progressbar_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/progressbar_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/progressbar_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/progressbar_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/quick_contacts.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/radio_group_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/ratingbar_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/read_asset.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/receive_result.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/redirect_enter.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/redirect_getter.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/redirect_main.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/relative_layout_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/relative_layout_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/remote_service_binding.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/remote_service_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/reorder_four.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/reorder_on_launch.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/reorder_three.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/reorder_two.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/resources.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/save_restore_state.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/scroll_view_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/scroll_view_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/scrollbar1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/scrollbar2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/scrollbar3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/search_invoke.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/search_query_results.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/seekbar_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/select_dialog.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/send_result.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/service_start_arguments_controller.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/shape_drawable_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/spinner_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/status_bar_balloon.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/status_bar_notifications.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/styled_text.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/surface_view_overlay.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_10.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_11.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_12.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_3.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_4.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_5.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_6.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_8.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/table_layout_9.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/tabs1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/text_switcher_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/text_to_speech.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/translucent_background.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/videoview.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/visibility_1.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/voice_recognition.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/wallpaper_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/layout/webview_1.html
+http://developer.android.com/sdk/api_diff/5/changes/jdiff_topleftframe.html
+http://developer.android.com/sdk/api_diff/5/changes/alldiffs_index_all.html
+http://developer.android.com/sdk/api_diff/5/changes/changes-summary.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/layout/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/values/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/xml/index.html
+http://developer.android.com/reference/android/os/package-descr.html
+http://developer.android.com/reference/javax/xml/package-descr.html
+http://developer.android.com/resources/samples/Snake/tests/src/index.html
+http://developer.android.com/resources/samples/Snake/tests/AndroidManifest.html
+http://developer.android.com/reference/org/apache/http/client/params/package-descr.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/app_icon.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/star_logo.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/widget_bg.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/widget_bg_normal.9.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/widget_bg_pressed.9.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/drawable/widget_bg_selected.9.html
+http://developer.android.com/sdk/api_diff/6/changes/packages_index_all.html
+http://developer.android.com/sdk/api_diff/6/changes/classes_index_all.html
+http://developer.android.com/sdk/api_diff/6/changes/constructors_index_all.html
+http://developer.android.com/sdk/api_diff/6/changes/methods_index_all.html
+http://developer.android.com/sdk/api_diff/6/changes/fields_index_all.html
+http://developer.android.com/resources/samples/NotePad/src/com/index.html
+http://developer.android.com/resources/samples/LunarLander/src/com/example/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small/strings.html
+http://developer.android.com/reference/java/math/package-descr.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/layout/input.html
+http://developer.android.com/resources/samples/BluetoothChat/res/drawable-hdpi/app_icon.html
+http://developer.android.com/reference/javax/crypto/package-descr.html
+http://developer.android.com/reference/android/gesture/package-descr.html
+http://developer.android.com/sdk/api_diff/6/changes/classes_index_changes.html
+http://developer.android.com/reference/org/apache/http/params/package-descr.html
+http://developer.android.com/sdk/api_diff/4/changes/packages_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/packages_index_changes.html
+http://developer.android.com/reference/android/telephony/gsm/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal/strings.html
+http://developer.android.com/reference/javax/security/auth/login/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/index.html
+http://developer.android.com/reference/org/apache/http/conn/ssl/package-descr.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-hdpi/icon.html
+http://developer.android.com/guide/tutorials/views/hello-linearlayout.html
+http://developer.android.com/guide/tutorials/views/hello-relativelayout.html
+http://developer.android.com/guide/tutorials/views/hello-tablelayout.html
+http://developer.android.com/guide/tutorials/views/hello-datepicker.html
+http://developer.android.com/guide/tutorials/views/hello-timepicker.html
+http://developer.android.com/guide/tutorials/views/hello-formstuff.html
+http://developer.android.com/guide/tutorials/views/hello-spinner.html
http://developer.android.com/guide/tutorials/views/hello-autocomplete.html
+http://developer.android.com/guide/tutorials/views/hello-listview.html
+http://developer.android.com/guide/tutorials/views/hello-gridview.html
http://developer.android.com/guide/tutorials/views/hello-gallery.html
http://developer.android.com/guide/tutorials/views/hello-tabwidget.html
http://developer.android.com/guide/tutorials/views/hello-mapview.html
http://developer.android.com/guide/tutorials/views/hello-webview.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.java
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.java
-http://developer.android.com/guide/samples/ApiDemos/res/anim/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/raw/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/index.html
-http://developer.android.com/guide/topics/ui/notifiers/toasts.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/index.html
+http://developer.android.com/sdk/api_diff/5/changes/packages_index_all.html
+http://developer.android.com/sdk/api_diff/5/changes/classes_index_all.html
+http://developer.android.com/sdk/api_diff/5/changes/constructors_index_all.html
+http://developer.android.com/sdk/api_diff/5/changes/methods_index_all.html
+http://developer.android.com/sdk/api_diff/5/changes/fields_index_all.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/index.html
+http://developer.android.com/resources/samples/BluetoothChat/res/drawable/app_icon.html
+http://developer.android.com/reference/org/apache/http/impl/entity/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/index.html
+http://developer.android.com/resources/samples/Snake/res/drawable/index.html
+http://developer.android.com/resources/samples/Snake/res/layout/index.html
+http://developer.android.com/resources/samples/Snake/res/values/index.html
+http://developer.android.com/reference/android/location/package-descr.html
+http://developer.android.com/sdk/api_diff/4/changes/constructors_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/constructors_index_changes.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_delete.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_done.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_return.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_search.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_shift.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-hdpi/sym_keyboard_space.html
+http://developer.android.com/resources/samples/MultiResolution/src/com/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/xml/widget_word.html
+http://developer.android.com/resources/tutorials/views/hello-autocomplete.html
+http://developer.android.com/resources/tutorials/views/hello-gallery.html
+http://developer.android.com/resources/tutorials/views/hello-tabwidget.html
+http://developer.android.com/resources/tutorials/views/hello-mapview.html
+http://developer.android.com/resources/tutorials/views/hello-webview.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/index.html
+http://developer.android.com/resources/samples/JetBoy/src/com/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/values/strings.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/values/styles.html
+http://developer.android.com/sdk/api_diff/6/changes/alldiffs_index_additions.html
+http://developer.android.com/sdk/api_diff/6/changes/alldiffs_index_changes.html
+http://developer.android.com/resources/samples/LunarLander/src/com/example/android/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/com/index.html
+http://developer.android.com/sdk/api_diff/6/changes/packages_index_changes.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/alert_dialog_icon.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/app_sample_code.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/arrow_down_float.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/arrow_up_float.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/btn_check_off.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/btn_check_on.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/btn_circle_normal.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/btn_default_normal.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/button.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/ic_contact_picture.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/ic_popup_reminder.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/icon48x48_2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/logo240dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/npatch240dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/progress_circular_background.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/progress_particle.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/reslogo240dpi.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/robot.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/scrollbar_state2.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/smlnpatch240dpi.9.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/star_big_on.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/stat_happy.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/stat_neutral.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/stat_sad.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/stat_sample.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-hdpi/stylogo240dpi.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/xml/method.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/xml/qwerty.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/xml/symbols.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/xml/symbols_shift.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-mdpi/icon.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/app/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/os/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/view/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/AllTests.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/index.html
+http://developer.android.com/sdk/api_diff/6/changes/methods_index_changes.html
+http://developer.android.com/reference/android/text/method/package-descr.html
+http://developer.android.com/resources/samples/ContactManager/src/com/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/com/example/index.html
+http://developer.android.com/resources/samples/ContactManager/res/layout/account_entry.html
+http://developer.android.com/resources/samples/ContactManager/res/layout/contact_adder.html
+http://developer.android.com/resources/samples/ContactManager/res/layout/contact_entry.html
+http://developer.android.com/resources/samples/ContactManager/res/layout/contact_manager.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-small-notlong/strings.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/layout/widget_message.html
+http://developer.android.com/resources/samples/WiktionarySimple/res/layout/widget_word.html
+http://developer.android.com/resources/samples/BluetoothChat/res/values/strings.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/cycle_7.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/fade.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/hold.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/hyperspace_in.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/hyperspace_out.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_animation_row_left_slide.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_animation_row_right_slide.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_animation_table.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_bottom_to_top_slide.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_grid_fade.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_grid_inverse_fade.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_random_fade.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/layout_wave_scale.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/push_left_in.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/push_left_out.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/push_up_in.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/push_up_out.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/shake.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/slide_left.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/slide_right.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/slide_top_to_bottom.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/wave_scale.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/zoom_enter.html
+http://developer.android.com/resources/samples/ApiDemos/res/anim/zoom_exit.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/index.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_delete.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_done.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_return.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_search.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_shift.html
+http://developer.android.com/resources/samples/SoftKeyboard/res/drawable-mdpi/sym_keyboard_space.html
+http://developer.android.com/sdk/api_diff/5/changes/jdiff_statistics.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.app.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.content.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.content.pm.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.content.res.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.database.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.database.sqlite.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.graphics.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.graphics.drawable.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.hardware.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.inputmethodservice.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.location.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.media.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.opengl.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.os.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.provider.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.telephony.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.test.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.test.mock.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.text.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.text.format.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.text.style.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.util.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.view.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.view.animation.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.webkit.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_android.widget.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_dalvik.system.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_java.util.concurrent.html
+http://developer.android.com/sdk/api_diff/5/changes/pkg_java.util.concurrent.locks.html
+http://developer.android.com/resources/samples/ContactManager/src/com/example/index.html
+http://developer.android.com/reference/javax/net/ssl/package-descr.html
+http://developer.android.com/reference/android/media/package-descr.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi/app_notes.html
+http://developer.android.com/resources/samples/NotePad/res/drawable-mdpi/live_folder_notes.html
+http://developer.android.com/sdk/api_diff/5/changes/android.widget.AutoCompleteTextView.html
+http://developer.android.com/sdk/api_diff/5/changes/android.widget.MediaController.MediaPlayerControl.html
+http://developer.android.com/sdk/api_diff/5/changes/android.widget.SimpleCursorTreeAdapter.html
+http://developer.android.com/sdk/api_diff/5/changes/android.widget.VideoView.html
+http://developer.android.com/reference/org/apache/http/conn/package-descr.html
+http://developer.android.com/resources/samples/Home/res/anim/index.html
+http://developer.android.com/resources/samples/Home/res/color/index.html
+http://developer.android.com/resources/samples/Home/res/drawable/index.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/index.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/index.html
+http://developer.android.com/resources/samples/Home/res/layout/index.html
+http://developer.android.com/resources/samples/Home/res/layout-land/index.html
+http://developer.android.com/resources/samples/Home/res/layout-port/index.html
+http://developer.android.com/resources/samples/Home/res/values/index.html
+http://developer.android.com/resources/samples/Home/res/values-cs/index.html
+http://developer.android.com/resources/samples/Home/res/values-de-rDE/index.html
+http://developer.android.com/resources/samples/Home/res/values-es-rUS/index.html
+http://developer.android.com/resources/samples/Home/res/values-land/index.html
+http://developer.android.com/resources/samples/Home/res/values-nl-rNL/index.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal-notlong/strings.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.HapticFeedbackConstants.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.KeyEvent.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.KeyEvent.Callback.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.MotionEvent.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.Surface.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.SurfaceHolder.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.SurfaceView.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.View.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.ViewConfiguration.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.ViewGroup.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.Window.Callback.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.WindowManager.LayoutParams.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.BroadcastReceiver.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.ContentProvider.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.ContentResolver.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.Context.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.ContextWrapper.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.Intent.html
+http://developer.android.com/sdk/api_diff/5/changes/methods_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/methods_index_changes.html
+http://developer.android.com/sdk/api_diff/5/changes/android.location.LocationManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.PluginList.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.ContactMethods.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.People.html
+http://developer.android.com/sdk/api_diff/5/changes/android.database.sqlite.SQLiteDatabase.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.NotificationManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.hardware.Camera.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.MediaStore.Images.Thumbnails.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.PackageManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.test.mock.MockPackageManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.telephony.PhoneNumberUtils.html
+http://developer.android.com/sdk/api_diff/5/changes/java.util.concurrent.BlockingQueue.html
+http://developer.android.com/sdk/api_diff/5/changes/android.graphics.drawable.Drawable.html
+http://developer.android.com/sdk/api_diff/5/changes/android.os.Debug.MemoryInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.Plugin.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.ServiceInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.text.format.DateUtils.html
+http://developer.android.com/sdk/api_diff/5/changes/android.text.format.Formatter.html
+http://developer.android.com/sdk/api_diff/5/changes/android.hardware.Camera.Parameters.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.PluginData.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.WebSettings.html
+http://developer.android.com/sdk/api_diff/5/changes/android.view.animation.Animation.html
+http://developer.android.com/sdk/api_diff/5/changes/android.text.style.AbsoluteSizeSpan.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Organizations.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Phones.html
+http://developer.android.com/sdk/api_diff/5/changes/android.inputmethodservice.AbstractInputMethodService.html
+http://developer.android.com/sdk/api_diff/5/changes/android.telephony.NeighboringCellInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.ActivityManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.media.AudioManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.UrlInterceptHandler.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.UrlInterceptRegistry.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.WebView.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Settings.html
+http://developer.android.com/sdk/api_diff/5/changes/android.telephony.TelephonyManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.test.InstrumentationTestCase.html
+http://developer.android.com/sdk/api_diff/5/changes/android.database.AbstractWindowedCursor.html
+http://developer.android.com/sdk/api_diff/5/changes/android.database.CursorWindow.html
+http://developer.android.com/sdk/api_diff/5/changes/android.graphics.drawable.Drawable.ConstantState.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.Activity.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.Dialog.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.CallbackProxy.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.WebChromeClient.html
+http://developer.android.com/sdk/api_diff/5/changes/android.inputmethodservice.InputMethodService.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.LauncherActivity.html
+http://developer.android.com/sdk/api_diff/5/changes/android.telephony.PhoneStateListener.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.Service.html
+http://developer.android.com/sdk/api_diff/5/changes/android.os.HandlerThread.html
+http://developer.android.com/sdk/api_diff/5/changes/android.database.DatabaseUtils.html
+http://developer.android.com/sdk/api_diff/5/changes/android.test.mock.MockContext.html
+http://developer.android.com/sdk/api_diff/5/changes/android.opengl.GLSurfaceView.html
+http://developer.android.com/sdk/api_diff/5/changes/android.test.AndroidTestRunner.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.IntentService.html
+http://developer.android.com/sdk/api_diff/5/changes/android.media.ToneGenerator.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.SearchManager.html
+http://developer.android.com/sdk/api_diff/5/changes/fields_index_removals.html
+http://developer.android.com/sdk/api_diff/5/changes/fields_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/fields_index_changes.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.SettingsColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.Manifest.permission.html
+http://developer.android.com/sdk/api_diff/5/changes/android.R.attr.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Intents.Insert.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Settings.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Settings.System.html
+http://developer.android.com/sdk/api_diff/5/changes/android.R.style.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Intents.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.ContactMethodsColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.media.AudioFormat.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.ActivityManager.RunningServiceInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.OrganizationColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.GroupMembership.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.People.ContactMethods.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.People.Extensions.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.People.Phones.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Photos.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Extensions.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Groups.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.PeopleColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.PhotosColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.text.TextPaint.html
+http://developer.android.com/sdk/api_diff/5/changes/android.os.Build.VERSION_CODES.html
+http://developer.android.com/sdk/api_diff/5/changes/android.webkit.WebViewClient.html
+http://developer.android.com/sdk/api_diff/5/changes/android.os.BatteryManager.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.Intents.UI.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.ActivityInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.Notification.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.PresenceColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.app.ActivityManager.RunningAppProcessInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.PhonesColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.ProviderInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.media.MediaPlayer.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.ExtensionsColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.provider.Contacts.GroupsColumns.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.res.Configuration.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.PackageInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.content.pm.ResolveInfo.html
+http://developer.android.com/sdk/api_diff/5/changes/android.R.drawable.html
+http://developer.android.com/sdk/api_diff/5/changes/android.text.InputType.html
+http://developer.android.com/sdk/api_diff/5/changes/android.graphics.PixelFormat.html
+http://developer.android.com/sdk/api_diff/3/changes/jdiff_topleftframe.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/changes-summary.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-large-notlong/strings.html
+http://developer.android.com/reference/javax/sql/package-descr.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/index.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/index.html
http://developer.android.com/sdk/api_diff/3/changes/packages_index_all.html
http://developer.android.com/sdk/api_diff/3/changes/classes_index_all.html
http://developer.android.com/sdk/api_diff/3/changes/constructors_index_all.html
http://developer.android.com/sdk/api_diff/3/changes/methods_index_all.html
http://developer.android.com/sdk/api_diff/3/changes/fields_index_all.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/StyledText.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.java
-http://developer.android.com/sdk/api_diff/3/changes/fields_index_removals.html
-http://developer.android.com/sdk/api_diff/3/changes/fields_index_additions.html
-http://developer.android.com/sdk/api_diff/3/changes/fields_index_changes.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.System.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.AudioManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.net.ConnectivityManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.Intent.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.MotionEvent.html
-http://developer.android.com/sdk/api_diff/3/changes/android.telephony.TelephonyManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.R.id.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.DynamicDrawableSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.R.attr.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.Gravity.html
-http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.Manifest.permission.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.VideoColumns.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.DialogInterface.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.TextUtils.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageInfo.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.res.AssetFileDescriptor.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.RectF.html
-http://developer.android.com/sdk/api_diff/3/changes/android.R.drawable.html
-http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.Zygote.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Images.Media.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.html
-http://developer.android.com/sdk/api_diff/3/changes/android.R.string.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Build.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Browser.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.Media.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.WindowManager.LayoutParams.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyEvent.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.ActivityInfo.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.PendingIntent.html
-http://developer.android.com/sdk/api_diff/3/changes/android.telephony.PhoneNumberUtils.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.View.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Configuration.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.Context.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.AlarmManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.location.LocationManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Environment.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaPlayer.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.ParcelFileDescriptor.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.AlbumColumns.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.Insert.html
-http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.PeopleColumns.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.OutputFormat.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.Spanned.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.GridView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.R.style.html
-http://developer.android.com/sdk/api_diff/3/changes/android.net.wifi.WifiManager.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
-http://developer.android.com/guide/samples/LunarLander/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.java
-http://developer.android.com/guide/samples/NotePad/res/drawable/index.html
-http://developer.android.com/guide/samples/NotePad/res/layout/index.html
-http://developer.android.com/guide/samples/NotePad/res/values/index.html
-http://developer.android.com/sdk/api_diff/3/changes/jdiff_statistics.html
-http://developer.android.com/reference/android/view/inputmethod/package-descr.html
-http://developer.android.com/sdk/1.0_r1/requirements.html
-http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.0_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.0_r1.zip
-http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.0_r1.zip
-http://developer.android.com/reference/java/util/concurrent/atomic/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/alarm_controller.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/alarm_service.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/alert_dialog.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/alert_dialog_text_entry.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/animation_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/animation_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/animations_main_screen.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/appwidget_configure.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/appwidget_provider.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/buttons_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/chronometer.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/contacts_filter.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/controls_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_dialog_activity.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_title.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_title_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/date_widgets_example_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/date_widgets_example_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/dialog_activity.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/forward_target.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/forwarding.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/gallery_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/gallery_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/google_login.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/grid_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/grid_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/image_button_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/image_switcher_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/image_view_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_info.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_panel.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_view.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/intents.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/launcher_shortcuts.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_10.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_8.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_9.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/link.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_12.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_13.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_8.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_item_checkbox.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_item_icon_text.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/list_position.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/local_sample.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/local_service_binding.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/local_service_controller.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/log_text_box_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/mapview.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/marquee.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/mediaplayer_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/mediaplayer_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/morse_code.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/notify_with_text.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/notifying_controller.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/preference_widget_mypreference.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/radio_group_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/ratingbar_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/read_asset.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/receive_result.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_enter.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_getter.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_main.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/relative_layout_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/relative_layout_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/remote_service_binding.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/remote_service_controller.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_four.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_on_launch.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_three.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_two.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/resources.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/save_restore_state.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/scroll_view_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/scroll_view_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/search_invoke.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/search_query_results.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/seekbar_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/select_dialog.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/send_result.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/service_start_arguments_controller.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/shape_drawable_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/spinner_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/status_bar_balloon.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/status_bar_notifications.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/styled_text.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_10.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_11.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_12.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_8.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_9.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/tabs1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/text_switcher_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/translucent_background.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/videoview.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/visibility_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/voice_recognition.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/webview_1.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java
-http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_removals.html
-http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_additions.html
-http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_changes.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsListView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsoluteLayout.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AbsoluteSizeSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsSeekBar.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.Activity.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.ActivityInstrumentationTestCase.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.ActivityManager.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.app.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewTreeObserver.html
-http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Packer.html
-http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Unpacker.html
-http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.LogManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.suitebuilder.TestSuiteBuilder.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MetaKeyKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.AlertDialog.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AlignmentSpan.Standard.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.widget.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.pm.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.res.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.sqlite.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.shapes.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.hardware.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.location.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.media.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.wifi.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.opengl.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.os.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.preference.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.provider.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.gsm.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.mock.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.suitebuilder.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.method.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.style.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.util.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.animation.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_android.webkit.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Animation.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.Annotation.html
-http://developer.android.com/sdk/api_diff/3/changes/android.database.DatabaseUtils.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.ArrayAdapter.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ArrowKeyMovementMethod.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.AutoCompleteTextView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.AutoText.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BackgroundColorSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.BaseKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.TextView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Binder.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Bitmap.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.BroadcastReceiver.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BulletSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.telephony.gsm.SmsMessage.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.Instrumentation.html
-http://developer.android.com/sdk/api_diff/3/changes/android.hardware.Camera.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Canvas.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.SimpleCursorAdapter.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Debug.html
-http://developer.android.com/sdk/api_diff/3/changes/java.lang.Character.UnicodeBlock.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.Chronometer.html
-http://developer.android.com/sdk/api_diff/3/changes/java.lang.Class.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.KeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ClickableSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.shapes.Shape.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.Menu.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentProvider.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentResolver.html
-http://developer.android.com/sdk/api_diff/3/changes/android.database.Cursor.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.CursorAdapter.html
-http://developer.android.com/sdk/api_diff/3/changes/android.database.CursorWrapper.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_dalvik.system.html
-http://developer.android.com/sdk/api_diff/3/changes/java.util.Date.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateTimeKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ForegroundColorSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.LeadingMarginSpan.Standard.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.QuoteSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RelativeSizeSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ScaleXSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StrikethroughSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StyleSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SubscriptSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SuperscriptSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TextAppearanceSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TypefaceSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.URLSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UnderlineSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyCharacterMap.html
-http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.DexFile.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DialerKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.preference.DialogPreference.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DigitsKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.TouchUtils.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.Drawable.html
-http://developer.android.com/sdk/api_diff/3/changes/android.location.Location.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.IBinder.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewDebug.html
-http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.VMDebug.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.SimpleOnGestureListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewConfiguration.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebSettings.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Resources.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.RotateDrawable.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.ScaleDrawable.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.Touch.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MultiTapKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.QwertyKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TextKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TimeKeyListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.mock.MockPackageManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.content.res.TypedArray.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebHistoryItem.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptHandler.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptRegistry.html
-http://developer.android.com/sdk/api_diff/3/changes/java.lang.reflect.Proxy.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.Scroller.html
-http://developer.android.com/sdk/api_diff/3/changes/android.net.NetworkInfo.html
-http://developer.android.com/sdk/api_diff/3/changes/android.app.LauncherActivity.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Looper.html
-http://developer.android.com/sdk/api_diff/3/changes/android.util.TimeUtils.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Handler.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.Window.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ImageSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.RingtoneManager.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.InstrumentationTestCase.html
-http://developer.android.com/sdk/api_diff/3/changes/android.webkit.URLUtil.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.lang.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.lang.reflect.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.net.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.jar.html
-http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.logging.html
-http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.Level.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.ListView.html
-http://developer.android.com/sdk/api_diff/3/changes/android.media.SoundPool.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.MaskFilterSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MovementMethod.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ScrollingMovementMethod.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.ProgressBar.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.OrientationListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.os.Parcel.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.OnDismissListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.ProviderTestCase.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RasterizerSpan.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Rect.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.ActionException.html
-http://developer.android.com/sdk/api_diff/3/changes/android.util.SparseIntArray.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewParent.html
-http://developer.android.com/sdk/api_diff/3/changes/android.widget.ResourceCursorAdapter.html
-http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorListener.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewGroup.html
-http://developer.android.com/sdk/api_diff/3/changes/java.net.Socket.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.SpanWatcher.html
-http://developer.android.com/sdk/api_diff/3/changes/android.database.sqlite.SQLiteDatabase.html
-http://developer.android.com/sdk/api_diff/3/changes/java.lang.String.html
-http://developer.android.com/sdk/api_diff/3/changes/android.test.suitebuilder.TestMethod.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.TextWatcher.html
-http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Transformation.html
-http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.TransitionDrawable.html
-http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UpdateLayout.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.java
-http://developer.android.com/reference/android/text/package-descr.html
-http://developer.android.com/guide/samples/NotePad/src/com/google/provider/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.java
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePad.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/index.html
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/index.html
-http://developer.android.com/reference/org/apache/http/conn/routing/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java
-http://developer.android.com/reference/java/lang/Deprecated.html
-http://developer.android.com/reference/java/lang/annotation/Documented.html
-http://developer.android.com/reference/android/test/FlakyTest.html
-http://developer.android.com/reference/java/lang/annotation/Inherited.html
-http://developer.android.com/reference/java/lang/Override.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/Smoke.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/Suppress.html
-http://developer.android.com/reference/java/lang/SuppressWarnings.html
-http://developer.android.com/reference/dalvik/annotation/TestTarget.html
-http://developer.android.com/reference/dalvik/annotation/TestTargetClass.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.java
-http://developer.android.com/guide/samples/NotePad/res/values/strings.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.java
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePadProvider.java
-http://developer.android.com/guide/samples/ApiDemos/res/anim/cycle_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/fade.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/hyperspace_in.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/hyperspace_out.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_row_left_slide.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_row_right_slide.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_table.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_bottom_to_top_slide.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_grid_fade.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_grid_inverse_fade.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_random_fade.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_wave_scale.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/push_left_in.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/push_left_out.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/push_up_in.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/push_up_out.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/shake.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_left.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_right.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_top_to_bottom.html
-http://developer.android.com/guide/samples/ApiDemos/res/anim/wave_scale.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/TitleEditor.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.java
-http://developer.android.com/guide/samples/ApiDemos/res/values/arrays.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/attrs.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/colors.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/ids.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/strings.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/styles.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.java
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
-http://developer.android.com/sdk/api_diff/3/changes/packages_index_additions.html
-http://developer.android.com/sdk/api_diff/3/changes/packages_index_changes.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.java
-http://developer.android.com/sdk/api_diff/3/changes/constructors_index_removals.html
-http://developer.android.com/sdk/api_diff/3/changes/constructors_index_additions.html
-http://developer.android.com/sdk/api_diff/3/changes/constructors_index_changes.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.java
+http://developer.android.com/resources/samples/Snake/src/com/index.html
+http://developer.android.com/reference/android/appwidget/package-descr.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/index.html
+http://developer.android.com/resources/samples/Home/res/anim/fade_in.html
+http://developer.android.com/resources/samples/Home/res/anim/fade_out.html
+http://developer.android.com/resources/samples/Home/res/anim/grid_entry.html
+http://developer.android.com/resources/samples/Home/res/anim/grid_exit.html
+http://developer.android.com/resources/samples/Home/res/anim/hide_applications.html
+http://developer.android.com/resources/samples/Home/res/anim/show_applications.html
http://developer.android.com/reference/org/w3c/dom/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.java
-http://developer.android.com/guide/samples/ApiDemos/res/menu/category_order.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/checkable.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/disabled.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/groups.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/order.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/shortcuts.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/submenu.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/title_icon.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/title_only.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/visible.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.java
+http://developer.android.com/reference/org/apache/http/package-descr.html
+http://developer.android.com/resources/samples/MultiResolution/src/com/example/index.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.html
@@ -3450,6 +3931,7 @@
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus1.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus2.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus3.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation3.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.html
@@ -3460,6 +3942,7 @@
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.html
@@ -3481,428 +3964,826 @@
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/WebView1.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/M4.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout10.java
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/alert_dialog_icon.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/animated_gif.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/app_sample_code.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_down_float.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_up_float.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/balloons.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/beach.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_opaque_box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/button.9.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/circular_progress.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/filled_box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/frog.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_background_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_8.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/ic_popup_reminder.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/line.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/picture_frame.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_circular_background.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_particle.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/robot.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_0.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_0.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_7.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_state2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_thumb.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_track.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/star_big_on.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_happy.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_neutral.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sad.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sample.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List11.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Spinner1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List9.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout12.java
-http://developer.android.com/reference/org/apache/http/cookie/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List13.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/WebView1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List7.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout8.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout9.java
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotesList.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar3.java
-http://developer.android.com/reference/android/os/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/SeekBar1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout9.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout11.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List12.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout7.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List5.java
-http://developer.android.com/guide/samples/NotePad/src/com/google/provider/NotePad.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Visibility1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Intents.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderFour.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderThree.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderTwo.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline6.java
-http://developer.android.com/reference/android/app/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List8.java
+http://developer.android.com/resources/samples/Home/res/drawable/all_applications.html
+http://developer.android.com/resources/samples/Home/res/drawable/all_applications_background.html
+http://developer.android.com/resources/samples/Home/res/drawable/all_applications_button_background.html
+http://developer.android.com/resources/samples/Home/res/drawable/favorite_background.html
+http://developer.android.com/resources/samples/Home/res/drawable/grid_selector.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/all_applications_label_background.9.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/application_background.9.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/focused_application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/hide_all_applications.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/ic_launcher_allhide.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/ic_launcher_allshow.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/ic_launcher_home.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/pressed_application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-hdpi/show_all_applications.html
+http://developer.android.com/reference/android/inputmethodservice/package-descr.html
+http://developer.android.com/sdk/api_diff/3/changes/packages_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/packages_index_changes.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.app.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.pm.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.res.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.sqlite.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.shapes.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.hardware.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.location.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.media.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.wifi.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.opengl.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.os.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.preference.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.provider.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.gsm.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.mock.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.suitebuilder.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.method.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.style.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.util.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.animation.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.webkit.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.widget.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_dalvik.system.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.lang.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.jar.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.logging.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.AllocationLimitError.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.PotentialDeadlockError.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.StaleDexCacheError.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.TemporaryDirectory.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.TouchDex.html
+http://developer.android.com/sdk/api_diff/5/changes/android.graphics.drawable.BitmapDrawable.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.VMStack.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.VMRuntime.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.Zygote.html
+http://developer.android.com/sdk/api_diff/5/changes/dalvik.system.VMDebug.html
+http://developer.android.com/resources/samples/Home/res/values-de-rDE/strings.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/index.html
+http://developer.android.com/reference/android/opengl/package-descr.html
+http://developer.android.com/sdk/api_diff/3/changes/jdiff_statistics.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-nodpi/logonodpi120.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-nodpi/logonodpi160.html
+http://developer.android.com/resources/samples/ApiDemos/res/drawable-nodpi/logonodpi240.html
+http://developer.android.com/resources/samples/Home/res/values-cs/strings.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.PhoneNumberUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.TelephonyManager.html
+http://developer.android.com/sdk/api_diff/4/changes/alldiffs_index_removals.html
+http://developer.android.com/sdk/api_diff/4/changes/alldiffs_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/alldiffs_index_changes.html
+http://developer.android.com/reference/java/nio/charset/spi/package-descr.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/index.html
+http://developer.android.com/reference/junit/runner/package-descr.html
+http://developer.android.com/reference/android/test/suitebuilder/package-descr.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/index.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.SimpleOnGestureListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Gravity.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyCharacterMap.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyEvent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Menu.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.MotionEvent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.OrientationListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.View.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewConfiguration.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewDebug.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewGroup.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewParent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewTreeObserver.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Window.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.WindowManager.LayoutParams.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.wifi.WifiManager.html
+http://developer.android.com/resources/samples/Home/res/layout-land/home.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout5.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout7.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout8.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout9.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ScrollView1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ScrollView2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout5.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout7.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout8.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout9.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout10.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout11.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TableLayout12.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Baseline7.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/RadioGroup1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Visibility1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List5.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List7.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List8.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/CustomView1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ImageButton1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Gallery1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Spinner1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Grid1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Grid2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Animation1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Animation2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Controls1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Controls2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Focus1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Focus2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Focus3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Animation3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ImageView1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout10.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List10.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List11.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List12.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List13.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List9.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/RatingBar1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/SeekBar1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Tabs1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/WebView1.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.Character.UnicodeBlock.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.Class.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/index.html
+http://developer.android.com/resources/samples/NotePad/src/com/google/index.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_changes.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AbsoluteSizeSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AlignmentSpan.Standard.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.Annotation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BackgroundColorSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BulletSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.DynamicDrawableSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ForegroundColorSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Handler.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ImageSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.LeadingMarginSpan.Standard.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.NetworkInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.QuoteSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RelativeSizeSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.ActionException.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ResourceCursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ScaleXSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StrikethroughSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StyleSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SubscriptSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SuperscriptSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TextAppearanceSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.TransitionDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TypefaceSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UnderlineSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.URLSpan.html
+http://developer.android.com/reference/java/nio/package-descr.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.AutoText.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.SpanWatcher.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.Spanned.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.TextUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.TextWatcher.html
http://developer.android.com/sdk/api_diff/3/changes/classes_index_additions.html
http://developer.android.com/sdk/api_diff/3/changes/classes_index_changes.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderThree.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline7.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.java
-http://developer.android.com/guide/samples/NotePad/src/com/google/provider/NotePad.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout6.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List10.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline2.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.java
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.html
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderTwo.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Intents.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout7.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.java
-http://developer.android.com/guide/samples/NotePad/res/layout/note_editor.html
-http://developer.android.com/guide/samples/NotePad/res/layout/noteslist_item.html
-http://developer.android.com/guide/samples/NotePad/res/layout/title_editor.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageButton1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout5.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.java
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsListView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsoluteLayout.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsSeekBar.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.Activity.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.ActivityInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.ActivityInstrumentationTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.ActivityManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.AlarmManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.AlertDialog.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Animation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ArrayAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ArrowKeyMovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.AssetFileDescriptor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.AudioManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AutoCompleteTextView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.BaseKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Binder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Bitmap.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.BroadcastReceiver.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Browser.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Build.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.Camera.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Canvas.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.Chronometer.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ClickableSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Configuration.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.ConnectivityManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.Insert.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.PeopleColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentProvider.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentResolver.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.Context.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.Cursor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.CursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.CursorWrapper.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.DatabaseUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateTimeKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Debug.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.DexFile.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DialerKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.DialogInterface.html
+http://developer.android.com/sdk/api_diff/3/changes/android.preference.DialogPreference.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DigitsKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.Drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Environment.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.GridView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.IBinder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.Instrumentation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.InstrumentationTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.Intent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.KeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.LauncherActivity.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.Level.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ListView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.location.Location.html
+http://developer.android.com/sdk/api_diff/3/changes/android.location.LocationManager.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.LogManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Looper.html
+http://developer.android.com/sdk/api_diff/3/changes/android.Manifest.permission.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.MaskFilterSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaPlayer.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.OutputFormat.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.AlbumColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.Media.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Images.Media.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.VideoColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MetaKeyKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.mock.MockPackageManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MultiTapKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Packer.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Unpacker.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Parcel.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.ParcelFileDescriptor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.PendingIntent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.OnDismissListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ProgressBar.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.ProviderTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.QwertyKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.attr.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.id.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.string.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.style.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RasterizerSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Rect.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.RectF.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Resources.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.RingtoneManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.RotateDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.ScaleDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.Scroller.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ScrollingMovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.System.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.shapes.Shape.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.SimpleCursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.gsm.SmsMessage.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.SoundPool.html
+http://developer.android.com/sdk/api_diff/3/changes/android.util.SparseIntArray.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.sqlite.SQLiteDatabase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TextKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.TextView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TimeKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.util.TimeUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.Touch.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.TouchUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Transformation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.TypedArray.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UpdateLayout.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptHandler.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptRegistry.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.URLUtil.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.VMDebug.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebHistoryItem.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebSettings.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebView.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.Zygote.html
+http://developer.android.com/resources/samples/Snake/res/layout/snake_layout.html
+http://developer.android.com/resources/samples/MultiResolution/src/com/example/android/index.html
+http://developer.android.com/reference/javax/security/auth/callback/package-descr.html
+http://developer.android.com/resources/samples/Snake/src/com/example/index.html
+http://developer.android.com/sdk/api_diff/4/changes/fields_index_removals.html
+http://developer.android.com/sdk/api_diff/4/changes/fields_index_additions.html
+http://developer.android.com/sdk/api_diff/4/changes/fields_index_changes.html
+http://developer.android.com/resources/samples/Wiktionary/res/anim/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/layout/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/menu/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/values/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/xml/index.html
+http://developer.android.com/sdk/api_diff/6/changes/fields_index_additions.html
+http://developer.android.com/sdk/api_diff/6/changes/fields_index_changes.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_changes.html
+http://developer.android.com/reference/org/apache/http/util/package-descr.html
+http://developer.android.com/sdk/api_diff/5/changes/alldiffs_index_removals.html
+http://developer.android.com/sdk/api_diff/5/changes/alldiffs_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/alldiffs_index_changes.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable/index.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable-land/index.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable-port/index.html
+http://developer.android.com/resources/samples/LunarLander/res/layout/index.html
+http://developer.android.com/resources/samples/LunarLander/res/values/index.html
+http://developer.android.com/resources/samples/MultiResolution/src/com/example/android/multires/index.html
+http://developer.android.com/resources/samples/Home/res/values/attrs.html
+http://developer.android.com/resources/samples/Home/res/values/strings.html
+http://developer.android.com/resources/samples/Home/res/values/styles.html
+http://developer.android.com/resources/samples/Wiktionary/res/layout/about.html
+http://developer.android.com/resources/samples/Wiktionary/res/layout/lookup.html
+http://developer.android.com/resources/samples/Wiktionary/res/layout/widget_message.html
+http://developer.android.com/resources/samples/Wiktionary/res/layout/widget_word.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/app_icon.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/ic_menu_shuffle.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/logo_overlay.9.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/lookup_bg.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/progress_spin.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/star_logo.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/widget_bg.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/widget_bg_normal.9.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/widget_bg_pressed.9.html
+http://developer.android.com/resources/samples/Wiktionary/res/drawable/widget_bg_selected.9.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/index.html
+http://developer.android.com/resources/samples/LunarLander/res/values/strings.html
+http://developer.android.com/resources/samples/Home/res/layout/all_applications_button.html
+http://developer.android.com/resources/samples/Home/res/layout/application.html
+http://developer.android.com/resources/samples/Home/res/layout/favorite.html
+http://developer.android.com/resources/samples/Home/res/layout/wallpaper.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable-port/earthrise.html
+http://developer.android.com/resources/samples/Snake/res/drawable/greenstar.html
+http://developer.android.com/resources/samples/Snake/res/drawable/redstar.html
+http://developer.android.com/resources/samples/Snake/res/drawable/yellowstar.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/index.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/index.html
+http://developer.android.com/resources/samples/JetBoy/res/layout/index.html
+http://developer.android.com/resources/samples/JetBoy/res/raw/index.html
+http://developer.android.com/resources/samples/JetBoy/res/values/index.html
+http://developer.android.com/resources/samples/ContactManager/res/drawable-ldpi/icon.html
+http://developer.android.com/resources/samples/LunarLander/res/layout/lunar_layout.html
+http://developer.android.com/resources/samples/Home/res/values-es-rUS/strings.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/wiktionary/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/com/example/android/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/menu/lookup.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.html
+http://developer.android.com/reference/android/preference/package-descr.html
+http://developer.android.com/resources/samples/Snake/src/com/example/android/index.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable-land/earthrise.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_android.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_android_icon.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_sunrise.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_sunrise_icon.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_sunset.html
+http://developer.android.com/resources/samples/Home/res/drawable-port/bg_sunset_icon.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/index.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/all_applications_label_background.9.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/application_background.9.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/focused_application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/hide_all_applications.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/ic_launcher_allhide.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/ic_launcher_allshow.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/ic_launcher_home.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/pressed_application_background_static.html
+http://developer.android.com/resources/samples/Home/res/drawable-mdpi/show_all_applications.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/appwidget/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/ApiDemos.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.html
+http://developer.android.com/resources/samples/Home/res/layout-port/home.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/index.html
+http://developer.android.com/resources/samples/Home/src/com/index.html
+http://developer.android.com/resources/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.html
+http://developer.android.com/reference/java/lang/annotation/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/StyledText.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.html
+http://developer.android.com/sdk/api_diff/5/changes/constructors_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/constructors_index_changes.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmap.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmapView.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/StaticTriangleRenderer.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.html
+http://developer.android.com/resources/samples/Wiktionary/res/anim/slide_in.html
+http://developer.android.com/resources/samples/Wiktionary/res/anim/slide_out.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_changes.html
+http://developer.android.com/resources/samples/Home/res/color/bright_text_dark_focused.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/drawable/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/layout/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/raw/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/values/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/xml/index.html
+http://developer.android.com/resources/samples/LunarLander/src/com/example/android/lunarlander/index.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/com/example/android/lunarlander/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.html
+http://developer.android.com/resources/samples/ContactManager/res/values/strings.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/example/index.html
+http://developer.android.com/sdk/api_diff/5/changes/classes_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/classes_index_changes.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_android.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_android_icon.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_sunrise.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_sunrise_icon.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_sunset.html
+http://developer.android.com/resources/samples/Home/res/drawable-land/bg_sunset_icon.html
+http://developer.android.com/reference/org/apache/http/entity/package-descr.html
+http://developer.android.com/resources/samples/ApiDemos/res/values-normal-long/strings.html
+http://developer.android.com/resources/samples/MultiResolution/src/com/example/android/multires/MultiRes.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/CandidateView.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/LatinKeyboard.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/LatinKeyboardView.html
+http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.html
+http://developer.android.com/resources/samples/Home/src/com/example/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi-v6/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi-v6/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi-v6/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/layout/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/layout-land/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/values/index.html
+http://developer.android.com/resources/samples/JetBoy/JETBOY_content/JETBOY_Music.logic/index.html
+http://developer.android.com/sdk/api_diff/5/changes/packages_index_additions.html
+http://developer.android.com/sdk/api_diff/5/changes/packages_index_changes.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/Link.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/text/Marquee.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/values/strings.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi/android.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi/ic_launcher.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi/image_container.9.html
+http://developer.android.com/resources/samples/Snake/tests/src/com/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-mdpi-v6/ic_launcher.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/layout/main.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/layout/word.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi-v6/ic_launcher.html
+http://developer.android.com/resources/samples/Wiktionary/res/xml/searchable.html
+http://developer.android.com/resources/samples/Wiktionary/res/xml/widget_word.html
+http://developer.android.com/resources/samples/JetBoy/res/values/strings.html
+http://developer.android.com/resources/samples/JetBoy/res/values/styles.html
+http://developer.android.com/sdk/api_diff/3/changes/methods_index_removals.html
http://developer.android.com/sdk/api_diff/3/changes/methods_index_additions.html
http://developer.android.com/sdk/api_diff/3/changes/methods_index_changes.html
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/AndroidManifest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/M4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout8.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.java
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageView1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RatingBar1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RadioGroup1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout6.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/CustomView1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout2.java
-http://developer.android.com/guide/samples/NotePad/res/drawable/app_notes.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView2.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderFour.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout5.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.java
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus3.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout10.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List6.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/advanced_preferences.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/appwidget_provider.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/default_values.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/preference_dependencies.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/preferences.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/searchable.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/index.html
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline1.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.html
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/AllTests.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.java
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/AllTests.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.html
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.java
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.java
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/wiktionary/ExtendedWikiHelper.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/wiktionary/LookupActivity.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/wiktionary/SimpleWikiHelper.html
+http://developer.android.com/resources/samples/Wiktionary/src/com/example/android/wiktionary/WordWidget.html
+http://developer.android.com/resources/samples/Home/res/values-land/strings.html
+http://developer.android.com/resources/samples/Snake/res/values/attrs.html
+http://developer.android.com/resources/samples/Snake/res/values/strings.html
+http://developer.android.com/resources/samples/Snake/src/com/example/android/snake/index.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/BluetoothChat.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/BluetoothChatService.html
+http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/DeviceListActivity.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi/android.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi/ic_launcher.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi/image_container.9.html
+http://developer.android.com/resources/samples/NotePad/tests/src/com/index.html
+http://developer.android.com/resources/samples/Wiktionary/res/values/strings.html
+http://developer.android.com/resources/samples/Wiktionary/res/values/styles.html
+http://developer.android.com/resources/samples/Wiktionary/res/values/themes.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/drawable/ic_dictionary.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/index.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable/app_lunar_lander.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable/lander_crashed.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable/lander_firing.html
+http://developer.android.com/resources/samples/LunarLander/res/drawable/lander_plain.html
+http://developer.android.com/resources/samples/NotePad/src/com/google/provider/index.html
+http://developer.android.com/resources/samples/JetBoy/JETBOY_content/JETBOY_Music.logic/LgDoc/index.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.html
+http://developer.android.com/resources/samples/SearchableDictionary/res/xml/searchable.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi/android.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi/ic_launcher.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-hdpi/image_container.9.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable-ldpi-v6/ic_launcher.html
+http://developer.android.com/resources/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/example/android/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/background.9.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/icon.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_0.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_1.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_2.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_3.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_4.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_5.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_6.html
+http://developer.android.com/resources/samples/MultiResolution/res/drawable/sample_7.html
+http://developer.android.com/resources/samples/MultiResolution/res/layout/main.html
+http://developer.android.com/resources/samples/NotePad/res/values/strings.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/kube/M4.html
+http://developer.android.com/resources/samples/Home/res/values-nl-rNL/strings.html
+http://developer.android.com/resources/samples/Snake/src/com/example/android/snake/Snake.html
+http://developer.android.com/resources/samples/Snake/src/com/example/android/snake/SnakeView.html
+http://developer.android.com/resources/samples/Snake/src/com/example/android/snake/TileView.html
+http://developer.android.com/resources/samples/NotePad/tests/src/com/example/index.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/searchabledict/index.html
+http://developer.android.com/resources/samples/MultiResolution/res/values/strings.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.html
+http://developer.android.com/resources/samples/MultiResolution/res/layout-land/main.html
+http://developer.android.com/resources/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.html
+http://developer.android.com/resources/samples/LunarLander/src/com/example/android/lunarlander/LunarView.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/index.html
+http://developer.android.com/resources/samples/Snake/tests/src/com/example/index.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid01.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid02.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid03.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid04.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid05.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid06.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid07.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid08.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid09.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid10.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid11.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid12.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid_explode1.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid_explode2.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid_explode3.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/asteroid_explode4.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/background_a.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/background_b.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/icon.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/int_timer.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/intbeam_1.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/intbeam_2.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/intbeam_3.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/intbeam_4.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/laser.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_1.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_2.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_3.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_4.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_hit_1.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_hit_2.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_hit_3.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/ship2_hit_4.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/title_bg_hori.html
+http://developer.android.com/resources/samples/JetBoy/res/drawable/title_hori.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/example/android/simplewiktionary/index.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/jetboy/index.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/home/index.html
+http://developer.android.com/resources/samples/NotePad/tests/src/com/example/android/index.html
+http://developer.android.com/resources/samples/NotePad/src/com/google/provider/NotePad.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/searchabledict/Dictionary.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/searchabledict/DictionaryProvider.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/searchabledict/SearchableDictionary.html
+http://developer.android.com/resources/samples/SearchableDictionary/src/com/example/android/searchabledict/WordActivity.html
+http://developer.android.com/resources/samples/JetBoy/res/layout/main.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/home/ApplicationInfo.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/home/ApplicationsStackLayout.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/home/Home.html
+http://developer.android.com/resources/samples/Home/src/com/example/android/home/Wallpaper.html
+http://developer.android.com/resources/samples/ContactManager/src/com/example/android/index.html
+http://developer.android.com/resources/samples/Snake/tests/src/com/example/android/index.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/example/android/simplewiktionary/SimpleWikiHelper.html
+http://developer.android.com/resources/samples/WiktionarySimple/src/com/example/android/simplewiktionary/WordWidget.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundServiceController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/Animation.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/Intents.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/QuickContactsDemo.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ReorderFour.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ReorderThree.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ReorderTwo.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SendResult.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SetWallpaperActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/TextToSpeechActivity.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html
+http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/WallpaperActivity.html
+http://developer.android.com/resources/samples/ContactManager/src/com/example/android/contactmanager/index.html
+http://developer.android.com/resources/samples/Snake/tests/src/com/example/android/snake/index.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/jetboy/Asteroid.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/jetboy/Explosion.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/jetboy/JetBoy.html
+http://developer.android.com/resources/samples/JetBoy/src/com/example/android/jetboy/JetBoyView.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePad.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotesList.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotesLiveFolder.html
+http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/TitleEditor.html
+http://developer.android.com/resources/samples/ContactManager/src/com/example/android/contactmanager/ContactAdder.html
+http://developer.android.com/resources/samples/ContactManager/src/com/example/android/contactmanager/ContactManager.html
+http://developer.android.com/resources/samples/NotePad/tests/src/com/example/android/notepad/index.html
+http://developer.android.com/resources/samples/Snake/tests/src/com/example/android/snake/SnakeTest.html
+http://developer.android.com/resources/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.html
\ No newline at end of file
diff --git a/docs/html/videos/index.jd b/docs/html/videos/index.jd
index 4e53aac..157c077 100644
--- a/docs/html/videos/index.jd
+++ b/docs/html/videos/index.jd
@@ -98,7 +98,7 @@
// Check whether this playlist includes the video title inside the description meta-data, so we can remove it
if (playlistsWithTitleInDescription.indexOf(playlistId) != -1) {
var lines = fullDescription.split("\n");
- // If the first line includes the first 17 chars from the title, let's use the title from the desciption instead (because it's a more complete title)
+ // If the first line includes the first 17 chars from the title, let's use the title from the description instead (because it's a more complete title)
// This accounts for, literally, "Google I/O 2009 -", which is (so far) the min AND max for properly identifying a title in the only playlist with titles in the description
if (lines[0].indexOf(title.slice(0,16)) != -1) {
h3Title = "<h3>" + lines[0] + "</h3>";
@@ -332,7 +332,7 @@
<script type="text/javascript">
// Initialization actions
showFeatured(); // load featured videos
-showPlaylists(); // load playslists
+showPlaylists(); // load playlists
</script>
-
\ No newline at end of file
+
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index f60a7be..3c03eed 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -532,7 +532,7 @@
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
try {
if (MemoryFile.isMemoryFile(fd)) {
- int mappedlength = MemoryFile.getMappedSize(fd);
+ int mappedlength = MemoryFile.getSize(fd);
MemoryFile file = new MemoryFile(fd, mappedlength, "r");
InputStream is = file.getInputStream();
Bitmap bm = decodeStream(is, outPadding, opts);
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index b6ac14a..7d100eb 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -39,6 +39,10 @@
mType = t;
}
+ public Type getType() {
+ return mType;
+ }
+
public void uploadToTexture(int baseMipLevel) {
mRS.validate();
mRS.validateSurface();
@@ -171,9 +175,10 @@
public Adapter1D createAdapter1D() {
mRS.validate();
int id = mRS.nAdapter1DCreate();
- if (id != 0) {
- mRS.nAdapter1DBindAllocation(id, mID);
+ if(id == 0) {
+ throw new IllegalStateException("allocation failed.");
}
+ mRS.nAdapter1DBindAllocation(id, mID);
return new Adapter1D(id, mRS);
}
@@ -213,9 +218,10 @@
public Adapter2D createAdapter2D() {
mRS.validate();
int id = mRS.nAdapter2DCreate();
- if (id != 0) {
- mRS.nAdapter2DBindAllocation(id, mID);
+ if(id == 0) {
+ throw new IllegalStateException("allocation failed.");
}
+ mRS.nAdapter2DBindAllocation(id, mID);
return new Adapter2D(id, mRS);
}
@@ -258,14 +264,20 @@
rs.validate();
int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
+ if(id == 0) {
+ throw new IllegalStateException("Load failed.");
+ }
return new Allocation(id, rs, null);
}
- static public Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
+ static Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
throws IllegalArgumentException {
rs.validate();
int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b);
+ if(id == 0) {
+ throw new IllegalStateException("Load failed.");
+ }
return new Allocation(id, rs, null);
}
@@ -282,6 +294,9 @@
int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips,
asset);
+ if(allocationId == 0) {
+ throw new IllegalStateException("Load failed.");
+ }
return new Allocation(allocationId, rs, null);
} catch (Exception e) {
// Ignore
diff --git a/graphics/java/android/renderscript/BaseObj.java b/graphics/java/android/renderscript/BaseObj.java
index e802ec51..002fc78 100644
--- a/graphics/java/android/renderscript/BaseObj.java
+++ b/graphics/java/android/renderscript/BaseObj.java
@@ -25,6 +25,7 @@
class BaseObj {
BaseObj(RenderScript rs) {
+ rs.validate();
mRS = rs;
mID = 0;
mDestroyed = false;
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index ee9b098..10ef05a 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -24,248 +24,66 @@
**/
public class Element extends BaseObj {
int mSize;
- Entry[] mEntries;
+ Element[] mElements;
+ String[] mElementNames;
- int getSizeBytes() {
- return mSize;
- }
- int getComponentCount() {
- return mEntries.length;
- }
- Element.DataType getComponentDataType(int num) {
- return mEntries[num].mType;
- }
- Element.DataKind getComponentDataKind(int num) {
- return mEntries[num].mKind;
- }
- boolean getComponentIsNormalized(int num) {
- return mEntries[num].mIsNormalized;
- }
- int getComponentBits(int num) {
- return mEntries[num].mBits;
- }
- String getComponentName(int num) {
- return mEntries[num].mName;
- }
+ DataType mType;
+ DataKind mKind;
+ boolean mNormalized;
+ int mVectorSize;
- static class Entry {
- //Element mElement;
- Element.DataType mType;
- Element.DataKind mKind;
- boolean mIsNormalized;
- int mBits;
- String mName;
-
- //Entry(Element e, int bits) {
- //mElement = e;
- //int mBits = bits;
- //}
-
- Entry(DataType dt, DataKind dk, boolean isNorm, int bits, String name) {
- mType = dt;
- mKind = dk;
- mIsNormalized = isNorm;
- mBits = bits;
- mName = name;
- }
- }
-
- public static Element USER_U8(RenderScript rs) {
- if(rs.mElement_USER_U8 == null) {
- rs.mElement_USER_U8 = new Element(rs, 1);
- rs.mElement_USER_U8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 8, null);
- rs.mElement_USER_U8.init();
- }
- return rs.mElement_USER_U8;
- }
-
- public static Element USER_I8(RenderScript rs) {
- if(rs.mElement_USER_I8 == null) {
- rs.mElement_USER_I8 = new Element(rs, 1);
- rs.mElement_USER_I8.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 8, null);
- rs.mElement_USER_I8.init();
- }
- return rs.mElement_USER_I8;
- }
-
- public static Element USER_U16(RenderScript rs) {
- if(rs.mElement_USER_U16 == null) {
- rs.mElement_USER_U16 = new Element(rs, 1);
- rs.mElement_USER_U16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 16, null);
- rs.mElement_USER_U16.init();
- }
- return rs.mElement_USER_U16;
- }
-
- public static Element USER_I16(RenderScript rs) {
- if(rs.mElement_USER_I16 == null) {
- rs.mElement_USER_I16 = new Element(rs, 1);
- rs.mElement_USER_I16.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 16, null);
- rs.mElement_USER_I16.init();
- }
- return rs.mElement_USER_I16;
- }
-
- public static Element USER_U32(RenderScript rs) {
- if(rs.mElement_USER_U32 == null) {
- rs.mElement_USER_U32 = new Element(rs, 1);
- rs.mElement_USER_U32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 32, null);
- rs.mElement_USER_U32.init();
- }
- return rs.mElement_USER_U32;
- }
-
- public static Element USER_I32(RenderScript rs) {
- if(rs.mElement_USER_I32 == null) {
- rs.mElement_USER_I32 = new Element(rs, 1);
- rs.mElement_USER_I32.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 32, null);
- rs.mElement_USER_I32.init();
- }
- return rs.mElement_USER_I32;
- }
-
- public static Element USER_F32(RenderScript rs) {
- if(rs.mElement_USER_FLOAT == null) {
- rs.mElement_USER_FLOAT = new Element(rs, 1);
- rs.mElement_USER_FLOAT.mEntries[0] = new Entry(DataType.FLOAT, DataKind.USER, false, 32, null);
- rs.mElement_USER_FLOAT.init();
- }
- return rs.mElement_USER_FLOAT;
- }
-
- public static Element A_8(RenderScript rs) {
- if(rs.mElement_A_8 == null) {
- rs.mElement_A_8 = new Element(rs, 1);
- rs.mElement_A_8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a");
- rs.mElement_A_8.init();
- }
- return rs.mElement_A_8;
- }
-
- public static Element RGB_565(RenderScript rs) {
- if(rs.mElement_RGB_565 == null) {
- rs.mElement_RGB_565 = new Element(rs, 3);
- rs.mElement_RGB_565.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r");
- rs.mElement_RGB_565.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 6, "g");
- rs.mElement_RGB_565.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b");
- rs.mElement_RGB_565.init();
- }
- return rs.mElement_RGB_565;
- }
-
- public static Element RGB_888(RenderScript rs) {
- if(rs.mElement_RGB_888 == null) {
- rs.mElement_RGB_888 = new Element(rs, 3);
- rs.mElement_RGB_888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r");
- rs.mElement_RGB_888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g");
- rs.mElement_RGB_888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b");
- rs.mElement_RGB_888.init();
- }
- return rs.mElement_RGB_888;
- }
-
- public static Element RGBA_5551(RenderScript rs) {
- if(rs.mElement_RGBA_5551 == null) {
- rs.mElement_RGBA_5551 = new Element(rs, 4);
- rs.mElement_RGBA_5551.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r");
- rs.mElement_RGBA_5551.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 5, "g");
- rs.mElement_RGBA_5551.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b");
- rs.mElement_RGBA_5551.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 1, "a");
- rs.mElement_RGBA_5551.init();
- }
- return rs.mElement_RGBA_5551;
- }
-
- public static Element RGBA_4444(RenderScript rs) {
- if(rs.mElement_RGBA_4444 == null) {
- rs.mElement_RGBA_4444 = new Element(rs, 4);
- rs.mElement_RGBA_4444.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 4, "r");
- rs.mElement_RGBA_4444.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 4, "g");
- rs.mElement_RGBA_4444.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 4, "b");
- rs.mElement_RGBA_4444.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 4, "a");
- rs.mElement_RGBA_4444.init();
- }
- return rs.mElement_RGBA_4444;
- }
-
- public static Element RGBA_8888(RenderScript rs) {
- if(rs.mElement_RGBA_8888 == null) {
- rs.mElement_RGBA_8888 = new Element(rs, 4);
- rs.mElement_RGBA_8888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r");
- rs.mElement_RGBA_8888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g");
- rs.mElement_RGBA_8888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b");
- rs.mElement_RGBA_8888.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a");
- rs.mElement_RGBA_8888.init();
- }
- return rs.mElement_RGBA_8888;
- }
-
- public static Element INDEX_16(RenderScript rs) {
- if(rs.mElement_INDEX_16 == null) {
- rs.mElement_INDEX_16 = new Element(rs, 1);
- rs.mElement_INDEX_16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.INDEX, false, 16, "index");
- rs.mElement_INDEX_16.init();
- }
- return rs.mElement_INDEX_16;
- }
-
- public static Element XY_F32(RenderScript rs) {
- if(rs.mElement_XY_F32 == null) {
- rs.mElement_XY_F32 = new Element(rs, 2);
- rs.mElement_XY_F32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.X, false, 32, "x");
- rs.mElement_XY_F32.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.Y, false, 32, "y");
- rs.mElement_XY_F32.init();
- }
- return rs.mElement_XY_F32;
- }
-
- public static Element XYZ_F32(RenderScript rs) {
- if(rs.mElement_XYZ_F32 == null) {
- rs.mElement_XYZ_F32 = new Element(rs, 3);
- rs.mElement_XYZ_F32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.X, false, 32, "x");
- rs.mElement_XYZ_F32.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.Y, false, 32, "y");
- rs.mElement_XYZ_F32.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.Z, false, 32, "z");
- rs.mElement_XYZ_F32.init();
- }
- return rs.mElement_XYZ_F32;
- }
-
- static void initPredefined(RenderScript rs) {
- rs.nInitElements(A_8(rs).mID, RGBA_4444(rs).mID, RGBA_8888(rs).mID, RGB_565(rs).mID);
- }
+ int getSizeBytes() {return mSize;}
public enum DataType {
- FLOAT (0),
- UNSIGNED (1),
- SIGNED (2);
+ //FLOAT_16 (1, 2),
+ FLOAT_32 (2, 4),
+ //FLOAT_64 (3, 8),
+ SIGNED_8 (4, 1),
+ SIGNED_16 (5, 2),
+ SIGNED_32 (6, 4),
+ //SIGNED_64 (7, 8),
+ UNSIGNED_8 (8, 1),
+ UNSIGNED_16 (9, 2),
+ UNSIGNED_32 (10, 4),
+ //UNSIGNED_64 (11, 8),
+
+ UNSIGNED_5_6_5 (12, 2),
+ UNSIGNED_5_5_5_1 (13, 2),
+ UNSIGNED_4_4_4_4 (14, 2),
+
+ RS_ELEMENT (15, 4),
+ RS_TYPE (16, 4),
+ RS_ALLOCATION (17, 4),
+ RS_SAMPLER (18, 4),
+ RS_SCRIPT (19, 4),
+ RS_MESH (20, 4),
+ RS_PROGRAM_FRAGMENT (21, 4),
+ RS_PROGRAM_VERTEX (22, 4),
+ RS_PROGRAM_RASTER (23, 4),
+ RS_PROGRAM_STORE (24, 4);
int mID;
- DataType(int id) {
+ int mSize;
+ DataType(int id, int size) {
mID = id;
+ mSize = size;
}
}
public enum DataKind {
USER (0),
- RED (1),
- GREEN (2),
- BLUE (3),
- ALPHA (4),
- LUMINANCE (5),
- INTENSITY (6),
- X (7),
- Y (8),
- Z (9),
- W (10),
- S (11),
- T (12),
- Q (13),
- R (14),
- NX (15),
- NY (16),
- NZ (17),
- INDEX (18),
- POINT_SIZE(19);
+ COLOR (1),
+ POSITION (2),
+ TEXTURE (3),
+ NORMAL (4),
+ INDEX (5),
+ POINT_SIZE(6),
+
+ PIXEL_L (7),
+ PIXEL_A (8),
+ PIXEL_LA (9),
+ PIXEL_RGB (10),
+ PIXEL_RGBA (11);
int mID;
DataKind(int id) {
@@ -273,10 +91,153 @@
}
}
- Element(RenderScript rs, int count) {
+ public static Element USER_U8(RenderScript rs) {
+ if(rs.mElement_USER_U8 == null) {
+ rs.mElement_USER_U8 = createUser(rs, DataType.UNSIGNED_8);
+ }
+ return rs.mElement_USER_U8;
+ }
+
+ public static Element USER_I8(RenderScript rs) {
+ if(rs.mElement_USER_I8 == null) {
+ rs.mElement_USER_I8 = createUser(rs, DataType.SIGNED_8);
+ }
+ return rs.mElement_USER_I8;
+ }
+
+ public static Element USER_U32(RenderScript rs) {
+ if(rs.mElement_USER_U32 == null) {
+ rs.mElement_USER_U32 = createUser(rs, DataType.UNSIGNED_32);
+ }
+ return rs.mElement_USER_U32;
+ }
+
+ public static Element USER_I32(RenderScript rs) {
+ if(rs.mElement_USER_I32 == null) {
+ rs.mElement_USER_I32 = createUser(rs, DataType.SIGNED_32);
+ }
+ return rs.mElement_USER_I32;
+ }
+
+ public static Element USER_F32(RenderScript rs) {
+ if(rs.mElement_USER_F32 == null) {
+ rs.mElement_USER_F32 = createUser(rs, DataType.FLOAT_32);
+ }
+ return rs.mElement_USER_F32;
+ }
+
+ public static Element A_8(RenderScript rs) {
+ if(rs.mElement_A_8 == null) {
+ rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
+ }
+ return rs.mElement_A_8;
+ }
+
+ public static Element RGB_565(RenderScript rs) {
+ if(rs.mElement_RGB_565 == null) {
+ rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
+ }
+ return rs.mElement_RGB_565;
+ }
+
+ public static Element RGB_888(RenderScript rs) {
+ if(rs.mElement_RGB_888 == null) {
+ rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
+ }
+ return rs.mElement_RGB_888;
+ }
+
+ public static Element RGBA_5551(RenderScript rs) {
+ if(rs.mElement_RGBA_5551 == null) {
+ rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
+ }
+ return rs.mElement_RGBA_5551;
+ }
+
+ public static Element RGBA_4444(RenderScript rs) {
+ if(rs.mElement_RGBA_4444 == null) {
+ rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
+ }
+ return rs.mElement_RGBA_4444;
+ }
+
+ public static Element RGBA_8888(RenderScript rs) {
+ if(rs.mElement_RGBA_8888 == null) {
+ rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
+ }
+ return rs.mElement_RGBA_8888;
+ }
+
+ public static Element INDEX_16(RenderScript rs) {
+ if(rs.mElement_INDEX_16 == null) {
+ rs.mElement_INDEX_16 = createIndex(rs);
+ }
+ return rs.mElement_INDEX_16;
+ }
+
+ public static Element ATTRIB_POSITION_2(RenderScript rs) {
+ if(rs.mElement_POSITION_2 == null) {
+ rs.mElement_POSITION_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 2);
+ }
+ return rs.mElement_POSITION_2;
+ }
+
+ public static Element ATTRIB_POSITION_3(RenderScript rs) {
+ if(rs.mElement_POSITION_3 == null) {
+ rs.mElement_POSITION_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.POSITION, 3);
+ }
+ return rs.mElement_POSITION_3;
+ }
+
+ public static Element ATTRIB_TEXTURE_2(RenderScript rs) {
+ if(rs.mElement_TEXTURE_2 == null) {
+ rs.mElement_TEXTURE_2 = createAttrib(rs, DataType.FLOAT_32, DataKind.TEXTURE, 2);
+ }
+ return rs.mElement_TEXTURE_2;
+ }
+
+ public static Element ATTRIB_NORMAL_3(RenderScript rs) {
+ if(rs.mElement_NORMAL_3 == null) {
+ rs.mElement_NORMAL_3 = createAttrib(rs, DataType.FLOAT_32, DataKind.NORMAL, 3);
+ }
+ return rs.mElement_NORMAL_3;
+ }
+
+ public static Element ATTRIB_COLOR_U8_4(RenderScript rs) {
+ if(rs.mElement_COLOR_U8_4 == null) {
+ rs.mElement_COLOR_U8_4 = createAttrib(rs, DataType.UNSIGNED_8, DataKind.COLOR, 4);
+ }
+ return rs.mElement_COLOR_U8_4;
+ }
+
+ public static Element ATTRIB_COLOR_F32_4(RenderScript rs) {
+ if(rs.mElement_COLOR_F32_4 == null) {
+ rs.mElement_COLOR_F32_4 = createAttrib(rs, DataType.FLOAT_32, DataKind.COLOR, 4);
+ }
+ return rs.mElement_COLOR_F32_4;
+ }
+
+ Element(RenderScript rs, Element[] e, String[] n) {
super(rs);
mSize = 0;
- mEntries = new Entry[count];
+ mElements = e;
+ mElementNames = n;
+ int[] ids = new int[mElements.length];
+ for (int ct = 0; ct < mElements.length; ct++ ) {
+ mSize += mElements[ct].mSize;
+ ids[ct] = mElements[ct].mID;
+ }
+ mID = rs.nElementCreate2(ids, mElementNames);
+ }
+
+ Element(RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
+ super(rs);
+ mSize = dt.mSize * size;
+ mType = dt;
+ mKind = dk;
+ mNormalized = norm;
+ mVectorSize = size;
+ mID = rs.nElementCreate(dt.mID, dk.mID, norm, size);
}
public void destroy() throws IllegalStateException {
@@ -291,13 +252,13 @@
for(Field f: fields) {
Class fc = f.getType();
if(fc == int.class) {
- b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 32, f.getName());
+ b.add(createUser(rs, DataType.SIGNED_32), f.getName());
} else if(fc == short.class) {
- b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 16, f.getName());
+ b.add(createUser(rs, DataType.SIGNED_16), f.getName());
} else if(fc == byte.class) {
- b.add(Element.DataType.SIGNED, Element.DataKind.USER, false, 8, f.getName());
+ b.add(createUser(rs, DataType.SIGNED_8), f.getName());
} else if(fc == float.class) {
- b.add(Element.DataType.FLOAT, Element.DataKind.USER, false, 32, f.getName());
+ b.add(createUser(rs, DataType.FLOAT_32), f.getName());
} else {
throw new IllegalArgumentException("Unkown field type");
}
@@ -305,193 +266,157 @@
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
- {
- rs.nElementAdd(en.mKind.mID, en.mType.mID, en.mIsNormalized, en.mBits, en.mName);
- bits += en.mBits;
- }
+
+ /////////////////////////////////////////
+ public static Element createUser(RenderScript rs, DataType dt) {
+ return new Element(rs, dt, DataKind.USER, false, 1);
+ }
+
+ public static Element createVector(RenderScript rs, DataType dt, int size) {
+ if (size < 2 || size > 4) {
+ throw new IllegalArgumentException("Bad size");
}
- e.mID = rs.nElementCreate();
- e.mSize = (bits + 7) >> 3;
+ return new Element(rs, dt, DataKind.USER, false, size);
}
- void init() {
- mRS.validate();
- internalCreate(mRS, this);
+ public static Element createIndex(RenderScript rs) {
+ return new Element(rs, DataType.UNSIGNED_16, DataKind.INDEX, false, 1);
}
+ public static Element createAttrib(RenderScript rs, DataType dt, DataKind dk, int size) {
+ if (!(dt == DataType.FLOAT_32 ||
+ dt == DataType.UNSIGNED_8 ||
+ dt == DataType.UNSIGNED_16 ||
+ dt == DataType.UNSIGNED_32 ||
+ dt == DataType.SIGNED_8 ||
+ dt == DataType.SIGNED_16 ||
+ dt == DataType.SIGNED_32)) {
+ throw new IllegalArgumentException("Unsupported DataType");
+ }
+
+ if (!(dk == DataKind.COLOR ||
+ dk == DataKind.POSITION ||
+ dk == DataKind.TEXTURE ||
+ dk == DataKind.NORMAL ||
+ dk == DataKind.POINT_SIZE ||
+ dk == DataKind.USER)) {
+ throw new IllegalArgumentException("Unsupported DataKind");
+ }
+
+ if (dk == DataKind.COLOR &&
+ ((dt != DataType.FLOAT_32 && dt != DataType.UNSIGNED_8) ||
+ size < 3 || size > 4)) {
+ throw new IllegalArgumentException("Bad combo");
+ }
+ if (dk == DataKind.POSITION && (size < 1 || size > 4)) {
+ throw new IllegalArgumentException("Bad combo");
+ }
+ if (dk == DataKind.TEXTURE &&
+ (dt != DataType.FLOAT_32 || size < 1 || size > 4)) {
+ throw new IllegalArgumentException("Bad combo");
+ }
+ if (dk == DataKind.NORMAL &&
+ (dt != DataType.FLOAT_32 || size != 3)) {
+ throw new IllegalArgumentException("Bad combo");
+ }
+ if (dk == DataKind.POINT_SIZE &&
+ (dt != DataType.FLOAT_32 || size != 1)) {
+ throw new IllegalArgumentException("Bad combo");
+ }
+
+ boolean norm = false;
+ if (dk == DataKind.COLOR && dt == DataType.UNSIGNED_8) {
+ norm = true;
+ }
+
+ return new Element(rs, dt, dk, norm, size);
+ }
+
+ public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
+ if (!(dk == DataKind.PIXEL_L ||
+ dk == DataKind.PIXEL_A ||
+ dk == DataKind.PIXEL_LA ||
+ dk == DataKind.PIXEL_RGB ||
+ dk == DataKind.PIXEL_RGBA)) {
+ throw new IllegalArgumentException("Unsupported DataKind");
+ }
+ if (!(dt == DataType.UNSIGNED_8 ||
+ dt == DataType.UNSIGNED_5_6_5 ||
+ dt == DataType.UNSIGNED_4_4_4_4 ||
+ dt == DataType.UNSIGNED_5_5_5_1)) {
+ throw new IllegalArgumentException("Unsupported DataType");
+ }
+ if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
+ throw new IllegalArgumentException("Bad kind and type combo");
+ }
+ if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
+ throw new IllegalArgumentException("Bad kind and type combo");
+ }
+ if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
+ throw new IllegalArgumentException("Bad kind and type combo");
+ }
+
+ int size = 1;
+ if (dk == DataKind.PIXEL_LA) {
+ size = 2;
+ }
+ if (dk == DataKind.PIXEL_RGB) {
+ size = 3;
+ }
+ if (dk == DataKind.PIXEL_RGBA) {
+ size = 4;
+ }
+
+ return new Element(rs, dt, dk, true, size);
+ }
public static class Builder {
RenderScript mRS;
- Entry[] mEntries;
- int mEntryCount;
+ Element[] mElements;
+ String[] mElementNames;
+ int mCount;
public Builder(RenderScript rs) {
mRS = rs;
- mEntryCount = 0;
- mEntries = new Entry[8];
+ mCount = 0;
+ mElements = new Element[8];
+ mElementNames = new String[8];
}
- void addEntry(Entry e) {
- if(mEntries.length >= mEntryCount) {
- Entry[] en = new Entry[mEntryCount + 8];
- System.arraycopy(mEntries, 0, en, 0, mEntries.length);
- mEntries = en;
+ public void add(Element element, String name) {
+ if(mCount == mElements.length) {
+ Element[] e = new Element[mCount + 8];
+ String[] s = new String[mCount + 8];
+ System.arraycopy(mElements, 0, e, 0, mCount);
+ System.arraycopy(mElementNames, 0, s, 0, mCount);
+ mElements = e;
+ mElementNames = s;
}
- mEntries[mEntryCount] = e;
- mEntryCount++;
- }
-
- //public Builder add(Element e) throws IllegalArgumentException {
- //Entry en = new Entry(e, e.mSize * 8);
- //addEntry(en);
- //return this;
- //}
-
- public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits, String name) {
- Entry en = new Entry(dt, dk, isNormalized, bits, name);
- addEntry(en);
- return this;
- }
-
- public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits) {
- add(dt, dk, isNormalized, bits, null);
- return this;
- }
-
- public Builder addFloat(Element.DataKind dk) {
- add(DataType.FLOAT, dk, false, 32, null);
- return this;
- }
-
- public Builder addFloat(Element.DataKind dk, String name) {
- add(DataType.FLOAT, dk, false, 32, name);
- return this;
- }
-
- public Builder addFloatXY() {
- add(DataType.FLOAT, DataKind.X, false, 32, null);
- add(DataType.FLOAT, DataKind.Y, false, 32, null);
- return this;
- }
-
- public Builder addFloatXY(String prefix) {
- add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x");
- add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y");
- return this;
- }
-
- public Builder addFloatXYZ() {
- add(DataType.FLOAT, DataKind.X, false, 32, null);
- add(DataType.FLOAT, DataKind.Y, false, 32, null);
- add(DataType.FLOAT, DataKind.Z, false, 32, null);
- return this;
- }
-
- 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");
- return this;
- }
-
- public Builder addFloatST() {
- add(DataType.FLOAT, DataKind.S, false, 32, null);
- add(DataType.FLOAT, DataKind.T, false, 32, null);
- return this;
- }
-
- public Builder addFloatST(String prefix) {
- add(DataType.FLOAT, DataKind.S, false, 32, prefix + "s");
- add(DataType.FLOAT, DataKind.T, false, 32, prefix + "t");
- return this;
- }
-
- public Builder addFloatNorm() {
- add(DataType.FLOAT, DataKind.NX, false, 32, null);
- add(DataType.FLOAT, DataKind.NY, false, 32, null);
- add(DataType.FLOAT, DataKind.NZ, false, 32, null);
- return this;
- }
-
- 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");
- return this;
- }
-
- public Builder addFloatPointSize() {
- add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, null);
- return this;
- }
-
- public Builder addFloatPointSize(String prefix) {
- add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, prefix + "pointSize");
- return this;
- }
-
- public Builder addFloatRGB() {
- add(DataType.FLOAT, DataKind.RED, false, 32, null);
- add(DataType.FLOAT, DataKind.GREEN, false, 32, null);
- add(DataType.FLOAT, DataKind.BLUE, false, 32, null);
- return this;
- }
-
- 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");
- return this;
- }
-
- public Builder addFloatRGBA() {
- add(DataType.FLOAT, DataKind.RED, false, 32, null);
- add(DataType.FLOAT, DataKind.GREEN, false, 32, null);
- add(DataType.FLOAT, DataKind.BLUE, false, 32, null);
- add(DataType.FLOAT, DataKind.ALPHA, false, 32, null);
- return this;
- }
-
- 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");
- return this;
- }
-
- public Builder addUNorm8RGBA() {
- add(DataType.UNSIGNED, DataKind.RED, true, 8, null);
- add(DataType.UNSIGNED, DataKind.GREEN, true, 8, null);
- add(DataType.UNSIGNED, DataKind.BLUE, true, 8, null);
- add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, null);
- return this;
- }
-
- 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");
- return this;
+ mElements[mCount] = element;
+ mElementNames[mCount] = name;
+ mCount++;
}
public Element create() {
mRS.validate();
- Element e = new Element(mRS, mEntryCount);
- java.lang.System.arraycopy(mEntries, 0, e.mEntries, 0, mEntryCount);
- e.init();
- return e;
+ Element[] ein = new Element[mCount];
+ String[] sin = new String[mCount];
+ java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
+ java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
+ return new Element(mRS, ein, sin);
}
}
+ static void initPredefined(RenderScript rs) {
+ int a8 = rs.nElementCreate(DataType.UNSIGNED_8.mID,
+ DataKind.PIXEL_A.mID, true, 1);
+ int rgba4444 = rs.nElementCreate(DataType.UNSIGNED_4_4_4_4.mID,
+ DataKind.PIXEL_RGBA.mID, true, 4);
+ int rgba8888 = rs.nElementCreate(DataType.UNSIGNED_8.mID,
+ DataKind.PIXEL_RGBA.mID, true, 4);
+ int rgb565 = rs.nElementCreate(DataType.UNSIGNED_5_6_5.mID,
+ DataKind.PIXEL_RGB.mID, true, 3);
+ rs.nInitElements(a8, rgba4444, rgba8888, rgb565);
+ }
}
diff --git a/graphics/java/android/renderscript/Program.java b/graphics/java/android/renderscript/Program.java
new file mode 100644
index 0000000..1614ec5
--- /dev/null
+++ b/graphics/java/android/renderscript/Program.java
@@ -0,0 +1,144 @@
+/*
+ * 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 android.renderscript;
+
+
+import android.util.Config;
+import android.util.Log;
+
+
+/**
+ * @hide
+ *
+ **/
+public class Program extends BaseObj {
+ public static final int MAX_INPUT = 8;
+ public static final int MAX_OUTPUT = 8;
+ public static final int MAX_CONSTANT = 8;
+ public static final int MAX_TEXTURE = 8;
+
+ Element mInputs[];
+ Element mOutputs[];
+ Type mConstants[];
+ int mTextureCount;
+ String mShader;
+
+ Program(int id, RenderScript rs) {
+ super(rs);
+ mID = id;
+ }
+
+ public void bindConstants(Allocation a, int slot) {
+ mRS.nProgramBindConstants(mID, slot, a.mID);
+ }
+
+ public void bindTexture(Allocation va, int slot)
+ throws IllegalArgumentException {
+ mRS.validate();
+ if((slot < 0) || (slot >= mTextureCount)) {
+ throw new IllegalArgumentException("Slot ID out of range.");
+ }
+
+ mRS.nProgramBindTexture(mID, slot, va.mID);
+ }
+
+ public void bindSampler(Sampler vs, int slot)
+ throws IllegalArgumentException {
+ mRS.validate();
+ if((slot < 0) || (slot >= mTextureCount)) {
+ throw new IllegalArgumentException("Slot ID out of range.");
+ }
+
+ mRS.nProgramBindSampler(mID, slot, vs.mID);
+ }
+
+
+ public static class BaseProgramBuilder {
+ RenderScript mRS;
+ Element mInputs[];
+ Element mOutputs[];
+ Type mConstants[];
+ Type mTextures[];
+ int mInputCount;
+ int mOutputCount;
+ int mConstantCount;
+ int mTextureCount;
+ String mShader;
+
+
+ protected BaseProgramBuilder(RenderScript rs) {
+ mRS = rs;
+ mInputs = new Element[MAX_INPUT];
+ mOutputs = new Element[MAX_OUTPUT];
+ mConstants = new Type[MAX_CONSTANT];
+ mInputCount = 0;
+ mOutputCount = 0;
+ mConstantCount = 0;
+ mTextureCount = 0;
+ }
+
+ public void setShader(String s) {
+ mShader = s;
+ }
+
+ public void addInput(Element e) throws IllegalStateException {
+ // Should check for consistant and non-conflicting names...
+ if(mInputCount >= MAX_INPUT) {
+ throw new IllegalArgumentException("Max input count exceeded.");
+ }
+ mInputs[mInputCount++] = e;
+ }
+
+ public void addOutput(Element e) throws IllegalStateException {
+ // Should check for consistant and non-conflicting names...
+ if(mOutputCount >= MAX_OUTPUT) {
+ throw new IllegalArgumentException("Max output count exceeded.");
+ }
+ mOutputs[mOutputCount++] = e;
+ }
+
+ public int addConstant(Type t) throws IllegalStateException {
+ // Should check for consistant and non-conflicting names...
+ if(mConstantCount >= MAX_CONSTANT) {
+ throw new IllegalArgumentException("Max input count exceeded.");
+ }
+ mConstants[mConstantCount] = t;
+ return mConstantCount++;
+ }
+
+ public void setTextureCount(int count) throws IllegalArgumentException {
+ // Should check for consistant and non-conflicting names...
+ if(count >= MAX_CONSTANT) {
+ throw new IllegalArgumentException("Max texture count exceeded.");
+ }
+ mTextureCount = count;
+ }
+
+ protected void initProgram(Program p) {
+ p.mInputs = new Element[mInputCount];
+ System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount);
+ p.mOutputs = new Element[mOutputCount];
+ System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
+ p.mConstants = new Type[mConstantCount];
+ System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
+ p.mTextureCount = mTextureCount;
+ }
+ }
+
+}
+
+
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 1a72578..5e04f0c 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -25,134 +25,115 @@
* @hide
*
**/
-public class ProgramFragment extends BaseObj {
- public static final int MAX_SLOT = 2;
-
- public enum EnvMode {
- REPLACE (0),
- MODULATE (1),
- DECAL (2);
-
- int mID;
- EnvMode(int id) {
- mID = id;
- }
- }
-
-
+public class ProgramFragment extends Program {
ProgramFragment(int id, RenderScript rs) {
- super(rs);
- mID = id;
+ super(id, rs);
}
- public void bindTexture(Allocation va, int slot)
- throws IllegalArgumentException {
- mRS.validate();
- if((slot < 0) || (slot >= MAX_SLOT)) {
- throw new IllegalArgumentException("Slot ID out of range.");
+ public static class ShaderBuilder extends BaseProgramBuilder {
+ public ShaderBuilder(RenderScript rs) {
+ super(rs);
}
- mRS.nProgramFragmentBindTexture(mID, slot, va.mID);
- }
+ public ProgramFragment create() {
+ mRS.validate();
+ int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2];
+ int idx = 0;
- public void bindSampler(Sampler vs, int slot)
- throws IllegalArgumentException {
- mRS.validate();
- if((slot < 0) || (slot >= MAX_SLOT)) {
- throw new IllegalArgumentException("Slot ID out of range.");
+ for (int i=0; i < mInputCount; i++) {
+ tmp[idx++] = 0;
+ tmp[idx++] = mInputs[i].mID;
+ }
+ for (int i=0; i < mOutputCount; i++) {
+ tmp[idx++] = 1;
+ tmp[idx++] = mOutputs[i].mID;
+ }
+ for (int i=0; i < mConstantCount; i++) {
+ tmp[idx++] = 2;
+ tmp[idx++] = mConstants[i].mID;
+ }
+ tmp[idx++] = 3;
+ tmp[idx++] = mTextureCount;
+
+ int id = mRS.nProgramFragmentCreate2(mShader, tmp);
+ ProgramFragment pf = new ProgramFragment(id, mRS);
+ initProgram(pf);
+ return pf;
}
-
- mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
}
-
public static class Builder {
+ public static final int MAX_TEXTURE = 2;
RenderScript mRS;
- Element mIn;
- Element mOut;
boolean mPointSpriteEnable;
- private class Slot {
- Type mType;
- EnvMode mEnv;
- boolean mTexEnable;
+ public enum EnvMode {
+ REPLACE (1),
+ MODULATE (2),
+ DECAL (3);
- Slot() {
- mTexEnable = false;
+ int mID;
+ EnvMode(int id) {
+ mID = id;
+ }
+ }
+
+ public enum Format {
+ ALPHA (1),
+ LUMINANCE_ALPHA (2),
+ RGB (3),
+ RGBA (4);
+
+ int mID;
+ Format(int id) {
+ mID = id;
+ }
+ }
+
+ private class Slot {
+ EnvMode env;
+ Format format;
+ Slot(EnvMode _env, Format _fmt) {
+ env = _env;
+ format = _fmt;
}
}
Slot[] mSlots;
- public Builder(RenderScript rs, Element in, Element out) {
+ public Builder(RenderScript rs) {
mRS = rs;
- mIn = in;
- mOut = out;
- mSlots = new Slot[MAX_SLOT];
+ mSlots = new Slot[MAX_TEXTURE];
mPointSpriteEnable = false;
- for(int ct=0; ct < MAX_SLOT; ct++) {
- mSlots[ct] = new Slot();
- }
}
- public void setType(int slot, Type t)
+ public void setTexture(EnvMode env, Format fmt, int slot)
throws IllegalArgumentException {
- if((slot < 0) || (slot >= MAX_SLOT)) {
- throw new IllegalArgumentException("Slot ID out of range.");
+ if((slot < 0) || (slot >= MAX_TEXTURE)) {
+ throw new IllegalArgumentException("MAX_TEXTURE exceeded.");
}
-
- mSlots[slot].mType = t;
- }
-
- public void setTexEnable(boolean enable, int slot)
- throws IllegalArgumentException {
- if((slot < 0) || (slot >= MAX_SLOT)) {
- throw new IllegalArgumentException("Slot ID out of range.");
- }
-
- mSlots[slot].mTexEnable = enable;
- }
-
- public void setTexEnvMode(EnvMode env, int slot)
- throws IllegalArgumentException {
- if((slot < 0) || (slot >= MAX_SLOT)) {
- throw new IllegalArgumentException("Slot ID out of range.");
- }
-
- mSlots[slot].mEnv = env;
+ mSlots[slot] = new Slot(env, fmt);
}
public void setPointSpriteTexCoordinateReplacement(boolean enable) {
mPointSpriteEnable = enable;
}
- static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) {
- int inID = 0;
- int outID = 0;
- if (b.mIn != null) {
- inID = b.mIn.mID;
- }
- if (b.mOut != null) {
- outID = b.mOut.mID;
- }
- rs.nProgramFragmentBegin(inID, outID, b.mPointSpriteEnable);
- for(int ct=0; ct < MAX_SLOT; ct++) {
- if(b.mSlots[ct].mTexEnable) {
- Slot s = b.mSlots[ct];
- int typeID = 0;
- if(s.mType != null) {
- typeID = s.mType.mID;
- }
- rs.nProgramFragmentSetSlot(ct, true, s.mEnv.mID, typeID);
- }
- }
-
- int id = rs.nProgramFragmentCreate();
- return new ProgramFragment(id, rs);
- }
-
public ProgramFragment create() {
mRS.validate();
- return internalCreate(mRS, this);
+ int[] tmp = new int[MAX_TEXTURE * 2 + 1];
+ if (mSlots[0] != null) {
+ tmp[0] = mSlots[0].env.mID;
+ tmp[1] = mSlots[0].format.mID;
+ }
+ if (mSlots[1] != null) {
+ tmp[2] = mSlots[1].env.mID;
+ tmp[3] = mSlots[1].format.mID;
+ }
+ tmp[4] = mPointSpriteEnable ? 1 : 0;
+ int id = mRS.nProgramFragmentCreate(tmp);
+ ProgramFragment pf = new ProgramFragment(id, mRS);
+ pf.mTextureCount = MAX_TEXTURE;
+ return pf;
}
}
}
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index ba97d5b..84f6f2d 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -25,72 +25,67 @@
* @hide
*
**/
-public class ProgramVertex extends BaseObj {
+public class ProgramVertex extends Program {
public static final int MAX_LIGHT = 8;
+
ProgramVertex(int id, RenderScript rs) {
- super(rs);
- mID = id;
+ super(id, rs);
}
public void bindAllocation(MatrixAllocation va) {
mRS.validate();
- mRS.nProgramVertexBindAllocation(mID, va.mAlloc.mID);
+ bindConstants(va.mAlloc, 0);
}
public static class Builder {
RenderScript mRS;
- Element mIn;
- Element mOut;
- Light[] mLights;
- int mLightCount;
boolean mTextureMatrixEnable;
-
public Builder(RenderScript rs, Element in, Element out) {
mRS = rs;
- mIn = in;
- mOut = out;
- mLights = new Light[MAX_LIGHT];
- mLightCount = 0;
}
public void setTextureMatrixEnable(boolean enable) {
mTextureMatrixEnable = enable;
}
- public void addLight(Light l) throws IllegalStateException {
- if(mLightCount >= MAX_LIGHT) {
- throw new IllegalArgumentException("Max light count exceeded.");
- }
- mLights[mLightCount] = l;
- mLightCount++;
+ public ProgramVertex create() {
+ int id = mRS.nProgramVertexCreate(mTextureMatrixEnable);
+ return new ProgramVertex(id, mRS);
}
+ }
-
-
- static synchronized ProgramVertex internalCreate(RenderScript rs, Builder b) {
- int inID = 0;
- int outID = 0;
- if (b.mIn != null) {
- inID = b.mIn.mID;
- }
- if (b.mOut != null) {
- outID = b.mOut.mID;
- }
- rs.nProgramVertexBegin(inID, outID);
- for(int ct=0; ct < b.mLightCount; ct++) {
- rs.nProgramVertexAddLight(b.mLights[ct].mID);
- }
- rs.nProgramVertexSetTextureMatrixEnable(b.mTextureMatrixEnable);
- int id = rs.nProgramVertexCreate();
- return new ProgramVertex(id, rs);
+ public static class ShaderBuilder extends BaseProgramBuilder {
+ public ShaderBuilder(RenderScript rs) {
+ super(rs);
}
public ProgramVertex create() {
mRS.validate();
- return internalCreate(mRS, this);
+ int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount +1) * 2];
+ int idx = 0;
+
+ for (int i=0; i < mInputCount; i++) {
+ tmp[idx++] = 0;
+ tmp[idx++] = mInputs[i].mID;
+ }
+ for (int i=0; i < mOutputCount; i++) {
+ tmp[idx++] = 1;
+ tmp[idx++] = mOutputs[i].mID;
+ }
+ for (int i=0; i < mConstantCount; i++) {
+ tmp[idx++] = 2;
+ tmp[idx++] = mConstants[i].mID;
+ }
+ tmp[idx++] = 3;
+ tmp[idx++] = mTextureCount;
+
+ int id = mRS.nProgramVertexCreate2(mShader, tmp);
+ ProgramVertex pv = new ProgramVertex(id, mRS);
+ initProgram(pv);
+ return pv;
}
}
@@ -112,7 +107,7 @@
mProjection = new Matrix();
mTexture = new Matrix();
- mAlloc = Allocation.createSized(rs, Element.USER_F32(rs), 48);
+ mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48);
mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 0d8b675..b558de0 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -76,8 +76,6 @@
native void nContextBindProgramFragment(int pf);
native void nContextBindProgramVertex(int pf);
native void nContextBindProgramRaster(int pr);
- native void nContextAddDefineI32(String name, int value);
- native void nContextAddDefineF(String name, float value);
native void nContextPause();
native void nContextResume();
native int nContextGetMessage(int[] data, boolean wait);
@@ -89,9 +87,9 @@
native void nObjDestroyOOB(int id);
native int nFileOpen(byte[] name);
- native void nElementBegin();
- native void nElementAdd(int kind, int type, boolean norm, int bits, String s);
- native int nElementCreate();
+
+ native int nElementCreate(int type, int kind, boolean norm, int vecSize);
+ native int nElementCreate2(int[] elements, String[] names);
native void nTypeBegin(int elementID);
native void nTypeAdd(int dim, int val);
@@ -167,17 +165,15 @@
native void nProgramRasterSetLineWidth(int pr, float v);
native void nProgramRasterSetPointSize(int pr, float v);
- native void nProgramFragmentBegin(int in, int out, boolean pointSpriteEnable);
- native void nProgramFragmentBindTexture(int vpf, int slot, int a);
- native void nProgramFragmentBindSampler(int vpf, int slot, int s);
- native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
- native int nProgramFragmentCreate();
+ native void nProgramBindConstants(int pv, int slot, int mID);
+ native void nProgramBindTexture(int vpf, int slot, int a);
+ native void nProgramBindSampler(int vpf, int slot, int s);
- native void nProgramVertexBindAllocation(int pv, int mID);
- native void nProgramVertexBegin(int inID, int outID);
- native void nProgramVertexSetTextureMatrixEnable(boolean enable);
- native void nProgramVertexAddLight(int id);
- native int nProgramVertexCreate();
+ native int nProgramFragmentCreate(int[] params);
+ native int nProgramFragmentCreate2(String shader, int[] params);
+
+ native int nProgramVertexCreate(boolean texMat);
+ native int nProgramVertexCreate2(String shader, int[] params);
native void nLightBegin();
native void nLightSetIsMono(boolean isMono);
@@ -200,14 +196,13 @@
private Surface mSurface;
private MessageThread mMessageThread;
-
Element mElement_USER_U8;
Element mElement_USER_I8;
Element mElement_USER_U16;
Element mElement_USER_I16;
Element mElement_USER_U32;
Element mElement_USER_I32;
- Element mElement_USER_FLOAT;
+ Element mElement_USER_F32;
Element mElement_A_8;
Element mElement_RGB_565;
@@ -217,9 +212,12 @@
Element mElement_RGBA_8888;
Element mElement_INDEX_16;
- Element mElement_XY_F32;
- Element mElement_XYZ_F32;
-
+ Element mElement_POSITION_2;
+ Element mElement_POSITION_3;
+ Element mElement_TEXTURE_2;
+ Element mElement_NORMAL_3;
+ Element mElement_COLOR_U8_4;
+ Element mElement_COLOR_F32_4;
///////////////////////////////////////////////////////////////////////////////////
//
@@ -249,9 +247,9 @@
}
void validateSurface() {
- if (mSurface == null) {
- throw new IllegalStateException("Uploading data to GL with no surface.");
- }
+ //if (mSurface == null) {
+ //throw new IllegalStateException("Uploading data to GL with no surface.");
+ //}
}
public void contextSetPriority(Priority p) {
@@ -305,9 +303,9 @@
nDeviceSetConfig(mDev, 0, 1);
}
mContext = nContextCreate(mDev, 0, useDepth);
- Element.initPredefined(this);
mMessageThread = new MessageThread(this);
mMessageThread.start();
+ Element.initPredefined(this);
}
public void contextSetSurface(int w, int h, Surface sur) {
diff --git a/graphics/java/android/renderscript/Sampler.java b/graphics/java/android/renderscript/Sampler.java
index 625a576..40ba722 100644
--- a/graphics/java/android/renderscript/Sampler.java
+++ b/graphics/java/android/renderscript/Sampler.java
@@ -69,23 +69,45 @@
}
public void setMin(Value v) {
- mMin = v;
+ if (v == Value.NEAREST ||
+ v == Value.LINEAR ||
+ v == Value.LINEAR_MIP_LINEAR) {
+ mMin = v;
+ } else {
+ throw new IllegalArgumentException("Invalid value");
+ }
}
public void setMag(Value v) {
- mMag = v;
+ if (v == Value.NEAREST || v == Value.LINEAR) {
+ mMag = v;
+ } else {
+ throw new IllegalArgumentException("Invalid value");
+ }
}
public void setWrapS(Value v) {
- mWrapS = v;
+ if (v == Value.WRAP || v == Value.CLAMP) {
+ mWrapS = v;
+ } else {
+ throw new IllegalArgumentException("Invalid value");
+ }
}
public void setWrapT(Value v) {
- mWrapT = v;
+ if (v == Value.WRAP || v == Value.CLAMP) {
+ mWrapT = v;
+ } else {
+ throw new IllegalArgumentException("Invalid value");
+ }
}
public void setWrapR(Value v) {
- mWrapR = v;
+ if (v == Value.WRAP || v == Value.CLAMP) {
+ mWrapR = v;
+ } else {
+ throw new IllegalArgumentException("Invalid value");
+ }
}
static synchronized Sampler internalCreate(RenderScript rs, Builder b) {
diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java
index f45074e..4a217a9 100644
--- a/graphics/java/android/renderscript/SimpleMesh.java
+++ b/graphics/java/android/renderscript/SimpleMesh.java
@@ -313,28 +313,36 @@
public SimpleMesh create() {
Element.Builder b = new Element.Builder(mRS);
int floatCount = mVtxSize;
- if (mVtxSize == 2) {
- b.addFloatXY();
- } else {
- b.addFloatXYZ();
- }
+ b.add(Element.createAttrib(mRS,
+ Element.DataType.FLOAT_32,
+ Element.DataKind.POSITION,
+ mVtxSize), "position");
if ((mFlags & COLOR) != 0) {
floatCount += 4;
- b.addFloatRGBA();
+ b.add(Element.createAttrib(mRS,
+ Element.DataType.FLOAT_32,
+ Element.DataKind.COLOR,
+ 4), "color");
}
if ((mFlags & TEXTURE_0) != 0) {
floatCount += 2;
- b.addFloatST();
+ b.add(Element.createAttrib(mRS,
+ Element.DataType.FLOAT_32,
+ Element.DataKind.TEXTURE,
+ 2), "texture");
}
if ((mFlags & NORMAL) != 0) {
floatCount += 3;
- b.addFloatNorm();
+ b.add(Element.createAttrib(mRS,
+ Element.DataType.FLOAT_32,
+ Element.DataKind.NORMAL,
+ 3), "normal");
}
mElement = b.create();
Builder smb = new Builder(mRS);
smb.addVertexType(mElement, mVtxCount / floatCount);
- smb.setIndexType(Element.INDEX_16(mRS), mIndexCount);
+ smb.setIndexType(Element.createIndex(mRS), mIndexCount);
smb.setPrimitive(Primitive.TRIANGLE);
SimpleMesh sm = smb.create();
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index ad4cf6b..62d3867 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -34,6 +34,9 @@
private int mNativeCache;
Class mJavaClass;
+ public Element getElement() {
+ return mElement;
+ }
public int getX() {
return mDimX;
@@ -122,16 +125,16 @@
Field f = fields[ct];
Class fc = f.getType();
if(fc == int.class) {
- arTypes[ct] = Element.DataType.SIGNED.mID;
+ arTypes[ct] = Element.DataType.SIGNED_32.mID;
arBits[ct] = 32;
} else if(fc == short.class) {
- arTypes[ct] = Element.DataType.SIGNED.mID;
+ arTypes[ct] = Element.DataType.SIGNED_16.mID;
arBits[ct] = 16;
} else if(fc == byte.class) {
- arTypes[ct] = Element.DataType.SIGNED.mID;
+ arTypes[ct] = Element.DataType.SIGNED_8.mID;
arBits[ct] = 8;
} else if(fc == float.class) {
- arTypes[ct] = Element.DataType.FLOAT.mID;
+ arTypes[ct] = Element.DataType.FLOAT_32.mID;
arBits[ct] = 32;
} else {
throw new IllegalArgumentException("Unkown field type");
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index af3bc74..7ded133 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -247,36 +247,39 @@
}
-static void
-nElementBegin(JNIEnv *_env, jobject _this)
+static jint
+nElementCreate(JNIEnv *_env, jobject _this, jint type, jint kind, jboolean norm, jint size)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nElementBegin, con(%p)", con);
- rsElementBegin(con);
-}
-
-
-static void
-nElementAdd(JNIEnv *_env, jobject _this, jint kind, jint type, jboolean norm, jint bits, jstring name)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- const char* n = NULL;
- if (name) {
- n = _env->GetStringUTFChars(name, NULL);
- }
- LOG_API("nElementAdd, con(%p), kind(%i), type(%i), norm(%i), bits(%i)", con, kind, type, norm, bits);
- rsElementAdd(con, (RsDataKind)kind, (RsDataType)type, norm != 0, (size_t)bits, n);
- if (n) {
- _env->ReleaseStringUTFChars(name, n);
- }
+ LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", con, type, kind, norm, size);
+ return (jint)rsElementCreate(con, (RsDataType)type, (RsDataKind)kind, norm, size);
}
static jint
-nElementCreate(JNIEnv *_env, jobject _this)
+nElementCreate2(JNIEnv *_env, jobject _this, jintArray _ids, jobjectArray _names)
{
+ int fieldCount = _env->GetArrayLength(_ids);
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nElementCreate, con(%p)", con);
- return (jint)rsElementCreate(con);
+ LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", con, type, kind, norm, size);
+
+ jint *ids = _env->GetIntArrayElements(_ids, NULL);
+ const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *));
+ size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t));
+
+ for (int ct=0; ct < fieldCount; ct++) {
+ jstring s = (jstring)_env->GetObjectArrayElement(_names, ct);
+ nameArray[ct] = _env->GetStringUTFChars(s, NULL);
+ sizeArray[ct] = _env->GetStringUTFLength(s);
+ }
+ jint id = (jint)rsElementCreate2(con, fieldCount, (RsElement *)ids, nameArray, sizeArray);
+ for (int ct=0; ct < fieldCount; ct++) {
+ jstring s = (jstring)_env->GetObjectArrayElement(_names, ct);
+ _env->ReleaseStringUTFChars(s, nameArray[ct]);
+ }
+ _env->ReleaseIntArrayElements(_ids, ids, JNI_ABORT);
+ free(nameArray);
+ free(sizeArray);
+ return (jint)id;
}
// -----------------------------------
@@ -395,26 +398,24 @@
tfc[ct].bits = fBits[ct];
switch(fType[ct]) {
- case RS_TYPE_FLOAT:
+ case RS_TYPE_FLOAT_32:
tfc[ct].ptr = SF_LoadFloat;
tfc[ct].readPtr = SF_SaveFloat;
break;
- case RS_TYPE_UNSIGNED:
- case RS_TYPE_SIGNED:
- switch(tfc[ct].bits) {
- case 32:
- tfc[ct].ptr = SF_LoadInt;
- tfc[ct].readPtr = SF_SaveInt;
- break;
- case 16:
- tfc[ct].ptr = SF_LoadShort;
- tfc[ct].readPtr = SF_SaveShort;
- break;
- case 8:
- tfc[ct].ptr = SF_LoadByte;
- tfc[ct].readPtr = SF_SaveByte;
- break;
- }
+ case RS_TYPE_UNSIGNED_32:
+ case RS_TYPE_SIGNED_32:
+ tfc[ct].ptr = SF_LoadInt;
+ tfc[ct].readPtr = SF_SaveInt;
+ break;
+ case RS_TYPE_UNSIGNED_16:
+ case RS_TYPE_SIGNED_16:
+ tfc[ct].ptr = SF_LoadShort;
+ tfc[ct].readPtr = SF_SaveShort;
+ break;
+ case RS_TYPE_UNSIGNED_8:
+ case RS_TYPE_SIGNED_8:
+ tfc[ct].ptr = SF_LoadByte;
+ tfc[ct].readPtr = SF_SaveByte;
break;
}
tc->size += 4;
@@ -1056,91 +1057,93 @@
// ---------------------------------------------------------------------------
static void
-nProgramFragmentBegin(JNIEnv *_env, jobject _this, jint in, jint out, jboolean pointSpriteEnable)
+nProgramBindConstants(JNIEnv *_env, jobject _this, jint vpv, jint slot, jint a)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentBegin, con(%p), in(%p), out(%p) PointSprite(%i)", con, (RsElement)in, (RsElement)out, pointSpriteEnable);
- rsProgramFragmentBegin(con, (RsElement)in, (RsElement)out, pointSpriteEnable);
+ LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a);
+ rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a);
}
static void
-nProgramFragmentBindTexture(JNIEnv *_env, jobject _this, jint vpf, jint slot, jint a)
+nProgramBindTexture(JNIEnv *_env, jobject _this, jint vpf, jint slot, jint a)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
- rsProgramFragmentBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
+ LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
+ rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
}
static void
-nProgramFragmentBindSampler(JNIEnv *_env, jobject _this, jint vpf, jint slot, jint a)
+nProgramBindSampler(JNIEnv *_env, jobject _this, jint vpf, jint slot, jint a)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
- rsProgramFragmentBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
-}
-
-static void
-nProgramFragmentSetSlot(JNIEnv *_env, jobject _this, jint slot, jboolean enable, jint env, jint vt)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentSetType, con(%p), slot(%i), enable(%i), env(%i), vt(%p)", con, slot, enable, env, (RsType)vt);
- rsProgramFragmentSetSlot(con, slot, enable, (RsTexEnvMode)env, (RsType)vt);
-}
-
-static jint
-nProgramFragmentCreate(JNIEnv *_env, jobject _this, jint slot, jboolean enable)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramFragmentCreate, con(%p)", con);
- return (jint)rsProgramFragmentCreate(con);
+ LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
+ rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
}
// ---------------------------------------------------------------------------
-static void
-nProgramVertexBegin(JNIEnv *_env, jobject _this, jint in, jint out)
+static jint
+nProgramFragmentCreate(JNIEnv *_env, jobject _this, jintArray params)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramVertexBegin, con(%p), in(%p), out(%p)", con, (RsElement)in, (RsElement)out);
- rsProgramVertexBegin(con, (RsElement)in, (RsElement)out);
-}
+ jint *paramPtr = _env->GetIntArrayElements(params, NULL);
+ jint paramLen = _env->GetArrayLength(params);
-static void
-nProgramVertexBindAllocation(JNIEnv *_env, jobject _this, jint vpv, jint a)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramVertexBindAllocation, con(%p), vpf(%p), a(%p)", con, (RsProgramVertex)vpv, (RsAllocation)a);
- rsProgramVertexBindAllocation(con, (RsProgramFragment)vpv, (RsAllocation)a);
-}
+ LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, shaderLen, paramLen);
-static void
-nProgramVertexSetTextureMatrixEnable(JNIEnv *_env, jobject _this, jboolean enable)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramVertexSetTextureMatrixEnable, con(%p), enable(%i)", con, enable);
- rsProgramVertexSetTextureMatrixEnable(con, enable);
-}
-
-static void
-nProgramVertexAddLight(JNIEnv *_env, jobject _this, jint light)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramVertexAddLight, con(%p), light(%p)", con, (RsLight)light);
- rsProgramVertexAddLight(con, (RsLight)light);
+ jint ret = (jint)rsProgramFragmentCreate(con, (uint32_t *)paramPtr, paramLen);
+ _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
+ return ret;
}
static jint
-nProgramVertexCreate(JNIEnv *_env, jobject _this)
+nProgramFragmentCreate2(JNIEnv *_env, jobject _this, jstring shader, jintArray params)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nProgramVertexCreate, con(%p)", con);
- return (jint)rsProgramVertexCreate(con);
+ const char* shaderUTF = _env->GetStringUTFChars(shader, NULL);
+ jint shaderLen = _env->GetStringUTFLength(shader);
+ jint *paramPtr = _env->GetIntArrayElements(params, NULL);
+ jint paramLen = _env->GetArrayLength(params);
+
+ LOG_API("nProgramFragmentCreate2, con(%p), shaderLen(%i), paramLen(%i)", con, shaderLen, paramLen);
+
+ jint ret = (jint)rsProgramFragmentCreate2(con, shaderUTF, shaderLen, (uint32_t *)paramPtr, paramLen);
+ _env->ReleaseStringUTFChars(shader, shaderUTF);
+ _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
+ return ret;
}
// ---------------------------------------------------------------------------
static jint
+nProgramVertexCreate(JNIEnv *_env, jobject _this, jboolean texMat)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nProgramVertexCreate, con(%p), texMat(%i)", con, texMat);
+ return (jint)rsProgramVertexCreate(con, texMat);
+}
+
+static jint
+nProgramVertexCreate2(JNIEnv *_env, jobject _this, jstring shader, jintArray params)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ const char* shaderUTF = _env->GetStringUTFChars(shader, NULL);
+ jint shaderLen = _env->GetStringUTFLength(shader);
+ jint *paramPtr = _env->GetIntArrayElements(params, NULL);
+ jint paramLen = _env->GetArrayLength(params);
+
+ LOG_API("nProgramVertexCreate2, con(%p), shaderLen(%i), paramLen(%i)", con, shaderLen, paramLen);
+
+ jint ret = (jint)rsProgramVertexCreate2(con, shaderUTF, shaderLen, (uint32_t *)paramPtr, paramLen);
+ _env->ReleaseStringUTFChars(shader, shaderUTF);
+ _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
+ return ret;
+}
+
+// ---------------------------------------------------------------------------
+
+static jint
nProgramRasterCreate(JNIEnv *_env, jobject _this, jint in, jint out,
jboolean pointSmooth, jboolean lineSmooth, jboolean pointSprite)
{
@@ -1209,26 +1212,6 @@
rsContextBindProgramRaster(con, (RsProgramRaster)pf);
}
-static void
-nContextAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- const char* n = _env->GetStringUTFChars(name, NULL);
- LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value);
- rsContextSetDefineI32(con, n, value);
- _env->ReleaseStringUTFChars(name, n);
-}
-
-static void
-nContextAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- const char* n = _env->GetStringUTFChars(name, NULL);
- LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value);
- rsContextSetDefineF(con, n, value);
- _env->ReleaseStringUTFChars(name, n);
-}
-
// ---------------------------------------------------------------------------
@@ -1365,9 +1348,8 @@
{"nFileOpen", "([B)I", (void*)nFileOpen },
-{"nElementBegin", "()V", (void*)nElementBegin },
-{"nElementAdd", "(IIZILjava/lang/String;)V", (void*)nElementAdd },
-{"nElementCreate", "()I", (void*)nElementCreate },
+{"nElementCreate", "(IIZI)I", (void*)nElementCreate },
+{"nElementCreate2", "([I[Ljava/lang/String;)I", (void*)nElementCreate2 },
{"nTypeBegin", "(I)V", (void*)nTypeBegin },
{"nTypeAdd", "(II)V", (void*)nTypeAdd },
@@ -1432,21 +1414,19 @@
{"nProgramFragmentStoreDither", "(Z)V", (void*)nProgramFragmentStoreDither },
{"nProgramFragmentStoreCreate", "()I", (void*)nProgramFragmentStoreCreate },
-{"nProgramFragmentBegin", "(IIZ)V", (void*)nProgramFragmentBegin },
-{"nProgramFragmentBindTexture", "(III)V", (void*)nProgramFragmentBindTexture },
-{"nProgramFragmentBindSampler", "(III)V", (void*)nProgramFragmentBindSampler },
-{"nProgramFragmentSetSlot", "(IZII)V", (void*)nProgramFragmentSetSlot },
-{"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate },
+{"nProgramBindConstants", "(III)V", (void*)nProgramBindConstants },
+{"nProgramBindTexture", "(III)V", (void*)nProgramBindTexture },
+{"nProgramBindSampler", "(III)V", (void*)nProgramBindSampler },
+
+{"nProgramFragmentCreate", "([I)I", (void*)nProgramFragmentCreate },
+{"nProgramFragmentCreate2", "(Ljava/lang/String;[I)I", (void*)nProgramFragmentCreate2 },
{"nProgramRasterCreate", "(IIZZZ)I", (void*)nProgramRasterCreate },
{"nProgramRasterSetPointSize", "(IF)V", (void*)nProgramRasterSetPointSize },
{"nProgramRasterSetLineWidth", "(IF)V", (void*)nProgramRasterSetLineWidth },
-{"nProgramVertexBindAllocation", "(II)V", (void*)nProgramVertexBindAllocation },
-{"nProgramVertexBegin", "(II)V", (void*)nProgramVertexBegin },
-{"nProgramVertexSetTextureMatrixEnable", "(Z)V", (void*)nProgramVertexSetTextureMatrixEnable },
-{"nProgramVertexAddLight", "(I)V", (void*)nProgramVertexAddLight },
-{"nProgramVertexCreate", "()I", (void*)nProgramVertexCreate },
+{"nProgramVertexCreate", "(Z)I", (void*)nProgramVertexCreate },
+{"nProgramVertexCreate2", "(Ljava/lang/String;[I)I", (void*)nProgramVertexCreate2 },
{"nLightBegin", "()V", (void*)nLightBegin },
{"nLightSetIsMono", "(Z)V", (void*)nLightSetIsMono },
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index 29aaa3f..c87007c 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -282,7 +282,8 @@
FORCE_BT_SCO,
FORCE_BT_A2DP,
FORCE_WIRED_ACCESSORY,
- FORCE_BT_DOCK,
+ FORCE_BT_CAR_DOCK,
+ FORCE_BT_DESK_DOCK,
NUM_FORCE_CONFIG,
FORCE_DEFAULT = FORCE_NONE
};
diff --git a/include/media/stagefright/DataSource.h b/include/media/stagefright/DataSource.h
index b843cd9..f88666a 100644
--- a/include/media/stagefright/DataSource.h
+++ b/include/media/stagefright/DataSource.h
@@ -31,6 +31,8 @@
class DataSource : public RefBase {
public:
+ static sp<DataSource> CreateFromURI(const char *uri);
+
DataSource() {}
virtual status_t initCheck() const = 0;
diff --git a/include/media/stagefright/MediaExtractor.h b/include/media/stagefright/MediaExtractor.h
index d56d4b3..4bc996e 100644
--- a/include/media/stagefright/MediaExtractor.h
+++ b/include/media/stagefright/MediaExtractor.h
@@ -43,6 +43,10 @@
virtual sp<MetaData> getTrackMetaData(
size_t index, uint32_t flags = 0) = 0;
+ // Return container specific meta-data. The default implementation
+ // returns an empty metadata object.
+ virtual sp<MetaData> getMetaData();
+
protected:
MediaExtractor() {}
virtual ~MediaExtractor() {}
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index c6ac6c2..ef30b02 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -48,6 +48,15 @@
kKeyBufferID = 'bfID',
kKeyMaxInputSize = 'inpS',
kKeyThumbnailTime = 'thbT', // int64_t (usecs)
+
+ kKeyAlbum = 'albu', // cstring
+ kKeyArtist = 'arti', // cstring
+ kKeyComposer = 'comp', // cstring
+ kKeyGenre = 'genr', // cstring
+ kKeyTitle = 'titl', // cstring
+ kKeyYear = 'year', // cstring
+ kKeyAlbumArt = 'albA', // compressed image data
+ kKeyAlbumArtMIME = 'alAM', // cstring
};
enum {
diff --git a/media/libmedia/StagefrightMediaScanner.h b/include/media/stagefright/StagefrightMediaScanner.h
similarity index 93%
rename from media/libmedia/StagefrightMediaScanner.h
rename to include/media/stagefright/StagefrightMediaScanner.h
index 108acb4..af125dc 100644
--- a/media/libmedia/StagefrightMediaScanner.h
+++ b/include/media/stagefright/StagefrightMediaScanner.h
@@ -22,6 +22,8 @@
namespace android {
+struct StagefrightMetadataRetriever;
+
struct StagefrightMediaScanner : public MediaScanner {
StagefrightMediaScanner();
virtual ~StagefrightMediaScanner();
@@ -33,6 +35,8 @@
virtual char *extractAlbumArt(int fd);
private:
+ sp<StagefrightMetadataRetriever> mRetriever;
+
StagefrightMediaScanner(const StagefrightMediaScanner &);
StagefrightMediaScanner &operator=(const StagefrightMediaScanner &);
};
diff --git a/keystore/java/android/security/SystemKeyStore.java b/keystore/java/android/security/SystemKeyStore.java
new file mode 100644
index 0000000..452125a4
--- /dev/null
+++ b/keystore/java/android/security/SystemKeyStore.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2010 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 android.security;
+
+import android.os.Environment;
+import android.os.Process;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+/**
+ *@hide
+ */
+public class SystemKeyStore {
+
+ private static final String SYSTEM_KEYSTORE_DIRECTORY = "misc/systemkeys";
+ private static SystemKeyStore mInstance = new SystemKeyStore();
+
+ private SystemKeyStore() { }
+
+ public static SystemKeyStore getInstance() {
+ return mInstance;
+ }
+
+ public byte[] generateNewKey(int numBits, String algName, String keyName)
+ throws NoSuchAlgorithmException {
+
+ // Check if key with similar name exists. If so, return null.
+ File keyFile = getKeyFile(keyName);
+ if (keyFile.exists()) {
+ throw new IllegalArgumentException();
+ }
+
+ KeyGenerator skg = KeyGenerator.getInstance(algName);
+ SecureRandom srng = SecureRandom.getInstance("SHA1PRNG");
+ skg.init(numBits, srng);
+
+ SecretKey sk = skg.generateKey();
+ byte[] retKey = sk.getEncoded();
+
+ try {
+ // Store the key
+ if (!keyFile.createNewFile()) {
+ throw new IllegalArgumentException();
+ }
+
+ FileOutputStream fos = new FileOutputStream(keyFile);
+ fos.write(retKey);
+ fos.flush();
+ fos.close();
+ } catch (IOException ioe) {
+ return null;
+ }
+ return retKey;
+ }
+
+ private File getKeyFile(String keyName) {
+ File sysKeystoreDir = new File(Environment.getDataDirectory(),
+ SYSTEM_KEYSTORE_DIRECTORY);
+ File keyFile = new File(sysKeystoreDir, keyName);
+ return keyFile;
+ }
+
+ public byte[] retrieveKey(String keyName) {
+
+ File keyFile = getKeyFile(keyName);
+ if (!keyFile.exists()) {
+ return null;
+ }
+
+ try {
+ FileInputStream fis = new FileInputStream(keyFile);
+ int keyLen = fis.available();
+ byte[] retKey = new byte[keyLen];
+ fis.read(retKey);
+ fis.close();
+ return retKey;
+ } catch (IOException ioe) { }
+ throw new IllegalArgumentException();
+ }
+
+ public void deleteKey(String keyName) {
+
+ // Get the file first.
+ File keyFile = getKeyFile(keyName);
+ if (!keyFile.exists()) {
+ throw new IllegalArgumentException();
+ }
+
+ keyFile.delete();
+ }
+}
diff --git a/keystore/tests/src/android/security/KeyStoreTestRunner.java b/keystore/tests/src/android/security/KeyStoreTestRunner.java
index c85922d..c56eeb9 100644
--- a/keystore/tests/src/android/security/KeyStoreTestRunner.java
+++ b/keystore/tests/src/android/security/KeyStoreTestRunner.java
@@ -37,6 +37,7 @@
public TestSuite getAllTests() {
TestSuite suite = new InstrumentationTestSuite(this);
suite.addTestSuite(android.security.tests.KeyStoreTest.class);
+ suite.addTestSuite(android.security.tests.SystemKeyStoreTest.class);
return suite;
}
diff --git a/keystore/tests/src/android/security/SystemKeyStoreTest.java b/keystore/tests/src/android/security/SystemKeyStoreTest.java
new file mode 100644
index 0000000..a85f889
--- /dev/null
+++ b/keystore/tests/src/android/security/SystemKeyStoreTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010 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 android.security.tests;
+
+import android.app.Activity;
+import android.security.SystemKeyStore;
+import android.test.ActivityUnitTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+/**
+ * Junit / Instrumentation test case for KeyStore class
+ *
+ * Running the test suite:
+ *
+ * adb shell am instrument -w android.security.tests/.KeyStoreTestRunner
+ */
+@MediumTest
+public class SystemKeyStoreTest extends ActivityUnitTestCase<Activity> {
+
+ private static final String keyName = "TestKey";
+ private SystemKeyStore mSysKeyStore = null;
+
+ public SystemKeyStoreTest() {
+ super(Activity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ mSysKeyStore = SystemKeyStore.getInstance();
+ try {
+ mSysKeyStore.deleteKey(keyName);
+ } catch (Exception e) { }
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ try {
+ mSysKeyStore.deleteKey(keyName);
+ } catch (Exception e) { }
+ super.tearDown();
+ }
+
+ public void testBasicAccess() throws Exception {
+ try {
+ byte[] newKey = mSysKeyStore.generateNewKey(128, "AES", keyName);
+ assertNotNull(newKey);
+ byte[] recKey = mSysKeyStore.retrieveKey(keyName);
+ assertEquals(newKey.length, recKey.length);
+ for (int i = 0; i < newKey.length; i++) {
+ assertEquals(newKey[i], recKey[i]);
+ }
+ mSysKeyStore.deleteKey(keyName);
+ byte[] nullKey = mSysKeyStore.retrieveKey(keyName);
+ assertNull(nullKey);
+ } catch (Exception e) {
+ fail();
+ }
+ }
+}
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 2024cc0..ecfe1e0 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -932,6 +932,8 @@
result.append(buffer);
snprintf(buffer, SIZE, "blocked in write: %d\n", mInWrite);
result.append(buffer);
+ snprintf(buffer, SIZE, "suspend count: %d\n", mSuspended);
+ result.append(buffer);
write(fd, result.string(), result.size());
dumpBase(fd, args);
@@ -1344,7 +1346,7 @@
if (cblk->framesReady() && (track->isReady() || track->isStopped()) &&
!track->isPaused())
{
- //LOGV("track %d u=%08x, s=%08x [OK]", track->name(), cblk->user, cblk->server);
+ //LOGV("track %d u=%08x, s=%08x [OK] on thread %p", track->name(), cblk->user, cblk->server, this);
// compute volume for this track
int16_t left, right;
@@ -1400,7 +1402,7 @@
track->mRetryCount = kMaxTrackRetries;
mixerStatus = MIXER_TRACKS_READY;
} else {
- //LOGV("track %d u=%08x, s=%08x [NOT READY]", track->name(), cblk->user, cblk->server);
+ //LOGV("track %d u=%08x, s=%08x [NOT READY] on thread %p", track->name(), cblk->user, cblk->server, this);
if (track->isStopped()) {
track->reset();
}
@@ -1914,7 +1916,7 @@
// ----------------------------------------------------------------------------
AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger, AudioFlinger::MixerThread* mainThread, int id)
- : MixerThread(audioFlinger, mainThread->getOutput(), id)
+ : MixerThread(audioFlinger, mainThread->getOutput(), id), mWaitTimeMs(UINT_MAX)
{
mType = PlaybackThread::DUPLICATING;
addOutputTrack(mainThread);
@@ -1952,6 +1954,7 @@
if (checkForNewParameters_l()) {
mixBufferSize = mFrameCount*mFrameSize;
+ updateWaitTime();
activeSleepTime = activeSleepTimeUs();
idleSleepTime = idleSleepTimeUs();
}
@@ -2003,7 +2006,11 @@
if (LIKELY(mixerStatus == MIXER_TRACKS_READY)) {
// mix buffers...
- mAudioMixer->process(curBuf);
+ if (outputsReady(outputTracks)) {
+ mAudioMixer->process(curBuf);
+ } else {
+ memset(curBuf, 0, mixBufferSize);
+ }
sleepTime = 0;
writeFrames = mFrameCount;
} else {
@@ -2054,6 +2061,7 @@
{
int frameCount = (3 * mFrameCount * mSampleRate) / thread->sampleRate();
OutputTrack *outputTrack = new OutputTrack((ThreadBase *)thread,
+ this,
mSampleRate,
mFormat,
mChannelCount,
@@ -2062,6 +2070,7 @@
thread->setStreamVolume(AudioSystem::NUM_STREAM_TYPES, 1.0f);
mOutputTracks.add(outputTrack);
LOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
+ updateWaitTime();
}
}
@@ -2072,12 +2081,50 @@
if (mOutputTracks[i]->thread() == (ThreadBase *)thread) {
mOutputTracks[i]->destroy();
mOutputTracks.removeAt(i);
+ updateWaitTime();
return;
}
}
LOGV("removeOutputTrack(): unkonwn thread: %p", thread);
}
+void AudioFlinger::DuplicatingThread::updateWaitTime()
+{
+ mWaitTimeMs = UINT_MAX;
+ for (size_t i = 0; i < mOutputTracks.size(); i++) {
+ sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
+ if (strong != NULL) {
+ uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
+ if (waitTimeMs < mWaitTimeMs) {
+ mWaitTimeMs = waitTimeMs;
+ }
+ }
+ }
+}
+
+
+bool AudioFlinger::DuplicatingThread::outputsReady(SortedVector< sp<OutputTrack> > &outputTracks)
+{
+ for (size_t i = 0; i < outputTracks.size(); i++) {
+ sp <ThreadBase> thread = outputTracks[i]->thread().promote();
+ if (thread == 0) {
+ LOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p", outputTracks[i].get());
+ return false;
+ }
+ PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
+ if (playbackThread->standby() && !playbackThread->isSuspended()) {
+ LOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(), thread.get());
+ return false;
+ }
+ }
+ return true;
+}
+
+uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs()
+{
+ return (mWaitTimeMs * 1000) / 2;
+}
+
// ----------------------------------------------------------------------------
// TrackBase constructor must be called with AudioFlinger::mLock held
@@ -2616,12 +2663,13 @@
AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
const wp<ThreadBase>& thread,
+ DuplicatingThread *sourceThread,
uint32_t sampleRate,
int format,
int channelCount,
int frameCount)
: Track(thread, NULL, AudioSystem::NUM_STREAM_TYPES, sampleRate, format, channelCount, frameCount, NULL),
- mActive(false)
+ mActive(false), mSourceThread(sourceThread)
{
PlaybackThread *playbackThread = (PlaybackThread *)thread.unsafe_get();
@@ -2630,10 +2678,9 @@
mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
mCblk->volume[0] = mCblk->volume[1] = 0x1000;
mOutBuffer.frameCount = 0;
- mWaitTimeMs = (playbackThread->frameCount() * 2 * 1000) / playbackThread->sampleRate();
playbackThread->mTracks.add(this);
- LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channels %d mBufferEnd %p mWaitTimeMs %d",
- mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channels, mBufferEnd, mWaitTimeMs);
+ LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channels %d mBufferEnd %p",
+ mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channels, mBufferEnd);
} else {
LOGW("Error creating output track on thread %p", playbackThread);
}
@@ -2673,7 +2720,7 @@
inBuffer.frameCount = frames;
inBuffer.i16 = data;
- uint32_t waitTimeLeftMs = mWaitTimeMs;
+ uint32_t waitTimeLeftMs = mSourceThread->waitTimeMs();
if (!mActive && frames != 0) {
start();
@@ -2712,12 +2759,11 @@
mOutBuffer.frameCount = pInBuffer->frameCount;
nsecs_t startTime = systemTime();
if (obtainBuffer(&mOutBuffer, waitTimeLeftMs) == (status_t)AudioTrack::NO_MORE_BUFFERS) {
- LOGV ("OutputTrack::write() %p no more output buffers", this);
+ LOGV ("OutputTrack::write() %p thread %p no more output buffers", this, mThread.unsafe_get());
outputBufferFull = true;
break;
}
uint32_t waitTimeMs = (uint32_t)ns2ms(systemTime() - startTime);
- LOGV("OutputTrack::write() to thread %p waitTimeMs %d waitTimeLeftMs %d", mThread.unsafe_get(), waitTimeMs, waitTimeLeftMs);
if (waitTimeLeftMs >= waitTimeMs) {
waitTimeLeftMs -= waitTimeMs;
} else {
@@ -2738,7 +2784,7 @@
mBufferQueue.removeAt(0);
delete [] pInBuffer->mBuffer;
delete pInBuffer;
- LOGV("OutputTrack::write() %p released overflow buffer %d", this, mBufferQueue.size());
+ LOGV("OutputTrack::write() %p thread %p released overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
} else {
break;
}
@@ -2747,16 +2793,19 @@
// If we could not write all frames, allocate a buffer and queue it for next time.
if (inBuffer.frameCount) {
- if (mBufferQueue.size() < kMaxOverFlowBuffers) {
- pInBuffer = new Buffer;
- pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channels];
- pInBuffer->frameCount = inBuffer.frameCount;
- pInBuffer->i16 = pInBuffer->mBuffer;
- memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channels * sizeof(int16_t));
- mBufferQueue.add(pInBuffer);
- LOGV("OutputTrack::write() %p adding overflow buffer %d", this, mBufferQueue.size());
- } else {
- LOGW("OutputTrack::write() %p no more overflow buffers", this);
+ sp<ThreadBase> thread = mThread.promote();
+ if (thread != 0 && !thread->standby()) {
+ if (mBufferQueue.size() < kMaxOverFlowBuffers) {
+ pInBuffer = new Buffer;
+ pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channels];
+ pInBuffer->frameCount = inBuffer.frameCount;
+ pInBuffer->i16 = pInBuffer->mBuffer;
+ memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channels * sizeof(int16_t));
+ mBufferQueue.add(pInBuffer);
+ LOGV("OutputTrack::write() %p thread %p adding overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
+ } else {
+ LOGW("OutputTrack::write() %p thread %p no more overflow buffers", mThread.unsafe_get(), this);
+ }
}
}
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 8c29da85..12c90eb 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -20,6 +20,7 @@
#include <stdint.h>
#include <sys/types.h>
+#include <limits.h>
#include <media/IAudioFlinger.h>
#include <media/IAudioFlingerClient.h>
@@ -208,6 +209,7 @@
class PlaybackThread;
class MixerThread;
class DirectOutputThread;
+ class DuplicatingThread;
class Track;
class RecordTrack;
@@ -324,6 +326,7 @@
void sendConfigEvent_l(int event, int param = 0);
void processConfigEvents();
int id() const { return mId;}
+ bool standby() { return mStandby; }
mutable Mutex mLock;
@@ -452,6 +455,7 @@
};
OutputTrack( const wp<ThreadBase>& thread,
+ DuplicatingThread *sourceThread,
uint32_t sampleRate,
int format,
int channelCount,
@@ -471,13 +475,12 @@
void clearBufferQueue();
// Maximum number of pending buffers allocated by OutputTrack::write()
- static const uint8_t kMaxOverFlowBuffers = 3;
+ static const uint8_t kMaxOverFlowBuffers = 10;
Vector < Buffer* > mBufferQueue;
AudioBufferProvider::Buffer mOutBuffer;
- uint32_t mWaitTimeMs;
bool mActive;
-
+ DuplicatingThread* mSourceThread;
}; // end of OutputTrack
PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
@@ -520,6 +523,7 @@
virtual int type() const { return mType; }
void suspend() { mSuspended++; }
void restore() { if (mSuspended) mSuspended--; }
+ bool isSuspended() { return (mSuspended != 0); }
virtual String8 getParameters(const String8& keys);
virtual void audioConfigChanged(int event, int param = 0);
@@ -635,9 +639,16 @@
virtual bool threadLoop();
void addOutputTrack(MixerThread* thread);
void removeOutputTrack(MixerThread* thread);
+ uint32_t waitTimeMs() { return mWaitTimeMs; }
+ protected:
+ virtual uint32_t activeSleepTimeUs();
private:
+ bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
+ void updateWaitTime();
+
SortedVector < sp<OutputTrack> > mOutputTracks;
+ uint32_t mWaitTimeMs;
};
PlaybackThread *checkPlaybackThread_l(int output) const;
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
index 262ac8d..3080ab0 100644
--- a/libs/rs/Android.mk
+++ b/libs/rs/Android.mk
@@ -96,11 +96,14 @@
rsScript.cpp \
rsScriptC.cpp \
rsScriptC_Lib.cpp \
+ rsShaderCache.cpp \
rsSimpleMesh.cpp \
rsThreadIO.cpp \
- rsType.cpp
+ rsType.cpp \
+ rsVertexArray.cpp
-LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libui libacc
+
+LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libacc
LOCAL_LDLIBS := -lpthread -ldl
LOCAL_MODULE:= libRS
LOCAL_MODULE_TAGS := optional
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 3ca8b15..6662333 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -36,11 +36,11 @@
typedef void * RsFile;
typedef void * RsSampler;
typedef void * RsScript;
-typedef void * RsScriptBasicTemp;
typedef void * RsSimpleMesh;
typedef void * RsType;
typedef void * RsLight;
+typedef void * RsProgram;
typedef void * RsProgramVertex;
typedef void * RsProgramFragment;
typedef void * RsProgramFragmentStore;
@@ -64,34 +64,53 @@
void rsContextDeinitToClient(RsContext);
#define RS_MAX_TEXTURE 2
+#define RS_MAX_ATTRIBS 16
enum RsDataType {
- RS_TYPE_FLOAT,
- RS_TYPE_UNSIGNED,
- RS_TYPE_SIGNED
+ RS_TYPE_NONE,
+ RS_TYPE_FLOAT_16,
+ RS_TYPE_FLOAT_32,
+ RS_TYPE_FLOAT_64,
+ RS_TYPE_SIGNED_8,
+ RS_TYPE_SIGNED_16,
+ RS_TYPE_SIGNED_32,
+ RS_TYPE_SIGNED_64,
+ RS_TYPE_UNSIGNED_8,
+ RS_TYPE_UNSIGNED_16,
+ RS_TYPE_UNSIGNED_32,
+ RS_TYPE_UNSIGNED_64,
+
+ RS_TYPE_UNSIGNED_5_6_5,
+ RS_TYPE_UNSIGNED_5_5_5_1,
+ RS_TYPE_UNSIGNED_4_4_4_4,
+
+ RS_TYPE_ELEMENT,
+ RS_TYPE_TYPE,
+ RS_TYPE_ALLOCATION,
+ RS_TYPE_SAMPLER,
+ RS_TYPE_SCRIPT,
+ RS_TYPE_MESH,
+ RS_TYPE_PROGRAM_FRAGMENT,
+ RS_TYPE_PROGRAM_VERTEX,
+ RS_TYPE_PROGRAM_RASTER,
+ RS_TYPE_PROGRAM_STORE
};
enum RsDataKind {
RS_KIND_USER,
- RS_KIND_RED,
- RS_KIND_GREEN,
- RS_KIND_BLUE,
- RS_KIND_ALPHA,
- RS_KIND_LUMINANCE,
- RS_KIND_INTENSITY,
- RS_KIND_X,
- RS_KIND_Y,
- RS_KIND_Z,
- RS_KIND_W,
- RS_KIND_S,
- RS_KIND_T,
- RS_KIND_Q,
- RS_KIND_R,
- RS_KIND_NX,
- RS_KIND_NY,
- RS_KIND_NZ,
+ RS_KIND_COLOR,
+ RS_KIND_POSITION,
+ RS_KIND_TEXTURE,
+ RS_KIND_NORMAL,
RS_KIND_INDEX,
- RS_KIND_POINT_SIZE
+ RS_KIND_POINT_SIZE,
+
+ RS_KIND_PIXEL_L,
+ RS_KIND_PIXEL_A,
+ RS_KIND_PIXEL_LA,
+ RS_KIND_PIXEL_RGB,
+ RS_KIND_PIXEL_RGBA,
+
};
enum RsSamplerParam {
@@ -158,11 +177,19 @@
};
enum RsTexEnvMode {
+ RS_TEX_ENV_MODE_NONE,
RS_TEX_ENV_MODE_REPLACE,
RS_TEX_ENV_MODE_MODULATE,
RS_TEX_ENV_MODE_DECAL
};
+enum RsProgramParam {
+ RS_PROGRAM_PARAM_INPUT,
+ RS_PROGRAM_PARAM_OUTPUT,
+ RS_PROGRAM_PARAM_CONSTANT,
+ RS_PROGRAM_PARAM_TEXTURE_COUNT,
+};
+
enum RsPrimitive {
RS_PRIMITIVE_POINT,
RS_PRIMITIVE_LINE,
diff --git a/libs/rs/RenderScriptEnv.h b/libs/rs/RenderScriptEnv.h
index ff0a7b1..99b8c04 100644
--- a/libs/rs/RenderScriptEnv.h
+++ b/libs/rs/RenderScriptEnv.h
@@ -9,7 +9,6 @@
typedef void * RsElement;
typedef void * RsSampler;
typedef void * RsScript;
-typedef void * RsScriptBasicTemp;
typedef void * RsSimpleMesh;
typedef void * RsType;
typedef void * RsProgramFragment;
diff --git a/libs/rs/java/Film/Android.mk b/libs/rs/java/Film/Android.mk
index b7f98fc..9e6ed7e 100644
--- a/libs/rs/java/Film/Android.mk
+++ b/libs/rs/java/Film/Android.mk
@@ -17,6 +17,8 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_MODULE_TAGS := optional
+
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java
index b5b6723..b80e619 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmRS.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java
@@ -121,13 +121,13 @@
bs.setWrapT(Sampler.Value.WRAP);
mSampler = bs.create();
- ProgramFragment.Builder b = new ProgramFragment.Builder(mRS, null, null);
-
+ ProgramFragment.Builder b = new ProgramFragment.Builder(mRS);
mPFBackground = b.create();
mPFBackground.setName("PFBackground");
- b.setTexEnable(true, 0);
- b.setTexEnvMode(ProgramFragment.EnvMode.REPLACE, 0);
+ b = new ProgramFragment.Builder(mRS);
+ b.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
+ ProgramFragment.Builder.Format.RGBA, 0);
mPFImages = b.create();
mPFImages.bindSampler(mSampler, 0);
mPFImages.setName("PFImages");
@@ -138,7 +138,7 @@
mLight.setPosition(0, -0.5f, -1.0f);
ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
- pvb.addLight(mLight);
+ //pvb.addLight(mLight);
mPVBackground = pvb.create();
mPVBackground.setName("PVBackground");
@@ -152,9 +152,10 @@
mBufferIDs = new int[13];
mImages = new Allocation[13];
mAllocIDs = Allocation.createSized(mRS,
- Element.USER_F32(mRS), mBufferIDs.length);
+ Element.createUser(mRS, Element.DataType.FLOAT_32),
+ mBufferIDs.length);
- Element ie = Element.RGB_565(mRS);
+ Element ie = Element.createPixel(mRS, Element.DataType.UNSIGNED_5_6_5, Element.DataKind.PIXEL_RGB);
mImages[0] = Allocation.createFromBitmapResourceBoxed(mRS, mRes, R.drawable.p01, ie, true);
mImages[1] = Allocation.createFromBitmapResourceBoxed(mRS, mRes, R.drawable.p02, ie, true);
mImages[2] = Allocation.createFromBitmapResourceBoxed(mRS, mRes, R.drawable.p03, ie, true);
@@ -195,7 +196,8 @@
{
mBufferState = new int[10];
mAllocState = Allocation.createSized(mRS,
- Element.USER_F32(mRS), mBufferState.length);
+ Element.createUser(mRS, Element.DataType.FLOAT_32),
+ mBufferState.length);
mBufferState[STATE_LAST_FOCUS] = -1;
mAllocState.data(mBufferState);
}
@@ -238,12 +240,12 @@
mAllocOffsets = Allocation.createSized(mRS,
- Element.USER_I32(mRS), mFSM.mTriangleOffsets.length);
+ Element.createUser(mRS, Element.DataType.SIGNED_32), mFSM.mTriangleOffsets.length);
mAllocOffsets.data(mFSM.mTriangleOffsets);
mScriptStrip.bindAllocation(mAllocOffsets, 4);
mAllocOffsetsTex = Allocation.createSized(mRS,
- Element.USER_F32(mRS), mFSM.mTriangleOffsetsTex.length);
+ Element.createUser(mRS, Element.DataType.FLOAT_32), mFSM.mTriangleOffsetsTex.length);
mAllocOffsetsTex.data(mFSM.mTriangleOffsetsTex);
mScriptStrip.bindAllocation(mAllocOffsetsTex, 5);
diff --git a/libs/rs/java/Film/src/com/android/film/FilmView.java b/libs/rs/java/Film/src/com/android/film/FilmView.java
index 1c5b2bc..4a201fd 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmView.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmView.java
@@ -42,19 +42,29 @@
public FilmView(Context context) {
super(context);
-
//setFocusable(true);
}
private RenderScript mRS;
private FilmRS mRender;
+
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
super.surfaceChanged(holder, format, w, h);
+ if (mRS == null) {
+ mRS = createRenderScript(true);
+ mRS.contextSetSurface(w, h, holder.getSurface());
+ mRender = new FilmRS();
+ mRender.init(mRS, getResources(), w, h);
+ }
+ }
- mRS = createRenderScript(true);
- mRender = new FilmRS();
- mRender.init(mRS, getResources(), w, h);
+ @Override
+ protected void onDetachedFromWindow() {
+ if(mRS != null) {
+ mRS = null;
+ destroyRenderScript();
+ }
}
@Override
diff --git a/libs/rs/java/Fountain/Android.mk b/libs/rs/java/Fountain/Android.mk
index b6a9f10..f7e53a8 100644
--- a/libs/rs/java/Fountain/Android.mk
+++ b/libs/rs/java/Fountain/Android.mk
@@ -17,6 +17,8 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_MODULE_TAGS := optional
+
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c
index f218f9b..73b819b 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.c
+++ b/libs/rs/java/Fountain/res/raw/fountain.c
@@ -14,19 +14,17 @@
float rMax = ((float)rate) * 0.005f;
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;
+ int color = ((int)(Control->r * 255.f)) |
+ ((int)(Control->g * 255.f)) << 8 |
+ ((int)(Control->b * 255.f)) << 16 |
+ (0xf0 << 24);
struct point_s * np = &p[newPart];
while (rate--) {
- vec2Rand((float *)np, rMax);
- np->x = x;
- np->y = y;
- np->r = r;
- np->g = g;
- np->b = b;
- np->a = 0xf0;
+ vec2Rand((float *)&np->delta.x, rMax);
+ np->position.x = x;
+ np->position.y = y;
+ np->color = color;
newPart++;
np++;
if (newPart >= count) {
@@ -37,14 +35,14 @@
}
for (ct=0; ct < count; ct++) {
- float dy = p->dy + 0.15f;
- float posy = p->y + dy;
+ float dy = p->delta.y + 0.15f;
+ float posy = p->position.y + dy;
if ((posy > height) && (dy > 0)) {
dy *= -0.3f;
}
- p->dy = dy;
- p->x += p->dx;
- p->y = posy;
+ p->delta.y = dy;
+ p->position.x += p->delta.x;
+ p->position.y = posy;
p++;
}
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 f4f9b0c..71f95a7 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,9 @@
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.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "delta");
+ eb.add(Element.createAttrib(mRS, Element.DataType.FLOAT_32, Element.DataKind.POSITION, 2), "position");
+ eb.add(Element.createAttrib(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.COLOR, 4), "color");
Element primElement = eb.create();
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
index 1e7c5a2..fcb93f4 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
@@ -51,7 +51,7 @@
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
super.surfaceChanged(holder, format, w, h);
if (mRS == null) {
- mRS = createRenderScript(false, true);
+ mRS = createRenderScript(false);
mRS.contextSetSurface(w, h, holder.getSurface());
mRender = new FountainRS();
mRender.init(mRS, getResources(), w, h);
diff --git a/libs/rs/java/ImageProcessing/Android.mk b/libs/rs/java/ImageProcessing/Android.mk
index 5a844d5..833427b 100644
--- a/libs/rs/java/ImageProcessing/Android.mk
+++ b/libs/rs/java/ImageProcessing/Android.mk
@@ -17,6 +17,8 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_MODULE_TAGS := optional
+
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
diff --git a/libs/rs/java/ImageProcessing/res/layout/main.xml b/libs/rs/java/ImageProcessing/res/layout/main.xml
index 0872cf2a..6770c18 100644
--- a/libs/rs/java/ImageProcessing/res/layout/main.xml
+++ b/libs/rs/java/ImageProcessing/res/layout/main.xml
@@ -31,7 +31,7 @@
android:layout_marginBottom="10dip"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
diff --git a/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
index 334fd9c..0ca00b3 100644
--- a/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
+++ b/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
@@ -62,7 +62,7 @@
public float threshold;
}
-
+
static class Pixel {
public byte a;
public byte r;
@@ -78,7 +78,7 @@
mParams.outWidth, mParams.outHeight);
mDisplayView.invalidate();
}
- };
+ };
@Override
public void run() {
@@ -131,7 +131,7 @@
public void surfaceDestroyed(SurfaceHolder holder) {
}
-
+
private Script.Invokable createScript() {
mRS = new RenderScript(false, false);
mRS.mMessageCallback = new FilterCallback();
@@ -143,9 +143,11 @@
final int pixelCount = mParams.inWidth * mParams.inHeight;
mPixelType = Type.createFromClass(mRS, Pixel.class, 1, "Pixel");
- mInPixelsAllocation = Allocation.createSized(mRS, Element.USER_I32(mRS),
+ mInPixelsAllocation = Allocation.createSized(mRS,
+ Element.createUser(mRS, Element.DataType.SIGNED_32),
pixelCount);
- mOutPixelsAllocation = Allocation.createSized(mRS, Element.USER_I32(mRS),
+ mOutPixelsAllocation = Allocation.createSized(mRS,
+ Element.createUser(mRS, Element.DataType.SIGNED_32),
pixelCount);
final int[] data = new int[pixelCount];
@@ -154,7 +156,7 @@
mOutData = new int[pixelCount];
mOutPixelsAllocation.data(mOutData);
-
+
ScriptC.Builder sb = new ScriptC.Builder(mRS);
sb.setType(mParamsType, "Params", 0);
sb.setType(mPixelType, "InPixel", 1);
diff --git a/libs/rs/java/Rollo/Android.mk b/libs/rs/java/Rollo/Android.mk
deleted file mode 100644
index 5a4957c..0000000
--- a/libs/rs/java/Rollo/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
-
-LOCAL_PACKAGE_NAME := Rollo
-
-include $(BUILD_PACKAGE)
diff --git a/libs/rs/java/Rollo/AndroidManifest.xml b/libs/rs/java/Rollo/AndroidManifest.xml
deleted file mode 100644
index 12cb28f..0000000
--- a/libs/rs/java/Rollo/AndroidManifest.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.rollo">
- <application
- android:label="Rollo"
- android:icon="@drawable/test_pattern">
- <activity android:name="Rollo"
- android:theme="@android:style/Theme.Translucent"
- android:icon="@drawable/test_pattern">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/libs/rs/java/Rollo/res/drawable/test_pattern.png b/libs/rs/java/Rollo/res/drawable/test_pattern.png
deleted file mode 100644
index e7d1455..0000000
--- a/libs/rs/java/Rollo/res/drawable/test_pattern.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/browser.png b/libs/rs/java/Rollo/res/raw/browser.png
deleted file mode 100644
index 513f0be..0000000
--- a/libs/rs/java/Rollo/res/raw/browser.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/calendar.png b/libs/rs/java/Rollo/res/raw/calendar.png
deleted file mode 100644
index 030ae73..0000000
--- a/libs/rs/java/Rollo/res/raw/calendar.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/g1155.png b/libs/rs/java/Rollo/res/raw/g1155.png
deleted file mode 100644
index 68e1843..0000000
--- a/libs/rs/java/Rollo/res/raw/g1155.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/g2140.png b/libs/rs/java/Rollo/res/raw/g2140.png
deleted file mode 100644
index 8c4e853..0000000
--- a/libs/rs/java/Rollo/res/raw/g2140.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/maps.png b/libs/rs/java/Rollo/res/raw/maps.png
deleted file mode 100644
index fd5fc39..0000000
--- a/libs/rs/java/Rollo/res/raw/maps.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/market.png b/libs/rs/java/Rollo/res/raw/market.png
deleted file mode 100644
index 83b6910..0000000
--- a/libs/rs/java/Rollo/res/raw/market.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path1920.png b/libs/rs/java/Rollo/res/raw/path1920.png
deleted file mode 100644
index 3510665..0000000
--- a/libs/rs/java/Rollo/res/raw/path1920.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path1927.png b/libs/rs/java/Rollo/res/raw/path1927.png
deleted file mode 100644
index fccc846..0000000
--- a/libs/rs/java/Rollo/res/raw/path1927.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path3099.png b/libs/rs/java/Rollo/res/raw/path3099.png
deleted file mode 100644
index 527ebf6..0000000
--- a/libs/rs/java/Rollo/res/raw/path3099.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path3950.png b/libs/rs/java/Rollo/res/raw/path3950.png
deleted file mode 100644
index 59a646a..0000000
--- a/libs/rs/java/Rollo/res/raw/path3950.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path431.png b/libs/rs/java/Rollo/res/raw/path431.png
deleted file mode 100644
index 5d2ed75..0000000
--- a/libs/rs/java/Rollo/res/raw/path431.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path4481.png b/libs/rs/java/Rollo/res/raw/path4481.png
deleted file mode 100644
index 78be0fc..0000000
--- a/libs/rs/java/Rollo/res/raw/path4481.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path5168.png b/libs/rs/java/Rollo/res/raw/path5168.png
deleted file mode 100644
index a7c3a19..0000000
--- a/libs/rs/java/Rollo/res/raw/path5168.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path676.png b/libs/rs/java/Rollo/res/raw/path676.png
deleted file mode 100644
index 2099690..0000000
--- a/libs/rs/java/Rollo/res/raw/path676.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path754.png b/libs/rs/java/Rollo/res/raw/path754.png
deleted file mode 100644
index 88aed5b..0000000
--- a/libs/rs/java/Rollo/res/raw/path754.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/path815.png b/libs/rs/java/Rollo/res/raw/path815.png
deleted file mode 100644
index 407570f..0000000
--- a/libs/rs/java/Rollo/res/raw/path815.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/photos.png b/libs/rs/java/Rollo/res/raw/photos.png
deleted file mode 100644
index 1ed8f1e..0000000
--- a/libs/rs/java/Rollo/res/raw/photos.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/polygon2408.png b/libs/rs/java/Rollo/res/raw/polygon2408.png
deleted file mode 100644
index 4413954..0000000
--- a/libs/rs/java/Rollo/res/raw/polygon2408.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c
deleted file mode 100644
index b31be81..0000000
--- a/libs/rs/java/Rollo/res/raw/rollo.c
+++ /dev/null
@@ -1,184 +0,0 @@
-#pragma version(1)
-#pragma stateVertex(PV)
-#pragma stateFragment(PF)
-#pragma stateStore(PFS)
-
-// Scratch buffer layout
-#define SCRATCH_FADE 0
-#define SCRATCH_ZOOM 1
-#define SCRATCH_ROT 2
-
-//#define STATE_POS_X 0
-#define STATE_DONE 1
-//#define STATE_PRESSURE 2
-#define STATE_ZOOM 3
-//#define STATE_WARP 4
-#define STATE_ORIENTATION 5
-#define STATE_SELECTION 6
-#define STATE_FIRST_VISIBLE 7
-#define STATE_COUNT 8
-#define STATE_TOUCH 9
-
-
-float filter(float val, float target, float str)
-{
- float delta = (target - val);
- return val + delta * str;
-}
-
-int main(void* con, int ft, int launchID)
-{
- int rowCount;
- int row;
- int col;
- int imageID;
- int done = loadI32(0, STATE_DONE);
- int selectedID = loadI32(0, STATE_SELECTION);
-
- float f = loadF(2, 0);
-
- pfClearColor(0.0f, 0.0f, 0.0f, f);
- if (done) {
- if (f > 0.02f) {
- //f = f - 0.02f;
- //storeF(2, 0, f);
- }
- } else {
- if (f < 0.8f) {
- f = f + 0.02f;
- storeF(2, 0, f);
- }
- }
-
- float touchCut = 1.f;
- if (loadI32(0, STATE_TOUCH)) {
- touchCut = 4.f;
- }
-
-
- float targetZoom = ((float)loadI32(0, STATE_ZOOM)) / 1000.f;
- float zoom = filter(loadF(2, SCRATCH_ZOOM), targetZoom, 0.15 * touchCut);
- storeF(2, SCRATCH_ZOOM, zoom);
-
- float targetRot = loadI32(0, STATE_FIRST_VISIBLE) / 180.0f * 3.14f;
- targetRot = targetRot * 0.80f - .12f;
- float drawRot = filter(loadF(2, SCRATCH_ROT), targetRot, 0.1f * touchCut);
- storeF(2, SCRATCH_ROT, drawRot);
-
- float diam = 8.f;
- float scale = 1.0f / zoom;
-
- // Bug makes 1.0f alpha fail.
- color(1.0f, 1.0f, 1.0f, 0.99f);
-
- float rot = drawRot * scale;
- float rotStep = 16.0f / 180.0f * 3.14f * scale;
- rowCount = 4;
- int index = 0;
- int iconCount = loadI32(0, STATE_COUNT);
- while (iconCount) {
- float tmpSin = sinf(rot);
- float tmpCos = cosf(rot);
- //debugF("rot", rot);
-
- float tx1 = tmpSin * diam - (tmpCos * scale * 0.9f);
- float tx2 = tx1 + (tmpCos * scale * 1.8f);
- float tz1 = tmpCos * diam + (tmpSin * scale * 0.9f);
- float tz2 = tz1 - (tmpSin * scale * 1.8f);
-
- int y;
- for (y = rowCount -1; (y >= 0) && iconCount; y--) {
- float ty1 = ((y * 3.1f) - 5.f) * scale;
- float ty2 = ty1 + scale * 1.8f;
- bindTexture(NAMED_PF, 0, loadI32(1, index));
- drawQuad(tx1, ty1, tz1,
- tx2, ty1, tz2,
- tx2, ty2, tz2,
- tx1, ty2, tz1);
-
- iconCount--;
- index++;
- }
- rot = rot + rotStep;
- }
-
- if ((zoom < 1.1f) && (zoom > 0.9f)) {
- bindProgramVertex(NAMED_PVOrtho);
- bindProgramFragment(NAMED_PFText);
- bindProgramStore(NAMED_PFSText);
-
- rot = drawRot * scale;
- index = 0;
- iconCount = loadI32(0, STATE_COUNT);
- while (iconCount) {
- int y;
-
- float tx = 240.f + floorf(sinf(rot) * 430.f) - 64.f + 16.f;
-
- float alpha = 2.4f - (fabsf(tx - 240.f + 48.f) / 76.f);
- if (alpha > 0.99f) {
- alpha = 0.99f;
- }
- alpha = alpha * (1.f - (fabsf(zoom - 1.f) * 10.f));
-
- tx = tx + 0.25f;
-
- for (y = rowCount -1; (y >= 0) && iconCount; y--) {
-
- if (alpha > 0) {
- color(1.0f, 1.0f, 1.0f, alpha);
-
- float ty = 605.f - y * 150.f;
-
- ty = ty + 0.25f;
-
- bindTexture(NAMED_PFText, 0, loadI32(3, index));
- drawRect(tx, ty, tx + 128.f, ty + 32.f, 0.5f);
- }
- iconCount--;
- index++;
- }
- rot = rot + rotStep;
- }
-
-
- bindProgramVertex(NAMED_PV);
- bindProgramFragment(NAMED_PF);
- bindProgramStore(NAMED_PFS);
- }
-
- // Draw the selected icon
- color(1.0f, 1.0f, 1.0f, 0.9f);
- rot = drawRot * scale;
- index = 0;
- iconCount = loadI32(0, STATE_COUNT);
- while (iconCount) {
- int y;
- for (y = rowCount -1; (y >= 0) && iconCount; y--) {
- if (index == selectedID) {
-
- float tmpSin = sinf(rot) * scale;
- float tmpCos = cosf(rot) * scale;
- float tx1 = tmpSin * diam * 0.9f - tmpCos * 2.f;
- float tx2 = tx1 + (tmpCos * 4.f);
- float tz1 = tmpCos * diam * 0.9f + tmpSin * 2.f;
- float tz2 = tz1 - (tmpSin * 4.f);
-
- float ty1 = ((y * 3.1f) - 4.5f) * scale;
- float ty2 = ty1 + scale * 4.f;
- bindTexture(NAMED_PF, 0, loadI32(1, index));
- drawQuad(tx1, ty1, tz1,
- tx2, ty1, tz2,
- tx2, ty2, tz2,
- tx1, ty2, tz1);
- }
- iconCount--;
- index++;
- }
- rot = rot + rotStep;
- }
-
- return 1;
-}
-
-
diff --git a/libs/rs/java/Rollo/res/raw/rollo2.c b/libs/rs/java/Rollo/res/raw/rollo2.c
deleted file mode 100644
index 5b5cb2d..0000000
--- a/libs/rs/java/Rollo/res/raw/rollo2.c
+++ /dev/null
@@ -1,155 +0,0 @@
-#pragma version(1)
-#pragma stateVertex(PV)
-#pragma stateFragment(PF)
-#pragma stateStore(PFS)
-
-// Scratch buffer layout
-#define SCRATCH_FADE 0
-#define SCRATCH_ZOOM 1
-#define SCRATCH_ROT 2
-
-//#define STATE_POS_X 0
-#define STATE_DONE 1
-//#define STATE_PRESSURE 2
-#define STATE_ZOOM 3
-//#define STATE_WARP 4
-#define STATE_ORIENTATION 5
-#define STATE_SELECTION 6
-#define STATE_FIRST_VISIBLE 7
-#define STATE_COUNT 8
-#define STATE_TOUCH 9
-
-float filter(float val, float target, float str)
-{
- float delta = (target - val);
- return val + delta * str;
-}
-
-
-int main(void* con, int ft, int launchID)
-{
- int rowCount;
- int imageID;
- int done = loadI32(0, STATE_DONE);
- int selectedID = loadI32(0, STATE_SELECTION);
- int iconCount = loadI32(0, STATE_COUNT);
-
- float f = loadF(2, 0);
-
- float iconSize = 1.f;
- float iconSpacing = 0.2f;
- float z = 4.f;
-
- pfClearColor(0.0f, 0.0f, 0.0f, f);
- if (done) {
- } else {
- if (f < 0.8f) {
- f = f + 0.02f;
- storeF(2, 0, f);
- }
- }
-
- float touchCut = 1.f;
- if (loadI32(0, STATE_TOUCH)) {
- touchCut = 5.f;
- }
-
-
- float targetZoom = ((float)loadI32(0, STATE_ZOOM)) / 1000.f;
- float zoom = filter(loadF(2, SCRATCH_ZOOM), targetZoom, 0.15 * touchCut);
- storeF(2, SCRATCH_ZOOM, zoom);
-
- float targetPos = loadI32(0, STATE_FIRST_VISIBLE) / (-20.0f);
- float pos = filter(loadF(2, SCRATCH_ROT), targetPos, 0.1f * touchCut);
- storeF(2, SCRATCH_ROT, pos);
- pos = pos - 1.f;
-
- color(1.0f, 1.0f, 1.0f, 1.0f);
-
-
- // Draw flat icons first
- int index = ((int)pos) * 4;
- int row;
- int col;
- float xoffset = -0.3f;
- float gridSize = iconSize * 4.f + iconSpacing * 3.f;
- float yoffset = (pos - ((int)pos));
- for (row = 0; row < 4; row ++) {
- float ty1 = (gridSize / 2.f) - ((float)row - yoffset) * (iconSize + iconSpacing) - iconSize;
- float ty2 = ty1 + iconSize;
-
- for (col = 0; (col < 4) && (index < iconCount); col ++) {
- if (index >= 0) {
- bindTexture(NAMED_PF, 0, loadI32(1, index));
- float fcol = col;
- float tx1 = xoffset + (-gridSize / 2.f) + (fcol * (iconSize + iconSpacing));
- float tx2 = tx1 + iconSize;
-
- drawQuad(tx1, ty1, z,
- tx2, ty1, z,
- tx2, ty2, z,
- tx1, ty2, z);
- }
- index++;
- }
- }
-
- // bottom roller
- {
- float roll = (1.f - yoffset) * 0.5f * 3.14f;
- float tmpSin = sinf(roll);
- float tmpCos = cosf(roll);
-
- for (col = 0; (col < 4) && (index < iconCount) && (index >= 0); col ++) {
- float ty2 = (gridSize / 2.f) - ((float)row - yoffset) * (iconSize + iconSpacing);
- float ty1 = ty2 - tmpCos * iconSize;
-
- float tz1 = z + tmpSin * iconSize;
- float tz2 = z;
-
- float tx1 = xoffset + (-gridSize / 2.f) + ((float)col * (iconSize + iconSpacing));
- float tx2 = tx1 + iconSize;
-
- bindTexture(NAMED_PF, 0, loadI32(1, index));
- drawQuad(tx1, ty1, tz1,
- tx2, ty1, tz1,
- tx2, ty2, tz2,
- tx1, ty2, tz2);
- index++;
- }
- }
-
- // Top roller
- {
- index = (((int)pos) * 4) - 4;
- float roll = yoffset * 0.5f * 3.14f;
- float tmpSin = sinf(roll);
- float tmpCos = cosf(roll);
-
- for (col = 0; (col < 4) && (index < iconCount) && (index >= 0); col ++) {
- float ty1 = (gridSize / 2.f) - ((float)-1.f - yoffset) * (iconSize + iconSpacing) - iconSize;
- float ty2 = ty1 + tmpCos * iconSize;
-
- float tz1 = z;
- float tz2 = z + tmpSin * iconSize;
-
- float tx1 = xoffset + (-gridSize / 2.f) + ((float)col * (iconSize + iconSpacing));
- float tx2 = tx1 + iconSize;
-
- bindTexture(NAMED_PF, 0, loadI32(1, index));
- drawQuad(tx1, ty1, tz1,
- tx2, ty1, tz1,
- tx2, ty2, tz2,
- tx1, ty2, tz2);
- index++;
- }
- }
-
-
-
-
- return 1;
-}
-
-
-
diff --git a/libs/rs/java/Rollo/res/raw/settings.png b/libs/rs/java/Rollo/res/raw/settings.png
deleted file mode 100644
index dd2cd95..0000000
--- a/libs/rs/java/Rollo/res/raw/settings.png
+++ /dev/null
Binary files differ
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/Rollo.java b/libs/rs/java/Rollo/src/com/android/rollo/Rollo.java
deleted file mode 100644
index 400d801..0000000
--- a/libs/rs/java/Rollo/src/com/android/rollo/Rollo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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 com.android.rollo;
-
-import android.renderscript.RSSurfaceView;
-import android.renderscript.RenderScript;
-
-import android.app.Activity;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.provider.Settings.System;
-import android.util.Config;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.Window;
-import android.widget.Button;
-import android.widget.ListView;
-
-import java.lang.Runtime;
-
-public class Rollo extends Activity {
- //EventListener mListener = new EventListener();
-
- private static final String LOG_TAG = "libRS_jni";
- private static final boolean DEBUG = false;
- private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
-
- private RolloView mView;
-
- // get the current looper (from your Activity UI thread for instance
-
-
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- // Create our Preview view and set it as the content of our
- // Activity
- mView = new RolloView(this);
- setContentView(mView);
- }
-
- @Override
- protected void onResume() {
- // Ideally a game should implement onResume() and onPause()
- // to take appropriate action when the activity looses focus
- super.onResume();
- mView.onResume();
- }
-
- @Override
- protected void onPause() {
- // Ideally a game should implement onResume() and onPause()
- // to take appropriate action when the activity looses focus
- super.onPause();
- mView.onPause();
-
- Runtime.getRuntime().exit(0);
- }
-
-
- static void log(String message) {
- if (LOG_ENABLED) {
- Log.v(LOG_TAG, message);
- }
- }
-
-
-}
-
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
deleted file mode 100644
index ff89bc3..0000000
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * 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 com.android.rollo;
-
-import java.io.Writer;
-
-import android.renderscript.RenderScript;
-import android.renderscript.ProgramVertex;
-import android.renderscript.Element;
-import android.renderscript.Allocation;
-import android.renderscript.Script;
-import android.renderscript.ScriptC;
-import android.renderscript.ProgramFragment;
-import android.renderscript.ProgramStore;
-import android.renderscript.Sampler;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.Typeface;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.util.Log;
-
-public class RolloRS {
- //public static final int STATE_SELECTED_ID = 0;
- public static final int STATE_DONE = 1;
- //public static final int STATE_PRESSURE = 2;
- public static final int STATE_ZOOM = 3;
- //public static final int STATE_WARP = 4;
- public static final int STATE_ORIENTATION = 5;
- public static final int STATE_SELECTION = 6;
- public static final int STATE_FIRST_VISIBLE = 7;
- public static final int STATE_COUNT = 8;
- public static final int STATE_TOUCH = 9;
-
-
- public RolloRS() {
- }
-
- public void init(RenderScript rs, Resources res, int width, int height) {
- mRS = rs;
- mRes = res;
- mWidth = width;
- mHeight = height;
- initNamed();
- initRS();
- }
-
- public void setPosition(float column) {
- mAllocStateBuf[STATE_FIRST_VISIBLE] = (int)(column * (-20));
- mAllocState.data(mAllocStateBuf);
- }
-
- public void setTouch(boolean touch) {
- mAllocStateBuf[STATE_TOUCH] = touch ? 1 : 0;
- mAllocState.data(mAllocStateBuf);
- }
-
- public void setZoom(float z) {
- //Log.e("rs", "zoom " + Float.toString(z));
-
- mAllocStateBuf[STATE_ZOOM] = (int)(z * 1000.f);
- mAllocState.data(mAllocStateBuf);
- }
-
- public void setSelected(int index) {
- //Log.e("rs", "setSelected " + Integer.toString(index));
-
- mAllocStateBuf[STATE_SELECTION] = index;
- mAllocStateBuf[STATE_DONE] = 1;
- mAllocState.data(mAllocStateBuf);
- }
-
- private int mWidth;
- private int mHeight;
-
- private Resources mRes;
- private RenderScript mRS;
- private Script mScript;
- private Sampler mSampler;
- private Sampler mSamplerText;
- private ProgramStore mPSBackground;
- private ProgramStore mPSText;
- private ProgramFragment mPFImages;
- private ProgramFragment mPFText;
- private ProgramVertex mPV;
- private ProgramVertex.MatrixAllocation mPVAlloc;
- private ProgramVertex mPVOrtho;
- private ProgramVertex.MatrixAllocation mPVOrthoAlloc;
- private Allocation[] mIcons;
- private Allocation[] mLabels;
-
- private int[] mAllocStateBuf;
- private Allocation mAllocState;
-
- private int[] mAllocIconIDBuf;
- private Allocation mAllocIconID;
-
- private int[] mAllocLabelIDBuf;
- private Allocation mAllocLabelID;
-
- private int[] mAllocScratchBuf;
- private Allocation mAllocScratch;
-
- private void initNamed() {
- Sampler.Builder sb = new Sampler.Builder(mRS);
- sb.setMin(Sampler.Value.LINEAR);//_MIP_LINEAR);
- sb.setMag(Sampler.Value.LINEAR);
- sb.setWrapS(Sampler.Value.CLAMP);
- sb.setWrapT(Sampler.Value.CLAMP);
- mSampler = sb.create();
-
- sb.setMin(Sampler.Value.NEAREST);
- sb.setMag(Sampler.Value.NEAREST);
- mSamplerText = sb.create();
-
-
- ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null);
- bf.setTexEnable(true, 0);
- bf.setTexEnvMode(ProgramFragment.EnvMode.MODULATE, 0);
- mPFImages = bf.create();
- mPFImages.setName("PF");
- mPFImages.bindSampler(mSampler, 0);
-
- bf.setTexEnvMode(ProgramFragment.EnvMode.MODULATE, 0);
- mPFText = bf.create();
- mPFText.setName("PFText");
- mPFText.bindSampler(mSamplerText, 0);
-
- ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
- bs.setDepthFunc(ProgramStore.DepthFunc.LESS);
- bs.setDitherEnable(false);
- bs.setDepthMask(true);
- bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
- ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
- mPSBackground = bs.create();
- mPSBackground.setName("PFS");
-
- bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
- bs.setDepthMask(false);
- bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
- ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
- mPSText = bs.create();
- mPSText.setName("PFSText");
-
- mPVAlloc = new ProgramVertex.MatrixAllocation(mRS);
- mPVAlloc.setupProjectionNormalized(mWidth, mHeight);
-
- ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
- mPV = pvb.create();
- mPV.setName("PV");
- mPV.bindAllocation(mPVAlloc);
-
- mPVOrthoAlloc = new ProgramVertex.MatrixAllocation(mRS);
- mPVOrthoAlloc.setupOrthoWindow(mWidth, mHeight);
-
- pvb.setTextureMatrixEnable(true);
- mPVOrtho = pvb.create();
- mPVOrtho.setName("PVOrtho");
- mPVOrtho.bindAllocation(mPVOrthoAlloc);
-
- mRS.contextBindProgramVertex(mPV);
-
- mAllocScratchBuf = new int[32];
- mAllocScratch = Allocation.createSized(mRS,
- Element.USER_I32(mRS), mAllocScratchBuf.length);
- mAllocScratch.data(mAllocScratchBuf);
-
- Log.e("rs", "Done loading named");
-
-
-
- {
- mIcons = new Allocation[29];
- mAllocIconIDBuf = new int[mIcons.length];
- mAllocIconID = Allocation.createSized(mRS,
- Element.USER_I32(mRS), mAllocIconIDBuf.length);
-
- mLabels = new Allocation[29];
- mAllocLabelIDBuf = new int[mLabels.length];
- mAllocLabelID = Allocation.createSized(mRS,
- Element.USER_I32(mRS), mLabels.length);
-
- Element ie8888 = Element.RGBA_8888(mRS);
-
- mIcons[0] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.browser, ie8888, true);
- mIcons[1] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.market, ie8888, true);
- mIcons[2] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.photos, ie8888, true);
- mIcons[3] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.settings, ie8888, true);
- mIcons[4] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.calendar, ie8888, true);
- mIcons[5] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.g1155, ie8888, true);
- mIcons[6] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.g2140, ie8888, true);
- mIcons[7] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.maps, ie8888, true);
- mIcons[8] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path431, ie8888, true);
- mIcons[9] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path676, ie8888, true);
- mIcons[10] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path754, ie8888, true);
- mIcons[11] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path815, ie8888, true);
- mIcons[12] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path1920, ie8888, true);
- mIcons[13] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path1927, ie8888, true);
- mIcons[14] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path3099, ie8888, true);
- mIcons[15] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path3950, ie8888, true);
- mIcons[16] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path4481, ie8888, true);
- mIcons[17] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.path5168, ie8888, true);
- mIcons[18] = Allocation.createFromBitmapResource(mRS, mRes, R.raw.polygon2408, ie8888, true);
-
- mLabels[0] = makeTextBitmap("browser");
- mLabels[1] = makeTextBitmap("market");
- mLabels[2] = makeTextBitmap("photos");
- mLabels[3] = makeTextBitmap("settings");
- mLabels[4] = makeTextBitmap("calendar");
- mLabels[5] = makeTextBitmap("g1155");
- mLabels[6] = makeTextBitmap("g2140");
- mLabels[7] = makeTextBitmap("maps");
- mLabels[8] = makeTextBitmap("path431");
- mLabels[9] = makeTextBitmap("path676");
- mLabels[10] = makeTextBitmap("path754");
- mLabels[11] = makeTextBitmap("path815");
- mLabels[12] = makeTextBitmap("path1920");
- mLabels[13] = makeTextBitmap("path1927");
- mLabels[14] = makeTextBitmap("path3099");
- mLabels[15] = makeTextBitmap("path3950");
- mLabels[16] = makeTextBitmap("path4481");
- mLabels[17] = makeTextBitmap("path5168");
- mLabels[18] = makeTextBitmap("polygon2408");
-
- mIcons[19] = mIcons[0];
- mIcons[20] = mIcons[1];
- mIcons[21] = mIcons[2];
- mIcons[22] = mIcons[3];
- mIcons[23] = mIcons[4];
- mIcons[24] = mIcons[5];
- mIcons[25] = mIcons[6];
- mIcons[26] = mIcons[7];
- mIcons[27] = mIcons[8];
- mIcons[28] = mIcons[9];
-
- mLabels[19] = mLabels[0];
- mLabels[20] = mLabels[1];
- mLabels[21] = mLabels[2];
- mLabels[22] = mLabels[3];
- mLabels[23] = mLabels[4];
- mLabels[24] = mLabels[5];
- mLabels[25] = mLabels[6];
- mLabels[26] = mLabels[7];
- mLabels[27] = mLabels[8];
- mLabels[28] = mLabels[9];
-
- for(int ct=0; ct < mIcons.length; ct++) {
- mIcons[ct].uploadToTexture(0);
- mLabels[ct].uploadToTexture(0);
- mAllocIconIDBuf[ct] = mIcons[ct].getID();
- mAllocLabelIDBuf[ct] = mLabels[ct].getID();
- }
- mAllocIconID.data(mAllocIconIDBuf);
- mAllocLabelID.data(mAllocLabelIDBuf);
- }
-
- }
-
- Allocation makeTextBitmap(String t) {
- Bitmap b = Bitmap.createBitmap(128, 32, Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(b);
- Paint p = new Paint();
- p.setTypeface(Typeface.DEFAULT_BOLD);
- p.setTextSize(20);
- p.setColor(0xffffffff);
- c.drawText(t, 2, 26, p);
- return Allocation.createFromBitmap(mRS, b, Element.RGBA_8888(mRS), true);
- }
-
-
- private void initRS() {
- ScriptC.Builder sb = new ScriptC.Builder(mRS);
- sb.setScript(mRes, R.raw.rollo);
- //sb.setScript(mRes, R.raw.rollo2);
- sb.setRoot(true);
- mScript = sb.create();
- mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-
- mAllocStateBuf = new int[] {0, 0, 0, 8, 0, 0, -1, 0, mAllocIconIDBuf.length, 0, 0};
- mAllocState = Allocation.createSized(mRS,
- Element.USER_I32(mRS), mAllocStateBuf.length);
- mScript.bindAllocation(mAllocState, 0);
- mScript.bindAllocation(mAllocIconID, 1);
- mScript.bindAllocation(mAllocScratch, 2);
- mScript.bindAllocation(mAllocLabelID, 3);
- setPosition(0);
- setZoom(1);
-
- //RenderScript.File f = mRS.fileOpen("/sdcard/test.a3d");
-
- mRS.contextBindRootScript(mScript);
- }
-}
-
-
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
deleted file mode 100644
index 7524a0e..0000000
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * 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 com.android.rollo;
-
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.concurrent.Semaphore;
-import java.lang.Float;
-
-import android.renderscript.RSSurfaceView;
-import android.renderscript.RenderScript;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Surface;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.graphics.PixelFormat;
-
-
-public class RolloView extends RSSurfaceView {
- public RolloView(Context context) {
- super(context);
- setFocusable(true);
- getHolder().setFormat(PixelFormat.TRANSLUCENT);
- }
-
- private RenderScript mRS;
- private RolloRS mRender;
-
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- super.surfaceChanged(holder, format, w, h);
-
- mRS = createRenderScript(false);
- mRender = new RolloRS();
- mRender.init(mRS, getResources(), w, h);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {
- // break point at here
- // this method doesn't work when 'extends View' include 'extends ScrollView'.
- return super.onKeyDown(keyCode, event);
- }
-
- boolean mControlMode = false;
- boolean mZoomMode = false;
- boolean mFlingMode = false;
- float mFlingX = 0;
- float mFlingY = 0;
- float mColumn = -1;
- float mOldColumn;
- float mZoom = 1;
-
- int mIconCount = 29;
- int mRows = 4;
- int mColumns = (mIconCount + mRows - 1) / mRows;
-
- float mMaxZoom = ((float)mColumns) / 3.f;
-
-
- void setColumn(boolean clamp)
- {
- //Log.e("rs", " col = " + Float.toString(mColumn));
- float c = mColumn;
- if(c > (mColumns -2)) {
- c = (mColumns -2);
- }
- if(c < 0) {
- c = 0;
- }
- mRender.setPosition(c);
- if(clamp) {
- mColumn = c;
- }
- }
-
- void computeSelection(float x, float y)
- {
- float col = mColumn + (x - 0.5f) * 4 + 1.25f;
- int iCol = (int)(col + 0.25f);
-
- float row = (y / 0.8f) * mRows;
- int iRow = (int)(row - 0.5f);
-
- mRender.setSelected(iCol * mRows + iRow);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev)
- {
- boolean ret = true;
- int act = ev.getAction();
- if (act == ev.ACTION_UP) {
- ret = false;
- }
-
- float nx = ev.getX() / getWidth();
- float ny = ev.getY() / getHeight();
-
- //Log.e("rs", "width=" + Float.toString(getWidth()));
- //Log.e("rs", "height=" + Float.toString(getHeight()));
-
- mRender.setTouch(ret);
-
- if((ny > 0.85f) || mControlMode) {
- mFlingMode = false;
-
- // Projector control
- if((nx > 0.2f) && (nx < 0.8f) || mControlMode) {
- if(act != ev.ACTION_UP) {
- float zoom = mMaxZoom;
- if(mControlMode) {
- if(!mZoomMode) {
- zoom = 1.f;
- }
- float dx = nx - mFlingX;
-
- if((ny < 0.9) && mZoomMode) {
- zoom = mMaxZoom - ((0.9f - ny) * 10.f);
- if(zoom < 1) {
- zoom = 1;
- mZoomMode = false;
- }
- mOldColumn = mColumn;
- }
- mColumn += dx * 4;// * zoom;
- if(zoom > 1.01f) {
- mColumn += (mZoom - zoom) * (nx - 0.5f) * 4 * zoom;
- }
- } else {
- mOldColumn = mColumn;
- mColumn = ((float)mColumns) / 2;
- mControlMode = true;
- mZoomMode = true;
- }
- mZoom = zoom;
- mFlingX = nx;
- mRender.setZoom(zoom);
- if(mZoom < 1.01f) {
- computeSelection(nx, ny);
- }
- } else {
- mControlMode = false;
- mColumn = mOldColumn;
- mRender.setZoom(1.f);
- mRender.setSelected(-1);
- }
- } else {
- // Do something with corners here....
- }
- setColumn(true);
-
- } else {
- // icon control
- if(act != ev.ACTION_UP) {
- if(mFlingMode) {
- mColumn += (mFlingX - nx) * 4;
- setColumn(true);
- }
- mFlingMode = true;
- mFlingX = nx;
- mFlingY = ny;
- } else {
- mFlingMode = false;
- mColumn = (float)(java.lang.Math.floor(mColumn * 0.25f + 0.3f) * 4.f) + 1.f;
- setColumn(true);
- }
- }
-
-
- return ret;
- }
-
- @Override
- public boolean onTrackballEvent(MotionEvent ev)
- {
- float x = ev.getX();
- float y = ev.getY();
- //Float tx = new Float(x);
- //Float ty = new Float(y);
- //Log.e("rs", "tbe " + tx.toString() + ", " + ty.toString());
-
-
- return true;
- }
-
-}
-
-
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index a4e72d9..ac115d3 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -20,16 +20,6 @@
param RsProgramRaster pgm
}
-ContextSetDefineF {
- param const char* name
- param float value
- }
-
-ContextSetDefineI32 {
- param const char* name
- param int32_t value
- }
-
ContextPause {
}
@@ -60,18 +50,19 @@
param void *obj
}
-ElementBegin {
-}
-
-ElementAdd {
- param RsDataKind dataKind
- param RsDataType dataType
- param bool isNormalized
- param size_t bits
- param const char * name
+ElementCreate {
+ param RsDataType mType
+ param RsDataKind mKind
+ param bool mNormalized
+ param uint32_t mVectorSize
+ ret RsElement
}
-ElementCreate {
+ElementCreate2 {
+ param size_t count
+ param const RsElement * elements
+ param const char ** names
+ param const size_t * nameLengths
ret RsElement
}
@@ -366,56 +357,50 @@
}
-ProgramFragmentBegin {
- param RsElement in
- param RsElement out
- param bool pointSpriteEnable
+ProgramBindConstants {
+ param RsProgram vp
+ param uint32_t slot
+ param RsAllocation constants
}
-ProgramFragmentBindTexture {
+
+ProgramBindTexture {
param RsProgramFragment pf
param uint32_t slot
param RsAllocation a
}
-ProgramFragmentBindSampler {
+ProgramBindSampler {
param RsProgramFragment pf
param uint32_t slot
param RsSampler s
}
-ProgramFragmentSetSlot {
- param uint32_t slot
- param bool enable
- param RsTexEnvMode env
- param RsType t
- }
-
ProgramFragmentCreate {
+ param const uint32_t * params
+ param uint32_t paramLength
ret RsProgramFragment
}
-
-ProgramVertexBegin {
- param RsElement in
- param RsElement out
+ProgramFragmentCreate2 {
+ param const char * shaderText
+ param uint32_t shaderLength
+ param const uint32_t * params
+ param uint32_t paramLength
+ ret RsProgramFragment
}
ProgramVertexCreate {
+ param bool texMat
ret RsProgramVertex
}
-ProgramVertexBindAllocation {
- param RsProgramVertex vpgm
- param RsAllocation constants
- }
-
-ProgramVertexSetTextureMatrixEnable {
- param bool enable
- }
-
-ProgramVertexAddLight {
- param RsLight light
+ProgramVertexCreate2 {
+ param const char * shaderText
+ param uint32_t shaderLength
+ param const uint32_t * params
+ param uint32_t paramLength
+ ret RsProgramVertex
}
LightBegin {
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index ff8d29f..b4ec1a2 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -38,9 +38,9 @@
mIsTexture = false;
mTextureID = 0;
-
mIsVertexBuffer = false;
mBufferID = 0;
+ mUploadDefered = false;
mType.set(type);
rsAssert(type);
@@ -88,13 +88,26 @@
return false;
}
-void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset)
+void Allocation::deferedUploadToTexture(const Context *rsc, uint32_t lodOffset)
+{
+ rsAssert(lodOffset < mType->getLODCount());
+ mIsTexture = true;
+ mTextureLOD = lodOffset;
+ mUploadDefered = true;
+}
+
+void Allocation::uploadToTexture(const Context *rsc)
{
//rsAssert(!mTextureId);
- rsAssert(lodOffset < mType->getLODCount());
- GLenum type = mType->getElement()->getGLType();
- GLenum format = mType->getElement()->getGLFormat();
+ mIsTexture = true;
+ if (!rsc->checkDriver()) {
+ mUploadDefered = true;
+ return;
+ }
+
+ GLenum type = mType->getElement()->getComponent().getGLType();
+ GLenum format = mType->getElement()->getComponent().getGLFormat();
if (!type || !format) {
return;
@@ -109,15 +122,16 @@
// Force a crash to 1: restart the app, 2: make sure we get a bugreport.
LOGE("Upload to texture failed to gen mTextureID");
rsc->dumpDebug();
- ((char *)0)[0] = 0;
+ mUploadDefered = true;
+ return;
}
}
glBindTexture(GL_TEXTURE_2D, mTextureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
Adapter2D adapt(getContext(), this);
- for(uint32_t lod = 0; (lod + lodOffset) < mType->getLODCount(); lod++) {
- adapt.setLOD(lod+lodOffset);
+ for(uint32_t lod = 0; (lod + mTextureLOD) < mType->getLODCount(); lod++) {
+ adapt.setLOD(lod+mTextureLOD);
uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0));
glTexImage2D(GL_TEXTURE_2D, lod, format,
@@ -126,19 +140,50 @@
}
}
-void Allocation::uploadToBufferObject()
+void Allocation::deferedUploadToBufferObject(const Context *rsc)
+{
+ mIsVertexBuffer = true;
+ mUploadDefered = true;
+}
+
+void Allocation::uploadToBufferObject(const Context *rsc)
{
rsAssert(!mType->getDimY());
rsAssert(!mType->getDimZ());
+ mIsVertexBuffer = true;
+ if (!rsc->checkDriver()) {
+ mUploadDefered = true;
+ return;
+ }
+
if (!mBufferID) {
glGenBuffers(1, &mBufferID);
}
+ if (!mBufferID) {
+ LOGE("Upload to buffer object failed");
+ mUploadDefered = true;
+ return;
+ }
+
glBindBuffer(GL_ARRAY_BUFFER, mBufferID);
glBufferData(GL_ARRAY_BUFFER, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
+void Allocation::uploadCheck(const Context *rsc)
+{
+ if (mUploadDefered) {
+ mUploadDefered = false;
+ if (mIsVertexBuffer) {
+ uploadToBufferObject(rsc);
+ }
+ if (mIsTexture) {
+ uploadToTexture(rsc);
+ }
+ }
+}
+
void Allocation::data(const void *data, uint32_t sizeBytes)
{
@@ -148,6 +193,8 @@
return;
}
memcpy(mPtr, data, size);
+ sendDirty();
+ mUploadDefered = true;
}
void Allocation::read(void *data)
@@ -168,6 +215,8 @@
return;
}
memcpy(ptr, data, size);
+ sendDirty();
+ mUploadDefered = true;
}
void Allocation::subData(uint32_t xoff, uint32_t yoff,
@@ -192,6 +241,8 @@
src += lineSize;
dst += destW * eSize;
}
+ sendDirty();
+ mUploadDefered = true;
}
void Allocation::subData(uint32_t xoff, uint32_t yoff, uint32_t zoff,
@@ -199,6 +250,22 @@
{
}
+void Allocation::addProgramToDirty(const Program *p)
+{
+ mToDirtyList.add(p);
+}
+
+void Allocation::removeProgramToDirty(const Program *p)
+{
+ for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
+ if (mToDirtyList[ct] == p) {
+ mToDirtyList.removeAt(ct);
+ return;
+ }
+ }
+ rsAssert(0);
+}
+
void Allocation::dumpLOGV(const char *prefix) const
{
ObjectBase::dumpLOGV(prefix);
@@ -215,9 +282,14 @@
LOGV("%s allocation mIsTexture=%i mTextureID=%i, mIsVertexBuffer=%i, mBufferID=%i",
prefix, mIsTexture, mTextureID, mIsVertexBuffer, mBufferID);
-
}
+void Allocation::sendDirty() const
+{
+ for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
+ mToDirtyList[ct]->forceDirty();
+ }
+}
/////////////////
//
@@ -247,13 +319,13 @@
void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, uint32_t baseMipLevel)
{
Allocation *alloc = static_cast<Allocation *>(va);
- alloc->uploadToTexture(rsc, baseMipLevel);
+ alloc->deferedUploadToTexture(rsc, baseMipLevel);
}
void rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va)
{
Allocation *alloc = static_cast<Allocation *>(va);
- alloc->uploadToBufferObject();
+ alloc->deferedUploadToBufferObject(rsc);
}
static void mip565(const Adapter2D &out, const Adapter2D &in)
@@ -350,10 +422,10 @@
static ElementConverter_t pickConverter(const Element *dst, const Element *src)
{
- GLenum srcGLType = src->getGLType();
- GLenum srcGLFmt = src->getGLFormat();
- GLenum dstGLType = dst->getGLType();
- GLenum dstGLFmt = dst->getGLFormat();
+ GLenum srcGLType = src->getComponent().getGLType();
+ GLenum srcGLFmt = src->getComponent().getGLFormat();
+ GLenum dstGLType = dst->getComponent().getGLType();
+ GLenum dstGLFmt = dst->getComponent().getGLFormat();
if (srcGLFmt == dstGLFmt && srcGLType == dstGLType) {
switch(dst->getSizeBytes()) {
@@ -391,8 +463,9 @@
{
const Element *src = static_cast<const Element *>(_src);
const Element *dst = static_cast<const Element *>(_dst);
- rsAssert(!(w & (w-1)));
- rsAssert(!(h & (h-1)));
+
+ // Check for pow2 on pre es 2.0 versions.
+ rsAssert(rsc->checkVersion2_0() || (!(w & (w-1)) && !(h & (h-1))));
//LOGE("rsi_AllocationCreateFromBitmap %i %i %i %i %i", w, h, dstFmt, srcFmt, genMips);
rsi_TypeBegin(rsc, _dst);
@@ -452,31 +525,24 @@
RsAllocation ret = rsi_AllocationCreateFromBitmap(rsc, w2, h2, _dst, _src, genMips, tmp);
free(tmp);
return ret;
-
-
-
-
}
void rsi_AllocationData(Context *rsc, RsAllocation va, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
a->data(data, sizeBytes);
- rsc->allocationCheck(a);
}
void rsi_Allocation1DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
a->subData(xoff, count, data, sizeBytes);
- rsc->allocationCheck(a);
}
void rsi_Allocation2DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
a->subData(xoff, yoff, w, h, data, sizeBytes);
- rsc->allocationCheck(a);
}
void rsi_AllocationRead(Context *rsc, RsAllocation va, void *data)
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index f54284a..f0b2122 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -23,7 +23,7 @@
namespace android {
namespace renderscript {
-
+class Program;
class Allocation : public ObjectBase
{
@@ -46,10 +46,12 @@
void * getPtr() const {return mPtr;}
const Type * getType() const {return mType.get();}
- void uploadToTexture(Context *rsc, uint32_t lodOffset = 0);
+ void deferedUploadToTexture(const Context *rsc, uint32_t lodOffset);
+ void uploadToTexture(const Context *rsc);
uint32_t getTextureID() const {return mTextureID;}
- void uploadToBufferObject();
+ void deferedUploadToBufferObject(const Context *rsc);
+ void uploadToBufferObject(const Context *rsc);
uint32_t getBufferObjectID() const {return mBufferID;}
@@ -65,13 +67,21 @@
void enableGLVertexBuffers() const;
void setupGLIndexBuffers() const;
+ void addProgramToDirty(const Program *);
+ void removeProgramToDirty(const Program *);
+
virtual void dumpLOGV(const char *prefix) const;
+ virtual void uploadCheck(const Context *rsc);
protected:
+ void sendDirty() const;
+
ObjectBaseRef<const Type> mType;
void * mPtr;
+ Vector<const Program *> mToDirtyList;
+
// Usage restrictions
bool mCpuWrite;
bool mCpuRead;
@@ -88,6 +98,7 @@
// Is this a legal structure to be used as a texture source.
// Initially this will require 1D or 2D and color data
bool mIsTexture;
+ uint32_t mTextureLOD;
uint32_t mTextureID;
// Is this a legal structure to be used as a vertex source.
@@ -95,6 +106,8 @@
// is allowed.
bool mIsVertexBuffer;
uint32_t mBufferID;
+
+ bool mUploadDefered;
};
}
diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp
index de074c8..15a56f7 100644
--- a/libs/rs/rsComponent.cpp
+++ b/libs/rs/rsComponent.cpp
@@ -15,96 +15,323 @@
*/
#include "rsComponent.h"
+
#include <GLES/gl.h>
using namespace android;
using namespace android::renderscript;
-
-Component::Component(Context *rsc) : ObjectBase(rsc)
+Component::Component()
{
- mAllocFile = __FILE__;
- mAllocLine = __LINE__;
- mType = FLOAT;
- mKind = USER;
- mIsNormalized = false;
- mBits = 0;
-}
-
-Component::Component(Context *rsc,
- DataKind dk, DataType dt,
- bool isNormalized, uint32_t bits, const char * name) : ObjectBase(rsc)
-{
- mAllocFile = __FILE__;
- mAllocLine = __LINE__;
- mType = dt;
- mKind = dk;
- mIsNormalized = isNormalized;
- mBits = bits;
- if (name) {
- mName = name;
- }
-}
-
-const char * Component::getCType() const
-{
- switch(mType) {
- case FLOAT:
- return "float";
- case SIGNED:
- case UNSIGNED:
- switch(mBits) {
- case 32:
- return "int";
- case 16:
- return "short";
- case 8:
- return "char";
- }
- break;
- }
- return NULL;
+ set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
}
Component::~Component()
{
}
-uint32_t Component::getGLType() const
+void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize)
{
- switch(mType) {
- case RS_TYPE_FLOAT:
- rsAssert(mBits == 32);
- return GL_FLOAT;
- case RS_TYPE_SIGNED:
- switch(mBits) {
- case 32:
- return 0;//GL_INT;
- case 16:
- return GL_SHORT;
- case 8:
- return GL_BYTE;
- }
+ mType = dt;
+ mKind = dk;
+ mNormalized = norm;
+ mVectorSize = vecSize;
+ rsAssert(vecSize <= 4);
+
+ mBits = 0;
+ mTypeBits = 0;
+ mIsFloat = false;
+ mIsSigned = false;
+ mIsPixel = false;
+
+ switch(mKind) {
+ case RS_KIND_PIXEL_L:
+ case RS_KIND_PIXEL_A:
+ mIsPixel = true;
+ rsAssert(mVectorSize == 1);
+ rsAssert(mNormalized == true);
break;
- case RS_TYPE_UNSIGNED:
- switch(mBits) {
- case 32:
- return 0;//GL_UNSIGNED_INT;
- case 16:
- return GL_UNSIGNED_SHORT;
- case 8:
- return GL_UNSIGNED_BYTE;
- }
+ case RS_KIND_PIXEL_LA:
+ mIsPixel = true;
+ rsAssert(mVectorSize == 2);
+ rsAssert(mNormalized == true);
+ break;
+ case RS_KIND_PIXEL_RGB:
+ mIsPixel = true;
+ rsAssert(mVectorSize == 3);
+ rsAssert(mNormalized == true);
+ break;
+ case RS_KIND_PIXEL_RGBA:
+ mIsPixel = true;
+ rsAssert(mVectorSize == 4);
+ rsAssert(mNormalized == true);
+ break;
+ default:
break;
}
- //rsAssert(!"Bad type");
- //LOGE("mType %i, mKind %i, mBits %i, mIsNormalized %i", mType, mKind, mBits, mIsNormalized);
+
+ switch(mType) {
+ case RS_TYPE_NONE:
+ return;
+ case RS_TYPE_UNSIGNED_5_6_5:
+ mVectorSize = 3;
+ mBits = 16;
+ mNormalized = true;
+ rsAssert(mKind == RS_KIND_PIXEL_RGB);
+ return;
+ case RS_TYPE_UNSIGNED_5_5_5_1:
+ mVectorSize = 4;
+ mBits = 16;
+ mNormalized = true;
+ rsAssert(mKind == RS_KIND_PIXEL_RGBA);
+ return;
+ case RS_TYPE_UNSIGNED_4_4_4_4:
+ mVectorSize = 4;
+ mBits = 16;
+ mNormalized = true;
+ rsAssert(mKind == RS_KIND_PIXEL_RGBA);
+ return;
+ case RS_TYPE_ELEMENT:
+ case RS_TYPE_TYPE:
+ case RS_TYPE_ALLOCATION:
+ case RS_TYPE_SAMPLER:
+ case RS_TYPE_SCRIPT:
+ case RS_TYPE_MESH:
+ case RS_TYPE_PROGRAM_FRAGMENT:
+ case RS_TYPE_PROGRAM_VERTEX:
+ case RS_TYPE_PROGRAM_RASTER:
+ case RS_TYPE_PROGRAM_STORE:
+ rsAssert(mVectorSize == 1);
+ rsAssert(mNormalized == false);
+ rsAssert(mKind == RS_KIND_USER);
+ mBits = 32;
+ mTypeBits = 32;
+ return;
+
+ case RS_TYPE_FLOAT_16:
+ mTypeBits = 16;
+ mIsFloat = true;
+ break;
+ case RS_TYPE_FLOAT_32:
+ mTypeBits = 32;
+ mIsFloat = true;
+ break;
+ case RS_TYPE_FLOAT_64:
+ mTypeBits = 64;
+ mIsFloat = true;
+ break;
+ case RS_TYPE_SIGNED_8:
+ mTypeBits = 8;
+ mIsSigned = true;
+ break;
+ case RS_TYPE_SIGNED_16:
+ mTypeBits = 16;
+ mIsSigned = true;
+ break;
+ case RS_TYPE_SIGNED_32:
+ mTypeBits = 32;
+ mIsSigned = true;
+ break;
+ case RS_TYPE_SIGNED_64:
+ mTypeBits = 64;
+ mIsSigned = true;
+ break;
+ case RS_TYPE_UNSIGNED_8:
+ mTypeBits = 8;
+ break;
+ case RS_TYPE_UNSIGNED_16:
+ mTypeBits = 16;
+ break;
+ case RS_TYPE_UNSIGNED_32:
+ mTypeBits = 32;
+ break;
+ case RS_TYPE_UNSIGNED_64:
+ mTypeBits = 64;
+ break;
+ }
+
+ mBits = mTypeBits * mVectorSize;
+}
+
+
+
+
+uint32_t Component::getGLType() const
+{
+ switch (mType) {
+ case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
+ case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
+ case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
+
+ //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
+ case RS_TYPE_FLOAT_32: return GL_FLOAT;
+ case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
+ case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
+ case RS_TYPE_SIGNED_8: return GL_BYTE;
+ case RS_TYPE_SIGNED_16: return GL_SHORT;
+ default: break;
+ }
+
return 0;
}
+uint32_t Component::getGLFormat() const
+{
+ switch (mKind) {
+ case RS_KIND_PIXEL_L: return GL_LUMINANCE;
+ case RS_KIND_PIXEL_A: return GL_ALPHA;
+ case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
+ case RS_KIND_PIXEL_RGB: return GL_RGB;
+ case RS_KIND_PIXEL_RGBA: return GL_RGBA;
+ default: break;
+ }
+ return 0;
+}
+
+static const char * gCTypeStrings[] = {
+ 0,
+ 0,//"F16",
+ "float",
+ "double",
+ "char",
+ "short",
+ "int",
+ 0,//"S64",
+ "char",//U8",
+ "short",//U16",
+ "int",//U32",
+ 0,//"U64",
+ 0,//"UP_565",
+ 0,//"UP_5551",
+ 0,//"UP_4444",
+ 0,//"ELEMENT",
+ 0,//"TYPE",
+ 0,//"ALLOCATION",
+ 0,//"SAMPLER",
+ 0,//"SCRIPT",
+ 0,//"MESH",
+ 0,//"PROGRAM_FRAGMENT",
+ 0,//"PROGRAM_VERTEX",
+ 0,//"PROGRAM_RASTER",
+ 0,//"PROGRAM_STORE",
+};
+
+static const char * gCVecTypeStrings[] = {
+ 0,
+ 0,//"F16",
+ "vecF32",
+ "vecF64",
+ "vecI8",
+ "vecI16",
+ "vecI32",
+ 0,//"S64",
+ "vecU8",//U8",
+ "vecU16",//U16",
+ "vecU32",//U32",
+ 0,//"U64",
+ 0,//"UP_565",
+ 0,//"UP_5551",
+ 0,//"UP_4444",
+ 0,//"ELEMENT",
+ 0,//"TYPE",
+ 0,//"ALLOCATION",
+ 0,//"SAMPLER",
+ 0,//"SCRIPT",
+ 0,//"MESH",
+ 0,//"PROGRAM_FRAGMENT",
+ 0,//"PROGRAM_VERTEX",
+ 0,//"PROGRAM_RASTER",
+ 0,//"PROGRAM_STORE",
+};
+
+String8 Component::getCType() const
+{
+ char buf[64];
+ if (mVectorSize == 1) {
+ return String8(gCTypeStrings[mType]);
+ }
+
+ // Yuck, acc WAR
+ // Appears to have problems packing chars
+ if (mVectorSize == 4 && mType == RS_TYPE_UNSIGNED_8) {
+ return String8("int");
+ }
+
+
+ String8 s(gCVecTypeStrings[mType]);
+ sprintf(buf, "_%i_t", mVectorSize);
+ s.append(buf);
+ return s;
+}
+
+String8 Component::getGLSLType() const
+{
+ if (mType == RS_TYPE_SIGNED_32) {
+ switch(mVectorSize) {
+ case 1: return String8("int");
+ case 2: return String8("ivec2");
+ case 3: return String8("ivec3");
+ case 4: return String8("ivec4");
+ }
+ }
+ if (mType == RS_TYPE_FLOAT_32) {
+ switch(mVectorSize) {
+ case 1: return String8("float");
+ case 2: return String8("vec2");
+ case 3: return String8("vec3");
+ case 4: return String8("vec4");
+ }
+ }
+ return String8();
+}
+
+static const char * gTypeStrings[] = {
+ "NONE",
+ "F16",
+ "F32",
+ "F64",
+ "S8",
+ "S16",
+ "S32",
+ "S64",
+ "U8",
+ "U16",
+ "U32",
+ "U64",
+ "UP_565",
+ "UP_5551",
+ "UP_4444",
+ "ELEMENT",
+ "TYPE",
+ "ALLOCATION",
+ "SAMPLER",
+ "SCRIPT",
+ "MESH",
+ "PROGRAM_FRAGMENT",
+ "PROGRAM_VERTEX",
+ "PROGRAM_RASTER",
+ "PROGRAM_STORE",
+};
+
+static const char * gKindStrings[] = {
+ "USER",
+ "COLOR",
+ "POSITION",
+ "TEXTURE",
+ "NORMAL",
+ "INDEX",
+ "POINT_SIZE",
+ "PIXEL_L",
+ "PIXEL_A",
+ "PIXEL_LA",
+ "PIXEL_RGB",
+ "PIXEL_RGBA",
+};
+
void Component::dumpLOGV(const char *prefix) const
{
- ObjectBase::dumpLOGV(prefix);
- LOGV("%s component: %i %i %i %i", prefix, mType, mKind, mIsNormalized, mBits);
+ LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
+ prefix, gTypeStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
}
+
diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h
index 5366cc4..71de324 100644
--- a/libs/rs/rsComponent.h
+++ b/libs/rs/rsComponent.h
@@ -14,65 +14,56 @@
* limitations under the License.
*/
-#ifndef ANDROID_RS_STRUCTURED_COMPONENT_H
-#define ANDROID_RS_STRUCTURED_COMPONENT_H
+#ifndef ANDROID_COMPONENT_H
+#define ANDROID_COMPONENT_H
#include "rsUtils.h"
-#include "rsObjectBase.h"
// ---------------------------------------------------------------------------
namespace android {
namespace renderscript {
-class Component : public ObjectBase
+
+// An element is a group of Components that occupies one cell in a structure.
+class Component
{
public:
- enum DataType {
- FLOAT,
- UNSIGNED,
- SIGNED
- };
+ Component();
+ ~Component();
- enum DataKind {
- USER,
- RED, GREEN, BLUE, ALPHA, LUMINANCE, INTENSITY,
- X, Y, Z, W,
- S, T, Q, R,
- NX, NY, NZ,
- INDEX,
- POINT_SIZE
- };
-
-
- Component(Context *rsc, DataKind dk, DataType dt, bool isNorm, uint32_t bits, const char *);
- virtual ~Component();
-
- DataType getType() const {return mType;}
- bool getIsNormalized() const {return mIsNormalized;}
- DataKind getKind() const {return mKind;}
- uint32_t getBits() const {return mBits;}
+ void set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize=1);
uint32_t getGLType() const;
- const char * getCType() const;
+ uint32_t getGLFormat() const;
+ String8 getCType() const;
+ String8 getGLSLType() const;
+ void dumpLOGV(const char *prefix) const;
- const char * getComponentName() const {return mName.string();}
- virtual void dumpLOGV(const char *prefix) const;
+
+ RsDataType getType() const {return mType;}
+ RsDataKind getKind() const {return mKind;}
+ bool getIsNormalized() const {return mNormalized;}
+ uint32_t getVectorSize() const {return mVectorSize;}
+ bool getIsFloat() const {return mIsFloat;}
+ bool getIsSigned() const {return mIsSigned;}
+ uint32_t getBits() const {return mBits;}
protected:
+ RsDataType mType;
+ RsDataKind mKind;
+ bool mNormalized;
+ uint32_t mVectorSize;
- DataType mType;
- bool mIsNormalized;
- DataKind mKind;
+ // derived
uint32_t mBits;
- String8 mName;
-
-private:
- Component(Context *rsc);
+ uint32_t mTypeBits;
+ bool mIsFloat;
+ bool mIsSigned;
+ bool mIsPixel;
};
-
}
}
-#endif //ANDROID_RS_STRUCTURED_COMPONENT_H
+#endif
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 3652f0a..261b827 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -27,6 +27,8 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
#include <cutils/sched_policy.h>
@@ -50,11 +52,12 @@
}
}
-void Context::initEGL()
+void Context::initEGL(bool useGL2)
{
mEGL.mNumConfigs = -1;
EGLint configAttribs[128];
EGLint *configAttribsPtr = configAttribs;
+ EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
memset(configAttribs, 0, sizeof(configAttribs));
@@ -62,6 +65,12 @@
configAttribsPtr[1] = EGL_WINDOW_BIT;
configAttribsPtr += 2;
+ if (useGL2) {
+ configAttribsPtr[0] = EGL_RENDERABLE_TYPE;
+ configAttribsPtr[1] = EGL_OPENGL_ES2_BIT;
+ configAttribsPtr += 2;
+ }
+
if (mUseDepth) {
configAttribsPtr[0] = EGL_DEPTH_SIZE;
configAttribsPtr[1] = 16;
@@ -91,7 +100,11 @@
//eglChooseConfig(mEGL.mDisplay, configAttribs, &mEGL.mConfig, 1, &mEGL.mNumConfigs);
- mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, NULL);
+ if (useGL2) {
+ mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, context_attribs2);
+ } else {
+ mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, NULL);
+ }
checkEglError("eglCreateContext");
if (mEGL.mContext == EGL_NO_CONTEXT) {
LOGE("eglCreateContext returned EGL_NO_CONTEXT");
@@ -129,6 +142,13 @@
return ret;
}
+void Context::checkError(const char *msg) const
+{
+ GLenum err = glGetError();
+ if (err != GL_NO_ERROR) {
+ LOGE("GL Error, 0x%x, from %s", err, msg);
+ }
+}
uint32_t Context::runRootScript()
{
@@ -156,11 +176,7 @@
mStateFragmentStore.mLast.clear();
uint32_t ret = runScript(mRootScript.get(), 0);
- GLenum err = glGetError();
- if (err != GL_NO_ERROR) {
- LOGE("Pending GL Error, 0x%x", err);
- }
-
+ checkError("runRootScript");
return ret;
}
@@ -225,10 +241,20 @@
void Context::setupCheck()
{
- mFragmentStore->setupGL(this, &mStateFragmentStore);
- mFragment->setupGL(this, &mStateFragment);
- mRaster->setupGL(this, &mStateRaster);
- mVertex->setupGL(this, &mStateVertex);
+ if (checkVersion2_0()) {
+ mShaderCache.lookup(this, mVertex.get(), mFragment.get());
+
+ mFragmentStore->setupGL2(this, &mStateFragmentStore);
+ mFragment->setupGL2(this, &mStateFragment, &mShaderCache);
+ mRaster->setupGL2(this, &mStateRaster);
+ mVertex->setupGL2(this, &mStateVertex, &mShaderCache);
+
+ } else {
+ mFragmentStore->setupGL(this, &mStateFragmentStore);
+ mFragment->setupGL(this, &mStateFragment);
+ mRaster->setupGL(this, &mStateRaster);
+ mVertex->setupGL(this, &mStateVertex);
+ }
}
static bool getProp(const char *str)
@@ -248,11 +274,8 @@
rsc->props.mLogTimes = getProp("debug.rs.profile");
rsc->props.mLogScripts = getProp("debug.rs.script");
- rsc->props.mLogObjects = getProp("debug.rs.objects");
-
- //pthread_mutex_lock(&gInitMutex);
- //rsc->initEGL();
- //pthread_mutex_unlock(&gInitMutex);
+ rsc->props.mLogObjects = getProp("debug.rs.object");
+ rsc->props.mLogShaders = getProp("debug.rs.shader");
ScriptTLSStruct *tlsStruct = new ScriptTLSStruct;
if (!tlsStruct) {
@@ -274,6 +297,7 @@
rsc->setFragment(NULL);
rsc->mStateFragmentStore.init(rsc, rsc->mEGL.mWidth, rsc->mEGL.mHeight);
rsc->setFragmentStore(NULL);
+ rsc->mStateVertexArray.init(rsc);
rsc->mRunning = true;
bool mDraw = true;
@@ -319,10 +343,6 @@
rsc->mObjDestroy.mNeedToEmpty = true;
rsc->objDestroyOOBRun();
- glClearColor(0,0,0,0);
- glClear(GL_COLOR_BUFFER_BIT);
- eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface);
-
pthread_mutex_lock(&gInitMutex);
rsc->deinitEGL();
pthread_mutex_unlock(&gInitMutex);
@@ -457,7 +477,7 @@
if (!mEGL.mContext) {
first = true;
pthread_mutex_lock(&gInitMutex);
- initEGL();
+ initEGL(true);
pthread_mutex_unlock(&gInitMutex);
}
@@ -488,15 +508,35 @@
//LOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion);
LOGV("GL Version %s", mGL.mVersion);
- LOGV("GL Vendor %s", mGL.mVendor);
+ //LOGV("GL Vendor %s", mGL.mVendor);
LOGV("GL Renderer %s", mGL.mRenderer);
//LOGV("GL Extensions %s", mGL.mExtensions);
- if ((strlen((const char *)mGL.mVersion) < 12) || memcmp(mGL.mVersion, "OpenGL ES-CM", 12)) {
+ const char *verptr = NULL;
+ if (strlen((const char *)mGL.mVersion) > 9) {
+ if (!memcmp(mGL.mVersion, "OpenGL ES-CM", 12)) {
+ verptr = (const char *)mGL.mVersion + 12;
+ }
+ if (!memcmp(mGL.mVersion, "OpenGL ES ", 10)) {
+ verptr = (const char *)mGL.mVersion + 9;
+ }
+ }
+
+ if (!verptr) {
LOGE("Error, OpenGL ES Lite not supported");
} else {
- sscanf((const char *)mGL.mVersion + 13, "%i.%i", &mGL.mMajorVersion, &mGL.mMinorVersion);
+ sscanf(verptr, " %i.%i", &mGL.mMajorVersion, &mGL.mMinorVersion);
}
+
+ glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &mGL.mMaxVertexAttribs);
+ glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &mGL.mMaxVertexUniformVectors);
+ glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &mGL.mMaxVertexTextureUnits);
+
+ glGetIntegerv(GL_MAX_VARYING_VECTORS, &mGL.mMaxVaryingVectors);
+ glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mGL.mMaxTextureImageUnits);
+
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mGL.mMaxFragmentTextureImageUnits);
+ glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &mGL.mMaxFragmentUniformVectors);
}
}
@@ -544,13 +584,6 @@
}
}
-void Context::allocationCheck(const Allocation *a)
-{
- mVertex->checkUpdatedAllocation(a);
- mFragment->checkUpdatedAllocation(a);
- mFragmentStore->checkUpdatedAllocation(a);
-}
-
void Context::setVertex(ProgramVertex *pv)
{
if (pv == NULL) {
@@ -558,7 +591,6 @@
} else {
mVertex.set(pv);
}
- mVertex->forceDirty();
}
void Context::assignName(ObjectBase *obj, const char *name, uint32_t len)
@@ -600,26 +632,6 @@
}
}
-void Context::appendVarDefines(String8 *str) const
-{
- char buf[256];
- for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
- str->append("#define ");
- str->append(mInt32Defines.keyAt(ct));
- str->append(" ");
- sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
- str->append(buf);
-
- }
- for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
- str->append("#define ");
- str->append(mFloatDefines.keyAt(ct));
- str->append(" ");
- sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
- str->append(buf);
- }
-}
-
bool Context::objDestroyOOBInit()
{
int status = pthread_mutex_init(&mObjDestroy.mMutex, NULL);
@@ -751,6 +763,10 @@
LOGE(" RS running %i, exit %i, useDepth %i, paused %i", mRunning, mExit, mUseDepth, mPaused);
LOGE(" RS pThreadID %li, nativeThreadID %i", mThreadId, mNativeThreadId);
+ LOGV("MAX Textures %i, %i %i", mGL.mMaxVertexTextureUnits, mGL.mMaxFragmentTextureImageUnits, mGL.mMaxTextureImageUnits);
+ LOGV("MAX Attribs %i", mGL.mMaxVertexAttribs);
+ LOGV("MAX Uniforms %i, %i", mGL.mMaxVertexUniformVectors, mGL.mMaxFragmentUniformVectors);
+ LOGV("MAX Varyings %i", mGL.mMaxVaryingVectors);
}
///////////////////////////////////////////////////////////////////////////////////////////
@@ -815,16 +831,6 @@
ob->decUserRef();
}
-void rsi_ContextSetDefineF(Context *rsc, const char* name, float value)
-{
- rsc->addInt32Define(name, value);
-}
-
-void rsi_ContextSetDefineI32(Context *rsc, const char* name, int32_t value)
-{
- rsc->addFloatDefine(name, value);
-}
-
void rsi_ContextPause(Context *rsc)
{
rsc->pause();
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 1770ee6..2edd16d 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -37,6 +37,8 @@
#include "rsProgramFragmentStore.h"
#include "rsProgramRaster.h"
#include "rsProgramVertex.h"
+#include "rsShaderCache.h"
+#include "rsVertexArray.h"
#include "rsgApiStructs.h"
#include "rsLocklessFifo.h"
@@ -72,8 +74,10 @@
ProgramRasterState mStateRaster;
ProgramVertexState mStateVertex;
LightState mStateLight;
+ VertexArrayState mStateVertexArray;
ScriptCState mScriptC;
+ ShaderCache mShaderCache;
void swapBuffers();
void setRootScript(Script *);
@@ -90,7 +94,7 @@
const ProgramVertex * getVertex() {return mVertex.get();}
void setupCheck();
- void allocationCheck(const Allocation *);
+ bool checkDriver() const {return mEGL.mSurface != 0;}
void pause();
void resume();
@@ -101,7 +105,6 @@
void removeName(ObjectBase *obj);
ObjectBase * lookupName(const char *name) const;
void appendNameDefines(String8 *str) const;
- void appendVarDefines(String8 *str) const;
uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
@@ -123,14 +126,6 @@
return mStateRaster.mDefault.get();
}
- void addInt32Define(const char* name, int32_t value) {
- mInt32Defines.add(String8(name), value);
- }
-
- void addFloatDefine(const char* name, float value) {
- mFloatDefines.add(String8(name), value);
- }
-
uint32_t getWidth() const {return mEGL.mWidth;}
uint32_t getHeight() const {return mEGL.mHeight;}
@@ -160,9 +155,11 @@
bool mLogTimes;
bool mLogScripts;
bool mLogObjects;
+ bool mLogShaders;
} props;
void dumpDebug() const;
+ void checkError(const char *) const;
mutable const ObjectBase * mObjHead;
@@ -190,6 +187,15 @@
uint32_t mMajorVersion;
uint32_t mMinorVersion;
+ int32_t mMaxVaryingVectors;
+ int32_t mMaxTextureImageUnits;
+
+ int32_t mMaxFragmentTextureImageUnits;
+ int32_t mMaxFragmentUniformVectors;
+
+ int32_t mMaxVertexAttribs;
+ int32_t mMaxVertexUniformVectors;
+ int32_t mMaxVertexTextureUnits;
} mGL;
uint32_t mWidth;
@@ -224,7 +230,7 @@
private:
Context();
- void initEGL();
+ void initEGL(bool useGL2);
void deinitEGL();
uint32_t runRootScript();
@@ -234,8 +240,6 @@
Surface *mWndSurface;
Vector<ObjectBase *> mNames;
- KeyedVector<String8,int> mInt32Defines;
- KeyedVector<String8,float> mFloatDefines;
uint64_t mTimers[_RS_TIMER_TOTAL];
Timers mTimerActive;
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
index 67e4f14..207ad15 100644
--- a/libs/rs/rsElement.cpp
+++ b/libs/rs/rsElement.cpp
@@ -24,19 +24,13 @@
Element::Element(Context *rsc) : ObjectBase(rsc)
{
+ mBits = 0;
mAllocFile = __FILE__;
mAllocLine = __LINE__;
- mComponents = NULL;
- mComponentCount = 0;
+ mFields = NULL;
+ mFieldCount = 0;
}
-Element::Element(Context *rsc, uint32_t count) : ObjectBase(rsc)
-{
- mAllocFile = __FILE__;
- mAllocLine = __LINE__;
- mComponents = new ObjectBaseRef<Component> [count];
- mComponentCount = count;
-}
Element::~Element()
{
@@ -45,153 +39,129 @@
void Element::clear()
{
- delete [] mComponents;
- mComponents = NULL;
- mComponentCount = 0;
+ delete [] mFields;
+ mFields = NULL;
+ mFieldCount = 0;
}
-void Element::setComponent(uint32_t idx, Component *c)
-{
- rsAssert(!mComponents[idx].get());
- rsAssert(idx < mComponentCount);
- mComponents[idx].set(c);
-
-// Fixme: This should probably not be here
- c->incUserRef();
-}
-
-
size_t Element::getSizeBits() const
{
+ if (!mFieldCount) {
+ return mBits;
+ }
+
size_t total = 0;
- for (size_t ct=0; ct < mComponentCount; ct++) {
- total += mComponents[ct]->getBits();
+ for (size_t ct=0; ct < mFieldCount; ct++) {
+ total += mFields[ct].e->mBits;
}
return total;
}
-size_t Element::getComponentOffsetBits(uint32_t componentNumber) const
+size_t Element::getFieldOffsetBits(uint32_t componentNumber) const
{
size_t offset = 0;
for (uint32_t ct = 0; ct < componentNumber; ct++) {
- offset += mComponents[ct]->getBits();
+ offset += mFields[ct].e->mBits;
}
return offset;
}
-uint32_t Element::getGLType() const
-{
- int bits[4];
-
- if (mComponentCount > 4) {
- return 0;
- }
-
- for (uint32_t ct=0; ct < mComponentCount; ct++) {
- bits[ct] = mComponents[ct]->getBits();
- if (mComponents[ct]->getType() != Component::UNSIGNED) {
- return 0;
- }
- if (!mComponents[ct]->getIsNormalized()) {
- return 0;
- }
- }
-
- switch(mComponentCount) {
- case 1:
- if (bits[0] == 8) {
- return GL_UNSIGNED_BYTE;
- }
- return 0;
- case 2:
- if ((bits[0] == 8) &&
- (bits[1] == 8)) {
- return GL_UNSIGNED_BYTE;
- }
- return 0;
- case 3:
- if ((bits[0] == 8) &&
- (bits[1] == 8) &&
- (bits[2] == 8)) {
- return GL_UNSIGNED_BYTE;
- }
- if ((bits[0] == 5) &&
- (bits[1] == 6) &&
- (bits[2] == 5)) {
- return GL_UNSIGNED_SHORT_5_6_5;
- }
- return 0;
- case 4:
- if ((bits[0] == 8) &&
- (bits[1] == 8) &&
- (bits[2] == 8) &&
- (bits[3] == 8)) {
- return GL_UNSIGNED_BYTE;
- }
- if ((bits[0] == 4) &&
- (bits[1] == 4) &&
- (bits[2] == 4) &&
- (bits[3] == 4)) {
- return GL_UNSIGNED_SHORT_4_4_4_4;
- }
- if ((bits[0] == 5) &&
- (bits[1] == 5) &&
- (bits[2] == 5) &&
- (bits[3] == 1)) {
- return GL_UNSIGNED_SHORT_5_5_5_1;
- }
- }
- return 0;
-}
-
-uint32_t Element::getGLFormat() const
-{
- switch(mComponentCount) {
- case 1:
- if (mComponents[0]->getKind() == Component::ALPHA) {
- return GL_ALPHA;
- }
- if (mComponents[0]->getKind() == Component::LUMINANCE) {
- return GL_LUMINANCE;
- }
- break;
- case 2:
- if ((mComponents[0]->getKind() == Component::LUMINANCE) &&
- (mComponents[1]->getKind() == Component::ALPHA)) {
- return GL_LUMINANCE_ALPHA;
- }
- break;
- case 3:
- if ((mComponents[0]->getKind() == Component::RED) &&
- (mComponents[1]->getKind() == Component::GREEN) &&
- (mComponents[2]->getKind() == Component::BLUE)) {
- return GL_RGB;
- }
- break;
- case 4:
- if ((mComponents[0]->getKind() == Component::RED) &&
- (mComponents[1]->getKind() == Component::GREEN) &&
- (mComponents[2]->getKind() == Component::BLUE) &&
- (mComponents[3]->getKind() == Component::ALPHA)) {
- return GL_RGBA;
- }
- break;
- }
- return 0;
-}
-
-
void Element::dumpLOGV(const char *prefix) const
{
ObjectBase::dumpLOGV(prefix);
- LOGV("%s Element: components %i, size %i", prefix, mComponentCount, getSizeBytes());
- for (uint32_t ct = 0; ct < mComponentCount; ct++) {
+ LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits);
+ for (uint32_t ct = 0; ct < mFieldCount; ct++) {
char buf[1024];
sprintf(buf, "%s component %i: ", prefix, ct);
- mComponents[ct]->dumpLOGV(buf);
+ //mComponents[ct]->dumpLOGV(buf);
}
}
+
+Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
+ bool isNorm, uint32_t vecSize)
+{
+ Element *e = new Element(rsc);
+ e->mComponent.set(dt, dk, isNorm, vecSize);
+ e->mBits = e->mComponent.getBits();
+ return e;
+}
+
+Element * Element::create(Context *rsc, size_t count, const Element **ein,
+ const char **nin, const size_t * lengths)
+{
+ Element *e = new Element(rsc);
+ e->mFields = new ElementField_t [count];
+ e->mFieldCount = count;
+
+ for (size_t ct=0; ct < count; ct++) {
+ e->mFields[ct].e.set(ein[ct]);
+ e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
+ }
+
+ return e;
+}
+
+String8 Element::getCStructBody(uint32_t indent) const
+{
+ String8 si;
+ for (uint32_t ct=0; ct < indent; ct++) {
+ si.append(" ");
+ }
+
+ String8 s(si);
+ s.append("{\n");
+ for (uint32_t ct = 0; ct < mFieldCount; ct++) {
+ s.append(si);
+ s.append(mFields[ct].e->getCType(indent+4));
+ s.append(" ");
+ s.append(mFields[ct].name);
+ s.append(";\n");
+ }
+ s.append(si);
+ s.append("}");
+ return s;
+}
+
+String8 Element::getCType(uint32_t indent) const
+{
+ String8 s;
+ for (uint32_t ct=0; ct < indent; ct++) {
+ s.append(" ");
+ }
+
+ if (!mFieldCount) {
+ // Basic component.
+ s.append(mComponent.getCType());
+ } else {
+ s.append("struct ");
+ s.append(getCStructBody(indent));
+ }
+
+ return s;
+}
+
+String8 Element::getGLSLType(uint32_t indent) const
+{
+ String8 s;
+ for (uint32_t ct=0; ct < indent; ct++) {
+ s.append(" ");
+ }
+
+ if (!mFieldCount) {
+ // Basic component.
+ s.append(mComponent.getGLSLType());
+ } else {
+ rsAssert(0);
+ //s.append("struct ");
+ //s.append(getCStructBody(indent));
+ }
+
+ return s;
+}
+
+
+
ElementState::ElementState()
{
}
@@ -200,46 +170,35 @@
{
}
+
/////////////////////////////////////////
//
namespace android {
namespace renderscript {
-void rsi_ElementBegin(Context *rsc)
+RsElement rsi_ElementCreate(Context *rsc,
+ RsDataType dt,
+ RsDataKind dk,
+ bool norm,
+ uint32_t vecSize)
{
- rsc->mStateElement.mComponentBuildList.clear();
+ //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
+ Element *e = Element::create(rsc, dt, dk, norm, vecSize);
+ e->incUserRef();
+ return e;
}
-void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
+RsElement rsi_ElementCreate2(Context *rsc,
+ size_t count,
+ const RsElement * ein,
+ const char ** names,
+ const size_t * nameLengths)
{
- ElementState * sec = &rsc->mStateElement;
-
- rsAssert(bits > 0);
-
- Component *c = new Component(rsc,
- static_cast<Component::DataKind>(dk),
- static_cast<Component::DataType>(dt),
- isNormalized,
- bits,
- name);
- sec->mComponentBuildList.add(c);
-}
-
-RsElement rsi_ElementCreate(Context *rsc)
-{
- ElementState * sec = &rsc->mStateElement;
- Element *se = new Element(rsc, sec->mComponentBuildList.size());
-
- rsAssert(se->getComponentCount() > 0);
-
- for (size_t ct = 0; ct < se->getComponentCount(); ct++) {
- se->setComponent(ct, sec->mComponentBuildList[ct]);
- }
-
- rsc->mStateElement.mComponentBuildList.clear();
- se->incUserRef();
- return se;
+ //LOGE("rsi_ElementCreate2 %i", count);
+ Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
+ e->incUserRef();
+ return e;
}
diff --git a/libs/rs/rsElement.h b/libs/rs/rsElement.h
index b41c552..777e8ee 100644
--- a/libs/rs/rsElement.h
+++ b/libs/rs/rsElement.h
@@ -18,6 +18,8 @@
#define ANDROID_STRUCTURED_ELEMENT_H
#include "rsComponent.h"
+#include "rsUtils.h"
+#include "rsObjectBase.h"
// ---------------------------------------------------------------------------
namespace android {
@@ -28,41 +30,57 @@
class Element : public ObjectBase
{
public:
- Element(Context *, uint32_t count);
~Element();
-
- void setComponent(uint32_t idx, Component *c);
-
uint32_t getGLType() const;
uint32_t getGLFormat() const;
-
size_t getSizeBits() const;
size_t getSizeBytes() const {
return (getSizeBits() + 7) >> 3;
}
- size_t getComponentOffsetBits(uint32_t componentNumber) const;
- size_t getComponentOffsetBytes(uint32_t componentNumber) const {
- return (getComponentOffsetBits(componentNumber) + 7) >> 3;
+ size_t getFieldOffsetBits(uint32_t componentNumber) const;
+ size_t getFieldOffsetBytes(uint32_t componentNumber) const {
+ return (getFieldOffsetBits(componentNumber) + 7) >> 3;
}
- uint32_t getComponentCount() const {return mComponentCount;}
- Component * getComponent(uint32_t idx) const {return mComponents[idx].get();}
+ uint32_t getFieldCount() const {return mFieldCount;}
+ const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
+ const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
+ const Component & getComponent() const {return mComponent;}
+ RsDataType getType() const {return mComponent.getType();}
+ RsDataKind getKind() const {return mComponent.getKind();}
+ uint32_t getBits() const {return mBits;}
+
+ String8 getCType(uint32_t indent=0) const;
+ String8 getCStructBody(uint32_t indent=0) const;
+ String8 getGLSLType(uint32_t indent=0) const;
void dumpLOGV(const char *prefix) const;
+ static Element * create(Context *rsc, RsDataType dt, RsDataKind dk,
+ bool isNorm, uint32_t vecSize);
+ static Element * create(Context *rsc, size_t count, const Element **,
+ const char **, const size_t * lengths);
+
protected:
// deallocate any components that are part of this element.
void clear();
- size_t mComponentCount;
- ObjectBaseRef<Component> * mComponents;
- //uint32_t *mOffsetTable;
+ typedef struct {
+ String8 name;
+ ObjectBaseRef<const Element> e;
+ } ElementField_t;
+ ElementField_t *mFields;
+ size_t mFieldCount;
+
Element(Context *);
+
+ Component mComponent;
+ uint32_t mBits;
};
@@ -71,7 +89,6 @@
ElementState();
~ElementState();
- Vector<Component *> mComponentBuildList;
};
diff --git a/libs/rs/rsFileA3D.cpp b/libs/rs/rsFileA3D.cpp
index c566665..e3272c5 100644
--- a/libs/rs/rsFileA3D.cpp
+++ b/libs/rs/rsFileA3D.cpp
@@ -324,6 +324,7 @@
void FileA3D::processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie)
{
+ /*
rsi_ElementBegin(rsc);
uint32_t count = io->loadU32();
@@ -338,6 +339,7 @@
}
LOGE("processChunk_Element create");
ie->mRsObj = rsi_ElementCreate(rsc);
+ */
}
void FileA3D::processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie)
diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp
index 5f2a609..b528c46 100644
--- a/libs/rs/rsProgram.cpp
+++ b/libs/rs/rsProgram.cpp
@@ -17,34 +17,246 @@
#include "rsContext.h"
#include "rsProgram.h"
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
using namespace android;
using namespace android::renderscript;
-Program::Program(Context *rsc, Element *in, Element *out) : ObjectBase(rsc)
+Program::Program(Context *rsc) : ObjectBase(rsc)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
+ mDirty = true;
+ mShaderID = 0;
+ mAttribCount = 0;
+ mUniformCount = 0;
- mElementIn.set(in);
- mElementOut.set(out);
+ mInputElements = NULL;
+ mOutputElements = NULL;
+ mConstantTypes = NULL;
+ mInputCount = 0;
+ mOutputCount = 0;
+ mConstantCount = 0;
+}
+
+Program::Program(Context *rsc, const char * shaderText, uint32_t shaderLength,
+ const uint32_t * params, uint32_t paramLength) :
+ ObjectBase(rsc)
+{
+ mAllocFile = __FILE__;
+ mAllocLine = __LINE__;
+ mDirty = true;
+ mShaderID = 0;
+ mAttribCount = 0;
+ mUniformCount = 0;
+ mTextureCount = 0;
+
+ mInputCount = 0;
+ mOutputCount = 0;
+ mConstantCount = 0;
+
+ for (uint32_t ct=0; ct < paramLength; ct+=2) {
+ if (params[ct] == RS_PROGRAM_PARAM_INPUT) {
+ mInputCount++;
+ }
+ if (params[ct] == RS_PROGRAM_PARAM_OUTPUT) {
+ mOutputCount++;
+ }
+ if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
+ mConstantCount++;
+ }
+ if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_COUNT) {
+ mTextureCount = params[ct+1];
+ }
+ }
+
+ mInputElements = new ObjectBaseRef<Element>[mInputCount];
+ mOutputElements = new ObjectBaseRef<Element>[mOutputCount];
+ mConstantTypes = new ObjectBaseRef<Type>[mConstantCount];
+
+ uint32_t input = 0;
+ uint32_t output = 0;
+ uint32_t constant = 0;
+ for (uint32_t ct=0; ct < paramLength; ct+=2) {
+ if (params[ct] == RS_PROGRAM_PARAM_INPUT) {
+ mInputElements[input++].set(reinterpret_cast<Element *>(params[ct+1]));
+ }
+ if (params[ct] == RS_PROGRAM_PARAM_OUTPUT) {
+ mOutputElements[output++].set(reinterpret_cast<Element *>(params[ct+1]));
+ }
+ if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
+ mConstantTypes[constant++].set(reinterpret_cast<Type *>(params[ct+1]));
+ }
+ }
+ mUserShader.setTo(shaderText, shaderLength);
}
Program::~Program()
{
+ for (uint32_t ct=0; ct < MAX_UNIFORMS; ct++) {
+ bindAllocation(NULL, ct);
+ }
+
+ delete[] mInputElements;
+ delete[] mOutputElements;
+ delete[] mConstantTypes;
+ mInputCount = 0;
+ mOutputCount = 0;
+ mConstantCount = 0;
}
-void Program::bindAllocation(Allocation *alloc)
+void Program::bindAllocation(Allocation *alloc, uint32_t slot)
{
- mConstants.set(alloc);
+ LOGE("bind alloc %p %i", alloc, slot);
+ if (mConstants[slot].get() == alloc) {
+ return;
+ }
+ if (mConstants[slot].get()) {
+ mConstants[slot].get()->removeProgramToDirty(this);
+ }
+ mConstants[slot].set(alloc);
+ if (alloc) {
+ alloc->addProgramToDirty(this);
+ }
mDirty = true;
}
-void Program::checkUpdatedAllocation(const Allocation *alloc)
+void Program::bindTexture(uint32_t slot, Allocation *a)
{
- if (mConstants.get() == alloc) {
- mDirty = true;
+ if (slot >= MAX_TEXTURE) {
+ LOGE("Attempt to bind a texture to a slot > MAX_TEXTURE");
+ return;
}
+
+ //LOGE("bindtex %i %p", slot, a);
+ mTextures[slot].set(a);
+ mDirty = true;
+}
+
+void Program::bindSampler(uint32_t slot, Sampler *s)
+{
+ if (slot >= MAX_TEXTURE) {
+ LOGE("Attempt to bind a Sampler to a slot > MAX_TEXTURE");
+ return;
+ }
+
+ mSamplers[slot].set(s);
+ mDirty = true;
+}
+
+String8 Program::getGLSLInputString() const
+{
+ String8 s;
+ for (uint32_t ct=0; ct < mInputCount; ct++) {
+ const Element *e = mInputElements[ct].get();
+ for (uint32_t field=0; field < e->getFieldCount(); field++) {
+ const Element *f = e->getField(field);
+
+ // Cannot be complex
+ rsAssert(!f->getFieldCount());
+ switch(f->getComponent().getVectorSize()) {
+ case 1: s.append("attribute float ATTRIB_"); break;
+ case 2: s.append("attribute vec2 ATTRIB_"); break;
+ case 3: s.append("attribute vec3 ATTRIB_"); break;
+ case 4: s.append("attribute vec4 ATTRIB_"); break;
+ default:
+ rsAssert(0);
+ }
+
+ s.append(e->getFieldName(field));
+ s.append(";\n");
+ }
+ }
+ return s;
+}
+
+String8 Program::getGLSLOutputString() const
+{
+ return String8();
+}
+
+String8 Program::getGLSLConstantString() const
+{
+ return String8();
+}
+
+
+void Program::createShader()
+{
+}
+
+bool Program::loadShader(Context *rsc, uint32_t type)
+{
+ mShaderID = glCreateShader(type);
+ rsAssert(mShaderID);
+
+ if (rsc->props.mLogShaders) {
+ LOGV("Loading shader type %x, ID %i", type, mShaderID);
+ LOGV(mShader.string());
+ }
+
+ if (mShaderID) {
+ const char * ss = mShader.string();
+ glShaderSource(mShaderID, 1, &ss, NULL);
+ glCompileShader(mShaderID);
+
+ GLint compiled = 0;
+ glGetShaderiv(mShaderID, GL_COMPILE_STATUS, &compiled);
+ if (!compiled) {
+ GLint infoLen = 0;
+ glGetShaderiv(mShaderID, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen) {
+ char* buf = (char*) malloc(infoLen);
+ if (buf) {
+ glGetShaderInfoLog(mShaderID, infoLen, NULL, buf);
+ LOGE("Could not compile shader \n%s\n", buf);
+ free(buf);
+ }
+ glDeleteShader(mShaderID);
+ mShaderID = 0;
+ return false;
+ }
+ }
+ }
+
+ if (rsc->props.mLogShaders) {
+ LOGV("--Shader load result %x ", glGetError());
+ }
+ return true;
+}
+
+void Program::setShader(const char *txt, uint32_t len)
+{
+ mUserShader.setTo(txt, len);
+}
+
+
+
+namespace android {
+namespace renderscript {
+
+
+void rsi_ProgramBindConstants(Context *rsc, RsProgram vp, uint32_t slot, RsAllocation constants)
+{
+ Program *p = static_cast<Program *>(vp);
+ p->bindAllocation(static_cast<Allocation *>(constants), slot);
+}
+
+void rsi_ProgramBindTexture(Context *rsc, RsProgram vpf, uint32_t slot, RsAllocation a)
+{
+ Program *p = static_cast<Program *>(vpf);
+ p->bindTexture(slot, static_cast<Allocation *>(a));
+}
+
+void rsi_ProgramBindSampler(Context *rsc, RsProgram vpf, uint32_t slot, RsSampler s)
+{
+ Program *p = static_cast<Program *>(vpf);
+ p->bindSampler(slot, static_cast<Sampler *>(s));
+}
+
+}
}
diff --git a/libs/rs/rsProgram.h b/libs/rs/rsProgram.h
index 57c654f..a34e89f 100644
--- a/libs/rs/rsProgram.h
+++ b/libs/rs/rsProgram.h
@@ -25,29 +25,76 @@
namespace renderscript {
+class ShaderCache;
class Program : public ObjectBase
{
public:
- Program(Context *, Element *in, Element *out);
+ const static uint32_t MAX_ATTRIBS = 8;
+ const static uint32_t MAX_UNIFORMS = 16;
+ const static uint32_t MAX_TEXTURE = 2;
+
+ Program(Context *);
+ Program(Context *, const char * shaderText, uint32_t shaderLength,
+ const uint32_t * params, uint32_t paramLength);
virtual ~Program();
- void bindAllocation(Allocation *);
- void checkUpdatedAllocation(const Allocation *);
+ void bindAllocation(Allocation *, uint32_t slot);
+ virtual void createShader();
+
+ bool isUserProgram() const {return mUserShader.size() > 0;}
+
+ void bindTexture(uint32_t slot, Allocation *);
+ void bindSampler(uint32_t slot, Sampler *);
+
+ uint32_t getShaderID() const {return mShaderID;}
+ void setShader(const char *, uint32_t len);
+
+ uint32_t getAttribCount() const {return mAttribCount;}
+ uint32_t getUniformCount() const {return mUniformCount;}
+ const String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
+ const String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
+
+ String8 getGLSLInputString() const;
+ String8 getGLSLOutputString() const;
+ String8 getGLSLConstantString() const;
protected:
// Components not listed in "in" will be passed though
// unless overwritten by components in out.
- ObjectBaseRef<Element> mElementIn;
- ObjectBaseRef<Element> mElementOut;
+ ObjectBaseRef<Element> *mInputElements;
+ ObjectBaseRef<Element> *mOutputElements;
+ ObjectBaseRef<Type> *mConstantTypes;
+ uint32_t mInputCount;
+ uint32_t mOutputCount;
+ uint32_t mConstantCount;
- ObjectBaseRef<Allocation> mConstants;
+ ObjectBaseRef<Allocation> mConstants[MAX_UNIFORMS];
mutable bool mDirty;
+ String8 mShader;
+ String8 mUserShader;
+ uint32_t mShaderID;
+ uint32_t mTextureCount;
+ uint32_t mAttribCount;
+ uint32_t mUniformCount;
+ String8 mAttribNames[MAX_ATTRIBS];
+ String8 mUniformNames[MAX_UNIFORMS];
+
+ // The difference between Textures and Constants is how they are accessed
+ // Texture lookups go though a sampler which in effect converts normalized
+ // coordinates into type specific. Multiple samples may also be taken
+ // and filtered.
+ //
+ // Constants are strictly accessed by programetic loads.
+ ObjectBaseRef<Allocation> mTextures[MAX_TEXTURE];
+ ObjectBaseRef<Sampler> mSamplers[MAX_TEXTURE];
+
+ bool loadShader(Context *, uint32_t type);
public:
- void forceDirty() {mDirty = true;}
+ void forceDirty() const {mDirty = true;}
};
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 708a0e0..00f19ae 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -19,25 +19,50 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
using namespace android;
using namespace android::renderscript;
-ProgramFragment::ProgramFragment(Context *rsc, Element *in, Element *out, bool pointSpriteEnable) :
- Program(rsc, in, out)
+ProgramFragment::ProgramFragment(Context *rsc, const uint32_t * params,
+ uint32_t paramLength) :
+ Program(rsc)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
- for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
- mEnvModes[ct] = RS_TEX_ENV_MODE_REPLACE;
- mTextureDimensions[ct] = 2;
- }
+ rsAssert(paramLength = 5);
+
+ mEnvModes[0] = (RsTexEnvMode)params[0];
+ mTextureFormats[0] = params[1];
+ mEnvModes[1] = (RsTexEnvMode)params[2];
+ mTextureFormats[1] = params[3];
+ mPointSpriteEnable = params[4] != 0;
+
mTextureEnableMask = 0;
- mPointSpriteEnable = pointSpriteEnable;
- mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
+ if (mEnvModes[0]) {
+ mTextureEnableMask |= 1;
+ }
+ if (mEnvModes[1]) {
+ mTextureEnableMask |= 2;
+ }
+ init(rsc);
}
+ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
+ uint32_t shaderLength, const uint32_t * params,
+ uint32_t paramLength) :
+ Program(rsc, shaderText, shaderLength, params, paramLength)
+{
+ mAllocFile = __FILE__;
+ mAllocLine = __LINE__;
+
+ init(rsc);
+ mTextureEnableMask = (1 << mTextureCount) -1;
+}
+
+
ProgramFragment::~ProgramFragment()
{
}
@@ -65,9 +90,13 @@
}
glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
}
+ mTextures[ct]->uploadCheck(rsc);
glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
switch(mEnvModes[ct]) {
+ case RS_TEX_ENV_MODE_NONE:
+ rsAssert(0);
+ break;
case RS_TEX_ENV_MODE_REPLACE:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
break;
@@ -107,74 +136,156 @@
}
glActiveTexture(GL_TEXTURE0);
mDirty = false;
+ rsc->checkError("ProgramFragment::setupGL");
}
-
-void ProgramFragment::bindTexture(uint32_t slot, Allocation *a)
+void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, ShaderCache *sc)
{
- if (slot >= MAX_TEXTURE) {
- LOGE("Attempt to bind a texture to a slot > MAX_TEXTURE");
- return;
+ //LOGE("sgl2 frag1 %x", glGetError());
+ if ((state->mLast.get() == this) && !mDirty) {
+ //return;
+ }
+ state->mLast.set(this);
+
+ for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) {
+ glActiveTexture(GL_TEXTURE0 + ct);
+ if (!(mTextureEnableMask & (1 << ct)) || !mTextures[ct].get()) {
+ glDisable(GL_TEXTURE_2D);
+ continue;
+ }
+
+ mTextures[ct]->uploadCheck(rsc);
+ glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
+ if (mSamplers[ct].get()) {
+ mSamplers[ct]->setupGL();
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glUniform1i(sc->fragUniformSlot(ct), ct);
}
- //LOGE("bindtex %i %p", slot, a);
- mTextures[slot].set(a);
- mDirty = true;
+ glActiveTexture(GL_TEXTURE0);
+ mDirty = false;
+ rsc->checkError("ProgramFragment::setupGL2");
}
-void ProgramFragment::bindSampler(uint32_t slot, Sampler *s)
+void ProgramFragment::loadShader(Context *rsc) {
+ Program::loadShader(rsc, GL_FRAGMENT_SHADER);
+}
+
+void ProgramFragment::createShader()
{
- if (slot >= MAX_TEXTURE) {
- LOGE("Attempt to bind a Sampler to a slot > MAX_TEXTURE");
- return;
- }
+ mShader.setTo("precision mediump float;\n");
+ mShader.append("varying vec4 varColor;\n");
+ mShader.append("varying vec4 varTex0;\n");
- mSamplers[slot].set(s);
- mDirty = true;
+ if (mUserShader.length() > 1) {
+ for (uint32_t ct=0; ct < mTextureCount; ct++) {
+ char buf[256];
+ sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
+ mShader.append(buf);
+ }
+
+ mShader.append(mUserShader);
+ } else {
+ uint32_t mask = mTextureEnableMask;
+ uint32_t texNum = 0;
+ while (mask) {
+ if (mask & 1) {
+ char buf[64];
+ mShader.append("uniform sampler2D uni_Tex");
+ sprintf(buf, "%i", texNum);
+ mShader.append(buf);
+ mShader.append(";\n");
+ }
+ mask >>= 1;
+ texNum++;
+ }
+
+
+ mShader.append("void main() {\n");
+ mShader.append(" vec4 col = varColor;\n");
+
+ if (mTextureEnableMask) {
+ if (mPointSpriteEnable) {
+ mShader.append(" vec2 t0 = gl_PointCoord;\n");
+ } else {
+ mShader.append(" vec2 t0 = varTex0.xy;\n");
+ }
+ }
+
+ mask = mTextureEnableMask;
+ texNum = 0;
+ while (mask) {
+ if (mask & 1) {
+ switch(mEnvModes[texNum]) {
+ case RS_TEX_ENV_MODE_NONE:
+ rsAssert(0);
+ break;
+ case RS_TEX_ENV_MODE_REPLACE:
+ switch(mTextureFormats[texNum]) {
+ case 1:
+ mShader.append(" col.a = texture2D(uni_Tex0, t0).a;\n");
+ break;
+ case 2:
+ mShader.append(" col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
+ break;
+ case 3:
+ mShader.append(" col.rgb = texture2D(uni_Tex0, t0).rgb;\n");
+ break;
+ case 4:
+ mShader.append(" col.rgba = texture2D(uni_Tex0, t0).rgba;\n");
+ break;
+ }
+ break;
+ case RS_TEX_ENV_MODE_MODULATE:
+ switch(mTextureFormats[texNum]) {
+ case 1:
+ mShader.append(" col.a *= texture2D(uni_Tex0, t0).a;\n");
+ break;
+ case 2:
+ mShader.append(" col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
+ break;
+ case 3:
+ mShader.append(" col.rgb *= texture2D(uni_Tex0, t0).rgb;\n");
+ break;
+ case 4:
+ mShader.append(" col.rgba *= texture2D(uni_Tex0, t0).rgba;\n");
+ break;
+ }
+ break;
+ case RS_TEX_ENV_MODE_DECAL:
+ mShader.append(" col = texture2D(uni_Tex0, t0);\n");
+ break;
+ }
+
+ }
+ mask >>= 1;
+ texNum++;
+ }
+
+ //mShader.append(" col.a = 1.0;\n");
+ //mShader.append(" col.r = 0.5;\n");
+
+ mShader.append(" gl_FragColor = col;\n");
+ mShader.append("}\n");
+ }
}
-void ProgramFragment::setType(uint32_t slot, const Element *e, uint32_t dim)
+void ProgramFragment::init(Context *rsc)
{
- if (slot >= MAX_TEXTURE) {
- LOGE("Attempt to setType to a slot > MAX_TEXTURE");
- return;
- }
+ mUniformCount = 2;
+ mUniformNames[0].setTo("uni_Tex0");
+ mUniformNames[1].setTo("uni_Tex1");
- if (dim >= 4) {
- LOGE("Attempt to setType to a dimension > 3");
- return;
- }
-
- mTextureFormats[slot].set(e);
- mTextureDimensions[slot] = dim;
+ createShader();
}
-void ProgramFragment::setEnvMode(uint32_t slot, RsTexEnvMode env)
-{
- if (slot >= MAX_TEXTURE) {
- LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE");
- return;
- }
-
- mEnvModes[slot] = env;
-}
-
-void ProgramFragment::setTexEnable(uint32_t slot, bool enable)
-{
- if (slot >= MAX_TEXTURE) {
- LOGE("Attempt to setEnvMode to a slot > MAX_TEXTURE");
- return;
- }
-
- uint32_t bit = 1 << slot;
- mTextureEnableMask &= ~bit;
- if (enable) {
- mTextureEnableMask |= bit;
- }
-}
-
-
-
ProgramFragmentState::ProgramFragmentState()
{
mPF = NULL;
@@ -188,8 +299,14 @@
void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
{
- ProgramFragment *pf = new ProgramFragment(rsc, NULL, NULL, false);
+ uint32_t tmp[5] = {
+ RS_TEX_ENV_MODE_NONE, 0,
+ RS_TEX_ENV_MODE_NONE, 0,
+ 0
+ };
+ ProgramFragment *pf = new ProgramFragment(rsc, tmp, 5);
mDefault.set(pf);
+ pf->init(rsc);
}
void ProgramFragmentState::deinit(Context *rsc)
@@ -202,49 +319,23 @@
namespace android {
namespace renderscript {
-void rsi_ProgramFragmentBegin(Context * rsc, RsElement in, RsElement out, bool pointSpriteEnable)
+RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc,
+ const uint32_t * params,
+ uint32_t paramLength)
{
- delete rsc->mStateFragment.mPF;
- rsc->mStateFragment.mPF = new ProgramFragment(rsc, (Element *)in, (Element *)out, pointSpriteEnable);
-}
-
-void rsi_ProgramFragmentBindTexture(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsAllocation a)
-{
- ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
- pf->bindTexture(slot, static_cast<Allocation *>(a));
-}
-
-void rsi_ProgramFragmentBindSampler(Context *rsc, RsProgramFragment vpf, uint32_t slot, RsSampler s)
-{
- ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
- pf->bindSampler(slot, static_cast<Sampler *>(s));
-}
-
-void rsi_ProgramFragmentSetSlot(Context *rsc, uint32_t slot, bool enable, RsTexEnvMode env, RsType vt)
-{
- const Type *t = static_cast<const Type *>(vt);
- if (t) {
- uint32_t dim = 1;
- if (t->getDimY()) {
- dim ++;
- if (t->getDimZ()) {
- dim ++;
- }
- }
- rsc->mStateFragment.mPF->setType(slot, t->getElement(), dim);
- }
- rsc->mStateFragment.mPF->setEnvMode(slot, env);
- rsc->mStateFragment.mPF->setTexEnable(slot, enable);
-}
-
-RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc)
-{
- ProgramFragment *pf = rsc->mStateFragment.mPF;
+ ProgramFragment *pf = new ProgramFragment(rsc, params, paramLength);
pf->incUserRef();
- rsc->mStateFragment.mPF = 0;
return pf;
}
+RsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
+ uint32_t shaderLength, const uint32_t * params,
+ uint32_t paramLength)
+{
+ ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
+ pf->incUserRef();
+ return pf;
+}
}
}
diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h
index e26c6e8..9fa565d 100644
--- a/libs/rs/rsProgramFragment.h
+++ b/libs/rs/rsProgramFragment.h
@@ -28,40 +28,23 @@
class ProgramFragment : public Program
{
public:
- const static uint32_t MAX_TEXTURE = 2;
-
-
-
- ProgramFragment(Context *, Element *in, Element *out, bool pointSpriteEnable);
+ ProgramFragment(Context *, const uint32_t * params, uint32_t paramLength);
+ ProgramFragment(Context *rsc, const char * shaderText,
+ uint32_t shaderLength, const uint32_t * params,
+ uint32_t paramLength);
virtual ~ProgramFragment();
virtual void setupGL(const Context *, ProgramFragmentState *);
+ virtual void setupGL2(const Context *, ProgramFragmentState *, ShaderCache *sc);
-
-
- void bindTexture(uint32_t slot, Allocation *);
- void bindSampler(uint32_t slot, Sampler *);
- void setType(uint32_t slot, const Element *, uint32_t dim);
-
- void setEnvMode(uint32_t slot, RsTexEnvMode);
- void setTexEnable(uint32_t slot, bool);
-
-
+ virtual void createShader();
+ virtual void loadShader(Context *rsc);
+ virtual void init(Context *rsc);
protected:
- // The difference between Textures and Constants is how they are accessed
- // Texture lookups go though a sampler which in effect converts normalized
- // coordinates into type specific. Multiple samples may also be taken
- // and filtered.
- //
- // Constants are strictly accessed by programetic loads.
- ObjectBaseRef<Allocation> mTextures[MAX_TEXTURE];
- ObjectBaseRef<Sampler> mSamplers[MAX_TEXTURE];
- ObjectBaseRef<const Element> mTextureFormats[MAX_TEXTURE];
- uint32_t mTextureDimensions[MAX_TEXTURE];
-
-
// Hacks to create a program for now
+ uint32_t mTextureFormats[MAX_TEXTURE];
+ uint32_t mTextureDimensions[MAX_TEXTURE];
RsTexEnvMode mEnvModes[MAX_TEXTURE];
uint32_t mTextureEnableMask;
bool mPointSpriteEnable;
diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramFragmentStore.cpp
index de33d9c..8a2157f 100644
--- a/libs/rs/rsProgramFragmentStore.cpp
+++ b/libs/rs/rsProgramFragmentStore.cpp
@@ -24,8 +24,8 @@
using namespace android::renderscript;
-ProgramFragmentStore::ProgramFragmentStore(Context *rsc, Element *in, Element *out) :
- Program(rsc, in, out)
+ProgramFragmentStore::ProgramFragmentStore(Context *rsc) :
+ Program(rsc)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
@@ -83,10 +83,44 @@
} else {
glDisable(GL_DITHER);
}
-
-
}
+void ProgramFragmentStore::setupGL2(const Context *rsc, ProgramFragmentStoreState *state)
+{
+ if (state->mLast.get() == this) {
+ return;
+ }
+ state->mLast.set(this);
+
+ glColorMask(mColorRWriteEnable,
+ mColorGWriteEnable,
+ mColorBWriteEnable,
+ mColorAWriteEnable);
+ if (mBlendEnable) {
+ glEnable(GL_BLEND);
+ glBlendFunc(mBlendSrc, mBlendDst);
+ } else {
+ glDisable(GL_BLEND);
+ }
+
+ //LOGE("pfs %i, %i, %x", mDepthWriteEnable, mDepthTestEnable, mDepthFunc);
+
+ glDepthMask(mDepthWriteEnable);
+ if(mDepthTestEnable || mDepthWriteEnable) {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(mDepthFunc);
+ } else {
+ glDisable(GL_DEPTH_TEST);
+ }
+
+ if (mDitherEnable) {
+ glEnable(GL_DITHER);
+ } else {
+ glDisable(GL_DITHER);
+ }
+}
+
+
void ProgramFragmentStore::setDitherEnable(bool enable)
{
mDitherEnable = enable;
@@ -215,7 +249,7 @@
void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h)
{
- ProgramFragmentStore *pfs = new ProgramFragmentStore(rsc, NULL, NULL);
+ ProgramFragmentStore *pfs = new ProgramFragmentStore(rsc);
mDefault.set(pfs);
}
@@ -232,7 +266,7 @@
void rsi_ProgramFragmentStoreBegin(Context * rsc, RsElement in, RsElement out)
{
delete rsc->mStateFragmentStore.mPFS;
- rsc->mStateFragmentStore.mPFS = new ProgramFragmentStore(rsc, (Element *)in, (Element *)out);
+ rsc->mStateFragmentStore.mPFS = new ProgramFragmentStore(rsc);
}
diff --git a/libs/rs/rsProgramFragmentStore.h b/libs/rs/rsProgramFragmentStore.h
index a344387..3412c99 100644
--- a/libs/rs/rsProgramFragmentStore.h
+++ b/libs/rs/rsProgramFragmentStore.h
@@ -28,10 +28,11 @@
class ProgramFragmentStore : public Program
{
public:
- ProgramFragmentStore(Context *, Element *in, Element *out);
+ ProgramFragmentStore(Context *);
virtual ~ProgramFragmentStore();
virtual void setupGL(const Context *, ProgramFragmentStoreState *);
+ virtual void setupGL2(const Context *, ProgramFragmentStoreState *);
void setDepthFunc(RsDepthFunc);
void setDepthMask(bool);
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
index 51ae7cf..13887d1 100644
--- a/libs/rs/rsProgramRaster.cpp
+++ b/libs/rs/rsProgramRaster.cpp
@@ -25,12 +25,10 @@
ProgramRaster::ProgramRaster(Context *rsc,
- Element *in,
- Element *out,
bool pointSmooth,
bool lineSmooth,
bool pointSprite) :
- Program(rsc, in, out)
+ Program(rsc)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
@@ -86,6 +84,14 @@
}
}
+void ProgramRaster::setupGL2(const Context *rsc, ProgramRasterState *state)
+{
+ if (state->mLast.get() == this) {
+ return;
+ }
+ state->mLast.set(this);
+}
+
ProgramRasterState::ProgramRasterState()
@@ -98,7 +104,7 @@
void ProgramRasterState::init(Context *rsc, int32_t w, int32_t h)
{
- ProgramRaster *pr = new ProgramRaster(rsc, NULL, NULL, false, false, false);
+ ProgramRaster *pr = new ProgramRaster(rsc, false, false, false);
mDefault.set(pr);
}
@@ -118,8 +124,6 @@
bool pointSprite)
{
ProgramRaster *pr = new ProgramRaster(rsc,
- static_cast<Element *>(in),
- static_cast<Element *>(out),
pointSmooth,
lineSmooth,
pointSprite);
diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h
index a6d5ba8..c3a9c90 100644
--- a/libs/rs/rsProgramRaster.h
+++ b/libs/rs/rsProgramRaster.h
@@ -29,14 +29,13 @@
{
public:
ProgramRaster(Context *rsc,
- Element *in,
- Element *out,
bool pointSmooth,
bool lineSmooth,
bool pointSprite);
virtual ~ProgramRaster();
virtual void setupGL(const Context *, ProgramRasterState *);
+ virtual void setupGL2(const Context *, ProgramRasterState *);
void setLineWidth(float w);
void setPointSize(float s);
diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
index 68f589f..8849bda 100644
--- a/libs/rs/rsProgramVertex.cpp
+++ b/libs/rs/rsProgramVertex.cpp
@@ -19,18 +19,34 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
using namespace android;
using namespace android::renderscript;
-ProgramVertex::ProgramVertex(Context *rsc, Element *in, Element *out) :
- Program(rsc, in, out)
+ProgramVertex::ProgramVertex(Context *rsc, bool texMat) :
+ Program(rsc)
+{
+ mAllocFile = __FILE__;
+ mAllocLine = __LINE__;
+ mTextureMatrixEnable = texMat;
+ mLightCount = 0;
+ init(rsc);
+}
+
+ProgramVertex::ProgramVertex(Context *rsc, const char * shaderText,
+ uint32_t shaderLength, const uint32_t * params,
+ uint32_t paramLength) :
+ Program(rsc, shaderText, shaderLength, params, paramLength)
{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
mTextureMatrixEnable = false;
mLightCount = 0;
+
+ init(rsc);
}
ProgramVertex::~ProgramVertex()
@@ -40,10 +56,10 @@
static void logMatrix(const char *txt, const float *f)
{
LOGV("Matrix %s, %p", txt, f);
- LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[0], f[4], f[8], f[12]);
- LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[1], f[5], f[9], f[13]);
- LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[2], f[6], f[10], f[14]);
- LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[3], f[7], f[11], f[15]);
+ LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[0], f[4], f[8], f[12]);
+ LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[1], f[5], f[9], f[13]);
+ LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[2], f[6], f[10], f[14]);
+ LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[3], f[7], f[11], f[15]);
}
void ProgramVertex::setupGL(const Context *rsc, ProgramVertexState *state)
@@ -53,7 +69,7 @@
}
state->mLast.set(this);
- const float *f = static_cast<const float *>(mConstants->getPtr());
+ const float *f = static_cast<const float *>(mConstants[0]->getPtr());
glMatrixMode(GL_TEXTURE);
if (mTextureMatrixEnable) {
@@ -92,6 +108,171 @@
mDirty = false;
}
+void ProgramVertex::loadShader(Context *rsc) {
+ Program::loadShader(rsc, GL_VERTEX_SHADER);
+}
+
+void ProgramVertex::createShader()
+{
+ mShader.setTo("");
+
+ mShader.append("varying vec4 varColor;\n");
+ mShader.append("varying vec4 varTex0;\n");
+
+ if (mUserShader.length() > 1) {
+ mShader.append("uniform mat4 ");
+ mShader.append(mUniformNames[0]);
+ mShader.append(";\n");
+
+ LOGE("constant %i ", mConstantCount);
+ for (uint32_t ct=0; ct < mConstantCount; ct++) {
+ const Element *e = mConstantTypes[ct]->getElement();
+ for (uint32_t field=0; field < e->getFieldCount(); field++) {
+ const Element *f = e->getField(field);
+
+ // Cannot be complex
+ rsAssert(!f->getFieldCount());
+ switch(f->getComponent().getVectorSize()) {
+ case 1: mShader.append("uniform float UNI_"); break;
+ case 2: mShader.append("uniform vec2 UNI_"); break;
+ case 3: mShader.append("uniform vec3 UNI_"); break;
+ case 4: mShader.append("uniform vec4 UNI_"); break;
+ default:
+ rsAssert(0);
+ }
+
+ mShader.append(e->getFieldName(field));
+ mShader.append(";\n");
+ }
+ }
+
+
+ for (uint32_t ct=0; ct < mInputCount; ct++) {
+ const Element *e = mInputElements[ct].get();
+ for (uint32_t field=0; field < e->getFieldCount(); field++) {
+ const Element *f = e->getField(field);
+
+ // Cannot be complex
+ rsAssert(!f->getFieldCount());
+ switch(f->getComponent().getVectorSize()) {
+ case 1: mShader.append("attribute float ATTRIB_"); break;
+ case 2: mShader.append("attribute vec2 ATTRIB_"); break;
+ case 3: mShader.append("attribute vec3 ATTRIB_"); break;
+ case 4: mShader.append("attribute vec4 ATTRIB_"); break;
+ default:
+ rsAssert(0);
+ }
+
+ mShader.append(e->getFieldName(field));
+ mShader.append(";\n");
+ }
+ }
+ mShader.append(mUserShader);
+ } else {
+ for (uint32_t ct=0; ct < mUniformCount; ct++) {
+ mShader.append("uniform mat4 ");
+ mShader.append(mUniformNames[ct]);
+ mShader.append(";\n");
+ }
+
+ for (uint32_t ct=VertexArray::POSITION; ct < mAttribCount; ct++) {
+ mShader.append("attribute vec4 ");
+ mShader.append(mAttribNames[ct]);
+ mShader.append(";\n");
+ }
+
+ mShader.append("void main() {\n");
+ mShader.append(" gl_Position = UNI_MVP * ATTRIB_Position;\n");
+ mShader.append(" gl_PointSize = ATTRIB_PointSize.x;\n");
+
+ mShader.append(" varColor = ATTRIB_Color;\n");
+ if (mTextureMatrixEnable) {
+ mShader.append(" varTex0 = UNI_TexMatrix * ATTRIB_Texture;\n");
+ } else {
+ mShader.append(" varTex0 = ATTRIB_Texture;\n");
+ }
+ //mShader.append(" pos.x = pos.x / 480.0;\n");
+ //mShader.append(" pos.y = pos.y / 800.0;\n");
+ //mShader.append(" gl_Position = pos;\n");
+ mShader.append("}\n");
+ }
+}
+
+void ProgramVertex::setupGL2(const Context *rsc, ProgramVertexState *state, ShaderCache *sc)
+{
+ //LOGE("sgl2 vtx1 %x", glGetError());
+ if ((state->mLast.get() == this) && !mDirty) {
+ //return;
+ }
+
+ glVertexAttrib4f(1, state->color[0], state->color[1], state->color[2], state->color[3]);
+
+ const float *f = static_cast<const float *>(mConstants[0]->getPtr());
+
+ Matrix mvp;
+ mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
+ Matrix t;
+ t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
+ mvp.multiply(&t);
+
+ glUniformMatrix4fv(sc->vtxUniformSlot(0), 1, GL_FALSE, mvp.m);
+ if (mTextureMatrixEnable) {
+ glUniformMatrix4fv(sc->vtxUniformSlot(1), 1, GL_FALSE,
+ &f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET]);
+ }
+
+ uint32_t uidx = 1;
+ for (uint32_t ct=0; ct < mConstantCount; ct++) {
+ Allocation *alloc = mConstants[ct+1].get();
+ if (!alloc) {
+ continue;
+ }
+
+ const uint8_t *data = static_cast<const uint8_t *>(alloc->getPtr());
+ const Element *e = mConstantTypes[ct]->getElement();
+ for (uint32_t field=0; field < e->getFieldCount(); field++) {
+ const Element *f = e->getField(field);
+ uint32_t offset = e->getFieldOffsetBytes(field);
+ int32_t slot = sc->vtxUniformSlot(uidx);
+
+ const float *fd = reinterpret_cast<const float *>(&data[offset]);
+
+ //LOGE("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i", slot, offset, ct, field, uidx);
+ if (slot >= 0) {
+ switch(f->getComponent().getVectorSize()) {
+ case 1:
+ //LOGE("Uniform 1 = %f", fd[0]);
+ glUniform1fv(slot, 1, fd);
+ break;
+ case 2:
+ //LOGE("Uniform 2 = %f %f", fd[0], fd[1]);
+ glUniform2fv(slot, 1, fd);
+ break;
+ case 3:
+ //LOGE("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]);
+ glUniform3fv(slot, 1, fd);
+ break;
+ case 4:
+ //LOGE("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]);
+ glUniform4fv(slot, 1, fd);
+ break;
+ default:
+ rsAssert(0);
+ }
+ }
+ uidx ++;
+ }
+ }
+
+ for (uint32_t ct=0; ct < mConstantCount; ct++) {
+ uint32_t glSlot = sc->vtxUniformSlot(ct + 1);
+
+ }
+
+ state->mLast.set(this);
+ rsc->checkError("ProgramVertex::setupGL2");
+}
+
void ProgramVertex::addLight(const Light *l)
{
if (mLightCount < MAX_LIGHTS) {
@@ -102,60 +283,109 @@
void ProgramVertex::setProjectionMatrix(const rsc_Matrix *m) const
{
- float *f = static_cast<float *>(mConstants->getPtr());
+ float *f = static_cast<float *>(mConstants[0]->getPtr());
memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix));
mDirty = true;
}
void ProgramVertex::setModelviewMatrix(const rsc_Matrix *m) const
{
- float *f = static_cast<float *>(mConstants->getPtr());
+ float *f = static_cast<float *>(mConstants[0]->getPtr());
memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix));
mDirty = true;
}
void ProgramVertex::setTextureMatrix(const rsc_Matrix *m) const
{
- float *f = static_cast<float *>(mConstants->getPtr());
+ float *f = static_cast<float *>(mConstants[0]->getPtr());
memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix));
mDirty = true;
}
void ProgramVertex::transformToScreen(const Context *rsc, float *v4out, const float *v3in) const
{
- float *f = static_cast<float *>(mConstants->getPtr());
+ float *f = static_cast<float *>(mConstants[0]->getPtr());
Matrix mvp;
mvp.loadMultiply((Matrix *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET],
(Matrix *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
mvp.vectorMultiply(v4out, v3in);
}
+void ProgramVertex::initAddUserElement(const Element *e, String8 *names, uint32_t *count, const char *prefix)
+{
+ rsAssert(e->getFieldCount());
+ for (uint32_t ct=0; ct < e->getFieldCount(); ct++) {
+ const Element *ce = e->getField(ct);
+ if (ce->getFieldCount()) {
+ initAddUserElement(ce, names, count, prefix);
+ } else {
+ String8 tmp(prefix);
+ tmp.append(e->getFieldName(ct));
+ names[*count].setTo(tmp.string());
+ (*count)++;
+ }
+ }
+}
+
+void ProgramVertex::init(Context *rsc)
+{
+ if (mUserShader.size() > 0) {
+ mAttribCount = 0;
+ for (uint32_t ct=0; ct < mInputCount; ct++) {
+ initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, "ATTRIB_");
+ }
+
+ mUniformCount = 1;
+ mUniformNames[0].setTo("UNI_MVP");
+ for (uint32_t ct=0; ct < mInputCount; ct++) {
+ initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_");
+ }
+ } else {
+ mAttribCount = 5;
+ mAttribNames[0].setTo("ATTRIB_Position");
+ mAttribNames[1].setTo("ATTRIB_Color");
+ mAttribNames[2].setTo("ATTRIB_Normal");
+ mAttribNames[3].setTo("ATTRIB_PointSize");
+ mAttribNames[4].setTo("ATTRIB_Texture");
+
+ mUniformCount = 2;
+ mUniformNames[0].setTo("UNI_MVP");
+ mUniformNames[1].setTo("UNI_TexMatrix");
+ }
+
+ createShader();
+}
+
+
+///////////////////////////////////////////////////////////////////////
+
ProgramVertexState::ProgramVertexState()
{
- mPV = NULL;
}
ProgramVertexState::~ProgramVertexState()
{
- delete mPV;
}
void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h)
{
- rsi_ElementBegin(rsc);
- rsi_ElementAdd(rsc, RS_KIND_USER, RS_TYPE_FLOAT, false, 32, NULL);
- RsElement e = rsi_ElementCreate(rsc);
+ RsElement e = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1);
rsi_TypeBegin(rsc, e);
rsi_TypeAdd(rsc, RS_DIMENSION_X, 48);
mAllocType.set((Type *)rsi_TypeCreate(rsc));
- ProgramVertex *pv = new ProgramVertex(rsc, NULL, NULL);
+ ProgramVertex *pv = new ProgramVertex(rsc, false);
Allocation *alloc = (Allocation *)rsi_AllocationCreateTyped(rsc, mAllocType.get());
mDefaultAlloc.set(alloc);
mDefault.set(pv);
+ pv->init(rsc);
+ pv->bindAllocation(alloc, 0);
- pv->bindAllocation(alloc);
+ color[0] = 1.f;
+ color[1] = 1.f;
+ color[2] = 1.f;
+ color[3] = 1.f;
updateSize(rsc, w, h);
}
@@ -176,42 +406,27 @@
mDefault.clear();
mAllocType.clear();
mLast.clear();
- delete mPV;
- mPV = NULL;
}
namespace android {
namespace renderscript {
-void rsi_ProgramVertexBegin(Context *rsc, RsElement in, RsElement out)
-{
- delete rsc->mStateVertex.mPV;
- rsc->mStateVertex.mPV = new ProgramVertex(rsc, (Element *)in, (Element *)out);
-}
-RsProgramVertex rsi_ProgramVertexCreate(Context *rsc)
+RsProgramVertex rsi_ProgramVertexCreate(Context *rsc, bool texMat)
{
- ProgramVertex *pv = rsc->mStateVertex.mPV;
+ ProgramVertex *pv = new ProgramVertex(rsc, texMat);
pv->incUserRef();
- rsc->mStateVertex.mPV = 0;
return pv;
}
-void rsi_ProgramVertexBindAllocation(Context *rsc, RsProgramVertex vpgm, RsAllocation constants)
+RsProgramVertex rsi_ProgramVertexCreate2(Context *rsc, const char * shaderText,
+ uint32_t shaderLength, const uint32_t * params,
+ uint32_t paramLength)
{
- ProgramVertex *pv = static_cast<ProgramVertex *>(vpgm);
- pv->bindAllocation(static_cast<Allocation *>(constants));
-}
-
-void rsi_ProgramVertexSetTextureMatrixEnable(Context *rsc, bool enable)
-{
- rsc->mStateVertex.mPV->setTextureMatrixEnable(enable);
-}
-
-void rsi_ProgramVertexAddLight(Context *rsc, RsLight light)
-{
- rsc->mStateVertex.mPV->addLight(static_cast<const Light *>(light));
+ ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength);
+ pv->incUserRef();
+ return pv;
}
diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h
index a97ba38..28554cc 100644
--- a/libs/rs/rsProgramVertex.h
+++ b/libs/rs/rsProgramVertex.h
@@ -30,10 +30,13 @@
public:
const static uint32_t MAX_LIGHTS = 8;
- ProgramVertex(Context *, Element *in, Element *out);
+ ProgramVertex(Context *,const char * shaderText, uint32_t shaderLength,
+ const uint32_t * params, uint32_t paramLength);
+ ProgramVertex(Context *, bool texMat);
virtual ~ProgramVertex();
virtual void setupGL(const Context *rsc, ProgramVertexState *state);
+ virtual void setupGL2(const Context *rsc, ProgramVertexState *state, ShaderCache *sc);
void setTextureMatrixEnable(bool e) {mTextureMatrixEnable = e;}
@@ -45,6 +48,10 @@
void transformToScreen(const Context *, float *v4out, const float *v3in) const;
+ virtual void createShader();
+ virtual void loadShader(Context *);
+ virtual void init(Context *);
+
protected:
uint32_t mLightCount;
@@ -52,6 +59,9 @@
// Hacks to create a program for now
bool mTextureMatrixEnable;
+
+private:
+ void initAddUserElement(const Element *e, String8 *names, uint32_t *count, const char *prefix);
};
@@ -71,11 +81,8 @@
ObjectBaseRef<Type> mAllocType;
- ProgramVertex *mPV;
- //ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
-
-
+ float color[4];
};
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index b793750..f9bdb2e 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -64,7 +64,6 @@
};
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]);
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index f11b862..b7e0b86 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -137,7 +137,6 @@
rsc->appendNameDefines(&tmp);
appendDecls(&tmp);
- rsc->appendVarDefines(&tmp);
appendVarDefines(rsc, &tmp);
appendTypes(rsc, &tmp);
tmp.append("#line 1\n");
@@ -270,12 +269,12 @@
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);
+ for (size_t ct2=0; ct2 < e->getFieldCount(); ct2++) {
+ const Element *c = e->getField(ct2);
s->append(" ");
s->append(c->getCType());
s->append(" ");
- s->append(c->getComponentName());
+ s->append(e->getFieldName(ct2));
s->append(";\n");
}
s->append("}");
@@ -311,9 +310,15 @@
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;};");
+ str->append("struct vecF32_2_s {float x; float y;};\n");
+ str->append("struct vecF32_3_s {float x; float y; float z;};\n");
+ str->append("struct vecF32_4_s {float x; float y; float z; float w;};\n");
+ str->append("struct vecU8_4_s {char r; char g; char b; char a;};\n");
+ str->append("#define vecF32_2_t struct vecF32_2_s\n");
+ str->append("#define vecF32_3_t struct vecF32_3_s\n");
+ str->append("#define vecF32_4_t struct vecF32_4_s\n");
+ str->append("#define vecU8_4_t struct vecU8_4_s\n");
+ str->append("#define vecI8_4_t struct vecU8_4_s\n");
for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
const Type *t = mConstantBufferTypes[ct].get();
@@ -321,11 +326,12 @@
continue;
}
const Element *e = t->getElement();
- if (e->getName() && (e->getComponentCount() > 1)) {
+ if (e->getName() && (e->getFieldCount() > 1)) {
String8 s("struct struct_");
s.append(e->getName());
- appendElementBody(&s, e);
+ s.append(e->getCStructBody());
s.append(";\n");
+
s.append("#define ");
s.append(e->getName());
s.append("_t struct struct_");
@@ -337,45 +343,25 @@
str->append(s);
}
- if (t->getName()) {
- for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
- const Component *c = e->getComponent(ct2);
- tmp.setTo("#define OFFSETOF_");
- tmp.append(t->getName());
- tmp.append("_");
- tmp.append(c->getComponentName());
- sprintf(buf, " %i\n", ct2);
- tmp.append(buf);
- if (rsc->props.mLogScripts) {
- LOGV(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 * ");
- }
+ if (e->getName()) {
+ // Use the named struct
+ s.setTo(e->getName());
} else {
- // Just make an array
- s.setTo(e->getComponent(0)->getCType());
- s.append("_t *");
+ // create an struct named from the slot.
+ s.setTo("struct ");
+ s.append(mSlotNames[ct]);
+ s.append("_s");
+ s.append(e->getCStructBody());
+ //appendElementBody(&s, e);
+ s.append(";\n");
+ s.append("struct ");
+ s.append(mSlotNames[ct]);
+ s.append("_s");
}
+
+ s.append(" * ");
s.append(mSlotNames[ct]);
s.append(";\n");
if (rsc->props.mLogScripts) {
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 23888ff..3ba9cee 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -26,6 +26,8 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
#include <time.h>
@@ -102,8 +104,9 @@
static void SC_updateSimpleMesh(RsSimpleMesh mesh)
{
+ GET_TLS();
SimpleMesh *sm = static_cast<SimpleMesh *>(mesh);
- sm->uploadAll();
+ sm->uploadAll(rsc);
}
static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
@@ -616,20 +619,20 @@
static void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
{
GET_TLS();
- rsi_ProgramFragmentBindTexture(rsc,
- static_cast<ProgramFragment *>(vpf),
- slot,
- static_cast<Allocation *>(va));
+ rsi_ProgramBindTexture(rsc,
+ static_cast<ProgramFragment *>(vpf),
+ slot,
+ static_cast<Allocation *>(va));
}
static void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
{
GET_TLS();
- rsi_ProgramFragmentBindSampler(rsc,
- static_cast<ProgramFragment *>(vpf),
- slot,
- static_cast<Sampler *>(vs));
+ rsi_ProgramBindSampler(rsc,
+ static_cast<ProgramFragment *>(vpf),
+ slot,
+ static_cast<Sampler *>(vs));
}
@@ -683,13 +686,13 @@
rsc->setupCheck();
float vtx[] = { x1, y1, z1, x2, y2, z2 };
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, vtx);
-
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
+ VertexArray va;
+ va.setPosition(2, GL_FLOAT, 12, (uint32_t)&vtx);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
glDrawArrays(GL_LINES, 0, 2);
}
@@ -701,12 +704,13 @@
float vtx[] = { x, y, z };
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, vtx);
-
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
+ VertexArray va;
+ va.setPosition(1, GL_FLOAT, 12, (uint32_t)&vtx);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
glDrawArrays(GL_POINTS, 0, 1);
}
@@ -721,6 +725,7 @@
float u4, float v4)
{
GET_TLS();
+ rsc->setupCheck();
//LOGE("Quad");
//LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
@@ -731,26 +736,15 @@
float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
- rsc->setupCheck();
+ VertexArray va;
+ va.setPosition(3, GL_FLOAT, 12, (uint32_t)&vtx);
+ va.setTexture(2, GL_FLOAT, 8, (uint32_t)&tex);
+ if (rsc->checkVersion2_0()) {
+ va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
+ } else {
+ va.setupGL(rsc, &rsc->mStateVertexArray);
+ }
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, vtx);
-
- glClientActiveTexture(GL_TEXTURE0);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, tex);
- glClientActiveTexture(GL_TEXTURE1);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, tex);
- glClientActiveTexture(GL_TEXTURE0);
-
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
-
- //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
@@ -769,18 +763,24 @@
static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
{
GET_TLS();
- rsc->setupCheck();
+ ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
+ rsc->setVertex(rsc->getDefaultProgramVertex());
+ //rsc->setupCheck();
- GLint crop[4] = {0, h, w, -h};
- glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
- glDrawTexfOES(x, y, z, w, h);
+ //GLint crop[4] = {0, h, w, -h};
+
+ float sh = rsc->getHeight();
+
+ SC_drawQuad(x, sh - y, z,
+ x+w, sh - y, z,
+ x+w, sh - (y+h), z,
+ x, sh - (y+h), z);
+ rsc->setVertex((ProgramVertex *)tmp.get());
}
static void SC_drawSprite(float x, float y, float z, float w, float h)
{
GET_TLS();
- rsc->setupCheck();
-
float vin[3] = {x, y, z};
float vout[4];
@@ -802,9 +802,8 @@
//LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]);
// U, V, W, H
- GLint crop[4] = {0, h, w, -h};
- glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
- glDrawTexiOES(vout[0], vout[1], 0/*vout[2]*/, w, h);
+ SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
+ //rsc->setupCheck();
}
@@ -822,7 +821,7 @@
GET_TLS();
SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
rsc->setupCheck();
- sm->render();
+ sm->render(rsc);
}
static void SC_drawSimpleMeshRange(RsSimpleMesh vsm, uint32_t start, uint32_t len)
@@ -830,7 +829,7 @@
GET_TLS();
SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
rsc->setupCheck();
- sm->renderRange(start, len);
+ sm->renderRange(rsc, start, len);
}
@@ -840,7 +839,14 @@
static void SC_color(float r, float g, float b, float a)
{
- glColor4f(r, g, b, a);
+ GET_TLS();
+ rsc->mStateVertex.color[0] = r;
+ rsc->mStateVertex.color[1] = g;
+ rsc->mStateVertex.color[2] = b;
+ rsc->mStateVertex.color[3] = a;
+ if (!rsc->checkVersion2_0()) {
+ glColor4f(r, g, b, a);
+ }
}
static void SC_ambient(float r, float g, float b, float a)
@@ -945,9 +951,14 @@
static void SC_hsb(float h, float s, float b, float a)
{
+ GET_TLS();
float rgb[3];
SC_hsbToRgb(h, s, b, rgb);
- glColor4f(rgb[0], rgb[1], rgb[2], a);
+ if (rsc->checkVersion2_0()) {
+ glVertexAttrib4f(1, rgb[0], rgb[1], rgb[2], a);
+ } else {
+ glColor4f(rgb[0], rgb[1], rgb[2], a);
+ }
}
static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
@@ -962,6 +973,13 @@
rsi_AllocationUploadToBufferObject(rsc, va);
}
+static void SC_syncToGL(RsAllocation va)
+{
+ GET_TLS();
+ Allocation *a = static_cast<Allocation *>(va);
+
+}
+
static void SC_ClearColor(float r, float g, float b, float a)
{
//LOGE("c %f %f %f %f", r, g, b, a);
@@ -1210,33 +1228,33 @@
// vec3
{ "vec3Norm", (void *)&SC_vec3Norm,
- "void", "(struct vec3_s *)" },
+ "void", "(struct vecF32_3_s *)" },
{ "vec3Length", (void *)&SC_vec3Length,
- "float", "(struct vec3_s *)" },
+ "float", "(struct vecF32_3_s *)" },
{ "vec3Add", (void *)&SC_vec3Add,
- "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
{ "vec3Sub", (void *)&SC_vec3Sub,
- "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
{ "vec3Cross", (void *)&SC_vec3Cross,
- "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
{ "vec3Dot", (void *)&SC_vec3Dot,
- "float", "(struct vec3_s *lhs, struct vec3_s *rhs)" },
+ "float", "(struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
{ "vec3Scale", (void *)&SC_vec3Scale,
- "void", "(struct vec3_s *lhs, float scale)" },
+ "void", "(struct vecF32_3_s *lhs, float scale)" },
// vec4
{ "vec4Norm", (void *)&SC_vec4Norm,
- "void", "(struct vec4_s *)" },
+ "void", "(struct vecF32_4_s *)" },
{ "vec4Length", (void *)&SC_vec4Length,
- "float", "(struct vec4_s *)" },
+ "float", "(struct vecF32_4_s *)" },
{ "vec4Add", (void *)&SC_vec4Add,
- "void", "(struct vec4_s *dest, struct vec4_s *lhs, struct vec4_s *rhs)" },
+ "void", "(struct vecF32_4_s *dest, struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
{ "vec4Sub", (void *)&SC_vec4Sub,
- "void", "(struct vec4_s *dest, struct vec4_s *lhs, struct vec4_s *rhs)" },
+ "void", "(struct vecF32_4_s *dest, struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
{ "vec4Dot", (void *)&SC_vec4Dot,
- "float", "(struct vec4_s *lhs, struct vec4_s *rhs)" },
+ "float", "(struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
{ "vec4Scale", (void *)&SC_vec4Scale,
- "void", "(struct vec4_s *lhs, float scale)" },
+ "void", "(struct vecF32_4_s *lhs, float scale)" },
// context
{ "bindProgramFragment", (void *)&SC_bindProgramFragment,
@@ -1310,6 +1328,9 @@
{ "uploadToBufferObject", (void *)&SC_uploadToBufferObject,
"void", "(int)" },
+ { "syncToGL", (void *)&SC_syncToGL,
+ "void", "(int)" },
+
{ "colorFloatRGBAtoUNorm8", (void *)&SC_colorFloatRGBAtoUNorm8,
"int", "(float, float, float, float)" },
{ "colorFloatRGBto565", (void *)&SC_colorFloatRGBAto565,
diff --git a/libs/rs/rsShaderCache.cpp b/libs/rs/rsShaderCache.cpp
new file mode 100644
index 0000000..8ac2487
--- /dev/null
+++ b/libs/rs/rsShaderCache.cpp
@@ -0,0 +1,161 @@
+/*
+ * 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 "rsContext.h"
+
+#include <GLES/gl.h>
+#include <GLES2/gl2.h>
+
+using namespace android;
+using namespace android::renderscript;
+
+
+ShaderCache::ShaderCache()
+{
+ mEntryCount = 0;
+ mEntryAllocationCount = 16;
+ mEntries = (entry_t *)calloc(mEntryAllocationCount, sizeof(entry_t));
+}
+
+ShaderCache::~ShaderCache()
+{
+ for (uint32_t ct=0; ct < mEntryCount; ct++) {
+ glDeleteProgram(mEntries[ct].program);
+ }
+
+ mEntryCount = 0;
+ mEntryAllocationCount = 0;
+ free(mEntries);
+}
+
+bool ShaderCache::lookup(Context *rsc, ProgramVertex *vtx, ProgramFragment *frag)
+{
+ if (!vtx->getShaderID()) {
+ vtx->loadShader(rsc);
+ }
+ if (!frag->getShaderID()) {
+ frag->loadShader(rsc);
+ }
+ //LOGV("ShaderCache lookup vtx %i, frag %i", vtx->getShaderID(), frag->getShaderID());
+
+ for (uint32_t ct=0; ct < mEntryCount; ct++) {
+ if ((mEntries[ct].vtx == vtx->getShaderID()) &&
+ (mEntries[ct].frag == frag->getShaderID())) {
+
+ //LOGV("SC using program %i", mEntries[ct].program);
+ glUseProgram(mEntries[ct].program);
+ mCurrent = &mEntries[ct];
+ //LOGV("ShaderCache hit, using %i", ct);
+ rsc->checkError("ShaderCache::lookup (hit)");
+ return true;
+ }
+ }
+ // Not in cache, add it.
+
+ if (mEntryAllocationCount == mEntryCount) {
+ // Out of space, make some.
+ mEntryAllocationCount *= 2;
+ entry_t *e = (entry_t *)calloc(mEntryAllocationCount, sizeof(entry_t));
+ if (!e) {
+ LOGE("Out of memory for ShaderCache::lookup");
+ return false;
+ }
+ memcpy(e, mEntries, sizeof(entry_t) * mEntryCount);
+ free(mEntries);
+ mEntries = e;
+ }
+
+ //LOGV("ShaderCache miss, using %i", mEntryCount);
+ //LOGE("e0 %x", glGetError());
+
+ entry_t *e = &mEntries[mEntryCount];
+ mCurrent = e;
+ e->vtx = vtx->getShaderID();
+ e->frag = frag->getShaderID();
+ e->program = glCreateProgram();
+ if (mEntries[mEntryCount].program) {
+ GLuint pgm = e->program;
+ glAttachShader(pgm, vtx->getShaderID());
+ //LOGE("e1 %x", glGetError());
+ glAttachShader(pgm, frag->getShaderID());
+
+ if (!vtx->isUserProgram()) {
+ glBindAttribLocation(pgm, VertexArray::POSITION, "ATTRIB_Position");
+ glBindAttribLocation(pgm, VertexArray::COLOR, "ATTRIB_Color");
+ glBindAttribLocation(pgm, VertexArray::NORMAL, "ATTRIB_Normal");
+ glBindAttribLocation(pgm, VertexArray::POINT_SIZE, "ATTRIB_PointSize");
+ glBindAttribLocation(pgm, VertexArray::TEXTURE, "ATTRIB_T0");
+ } else {
+
+ }
+
+ //LOGE("e2 %x", glGetError());
+ glLinkProgram(pgm);
+ //LOGE("e3 %x", glGetError());
+ GLint linkStatus = GL_FALSE;
+ glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus);
+ if (linkStatus != GL_TRUE) {
+ GLint bufLength = 0;
+ glGetProgramiv(pgm, GL_INFO_LOG_LENGTH, &bufLength);
+ if (bufLength) {
+ char* buf = (char*) malloc(bufLength);
+ if (buf) {
+ glGetProgramInfoLog(pgm, bufLength, NULL, buf);
+ LOGE("Could not link program:\n%s\n", buf);
+ free(buf);
+ }
+ }
+ glDeleteProgram(pgm);
+ }
+ for (uint32_t ct=0; ct < vtx->getAttribCount(); ct++) {
+ e->mVtxAttribSlots[ct] = glGetAttribLocation(pgm, vtx->getAttribName(ct));
+ if (rsc->props.mLogShaders) {
+ LOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->mVtxAttribSlots[ct]);
+ }
+ }
+ for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) {
+ e->mVtxUniformSlots[ct] = glGetUniformLocation(pgm, vtx->getUniformName(ct));
+ if (rsc->props.mLogShaders) {
+ LOGV("vtx U, %s = %d\n", vtx->getUniformName(ct).string(), e->mVtxUniformSlots[ct]);
+ }
+ }
+ for (uint32_t ct=0; ct < frag->getUniformCount(); ct++) {
+ e->mFragUniformSlots[ct] = glGetUniformLocation(pgm, frag->getUniformName(ct));
+ if (rsc->props.mLogShaders) {
+ LOGV("frag U, %s = %d\n", frag->getUniformName(ct).string(), e->mFragUniformSlots[ct]);
+ }
+ }
+ }
+
+ //LOGV("SC made program %i", e->program);
+ glUseProgram(e->program);
+ mEntryCount++;
+ rsc->checkError("ShaderCache::lookup (miss)");
+ return true;
+}
+
+void ShaderCache::cleanupVertex(uint32_t id)
+{
+}
+
+void ShaderCache::cleanupFragment(uint32_t id)
+{
+}
+
+void ShaderCache::cleanupAll()
+{
+}
+
diff --git a/libs/rs/rsShaderCache.h b/libs/rs/rsShaderCache.h
new file mode 100644
index 0000000..ede3734
--- /dev/null
+++ b/libs/rs/rsShaderCache.h
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_SHADER_CACHE_H
+#define ANDROID_SHADER_CACHE_H
+
+
+#include "rsObjectBase.h"
+#include "rsVertexArray.h"
+
+// ---------------------------------------------------------------------------
+namespace android {
+namespace renderscript {
+
+
+// An element is a group of Components that occupies one cell in a structure.
+class ShaderCache
+{
+public:
+ ShaderCache();
+ virtual ~ShaderCache();
+
+ bool lookup(Context *rsc, ProgramVertex *, ProgramFragment *);
+
+ void cleanupVertex(uint32_t id);
+ void cleanupFragment(uint32_t id);
+
+ void cleanupAll();
+
+ int32_t vtxAttribSlot(uint32_t a) const {return mCurrent->mVtxAttribSlots[a];}
+ int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->mVtxUniformSlots[a];}
+ int32_t fragAttribSlot(uint32_t a) const {return mCurrent->mFragAttribSlots[a];}
+ int32_t fragUniformSlot(uint32_t a) const {return mCurrent->mFragUniformSlots[a];}
+
+protected:
+ typedef struct {
+ uint32_t vtx;
+ uint32_t frag;
+ uint32_t program;
+ int32_t mVtxAttribSlots[Program::MAX_ATTRIBS];
+ int32_t mVtxUniformSlots[Program::MAX_UNIFORMS];
+ int32_t mFragAttribSlots[Program::MAX_ATTRIBS];
+ int32_t mFragUniformSlots[Program::MAX_UNIFORMS];
+ } entry_t;
+ entry_t *mEntries;
+ entry_t *mCurrent;
+
+ uint32_t mEntryCount;
+ uint32_t mEntryAllocationCount;
+
+};
+
+
+
+}
+}
+#endif //ANDROID_SHADER_CACHE_H
+
+
+
+
diff --git a/libs/rs/rsSimpleMesh.cpp b/libs/rs/rsSimpleMesh.cpp
index b082fd7..a819c07 100644
--- a/libs/rs/rsSimpleMesh.cpp
+++ b/libs/rs/rsSimpleMesh.cpp
@@ -34,62 +34,71 @@
delete[] mVertexBuffers;
}
-void SimpleMesh::render() const
+void SimpleMesh::render(Context *rsc) const
{
if (mPrimitiveType.get()) {
- renderRange(0, mPrimitiveType->getDimX());
+ renderRange(rsc, 0, mPrimitiveType->getDimX());
return;
}
if (mIndexType.get()) {
- renderRange(0, mIndexType->getDimX());
+ renderRange(rsc, 0, mIndexType->getDimX());
return;
}
- renderRange(0, mVertexTypes[0]->getDimX());
+ renderRange(rsc, 0, mVertexTypes[0]->getDimX());
}
-void SimpleMesh::renderRange(uint32_t start, uint32_t len) const
+void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const
{
if (len < 1) {
return;
}
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
- for (uint32_t ct=0; ct < RS_MAX_TEXTURE; ct++) {
- glClientActiveTexture(GL_TEXTURE0 + ct);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- }
- glClientActiveTexture(GL_TEXTURE0);
-
- for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
- glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffers[ct]->getBufferObjectID());
- mVertexTypes[ct]->enableGLVertexBuffer();
+ rsc->checkError("SimpleMesh::renderRange 1");
+ VertexArray va;
+ if (rsc->checkVersion2_0()) {
+ for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
+ mVertexBuffers[ct]->uploadCheck(rsc);
+ va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
+ mVertexTypes[ct]->enableGLVertexBuffer2(&va);
+ }
+ va.setupGL2(rsc, 0, &rsc->mShaderCache);
+ } else {
+ for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
+ mVertexBuffers[ct]->uploadCheck(rsc);
+ va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
+ mVertexTypes[ct]->enableGLVertexBuffer(&va);
+ }
+ va.setupGL(rsc, 0);
}
+ rsc->checkError("SimpleMesh::renderRange 2");
if (mIndexType.get()) {
+ mIndexBuffer->uploadCheck(rsc);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID());
glDrawElements(mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2));
} else {
glDrawArrays(mGLPrimitive, start, len);
}
+
+ rsc->checkError("SimpleMesh::renderRange");
}
-void SimpleMesh::uploadAll()
+void SimpleMesh::uploadAll(Context *rsc)
{
for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
if (mVertexBuffers[ct].get()) {
- mVertexBuffers[ct]->uploadToBufferObject();
+ mVertexBuffers[ct]->deferedUploadToBufferObject(rsc);
}
}
if (mIndexBuffer.get()) {
- mIndexBuffer->uploadToBufferObject();
+ mIndexBuffer->deferedUploadToBufferObject(rsc);
}
if (mPrimitiveBuffer.get()) {
- mPrimitiveBuffer->uploadToBufferObject();
+ mPrimitiveBuffer->deferedUploadToBufferObject(rsc);
}
+ rsc->checkError("SimpleMesh::uploadAll");
}
diff --git a/libs/rs/rsSimpleMesh.h b/libs/rs/rsSimpleMesh.h
index 1e5c908..6defbda 100644
--- a/libs/rs/rsSimpleMesh.h
+++ b/libs/rs/rsSimpleMesh.h
@@ -45,9 +45,9 @@
uint32_t mGLPrimitive;
- void render() const;
- void renderRange(uint32_t start, uint32_t len) const;
- void uploadAll();
+ void render(Context *) const;
+ void renderRange(Context *, uint32_t start, uint32_t len) const;
+ void uploadAll(Context *);
protected:
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
index ddaa2f0..ddadd9f 100644
--- a/libs/rs/rsType.cpp
+++ b/libs/rs/rsType.cpp
@@ -26,7 +26,6 @@
mAllocLine = __LINE__;
mLODs = 0;
mLODCount = 0;
- memset(&mGL, 0, sizeof(mGL));
clear();
}
@@ -93,9 +92,9 @@
mLODs[lod].mZ = tz;
mLODs[lod].mOffset = offset;
offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
- tx = (tx + 1) >> 1;
- ty = (ty + 1) >> 1;
- tz = (tz + 1) >> 1;
+ if (tx > 1) tx >>= 1;
+ if (ty > 1) ty >>= 1;
+ if (tz > 1) tz >>= 1;
}
// At this point the offset is the size of a mipmap chain;
@@ -133,110 +132,64 @@
void Type::makeGLComponents()
{
- uint32_t texNum = 0;
- memset(&mGL, 0, sizeof(mGL));
+ uint32_t userNum = 0;
- for (uint32_t ct=0; ct < getElement()->getComponentCount(); ct++) {
- const Component *c = getElement()->getComponent(ct);
+ for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
+ const Component &c = getElement()->getField(ct)->getComponent();
- switch(c->getKind()) {
- case Component::X:
+ switch(c.getKind()) {
+ case RS_KIND_USER:
+ mGL.mUser[userNum].size = c.getVectorSize();
+ mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mUser[userNum].type = c.getGLType();
+ mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
+ mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct));
+ userNum ++;
+ break;
+
+ case RS_KIND_POSITION:
rsAssert(mGL.mVtx.size == 0);
- mGL.mVtx.size = 1;
- mGL.mVtx.offset = mElement->getComponentOffsetBytes(ct);
- mGL.mVtx.type = c->getGLType();
+ mGL.mVtx.size = c.getVectorSize();
+ mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mVtx.type = c.getGLType();
+ mGL.mVtx.normalized = false;
+ mGL.mVtx.name.setTo("Position");
break;
- case Component::Y:
- rsAssert(mGL.mVtx.size == 1);
- rsAssert(mGL.mVtx.type == c->getGLType());
- mGL.mVtx.size = 2;
- break;
- case Component::Z:
- rsAssert(mGL.mVtx.size == 2);
- rsAssert(mGL.mVtx.type == c->getGLType());
- mGL.mVtx.size = 3;
- break;
- case Component::W:
- rsAssert(mGL.mVtx.size == 4);
- rsAssert(mGL.mVtx.type == c->getGLType());
- mGL.mVtx.size = 4;
- break;
- case Component::RED:
+ case RS_KIND_COLOR:
rsAssert(mGL.mColor.size == 0);
- mGL.mColor.size = 1;
- mGL.mColor.offset = mElement->getComponentOffsetBytes(ct);
- mGL.mColor.type = c->getGLType();
+ mGL.mColor.size = c.getVectorSize();
+ mGL.mColor.offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mColor.type = c.getGLType();
+ mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32;
+ mGL.mColor.name.setTo("Color");
break;
- case Component::GREEN:
- rsAssert(mGL.mColor.size == 1);
- rsAssert(mGL.mColor.type == c->getGLType());
- mGL.mColor.size = 2;
- break;
- case Component::BLUE:
- rsAssert(mGL.mColor.size == 2);
- rsAssert(mGL.mColor.type == c->getGLType());
- mGL.mColor.size = 3;
- break;
- case Component::ALPHA:
- // Can be RGBA or A at this point
- if (mGL.mColor.size > 0) {
- rsAssert(mGL.mColor.size == 3);
- rsAssert(mGL.mColor.type == c->getGLType());
- mGL.mColor.size = 4;
- } else {
- mGL.mColor.size = 1;
- mGL.mColor.offset = mElement->getComponentOffsetBytes(ct);
- mGL.mColor.type = c->getGLType();
- }
- break;
- case Component::NX:
+ case RS_KIND_NORMAL:
rsAssert(mGL.mNorm.size == 0);
- mGL.mNorm.size = 1;
- mGL.mNorm.offset = mElement->getComponentOffsetBytes(ct);
- mGL.mNorm.type = c->getGLType();
- break;
- case Component::NY:
- rsAssert(mGL.mNorm.size == 1);
- rsAssert(mGL.mNorm.type == c->getGLType());
- mGL.mNorm.size = 2;
- break;
- case Component::NZ:
- rsAssert(mGL.mNorm.size == 2);
- rsAssert(mGL.mNorm.type == c->getGLType());
- mGL.mNorm.size = 3;
- break;
+ mGL.mNorm.size = c.getVectorSize();
+ mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mNorm.type = c.getGLType();
+ mGL.mNorm.normalized = false;
+ mGL.mNorm.name.setTo("Normal");
+ break;
- case Component::S:
- if (mGL.mTex[texNum].size) {
- texNum++;
- }
- mGL.mTex[texNum].size = 1;
- mGL.mTex[texNum].offset = mElement->getComponentOffsetBytes(ct);
- mGL.mTex[texNum].type = c->getGLType();
- break;
- case Component::T:
- rsAssert(mGL.mTex[texNum].size == 1);
- rsAssert(mGL.mTex[texNum].type == c->getGLType());
- mGL.mTex[texNum].size = 2;
- break;
- case Component::R:
- rsAssert(mGL.mTex[texNum].size == 2);
- rsAssert(mGL.mTex[texNum].type == c->getGLType());
- mGL.mTex[texNum].size = 3;
- break;
- case Component::Q:
- rsAssert(mGL.mTex[texNum].size == 3);
- rsAssert(mGL.mTex[texNum].type == c->getGLType());
- mGL.mTex[texNum].size = 4;
- break;
+ case RS_KIND_TEXTURE:
+ rsAssert(mGL.mTex.size == 0);
+ mGL.mTex.size = c.getVectorSize();
+ mGL.mTex.offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mTex.type = c.getGLType();
+ mGL.mTex.normalized = false;
+ mGL.mTex.name.setTo("Texture");
+ break;
- case Component::POINT_SIZE:
+ case RS_KIND_POINT_SIZE:
rsAssert(!mGL.mPointSize.size);
- mGL.mPointSize.size = 1;
- mGL.mPointSize.offset = mElement->getComponentOffsetBytes(ct);
- mGL.mPointSize.type = c->getGLType();
+ mGL.mPointSize.size = c.getVectorSize();
+ mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct);
+ mGL.mPointSize.type = c.getGLType();
+ mGL.mPointSize.normalized = false;
+ mGL.mPointSize.name.setTo("PointSize");
break;
default:
@@ -245,62 +198,63 @@
}
}
-void Type::enableGLVertexBuffer() const
+void Type::enableGLVertexBuffer(VertexArray *va) const
{
// Note: We are only going to enable buffers and never disable them
- // here. The reasonis more than one Allocation may be used as a vertex
+ // here. The reason is more than one Allocation may be used as a vertex
// source. So we cannot disable arrays that may have been in use by
// another allocation.
uint32_t stride = mElement->getSizeBytes();
if (mGL.mVtx.size) {
- //LOGE("va vtx %i %x, %i, %p", mGL.mVtx.size, mGL.mVtx.type, stride, (void *)mGL.mVtx.offset);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(mGL.mVtx.size,
+ va->setPosition(mGL.mVtx.size,
mGL.mVtx.type,
stride,
- (void *)mGL.mVtx.offset);
+ mGL.mVtx.offset);
}
if (mGL.mNorm.size) {
- //LOGE("va norm %i %x, %i, %p", mGL.mNorm.size, mGL.mNorm.type, stride, (void *)mGL.mNorm.offset);
- glEnableClientState(GL_NORMAL_ARRAY);
- rsAssert(mGL.mNorm.size == 3);
- glNormalPointer(mGL.mNorm.type,
- stride,
- (void *)mGL.mNorm.offset);
+ va->setNormal(mGL.mNorm.type,
+ stride,
+ mGL.mNorm.offset);
}
if (mGL.mColor.size) {
- glEnableClientState(GL_COLOR_ARRAY);
- glColorPointer(mGL.mColor.size,
- mGL.mColor.type,
- stride,
- (void *)mGL.mColor.offset);
+ va->setColor(mGL.mColor.size,
+ mGL.mColor.type,
+ stride,
+ mGL.mColor.offset);
}
- for (uint32_t ct=0; ct < RS_MAX_TEXTURE; ct++) {
- if (mGL.mTex[ct].size) {
- //LOGE("va tex%i %i %x, %i, %p", ct, mGL.mTex[ct].size, mGL.mTex[ct].type, stride, (void *)mGL.mTex[ct].offset);
- glClientActiveTexture(GL_TEXTURE0 + ct);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(mGL.mTex[ct].size,
- mGL.mTex[ct].type,
- stride,
- (void *)mGL.mTex[ct].offset);
- }
+ if (mGL.mTex.size) {
+ va->setTexture(mGL.mTex.size,
+ mGL.mTex.type,
+ stride,
+ mGL.mTex.offset);
}
- glClientActiveTexture(GL_TEXTURE0);
if (mGL.mPointSize.size) {
- glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
- glPointSizePointerOES(mGL.mPointSize.type,
- stride,
- (void *)mGL.mPointSize.offset);
+ va->setPointSize(mGL.mPointSize.type,
+ stride,
+ mGL.mPointSize.offset);
}
}
+void Type::enableGLVertexBuffer2(VertexArray *va) const
+{
+ // Do legacy buffers
+ enableGLVertexBuffer(va);
+
+ uint32_t stride = mElement->getSizeBytes();
+ for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
+ if (mGL.mUser[ct].size) {
+ va->setUser(mGL.mUser[ct], stride);
+ }
+ }
+}
+
+
void Type::dumpLOGV(const char *prefix) const
{
diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h
index 2c43405..4fa4933 100644
--- a/libs/rs/rsType.h
+++ b/libs/rs/rsType.h
@@ -18,6 +18,7 @@
#define ANDROID_STRUCTURED_TYPE_H
#include "rsElement.h"
+#include "rsVertexArray.h"
// ---------------------------------------------------------------------------
namespace android {
@@ -67,7 +68,8 @@
void clear();
void compute();
- void enableGLVertexBuffer() const;
+ void enableGLVertexBuffer(class VertexArray *) const;
+ void enableGLVertexBuffer2(class VertexArray *) const;
void dumpLOGV(const char *prefix) const;
@@ -108,18 +110,13 @@
LOD *mLODs;
uint32_t mLODCount;
- struct VertexComponent_t {
- uint32_t offset;
- uint32_t type;
- uint32_t size;
- uint32_t stride;
- };
struct GLState_t {
- VertexComponent_t mVtx;
- VertexComponent_t mNorm;
- VertexComponent_t mColor;
- VertexComponent_t mTex[RS_MAX_TEXTURE];
- VertexComponent_t mPointSize;
+ VertexArray::Attrib mUser[RS_MAX_ATTRIBS];
+ VertexArray::Attrib mVtx;
+ VertexArray::Attrib mNorm;
+ VertexArray::Attrib mColor;
+ VertexArray::Attrib mTex;
+ VertexArray::Attrib mPointSize;
};
GLState_t mGL;
void makeGLComponents();
diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h
index 07f8933..3c6da68 100644
--- a/libs/rs/rsUtils.h
+++ b/libs/rs/rsUtils.h
@@ -17,7 +17,6 @@
#ifndef ANDROID_RS_UTILS_H
#define ANDROID_RS_UTILS_H
-#define LOG_NDEBUG 0
#define LOG_TAG "RenderScript"
#include <utils/Log.h>
#include <utils/Vector.h>
diff --git a/libs/rs/rsVertexArray.cpp b/libs/rs/rsVertexArray.cpp
new file mode 100644
index 0000000..7124eb5
--- /dev/null
+++ b/libs/rs/rsVertexArray.cpp
@@ -0,0 +1,238 @@
+/*
+ * 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 "rsContext.h"
+
+#include <GLES/gl.h>
+#include <GLES2/gl2.h>
+
+using namespace android;
+using namespace android::renderscript;
+
+
+VertexArray::VertexArray()
+{
+ mActiveBuffer = 0;
+}
+
+VertexArray::~VertexArray()
+{
+}
+
+
+void VertexArray::clearAll()
+{
+ for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
+ mAttribs[ct].clear();
+ }
+ mActiveBuffer = 0;
+}
+
+VertexArray::Attrib::Attrib()
+{
+ clear();
+}
+
+void VertexArray::Attrib::set(const Attrib &a)
+{
+ buffer = a.buffer;
+ offset = a.offset;
+ type = a.type;
+ size = a.size;
+ stride = a.stride;
+ normalized = a.normalized;
+ name.setTo(a.name);
+}
+
+void VertexArray::Attrib::clear()
+{
+ buffer = 0;
+ offset = 0;
+ type = 0;
+ size = 0;
+ stride = 0;
+ normalized = false;
+ name.setTo("");
+}
+
+void VertexArray::clear(AttribName n)
+{
+ mAttribs[n].clear();
+}
+
+void VertexArray::setPosition(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset)
+{
+ mAttribs[POSITION].buffer = mActiveBuffer;
+ mAttribs[POSITION].type = type;
+ mAttribs[POSITION].size = size;
+ mAttribs[POSITION].offset = offset;
+ mAttribs[POSITION].stride = stride;
+ mAttribs[POSITION].normalized = false;
+}
+
+void VertexArray::setColor(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset)
+{
+ mAttribs[COLOR].buffer = mActiveBuffer;
+ mAttribs[COLOR].type = type;
+ mAttribs[COLOR].size = size;
+ mAttribs[COLOR].offset = offset;
+ mAttribs[COLOR].stride = stride;
+ mAttribs[COLOR].normalized = type != GL_FLOAT;
+}
+
+void VertexArray::setNormal(uint32_t type, uint32_t stride, uint32_t offset)
+{
+ mAttribs[NORMAL].buffer = mActiveBuffer;
+ mAttribs[NORMAL].type = type;
+ mAttribs[NORMAL].size = 3;
+ mAttribs[NORMAL].offset = offset;
+ mAttribs[NORMAL].stride = stride;
+ mAttribs[NORMAL].normalized = type != GL_FLOAT;
+}
+
+void VertexArray::setPointSize(uint32_t type, uint32_t stride, uint32_t offset)
+{
+ mAttribs[POINT_SIZE].buffer = mActiveBuffer;
+ mAttribs[POINT_SIZE].type = type;
+ mAttribs[POINT_SIZE].size = 1;
+ mAttribs[POINT_SIZE].offset = offset;
+ mAttribs[POINT_SIZE].stride = stride;
+ mAttribs[POINT_SIZE].normalized = false;
+}
+
+void VertexArray::setTexture(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset)
+{
+ mAttribs[TEXTURE].buffer = mActiveBuffer;
+ mAttribs[TEXTURE].type = type;
+ mAttribs[TEXTURE].size = size;
+ mAttribs[TEXTURE].offset = offset;
+ mAttribs[TEXTURE].stride = stride;
+ mAttribs[TEXTURE].normalized = false;
+}
+
+void VertexArray::setUser(const Attrib &a, uint32_t stride)
+{
+ // Find empty slot, some may be taken by legacy 1.1 slots.
+ uint32_t slot = 0;
+ while (mAttribs[slot].size) slot++;
+ rsAssert(slot < RS_MAX_ATTRIBS);
+ mAttribs[slot].set(a);
+ mAttribs[slot].buffer = mActiveBuffer;
+ mAttribs[slot].stride = stride;
+}
+
+void VertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
+ LOGE("va %i: slot=%i name=%s buf=%i size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", idx, slot,
+ mAttribs[idx].name.string(),
+ mAttribs[idx].buffer,
+ mAttribs[idx].size,
+ mAttribs[idx].type,
+ mAttribs[idx].stride,
+ mAttribs[idx].normalized,
+ mAttribs[idx].offset);
+}
+
+void VertexArray::setupGL(const Context *rsc, class VertexArrayState *state) const
+{
+ if (mAttribs[POSITION].size) {
+ //logAttrib(POSITION);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[POSITION].buffer);
+ glVertexPointer(mAttribs[POSITION].size,
+ mAttribs[POSITION].type,
+ mAttribs[POSITION].stride,
+ (void *)mAttribs[POSITION].offset);
+ } else {
+ rsAssert(0);
+ }
+
+ if (mAttribs[NORMAL].size) {
+ //logAttrib(NORMAL);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ rsAssert(mAttribs[NORMAL].size == 3);
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[NORMAL].buffer);
+ glNormalPointer(mAttribs[NORMAL].type,
+ mAttribs[NORMAL].stride,
+ (void *)mAttribs[NORMAL].offset);
+ } else {
+ glDisableClientState(GL_NORMAL_ARRAY);
+ }
+
+ if (mAttribs[COLOR].size) {
+ //logAttrib(COLOR);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[COLOR].buffer);
+ glColorPointer(mAttribs[COLOR].size,
+ mAttribs[COLOR].type,
+ mAttribs[COLOR].stride,
+ (void *)mAttribs[COLOR].offset);
+ } else {
+ glDisableClientState(GL_COLOR_ARRAY);
+ }
+
+ glClientActiveTexture(GL_TEXTURE0);
+ if (mAttribs[TEXTURE].size) {
+ //logAttrib(TEXTURE);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[TEXTURE].buffer);
+ glTexCoordPointer(mAttribs[TEXTURE].size,
+ mAttribs[TEXTURE].type,
+ mAttribs[TEXTURE].stride,
+ (void *)mAttribs[TEXTURE].offset);
+ } else {
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (mAttribs[POINT_SIZE].size) {
+ //logAttrib(POINT_SIZE);
+ glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[POINT_SIZE].buffer);
+ glPointSizePointerOES(mAttribs[POINT_SIZE].type,
+ mAttribs[POINT_SIZE].stride,
+ (void *)mAttribs[POINT_SIZE].offset);
+ } else {
+ glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
+ }
+ rsc->checkError("VertexArray::setupGL");
+}
+
+void VertexArray::setupGL2(const Context *rsc, class VertexArrayState *state, ShaderCache *sc) const
+{
+ for (int ct=1; ct < _LAST; ct++) {
+ glDisableVertexAttribArray(ct);
+ }
+
+ for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
+ if (mAttribs[ct].size && (sc->vtxAttribSlot(ct) >= 0)) {
+ //logAttrib(ct, sc->vtxAttribSlot(ct));
+ glEnableVertexAttribArray(sc->vtxAttribSlot(ct));
+ glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer);
+
+ glVertexAttribPointer(sc->vtxAttribSlot(ct),
+ mAttribs[ct].size,
+ mAttribs[ct].type,
+ mAttribs[ct].normalized,
+ mAttribs[ct].stride,
+ (void *)mAttribs[ct].offset);
+ }
+ }
+ rsc->checkError("VertexArray::setupGL2");
+}
+////////////////////////////////////////////
+
+void VertexArrayState::init(Context *) {
+}
+
diff --git a/libs/rs/rsVertexArray.h b/libs/rs/rsVertexArray.h
new file mode 100644
index 0000000..26e6f84
--- /dev/null
+++ b/libs/rs/rsVertexArray.h
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_VERTEX_ARRAY_H
+#define ANDROID_VERTEX_ARRAY_H
+
+
+#include "rsObjectBase.h"
+
+// ---------------------------------------------------------------------------
+namespace android {
+namespace renderscript {
+
+class ShaderCache;
+
+// An element is a group of Components that occupies one cell in a structure.
+class VertexArray
+{
+public:
+ VertexArray();
+ virtual ~VertexArray();
+
+ enum AttribName {
+ POSITION,
+ COLOR,
+ NORMAL,
+ POINT_SIZE,
+ TEXTURE,
+ _LAST
+ };
+
+ class Attrib {
+ public:
+ uint32_t buffer;
+ uint32_t offset;
+ uint32_t type;
+ uint32_t size;
+ uint32_t stride;
+ bool normalized;
+ String8 name;
+
+ Attrib();
+ void set(const Attrib &);
+ void clear();
+ };
+
+
+ void clearAll();
+ void clear(AttribName);
+
+ void setActiveBuffer(uint32_t id) {mActiveBuffer = id;}
+
+ void setUser(const Attrib &, uint32_t stride);
+ void setPosition(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset);
+ void setColor(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset);
+ void setNormal(uint32_t type, uint32_t stride, uint32_t offset);
+ void setPointSize(uint32_t type, uint32_t stride, uint32_t offset);
+ void setTexture(uint32_t size, uint32_t type, uint32_t stride, uint32_t offset);
+
+ void setupGL(const Context *rsc, class VertexArrayState *) const;
+ void setupGL2(const Context *rsc, class VertexArrayState *, ShaderCache *) const;
+ void logAttrib(uint32_t idx, uint32_t slot) const;
+
+protected:
+ uint32_t mActiveBuffer;
+ Attrib mAttribs[RS_MAX_ATTRIBS];
+};
+
+
+class VertexArrayState {
+public:
+ void init(Context *);
+
+ //VertexArray::Attrib mAttribs[VertexArray::_LAST];
+};
+
+
+}
+}
+#endif //ANDROID_LIGHT_H
+
+
+
diff --git a/location/java/android/location/Geocoder.java b/location/java/android/location/Geocoder.java
index 2ce1273..c325b1b 100644
--- a/location/java/android/location/Geocoder.java
+++ b/location/java/android/location/Geocoder.java
@@ -45,10 +45,7 @@
public final class Geocoder {
private static final String TAG = "Geocoder";
- private String mLanguage;
- private String mCountry;
- private String mVariant;
- private String mAppName;
+ private GeocoderParams mParams;
private ILocationManager mService;
/**
@@ -64,11 +61,7 @@
if (locale == null) {
throw new NullPointerException("locale == null");
}
- mLanguage = locale.getLanguage();
- mCountry = locale.getCountry();
- mVariant = locale.getVariant();
- mAppName = context.getPackageName();
-
+ mParams = new GeocoderParams(context, locale);
IBinder b = ServiceManager.getService(Context.LOCATION_SERVICE);
mService = ILocationManager.Stub.asInterface(b);
}
@@ -119,7 +112,7 @@
try {
List<Address> results = new ArrayList<Address>();
String ex = mService.getFromLocation(latitude, longitude, maxResults,
- mLanguage, mCountry, mVariant, mAppName, results);
+ mParams, results);
if (ex != null) {
throw new IOException(ex);
} else {
@@ -161,7 +154,7 @@
try {
List<Address> results = new ArrayList<Address>();
String ex = mService.getFromLocationName(locationName,
- 0, 0, 0, 0, maxResults, mLanguage, mCountry, mVariant, mAppName, results);
+ 0, 0, 0, 0, maxResults, mParams, results);
if (ex != null) {
throw new IOException(ex);
} else {
@@ -234,7 +227,7 @@
ArrayList<Address> result = new ArrayList<Address>();
String ex = mService.getFromLocationName(locationName,
lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
- maxResults, mLanguage, mCountry, mVariant, mAppName, result);
+ maxResults, mParams, result);
if (ex != null) {
throw new IOException(ex);
} else {
diff --git a/location/java/android/location/GeocoderParams.aidl b/location/java/android/location/GeocoderParams.aidl
new file mode 100644
index 0000000..2484e20
--- /dev/null
+++ b/location/java/android/location/GeocoderParams.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2010, 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 android.location;
+
+parcelable GeocoderParams;
diff --git a/location/java/android/location/GeocoderParams.java b/location/java/android/location/GeocoderParams.java
new file mode 100644
index 0000000..8b8e63b
--- /dev/null
+++ b/location/java/android/location/GeocoderParams.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2010 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 android.location;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Locale;
+
+/**
+ * This class contains extra parameters to pass to an IGeocodeProvider
+ * implementation from the Geocoder class. Currently this contains the
+ * language, country and variant information from the Geocoder's locale
+ * as well as the Geocoder client's package name for geocoder server
+ * logging. This information is kept in a separate class to allow for
+ * future expansion of the IGeocodeProvider interface.
+ */
+public class GeocoderParams implements Parcelable {
+ private Locale mLocale;
+ private String mPackageName;
+
+ // used only for parcelling
+ private GeocoderParams() {
+ }
+
+ /**
+ * This object is only constructed by the Geocoder class
+ *
+ * @hide
+ */
+ public GeocoderParams(Context context, Locale locale) {
+ mLocale = locale;
+ mPackageName = context.getPackageName();
+ }
+
+ /**
+ * returns the Geocoder's locale
+ */
+ public Locale getLocale() {
+ return mLocale;
+ }
+
+ /**
+ * returns the package name of the Geocoder's client
+ */
+ public String getClientPackage() {
+ return mPackageName;
+ }
+
+ public static final Parcelable.Creator<GeocoderParams> CREATOR =
+ new Parcelable.Creator<GeocoderParams>() {
+ public GeocoderParams createFromParcel(Parcel in) {
+ GeocoderParams gp = new GeocoderParams();
+ String language = in.readString();
+ String country = in.readString();
+ String variant = in.readString();
+ gp.mLocale = new Locale(language, country, variant);
+ gp.mPackageName = in.readString();
+ return gp;
+ }
+
+ public GeocoderParams[] newArray(int size) {
+ return new GeocoderParams[size];
+ }
+ };
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mLocale.getLanguage());
+ parcel.writeString(mLocale.getCountry());
+ parcel.writeString(mLocale.getVariant());
+ parcel.writeString(mPackageName);
+ }
+}
diff --git a/location/java/android/location/IGeocodeProvider.aidl b/location/java/android/location/IGeocodeProvider.aidl
index e79e8d2..aaa70c7 100644
--- a/location/java/android/location/IGeocodeProvider.aidl
+++ b/location/java/android/location/IGeocodeProvider.aidl
@@ -17,6 +17,7 @@
package android.location;
import android.location.Address;
+import android.location.GeocoderParams;
/**
* An interface for location providers implementing the Geocoder services.
@@ -26,10 +27,10 @@
interface IGeocodeProvider {
String getFromLocation(double latitude, double longitude, int maxResults,
- String language, String country, String variant, String appName, out List<Address> addrs);
+ in GeocoderParams params, out List<Address> addrs);
String getFromLocationName(String locationName,
double lowerLeftLatitude, double lowerLeftLongitude,
double upperRightLatitude, double upperRightLongitude, int maxResults,
- String language, String country, String variant, String appName, out List<Address> addrs);
+ in GeocoderParams params, out List<Address> addrs);
}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index b6c59d6..1fac07c 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -18,6 +18,7 @@
import android.app.PendingIntent;
import android.location.Address;
+import android.location.GeocoderParams;
import android.location.IGeocodeProvider;
import android.location.IGpsStatusListener;
import android.location.ILocationListener;
@@ -63,11 +64,11 @@
void reportLocation(in Location location);
String getFromLocation(double latitude, double longitude, int maxResults,
- String language, String country, String variant, String appName, out List<Address> addrs);
+ in GeocoderParams params, out List<Address> addrs);
String getFromLocationName(String locationName,
double lowerLeftLatitude, double lowerLeftLongitude,
double upperRightLatitude, double upperRightLongitude, int maxResults,
- String language, String country, String variant, String appName, out List<Address> addrs);
+ in GeocoderParams params, out List<Address> addrs);
void addTestProvider(String name, boolean requiresNetwork, boolean requiresSatellite,
boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude,
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 94ced22..6d7a23d 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -23,7 +23,6 @@
import android.os.RemoteException;
import android.os.Handler;
import android.os.Message;
-import android.util.Config;
import android.util.Log;
import com.android.internal.location.DummyLocationProvider;
@@ -105,6 +104,48 @@
*/
public static final String KEY_LOCATION_CHANGED = "location";
+ public interface GeocodeProvider {
+ String getFromLocation(double latitude, double longitude, int maxResults,
+ GeocoderParams params, List<Address> addrs);
+
+ String getFromLocationName(String locationName,
+ double lowerLeftLatitude, double lowerLeftLongitude,
+ double upperRightLatitude, double upperRightLongitude, int maxResults,
+ GeocoderParams params, List<Address> addrs);
+ }
+
+ private static final class GeocodeProviderProxy extends IGeocodeProvider.Stub {
+ private GeocodeProvider mProvider;
+
+ GeocodeProviderProxy(GeocodeProvider provider) {
+ mProvider = provider;
+ }
+
+ /**
+ * This method is overridden to implement the
+ * {@link Geocoder#getFromLocation(double, double, int)} method.
+ * Classes implementing this method should not hold a reference to the params parameter.
+ */
+ public String getFromLocation(double latitude, double longitude, int maxResults,
+ GeocoderParams params, List<Address> addrs) {
+ return mProvider.getFromLocation(latitude, longitude, maxResults, params, addrs);
+ }
+
+ /**
+ * This method is overridden to implement the
+ * {@link Geocoder#getFromLocationName(String, int, double, double, double, double)} method.
+ * Classes implementing this method should not hold a reference to the params parameter.
+ */
+ public String getFromLocationName(String locationName,
+ double lowerLeftLatitude, double lowerLeftLongitude,
+ double upperRightLatitude, double upperRightLongitude, int maxResults,
+ GeocoderParams params, List<Address> addrs) {
+ return mProvider.getFromLocationName(locationName, lowerLeftLatitude,
+ lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
+ maxResults, params, addrs);
+ }
+ }
+
// Map from LocationListeners to their associated ListenerTransport objects
private HashMap<LocationListener,ListenerTransport> mListeners =
new HashMap<LocationListener,ListenerTransport>();
@@ -206,7 +247,7 @@
* factory Context.getSystemService.
*/
public LocationManager(ILocationManager service) {
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "Constructor: service = " + service);
}
mService = service;
@@ -235,7 +276,7 @@
* @return list of Strings containing names of the providers
*/
public List<String> getAllProviders() {
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "getAllProviders");
}
try {
@@ -787,7 +828,7 @@
if (listener == null) {
throw new IllegalArgumentException("listener==null");
}
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "removeUpdates: listener = " + listener);
}
try {
@@ -812,7 +853,7 @@
if (intent == null) {
throw new IllegalArgumentException("intent==null");
}
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "removeUpdates: intent = " + intent);
}
try {
@@ -867,7 +908,7 @@
*/
public void addProximityAlert(double latitude, double longitude,
float radius, long expiration, PendingIntent intent) {
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "addProximityAlert: latitude = " + latitude +
", longitude = " + longitude + ", radius = " + radius +
", expiration = " + expiration +
@@ -888,7 +929,7 @@
* proximity alerts
*/
public void removeProximityAlert(PendingIntent intent) {
- if (Config.LOGD) {
+ if (false) {
Log.d(TAG, "removeProximityAlert: intent = " + intent);
}
try {
@@ -1378,6 +1419,19 @@
}
/**
+ * Installs a location provider.
+ *
+ * @param provider implementation of the location provider
+ *
+ * @return true if the command succeeds.
+ *
+ * Requires the android.permission.INSTALL_LOCATION_PROVIDER permission.
+ */
+ public boolean installLocationProvider(LocationProviderImpl provider) {
+ return installLocationProvider(provider.getName(), provider.getInterface());
+ }
+
+ /**
* Installs a geocoder server.
*
* @param provider Binder interface for the geocoder provider
@@ -1385,12 +1439,10 @@
* @return true if the command succeeds.
*
* Requires the android.permission.INSTALL_LOCATION_PROVIDER permission.
- *
- * {@hide}
*/
- public boolean installGeocodeProvider(IGeocodeProvider provider) {
+ public boolean installGeocodeProvider(GeocodeProvider provider) {
try {
- mService.installGeocodeProvider(provider);
+ mService.installGeocodeProvider(new GeocodeProviderProxy(provider));
return true;
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in setGeocodeProvider: ", e);
@@ -1404,8 +1456,6 @@
* @param location new Location to report
*
* Requires the android.permission.INSTALL_LOCATION_PROVIDER permission.
- *
- * {@hide}
*/
public void reportLocation(Location location) {
try {
diff --git a/location/java/android/location/LocationProviderImpl.java b/location/java/android/location/LocationProviderImpl.java
new file mode 100644
index 0000000..9a3624e
--- /dev/null
+++ b/location/java/android/location/LocationProviderImpl.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2010 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 android.location;
+
+import android.net.NetworkInfo;
+import android.os.Bundle;
+
+/**
+ * An abstract superclass for location providers that are implemented
+ * outside of the core android platform.
+ * A LocationProviderImpl can be installed using the
+ * {@link LocationManager#installLocationProvider(LocationProviderImpl)} method.
+ * Installing a location provider requires the
+ * android.permission.INSTALL_LOCATION_PROVIDER permission.
+ */
+public abstract class LocationProviderImpl extends LocationProvider {
+
+ private ILocationProvider.Stub mProvider = new ILocationProvider.Stub() {
+
+ public boolean requiresNetwork() {
+ return LocationProviderImpl.this.requiresNetwork();
+ }
+
+ public boolean requiresSatellite() {
+ return LocationProviderImpl.this.requiresSatellite();
+ }
+
+ public boolean requiresCell() {
+ return LocationProviderImpl.this.requiresCell();
+ }
+
+ public boolean hasMonetaryCost() {
+ return LocationProviderImpl.this.hasMonetaryCost();
+ }
+
+ public boolean supportsAltitude() {
+ return LocationProviderImpl.this.supportsAltitude();
+ }
+
+ public boolean supportsSpeed() {
+ return LocationProviderImpl.this.supportsSpeed();
+ }
+
+ public boolean supportsBearing() {
+ return LocationProviderImpl.this.supportsBearing();
+ }
+
+ public int getPowerRequirement() {
+ return LocationProviderImpl.this.getPowerRequirement();
+ }
+
+ public int getAccuracy() {
+ return LocationProviderImpl.this.getAccuracy();
+ }
+
+ public void enable() {
+ LocationProviderImpl.this.enable();
+ }
+
+ public void disable() {
+ LocationProviderImpl.this.disable();
+ }
+
+ public boolean isEnabled() {
+ return LocationProviderImpl.this.isEnabled();
+ }
+
+ public int getStatus(Bundle extras) {
+ return LocationProviderImpl.this.getStatus(extras);
+ }
+
+ public long getStatusUpdateTime() {
+ return LocationProviderImpl.this.getStatusUpdateTime();
+ }
+
+ public void enableLocationTracking(boolean enable) {
+ LocationProviderImpl.this.enableLocationTracking(enable);
+ }
+
+ public void setMinTime(long minTime) {
+ LocationProviderImpl.this.setMinTime(minTime);
+ }
+
+ public void updateNetworkState(int state, NetworkInfo info) {
+ LocationProviderImpl.this.updateNetworkState(state, info);
+ }
+
+ public void updateLocation(Location location) {
+ LocationProviderImpl.this.updateLocation(location);
+ }
+
+ public boolean sendExtraCommand(String command, Bundle extras) {
+ return LocationProviderImpl.this.sendExtraCommand(command, extras);
+ }
+
+ public void addListener(int uid) {
+ LocationProviderImpl.this.addListener(uid);
+ }
+
+ public void removeListener(int uid) {
+ LocationProviderImpl.this.removeListener(uid);
+ }
+ };
+
+ public LocationProviderImpl(String name) {
+ super(name);
+ }
+
+ /**
+ * {@hide}
+ */
+ /* package */ ILocationProvider getInterface() {
+ return mProvider;
+ }
+
+ /**
+ * Enables the location provider
+ */
+ public abstract void enable();
+
+ /**
+ * Disables the location provider
+ */
+ public abstract void disable();
+
+ /**
+ * Returns true if the provider is currently enabled
+ */
+ public abstract boolean isEnabled();
+
+ /**
+ * Returns a information on the status of this provider.
+ * {@link #OUT_OF_SERVICE} is returned if the provider is
+ * out of service, and this is not expected to change in the near
+ * future; {@link #TEMPORARILY_UNAVAILABLE} is returned if
+ * the provider is temporarily unavailable but is expected to be
+ * available shortly; and {@link #AVAILABLE} is returned
+ * if the provider is currently available.
+ *
+ * <p> If extras is non-null, additional status information may be
+ * added to it in the form of provider-specific key/value pairs.
+ */
+ public abstract int getStatus(Bundle extras);
+
+ /**
+ * Returns the time at which the status was last updated. It is the
+ * responsibility of the provider to appropriately set this value using
+ * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}.
+ * there is a status update that it wishes to broadcast to all its
+ * listeners. The provider should be careful not to broadcast
+ * the same status again.
+ *
+ * @return time of last status update in millis since last reboot
+ */
+ public abstract long getStatusUpdateTime();
+
+ /**
+ * Notifies the location provider that clients are listening for locations.
+ * Called with enable set to true when the first client is added and
+ * called with enable set to false when the last client is removed.
+ * This allows the provider to prepare for receiving locations,
+ * and to shut down when no clients are remaining.
+ *
+ * @param enable true if location tracking should be enabled.
+ */
+ public abstract void enableLocationTracking(boolean enable);
+
+ /**
+ * Notifies the location provider of the smallest minimum time between updates amongst
+ * all clients that are listening for locations. This allows the provider to reduce
+ * the frequency of updates to match the requested frequency.
+ *
+ * @param minTime the smallest minTime value over all listeners for this provider.
+ */
+ public abstract void setMinTime(long minTime);
+
+ /**
+ * Updates the network state for the given provider. This function must
+ * be overwritten if {@link #requiresNetwork} returns true. The state is
+ * {@link #TEMPORARILY_UNAVAILABLE} (disconnected), OR {@link #AVAILABLE}
+ * (connected or connecting).
+ *
+ * @param state data state
+ */
+ public abstract void updateNetworkState(int state, NetworkInfo info);
+
+ /**
+ * Informs the provider when a new location has been computed by a different
+ * location provider. This is intended to be used as aiding data for the
+ * receiving provider.
+ *
+ * @param location new location from other location provider
+ */
+ public abstract void updateLocation(Location location);
+
+ /**
+ * Implements addditional location provider specific additional commands.
+ *
+ * @param command name of the command to send to the provider.
+ * @param extras optional arguments for the command (or null).
+ * The provider may optionally fill the extras Bundle with results from the command.
+ *
+ * @return true if the command succeeds.
+ */
+ public abstract boolean sendExtraCommand(String command, Bundle extras);
+
+ /**
+ * Notifies the location provider when a new client is listening for locations.
+ *
+ * @param uid user ID of the new client.
+ */
+ public abstract void addListener(int uid);
+
+ /**
+ * Notifies the location provider when a client is no longer listening for locations.
+ *
+ * @param uid user ID of the client no longer listening.
+ */
+ public abstract void removeListener(int uid);
+}
+
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index 7763549..ee56621 100755
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -41,7 +41,6 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.provider.Settings;
-import android.util.Config;
import android.util.Log;
import android.util.SparseIntArray;
@@ -69,7 +68,7 @@
private static final String TAG = "GpsLocationProvider";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final boolean VERBOSE = false;
/**
@@ -377,7 +376,7 @@
public void updateNetworkState(int state, NetworkInfo info) {
mNetworkAvailable = (state == LocationProvider.AVAILABLE);
- if (Config.LOGD) {
+ if (DEBUG) {
Log.d(TAG, "updateNetworkState " + (mNetworkAvailable ? "available" : "unavailable")
+ " info: " + info);
}
@@ -498,7 +497,7 @@
* when the provider is enabled.
*/
public synchronized void enable() {
- if (Config.LOGD) Log.d(TAG, "enable");
+ if (DEBUG) Log.d(TAG, "enable");
if (mEnabled) return;
mEnabled = native_init();
@@ -534,7 +533,7 @@
* down while the provider is disabled.
*/
public synchronized void disable() {
- if (Config.LOGD) Log.d(TAG, "disable");
+ if (DEBUG) Log.d(TAG, "disable");
if (!mEnabled) return;
mEnabled = false;
@@ -602,7 +601,7 @@
}
public void setMinTime(long minTime) {
- if (Config.LOGD) Log.d(TAG, "setMinTime " + minTime);
+ if (DEBUG) Log.d(TAG, "setMinTime " + minTime);
if (minTime >= 0) {
int interval = (int)(minTime/1000);
@@ -623,7 +622,7 @@
}
public void binderDied() {
- if (Config.LOGD) Log.d(TAG, "GPS status listener died");
+ if (DEBUG) Log.d(TAG, "GPS status listener died");
synchronized(mListeners) {
mListeners.remove(this);
@@ -721,7 +720,7 @@
}
private boolean forceTimeInjection() {
- if (Config.LOGD) Log.d(TAG, "forceTimeInjection");
+ if (DEBUG) Log.d(TAG, "forceTimeInjection");
if (mNetworkThread != null) {
mNetworkThread.timeInjectRequest();
return true;
@@ -797,7 +796,7 @@
// report time to first fix
if (mTTFF == 0 && (flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
mTTFF = (int)(mLastFixTime - mFixRequestTime);
- if (Config.LOGD) Log.d(TAG, "TTFF: " + mTTFF);
+ if (DEBUG) Log.d(TAG, "TTFF: " + mTTFF);
// notify status listeners
synchronized(mListeners) {
@@ -1046,7 +1045,7 @@
}
private void xtraDownloadRequest() {
- if (Config.LOGD) Log.d(TAG, "xtraDownloadRequest");
+ if (DEBUG) Log.d(TAG, "xtraDownloadRequest");
if (mNetworkThread != null) {
mNetworkThread.xtraDownloadRequest();
}
@@ -1063,7 +1062,7 @@
StringBuilder extrasBuf = new StringBuilder();
- if (Config.LOGD) Log.d(TAG, "sendNiResponse, notifId: " + notificationId +
+ if (DEBUG) Log.d(TAG, "sendNiResponse, notifId: " + notificationId +
", response: " + userResponse);
native_send_ni_response(notificationId, userResponse);
@@ -1149,14 +1148,14 @@
}
public void run() {
- if (Config.LOGD) Log.d(TAG, "GpsEventThread starting");
+ if (DEBUG) Log.d(TAG, "GpsEventThread starting");
// Exit as soon as disable() is called instead of waiting for the GPS to stop.
while (mEnabled) {
// this will wait for an event from the GPS,
// which will be reported via reportLocation or reportStatus
native_wait_for_event();
}
- if (Config.LOGD) Log.d(TAG, "GpsEventThread exiting");
+ if (DEBUG) Log.d(TAG, "GpsEventThread exiting");
}
}
@@ -1181,7 +1180,7 @@
}
public void runLocked() {
- if (Config.LOGD) Log.d(TAG, "NetworkThread starting");
+ if (DEBUG) Log.d(TAG, "NetworkThread starting");
SntpClient client = new SntpClient();
GpsXtraDownloader xtraDownloader = null;
@@ -1197,18 +1196,17 @@
synchronized (this) {
try {
if (!mNetworkAvailable) {
- if (Config.LOGD) Log.d(TAG,
- "NetworkThread wait for network");
+ if (DEBUG) Log.d(TAG, "NetworkThread wait for network");
wait();
} else if (waitTime > 0) {
- if (Config.LOGD) {
+ if (DEBUG) {
Log.d(TAG, "NetworkThread wait for " +
waitTime + "ms");
}
wait(waitTime);
}
} catch (InterruptedException e) {
- if (Config.LOGD) {
+ if (DEBUG) {
Log.d(TAG, "InterruptedException in GpsNetworkThread");
}
}
@@ -1217,12 +1215,11 @@
} while (!mDone && ((!mXtraDownloadRequested &&
!mTimeInjectRequested && waitTime > 0)
|| !mNetworkAvailable));
- if (Config.LOGD) Log.d(TAG, "NetworkThread out of wake loop");
-
+ if (DEBUG) Log.d(TAG, "NetworkThread out of wake loop");
if (!mDone) {
if (mNtpServer != null &&
(mTimeInjectRequested || mNextNtpTime <= System.currentTimeMillis())) {
- if (Config.LOGD) {
+ if (DEBUG) {
Log.d(TAG, "Requesting time from NTP server " + mNtpServer);
}
mTimeInjectRequested = false;
@@ -1231,14 +1228,14 @@
long timeReference = client.getNtpTimeReference();
int certainty = (int)(client.getRoundTripTime()/2);
- if (Config.LOGD) Log.d(TAG, "calling native_inject_time: " +
+ if (DEBUG) Log.d(TAG, "calling native_inject_time: " +
time + " reference: " + timeReference
+ " certainty: " + certainty);
native_inject_time(time, timeReference, certainty);
mNextNtpTime = System.currentTimeMillis() + NTP_INTERVAL;
} else {
- if (Config.LOGD) Log.d(TAG, "requestTime failed");
+ if (DEBUG) Log.d(TAG, "requestTime failed");
mNextNtpTime = System.currentTimeMillis() + RETRY_INTERVAL;
}
}
@@ -1249,7 +1246,7 @@
mXtraDownloadRequested = false;
byte[] data = xtraDownloader.downloadXtraData();
if (data != null) {
- if (Config.LOGD) {
+ if (DEBUG) {
Log.d(TAG, "calling native_inject_xtra_data");
}
native_inject_xtra_data(data, data.length);
@@ -1260,7 +1257,7 @@
}
}
}
- if (Config.LOGD) Log.d(TAG, "NetworkThread exiting");
+ if (DEBUG) Log.d(TAG, "NetworkThread exiting");
}
synchronized void xtraDownloadRequest() {
@@ -1278,7 +1275,7 @@
}
synchronized void setDone() {
- if (Config.LOGD) Log.d(TAG, "stopping NetworkThread");
+ if (DEBUG) Log.d(TAG, "stopping NetworkThread");
mDone = true;
notify();
}
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 96d7027..482fc4f 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -112,7 +112,7 @@
private boolean mMediaServerOk;
/** cached value of the BT dock address to recognize undocking events */
- private static String sBtDockAddress;
+ private static String sBtDockAddress = "";
private SoundPool mSoundPool;
private Object mSoundEffectsLock = new Object();
@@ -231,6 +231,7 @@
// Forced device usage for communications
private int mForcedUseForComm;
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -1414,13 +1415,31 @@
(state == BluetoothA2dp.STATE_CONNECTED ||
state == BluetoothA2dp.STATE_PLAYING)) {
if (btDevice.isBluetoothDock()) {
- Log.v(TAG, "Recognized docking to BT dock");
+ Log.v(TAG, "Recognized connection to BT dock");
sBtDockAddress = address;
- AudioSystem.setForceUse(AudioSystem.FOR_DOCK, AudioSystem.FORCE_BT_DOCK);
+ Intent i = context.registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT));
+ if (i != null) {
+ int dockState = i.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ int config;
+ switch (dockState) {
+ case Intent.EXTRA_DOCK_STATE_DESK:
+ config = AudioSystem.FORCE_BT_DESK_DOCK;
+ break;
+ case Intent.EXTRA_DOCK_STATE_CAR:
+ config = AudioSystem.FORCE_BT_CAR_DOCK;
+ break;
+ case Intent.EXTRA_DOCK_STATE_UNDOCKED:
+ default:
+ config = AudioSystem.FORCE_NONE;
+ }
+ AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config);
+ }
}
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_AVAILABLE,
address);
+ // Reset A2DP suspend state each time a new sink is connected
+ AudioSystem.setParameters("A2dpSuspended=false");
mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP),
address);
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 9e9b259..137b919 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -271,7 +271,8 @@
public static final int FORCE_BT_SCO = 3;
public static final int FORCE_BT_A2DP = 4;
public static final int FORCE_WIRED_ACCESSORY = 5;
- public static final int FORCE_BT_DOCK = 6;
+ public static final int FORCE_BT_CAR_DOCK = 6;
+ public static final int FORCE_BT_DESK_DOCK = 7;
public static final int FORCE_DEFAULT = FORCE_NONE;
// usage for serForceUse
diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java
index 8180a7c..2294069 100644
--- a/media/java/android/media/MediaFile.java
+++ b/media/java/android/media/MediaFile.java
@@ -120,6 +120,7 @@
addFileType("RTX", FILE_TYPE_MID, "audio/midi");
addFileType("OTA", FILE_TYPE_MID, "audio/midi");
+ addFileType("MPEG", FILE_TYPE_MP4, "video/mpeg");
addFileType("MP4", FILE_TYPE_MP4, "video/mp4");
addFileType("M4V", FILE_TYPE_M4V, "video/mp4");
addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp");
@@ -155,8 +156,6 @@
sFileExtensions = builder.toString();
}
- public static final String UNKNOWN_STRING = "<unknown>";
-
public static boolean isAudioFileType(int fileType) {
return ((fileType >= FIRST_AUDIO_FILE_TYPE &&
fileType <= LAST_AUDIO_FILE_TYPE) ||
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 4296afb..3a2f47a 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -637,8 +637,8 @@
map.put(MediaStore.MediaColumns.MIME_TYPE, mMimeType);
if (MediaFile.isVideoFileType(mFileType)) {
- map.put(Video.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaFile.UNKNOWN_STRING));
- map.put(Video.Media.ALBUM, (mAlbum != null && mAlbum.length() > 0 ? mAlbum : MediaFile.UNKNOWN_STRING));
+ map.put(Video.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaStore.UNKNOWN_STRING));
+ map.put(Video.Media.ALBUM, (mAlbum != null && mAlbum.length() > 0 ? mAlbum : MediaStore.UNKNOWN_STRING));
map.put(Video.Media.DURATION, mDuration);
map.put(Video.Media.DATE_TAKEN, mLastModified * 1000);
// FIXME - add RESOLUTION
@@ -648,8 +648,8 @@
// contains date time information.
map.put(Images.Media.DATE_TAKEN, mLastModified * 1000);
} else if (MediaFile.isAudioFileType(mFileType)) {
- map.put(Audio.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaFile.UNKNOWN_STRING));
- map.put(Audio.Media.ALBUM, (mAlbum != null && mAlbum.length() > 0 ? mAlbum : MediaFile.UNKNOWN_STRING));
+ map.put(Audio.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaStore.UNKNOWN_STRING));
+ map.put(Audio.Media.ALBUM, (mAlbum != null && mAlbum.length() > 0 ? mAlbum : MediaStore.UNKNOWN_STRING));
map.put(Audio.Media.COMPOSER, mComposer);
if (mYear != 0) {
map.put(Audio.Media.YEAR, mYear);
@@ -705,7 +705,7 @@
values.put(MediaStore.MediaColumns.TITLE, title);
}
String album = values.getAsString(Audio.Media.ALBUM);
- if (MediaFile.UNKNOWN_STRING.equals(album)) {
+ if (MediaStore.UNKNOWN_STRING.equals(album)) {
album = values.getAsString(MediaStore.MediaColumns.DATA);
// extract last path segment before file name
int lastSlash = album.lastIndexOf('/');
diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java
index 3803d9d..df21aa4 100644
--- a/media/java/android/media/SoundPool.java
+++ b/media/java/android/media/SoundPool.java
@@ -26,6 +26,10 @@
import android.content.res.AssetFileDescriptor;
import java.io.IOException;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
/**
* The SoundPool class manages and plays audio resources for applications.
*
@@ -103,9 +107,20 @@
static { System.loadLibrary("soundpool"); }
private final static String TAG = "SoundPool";
+ private final static boolean DEBUG = false;
private int mNativeContext; // accessed by native methods
+ private EventHandler mEventHandler;
+ private OnLoadCompleteListener mOnLoadCompleteListener;
+
+ private final Object mLock;
+
+ // SoundPool messages
+ //
+ // must match SoundPool.h
+ private static final int SAMPLE_LOADED = 1;
+
/**
* Constructor. Constructs a SoundPool object with the following
* characteristics:
@@ -120,7 +135,23 @@
* @return a SoundPool object, or null if creation failed
*/
public SoundPool(int maxStreams, int streamType, int srcQuality) {
- native_setup(new WeakReference<SoundPool>(this), maxStreams, streamType, srcQuality);
+
+ // do native setup
+ if (native_setup(new WeakReference(this), maxStreams, streamType, srcQuality) != 0) {
+ throw new RuntimeException("Native setup failed");
+ }
+ mLock = new Object();
+
+ // setup message handler
+ Looper looper;
+ if ((looper = Looper.myLooper()) != null) {
+ mEventHandler = new EventHandler(this, looper);
+ } else if ((looper = Looper.getMainLooper()) != null) {
+ mEventHandler = new EventHandler(this, looper);
+ } else {
+ mEventHandler = null;
+ }
+
}
/**
@@ -145,12 +176,11 @@
ParcelFileDescriptor fd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
if (fd != null) {
id = _load(fd.getFileDescriptor(), 0, f.length(), priority);
- //Log.v(TAG, "close fd");
fd.close();
}
}
} catch (java.io.IOException e) {
- Log.d(TAG, "error loading " + path);
+ Log.e(TAG, "error loading " + path);
}
return id;
}
@@ -176,7 +206,6 @@
if (afd != null) {
id = _load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(), priority);
try {
- //Log.v(TAG, "close fd");
afd.close();
} catch (java.io.IOException ex) {
//Log.d(TAG, "close failed:", ex);
@@ -359,6 +388,76 @@
public native final void setRate(int streamID, float rate);
/**
+ * Interface definition for a callback to be invoked when all the
+ * sounds are loaded.
+ *
+ * @hide
+ */
+ public interface OnLoadCompleteListener
+ {
+ /**
+ * Called when a sound has completed loading.
+ *
+ * @param soundPool SoundPool object from the load() method
+ * @param soundPool the sample ID of the sound loaded.
+ * @param status the status of the load operation (0 = success)
+ */
+ public void onLoadComplete(SoundPool soundPool, int sampleId, int status);
+ }
+
+ /**
+ * Sets the callback hook for the OnLoadCompleteListener.
+ *
+ * @hide
+ */
+ public void setOnLoadCompleteListener(OnLoadCompleteListener listener)
+ {
+ synchronized(mLock) {
+ mOnLoadCompleteListener = listener;
+ }
+ }
+
+ private class EventHandler extends Handler
+ {
+ private SoundPool mSoundPool;
+
+ public EventHandler(SoundPool soundPool, Looper looper) {
+ super(looper);
+ mSoundPool = soundPool;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch(msg.what) {
+ case SAMPLE_LOADED:
+ if (DEBUG) Log.d(TAG, "Sample " + msg.arg1 + " loaded");
+ synchronized(mLock) {
+ if (mOnLoadCompleteListener != null) {
+ mOnLoadCompleteListener.onLoadComplete(mSoundPool, msg.arg1, msg.arg2);
+ }
+ }
+ break;
+ default:
+ Log.e(TAG, "Unknown message type " + msg.what);
+ return;
+ }
+ }
+ }
+
+ // post event from native code to message handler
+ private static void postEventFromNative(Object weakRef, int msg, int arg1, int arg2, Object obj)
+ {
+ SoundPool soundPool = (SoundPool)((WeakReference)weakRef).get();
+ if (soundPool == null)
+ return;
+
+ if (soundPool.mEventHandler != null) {
+ Message m = soundPool.mEventHandler.obtainMessage(msg, arg1, arg2, obj);
+ soundPool.mEventHandler.sendMessage(m);
+ }
+ }
+
+ /**
* Release the SoundPool resources.
*
* Release all memory and native resources used by the SoundPool
@@ -367,8 +466,7 @@
*/
public native final void release();
- private native final void native_setup(Object mediaplayer_this,
- int maxStreams, int streamType, int srcQuality);
+ private native final int native_setup(Object weakRef, int maxStreams, int streamType, int srcQuality);
protected void finalize() { release(); }
}
diff --git a/media/jni/Android.mk b/media/jni/Android.mk
index fdcf3d1..ca6230f 100644
--- a/media/jni/Android.mk
+++ b/media/jni/Android.mk
@@ -15,7 +15,8 @@
libbinder \
libmedia \
libskia \
- libui
+ libui \
+ libcutils
ifneq ($(BUILD_WITHOUT_PV),true)
LOCAL_SRC_FILES += \
@@ -28,6 +29,15 @@
LOCAL_CFLAGS += -DNO_OPENCORE
endif
+ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
+
+LOCAL_CFLAGS += -DBUILD_WITH_FULL_STAGEFRIGHT=1
+
+LOCAL_SHARED_LIBRARIES += \
+ libstagefright
+
+endif
+
LOCAL_STATIC_LIBRARIES :=
LOCAL_C_INCLUDES += \
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index 144fba2..2ab2445 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -24,6 +24,7 @@
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
+#include <cutils/properties.h>
#include <utils/threads.h>
#include "jni.h"
@@ -32,8 +33,10 @@
#ifndef NO_OPENCORE
#include "pvmediascanner.h"
-#else
-#include "StagefrightMediaScanner.h"
+#endif
+
+#if BUILD_WITH_FULL_STAGEFRIGHT
+#include <media/stagefright/StagefrightMediaScanner.h>
#endif
// ----------------------------------------------------------------------------
@@ -283,14 +286,25 @@
}
}
+static MediaScanner *createMediaScanner() {
+#if BUILD_WITH_FULL_STAGEFRIGHT
+ char value[PROPERTY_VALUE_MAX];
+ if (property_get("media.stagefright.enable-scan", value, NULL)
+ && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
+ return new StagefrightMediaScanner;
+ }
+#endif
+#ifndef NO_OPENCORE
+ return new PVMediaScanner();
+#endif
+
+ return NULL;
+}
+
static void
android_media_MediaScanner_native_setup(JNIEnv *env, jobject thiz)
{
-#ifndef NO_OPENCORE
- MediaScanner *mp = new PVMediaScanner();
-#else
- MediaScanner *mp = new StagefrightMediaScanner();
-#endif
+ MediaScanner *mp = createMediaScanner();
if (mp == NULL) {
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index 4d2e048..e57f4a4 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -61,6 +61,9 @@
mNextSampleID = 0;
mNextChannelID = 0;
+ mCallback = 0;
+ mUserData = 0;
+
mChannelPool = new SoundChannel[mMaxChannels];
for (int i = 0; i < mMaxChannels; ++i) {
mChannelPool[i].init(this);
@@ -141,7 +144,7 @@
bool SoundPool::startThreads()
{
- createThread(beginThread, this);
+ createThreadEtc(beginThread, this, "SoundPoolThread");
if (mDecodeThread == NULL)
mDecodeThread = new SoundPoolThread(this);
return mDecodeThread != NULL;
@@ -372,6 +375,21 @@
}
}
+void SoundPool::setCallback(SoundPoolCallback* callback, void* user)
+{
+ Mutex::Autolock lock(&mCallbackLock);
+ mCallback = callback;
+ mUserData = user;
+}
+
+void SoundPool::notify(SoundPoolEvent event)
+{
+ Mutex::Autolock lock(&mCallbackLock);
+ if (mCallback != NULL) {
+ mCallback(event, this, mUserData);
+ }
+}
+
void SoundPool::dump()
{
for (int i = 0; i < mMaxChannels; ++i) {
@@ -422,7 +440,7 @@
delete mUrl;
}
-void Sample::doLoad()
+status_t Sample::doLoad()
{
uint32_t sampleRate;
int numChannels;
@@ -439,19 +457,19 @@
}
if (p == 0) {
LOGE("Unable to load sample: %s", mUrl);
- return;
+ return -1;
}
LOGV("pointer = %p, size = %u, sampleRate = %u, numChannels = %d",
p->pointer(), p->size(), sampleRate, numChannels);
if (sampleRate > kMaxSampleRate) {
LOGE("Sample rate (%u) out of range", sampleRate);
- return;
+ return - 1;
}
if ((numChannels < 1) || (numChannels > 2)) {
LOGE("Sample channel count (%d) out of range", numChannels);
- return;
+ return - 1;
}
//_dumpBuffer(p->pointer(), p->size());
@@ -464,6 +482,7 @@
mNumChannels = numChannels;
mFormat = format;
mState = READY;
+ return 0;
}
@@ -500,7 +519,8 @@
}
int numChannels = sample->numChannels();
uint32_t sampleRate = uint32_t(float(sample->sampleRate()) * rate + 0.5);
- uint32_t bufferFrames = (afFrameCount * sampleRate) / afSampleRate;
+ uint32_t totalFrames = (kDefaultBufferCount * afFrameCount * sampleRate) / afSampleRate;
+ uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount;
uint32_t frameCount = 0;
if (loop) {
@@ -509,13 +529,13 @@
#ifndef USE_SHARED_MEM_BUFFER
// Ensure minimum audio buffer size in case of short looped sample
- if(frameCount < kDefaultBufferCount * bufferFrames) {
- frameCount = kDefaultBufferCount * bufferFrames;
+ if(frameCount < totalFrames) {
+ frameCount = totalFrames;
}
#endif
AudioTrack* newTrack;
-
+
// mToggle toggles each time a track is started on a given channel.
// The toggle is concatenated with the SoundChannel address and passed to AudioTrack
// as callback user data. This enables the detection of callbacks received from the old
@@ -524,7 +544,7 @@
unsigned long toggle = mToggle ^ 1;
void *userData = (void *)((unsigned long)this | toggle);
uint32_t channels = (numChannels == 2) ? AudioSystem::CHANNEL_OUT_STEREO : AudioSystem::CHANNEL_OUT_MONO;
-
+
#ifdef USE_SHARED_MEM_BUFFER
newTrack = new AudioTrack(streamType, sampleRate, sample->format(),
channels, sample->getIMemory(), 0, callback, userData);
diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h
index 94cd978..7a2d631 100644
--- a/media/jni/soundpool/SoundPool.h
+++ b/media/jni/soundpool/SoundPool.h
@@ -24,8 +24,6 @@
#include <media/AudioTrack.h>
#include <cutils/atomic.h>
-#include <nativehelper/jni.h>
-
namespace android {
static const int IDLE_PRIORITY = -1;
@@ -43,10 +41,11 @@
int mMsg;
int mArg1;
int mArg2;
+ enum MessageType { INVALID, SAMPLE_LOADED };
};
-// JNI for calling back Java SoundPool object
-extern void android_soundpool_SoundPool_notify(jobject ref, const SoundPoolEvent *event);
+// callback function prototype
+typedef void SoundPoolCallback(SoundPoolEvent event, SoundPool* soundPool, void* user);
// tracks samples used by application
class Sample : public RefBase {
@@ -62,7 +61,7 @@
size_t size() { return mSize; }
int state() { return mState; }
uint8_t* data() { return static_cast<uint8_t*>(mData->pointer()); }
- void doLoad();
+ status_t doLoad();
void startLoad() { mState = LOADING; }
sp<IMemory> getIMemory() { return mData; }
@@ -182,6 +181,10 @@
// called from AudioTrack thread
void done(SoundChannel* channel);
+ // callback function
+ void setCallback(SoundPoolCallback* callback, void* user);
+ void* getUserData() { return mUserData; }
+
private:
SoundPool() {} // no default constructor
bool startThreads();
@@ -191,6 +194,7 @@
SoundChannel* findNextChannel (int channelID);
SoundChannel* allocateChannel(int priority);
void moveToFront(SoundChannel* channel);
+ void notify(SoundPoolEvent event);
void dump();
// restart thread
@@ -214,6 +218,11 @@
int mNextSampleID;
int mNextChannelID;
bool mQuit;
+
+ // callback
+ Mutex mCallbackLock;
+ SoundPoolCallback* mCallback;
+ void* mUserData;
};
} // end namespace android
diff --git a/media/jni/soundpool/SoundPoolThread.cpp b/media/jni/soundpool/SoundPoolThread.cpp
index 4e6798d..e32c794 100644
--- a/media/jni/soundpool/SoundPoolThread.cpp
+++ b/media/jni/soundpool/SoundPoolThread.cpp
@@ -22,50 +22,54 @@
namespace android {
-void SoundPoolThread::MessageQueue::write(SoundPoolMsg msg) {
- LOGV("MessageQueue::write - acquiring lock\n");
+void SoundPoolThread::write(SoundPoolMsg msg) {
Mutex::Autolock lock(&mLock);
- while (mQueue.size() >= maxMessages) {
- LOGV("MessageQueue::write - wait\n");
+ while (mMsgQueue.size() >= maxMessages) {
mCondition.wait(mLock);
}
- LOGV("MessageQueue::write - push message\n");
- mQueue.push(msg);
- mCondition.signal();
+
+ // if thread is quitting, don't add to queue
+ if (mRunning) {
+ mMsgQueue.push(msg);
+ mCondition.signal();
+ }
}
-const SoundPoolMsg SoundPoolThread::MessageQueue::read() {
- LOGV("MessageQueue::read - acquiring lock\n");
+const SoundPoolMsg SoundPoolThread::read() {
Mutex::Autolock lock(&mLock);
- while (mQueue.size() == 0) {
- LOGV("MessageQueue::read - wait\n");
+ while (mMsgQueue.size() == 0) {
mCondition.wait(mLock);
}
- SoundPoolMsg msg = mQueue[0];
- LOGV("MessageQueue::read - retrieve message\n");
- mQueue.removeAt(0);
+ SoundPoolMsg msg = mMsgQueue[0];
+ mMsgQueue.removeAt(0);
mCondition.signal();
return msg;
}
-void SoundPoolThread::MessageQueue::quit() {
+void SoundPoolThread::quit() {
Mutex::Autolock lock(&mLock);
- mQueue.clear();
- mQueue.push(SoundPoolMsg(SoundPoolMsg::KILL, 0));
- mCondition.signal();
- mCondition.wait(mLock);
+ if (mRunning) {
+ mRunning = false;
+ mMsgQueue.clear();
+ mMsgQueue.push(SoundPoolMsg(SoundPoolMsg::KILL, 0));
+ mCondition.signal();
+ mCondition.wait(mLock);
+ }
LOGV("return from quit");
}
SoundPoolThread::SoundPoolThread(SoundPool* soundPool) :
mSoundPool(soundPool)
{
- mMessages.setCapacity(maxMessages);
- createThread(beginThread, this);
+ mMsgQueue.setCapacity(maxMessages);
+ if (createThread(beginThread, this)) {
+ mRunning = true;
+ }
}
SoundPoolThread::~SoundPoolThread()
{
+ quit();
}
int SoundPoolThread::beginThread(void* arg) {
@@ -77,7 +81,7 @@
int SoundPoolThread::run() {
LOGV("run");
for (;;) {
- SoundPoolMsg msg = mMessages.read();
+ SoundPoolMsg msg = read();
LOGV("Got message m=%d, mData=%d", msg.mMessageType, msg.mData);
switch (msg.mMessageType) {
case SoundPoolMsg::KILL:
@@ -95,14 +99,16 @@
}
void SoundPoolThread::loadSample(int sampleID) {
- mMessages.write(SoundPoolMsg(SoundPoolMsg::LOAD_SAMPLE, sampleID));
+ write(SoundPoolMsg(SoundPoolMsg::LOAD_SAMPLE, sampleID));
}
void SoundPoolThread::doLoadSample(int sampleID) {
sp <Sample> sample = mSoundPool->findSample(sampleID);
+ status_t status = -1;
if (sample != 0) {
- sample->doLoad();
+ status = sample->doLoad();
}
+ mSoundPool->notify(SoundPoolEvent(SoundPoolEvent::SAMPLE_LOADED, sampleID, status));
}
} // end namespace android
diff --git a/media/jni/soundpool/SoundPoolThread.h b/media/jni/soundpool/SoundPoolThread.h
index 459a764..bbd35e0 100644
--- a/media/jni/soundpool/SoundPoolThread.h
+++ b/media/jni/soundpool/SoundPoolThread.h
@@ -27,7 +27,7 @@
class SoundPoolMsg {
public:
- enum MessageType { INVALID, KILL, LOAD_SAMPLE, PLAY_SAMPLE, SAMPLE_DONE };
+ enum MessageType { INVALID, KILL, LOAD_SAMPLE };
SoundPoolMsg() : mMessageType(INVALID), mData(0) {}
SoundPoolMsg(MessageType MessageType, int data) :
mMessageType(MessageType), mData(data) {}
@@ -45,29 +45,22 @@
SoundPoolThread(SoundPool* SoundPool);
~SoundPoolThread();
void loadSample(int sampleID);
- void quit() { mMessages.quit(); }
+ void quit();
+ void write(SoundPoolMsg msg);
private:
static const size_t maxMessages = 5;
- class MessageQueue {
- public:
- void write(SoundPoolMsg msg);
- const SoundPoolMsg read();
- void setCapacity(size_t size) { mQueue.setCapacity(size); }
- void quit();
- private:
- Vector<SoundPoolMsg> mQueue;
- Mutex mLock;
- Condition mCondition;
- };
-
static int beginThread(void* arg);
int run();
void doLoadSample(int sampleID);
+ const SoundPoolMsg read();
- SoundPool* mSoundPool;
- MessageQueue mMessages;
+ Mutex mLock;
+ Condition mCondition;
+ Vector<SoundPoolMsg> mMsgQueue;
+ SoundPool* mSoundPool;
+ bool mRunning;
};
} // end namespace android
diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp
index 1381db3..f0677a6 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -17,7 +17,7 @@
#include <stdio.h>
//#define LOG_NDEBUG 0
-#define LOG_TAG "SoundPool"
+#define LOG_TAG "SoundPool-JNI"
#include <utils/Log.h>
#include <nativehelper/jni.h>
@@ -29,6 +29,7 @@
static struct fields_t {
jfieldID mNativeContext;
+ jmethodID mPostEvent;
jclass mSoundPoolClass;
} fields;
@@ -149,19 +150,29 @@
ap->setRate(channelID, rate);
}
-static void
-android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz,
- jobject weak_this, jint maxChannels, jint streamType, jint srcQuality)
+static void android_media_callback(SoundPoolEvent event, SoundPool* soundPool, void* user)
+{
+ LOGV("callback: (%d, %d, %d, %p, %p)", event.mMsg, event.mArg1, event.mArg2, soundPool, user);
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ env->CallStaticVoidMethod(fields.mSoundPoolClass, fields.mPostEvent, user, event.mMsg, event.mArg1, event.mArg2, NULL);
+}
+
+static jint
+android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, jint maxChannels, jint streamType, jint srcQuality)
{
LOGV("android_media_SoundPool_native_setup");
SoundPool *ap = new SoundPool(maxChannels, streamType, srcQuality);
if (ap == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
- return;
+ return -1;
}
// save pointer to SoundPool C++ object in opaque field in Java object
env->SetIntField(thiz, fields.mNativeContext, (int)ap);
+
+ // set callback with weak reference
+ jobject globalWeakRef = env->NewGlobalRef(weakRef);
+ ap->setCallback(android_media_callback, globalWeakRef);
+ return 0;
}
static void
@@ -170,6 +181,15 @@
LOGV("android_media_SoundPool_release");
SoundPool *ap = MusterSoundPool(env, thiz);
if (ap != NULL) {
+
+ // release weak reference
+ jobject weakRef = (jobject) ap->getUserData();
+ if (weakRef != NULL) {
+ env->DeleteGlobalRef(weakRef);
+ }
+
+ // clear callback and native context
+ ap->setCallback(NULL, NULL);
env->SetIntField(thiz, fields.mNativeContext, 0);
delete ap;
}
@@ -224,7 +244,7 @@
(void *)android_media_SoundPool_setRate
},
{ "native_setup",
- "(Ljava/lang/Object;III)V",
+ "(Ljava/lang/Object;III)I",
(void*)android_media_SoundPool_native_setup
},
{ "release",
@@ -259,6 +279,17 @@
goto bail;
}
+ fields.mPostEvent = env->GetStaticMethodID(clazz, "postEventFromNative",
+ "(Ljava/lang/Object;IIILjava/lang/Object;)V");
+ if (fields.mPostEvent == NULL) {
+ LOGE("Can't find android/media/SoundPool.postEventFromNative");
+ goto bail;
+ }
+
+ // create a reference to class. Technically, we're leaking this reference
+ // since it's a static object.
+ fields.mSoundPoolClass = (jclass) env->NewGlobalRef(clazz);
+
if (AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)) < 0)
goto bail;
diff --git a/media/libmedia/Android.mk b/media/libmedia/Android.mk
index 088ad6d..fc234ee 100644
--- a/media/libmedia/Android.mk
+++ b/media/libmedia/Android.mk
@@ -26,11 +26,6 @@
MediaScannerClient.cpp \
autodetect.cpp
-ifneq ($(BUILD_WITHOUT_PV),true)
-else
-LOCAL_SRC_FILES += StagefrightMediaScanner.cpp
-endif
-
LOCAL_SHARED_LIBRARIES := \
libui libcutils libutils libbinder libsonivox libicuuc
diff --git a/media/libmedia/StagefrightMediaScanner.cpp b/media/libmedia/StagefrightMediaScanner.cpp
deleted file mode 100644
index 522ab5a..0000000
--- a/media/libmedia/StagefrightMediaScanner.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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 "StagefrightMediaScanner.h"
-
-namespace android {
-
-StagefrightMediaScanner::StagefrightMediaScanner() {}
-
-StagefrightMediaScanner::~StagefrightMediaScanner() {}
-
-status_t StagefrightMediaScanner::processFile(
- const char *path, const char *mimeType,
- MediaScannerClient &client) {
- client.setLocale(locale());
- client.beginFile();
- client.endFile();
-
- return OK;
-}
-
-char *StagefrightMediaScanner::extractAlbumArt(int fd) {
- return NULL;
-}
-
-} // namespace android
diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk
index 5e59710..d51ab30 100644
--- a/media/libmediaplayerservice/Android.mk
+++ b/media/libmediaplayerservice/Android.mk
@@ -19,7 +19,6 @@
ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
LOCAL_SRC_FILES += \
- StagefrightMetadataRetriever.cpp \
StagefrightPlayer.cpp \
StagefrightRecorder.cpp
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 540d4ba..6563caa 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -720,6 +720,16 @@
}
}
+ if (!strncasecmp(url, "http://", 7)) {
+ char value[PROPERTY_VALUE_MAX];
+ if (!property_get("media.stagefright.enable-http", value, NULL)
+ || (strcmp(value, "1") && strcasecmp(value, "true"))) {
+ // For now, we're going to use PV for http-based playback
+ // by default until we can clear up a few more issues.
+ return PV_PLAYER;
+ }
+ }
+
return getDefaultPlayerType();
}
@@ -1248,22 +1258,24 @@
static const int NUMVIZBUF = 32;
static const int VIZBUFFRAMES = 1024;
-static const int TOTALBUFTIMEMSEC = NUMVIZBUF * VIZBUFFRAMES * 1000 / 44100;
+static const int BUFTIMEMSEC = NUMVIZBUF * VIZBUFFRAMES * 1000 / 44100;
+static const int TOTALBUFTIMEMSEC = NUMVIZBUF * BUFTIMEMSEC;
static bool gotMem = false;
+static sp<MemoryHeapBase> heap;
static sp<MemoryBase> mem[NUMVIZBUF];
-static uint64_t timeStamp[NUMVIZBUF];
+static uint64_t endTime;
static uint64_t lastReadTime;
static uint64_t lastWriteTime;
static int writeIdx = 0;
static void allocVizBufs() {
if (!gotMem) {
+ heap = new MemoryHeapBase(NUMVIZBUF * VIZBUFFRAMES * 2, 0, "snooper");
for (int i=0;i<NUMVIZBUF;i++) {
- sp<MemoryHeapBase> heap = new MemoryHeapBase(VIZBUFFRAMES*2, 0, "snooper");
- mem[i] = new MemoryBase(heap, 0, heap->getSize());
- timeStamp[i] = 0;
+ mem[i] = new MemoryBase(heap, VIZBUFFRAMES * 2 * i, VIZBUFFRAMES * 2);
}
+ endTime = 0;
gotMem = true;
}
}
@@ -1280,68 +1292,48 @@
allocVizBufs();
- lastReadTime = uptimeMillis() + 100; // account for renderer delay (we shouldn't be doing this here)
+ lastReadTime = uptimeMillis();
// if there is no recent buffer (yet), just return empty handed
if (lastWriteTime + TOTALBUFTIMEMSEC < lastReadTime) {
- //LOGI("@@@@ no audio data to look at yet");
+ //LOGI("@@@@ no audio data to look at yet: %d + %d < %d", (int)lastWriteTime, TOTALBUFTIMEMSEC, (int)lastReadTime);
return NULL;
}
- char buf[200];
-
- int closestIdx = -1;
- uint32_t closestTime = 0x7ffffff;
-
- for (int i = 0; i < NUMVIZBUF; i++) {
- uint64_t tsi = timeStamp[i];
- uint64_t diff = tsi > lastReadTime ? tsi - lastReadTime : lastReadTime - tsi;
- if (diff < closestTime) {
- closestIdx = i;
- closestTime = diff;
- }
+ int timedelta = endTime - lastReadTime;
+ if (timedelta < 0) timedelta = 0;
+ int framedelta = timedelta * 44100 / 1000;
+ int headIdx = (writeIdx - framedelta) / VIZBUFFRAMES - 1;
+ while (headIdx < 0) {
+ headIdx += NUMVIZBUF;
}
-
-
- if (closestIdx >= 0) {
- //LOGI("@@@ return buffer %d, %d/%d", closestIdx, uint32_t(lastReadTime), uint32_t(timeStamp[closestIdx]));
- return mem[closestIdx];
- }
-
- // we won't get here, since we either bailed out early, or got a buffer
- LOGD("Didn't expect to be here");
- return NULL;
+ return mem[headIdx];
}
-static void storeVizBuf(const void *data, int len, uint64_t time) {
- // Copy the data in to the visualizer buffer
- // Assume a 16 bit stereo source for now.
- short *viz = (short*)mem[writeIdx]->pointer();
- short *src = (short*)data;
- for (int i = 0; i < VIZBUFFRAMES; i++) {
- // Degrade quality by mixing to mono and clearing the lowest 3 bits.
- // This should still be good enough for a visualization
- *viz++ = ((int(src[0]) + int(src[1])) >> 1) & ~0x7;
- src += 2;
- }
- timeStamp[writeIdx++] = time;
- if (writeIdx >= NUMVIZBUF) {
- writeIdx = 0;
- }
-}
-
+// Append the data to the vizualization buffer
static void makeVizBuffers(const char *data, int len, uint64_t time) {
allocVizBufs();
uint64_t startTime = time;
const int frameSize = 4; // 16 bit stereo sample is 4 bytes
- while (len >= VIZBUFFRAMES * frameSize) {
- storeVizBuf(data, len, time);
- data += VIZBUFFRAMES * frameSize;
- len -= VIZBUFFRAMES * frameSize;
- time += 1000 * VIZBUFFRAMES / 44100;
+ int offset = writeIdx;
+ int maxoff = heap->getSize() / 2; // in shorts
+ short *base = (short*)heap->getBase();
+ short *src = (short*)data;
+ while (len > 0) {
+
+ // Degrade quality by mixing to mono and clearing the lowest 3 bits.
+ // This should still be good enough for a visualization
+ base[offset++] = ((int(src[0]) + int(src[1])) >> 1) & ~0x7;
+ src += 2;
+ len -= frameSize;
+ if (offset >= maxoff) {
+ offset = 0;
+ }
}
+ writeIdx = offset;
+ endTime = time + (len / frameSize) / 44;
//LOGI("@@@ stored buffers from %d to %d", uint32_t(startTime), uint32_t(time));
}
@@ -1499,30 +1491,35 @@
}
}
+void MediaPlayerService::AudioOutput::snoopWrite(const void* buffer, size_t size) {
+ // Only make visualization buffers if anyone recently requested visualization data
+ uint64_t now = uptimeMillis();
+ if (lastReadTime + TOTALBUFTIMEMSEC >= now) {
+ // Based on the current play counter, the number of frames written and
+ // the current real time we can calculate the approximate real start
+ // time of the buffer we're about to write.
+ uint32_t pos;
+ mTrack->getPosition(&pos);
+
+ // we're writing ahead by this many frames:
+ int ahead = mNumFramesWritten - pos;
+ //LOGI("@@@ written: %d, playpos: %d, latency: %d", mNumFramesWritten, pos, mTrack->latency());
+ // which is this many milliseconds, assuming 44100 Hz:
+ ahead /= 44;
+
+ makeVizBuffers((const char*)buffer, size, now + ahead + mTrack->latency());
+ lastWriteTime = now;
+ }
+}
+
+
ssize_t MediaPlayerService::AudioOutput::write(const void* buffer, size_t size)
{
LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback.");
//LOGV("write(%p, %u)", buffer, size);
if (mTrack) {
- // Only make visualization buffers if anyone recently requested visualization data
- uint64_t now = uptimeMillis();
- if (lastReadTime + TOTALBUFTIMEMSEC >= now) {
- // Based on the current play counter, the number of frames written and
- // the current real time we can calculate the approximate real start
- // time of the buffer we're about to write.
- uint32_t pos;
- mTrack->getPosition(&pos);
-
- // we're writing ahead by this many frames:
- int ahead = mNumFramesWritten - pos;
- //LOGI("@@@ written: %d, playpos: %d, latency: %d", mNumFramesWritten, pos, mTrack->latency());
- // which is this many milliseconds, assuming 44100 Hz:
- ahead /= 44;
-
- makeVizBuffers((const char*)buffer, size, now + ahead + mTrack->latency());
- lastWriteTime = now;
- }
+ snoopWrite(buffer, size);
ssize_t ret = mTrack->write(buffer, size);
mNumFramesWritten += ret / 4; // assume 16 bit stereo
return ret;
@@ -1570,6 +1567,7 @@
// static
void MediaPlayerService::AudioOutput::CallbackWrapper(
int event, void *cookie, void *info) {
+ //LOGV("callbackwrapper");
if (event != AudioTrack::EVENT_MORE_DATA) {
return;
}
@@ -1579,6 +1577,7 @@
(*me->mCallback)(
me, buffer->raw, buffer->size, me->mCallbackCookie);
+ me->snoopWrite(buffer->raw, buffer->size);
}
#undef LOG_TAG
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index 1c90cf9..d1206b4 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -113,6 +113,7 @@
public: // visualization hack support
uint32_t mNumFramesWritten;
+ void snoopWrite(const void*, size_t);
};
class AudioCache : public MediaPlayerBase::AudioSink
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
index 0fcfb8e..66de2ee 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -27,6 +27,7 @@
#include <string.h>
#include <cutils/atomic.h>
+#include <cutils/properties.h>
#include <binder/MemoryDealer.h>
#include <android_runtime/ActivityManager.h>
#include <binder/IPCThreadState.h>
@@ -105,6 +106,20 @@
{
sp<MediaMetadataRetrieverBase> p;
switch (playerType) {
+#if BUILD_WITH_FULL_STAGEFRIGHT
+ case STAGEFRIGHT_PLAYER:
+ {
+ char value[PROPERTY_VALUE_MAX];
+ if (property_get("media.stagefright.enable-meta", value, NULL)
+ && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
+ LOGV("create StagefrightMetadataRetriever");
+ p = new StagefrightMetadataRetriever;
+ break;
+ }
+
+ // fall through
+ }
+#endif
#ifndef NO_OPENCORE
case PV_PLAYER:
LOGV("create pv metadata retriever");
@@ -119,12 +134,6 @@
LOGV("create midi metadata retriever");
p = new MidiMetadataRetriever();
break;
-#if BUILD_WITH_FULL_STAGEFRIGHT
- case STAGEFRIGHT_PLAYER:
- LOGV("create StagefrightMetadataRetriever");
- p = new StagefrightMetadataRetriever;
- break;
-#endif
default:
// TODO:
// support for TEST_PLAYER
diff --git a/media/libmediaplayerservice/StagefrightMetadataRetriever.cpp b/media/libmediaplayerservice/StagefrightMetadataRetriever.cpp
deleted file mode 100644
index 42c1877..0000000
--- a/media/libmediaplayerservice/StagefrightMetadataRetriever.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
-**
-** Copyright 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.
-*/
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "StagefrightMetadataRetriever"
-#include <utils/Log.h>
-
-#include "StagefrightMetadataRetriever.h"
-
-#include <media/stagefright/CachingDataSource.h>
-#include <media/stagefright/ColorConverter.h>
-#include <media/stagefright/DataSource.h>
-#include <media/stagefright/FileSource.h>
-#include <media/stagefright/HTTPDataSource.h>
-#include <media/stagefright/MediaDebug.h>
-#include <media/stagefright/MediaExtractor.h>
-#include <media/stagefright/MetaData.h>
-#include <media/stagefright/OMXCodec.h>
-
-namespace android {
-
-StagefrightMetadataRetriever::StagefrightMetadataRetriever() {
- LOGV("StagefrightMetadataRetriever()");
-
- DataSource::RegisterDefaultSniffers();
- CHECK_EQ(mClient.connect(), OK);
-}
-
-StagefrightMetadataRetriever::~StagefrightMetadataRetriever() {
- LOGV("~StagefrightMetadataRetriever()");
- mClient.disconnect();
-}
-
-status_t StagefrightMetadataRetriever::setDataSource(const char *uri) {
- LOGV("setDataSource(%s)", uri);
-
- mExtractor = MediaExtractor::CreateFromURI(uri);
-
- return mExtractor.get() != NULL ? OK : UNKNOWN_ERROR;
-}
-
-status_t StagefrightMetadataRetriever::setDataSource(
- int fd, int64_t offset, int64_t length) {
- LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
-
- mExtractor = MediaExtractor::Create(
- new FileSource(fd, offset, length));
-
- return OK;
-}
-
-VideoFrame *StagefrightMetadataRetriever::captureFrame() {
- LOGV("captureFrame");
-
- if (mExtractor.get() == NULL) {
- LOGV("no extractor.");
- return NULL;
- }
-
- size_t n = mExtractor->countTracks();
- size_t i;
- for (i = 0; i < n; ++i) {
- sp<MetaData> meta = mExtractor->getTrackMetaData(i);
-
- const char *mime;
- CHECK(meta->findCString(kKeyMIMEType, &mime));
-
- if (!strncasecmp(mime, "video/", 6)) {
- break;
- }
- }
-
- if (i == n) {
- LOGV("no video track found.");
- return NULL;
- }
-
- sp<MetaData> trackMeta = mExtractor->getTrackMetaData(
- i, MediaExtractor::kIncludeExtensiveMetaData);
-
- sp<MediaSource> source = mExtractor->getTrack(i);
-
- if (source.get() == NULL) {
- LOGV("unable to instantiate video track.");
- return NULL;
- }
-
- sp<MetaData> meta = source->getFormat();
-
- sp<MediaSource> decoder =
- OMXCodec::Create(
- mClient.interface(), meta, false, source,
- NULL, OMXCodec::kPreferSoftwareCodecs);
-
- if (decoder.get() == NULL) {
- LOGV("unable to instantiate video decoder.");
-
- return NULL;
- }
-
- decoder->start();
-
- // Read one output buffer, ignore format change notifications
- // and spurious empty buffers.
-
- MediaSource::ReadOptions options;
- int64_t thumbNailTime;
- if (trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)) {
- options.setSeekTo(thumbNailTime);
- }
-
- MediaBuffer *buffer = NULL;
- status_t err;
- do {
- if (buffer != NULL) {
- buffer->release();
- buffer = NULL;
- }
- err = decoder->read(&buffer, &options);
- options.clearSeekTo();
- } while (err == INFO_FORMAT_CHANGED
- || (buffer != NULL && buffer->range_length() == 0));
-
- if (err != OK) {
- CHECK_EQ(buffer, NULL);
-
- LOGV("decoding frame failed.");
- decoder->stop();
-
- return NULL;
- }
-
- LOGV("successfully decoded video frame.");
-
- meta = decoder->getFormat();
-
- int32_t width, height;
- CHECK(meta->findInt32(kKeyWidth, &width));
- CHECK(meta->findInt32(kKeyHeight, &height));
-
- VideoFrame *frame = new VideoFrame;
- frame->mWidth = width;
- frame->mHeight = height;
- frame->mDisplayWidth = width;
- frame->mDisplayHeight = height;
- frame->mSize = width * height * 2;
- frame->mData = new uint8_t[frame->mSize];
-
- int32_t srcFormat;
- CHECK(meta->findInt32(kKeyColorFormat, &srcFormat));
-
- ColorConverter converter(
- (OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
- CHECK(converter.isValid());
-
- converter.convert(
- width, height,
- (const uint8_t *)buffer->data() + buffer->range_offset(),
- 0,
- frame->mData, width * 2);
-
- buffer->release();
- buffer = NULL;
-
- decoder->stop();
-
- return frame;
-}
-
-MediaAlbumArt *StagefrightMetadataRetriever::extractAlbumArt() {
- LOGV("extractAlbumArt (extractor: %s)", mExtractor.get() != NULL ? "YES" : "NO");
-
- return NULL;
-}
-
-const char *StagefrightMetadataRetriever::extractMetadata(int keyCode) {
- LOGV("extractMetadata %d (extractor: %s)",
- keyCode, mExtractor.get() != NULL ? "YES" : "NO");
-
- return NULL;
-}
-
-} // namespace android
diff --git a/media/libmediaplayerservice/StagefrightMetadataRetriever.h b/media/libmediaplayerservice/StagefrightMetadataRetriever.h
deleted file mode 100644
index 16127d7..0000000
--- a/media/libmediaplayerservice/StagefrightMetadataRetriever.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-**
-** Copyright 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.
-*/
-
-#ifndef STAGEFRIGHT_METADATA_RETRIEVER_H_
-
-#define STAGEFRIGHT_METADATA_RETRIEVER_H_
-
-#include <media/MediaMetadataRetrieverInterface.h>
-
-#include <media/stagefright/OMXClient.h>
-
-namespace android {
-
-class MediaExtractor;
-
-struct StagefrightMetadataRetriever : public MediaMetadataRetrieverInterface {
- StagefrightMetadataRetriever();
- virtual ~StagefrightMetadataRetriever();
-
- virtual status_t setDataSource(const char *url);
- virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
-
- virtual VideoFrame *captureFrame();
- virtual MediaAlbumArt *extractAlbumArt();
- virtual const char *extractMetadata(int keyCode);
-
-private:
- OMXClient mClient;
- sp<MediaExtractor> mExtractor;
-
- StagefrightMetadataRetriever(const StagefrightMetadataRetriever &);
-
- StagefrightMetadataRetriever &operator=(
- const StagefrightMetadataRetriever &);
-};
-
-} // namespace android
-
-#endif // STAGEFRIGHT_METADATA_RETRIEVER_H_
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index f7df69c..e36e78c 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -31,6 +31,8 @@
MediaExtractor.cpp \
SampleTable.cpp \
ShoutcastSource.cpp \
+ StagefrightMediaScanner.cpp \
+ StagefrightMetadataRetriever.cpp \
TimeSource.cpp \
TimedEventQueue.cpp \
WAVExtractor.cpp \
@@ -42,14 +44,17 @@
LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE) \
$(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include \
- $(TOP)/external/opencore/android
+ $(TOP)/external/opencore/android \
+ $(TOP)/external/tremor/Tremor
LOCAL_SHARED_LIBRARIES := \
libbinder \
libmedia \
libutils \
libcutils \
- libui
+ libui \
+ libsonivox \
+ libvorbisidec
ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
@@ -60,7 +65,8 @@
libstagefright_amrwbdec \
libstagefright_avcdec \
libstagefright_m4vh263dec \
- libstagefright_mp3dec
+ libstagefright_mp3dec \
+ libstagefright_id3
LOCAL_SHARED_LIBRARIES += \
libstagefright_amrnb_common \
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index 4280683..14842c0 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -133,13 +133,14 @@
if (mAudioSink.get() != NULL) {
mAudioSink->stop();
+ mAudioSink->close();
} else {
mAudioTrack->stop();
delete mAudioTrack;
mAudioTrack = NULL;
}
-
+
// Make sure to release any buffer we hold onto so that the
// source is able to stop().
if (mInputBuffer != NULL) {
@@ -150,7 +151,7 @@
}
mSource->stop();
-
+
mNumFramesPlayed = 0;
mPositionTimeMediaUs = -1;
mPositionTimeRealUs = -1;
@@ -259,7 +260,7 @@
mInputBuffer->set_range(mInputBuffer->range_offset() + copy,
mInputBuffer->range_length() - copy);
-
+
size_done += copy;
size_remaining -= copy;
}
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 9e388f9..6bcdfba 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -26,11 +26,13 @@
#include <media/stagefright/DataSource.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/OMXCodec.h>
+
namespace android {
struct AwesomeEvent : public TimedEventQueue::Event {
@@ -516,10 +518,19 @@
return UNKNOWN_ERROR;
}
- mAudioSource = OMXCodec::Create(
- mClient.interface(), source->getFormat(),
- false, // createEncoder
- source);
+ sp<MetaData> meta = source->getFormat();
+
+ const char *mime;
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
+ mAudioSource = source;
+ } else {
+ mAudioSource = OMXCodec::Create(
+ mClient.interface(), source->getFormat(),
+ false, // createEncoder
+ source);
+ }
if (mAudioSource != NULL) {
int64_t durationUs;
diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp
index 2a6dbc4..741e5e00 100644
--- a/media/libstagefright/DataSource.cpp
+++ b/media/libstagefright/DataSource.cpp
@@ -19,7 +19,10 @@
#include "include/MPEG4Extractor.h"
#include "include/WAVExtractor.h"
+#include <media/stagefright/CachingDataSource.h>
#include <media/stagefright/DataSource.h>
+#include <media/stagefright/FileSource.h>
+#include <media/stagefright/HTTPDataSource.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/String8.h>
@@ -91,4 +94,24 @@
RegisterSniffer(SniffWAV);
}
+// static
+sp<DataSource> DataSource::CreateFromURI(const char *uri) {
+ sp<DataSource> source;
+ if (!strncasecmp("file://", uri, 7)) {
+ source = new FileSource(uri + 7);
+ } else if (!strncasecmp("http://", uri, 7)) {
+ source = new HTTPDataSource(uri);
+ source = new CachingDataSource(source, 64 * 1024, 10);
+ } else {
+ // Assume it's a filename.
+ source = new FileSource(uri);
+ }
+
+ if (source == NULL || source->initCheck() != OK) {
+ return NULL;
+ }
+
+ return source;
+}
+
} // namespace android
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp
index 37c2450..b6f1af2 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -58,7 +58,10 @@
}
int err = fseeko(mFile, offset + mOffset, SEEK_SET);
- CHECK(err != -1);
+ if (err < 0) {
+ LOGE("seek to %lld failed", offset + mOffset);
+ return UNKNOWN_ERROR;
+ }
return fread(data, 1, size, mFile);
}
diff --git a/media/libstagefright/HTTPDataSource.cpp b/media/libstagefright/HTTPDataSource.cpp
index 5536801..7e8bbc6 100644
--- a/media/libstagefright/HTTPDataSource.cpp
+++ b/media/libstagefright/HTTPDataSource.cpp
@@ -24,6 +24,69 @@
namespace android {
+// Given a connected HTTPStream, determine if the given path redirects
+// somewhere else, if so, disconnect the stream, update host path and port
+// accordingly and return true, otherwise return false and leave the stream
+// connected.
+static bool PerformRedirectIfNecessary(
+ HTTPStream *http, string *host, string *path, int *port) {
+ String8 request;
+ request.append("HEAD ");
+ request.append(path->c_str());
+ request.append(" HTTP/1.1\r\n");
+ request.append("Host: ");
+ request.append(host->c_str());
+ request.append("\r\n\r\n");
+
+ status_t err = http->send(request.string());
+
+ int http_status;
+ if (err == OK) {
+ err = http->receive_header(&http_status);
+ }
+
+ if (err != OK) {
+ return false;
+ }
+
+ if (http_status != 301 && http_status != 302) {
+ return false;
+ }
+
+ string location;
+ CHECK(http->find_header_value("Location", &location));
+
+ CHECK(string(location, 0, 7) == "http://");
+ location.erase(0, 7);
+ string::size_type slashPos = location.find('/');
+ if (slashPos == string::npos) {
+ slashPos = location.size();
+ location += '/';
+ }
+
+ http->disconnect();
+
+ LOGI("Redirecting to %s\n", location.c_str());
+
+ *host = string(location, 0, slashPos);
+
+ string::size_type colonPos = host->find(':');
+ if (colonPos != string::npos) {
+ const char *start = host->c_str() + colonPos + 1;
+ char *end;
+ long tmp = strtol(start, &end, 10);
+ CHECK(end > start && (*end == '\0'));
+
+ *port = (tmp >= 0 && tmp < 65536) ? (int)tmp : 80;
+ } else {
+ *port = 80;
+ }
+
+ *path = string(location, slashPos);
+
+ return true;
+}
+
HTTPDataSource::HTTPDataSource(const char *uri)
: mHttp(new HTTPStream),
mHost(NULL),
@@ -63,22 +126,44 @@
LOGI("Connecting to host '%s', port %d, path '%s'",
host.c_str(), port, path.c_str());
+ do {
+ mInitCheck = mHttp->connect(host.c_str(), port);
+
+ if (mInitCheck != OK) {
+ return;
+ }
+ } while (PerformRedirectIfNecessary(mHttp, &host, &path, &port));
+
mHost = strdup(host.c_str());
mPort = port;
mPath = strdup(path.c_str());
-
- mInitCheck = mHttp->connect(mHost, mPort);
}
-HTTPDataSource::HTTPDataSource(const char *host, int port, const char *path)
+HTTPDataSource::HTTPDataSource(const char *_host, int port, const char *_path)
: mHttp(new HTTPStream),
- mHost(strdup(host)),
- mPort(port),
- mPath(strdup(path)),
+ mHost(NULL),
+ mPort(0),
+ mPath(NULL),
mBuffer(malloc(kBufferSize)),
mBufferLength(0),
mBufferOffset(0) {
- mInitCheck = mHttp->connect(mHost, mPort);
+ string host = _host;
+ string path = _path;
+
+ LOGI("Connecting to host '%s', port %d, path '%s'",
+ host.c_str(), port, path.c_str());
+
+ do {
+ mInitCheck = mHttp->connect(host.c_str(), port);
+
+ if (mInitCheck != OK) {
+ return;
+ }
+ } while (PerformRedirectIfNecessary(mHttp, &host, &path, &port));
+
+ mHost = strdup(host.c_str());
+ mPort = port;
+ mPath = strdup(path.c_str());
}
status_t HTTPDataSource::initCheck() const {
@@ -91,8 +176,15 @@
free(mBuffer);
mBuffer = NULL;
- free(mPath);
- mPath = NULL;
+ if (mPath) {
+ free(mPath);
+ mPath = NULL;
+ }
+
+ if (mHost) {
+ free(mHost);
+ mHost = NULL;
+ }
delete mHttp;
mHttp = NULL;
diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp
index 14e6177..5df1e00 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -20,6 +20,8 @@
#include "include/MP3Extractor.h"
+#include "include/ID3.h"
+
#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaBufferGroup.h>
@@ -557,7 +559,7 @@
mStarted(false),
mByteNumber(byte_number),
mGroup(NULL) {
- memcpy (mTableOfContents, table_of_contents, strlen(table_of_contents));
+ memcpy (mTableOfContents, table_of_contents, sizeof(mTableOfContents));
}
MP3Source::~MP3Source() {
@@ -667,7 +669,7 @@
}
// Lost sync.
- LOGW("lost sync!\n");
+ LOGV("lost sync!\n");
off_t pos = mCurrentPos;
if (!Resync(mDataSource, mFixedHeader, &pos, NULL)) {
@@ -706,6 +708,63 @@
return OK;
}
+sp<MetaData> MP3Extractor::getMetaData() {
+ sp<MetaData> meta = new MetaData;
+
+ meta->setCString(kKeyMIMEType, "audio/mpeg");
+
+ ID3 id3(mDataSource);
+
+ if (!id3.isValid()) {
+ return meta;
+ }
+
+ struct Map {
+ int key;
+ const char *tag1;
+ const char *tag2;
+ };
+ static const Map kMap[] = {
+ { kKeyAlbum, "TALB", "TAL" },
+ { kKeyArtist, "TPE1", "TP1" },
+ { kKeyComposer, "TCOM", "TCM" },
+ { kKeyGenre, "TCON", "TCO" },
+ { kKeyTitle, "TALB", "TAL" },
+ { kKeyYear, "TYE", "TYER" },
+ };
+ static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
+
+ for (size_t i = 0; i < kNumMapEntries; ++i) {
+ ID3::Iterator *it = new ID3::Iterator(id3, kMap[i].tag1);
+ if (it->done()) {
+ delete it;
+ it = new ID3::Iterator(id3, kMap[i].tag2);
+ }
+
+ if (it->done()) {
+ delete it;
+ continue;
+ }
+
+ String8 s;
+ it->getString(&s);
+ delete it;
+
+ meta->setCString(kMap[i].key, s);
+ }
+
+ size_t dataSize;
+ String8 mime;
+ const void *data = id3.getAlbumArt(&dataSize, &mime);
+
+ if (data) {
+ meta->setData(kKeyAlbumArt, MetaData::TYPE_NONE, data, dataSize);
+ meta->setCString(kKeyAlbumArtMIME, mime.string());
+ }
+
+ return meta;
+}
+
bool SniffMP3(
const sp<DataSource> &source, String8 *mimeType, float *confidence) {
off_t pos = 0;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 143e8ee..b340b29 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -66,6 +66,8 @@
uint32_t mCurrentSampleIndex;
bool mIsAVC;
+ size_t mNALLengthSize;
+
bool mStarted;
MediaBufferGroup *mGroup;
@@ -76,6 +78,8 @@
uint8_t *mSrcBuffer;
+ size_t parseNALSize(const uint8_t *data) const;
+
MPEG4Source(const MPEG4Source &);
MPEG4Source &operator=(const MPEG4Source &);
};
@@ -770,6 +774,7 @@
mSampleTable(sampleTable),
mCurrentSampleIndex(0),
mIsAVC(false),
+ mNALLengthSize(0),
mStarted(false),
mGroup(NULL),
mBuffer(NULL),
@@ -780,6 +785,21 @@
CHECK(success);
mIsAVC = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC);
+
+ if (mIsAVC) {
+ uint32_t type;
+ const void *data;
+ size_t size;
+ CHECK(format->findData(kKeyAVCC, &type, &data, &size));
+
+ const uint8_t *ptr = (const uint8_t *)data;
+
+ CHECK(size >= 7);
+ CHECK_EQ(ptr[0], 1); // configurationVersion == 1
+
+ // The number of bytes used to encode the length of a NAL unit.
+ mNALLengthSize = 1 + (ptr[4] & 3);
+ }
}
MPEG4Source::~MPEG4Source() {
@@ -837,6 +857,25 @@
return mFormat;
}
+size_t MPEG4Source::parseNALSize(const uint8_t *data) const {
+ switch (mNALLengthSize) {
+ case 1:
+ return *data;
+ case 2:
+ return U16_AT(data);
+ case 3:
+ return ((size_t)data[0] << 16) | U16_AT(&data[1]);
+ case 4:
+ return U32_AT(data);
+ }
+
+ // This cannot happen, mNALLengthSize springs to life by adding 1 to
+ // a 2-bit integer.
+ CHECK(!"Should not be here.");
+
+ return 0;
+}
+
status_t MPEG4Source::read(
MediaBuffer **out, const ReadOptions *options) {
CHECK(mStarted);
@@ -919,21 +958,20 @@
// Each NAL unit is split up into its constituent fragments and
// each one of them returned in its own buffer.
- CHECK(mBuffer->range_length() >= 2);
+ CHECK(mBuffer->range_length() >= mNALLengthSize);
const uint8_t *src =
(const uint8_t *)mBuffer->data() + mBuffer->range_offset();
- size_t nal_size = U16_AT(src);
-
- CHECK(mBuffer->range_length() >= 2 + nal_size);
+ size_t nal_size = parseNALSize(src);
+ CHECK(mBuffer->range_length() >= mNALLengthSize + nal_size);
MediaBuffer *clone = mBuffer->clone();
- clone->set_range(mBuffer->range_offset() + 2, nal_size);
+ clone->set_range(mBuffer->range_offset() + mNALLengthSize, nal_size);
mBuffer->set_range(
- mBuffer->range_offset() + 2 + nal_size,
- mBuffer->range_length() - 2 - nal_size);
+ mBuffer->range_offset() + mNALLengthSize + nal_size,
+ mBuffer->range_length() - mNALLengthSize - nal_size);
if (mBuffer->range_length() == 0) {
mBuffer->release();
@@ -960,12 +998,12 @@
uint8_t *dstData = (uint8_t *)mBuffer->data();
size_t srcOffset = 0;
size_t dstOffset = 0;
+
while (srcOffset < size) {
- CHECK(srcOffset + 1 < size);
- size_t nalLength =
- (mSrcBuffer[srcOffset] << 8) | mSrcBuffer[srcOffset + 1];
- CHECK(srcOffset + 1 + nalLength < size);
- srcOffset += 2;
+ CHECK(srcOffset + mNALLengthSize <= size);
+ size_t nalLength = parseNALSize(&mSrcBuffer[srcOffset]);
+ srcOffset += mNALLengthSize;
+ CHECK(srcOffset + nalLength <= size);
if (nalLength == 0) {
continue;
@@ -981,6 +1019,7 @@
srcOffset += nalLength;
dstOffset += nalLength;
}
+ CHECK_EQ(srcOffset, size);
mBuffer->set_range(0, dstOffset);
mBuffer->meta_data()->clear();
diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp
index 9d3deb7..e46f00e 100644
--- a/media/libstagefright/MediaExtractor.cpp
+++ b/media/libstagefright/MediaExtractor.cpp
@@ -23,16 +23,18 @@
#include "include/MPEG4Extractor.h"
#include "include/WAVExtractor.h"
-#include <media/stagefright/CachingDataSource.h>
#include <media/stagefright/DataSource.h>
-#include <media/stagefright/FileSource.h>
-#include <media/stagefright/HTTPDataSource.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaExtractor.h>
+#include <media/stagefright/MetaData.h>
#include <utils/String8.h>
namespace android {
+sp<MetaData> MediaExtractor::getMetaData() {
+ return new MetaData;
+}
+
// static
sp<MediaExtractor> MediaExtractor::Create(
const sp<DataSource> &source, const char *mime) {
@@ -40,7 +42,7 @@
if (mime == NULL) {
float confidence;
if (!source->sniff(&tmp, &confidence)) {
- LOGE("FAILED to autodetect media content.");
+ LOGV("FAILED to autodetect media content.");
return NULL;
}
@@ -68,16 +70,7 @@
// static
sp<MediaExtractor> MediaExtractor::CreateFromURI(
const char *uri, const char *mime) {
- sp<DataSource> source;
- if (!strncasecmp("file://", uri, 7)) {
- source = new FileSource(uri + 7);
- } else if (!strncasecmp("http://", uri, 7)) {
- source = new HTTPDataSource(uri);
- source = new CachingDataSource(source, 64 * 1024, 10);
- } else {
- // Assume it's a filename.
- source = new FileSource(uri);
- }
+ sp<DataSource> source = DataSource::CreateFromURI(uri);
if (source == NULL || source->initCheck() != OK) {
return NULL;
diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp
new file mode 100644
index 0000000..4815db2
--- /dev/null
+++ b/media/libstagefright/StagefrightMediaScanner.cpp
@@ -0,0 +1,239 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "StagefrightMediaScanner"
+#include <utils/Log.h>
+
+#include <media/stagefright/StagefrightMediaScanner.h>
+
+#include "include/StagefrightMetadataRetriever.h"
+
+// Sonivox includes
+#include <libsonivox/eas.h>
+
+// Ogg Vorbis includes
+#include "ivorbiscodec.h"
+#include "ivorbisfile.h"
+
+namespace android {
+
+StagefrightMediaScanner::StagefrightMediaScanner()
+ : mRetriever(new StagefrightMetadataRetriever) {
+}
+
+StagefrightMediaScanner::~StagefrightMediaScanner() {}
+
+static bool FileHasAcceptableExtension(const char *extension) {
+ static const char *kValidExtensions[] = {
+ ".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2", ".3gpp2",
+ ".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac",
+ ".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota"
+ };
+ static const size_t kNumValidExtensions =
+ sizeof(kValidExtensions) / sizeof(kValidExtensions[0]);
+
+ for (size_t i = 0; i < kNumValidExtensions; ++i) {
+ if (!strcasecmp(extension, kValidExtensions[i])) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static status_t HandleMIDI(
+ const char *filename, MediaScannerClient *client) {
+ // get the library configuration and do sanity check
+ const S_EAS_LIB_CONFIG* pLibConfig = EAS_Config();
+ if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) {
+ LOGE("EAS library/header mismatch\n");
+ return UNKNOWN_ERROR;
+ }
+ EAS_I32 temp;
+
+ // spin up a new EAS engine
+ EAS_DATA_HANDLE easData = NULL;
+ EAS_HANDLE easHandle = NULL;
+ EAS_RESULT result = EAS_Init(&easData);
+ if (result == EAS_SUCCESS) {
+ EAS_FILE file;
+ file.path = filename;
+ file.fd = 0;
+ file.offset = 0;
+ file.length = 0;
+ result = EAS_OpenFile(easData, &file, &easHandle);
+ }
+ if (result == EAS_SUCCESS) {
+ result = EAS_Prepare(easData, easHandle);
+ }
+ if (result == EAS_SUCCESS) {
+ result = EAS_ParseMetaData(easData, easHandle, &temp);
+ }
+ if (easHandle) {
+ EAS_CloseFile(easData, easHandle);
+ }
+ if (easData) {
+ EAS_Shutdown(easData);
+ }
+
+ if (result != EAS_SUCCESS) {
+ return UNKNOWN_ERROR;
+ }
+
+ char buffer[20];
+ sprintf(buffer, "%ld", temp);
+ if (!client->addStringTag("duration", buffer)) return UNKNOWN_ERROR;
+
+ return OK;
+}
+
+static status_t HandleOGG(
+ const char *filename, MediaScannerClient *client) {
+ int duration;
+
+ FILE *file = fopen(filename,"r");
+ if (!file)
+ return UNKNOWN_ERROR;
+
+ OggVorbis_File vf;
+ if (ov_open(file, &vf, NULL, 0) < 0) {
+ return UNKNOWN_ERROR;
+ }
+
+ char **ptr=ov_comment(&vf,-1)->user_comments;
+ while(*ptr){
+ char *val = strstr(*ptr, "=");
+ if (val) {
+ int keylen = val++ - *ptr;
+ char key[keylen + 1];
+ strncpy(key, *ptr, keylen);
+ key[keylen] = 0;
+ if (!client->addStringTag(key, val)) goto failure;
+ }
+ ++ptr;
+ }
+
+ // Duration
+ duration = ov_time_total(&vf, -1);
+ if (duration > 0) {
+ char buffer[20];
+ sprintf(buffer, "%d", duration);
+ if (!client->addStringTag("duration", buffer)) goto failure;
+ }
+
+ ov_clear(&vf); // this also closes the FILE
+ return OK;
+
+failure:
+ ov_clear(&vf); // this also closes the FILE
+ return UNKNOWN_ERROR;
+}
+
+status_t StagefrightMediaScanner::processFile(
+ const char *path, const char *mimeType,
+ MediaScannerClient &client) {
+ client.setLocale(locale());
+ client.beginFile();
+
+ const char *extension = strrchr(path, '.');
+
+ if (!extension) {
+ return UNKNOWN_ERROR;
+ }
+
+ if (!FileHasAcceptableExtension(extension)) {
+ client.endFile();
+
+ return UNKNOWN_ERROR;
+ }
+
+ if (!strcasecmp(extension, ".mid")
+ || !strcasecmp(extension, ".smf")
+ || !strcasecmp(extension, ".imy")
+ || !strcasecmp(extension, ".midi")
+ || !strcasecmp(extension, ".xmf")
+ || !strcasecmp(extension, ".rtttl")
+ || !strcasecmp(extension, ".rtx")
+ || !strcasecmp(extension, ".ota")) {
+ return HandleMIDI(path, &client);
+ }
+
+ if (!strcasecmp(extension, ".ogg")) {
+ return HandleOGG(path, &client);
+ }
+
+ if (mRetriever->setDataSource(path) == OK
+ && mRetriever->setMode(
+ METADATA_MODE_METADATA_RETRIEVAL_ONLY) == OK) {
+ struct KeyMap {
+ const char *tag;
+ int key;
+ };
+ static const KeyMap kKeyMap[] = {
+ { "tracknumber", METADATA_KEY_CD_TRACK_NUMBER },
+ { "album", METADATA_KEY_ALBUM },
+ { "artist", METADATA_KEY_ARTIST },
+ { "composer", METADATA_KEY_COMPOSER },
+ { "genre", METADATA_KEY_GENRE },
+ { "title", METADATA_KEY_TITLE },
+ { "year", METADATA_KEY_YEAR },
+ { "duration", METADATA_KEY_DURATION },
+ { "writer", METADATA_KEY_WRITER },
+ };
+ static const size_t kNumEntries = sizeof(kKeyMap) / sizeof(kKeyMap[0]);
+
+ for (size_t i = 0; i < kNumEntries; ++i) {
+ const char *value;
+ if ((value = mRetriever->extractMetadata(kKeyMap[i].key)) != NULL) {
+ client.addStringTag(kKeyMap[i].tag, value);
+ }
+ }
+ }
+
+ client.endFile();
+
+ return OK;
+}
+
+char *StagefrightMediaScanner::extractAlbumArt(int fd) {
+ off_t size = lseek(fd, 0, SEEK_END);
+ if (size < 0) {
+ return NULL;
+ }
+ lseek(fd, 0, SEEK_SET);
+
+ if (mRetriever->setDataSource(fd, 0, size) == OK
+ && mRetriever->setMode(
+ METADATA_MODE_FRAME_CAPTURE_ONLY) == OK) {
+ MediaAlbumArt *art = mRetriever->extractAlbumArt();
+
+ if (art != NULL) {
+ char *data = (char *)malloc(art->mSize + 4);
+ *(int32_t *)data = art->mSize;
+ memcpy(&data[4], art->mData, art->mSize);
+
+ delete art;
+ art = NULL;
+
+ return data;
+ }
+ }
+
+ return NULL;
+}
+
+} // namespace android
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
new file mode 100644
index 0000000..be4a9d9
--- /dev/null
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -0,0 +1,325 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "StagefrightMetadataRetriever"
+#include <utils/Log.h>
+
+#include "include/StagefrightMetadataRetriever.h"
+
+#include <media/stagefright/CachingDataSource.h>
+#include <media/stagefright/ColorConverter.h>
+#include <media/stagefright/DataSource.h>
+#include <media/stagefright/FileSource.h>
+#include <media/stagefright/HTTPDataSource.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaExtractor.h>
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/OMXCodec.h>
+
+namespace android {
+
+StagefrightMetadataRetriever::StagefrightMetadataRetriever()
+ : mParsedMetaData(false),
+ mAlbumArt(NULL) {
+ LOGV("StagefrightMetadataRetriever()");
+
+ DataSource::RegisterDefaultSniffers();
+ CHECK_EQ(mClient.connect(), OK);
+}
+
+StagefrightMetadataRetriever::~StagefrightMetadataRetriever() {
+ LOGV("~StagefrightMetadataRetriever()");
+
+ delete mAlbumArt;
+ mAlbumArt = NULL;
+
+ mClient.disconnect();
+}
+
+status_t StagefrightMetadataRetriever::setDataSource(const char *uri) {
+ LOGV("setDataSource(%s)", uri);
+
+ mParsedMetaData = false;
+ mMetaData.clear();
+ delete mAlbumArt;
+ mAlbumArt = NULL;
+
+ mSource = DataSource::CreateFromURI(uri);
+
+ if (mSource == NULL) {
+ return UNKNOWN_ERROR;
+ }
+
+ mExtractor = MediaExtractor::Create(mSource);
+
+ if (mExtractor == NULL) {
+ mSource.clear();
+
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+// Warning caller retains ownership of the filedescriptor! Dup it if necessary.
+status_t StagefrightMetadataRetriever::setDataSource(
+ int fd, int64_t offset, int64_t length) {
+ fd = dup(fd);
+
+ LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
+
+ mParsedMetaData = false;
+ mMetaData.clear();
+ delete mAlbumArt;
+ mAlbumArt = NULL;
+
+ mSource = new FileSource(fd, offset, length);
+
+ status_t err;
+ if ((err = mSource->initCheck()) != OK) {
+ mSource.clear();
+
+ return err;
+ }
+
+ mExtractor = MediaExtractor::Create(mSource);
+
+ if (mExtractor == NULL) {
+ mSource.clear();
+
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+VideoFrame *StagefrightMetadataRetriever::captureFrame() {
+ LOGV("captureFrame");
+
+ if (mExtractor.get() == NULL) {
+ LOGV("no extractor.");
+ return NULL;
+ }
+
+ size_t n = mExtractor->countTracks();
+ size_t i;
+ for (i = 0; i < n; ++i) {
+ sp<MetaData> meta = mExtractor->getTrackMetaData(i);
+
+ const char *mime;
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
+
+ if (!strncasecmp(mime, "video/", 6)) {
+ break;
+ }
+ }
+
+ if (i == n) {
+ LOGV("no video track found.");
+ return NULL;
+ }
+
+ sp<MetaData> trackMeta = mExtractor->getTrackMetaData(
+ i, MediaExtractor::kIncludeExtensiveMetaData);
+
+ sp<MediaSource> source = mExtractor->getTrack(i);
+
+ if (source.get() == NULL) {
+ LOGV("unable to instantiate video track.");
+ return NULL;
+ }
+
+ sp<MetaData> meta = source->getFormat();
+
+ sp<MediaSource> decoder =
+ OMXCodec::Create(
+ mClient.interface(), meta, false, source,
+ NULL, OMXCodec::kPreferSoftwareCodecs);
+
+ if (decoder.get() == NULL) {
+ LOGV("unable to instantiate video decoder.");
+
+ return NULL;
+ }
+
+ decoder->start();
+
+ // Read one output buffer, ignore format change notifications
+ // and spurious empty buffers.
+
+ MediaSource::ReadOptions options;
+ int64_t thumbNailTime;
+ if (trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)) {
+ options.setSeekTo(thumbNailTime);
+ }
+
+ MediaBuffer *buffer = NULL;
+ status_t err;
+ do {
+ if (buffer != NULL) {
+ buffer->release();
+ buffer = NULL;
+ }
+ err = decoder->read(&buffer, &options);
+ options.clearSeekTo();
+ } while (err == INFO_FORMAT_CHANGED
+ || (buffer != NULL && buffer->range_length() == 0));
+
+ if (err != OK) {
+ CHECK_EQ(buffer, NULL);
+
+ LOGV("decoding frame failed.");
+ decoder->stop();
+
+ return NULL;
+ }
+
+ LOGV("successfully decoded video frame.");
+
+ meta = decoder->getFormat();
+
+ int32_t width, height;
+ CHECK(meta->findInt32(kKeyWidth, &width));
+ CHECK(meta->findInt32(kKeyHeight, &height));
+
+ VideoFrame *frame = new VideoFrame;
+ frame->mWidth = width;
+ frame->mHeight = height;
+ frame->mDisplayWidth = width;
+ frame->mDisplayHeight = height;
+ frame->mSize = width * height * 2;
+ frame->mData = new uint8_t[frame->mSize];
+
+ int32_t srcFormat;
+ CHECK(meta->findInt32(kKeyColorFormat, &srcFormat));
+
+ ColorConverter converter(
+ (OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
+ CHECK(converter.isValid());
+
+ converter.convert(
+ width, height,
+ (const uint8_t *)buffer->data() + buffer->range_offset(),
+ 0,
+ frame->mData, width * 2);
+
+ buffer->release();
+ buffer = NULL;
+
+ decoder->stop();
+
+ return frame;
+}
+
+MediaAlbumArt *StagefrightMetadataRetriever::extractAlbumArt() {
+ LOGV("extractAlbumArt (extractor: %s)", mExtractor.get() != NULL ? "YES" : "NO");
+
+ if (mExtractor == NULL) {
+ return NULL;
+ }
+
+ if (!mParsedMetaData) {
+ parseMetaData();
+
+ mParsedMetaData = true;
+ }
+
+ if (mAlbumArt) {
+ return new MediaAlbumArt(*mAlbumArt);
+ }
+
+ return NULL;
+}
+
+const char *StagefrightMetadataRetriever::extractMetadata(int keyCode) {
+ LOGV("extractMetadata %d", keyCode);
+
+ if (mExtractor == NULL) {
+ return NULL;
+ }
+
+ if (!mParsedMetaData) {
+ parseMetaData();
+
+ mParsedMetaData = true;
+ }
+
+ ssize_t index = mMetaData.indexOfKey(keyCode);
+
+ if (index < 0) {
+ return NULL;
+ }
+
+ return strdup(mMetaData.valueAt(index).string());
+}
+
+void StagefrightMetadataRetriever::parseMetaData() {
+ sp<MetaData> meta = mExtractor->getMetaData();
+
+ struct Map {
+ int from;
+ int to;
+ };
+ static const Map kMap[] = {
+ { kKeyAlbum, METADATA_KEY_ALBUM },
+ { kKeyArtist, METADATA_KEY_ARTIST },
+ { kKeyComposer, METADATA_KEY_COMPOSER },
+ { kKeyGenre, METADATA_KEY_GENRE },
+ { kKeyTitle, METADATA_KEY_TITLE },
+ { kKeyYear, METADATA_KEY_YEAR },
+ };
+ static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
+
+ for (size_t i = 0; i < kNumMapEntries; ++i) {
+ const char *value;
+ if (meta->findCString(kMap[i].from, &value)) {
+ mMetaData.add(kMap[i].to, String8(value));
+ }
+ }
+
+ const void *data;
+ uint32_t type;
+ size_t dataSize;
+ if (meta->findData(kKeyAlbumArt, &type, &data, &dataSize)) {
+ mAlbumArt = new MediaAlbumArt;
+ mAlbumArt->mSize = dataSize;
+ mAlbumArt->mData = new uint8_t[dataSize];
+ memcpy(mAlbumArt->mData, data, dataSize);
+ }
+
+ // The overall duration is the duration of the longest track.
+ int64_t maxDurationUs = 0;
+ for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
+ sp<MetaData> trackMeta = mExtractor->getTrackMetaData(i);
+
+ int64_t durationUs;
+ if (trackMeta->findInt64(kKeyDuration, &durationUs)) {
+ if (durationUs > maxDurationUs) {
+ maxDurationUs = durationUs;
+ }
+ }
+ }
+
+ // The duration value is a string representing the duration in ms.
+ char tmp[32];
+ sprintf(tmp, "%lld", (maxDurationUs + 500) / 1000);
+
+ mMetaData.add(METADATA_KEY_DURATION, String8(tmp));
+}
+
+
+} // namespace android
diff --git a/media/libstagefright/codecs/aacdec/AACDecoder.cpp b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
index 92059c5..ff51e88 100644
--- a/media/libstagefright/codecs/aacdec/AACDecoder.cpp
+++ b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
@@ -70,7 +70,8 @@
uint32_t type;
const void *data;
size_t size;
- if (mSource->getFormat()->findData(kKeyESDS, &type, &data, &size)) {
+ sp<MetaData> meta = mSource->getFormat();
+ if (meta->findData(kKeyESDS, &type, &data, &size)) {
ESDS esds((const char *)data, size);
CHECK_EQ(esds.InitCheck(), OK);
diff --git a/media/libstagefright/codecs/avc/common/include/avclib_common.h b/media/libstagefright/codecs/avc/common/include/avclib_common.h
index e98396e..cbbf0c6 100644
--- a/media/libstagefright/codecs/avc/common/include/avclib_common.h
+++ b/media/libstagefright/codecs/avc/common/include/avclib_common.h
@@ -22,6 +22,8 @@
#ifndef AVCCOMMON_LIB_H_INCLUDED
#define AVCCOMMON_LIB_H_INCLUDED
+#include <stdlib.h>
+
#ifndef AVCINT_COMMON_H_INCLUDED
#include "avcint_common.h"
#endif
diff --git a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp
index 484c742..d874224 100644
--- a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp
+++ b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp
@@ -90,7 +90,8 @@
uint32_t type;
const void *data;
size_t size;
- if (mSource->getFormat()->findData(kKeyAVCC, &type, &data, &size)) {
+ sp<MetaData> meta = mSource->getFormat();
+ if (meta->findData(kKeyAVCC, &type, &data, &size)) {
// Parse the AVCDecoderConfigurationRecord
const uint8_t *ptr = (const uint8_t *)data;
@@ -262,6 +263,8 @@
&nalType, &nalRefIdc);
if (res != AVCDEC_SUCCESS) {
+ LOGE("cannot determine nal type");
+
mInputBuffer->release();
mInputBuffer = NULL;
@@ -375,18 +378,19 @@
mInputBuffer->release();
mInputBuffer = NULL;
- if (res == AVCDEC_PICTURE_READY) {
+ if (res == AVCDEC_PICTURE_READY || res == AVCDEC_SUCCESS) {
*out = new MediaBuffer(0);
return OK;
} else {
+ LOGV("failed to decode frame (res = %d)", res);
return UNKNOWN_ERROR;
}
}
case AVC_NALTYPE_SEI:
{
- res = PVAVCDecodeSlice(
+ res = PVAVCDecSEI(
mHandle, const_cast<uint8_t *>(inPtr),
mInputBuffer->range_length());
@@ -404,6 +408,9 @@
case AVC_NALTYPE_AUD:
{
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+
*out = new MediaBuffer(0);
return OK;
diff --git a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp
index c3ef0d2..40009f8 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp
@@ -43,8 +43,17 @@
memset(mHandle, 0, sizeof(tagvideoDecControls));
mFormat = new MetaData;
mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
- CHECK(mSource->getFormat()->findInt32(kKeyWidth, &mWidth));
- CHECK(mSource->getFormat()->findInt32(kKeyHeight, &mHeight));
+
+ // CHECK(mSource->getFormat()->findInt32(kKeyWidth, &mWidth));
+ // CHECK(mSource->getFormat()->findInt32(kKeyHeight, &mHeight));
+
+ // We'll ignore the dimension advertised by the source, the decoder
+ // appears to require us to always start with the default dimensions
+ // of 352 x 288 to operate correctly and later react to changes in
+ // the dimensions as needed.
+ mWidth = 352;
+ mHeight = 288;
+
mFormat->setInt32(kKeyWidth, mWidth);
mFormat->setInt32(kKeyHeight, mHeight);
mFormat->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar);
@@ -60,11 +69,26 @@
mHandle = NULL;
}
+void M4vH263Decoder::allocateFrames(int32_t width, int32_t height) {
+ size_t frameSize =
+ (((width + 15) & - 16) * ((height + 15) & - 16) * 3) / 2;
+
+ for (uint32_t i = 0; i < 2; ++i) {
+ mFrames[i] = new MediaBuffer(frameSize);
+ mFrames[i]->setObserver(this);
+ }
+
+ PVSetReferenceYUV(
+ mHandle,
+ (uint8_t *)mFrames[1]->data());
+}
+
status_t M4vH263Decoder::start(MetaData *) {
CHECK(!mStarted);
const char *mime = NULL;
- CHECK(mSource->getFormat()->findCString(kKeyMIMEType, &mime));
+ sp<MetaData> meta = mSource->getFormat();
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
MP4DecodingMode mode;
if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) {
@@ -79,13 +103,14 @@
size_t size = 0;
uint8_t *vol_data[1] = {0};
int32_t vol_size = 0;
- if (mSource->getFormat()->findData(kKeyESDS, &type, &data, &size)) {
+ if (meta->findData(kKeyESDS, &type, &data, &size)) {
ESDS esds((const uint8_t *)data, size);
CHECK_EQ(esds.InitCheck(), OK);
const void *codec_specific_data;
size_t codec_specific_data_size;
- esds.getCodecSpecificInfo(&codec_specific_data, &codec_specific_data_size);
+ esds.getCodecSpecificInfo(
+ &codec_specific_data, &codec_specific_data_size);
vol_data[0] = (uint8_t *) malloc(codec_specific_data_size);
memcpy(vol_data[0], codec_specific_data, codec_specific_data_size);
@@ -102,12 +127,14 @@
CHECK_EQ(mode, actualMode);
PVSetPostProcType((VideoDecControls *) mHandle, 0);
- size_t frameSize = (((mWidth + 15) & - 16) * ((mHeight + 15) & - 16) * 3) / 2;
- for (uint32_t i = 0; i < 2; ++i) {
- mFrames[i] = new MediaBuffer(frameSize);
- mFrames[i]->setObserver(this);
+
+ int32_t width, height;
+ PVGetVideoDimensions(mHandle, &width, &height);
+ if (mode == H263_MODE && (width == 0 || height == 0)) {
+ width = 352;
+ height = 288;
}
- PVSetReferenceYUV(mHandle, (uint8_t *)mFrames[1]->data());
+ allocateFrames(width, height);
mSource->start();
@@ -152,24 +179,41 @@
return err;
}
- uint8_t *bitstream = (uint8_t *) inputBuffer->data() + inputBuffer->range_offset();
+ uint8_t *bitstream =
+ (uint8_t *) inputBuffer->data() + inputBuffer->range_offset();
+
uint32_t timestamp = 0xFFFFFFFF;
int32_t bufferSize = inputBuffer->range_length();
uint32_t useExtTimestamp = 0;
- CHECK_EQ(PV_TRUE, PVDecodeVideoFrame(mHandle, &bitstream, ×tamp, &bufferSize,
- &useExtTimestamp, (uint8_t *)mFrames[mNumSamplesOutput & 0x01]->data()));
+ if (PVDecodeVideoFrame(
+ mHandle, &bitstream, ×tamp, &bufferSize,
+ &useExtTimestamp,
+ (uint8_t *)mFrames[mNumSamplesOutput & 0x01]->data())
+ != PV_TRUE) {
+ LOGE("failed to decode video frame.");
- // Check whether video dimension is changed.
- // If so, notify the client about the change.
+ inputBuffer->release();
+ inputBuffer = NULL;
+
+ return UNKNOWN_ERROR;
+ }
+
int32_t width, height;
PVGetVideoDimensions(mHandle, &width, &height);
- if (mWidth != width || mHeight != height) {
- mFormat->setInt32(kKeyWidth, width);
- mFormat->setInt32(kKeyHeight, height);
+ if (width != mWidth || height != mHeight) {
+ ++mNumSamplesOutput; // The client will never get to see this frame.
+
+ inputBuffer->release();
+ inputBuffer = NULL;
+
+ mWidth = width;
+ mHeight = height;
+ mFormat->setInt32(kKeyWidth, mWidth);
+ mFormat->setInt32(kKeyHeight, mHeight);
+
return INFO_FORMAT_CHANGED;
}
- PVSetReferenceYUV(mHandle, (uint8_t *)mFrames[mNumSamplesOutput & 0x01]->data());
*out = mFrames[mNumSamplesOutput & 0x01];
(*out)->add_ref();
@@ -179,6 +223,7 @@
++mNumSamplesOutput;
inputBuffer->release();
+ inputBuffer = NULL;
return OK;
}
diff --git a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
index 2f919c2..f1f7194 100644
--- a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
+++ b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
@@ -160,7 +160,15 @@
mConfig->outputFrameSize = buffer->size() / sizeof(int16_t);
mConfig->pOutputBuffer = static_cast<int16_t *>(buffer->data());
- CHECK_EQ(pvmp3_framedecoder(mConfig, mDecoderBuf), NO_DECODING_ERROR);
+ if (pvmp3_framedecoder(mConfig, mDecoderBuf) != NO_DECODING_ERROR) {
+ buffer->release();
+ buffer = NULL;
+
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+
+ return UNKNOWN_ERROR;
+ }
buffer->set_range(
0, mConfig->outputFrameSize * sizeof(int16_t));
diff --git a/media/libstagefright/id3/Android.mk b/media/libstagefright/id3/Android.mk
new file mode 100644
index 0000000..3c47e2e
--- /dev/null
+++ b/media/libstagefright/id3/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ ID3.cpp
+
+LOCAL_MODULE := libstagefright_id3
+
+include $(BUILD_STATIC_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ testid3.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libstagefright libutils libbinder
+
+LOCAL_STATIC_LIBRARIES := \
+ libstagefright_id3
+
+LOCAL_MODULE := testid3
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
new file mode 100644
index 0000000..2b3ef1a
--- /dev/null
+++ b/media/libstagefright/id3/ID3.cpp
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ID3"
+#include <utils/Log.h>
+
+#include "../include/ID3.h"
+
+#include <media/stagefright/DataSource.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/Utils.h>
+#include <utils/String8.h>
+
+namespace android {
+
+ID3::ID3(const sp<DataSource> &source)
+ : mIsValid(false),
+ mData(NULL),
+ mSize(0),
+ mFirstFrameOffset(0),
+ mVersion(ID3_UNKNOWN) {
+ mIsValid = parse(source);
+}
+
+ID3::~ID3() {
+ if (mData) {
+ free(mData);
+ mData = NULL;
+ }
+}
+
+bool ID3::isValid() const {
+ return mIsValid;
+}
+
+ID3::Version ID3::version() const {
+ return mVersion;
+}
+
+bool ID3::parse(const sp<DataSource> &source) {
+ struct id3_header {
+ char id[3];
+ uint8_t version_major;
+ uint8_t version_minor;
+ uint8_t flags;
+ uint8_t enc_size[4];
+ };
+
+ id3_header header;
+ if (source->readAt(
+ 0, &header, sizeof(header)) != (ssize_t)sizeof(header)) {
+ return false;
+ }
+
+ if (memcmp(header.id, "ID3", 3)) {
+ return false;
+ }
+
+ if (header.version_major == 0xff || header.version_minor == 0xff) {
+ return false;
+ }
+
+ if (header.version_major == 2) {
+ if (header.flags & 0x3f) {
+ // We only support the 2 high bits, if any of the lower bits are
+ // set, we cannot guarantee to understand the tag format.
+ return false;
+ }
+
+ if (header.flags & 0x40) {
+ // No compression scheme has been decided yet, ignore the
+ // tag if compression is indicated.
+
+ return false;
+ }
+ } else if (header.version_major == 3) {
+ if (header.flags & 0x1f) {
+ // We only support the 3 high bits, if any of the lower bits are
+ // set, we cannot guarantee to understand the tag format.
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ size_t size = 0;
+ for (int32_t i = 0; i < 4; ++i) {
+ if (header.enc_size[i] & 0x80) {
+ return false;
+ }
+
+ size = (size << 7) | header.enc_size[i];
+ }
+
+ mData = (uint8_t *)malloc(size);
+
+ if (mData == NULL) {
+ return false;
+ }
+
+ mSize = size;
+
+ if (source->readAt(sizeof(header), mData, mSize) != (ssize_t)mSize) {
+ return false;
+ }
+
+ if (header.flags & 0x80) {
+ LOGI("removing unsynchronization");
+ removeUnsynchronization();
+ }
+
+ mFirstFrameOffset = 0;
+ if (header.version_major == 3 && (header.flags & 0x40)) {
+ // Version 2.3 has an optional extended header.
+
+ if (mSize < 4) {
+ return false;
+ }
+
+ size_t extendedHeaderSize = U32_AT(&mData[0]) + 4;
+
+ if (extendedHeaderSize > mSize) {
+ return false;
+ }
+
+ mFirstFrameOffset = extendedHeaderSize;
+
+ uint16_t extendedFlags = 0;
+ if (extendedHeaderSize >= 6) {
+ extendedFlags = U16_AT(&mData[4]);
+
+ if (extendedHeaderSize >= 10) {
+ size_t paddingSize = U32_AT(&mData[6]);
+
+ if (mFirstFrameOffset + paddingSize > mSize) {
+ return false;
+ }
+
+ mSize -= paddingSize;
+ }
+
+ if (extendedFlags & 0x8000) {
+ LOGI("have crc");
+ }
+ }
+ }
+
+ if (header.version_major == 2) {
+ mVersion = ID3_V2_2;
+ } else {
+ CHECK_EQ(header.version_major, 3);
+ mVersion = ID3_V2_3;
+ }
+
+ return true;
+}
+
+void ID3::removeUnsynchronization() {
+ for (size_t i = 0; i + 1 < mSize; ++i) {
+ if (mData[i] == 0xff && mData[i + 1] == 0x00) {
+ memmove(&mData[i + 1], &mData[i + 2], mSize - i - 2);
+ --mSize;
+ }
+ }
+}
+
+ID3::Iterator::Iterator(const ID3 &parent, const char *id)
+ : mParent(parent),
+ mID(NULL),
+ mOffset(mParent.mFirstFrameOffset),
+ mFrameData(NULL),
+ mFrameSize(0) {
+ if (id) {
+ mID = strdup(id);
+ }
+
+ findFrame();
+}
+
+ID3::Iterator::~Iterator() {
+ if (mID) {
+ free(mID);
+ mID = NULL;
+ }
+}
+
+bool ID3::Iterator::done() const {
+ return mFrameData == NULL;
+}
+
+void ID3::Iterator::next() {
+ if (mFrameData == NULL) {
+ return;
+ }
+
+ mOffset += mFrameSize;
+
+ findFrame();
+}
+
+void ID3::Iterator::getID(String8 *id) const {
+ id->setTo("");
+
+ if (mFrameData == NULL) {
+ return;
+ }
+
+ if (mParent.mVersion == ID3_V2_2) {
+ id->setTo((const char *)&mParent.mData[mOffset], 3);
+ } else {
+ CHECK_EQ(mParent.mVersion, ID3_V2_3);
+ id->setTo((const char *)&mParent.mData[mOffset], 4);
+ }
+}
+
+static void convertISO8859ToString8(
+ const uint8_t *data, size_t size,
+ String8 *s) {
+ size_t utf8len = 0;
+ for (size_t i = 0; i < size; ++i) {
+ if (data[i] < 0x80) {
+ ++utf8len;
+ } else {
+ utf8len += 2;
+ }
+ }
+
+ if (utf8len == size) {
+ // Only ASCII characters present.
+
+ s->setTo((const char *)data, size);
+ return;
+ }
+
+ char *tmp = new char[utf8len];
+ char *ptr = tmp;
+ for (size_t i = 0; i < size; ++i) {
+ if (data[i] < 0x80) {
+ *ptr++ = data[i];
+ } else if (data[i] < 0xc0) {
+ *ptr++ = 0xc2;
+ *ptr++ = data[i];
+ } else {
+ *ptr++ = 0xc3;
+ *ptr++ = data[i] - 64;
+ }
+ }
+
+ s->setTo(tmp, utf8len);
+
+ delete[] tmp;
+ tmp = NULL;
+}
+
+void ID3::Iterator::getString(String8 *id) const {
+ id->setTo("");
+
+ if (mFrameData == NULL) {
+ return;
+ }
+
+ size_t n = mFrameSize - getHeaderLength() - 1;
+
+ if (*mFrameData == 0x00) {
+ // ISO 8859-1
+ convertISO8859ToString8(mFrameData + 1, n, id);
+ } else {
+ // UCS-2
+ id->setTo((const char16_t *)(mFrameData + 1), n);
+ }
+}
+
+const uint8_t *ID3::Iterator::getData(size_t *length) const {
+ *length = 0;
+
+ if (mFrameData == NULL) {
+ return NULL;
+ }
+
+ *length = mFrameSize - getHeaderLength();
+
+ return mFrameData;
+}
+
+size_t ID3::Iterator::getHeaderLength() const {
+ if (mParent.mVersion == ID3_V2_2) {
+ return 6;
+ } else {
+ CHECK_EQ(mParent.mVersion, ID3_V2_3);
+ return 10;
+ }
+}
+
+void ID3::Iterator::findFrame() {
+ for (;;) {
+ mFrameData = NULL;
+ mFrameSize = 0;
+
+ if (mParent.mVersion == ID3_V2_2) {
+ if (mOffset + 6 > mParent.mSize) {
+ return;
+ }
+
+ if (!memcmp(&mParent.mData[mOffset], "\0\0\0", 3)) {
+ return;
+ }
+
+ mFrameSize =
+ (mParent.mData[mOffset + 3] << 16)
+ | (mParent.mData[mOffset + 4] << 8)
+ | mParent.mData[mOffset + 5];
+
+ mFrameSize += 6;
+
+ if (mOffset + mFrameSize > mParent.mSize) {
+ LOGV("partial frame at offset %d (size = %d, bytes-remaining = %d)",
+ mOffset, mFrameSize, mParent.mSize - mOffset - 6);
+ return;
+ }
+
+ mFrameData = &mParent.mData[mOffset + 6];
+
+ if (!mID) {
+ break;
+ }
+
+ char id[4];
+ memcpy(id, &mParent.mData[mOffset], 3);
+ id[3] = '\0';
+
+ if (!strcmp(id, mID)) {
+ break;
+ }
+ } else {
+ CHECK_EQ(mParent.mVersion, ID3_V2_3);
+
+ if (mOffset + 10 > mParent.mSize) {
+ return;
+ }
+
+ if (!memcmp(&mParent.mData[mOffset], "\0\0\0\0", 4)) {
+ return;
+ }
+
+ mFrameSize = 10 + U32_AT(&mParent.mData[mOffset + 4]);
+
+ if (mOffset + mFrameSize > mParent.mSize) {
+ LOGV("partial frame at offset %d (size = %d, bytes-remaining = %d)",
+ mOffset, mFrameSize, mParent.mSize - mOffset - 10);
+ return;
+ }
+
+ mFrameData = &mParent.mData[mOffset + 10];
+
+ if (!mID) {
+ break;
+ }
+
+ char id[5];
+ memcpy(id, &mParent.mData[mOffset], 4);
+ id[4] = '\0';
+
+ if (!strcmp(id, mID)) {
+ break;
+ }
+ }
+
+ mOffset += mFrameSize;
+ }
+}
+
+static size_t StringSize(const uint8_t *start, uint8_t encoding) {
+ if (encoding== 0x00) {
+ // ISO 8859-1
+ return strlen((const char *)start) + 1;
+ }
+
+ // UCS-2
+ size_t n = 0;
+ while (start[n] != '\0' || start[n + 1] != '\0') {
+ n += 2;
+ }
+
+ return n;
+}
+
+const void *
+ID3::getAlbumArt(size_t *length, String8 *mime) const {
+ *length = 0;
+ mime->setTo("");
+
+ Iterator it(*this, mVersion == ID3_V2_3 ? "APIC" : "PIC");
+
+ while (!it.done()) {
+ size_t size;
+ const uint8_t *data = it.getData(&size);
+
+ if (mVersion == ID3_V2_3) {
+ uint8_t encoding = data[0];
+ mime->setTo((const char *)&data[1]);
+ size_t mimeLen = strlen((const char *)&data[1]) + 1;
+
+ uint8_t picType = data[1 + mimeLen];
+#if 0
+ if (picType != 0x03) {
+ // Front Cover Art
+ it.next();
+ continue;
+ }
+#endif
+
+ size_t descLen = StringSize(&data[2 + mimeLen], encoding);
+
+ *length = size - 2 - mimeLen - descLen;
+
+ return &data[2 + mimeLen + descLen];
+ } else {
+ uint8_t encoding = data[0];
+
+ if (!memcmp(&data[1], "PNG", 3)) {
+ mime->setTo("image/png");
+ } else if (!memcmp(&data[1], "JPG", 3)) {
+ mime->setTo("image/jpeg");
+ } else if (!memcmp(&data[1], "-->", 3)) {
+ mime->setTo("text/plain");
+ } else {
+ return NULL;
+ }
+
+#if 0
+ uint8_t picType = data[4];
+ if (picType != 0x03) {
+ // Front Cover Art
+ it.next();
+ continue;
+ }
+#endif
+
+ size_t descLen = StringSize(&data[5], encoding);
+
+ *length = size - 5 - descLen;
+
+ return &data[5 + descLen];
+ }
+ }
+
+ return NULL;
+}
+
+
+} // namespace android
diff --git a/media/libstagefright/id3/testid3.cpp b/media/libstagefright/id3/testid3.cpp
new file mode 100644
index 0000000..305b065
--- /dev/null
+++ b/media/libstagefright/id3/testid3.cpp
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2010 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 "../include/ID3.h"
+
+#include <ctype.h>
+#include <dirent.h>
+
+#include <binder/ProcessState.h>
+#include <media/stagefright/FileSource.h>
+#include <media/stagefright/MediaDebug.h>
+
+#define MAXPATHLEN 256
+
+using namespace android;
+
+static void hexdump(const void *_data, size_t size) {
+ const uint8_t *data = (const uint8_t *)_data;
+ size_t offset = 0;
+ while (offset < size) {
+ printf("0x%04x ", offset);
+
+ size_t n = size - offset;
+ if (n > 16) {
+ n = 16;
+ }
+
+ for (size_t i = 0; i < 16; ++i) {
+ if (i == 8) {
+ printf(" ");
+ }
+
+ if (offset + i < size) {
+ printf("%02x ", data[offset + i]);
+ } else {
+ printf(" ");
+ }
+ }
+
+ printf(" ");
+
+ for (size_t i = 0; i < n; ++i) {
+ if (isprint(data[offset + i])) {
+ printf("%c", data[offset + i]);
+ } else {
+ printf(".");
+ }
+ }
+
+ printf("\n");
+
+ offset += 16;
+ }
+}
+
+void scanFile(const char *path) {
+ sp<FileSource> file = new FileSource(path);
+ CHECK_EQ(file->initCheck(), OK);
+
+ ID3 tag(file);
+ if (!tag.isValid()) {
+ printf("FAIL %s\n", path);
+ } else {
+ printf("SUCCESS %s\n", path);
+
+ ID3::Iterator it(tag, NULL);
+ while (!it.done()) {
+ String8 id;
+ it.getID(&id);
+
+ CHECK(id.length() > 0);
+ if (id[0] == 'T') {
+ String8 text;
+ it.getString(&text);
+
+ printf(" found text frame '%s': %s\n", id.string(), text.string());
+ } else {
+ printf(" found frame '%s'.\n", id.string());
+ }
+
+ it.next();
+ }
+
+ size_t dataSize;
+ String8 mime;
+ const void *data = tag.getAlbumArt(&dataSize, &mime);
+
+ if (data) {
+ printf("found album art: size=%d mime='%s'\n", dataSize,
+ mime.string());
+
+ hexdump(data, dataSize > 128 ? 128 : dataSize);
+ }
+ }
+}
+
+void scan(const char *path) {
+ DIR *dir = opendir(path);
+
+ if (dir == NULL) {
+ return;
+ }
+
+ rewinddir(dir);
+
+ struct dirent *ent;
+ while ((ent = readdir(dir)) != NULL) {
+ if (!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)) {
+ continue;
+ }
+
+ char newPath[MAXPATHLEN];
+ strcpy(newPath, path);
+ strcat(newPath, "/");
+ strcat(newPath, ent->d_name);
+
+ if (ent->d_type == DT_DIR) {
+ scan(newPath);
+ } else if (ent->d_type == DT_REG) {
+ size_t len = strlen(ent->d_name);
+
+ if (len >= 4
+ && !strcasecmp(ent->d_name + len - 4, ".mp3")) {
+ scanFile(newPath);
+ }
+ }
+ }
+
+ closedir(dir);
+ dir = NULL;
+}
+
+int main(int argc, char **argv) {
+ android::ProcessState::self()->startThreadPool();
+
+ DataSource::RegisterDefaultSniffers();
+
+ for (int i = 1; i < argc; ++i) {
+ scan(argv[i]);
+ }
+
+ return 0;
+}
diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h
new file mode 100644
index 0000000..79931ac
--- /dev/null
+++ b/media/libstagefright/include/ID3.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef ID3_H_
+
+#define ID3_H_
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+struct DataSource;
+struct String8;
+
+struct ID3 {
+ enum Version {
+ ID3_UNKNOWN,
+ ID3_V2_2,
+ ID3_V2_3
+ };
+
+ ID3(const sp<DataSource> &source);
+ ~ID3();
+
+ bool isValid() const;
+
+ Version version() const;
+
+ const void *getAlbumArt(size_t *length, String8 *mime) const;
+
+ struct Iterator {
+ Iterator(const ID3 &parent, const char *id);
+ ~Iterator();
+
+ bool done() const;
+ void getID(String8 *id) const;
+ void getString(String8 *s) const;
+ const uint8_t *getData(size_t *length) const;
+ void next();
+
+ private:
+ const ID3 &mParent;
+ char *mID;
+ size_t mOffset;
+
+ const uint8_t *mFrameData;
+ size_t mFrameSize;
+
+ void findFrame();
+
+ size_t getHeaderLength() const;
+
+ Iterator(const Iterator &);
+ Iterator &operator=(const Iterator &);
+ };
+
+private:
+ bool mIsValid;
+ uint8_t *mData;
+ size_t mSize;
+ size_t mFirstFrameOffset;
+ Version mVersion;
+
+ bool parse(const sp<DataSource> &source);
+ void removeUnsynchronization();
+
+ ID3(const ID3 &);
+ ID3 &operator=(const ID3 &);
+};
+
+} // namespace android
+
+#endif // ID3_H_
+
diff --git a/media/libstagefright/include/M4vH263Decoder.h b/media/libstagefright/include/M4vH263Decoder.h
index 880ec7c..ec49e80 100644
--- a/media/libstagefright/include/M4vH263Decoder.h
+++ b/media/libstagefright/include/M4vH263Decoder.h
@@ -55,6 +55,7 @@
int64_t mNumSamplesOutput;
+ void allocateFrames(int32_t width, int32_t height);
void releaseFrames();
M4vH263Decoder(const M4vH263Decoder &);
diff --git a/media/libstagefright/include/MP3Extractor.h b/media/libstagefright/include/MP3Extractor.h
index b5a6b3c..3ce6df3 100644
--- a/media/libstagefright/include/MP3Extractor.h
+++ b/media/libstagefright/include/MP3Extractor.h
@@ -34,6 +34,8 @@
virtual sp<MediaSource> getTrack(size_t index);
virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
+ virtual sp<MetaData> getMetaData();
+
protected:
virtual ~MP3Extractor();
diff --git a/media/libstagefright/include/StagefrightMetadataRetriever.h b/media/libstagefright/include/StagefrightMetadataRetriever.h
new file mode 100644
index 0000000..b80387f
--- /dev/null
+++ b/media/libstagefright/include/StagefrightMetadataRetriever.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef STAGEFRIGHT_METADATA_RETRIEVER_H_
+
+#define STAGEFRIGHT_METADATA_RETRIEVER_H_
+
+#include <media/MediaMetadataRetrieverInterface.h>
+
+#include <media/stagefright/OMXClient.h>
+#include <utils/KeyedVector.h>
+
+namespace android {
+
+struct DataSource;
+class MediaExtractor;
+
+struct StagefrightMetadataRetriever : public MediaMetadataRetrieverInterface {
+ StagefrightMetadataRetriever();
+ virtual ~StagefrightMetadataRetriever();
+
+ virtual status_t setDataSource(const char *url);
+ virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
+
+ virtual VideoFrame *captureFrame();
+ virtual MediaAlbumArt *extractAlbumArt();
+ virtual const char *extractMetadata(int keyCode);
+
+private:
+ OMXClient mClient;
+ sp<DataSource> mSource;
+ sp<MediaExtractor> mExtractor;
+
+ bool mParsedMetaData;
+ KeyedVector<int, String8> mMetaData;
+ MediaAlbumArt *mAlbumArt;
+
+ void parseMetaData();
+
+ StagefrightMetadataRetriever(const StagefrightMetadataRetriever &);
+
+ StagefrightMetadataRetriever &operator=(
+ const StagefrightMetadataRetriever &);
+};
+
+} // namespace android
+
+#endif // STAGEFRIGHT_METADATA_RETRIEVER_H_
diff --git a/media/libstagefright/omx/tests/Android.mk b/media/libstagefright/omx/tests/Android.mk
index cd654510..ee117e5 100644
--- a/media/libstagefright/omx/tests/Android.mk
+++ b/media/libstagefright/omx/tests/Android.mk
@@ -7,7 +7,7 @@
OMXHarness.cpp \
LOCAL_SHARED_LIBRARIES := \
- libstagefright
+ libstagefright libbinder libmedia libutils
LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE) \
diff --git a/media/libstagefright/string.cpp b/media/libstagefright/string.cpp
index bd6204b..8b2c36c 100644
--- a/media/libstagefright/string.cpp
+++ b/media/libstagefright/string.cpp
@@ -16,6 +16,8 @@
#include "include/stagefright_string.h"
+#include <media/stagefright/MediaDebug.h>
+
namespace android {
// static
@@ -28,8 +30,15 @@
: mString(s, length) {
}
-string::string(const string &from, size_type start, size_type length)
- : mString(from.c_str() + start, length) {
+string::string(const string &from, size_type start, size_type length) {
+ CHECK(start <= from.size());
+ if (length == npos) {
+ length = from.size() - start;
+ } else {
+ CHECK(start + length <= from.size());
+ }
+
+ mString.setTo(from.c_str() + start, length);
}
string::string(const char *s)
diff --git a/media/sdutils/Android.mk b/media/sdutils/Android.mk
index dafb8a6..74e1eca 100644
--- a/media/sdutils/Android.mk
+++ b/media/sdutils/Android.mk
@@ -6,7 +6,7 @@
LOCAL_SRC_FILES:= \
sdutil.cpp \
-LOCAL_SHARED_LIBRARIES := libhardware_legacy libcutils libutils libc
+LOCAL_SHARED_LIBRARIES := libhardware_legacy libbinder libcutils libutils libc
LOCAL_MODULE:= sdutil
LOCAL_MODULE_TAGS := debug
diff --git a/media/sdutils/sdutil.cpp b/media/sdutils/sdutil.cpp
index fe11878..c77424f 100644
--- a/media/sdutils/sdutil.cpp
+++ b/media/sdutils/sdutil.cpp
@@ -99,6 +99,42 @@
return -1;
}
+static int asec_create(const char *id, int sizeMb, const char *fstype,
+ const char *key, int ownerUid) {
+ String16 sId(id);
+ String16 sFstype(fstype);
+ String16 sKey(key);
+
+ String16 r = gMountService->createSecureContainer(sId, sizeMb, sFstype,
+ sKey, ownerUid);
+ return 0;
+}
+
+static int asec_finalize(const char *id) {
+ String16 sId(id);
+ gMountService->finalizeSecureContainer(sId);
+ return 0;
+}
+
+static int asec_destroy(const char *id) {
+ String16 sId(id);
+ gMountService->destroySecureContainer(sId);
+ return 0;
+}
+
+static int asec_mount(const char *id, const char *key, int ownerUid) {
+ String16 sId(id);
+ String16 sKey(key);
+ gMountService->mountSecureContainer(sId, sKey, ownerUid);
+ return 0;
+}
+
+static int asec_path(const char *id) {
+ String16 sId(id);
+ gMountService->getSecureContainerPath(sId);
+ return 0;
+}
+
static int unmount(const char* path) {
String16 string(path);
gMountService->unmountMedia(string);
@@ -153,14 +189,42 @@
android::init();
return android::umsEnable(false);
}
+ } else if (!strcmp(command, "asec")) {
+ const char* id = (argc > 3 ? argv[3] : NULL);
+
+ if (!id)
+ goto usage;
+
+ android::init();
+ if (!strcmp(argument, "create")) {
+
+ if (argc != 8)
+ goto usage;
+ return android::asec_create(id, atoi(argv[4]), argv[5], argv[6],
+ atoi(argv[7]));
+ } else if (!strcmp(argument, "finalize")) {
+ return android::asec_finalize(id);
+ } else if (!strcmp(argument, "destroy")) {
+ return android::asec_destroy(id);
+ } else if (!strcmp(argument, "mount")) {
+ return android::asec_mount(id, argv[4], atoi(argv[5]));
+ } else if (!strcmp(argument, "path")) {
+ return android::asec_path(id);
+ }
}
+usage:
fprintf(stderr, "usage:\n"
" sdutil mount <mount path> - mounts the SD card at the given mount point\n"
" sdutil unmount <mount path> - unmounts the SD card at the given mount point\n"
" sdutil format <mount path> - formats the SD card at the given mount point\n"
" sdutil ums enable - enables USB mass storage\n"
- " sdutil ums disable - disnables USB mass storage\n"
+ " sdutil ums disable - disables USB mass storage\n"
+ " sdutil asec create <id> <sizeMb> <fstype> <key> <ownerUid>\n"
+ " sdutil asec finalize <id>\n"
+ " sdutil asec destroy <id>\n"
+ " sdutil asec mount <id> <key> <ownerUid>\n"
+ " sdutil asec path <id>\n"
);
return -1;
}
diff --git a/media/tests/MediaFrameworkTest/res/layout/movie_view.xml b/media/tests/MediaFrameworkTest/res/layout/movie_view.xml
index 35fedfa..cfd86bb 100644
--- a/media/tests/MediaFrameworkTest/res/layout/movie_view.xml
+++ b/media/tests/MediaFrameworkTest/res/layout/movie_view.xml
@@ -15,12 +15,12 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1">
@@ -32,12 +32,12 @@
</FrameLayout>
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText android:id="@+id/url"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:singleLine="true"
diff --git a/media/tests/MediaFrameworkTest/res/layout/surface_view.xml b/media/tests/MediaFrameworkTest/res/layout/surface_view.xml
index cbd1ff8..a72c283 100644
--- a/media/tests/MediaFrameworkTest/res/layout/surface_view.xml
+++ b/media/tests/MediaFrameworkTest/res/layout/surface_view.xml
@@ -15,18 +15,18 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surface_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:layout_centerInParent="true"
/>
diff --git a/media/tests/SoundPoolTest/Android.mk b/media/tests/SoundPoolTest/Android.mk
new file mode 100644
index 0000000..7f947c0
--- /dev/null
+++ b/media/tests/SoundPoolTest/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := SoundPoolTest
+
+include $(BUILD_PACKAGE)
diff --git a/media/tests/SoundPoolTest/AndroidManifest.xml b/media/tests/SoundPoolTest/AndroidManifest.xml
new file mode 100644
index 0000000..126276c
--- /dev/null
+++ b/media/tests/SoundPoolTest/AndroidManifest.xml
@@ -0,0 +1,11 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+package="com.android.soundpooltest">
+ <application>
+ <activity android:name="SoundPoolTest" android:label="Sound Pool Test">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/media/tests/SoundPoolTest/res/raw/organ441.ogg b/media/tests/SoundPoolTest/res/raw/organ441.ogg
new file mode 100644
index 0000000..130cb37
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/organ441.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/sine441.ogg b/media/tests/SoundPoolTest/res/raw/sine441.ogg
new file mode 100644
index 0000000..cdf1eaa
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/sine441.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/test1.mp3 b/media/tests/SoundPoolTest/res/raw/test1.mp3
new file mode 100644
index 0000000..c1b2fdf
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/test1.mp3
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/test2.ogg b/media/tests/SoundPoolTest/res/raw/test2.ogg
new file mode 100644
index 0000000..396d78f
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/test2.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/test3.ogg b/media/tests/SoundPoolTest/res/raw/test3.ogg
new file mode 100644
index 0000000..c56f68b
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/test3.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/test4.ogg b/media/tests/SoundPoolTest/res/raw/test4.ogg
new file mode 100644
index 0000000..d3cbdfc
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/test4.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/res/raw/test5.ogg b/media/tests/SoundPoolTest/res/raw/test5.ogg
new file mode 100644
index 0000000..1c6851d
--- /dev/null
+++ b/media/tests/SoundPoolTest/res/raw/test5.ogg
Binary files differ
diff --git a/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java b/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java
new file mode 100644
index 0000000..6b3093f
--- /dev/null
+++ b/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 2009, Google Inc.
+ *
+ * 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.soundpooltest;
+
+import android.app.Activity;
+import android.widget.LinearLayout;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.KeyEvent;
+import android.media.AudioSystem;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.media.SoundPool.OnLoadCompleteListener;
+import android.util.Config;
+import android.util.Log;
+import java.util.HashMap;
+import java.lang.Math;
+
+import com.android.soundpooltest.R;
+
+public class SoundPoolTest extends Activity
+{
+ private static final String LOG_TAG = "SoundPoolTest";
+ private static final boolean DEBUG = true;
+ private static final boolean VERBOSE = false;
+ private TestThread mThread;
+
+ private static final int[] mTestFiles = new int[] {
+ // FIXME: Restore when Stagefright bug is fixed
+ R.raw.organ441,
+ R.raw.sine441,
+ //R.raw.test1,
+ R.raw.test2,
+ R.raw.test3,
+ R.raw.test4,
+ R.raw.test5
+ };
+
+ private final static int MAX_STREAMS = 1;
+ private final static float SEMITONE = 1.059463094f;
+ private final static float DEFAULT_VOLUME = 0.707f;
+ private final static float MAX_VOLUME = 1.0f;
+ private final static float MIN_VOLUME = 0.01f;
+ private final static int LOW_PRIORITY = 1000;
+ private final static int NORMAL_PRIORITY = 2000;
+ private final static int HIGH_PRIORITY = 3000;
+ private final static int DEFAULT_LOOP = -1;
+ private final static int DEFAULT_SRC_QUALITY = 0;
+ private final static double PI_OVER_2 = Math.PI / 2.0;
+
+ public SoundPoolTest() {}
+
+ private final class TestThread extends java.lang.Thread {
+ private boolean mRunning;
+ private SoundPool mSoundPool = null;
+ private int mLastSample;
+ private int mLoadStatus;
+ private int[] mSounds;
+ private float mScale[];
+
+ TestThread() {
+ super("SoundPool.TestThread");
+ }
+
+ private final class LoadCompleteCallback implements
+ android.media.SoundPool.OnLoadCompleteListener {
+ public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
+ synchronized(mSoundPool) {
+ if (DEBUG) Log.d(LOG_TAG, "Sample " + sampleId + " load status = " + status);
+ if (status != 0) {
+ mLoadStatus = status;
+ }
+ if (sampleId == mLastSample) {
+ mSoundPool.notify();
+ }
+ }
+ }
+ }
+
+ private int loadSound(int resId, int priority) {
+ int id = mSoundPool.load(getApplicationContext(), resId, priority);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Unable to open resource");
+ }
+ return id;
+ }
+
+ private int initSoundPool() throws java.lang.InterruptedException {
+
+ if (mSoundPool != null) {
+ if (mLoadStatus == 0) return mLoadStatus;
+ mSoundPool.release();
+ mSoundPool = null;
+ }
+
+ // create sound pool
+ mLoadStatus = 0;
+ mSoundPool = new SoundPool(MAX_STREAMS, AudioSystem.STREAM_MUSIC, 0);
+ mSoundPool.setOnLoadCompleteListener(new LoadCompleteCallback());
+ int numSounds = mTestFiles.length;
+ mSounds = new int[numSounds];
+
+ // load sounds
+ synchronized(mSoundPool) {
+ for (int index = 0; index < numSounds; index++) {
+ mSounds[index] = loadSound(mTestFiles[index], NORMAL_PRIORITY);
+ mLastSample = mSounds[index];
+ }
+ mSoundPool.wait();
+ }
+ return mLoadStatus;
+ }
+
+ private boolean TestSounds() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin sounds test");
+ int count = mSounds.length;
+ for (int index = 0; index < count; index++) {
+ int id = mSoundPool.play(mSounds[index], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + id);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Error occurred starting note");
+ return false;
+ }
+ sleep(450);
+ mSoundPool.stop(id);
+ if (DEBUG) Log.d(LOG_TAG, "Stop note " + id);
+ sleep(50);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "End scale test");
+ return true;
+ }
+
+ private boolean TestScales() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin scale test");
+
+ // interate through pitch table
+ int count = mScale.length;
+ for (int step = 0; step < count; step++) {
+ int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ NORMAL_PRIORITY, DEFAULT_LOOP, mScale[step]);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + id);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Error occurred starting note");
+ return false;
+ }
+ sleep(450);
+ mSoundPool.stop(id);
+ if (DEBUG) Log.d(LOG_TAG, "Stop note " + id);
+ sleep(50);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "End sounds test");
+ return true;
+ }
+
+ private boolean TestRates() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin rate test");
+
+ // start the note
+ int count = mScale.length;
+ int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ NORMAL_PRIORITY, DEFAULT_LOOP, mScale[0]);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + id);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Test failed - exiting");
+ return false;
+ }
+
+ // modify the pitch
+ for (int step = 1; step < count; step++) {
+ sleep(250);
+ mSoundPool.setRate(id, mScale[step]);
+ if (DEBUG) Log.d(LOG_TAG, "Change rate " + mScale[step]);
+ }
+ mSoundPool.stop(id);
+ if (DEBUG) Log.d(LOG_TAG, "End rate test");
+ return true;
+ }
+
+ private boolean TestPriority() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin priority test");
+ boolean result = true;
+
+ // play a normal priority looping sound
+ int normalId = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + normalId);
+ if (normalId == 0) {
+ Log.e(LOG_TAG, "Error occurred starting note");
+ return false;
+ }
+ sleep(250);
+
+ // play a low priority sound
+ int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ LOW_PRIORITY, DEFAULT_LOOP, 1.0f);
+ if (id > 0) {
+ Log.e(LOG_TAG, "Normal > Low priority test failed");
+ result = false;
+ mSoundPool.stop(id);
+ } else {
+ Log.e(LOG_TAG, "Normal > Low priority test passed");
+ }
+ sleep(250);
+
+ // play a high priority sound
+ id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ HIGH_PRIORITY, DEFAULT_LOOP, 1.0f);
+ if (id == 0) {
+ Log.e(LOG_TAG, "High > Normal priority test failed");
+ result = false;
+ } else {
+ Log.e(LOG_TAG, "High > Normal priority test passed");
+ }
+ sleep(250);
+ mSoundPool.stop(id);
+
+ // stop normal note
+ mSoundPool.stop(normalId);
+
+ if (DEBUG) Log.d(LOG_TAG, "End priority test");
+ return result;
+ }
+
+ private boolean TestPauseResume() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin pause/resume test");
+ boolean result = true;
+
+ // play a normal priority looping sound
+ int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME,
+ NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + id);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Error occurred starting note");
+ return false;
+ }
+ sleep(250);
+
+ // pause and resume sound a few times
+ for (int count = 0; count < 5; count++) {
+ mSoundPool.pause(id);
+ sleep(250);
+ mSoundPool.resume(id);
+ sleep(250);
+ }
+
+ mSoundPool.stop(id);
+
+ if (DEBUG) Log.d(LOG_TAG, "End pause/resume test");
+ return result;
+ }
+
+ private boolean TestVolume() throws java.lang.InterruptedException {
+ if (DEBUG) Log.d(LOG_TAG, "Begin volume test");
+
+ // start the note
+ int id = mSoundPool.play(mSounds[0], 0.0f, 1.0f, NORMAL_PRIORITY, DEFAULT_LOOP, mScale[0]);
+ if (DEBUG) Log.d(LOG_TAG, "Start note " + id);
+ if (id == 0) {
+ Log.e(LOG_TAG, "Test failed - exiting");
+ return false;
+ }
+
+ // pan from left to right
+ for (int count = 0; count < 101; count++) {
+ sleep(20);
+ double radians = PI_OVER_2 * count / 100.0;
+ float leftVolume = (float) Math.sin(radians);
+ float rightVolume = (float) Math.cos(radians);
+ mSoundPool.setVolume(id, leftVolume, rightVolume);
+ if (DEBUG) Log.d(LOG_TAG, "Change volume (" + leftVolume + "," + rightVolume + ")");
+ }
+
+ mSoundPool.stop(id);
+ if (DEBUG) Log.d(LOG_TAG, "End volume test");
+ return true;
+ }
+
+ public void run() {
+ if (DEBUG) Log.d(LOG_TAG, "Test thread running");
+
+ // initialize
+ mRunning = true;
+ int failures = 0;
+
+ // initialize pitch table
+ float pitch = 0.5f;
+ mScale = new float[13];
+ for (int i = 0; i < 13; ++i) {
+ mScale[i] = pitch;
+ pitch *= SEMITONE;
+ }
+
+ try {
+
+ // load sound pool
+ initSoundPool();
+
+ // do tests
+ if (!TestSounds()) failures = failures + 1;
+ if (!TestScales()) failures = failures + 1;
+ if (!TestRates()) failures = failures + 1;
+ if (!TestPriority()) failures = failures + 1;
+ if (!TestPauseResume()) failures = failures + 1;
+ if (!TestVolume()) failures = failures + 1;
+
+ } catch (java.lang.InterruptedException e) {
+ if (DEBUG) Log.d(LOG_TAG, "Test interrupted");
+ failures = failures + 1;
+ } finally {
+ mRunning = false;
+ }
+
+ // release sound pool
+ if (mSoundPool != null) {
+ mSoundPool.release();
+ mSoundPool = null;
+ }
+
+ // output stats
+ if (DEBUG) Log.d(LOG_TAG, "Test thread exit");
+ if (failures == 0) {
+ Log.i(LOG_TAG, "All tests passed");
+ } else {
+ Log.i(LOG_TAG, failures + " tests failed");
+ }
+ }
+
+ public void quit() {
+ if (DEBUG) Log.d(LOG_TAG, "interrupt");
+ interrupt();
+ while (mRunning) {
+ try {
+ sleep(20);
+ } catch (java.lang.InterruptedException e) { }
+ }
+ if (DEBUG) Log.d(LOG_TAG, "quit");
+ }
+ }
+
+ private void startTests() {
+ mThread = new TestThread();
+ mThread.start();
+ }
+
+ protected void onPause()
+ {
+ Log.v(LOG_TAG, "onPause");
+ super.onPause();
+ mThread.quit();
+ mThread = null;
+ }
+
+ protected void onResume()
+ {
+ Log.v(LOG_TAG, "onResume");
+ super.onResume();
+ startTests();
+ }
+
+ public void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ }
+}
+
diff --git a/media/tests/omxjpegdecoder/Android.mk b/media/tests/omxjpegdecoder/Android.mk
new file mode 100644
index 0000000..f679f19
--- /dev/null
+++ b/media/tests/omxjpegdecoder/Android.mk
@@ -0,0 +1,57 @@
+# 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.
+ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ omx_jpeg_decoder.cpp \
+ jpeg_decoder_bench.cpp \
+ SkOmxPixelRef.cpp \
+ StreamSource.cpp
+
+
+# add external/skia/src/images/SkImageDecoder_libjpeg.cpp
+LOCAL_SRC_FILES += \
+ ../../../../../external/skia/src/images/SkImageDecoder_libjpeg.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libskia \
+ libstagefright \
+ libbinder \
+ libutils
+
+LOCAL_C_INCLUDES := \
+ $(JNI_H_INCLUDE) \
+ $(TOP)/external/jpeg \
+ $(TOP)/external/skia/include/config \
+ $(TOP)/external/skia/include/core \
+ $(TOP)/external/skia/include/images \
+ $(TOP)/external/skia/include/utils \
+ $(TOP)/external/skia/include/effects \
+ $(TOP)/frameworks/base/media/libstagefright \
+ $(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include \
+ $(TOP)/frameworks/base/include/ \
+ $(TOP)/frameworks/base/
+
+LOCAL_MODULE := jpeg_bench
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_EXECUTABLE)
+
+endif
diff --git a/media/tests/omxjpegdecoder/SkOmxPixelRef.cpp b/media/tests/omxjpegdecoder/SkOmxPixelRef.cpp
new file mode 100644
index 0000000..dfdf676
--- /dev/null
+++ b/media/tests/omxjpegdecoder/SkOmxPixelRef.cpp
@@ -0,0 +1,46 @@
+/*
+ * 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 <media/stagefright/MediaDebug.h>
+#include <SkBitmap.h>
+
+#include "SkOmxPixelRef.h"
+
+using namespace android;
+
+SkOmxPixelRef::SkOmxPixelRef(SkColorTable* ctable, MediaBuffer* buffer,
+ sp<MediaSource> decoder) {
+ mBuffer = buffer;
+ mDecoder = decoder;
+ mSize = buffer->size();
+ mCTable = ctable;
+ SkSafeRef(mCTable);
+}
+
+SkOmxPixelRef::~SkOmxPixelRef() {
+ mBuffer->release();
+ CHECK_EQ(mDecoder->stop(), OK);
+ SkSafeUnref(mCTable);
+}
+
+void* SkOmxPixelRef::onLockPixels(SkColorTable** ct) {
+ *ct = mCTable;
+ return mBuffer->data();
+}
+
+void SkOmxPixelRef::onUnlockPixels() {
+ // nothing to do
+}
diff --git a/media/tests/omxjpegdecoder/SkOmxPixelRef.h b/media/tests/omxjpegdecoder/SkOmxPixelRef.h
new file mode 100644
index 0000000..afedcbd
--- /dev/null
+++ b/media/tests/omxjpegdecoder/SkOmxPixelRef.h
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+#ifndef SKOMXPIXELREF_DEFINED
+#define SKOMXPIXELREF_DEFINED
+
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/OMXClient.h>
+#include <media/stagefright/OMXCodec.h>
+#include <SkPixelRef.h>
+
+namespace android {
+
+class SkOmxPixelRef : public SkPixelRef {
+public:
+ SkOmxPixelRef(SkColorTable* ctable, MediaBuffer* buffer,
+ sp<MediaSource> decoder);
+ virtual ~SkOmxPixelRef();
+
+ //! Return the allocation size for the pixels
+ size_t getSize() const { return mSize; }
+
+protected:
+ // overrides from SkPixelRef
+ virtual void* onLockPixels(SkColorTable**);
+ virtual void onUnlockPixels();
+
+private:
+ MediaBuffer* mBuffer;
+ sp<MediaSource> mDecoder;
+ size_t mSize;
+ SkColorTable* mCTable;
+
+ typedef SkPixelRef INHERITED;
+};
+
+} // namespace android
+#endif // SKOMXPIXELREF_DEFINED
diff --git a/media/tests/omxjpegdecoder/StreamSource.cpp b/media/tests/omxjpegdecoder/StreamSource.cpp
new file mode 100644
index 0000000..76aa85b
--- /dev/null
+++ b/media/tests/omxjpegdecoder/StreamSource.cpp
@@ -0,0 +1,53 @@
+/*
+ * 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 <media/stagefright/MediaDebug.h>
+
+#include "StreamSource.h"
+
+namespace android {
+
+StreamSource::StreamSource(SkStream *stream)
+ : mStream(stream) {
+ CHECK(stream != NULL);
+ mSize = stream->getLength();
+}
+
+StreamSource::~StreamSource() {
+ delete mStream;
+ mStream = NULL;
+}
+
+status_t StreamSource::initCheck() const {
+ return mStream != NULL ? OK : NO_INIT;
+}
+
+ssize_t StreamSource::readAt(off_t offset, void *data, size_t size) {
+ Mutex::Autolock autoLock(mLock);
+
+ mStream->rewind();
+ mStream->skip(offset);
+ ssize_t result = mStream->read(data, size);
+
+ return result;
+}
+
+status_t StreamSource::getSize(off_t *size) {
+ *size = mSize;
+ return OK;
+}
+
+} // namespace android
diff --git a/media/tests/omxjpegdecoder/StreamSource.h b/media/tests/omxjpegdecoder/StreamSource.h
new file mode 100644
index 0000000..c1ed5bf
--- /dev/null
+++ b/media/tests/omxjpegdecoder/StreamSource.h
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#ifndef STREAM_SOURCE_H_
+
+#define STREAM_SOURCE_H_
+
+#include <stdio.h>
+
+#include <core/SkStream.h>
+#include <media/stagefright/DataSource.h>
+#include <media/stagefright/MediaErrors.h>
+#include <utils/threads.h>
+
+namespace android {
+
+class StreamSource : public DataSource {
+public:
+ // Pass the ownership of SkStream to StreamSource.
+ StreamSource(SkStream *SkStream);
+ virtual status_t initCheck() const;
+ virtual ssize_t readAt(off_t offset, void *data, size_t size);
+ virtual status_t getSize(off_t *size);
+
+protected:
+ virtual ~StreamSource();
+
+private:
+ SkStream *mStream;
+ size_t mSize;
+ Mutex mLock;
+
+ StreamSource(const StreamSource &);
+ StreamSource &operator=(const StreamSource &);
+};
+
+} // namespace android
+
+#endif // STREAM_SOURCE_H_
diff --git a/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp b/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp
new file mode 100644
index 0000000..2d05a49
--- /dev/null
+++ b/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "OmxJpegDecoder"
+#include <sys/time.h>
+#include <utils/Log.h>
+
+#include <binder/ProcessState.h>
+
+#include "SkBitmap.h"
+#include "SkImageDecoder.h"
+#include "SkStream.h"
+#include "omx_jpeg_decoder.h"
+
+class SkJPEGImageDecoder : public SkImageDecoder {
+public:
+ virtual Format getFormat() const {
+ return kJPEG_Format;
+ }
+
+protected:
+ virtual bool onDecode(SkStream* stream, SkBitmap* bm,
+ SkBitmap::Config pref, Mode);
+};
+
+int nullObjectReturn(const char msg[]) {
+ if (msg) {
+ SkDebugf("--- %s\n", msg);
+ }
+ return -1;
+}
+
+static int64_t getNowUs() {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+
+ return tv.tv_usec + (int64_t) tv.tv_sec * 1000000;
+}
+
+int testDecodeBounds(SkImageDecoder* decoder, SkStream* stream,
+ SkBitmap* bitmap) {
+ int64_t startTime = getNowUs();
+ SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config;
+ SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodeBounds_Mode;
+
+ // Decode the input stream and then use the bitmap.
+ if (!decoder->decode(stream, bitmap, prefConfig, decodeMode)) {
+ return nullObjectReturn("decoder->decode returned false");
+ } else {
+ int64_t delay = getNowUs() - startTime;
+ printf("WidthxHeight: %dx%d\n", bitmap->width(), bitmap->height());
+ printf("Decoding Time in BoundsMode %.1f msec.\n", delay / 1000.0f);
+ return 0;
+ }
+}
+
+int testDecodePixels(SkImageDecoder* decoder, SkStream* stream,
+ SkBitmap* bitmap) {
+ int64_t startTime = getNowUs();
+ SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config;
+ SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodePixels_Mode;
+
+ // Decode the input stream and then use the bitmap.
+ if (!decoder->decode(stream, bitmap, prefConfig, decodeMode)) {
+ return nullObjectReturn("decoder->decode returned false");
+ } else {
+ int64_t delay = getNowUs() - startTime;
+ printf("Decoding Time in PixelsMode %.1f msec.\n", delay / 1000.0f);
+ const char* filename = "/sdcard/omxJpegDecodedBitmap.rgba";
+ return storeBitmapToFile(bitmap, filename);
+ }
+}
+
+int testDecoder(SkImageDecoder* decoder, char* filename) {
+ // test DecodeMode == Pixels
+ SkStream* stream = new SkFILEStream(filename);
+ SkBitmap* bitmap = new SkBitmap;
+ testDecodePixels(decoder, stream, bitmap);
+ delete bitmap;
+
+ // test DecodeMode == Bounds
+ stream = new SkFILEStream(filename);
+ bitmap = new SkBitmap;
+ testDecodeBounds(decoder, stream, bitmap);
+ delete bitmap;
+
+ delete decoder;
+ return 0;
+}
+
+int main(int argc, char** argv) {
+ android::ProcessState::self()->startThreadPool();
+
+ printf("Decoding jpeg with libjpeg...\n");
+ SkJPEGImageDecoder* libjpeg = new SkJPEGImageDecoder;
+ testDecoder(libjpeg, argv[1]);
+
+ printf("\nDecoding jpeg with OMX...\n");
+ OmxJpegImageDecoder* omx = new OmxJpegImageDecoder;
+ testDecoder(omx, argv[1]);
+ return 0;
+}
diff --git a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
new file mode 100644
index 0000000..f229f9d
--- /dev/null
+++ b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
@@ -0,0 +1,197 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "OmxJpegDecoder"
+#include <sys/time.h>
+#include <utils/Log.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <media/IMediaPlayerService.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/OMXClient.h>
+#include <media/stagefright/OMXCodec.h>
+#include <SkMallocPixelRef.h>
+
+#include "omx_jpeg_decoder.h"
+#include "SkOmxPixelRef.h"
+#include "StreamSource.h"
+
+using namespace android;
+
+static void getJpegOutput(MediaBuffer* buffer, const char* filename) {
+ int size = buffer->range_length();
+ int offset = buffer->range_offset();
+ FILE *pFile = fopen(filename, "w+");
+
+ if (pFile == NULL) {
+ printf("Error: cannot open %s.\n", filename);
+ } else {
+ char* data = (char*) buffer->data();
+ data += offset;
+ while (size > 0) {
+ int numChars = fwrite(data, sizeof(char), 1024, pFile);
+ int numBytes = numChars * sizeof(char);
+ size -= numBytes;
+ data += numBytes;
+ }
+ fclose(pFile);
+ }
+ return;
+}
+
+extern int storeBitmapToFile(SkBitmap* bitmap, const char* filename) {
+ bitmap->lockPixels();
+ uint8_t* data = (uint8_t *)bitmap->getPixels();
+ int size = bitmap->getSize();
+ FILE* fp = fopen(filename, "w+");
+
+ if (NULL == fp) {
+ printf("Cannot open the output file! \n");
+ return -1;
+ } else {
+ while (size > 0) {
+ int numChars = fwrite(data, sizeof(char), 1024, fp);
+ int numBytes = numChars * sizeof(char);
+ size -= numBytes;
+ data += numBytes;
+ }
+ fclose(fp);
+ }
+ return 0;
+}
+
+static int64_t getNowUs() {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+
+ return (int64_t)tv.tv_usec + tv.tv_sec * 1000000;
+}
+
+OmxJpegImageDecoder::OmxJpegImageDecoder() {
+ status_t err = mClient.connect();
+ CHECK_EQ(err, OK);
+}
+
+OmxJpegImageDecoder::~OmxJpegImageDecoder() {
+ mClient.disconnect();
+}
+
+bool OmxJpegImageDecoder::onDecode(SkStream* stream,
+ SkBitmap* bm, SkBitmap::Config pref, Mode mode) {
+ sp<MediaSource> source = prepareMediaSource(stream);
+ sp<MetaData> meta = source->getFormat();
+ int width;
+ int height;
+ meta->findInt32(kKeyWidth, &width);
+ meta->findInt32(kKeyHeight, &height);
+ configBitmapSize(bm, pref, width, height);
+
+ // mode == DecodeBounds
+ if (mode == SkImageDecoder::kDecodeBounds_Mode) {
+ return true;
+ }
+
+ // mode == DecodePixels
+ if (!this->allocPixelRef(bm, NULL)) {
+ LOGI("Cannot allocPixelRef()!");
+ return false;
+ }
+
+ sp<MediaSource> decoder = getDecoder(&mClient, source);
+ return decodeSource(decoder, source, bm);
+}
+
+JPEGSource* OmxJpegImageDecoder::prepareMediaSource(SkStream* stream) {
+ DataSource::RegisterDefaultSniffers();
+ sp<DataSource> dataSource = new StreamSource(stream);
+ return new JPEGSource(dataSource);
+}
+
+sp<MediaSource> OmxJpegImageDecoder::getDecoder(
+ OMXClient *client, const sp<MediaSource>& source) {
+ sp<MetaData> meta = source->getFormat();
+ sp<MediaSource> decoder = OMXCodec::Create(
+ client->interface(), meta, false /* createEncoder */, source);
+
+ CHECK(decoder != NULL);
+ return decoder;
+}
+
+bool OmxJpegImageDecoder::decodeSource(sp<MediaSource> decoder,
+ const sp<MediaSource>& source, SkBitmap* bm) {
+ status_t rt = decoder->start();
+ if (rt != OK) {
+ LOGE("Cannot start OMX Decoder!");
+ return false;
+ }
+ int64_t startTime = getNowUs();
+ MediaBuffer *buffer;
+
+ // decode source
+ status_t err = decoder->read(&buffer, NULL);
+ int64_t duration = getNowUs() - startTime;
+
+ if (err != OK) {
+ CHECK_EQ(buffer, NULL);
+ }
+ printf("Duration in decoder->read(): %.1f (msecs). \n",
+ duration / 1E3 );
+
+ /* Mark the code for now, since we attend to copy buffer to SkBitmap.
+ // Install pixelRef to Bitmap.
+ installPixelRef(buffer, decoder, bm);*/
+
+ // Copy pixels from buffer to bm.
+ // May need to check buffer->rawBytes() == bm->rawBytes().
+ CHECK_EQ(buffer->size(), bm->getSize());
+ memcpy(bm->getPixels(), buffer->data(), buffer->size());
+ buffer->release();
+ decoder->stop();
+
+ return true;
+}
+
+void OmxJpegImageDecoder::installPixelRef(MediaBuffer *buffer, sp<MediaSource> decoder,
+ SkBitmap* bm) {
+
+ // set bm's pixelref based on the data in buffer.
+ SkAutoLockPixels alp(*bm);
+ SkPixelRef* pr = new SkOmxPixelRef(NULL, buffer, decoder);
+ bm->setPixelRef(pr)->unref();
+ bm->lockPixels();
+ return;
+}
+
+void OmxJpegImageDecoder::configBitmapSize(SkBitmap* bm, SkBitmap::Config pref,
+ int width, int height) {
+ bm->setConfig(getColorSpaceConfig(pref), width, height);
+ bm->setIsOpaque(true);
+}
+
+SkBitmap::Config OmxJpegImageDecoder::getColorSpaceConfig(
+ SkBitmap::Config pref) {
+
+ // Set the color space to ARGB_8888 for now
+ // because of limitation in hardware support.
+ return SkBitmap::kARGB_8888_Config;
+}
diff --git a/media/tests/omxjpegdecoder/omx_jpeg_decoder.h b/media/tests/omxjpegdecoder/omx_jpeg_decoder.h
new file mode 100644
index 0000000..7d8bac09c
--- /dev/null
+++ b/media/tests/omxjpegdecoder/omx_jpeg_decoder.h
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+#ifndef OMXJPEGIMAGEDECODER
+#define OMXJPEGIMAGEDECODER
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <media/stagefright/JPEGSource.h>
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/OMXClient.h>
+#include <media/stagefright/OMXCodec.h>
+#include <SkImageDecoder.h>
+#include <SkStream.h>
+
+using namespace android;
+
+extern int storeBitmapToFile(SkBitmap* bitmap, const char* filename);
+
+class OmxJpegImageDecoder : public SkImageDecoder {
+public:
+ OmxJpegImageDecoder();
+ ~OmxJpegImageDecoder();
+
+ virtual Format getFormat() const {
+ return kJPEG_Format;
+ }
+
+protected:
+ virtual bool onDecode(SkStream* stream, SkBitmap* bm,
+ SkBitmap::Config pref, Mode mode);
+
+private:
+ JPEGSource* prepareMediaSource(SkStream* stream);
+ sp<MediaSource> getDecoder(OMXClient* client, const sp<MediaSource>& source);
+ bool decodeSource(sp<MediaSource> decoder, const sp<MediaSource>& source,
+ SkBitmap* bm);
+ void installPixelRef(MediaBuffer* buffer, sp<MediaSource> decoder,
+ SkBitmap* bm);
+ void configBitmapSize(SkBitmap* bm, SkBitmap::Config pref, int width,
+ int height);
+ SkBitmap::Config getColorSpaceConfig(SkBitmap::Config pref);
+
+ OMXClient mClient;
+};
+
+#endif
diff --git a/media/tests/players/Android.mk b/media/tests/players/Android.mk
index eb50a51..10367cf 100644
--- a/media/tests/players/Android.mk
+++ b/media/tests/players/Android.mk
@@ -23,7 +23,7 @@
libutils
LOCAL_MODULE:= invoke_mock_media_player
-LOCAL_MODULE_TAGS := test eng
+LOCAL_MODULE_TAGS := tests eng
LOCAL_PRELINK_MODULE:= false
include $(BUILD_SHARED_LIBRARY)
diff --git a/opengl/include/ETC1/etc1.h b/opengl/include/ETC1/etc1.h
new file mode 100644
index 0000000..0d38905
--- /dev/null
+++ b/opengl/include/ETC1/etc1.h
@@ -0,0 +1,106 @@
+// Copyright 2009 Google Inc.
+//
+// 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.
+
+#ifndef __etc1_h__
+#define __etc1_h__
+
+#define ETC1_ENCODED_BLOCK_SIZE 8
+#define ETC1_DECODED_BLOCK_SIZE 48
+
+#ifndef ETC1_RGB8_OES
+#define ETC1_RGB8_OES 0x8D64
+#endif
+
+typedef unsigned char etc1_byte;
+typedef int etc1_bool;
+typedef unsigned int etc1_uint32;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Encode a block of pixels.
+//
+// pIn is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
+// 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+// value of pixel (x, y).
+//
+// validPixelMask is a 16-bit mask where bit (1 << (x + y * 4)) indicates whether
+// the corresponding (x,y) pixel is valid. Invalid pixel color values are ignored when compressing.
+//
+// pOut is an ETC1 compressed version of the data.
+
+void etc1_encode_block(const etc1_byte* pIn, etc1_uint32 validPixelMask, etc1_byte* pOut);
+
+// Decode a block of pixels.
+//
+// pIn is an ETC1 compressed version of the data.
+//
+// pOut is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
+// 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+// value of pixel (x, y).
+
+void etc1_decode_block(const etc1_byte* pIn, etc1_byte* pOut);
+
+// Return the size of the encoded image data (does not include size of PKM header).
+
+etc1_uint32 etc1_get_encoded_data_size(etc1_uint32 width, etc1_uint32 height);
+
+// Encode an entire image.
+// pIn - pointer to the image data. Formatted such that
+// pixel (x,y) is at pIn + pixelSize * x + stride * y;
+// pOut - pointer to encoded data. Must be large enough to store entire encoded image.
+// pixelSize can be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image, 3 is a GL_BYTE RGB image.
+// returns non-zero if there is an error.
+
+int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride, etc1_byte* pOut);
+
+// Decode an entire image.
+// pIn - pointer to encoded data.
+// pOut - pointer to the image data. Will be written such that
+// pixel (x,y) is at pIn + pixelSize * x + stride * y. Must be
+// large enough to store entire image.
+// pixelSize can be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image, 3 is a GL_BYTE RGB image.
+// returns non-zero if there is an error.
+
+int etc1_decode_image(const etc1_byte* pIn, etc1_byte* pOut,
+ etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride);
+
+// Size of a PKM header, in bytes.
+
+#define ETC_PKM_HEADER_SIZE 16
+
+// Format a PKM header
+
+void etc1_pkm_format_header(etc1_byte* pHeader, etc1_uint32 width, etc1_uint32 height);
+
+// Check if a PKM header is correctly formatted.
+
+etc1_bool etc1_pkm_is_valid(const etc1_byte* pHeader);
+
+// Read the image width from a PKM header
+
+etc1_uint32 etc1_pkm_get_width(const etc1_byte* pHeader);
+
+// Read the image height from a PKM header
+
+etc1_uint32 etc1_pkm_get_height(const etc1_byte* pHeader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/opengl/java/android/opengl/ETC1.java b/opengl/java/android/opengl/ETC1.java
new file mode 100644
index 0000000..f3dac77
--- /dev/null
+++ b/opengl/java/android/opengl/ETC1.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * 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 android.opengl;
+
+import java.nio.Buffer;
+
+/**
+ * Methods for encoding and decoding ETC1 textures.
+ * <p>
+ * The standard for the ETC1 texture format can be found at
+ * http://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt
+ * <p>
+ * The PKM file format is of a 16-byte header that describes the image bounds
+ * followed by the encoded ETC1 texture data.
+ * <p>
+ * @see ETC1Util
+ */
+public class ETC1 {
+
+ /**
+ * Size in bytes of an encoded block.
+ */
+ public static final int ENCODED_BLOCK_SIZE = 8;
+
+ /**
+ * Size in bytes of a decoded block.
+ */
+ public static final int DECODED_BLOCK_SIZE = 48;
+
+ /**
+ * Size of a PKM file header, in bytes.
+ */
+ public static final int ETC_PKM_HEADER_SIZE = 16;
+
+ /**
+ * Accepted by the internalformat parameter of glCompressedTexImage2D.
+ */
+ public static final int ETC1_RGB8_OES = 0x8D64;
+
+ /**
+ * Encode a block of pixels.
+ *
+ * @param in a native order direct buffer of size DECODED_BLOCK_SIZE that represent a
+ * 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+ * value of pixel (x, y).
+ *
+ * @param validPixelMask is a 16-bit mask where bit (1 << (x + y * 4)) indicates whether
+ * the corresponding (x,y) pixel is valid. Invalid pixel color values are ignored when compressing.
+ *
+ * @param out a native order direct buffer of size ENCODED_BLOCK_SIZE that receives the
+ * ETC1 compressed version of the data.
+ *
+ */
+ public static native void encodeBlock(Buffer in, int validPixelMask, Buffer out);
+
+ /**
+ * Decode a block of pixels.
+ *
+ * @param in a native order direct buffer of size ENCODED_BLOCK_SIZE that contains the
+ * ETC1 compressed version of the data.
+ *
+ * @param out a native order direct buffer of size DECODED_BLOCK_SIZE that will receive
+ * the decoded data. The data represents a
+ * 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
+ * value of pixel (x, y).
+ */
+ public static native void decodeBlock(Buffer in, Buffer out);
+
+ /**
+ * Return the size of the encoded image data (does not include size of PKM header).
+ */
+ public static native int getEncodedDataSize(int width, int height);
+
+ /**
+ * Encode an entire image.
+ * @param in a native order direct buffer of the image data. Formatted such that
+ * pixel (x,y) is at pIn + pixelSize * x + stride * y;
+ * @param out a native order direct buffer of the encoded data.
+ * Must be large enough to store entire encoded image.
+ * @param pixelSize must be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image,
+ * 3 is a GL_BYTE RGB image.
+ */
+ public static native void encodeImage(Buffer in, int width, int height,
+ int pixelSize, int stride, Buffer out);
+
+ /**
+ * Decode an entire image.
+ * @param in native order direct buffer of the encoded data.
+ * @param out native order direct buffer of the image data. Will be written such that
+ * pixel (x,y) is at pIn + pixelSize * x + stride * y. Must be
+ * large enough to store entire image.
+ * @param pixelSize must be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image,
+ * 3 is a GL_BYTE RGB image.
+ */
+ public static native void decodeImage(Buffer in, Buffer out,
+ int width, int height, int pixelSize, int stride);
+
+ /**
+ * Format a PKM header
+ * @param header native order direct buffer of the header.
+ * @param width the width of the image in pixels.
+ * @param height the height of the image in pixels.
+ */
+ public static native void formatHeader(Buffer header, int width, int height);
+
+ /**
+ * Check if a PKM header is correctly formatted.
+ * @param header native order direct buffer of the header.
+ */
+ public static native boolean isValid(Buffer header);
+
+ /**
+ * Read the image width from a PKM header
+ * @param header native order direct buffer of the header.
+ */
+ public static native int getWidth(Buffer header);
+
+ /**
+ * Read the image height from a PKM header
+ * @param header native order direct buffer of the header.
+ */
+ public static native int getHeight(Buffer header);
+}
diff --git a/opengl/java/android/opengl/ETC1Util.java b/opengl/java/android/opengl/ETC1Util.java
new file mode 100644
index 0000000..dd28d1d
--- /dev/null
+++ b/opengl/java/android/opengl/ETC1Util.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * 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 android.opengl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Utility methods for using ETC1 compressed textures.
+ *
+ */
+public class ETC1Util {
+ /**
+ * Convenience method to load an ETC1 texture whether or not the active OpenGL context
+ * supports the ETC1 texture compression format.
+ * @param target the texture target.
+ * @param level the texture level
+ * @param border the border size. Typically 0.
+ * @param fallbackFormat the format to use if ETC1 texture compression is not supported.
+ * Must be GL_RGB.
+ * @param fallbackType the type to use if ETC1 texture compression is not supported.
+ * Can be either GL_UNSIGNED_SHORT_5_6_5, which implies 16-bits-per-pixel,
+ * or GL_UNSIGNED_BYTE, which implies 24-bits-per-pixel.
+ * @param input the input stream containing an ETC1 texture in PKM format.
+ * @throws IOException
+ */
+ public static void loadTexture(int target, int level, int border,
+ int fallbackFormat, int fallbackType, InputStream input)
+ throws IOException {
+ loadTexture(target, level, border, fallbackFormat, fallbackType, createTexture(input));
+ }
+
+ /**
+ * Convenience method to load an ETC1 texture whether or not the active OpenGL context
+ * supports the ETC1 texture compression format.
+ * @param target the texture target.
+ * @param level the texture level
+ * @param border the border size. Typically 0.
+ * @param fallbackFormat the format to use if ETC1 texture compression is not supported.
+ * Must be GL_RGB.
+ * @param fallbackType the type to use if ETC1 texture compression is not supported.
+ * Can be either GL_UNSIGNED_SHORT_5_6_5, which implies 16-bits-per-pixel,
+ * or GL_UNSIGNED_BYTE, which implies 24-bits-per-pixel.
+ * @param texture the ETC1 to load.
+ */
+ public static void loadTexture(int target, int level, int border,
+ int fallbackFormat, int fallbackType, ETC1Texture texture) {
+ if (fallbackFormat != GLES10.GL_RGB) {
+ throw new IllegalArgumentException("fallbackFormat must be GL_RGB");
+ }
+ if (! (fallbackType == GLES10.GL_UNSIGNED_SHORT_5_6_5
+ || fallbackType == GLES10.GL_UNSIGNED_BYTE)) {
+ throw new IllegalArgumentException("Unsupported fallbackType");
+ }
+
+ int width = texture.getWidth();
+ int height = texture.getHeight();
+ Buffer data = texture.getData();
+ if (isETC1Supported()) {
+ int imageSize = data.remaining();
+ GLES10.glCompressedTexImage2D(target, level, ETC1.ETC1_RGB8_OES, width, height,
+ border, imageSize, data);
+ } else {
+ boolean useShorts = fallbackType != GLES10.GL_UNSIGNED_BYTE;
+ int pixelSize = useShorts ? 2 : 3;
+ int stride = pixelSize * width;
+ ByteBuffer decodedData = ByteBuffer.allocateDirect(stride*height)
+ .order(ByteOrder.nativeOrder());
+ ETC1.decodeImage(data, decodedData, width, height, pixelSize, stride);
+ GLES10.glTexImage2D(target, level, fallbackFormat, width, height, border,
+ fallbackFormat, fallbackType, decodedData);
+ }
+ }
+
+ /**
+ * Check if ETC1 texture compression is supported by the active OpenGL ES context.
+ * @return true if the active OpenGL ES context supports ETC1 texture compression.
+ */
+ public static boolean isETC1Supported() {
+ int[] results = new int[20];
+ GLES10.glGetIntegerv(GLES10.GL_NUM_COMPRESSED_TEXTURE_FORMATS, results, 0);
+ int numFormats = results[0];
+ if (numFormats > results.length) {
+ results = new int[numFormats];
+ }
+ GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, results, 0);
+ for (int i = 0; i < numFormats; i++) {
+ if (results[i] == ETC1.ETC1_RGB8_OES) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * A utility class encapsulating a compressed ETC1 texture.
+ */
+ public static class ETC1Texture {
+ public ETC1Texture(int width, int height, ByteBuffer data) {
+ mWidth = width;
+ mHeight = height;
+ mData = data;
+ }
+
+ /**
+ * Get the width of the texture in pixels.
+ * @return the width of the texture in pixels.
+ */
+ public int getWidth() { return mWidth; }
+
+ /**
+ * Get the height of the texture in pixels.
+ * @return the width of the texture in pixels.
+ */
+ public int getHeight() { return mHeight; }
+
+ /**
+ * Get the compressed data of the texture.
+ * @return the texture data.
+ */
+ public ByteBuffer getData() { return mData; }
+
+ private int mWidth;
+ private int mHeight;
+ private ByteBuffer mData;
+ }
+
+ /**
+ * Create a new ETC1Texture from an input stream containing a PKM formatted compressed texture.
+ * @param input an input stream containing a PKM formatted compressed texture.
+ * @return an ETC1Texture read from the input stream.
+ * @throws IOException
+ */
+ public static ETC1Texture createTexture(InputStream input) throws IOException {
+ int width = 0;
+ int height = 0;
+ byte[] ioBuffer = new byte[4096];
+ {
+ if (input.read(ioBuffer, 0, ETC1.ETC_PKM_HEADER_SIZE) != ETC1.ETC_PKM_HEADER_SIZE) {
+ throw new IOException("Unable to read PKM file header.");
+ }
+ ByteBuffer headerBuffer = ByteBuffer.allocateDirect(ETC1.ETC_PKM_HEADER_SIZE)
+ .order(ByteOrder.nativeOrder());
+ headerBuffer.put(ioBuffer, 0, ETC1.ETC_PKM_HEADER_SIZE).position(0);
+ if (!ETC1.isValid(headerBuffer)) {
+ throw new IOException("Not a PKM file.");
+ }
+ width = ETC1.getWidth(headerBuffer);
+ height = ETC1.getHeight(headerBuffer);
+ }
+ int encodedSize = ETC1.getEncodedDataSize(width, height);
+ ByteBuffer dataBuffer = ByteBuffer.allocateDirect(encodedSize).order(ByteOrder.nativeOrder());
+ for (int i = 0; i < encodedSize; ) {
+ int chunkSize = Math.min(ioBuffer.length, encodedSize - i);
+ if (input.read(ioBuffer, 0, chunkSize) != chunkSize) {
+ throw new IOException("Unable to read PKM file data.");
+ }
+ dataBuffer.put(ioBuffer, 0, chunkSize);
+ i += chunkSize;
+ }
+ dataBuffer.position(0);
+ return new ETC1Texture(width, height, dataBuffer);
+ }
+
+ /**
+ * Helper function that compresses an image into an ETC1Texture.
+ * @param input a native order direct buffer containing the image data
+ * @param width the width of the image in pixels
+ * @param height the height of the image in pixels
+ * @param pixelSize the size of a pixel in bytes (2 or 3)
+ * @param stride the width of a line of the image in bytes
+ * @return the ETC1 texture.
+ */
+ public static ETC1Texture compressTexture(Buffer input, int width, int height, int pixelSize, int stride){
+ int encodedImageSize = ETC1.getEncodedDataSize(width, height);
+ ByteBuffer compressedImage = ByteBuffer.allocateDirect(encodedImageSize).
+ order(ByteOrder.nativeOrder());
+ ETC1.encodeImage(input, width, height, 3, stride, compressedImage);
+ return new ETC1Texture(width, height, compressedImage);
+ }
+
+ /**
+ * Helper function that writes an ETC1Texture to an output stream formatted as a PKM file.
+ * @param texture the input texture.
+ * @param output the stream to write the formatted texture data to.
+ * @throws IOException
+ */
+ public static void writeTexture(ETC1Texture texture, OutputStream output) throws IOException {
+ ByteBuffer dataBuffer = texture.getData();
+ int originalPosition = dataBuffer.position();
+ try {
+ int width = texture.getWidth();
+ int height = texture.getHeight();
+ ByteBuffer header = ByteBuffer.allocateDirect(ETC1.ETC_PKM_HEADER_SIZE).order(ByteOrder.nativeOrder());
+ ETC1.formatHeader(header, width, height);
+ byte[] ioBuffer = new byte[4096];
+ header.get(ioBuffer, 0, ETC1.ETC_PKM_HEADER_SIZE);
+ output.write(ioBuffer, 0, ETC1.ETC_PKM_HEADER_SIZE);
+ int encodedSize = ETC1.getEncodedDataSize(width, height);
+ for (int i = 0; i < encodedSize; ) {
+ int chunkSize = Math.min(ioBuffer.length, encodedSize - i);
+ dataBuffer.get(ioBuffer, 0, chunkSize);
+ output.write(ioBuffer, 0, chunkSize);
+ i += chunkSize;
+ }
+ } finally {
+ dataBuffer.position(originalPosition);
+ }
+ }
+}
diff --git a/opengl/java/android/opengl/GLErrorWrapper.java b/opengl/java/android/opengl/GLErrorWrapper.java
index 884a1a0..9b66e49 100644
--- a/opengl/java/android/opengl/GLErrorWrapper.java
+++ b/opengl/java/android/opengl/GLErrorWrapper.java
@@ -958,4 +958,424 @@
checkError();
return valid;
}
+
+ public void glBindBuffer(int target, int buffer) {
+ checkThread();
+ mgl11.glBindBuffer(target, buffer);
+ checkError();
+ }
+
+ public void glBufferData(int target, int size, Buffer data, int usage) {
+ checkThread();
+ mgl11.glBufferData(target, size, data, usage);
+ checkError();
+ }
+
+ public void glBufferSubData(int target, int offset, int size, Buffer data) {
+ checkThread();
+ mgl11.glBufferSubData(target, offset, size, data);
+ checkError();
+ }
+
+ public void glColor4ub(byte red, byte green, byte blue, byte alpha) {
+ checkThread();
+ mgl11.glColor4ub(red, green, blue, alpha);
+ checkError(); }
+
+ public void glColorPointer(int size, int type, int stride, int offset) {
+ checkThread();
+ mgl11.glColorPointer(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glDeleteBuffers(int n, int[] buffers, int offset) {
+ checkThread();
+ mgl11.glDeleteBuffers(n, buffers, offset);
+ checkError();
+ }
+
+ public void glDeleteBuffers(int n, IntBuffer buffers) {
+ checkThread();
+ mgl11.glDeleteBuffers(n, buffers);
+ checkError();
+ }
+
+ public void glDrawElements(int mode, int count, int type, int offset) {
+ checkThread();
+ mgl11.glDrawElements(mode, count, type, offset);
+ checkError();
+ }
+
+ public void glGenBuffers(int n, int[] buffers, int offset) {
+ checkThread();
+ mgl11.glGenBuffers(n, buffers, offset);
+ checkError();
+ }
+
+ public void glGenBuffers(int n, IntBuffer buffers) {
+ checkThread();
+ mgl11.glGenBuffers(n, buffers);
+ checkError();
+ }
+
+ public void glGetBooleanv(int pname, boolean[] params, int offset) {
+ checkThread();
+ mgl11.glGetBooleanv(pname, params, offset);
+ checkError();
+ }
+
+ public void glGetBooleanv(int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetBooleanv(pname, params);
+ checkError();
+ }
+
+ public void glGetBufferParameteriv(int target, int pname, int[] params,
+ int offset) {
+ checkThread();
+ mgl11.glGetBufferParameteriv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetBufferParameteriv(int target, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetBufferParameteriv(target, pname, params);
+ checkError();
+ }
+
+ public void glGetClipPlanef(int pname, float[] eqn, int offset) {
+ checkThread();
+ mgl11.glGetClipPlanef(pname, eqn, offset);
+ checkError();
+ }
+
+ public void glGetClipPlanef(int pname, FloatBuffer eqn) {
+ checkThread();
+ mgl11.glGetClipPlanef(pname, eqn);
+ checkError();
+ }
+
+ public void glGetClipPlanex(int pname, int[] eqn, int offset) {
+ checkThread();
+ mgl11.glGetClipPlanex(pname, eqn, offset);
+ checkError();
+ }
+
+ public void glGetClipPlanex(int pname, IntBuffer eqn) {
+ checkThread();
+ mgl11.glGetClipPlanex(pname, eqn);
+ checkError();
+ }
+
+ public void glGetFixedv(int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glGetFixedv(pname, params, offset);
+ checkError();
+ }
+
+ public void glGetFixedv(int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetFixedv(pname, params);
+ checkError();
+ }
+
+ public void glGetFloatv(int pname, float[] params, int offset) {
+ checkThread();
+ mgl11.glGetFloatv(pname, params, offset);
+ checkError();
+ }
+
+ public void glGetFloatv(int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glGetFloatv(pname, params);
+ checkError();
+ }
+
+ public void glGetLightfv(int light, int pname, float[] params, int offset) {
+ checkThread();
+ mgl11.glGetLightfv(light, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetLightfv(int light, int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glGetLightfv(light, pname, params);
+ checkError();
+ }
+
+ public void glGetLightxv(int light, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glGetLightxv(light, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetLightxv(int light, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetLightxv(light, pname, params);
+ checkError();
+ }
+
+ public void glGetMaterialfv(int face, int pname, float[] params, int offset) {
+ checkThread();
+ mgl11.glGetMaterialfv(face, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetMaterialfv(int face, int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glGetMaterialfv(face, pname, params);
+ checkError();
+ }
+
+ public void glGetMaterialxv(int face, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glGetMaterialxv(face, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetMaterialxv(int face, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetMaterialxv(face, pname, params);
+ checkError();
+ }
+
+ public void glGetPointerv(int pname, Buffer[] params) {
+ checkThread();
+ mgl11.glGetPointerv(pname, params);
+ checkError();
+ }
+
+ public void glGetTexEnviv(int env, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glGetTexEnviv(env, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetTexEnviv(int env, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetTexEnviv(env, pname, params);
+ checkError();
+ }
+
+ public void glGetTexEnvxv(int env, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glGetTexEnvxv(env, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetTexEnvxv(int env, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetTexEnvxv(env, pname, params);
+ checkError();
+ }
+
+ public void glGetTexParameterfv(int target, int pname, float[] params,
+ int offset) {
+ checkThread();
+ mgl11.glGetTexParameterfv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetTexParameterfv(int target, int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glGetTexParameterfv(target, pname, params);
+ checkError();
+ }
+
+ public void glGetTexParameteriv(int target, int pname, int[] params,
+ int offset) {
+ checkThread();
+ mgl11.glGetTexParameteriv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetTexParameteriv(int target, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetTexParameteriv(target, pname, params);
+ checkError();
+ }
+
+ public void glGetTexParameterxv(int target, int pname, int[] params,
+ int offset) {
+ checkThread();
+ mgl11.glGetTexParameterxv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glGetTexParameterxv(int target, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glGetTexParameterxv(target, pname, params);
+ checkError();
+ }
+
+ public boolean glIsBuffer(int buffer) {
+ checkThread();
+ boolean valid = mgl11.glIsBuffer(buffer);
+ checkError();
+ return valid;
+ }
+
+ public boolean glIsEnabled(int cap) {
+ checkThread();
+ boolean valid = mgl11.glIsEnabled(cap);
+ checkError();
+ return valid;
+ }
+
+ public boolean glIsTexture(int texture) {
+ checkThread();
+ boolean valid = mgl11.glIsTexture(texture);
+ checkError();
+ return valid;
+ }
+
+ public void glNormalPointer(int type, int stride, int offset) {
+ checkThread();
+ mgl11.glNormalPointer(type, stride, offset);
+ checkError();
+ }
+
+ public void glPointParameterf(int pname, float param) {
+ checkThread();
+ mgl11.glPointParameterf(pname, param);
+ checkError();
+ }
+
+ public void glPointParameterfv(int pname, float[] params, int offset) {
+ checkThread();
+ mgl11.glPointParameterfv(pname, params, offset);
+ checkError();
+ }
+
+ public void glPointParameterfv(int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glPointParameterfv(pname, params);
+ checkError();
+ }
+
+ public void glPointParameterx(int pname, int param) {
+ checkThread();
+ mgl11.glPointParameterx(pname, param);
+ checkError();
+ }
+
+ public void glPointParameterxv(int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glPointParameterxv(pname, params, offset);
+ checkError();
+ }
+
+ public void glPointParameterxv(int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glPointParameterxv(pname, params);
+ checkError();
+ }
+
+ public void glPointSizePointerOES(int type, int stride, Buffer pointer) {
+ checkThread();
+ mgl11.glPointSizePointerOES(type, stride, pointer);
+ checkError();
+ }
+
+ public void glTexCoordPointer(int size, int type, int stride, int offset) {
+ checkThread();
+ mgl11.glTexCoordPointer(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glTexEnvi(int target, int pname, int param) {
+ checkThread();
+ mgl11.glTexEnvi(target, pname, param);
+ checkError();
+ }
+
+ public void glTexEnviv(int target, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glTexEnviv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glTexEnviv(int target, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glTexEnviv(target, pname, params);
+ checkError();
+ }
+
+ public void glTexParameterfv(int target, int pname, float[] params,
+ int offset) {
+ checkThread();
+ mgl11.glTexParameterfv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glTexParameterfv(int target, int pname, FloatBuffer params) {
+ checkThread();
+ mgl11.glTexParameterfv(target, pname, params);
+ checkError();
+ }
+
+ public void glTexParameteri(int target, int pname, int param) {
+ checkThread();
+ mgl11.glTexParameteri(target, pname, param);
+ checkError();
+ }
+
+ public void glTexParameterxv(int target, int pname, int[] params, int offset) {
+ checkThread();
+ mgl11.glTexParameterxv(target, pname, params, offset);
+ checkError();
+ }
+
+ public void glTexParameterxv(int target, int pname, IntBuffer params) {
+ checkThread();
+ mgl11.glTexParameterxv(target, pname, params);
+ checkError();
+ }
+
+ public void glVertexPointer(int size, int type, int stride, int offset) {
+ checkThread();
+ mgl11.glVertexPointer(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glCurrentPaletteMatrixOES(int matrixpaletteindex) {
+ checkThread();
+ mgl11Ext.glCurrentPaletteMatrixOES(matrixpaletteindex);
+ checkError();
+ }
+
+ public void glLoadPaletteFromModelViewMatrixOES() {
+ checkThread();
+ mgl11Ext.glLoadPaletteFromModelViewMatrixOES();
+ checkError();
+ }
+
+ public void glMatrixIndexPointerOES(int size, int type, int stride,
+ Buffer pointer) {
+ checkThread();
+ mgl11Ext.glMatrixIndexPointerOES(size, type, stride, pointer);
+ checkError();
+ }
+
+ public void glMatrixIndexPointerOES(int size, int type, int stride,
+ int offset) {
+ checkThread();
+ mgl11Ext.glMatrixIndexPointerOES(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glWeightPointerOES(int size, int type, int stride,
+ Buffer pointer) {
+ checkThread();
+ mgl11Ext.glWeightPointerOES(size, type, stride, pointer);
+ checkError();
+ }
+
+ public void glWeightPointerOES(int size, int type, int stride, int offset) {
+ checkThread();
+ mgl11Ext.glWeightPointerOES(size, type, stride, offset);
+ checkError();
+ }
+
+
}
diff --git a/opengl/java/android/opengl/GLLogWrapper.java b/opengl/java/android/opengl/GLLogWrapper.java
index 7dd1cfb..6e97f67 100644
--- a/opengl/java/android/opengl/GLLogWrapper.java
+++ b/opengl/java/android/opengl/GLLogWrapper.java
@@ -2767,230 +2767,684 @@
return valid;
}
- // Unsupported GL11 methods
-
public void glBindBuffer(int target, int buffer) {
- throw new UnsupportedOperationException();
+ begin("glBindBuffer");
+ arg("target", target);
+ arg("buffer", buffer);
+ end();
+ mgl11.glBindBuffer(target, buffer);
+ checkError();
}
public void glBufferData(int target, int size, Buffer data, int usage) {
- throw new UnsupportedOperationException();
+ begin("glBufferData");
+ arg("target", target);
+ arg("size", size);
+ arg("data", data.toString());
+ arg("usage", usage);
+ end();
+ mgl11.glBufferData(target, size, data, usage);
+ checkError();
}
public void glBufferSubData(int target, int offset, int size, Buffer data) {
- throw new UnsupportedOperationException();
+ begin("glBufferSubData");
+ arg("target", target);
+ arg("offset", offset);
+ arg("size", size);
+ arg("data", data.toString());
+ end();
+ mgl11.glBufferSubData(target, offset, size, data);
+ checkError();
}
public void glColor4ub(byte red, byte green, byte blue, byte alpha) {
- throw new UnsupportedOperationException();
+ begin("glColor4ub");
+ arg("red", red);
+ arg("green", green);
+ arg("blue", blue);
+ arg("alpha", alpha);
+ end();
+ mgl11.glColor4ub(red, green, blue, alpha);
+ checkError();
}
public void glDeleteBuffers(int n, int[] buffers, int offset) {
- throw new UnsupportedOperationException();
+ begin("glDeleteBuffers");
+ arg("n", n);
+ arg("buffers", buffers.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glDeleteBuffers(n, buffers, offset);
+ checkError();
}
public void glDeleteBuffers(int n, IntBuffer buffers) {
- throw new UnsupportedOperationException();
+ begin("glDeleteBuffers");
+ arg("n", n);
+ arg("buffers", buffers.toString());
+ end();
+ mgl11.glDeleteBuffers(n, buffers);
+ checkError();
}
public void glGenBuffers(int n, int[] buffers, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGenBuffers");
+ arg("n", n);
+ arg("buffers", buffers.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGenBuffers(n, buffers, offset);
+ checkError();
}
public void glGenBuffers(int n, IntBuffer buffers) {
- throw new UnsupportedOperationException();
+ begin("glGenBuffers");
+ arg("n", n);
+ arg("buffers", buffers.toString());
+ end();
+ mgl11.glGenBuffers(n, buffers);
+ checkError();
}
public void glGetBooleanv(int pname, boolean[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetBooleanv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetBooleanv(pname, params, offset);
+ checkError();
}
public void glGetBooleanv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetBooleanv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetBooleanv(pname, params);
+ checkError();
}
- public void glGetBufferParameteriv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ public void glGetBufferParameteriv(int target, int pname, int[] params,
+ int offset) {
+ begin("glGetBufferParameteriv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetBufferParameteriv(target, pname, params, offset);
+ checkError();
}
public void glGetBufferParameteriv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetBufferParameteriv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetBufferParameteriv(target, pname, params);
+ checkError();
}
public void glGetClipPlanef(int pname, float[] eqn, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetClipPlanef");
+ arg("pname", pname);
+ arg("eqn", eqn.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetClipPlanef(pname, eqn, offset);
+ checkError();
}
public void glGetClipPlanef(int pname, FloatBuffer eqn) {
- throw new UnsupportedOperationException();
+ begin("glGetClipPlanef");
+ arg("pname", pname);
+ arg("eqn", eqn.toString());
+ end();
+ mgl11.glGetClipPlanef(pname, eqn);
+ checkError();
}
public void glGetClipPlanex(int pname, int[] eqn, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetClipPlanex");
+ arg("pname", pname);
+ arg("eqn", eqn.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetClipPlanex(pname, eqn, offset);
}
public void glGetClipPlanex(int pname, IntBuffer eqn) {
- throw new UnsupportedOperationException();
+ begin("glGetClipPlanex");
+ arg("pname", pname);
+ arg("eqn", eqn.toString());
+ end();
+ mgl11.glGetClipPlanex(pname, eqn);
+ checkError();
}
public void glGetFixedv(int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetFixedv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetFixedv(pname, params, offset);
}
public void glGetFixedv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetFixedv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetFixedv(pname, params);
+ checkError();
}
public void glGetFloatv(int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetFloatv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetFloatv(pname, params, offset);
}
public void glGetFloatv(int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetFloatv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetFloatv(pname, params);
+ checkError();
}
public void glGetLightfv(int light, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetLightfv");
+ arg("light", light);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetLightfv(light, pname, params, offset);
+ checkError();
}
public void glGetLightfv(int light, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetLightfv");
+ arg("light", light);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetLightfv(light, pname, params);
+ checkError();
}
public void glGetLightxv(int light, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetLightxv");
+ arg("light", light);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetLightxv(light, pname, params, offset);
+ checkError();
}
public void glGetLightxv(int light, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetLightxv");
+ arg("light", light);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetLightxv(light, pname, params);
+ checkError();
}
- public void glGetMaterialfv(int face, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ public void glGetMaterialfv(int face, int pname, float[] params,
+ int offset) {
+ begin("glGetMaterialfv");
+ arg("face", face);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetMaterialfv(face, pname, params, offset);
+ checkError();
}
public void glGetMaterialfv(int face, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetMaterialfv");
+ arg("face", face);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetMaterialfv(face, pname, params);
+ checkError();
}
public void glGetMaterialxv(int face, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetMaterialxv");
+ arg("face", face);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetMaterialxv(face, pname, params, offset);
+ checkError();
}
public void glGetMaterialxv(int face, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetMaterialxv");
+ arg("face", face);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetMaterialxv(face, pname, params);
+ checkError();
}
public void glGetTexEnviv(int env, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetTexEnviv");
+ arg("env", env);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetTexEnviv(env, pname, params, offset);
+ checkError();
}
public void glGetTexEnviv(int env, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetTexEnviv");
+ arg("env", env);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetTexEnviv(env, pname, params);
+ checkError();
}
public void glGetTexEnvxv(int env, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetTexEnviv");
+ arg("env", env);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetTexEnviv(env, pname, params, offset);
+ checkError();
}
public void glGetTexEnvxv(int env, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetTexEnviv");
+ arg("env", env);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetTexEnvxv(env, pname, params);
+ checkError();
}
public void glGetTexParameterfv(int target, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetTexParameterfv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetTexParameterfv(target, pname, params, offset);
+ checkError();
}
public void glGetTexParameterfv(int target, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetTexParameterfv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetTexParameterfv(target, pname, params);
+ checkError();
}
public void glGetTexParameteriv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glGetTexParameteriv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetTexEnviv(target, pname, params, offset);
+ checkError();
}
public void glGetTexParameteriv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetTexParameteriv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetTexParameteriv(target, pname, params);
+ checkError();
}
- public void glGetTexParameterxv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ public void glGetTexParameterxv(int target, int pname, int[] params,
+ int offset) {
+ begin("glGetTexParameterxv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glGetTexParameterxv(target, pname, params, offset);
+ checkError();
}
public void glGetTexParameterxv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glGetTexParameterxv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetTexParameterxv(target, pname, params);
+ checkError();
}
public boolean glIsBuffer(int buffer) {
- throw new UnsupportedOperationException();
+ begin("glIsBuffer");
+ arg("buffer", buffer);
+ end();
+ boolean result = mgl11.glIsBuffer(buffer);
+ checkError();
+ return result;
}
public boolean glIsEnabled(int cap) {
- throw new UnsupportedOperationException();
+ begin("glIsEnabled");
+ arg("cap", cap);
+ end();
+ boolean result = mgl11.glIsEnabled(cap);
+ checkError();
+ return result;
}
public boolean glIsTexture(int texture) {
- throw new UnsupportedOperationException();
+ begin("glIsTexture");
+ arg("texture", texture);
+ end();
+ boolean result = mgl11.glIsTexture(texture);
+ checkError();
+ return result;
}
public void glPointParameterf(int pname, float param) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterf");
+ arg("pname", pname);
+ arg("param", param);
+ end();
+ mgl11.glPointParameterf( pname, param);
+ checkError();
}
public void glPointParameterfv(int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterfv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glPointParameterfv(pname, params, offset);
+ checkError();
}
public void glPointParameterfv(int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterfv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glPointParameterfv(pname, params);
+ checkError();
}
public void glPointParameterx(int pname, int param) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterfv");
+ arg("pname", pname);
+ arg("param", param);
+ end();
+ mgl11.glPointParameterx( pname, param);
+ checkError();
}
public void glPointParameterxv(int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterxv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glPointParameterxv(pname, params, offset);
+ checkError();
}
public void glPointParameterxv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glPointParameterxv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glPointParameterxv( pname, params);
+ checkError();
}
public void glPointSizePointerOES(int type, int stride, Buffer pointer) {
- throw new UnsupportedOperationException();
+ begin("glPointSizePointerOES");
+ arg("type", type);
+ arg("stride", stride);
+ arg("params", pointer.toString());
+ end();
+ mgl11.glPointSizePointerOES( type, stride, pointer);
+ checkError();
}
public void glTexEnvi(int target, int pname, int param) {
- throw new UnsupportedOperationException();
+ begin("glTexEnvi");
+ arg("target", target);
+ arg("pname", pname);
+ arg("param", param);
+ end();
+ mgl11.glTexEnvi(target, pname, param);
+ checkError();
}
public void glTexEnviv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ begin("glTexEnviv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glTexEnviv(target, pname, params, offset);
+ checkError();
}
public void glTexEnviv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glTexEnviv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glTexEnviv( target, pname, params);
+ checkError();
}
- public void glTexParameterfv(int target, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
+ public void glTexParameterfv(int target, int pname, float[] params,
+ int offset) {
+ begin("glTexParameterfv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glTexParameterfv( target, pname, params, offset);
+ checkError();
}
public void glTexParameterfv(int target, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glTexParameterfv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glTexParameterfv(target, pname, params);
+ checkError();
}
public void glTexParameteri(int target, int pname, int param) {
- throw new UnsupportedOperationException();
+ begin("glTexParameterxv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("param", param);
+ end();
+ mgl11.glTexParameteri(target, pname, param);
+ checkError();
}
- public void glTexParameterxv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
+ public void glTexParameterxv(int target, int pname, int[] params,
+ int offset) {
+ begin("glTexParameterxv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ arg("offset", offset);
+ end();
+ mgl11.glTexParameterxv(target, pname, params, offset);
+ checkError();
}
public void glTexParameterxv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
+ begin("glTexParameterxv");
+ arg("target", target);
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glTexParameterxv(target, pname, params);
+ checkError();
+ }
+
+
+ public void glColorPointer(int size, int type, int stride, int offset) {
+ begin("glColorPointer");
+ arg("size", size);
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11.glColorPointer(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glDrawElements(int mode, int count, int type, int offset) {
+ begin("glDrawElements");
+ arg("mode", mode);
+ arg("count", count);
+ arg("type", type);
+ arg("offset", offset);
+ end();
+ mgl11.glDrawElements(mode, count, type, offset);
+ checkError();
+ }
+
+ public void glGetPointerv(int pname, Buffer[] params) {
+ begin("glGetPointerv");
+ arg("pname", pname);
+ arg("params", params.toString());
+ end();
+ mgl11.glGetPointerv(pname, params);
+ checkError();
+ }
+
+ public void glNormalPointer(int type, int stride, int offset) {
+ begin("glNormalPointer");
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11.glNormalPointer(type, stride, offset);
+ }
+
+ public void glTexCoordPointer(int size, int type, int stride, int offset) {
+ begin("glTexCoordPointer");
+ arg("size", size);
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11.glTexCoordPointer(size, type, stride, offset);
+ }
+
+ public void glVertexPointer(int size, int type, int stride, int offset) {
+ begin("glVertexPointer");
+ arg("size", size);
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11.glVertexPointer(size, type, stride, offset);
+ }
+
+ public void glCurrentPaletteMatrixOES(int matrixpaletteindex) {
+ begin("glCurrentPaletteMatrixOES");
+ arg("matrixpaletteindex", matrixpaletteindex);
+ end();
+ mgl11Ext.glCurrentPaletteMatrixOES(matrixpaletteindex);
+ checkError();
+ }
+
+ public void glLoadPaletteFromModelViewMatrixOES() {
+ begin("glLoadPaletteFromModelViewMatrixOES");
+ end();
+ mgl11Ext.glLoadPaletteFromModelViewMatrixOES();
+ checkError();
+ }
+
+ public void glMatrixIndexPointerOES(int size, int type, int stride,
+ Buffer pointer) {
+ begin("glMatrixIndexPointerOES");
+ argPointer(size, type, stride, pointer);
+ end();
+ mgl11Ext.glMatrixIndexPointerOES(size, type, stride, pointer);
+ checkError();
+ }
+
+ public void glMatrixIndexPointerOES(int size, int type, int stride,
+ int offset) {
+ begin("glMatrixIndexPointerOES");
+ arg("size", size);
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11Ext.glMatrixIndexPointerOES(size, type, stride, offset);
+ checkError();
+ }
+
+ public void glWeightPointerOES(int size, int type, int stride,
+ Buffer pointer) {
+ begin("glWeightPointerOES");
+ argPointer(size, type, stride, pointer);
+ end();
+ mgl11Ext.glWeightPointerOES(size, type, stride, pointer);
+ checkError();
+ }
+
+ public void glWeightPointerOES(int size, int type, int stride, int offset) {
+ begin("glWeightPointerOES");
+ arg("size", size);
+ arg("type", type);
+ arg("stride", stride);
+ arg("offset", offset);
+ end();
+ mgl11Ext.glWeightPointerOES(size, type, stride, offset);
+ checkError();
}
private class PointerInfo {
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 185398b..471625e 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -1066,6 +1066,8 @@
GL10 gl = null;
boolean createEglSurface = false;
boolean sizeChanged = false;
+ boolean wantRenderNotification = false;
+ boolean doRenderNotification = false;
int w = 0;
int h = 0;
Runnable event = null;
@@ -1111,6 +1113,13 @@
sGLThreadManager.notifyAll();
}
+ if (doRenderNotification) {
+ wantRenderNotification = false;
+ doRenderNotification = false;
+ mRenderComplete = true;
+ sGLThreadManager.notifyAll();
+ }
+
// Ready to draw?
if ((!mPaused) && mHasSurface
&& (mWidth > 0) && (mHeight > 0)
@@ -1130,6 +1139,8 @@
sizeChanged = true;
w = mWidth;
h = mHeight;
+ wantRenderNotification = true;
+
if (DRAW_TWICE_AFTER_SIZE_CHANGED) {
// We keep mRequestRender true so that we draw twice after the size changes.
// (Once because of mSizeChanged, the second time because of mRequestRender.)
@@ -1187,6 +1198,10 @@
Log.i("GLThread", "egl surface lost tid=" + getId());
}
}
+
+ if (wantRenderNotification) {
+ doRenderNotification = true;
+ }
}
} finally {
/*
@@ -1269,7 +1284,20 @@
mHeight = h;
mSizeChanged = true;
mRequestRender = true;
+ mRenderComplete = false;
sGLThreadManager.notifyAll();
+
+ // Wait for thread to react to resize and render a frame
+ while (! mExited && !mPaused && !mRenderComplete ) {
+ if (LOG_SURFACE) {
+ Log.i("Main thread", "onWindowResize waiting for render complete.");
+ }
+ try {
+ sGLThreadManager.wait();
+ } catch (InterruptedException ex) {
+ Thread.currentThread().interrupt();
+ }
+ }
}
}
@@ -1315,6 +1343,7 @@
private int mHeight;
private int mRenderMode;
private boolean mRequestRender;
+ private boolean mRenderComplete;
private ArrayList<Runnable> mEventQueue = new ArrayList<Runnable>();
// End of member variables protected by the sGLThreadManager monitor.
@@ -1376,14 +1405,10 @@
}
/*
-<<<<<<< HEAD
- * Tries to acquire the right to use an EGL
- * surface. Does not block.
-=======
* Tries once to acquire the right to use an EGL
* surface. Does not block. Requires that we are already
* in the sGLThreadManager monitor when this is called.
->>>>>>> dc49acb0
+ *
* @return true if the right to use an EGL surface was acquired.
*/
public boolean tryAcquireEglSurfaceLocked(GLThread thread) {
diff --git a/opengl/java/android/opengl/GLWrapperBase.java b/opengl/java/android/opengl/GLWrapperBase.java
index 067f95f..b0f83f7 100644
--- a/opengl/java/android/opengl/GLWrapperBase.java
+++ b/opengl/java/android/opengl/GLWrapperBase.java
@@ -16,9 +16,6 @@
package android.opengl;
-import java.nio.Buffer;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL10Ext;
@@ -32,464 +29,25 @@
*/
abstract class GLWrapperBase
implements GL, GL10, GL10Ext, GL11, GL11Ext {
- public GLWrapperBase(GL gl) {
- mgl = (GL10) gl;
- if (gl instanceof GL10Ext) {
- mgl10Ext = (GL10Ext) gl;
- }
- if (gl instanceof GL11) {
- mgl11 = (GL11) gl;
- }
- if (gl instanceof GL11Ext) {
- mgl11Ext = (GL11Ext) gl;
- }
- if (gl instanceof GL11ExtensionPack) {
- mgl11ExtensionPack = (GL11ExtensionPack) gl;
- }
- }
-
- protected GL10 mgl;
- protected GL10Ext mgl10Ext;
- protected GL11 mgl11;
- protected GL11Ext mgl11Ext;
- protected GL11ExtensionPack mgl11ExtensionPack;
-
- // Unsupported GL11 methods
-
- public void glGetPointerv(int pname, java.nio.Buffer[] params) {
- throw new UnsupportedOperationException();
+ public GLWrapperBase(GL gl) {
+ mgl = (GL10) gl;
+ if (gl instanceof GL10Ext) {
+ mgl10Ext = (GL10Ext) gl;
+ }
+ if (gl instanceof GL11) {
+ mgl11 = (GL11) gl;
+ }
+ if (gl instanceof GL11Ext) {
+ mgl11Ext = (GL11Ext) gl;
+ }
+ if (gl instanceof GL11ExtensionPack) {
+ mgl11ExtensionPack = (GL11ExtensionPack) gl;
+ }
}
- // VBO versions of *Pointer and *Elements methods
- public void glColorPointer(int size, int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glNormalPointer(int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexCoordPointer(int size, int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glVertexPointer(int size, int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glDrawElements(int mode, int count, int type, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glBindBuffer(int target, int buffer) {
- throw new UnsupportedOperationException();
- }
-
- public void glBufferData(int target, int size, Buffer data, int usage) {
- throw new UnsupportedOperationException();
- }
-
- public void glBufferSubData(int target, int offset, int size, Buffer data) {
- throw new UnsupportedOperationException();
- }
-
- public void glColor4ub(byte red, byte green, byte blue, byte alpha) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteBuffers(int n, int[] buffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteBuffers(int n, IntBuffer buffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenBuffers(int n, int[] buffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenBuffers(int n, IntBuffer buffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetBooleanv(int pname, boolean[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetBooleanv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetBufferParameteriv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetBufferParameteriv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetClipPlanef(int pname, float[] eqn, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetClipPlanef(int pname, FloatBuffer eqn) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetClipPlanex(int pname, int[] eqn, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetClipPlanex(int pname, IntBuffer eqn) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFixedv(int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFixedv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFloatv(int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFloatv(int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetLightfv(int light, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetLightfv(int light, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetLightxv(int light, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetLightxv(int light, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetMaterialfv(int face, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetMaterialfv(int face, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetMaterialxv(int face, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetMaterialxv(int face, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexEnviv(int env, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexEnviv(int env, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexEnvxv(int env, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexEnvxv(int env, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameterfv(int target, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameterfv(int target, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameteriv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameteriv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameterxv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexParameterxv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public boolean glIsBuffer(int buffer) {
- throw new UnsupportedOperationException();
- }
-
- public boolean glIsEnabled(int cap) {
- throw new UnsupportedOperationException();
- }
-
- public boolean glIsTexture(int texture) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterf(int pname, float param) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterfv(int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterfv(int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterx(int pname, int param) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterxv(int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointParameterxv(int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glPointSizePointerOES(int type, int stride, Buffer pointer) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexEnvi(int target, int pname, int param) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexEnviv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexEnviv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexParameterfv(int target, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexParameterfv(int target, int pname, FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexParameteri(int target, int pname, int param) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexParameterxv(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexParameterxv(int target, int pname, IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- // Unsupported GL11Ext methods
-
- public void glCurrentPaletteMatrixOES(int matrixpaletteindex) {
- throw new UnsupportedOperationException();
- }
-
- public void glLoadPaletteFromModelViewMatrixOES() {
- throw new UnsupportedOperationException();
- }
-
- public void glMatrixIndexPointerOES(int size, int type, int stride, Buffer pointer) {
- throw new UnsupportedOperationException();
- }
-
- public void glMatrixIndexPointerOES(int size, int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glWeightPointerOES(int size, int type, int stride, Buffer pointer) {
- throw new UnsupportedOperationException();
- }
-
- public void glWeightPointerOES(int size, int type, int stride, int offset) {
- throw new UnsupportedOperationException();
- }
-
- // Unsupported GL11ExtensionPack methods
-
- public void glBindFramebufferOES(int target, int framebuffer) {
- throw new UnsupportedOperationException();
- }
-
- public void glBindRenderbufferOES(int target, int renderbuffer) {
- throw new UnsupportedOperationException();
- }
-
- public void glBlendEquation(int mode) {
- throw new UnsupportedOperationException();
- }
-
- public void glBlendEquationSeparate(int modeRGB, int modeAlpha) {
- throw new UnsupportedOperationException();
- }
-
- public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
- throw new UnsupportedOperationException();
- }
-
- int glCheckFramebufferStatusOES(int target) {
- throw new UnsupportedOperationException();
- }
-
- public void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int imageSize) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteFramebuffersOES(int n, int[] framebuffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteFramebuffersOES(int n, java.nio.IntBuffer framebuffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteRenderbuffersOES(int n, int[] renderbuffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glDeleteRenderbuffersOES(int n, java.nio.IntBuffer renderbuffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glFramebufferRenderbufferOES(int target, int attachment, int renderbuffertarget, int renderbuffer) {
- throw new UnsupportedOperationException();
- }
-
- public void glFramebufferTexture2DOES(int target, int attachment, int textarget, int texture, int level) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenerateMipmapOES(int target) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenFramebuffersOES(int n, int[] framebuffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenFramebuffersOES(int n, java.nio.IntBuffer framebuffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenRenderbuffersOES(int n, int[] renderbuffers, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGenRenderbuffersOES(int n, java.nio.IntBuffer renderbuffers) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFramebufferAttachmentParameterivOES(int target, int attachment, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetFramebufferAttachmentParameterivOES(int target, int attachment, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetRenderbufferParameterivOES(int target, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetRenderbufferParameterivOES(int target, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGenfv(int coord, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGenfv(int coord, int pname, java.nio.FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGeniv(int coord, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGeniv(int coord, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGenxv(int coord, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glGetTexGenxv(int coord, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public boolean glIsFramebufferOES(int framebuffer) {
- throw new UnsupportedOperationException();
- }
-
- public boolean glIsRenderbufferOES(int renderbuffer) {
- throw new UnsupportedOperationException();
- }
-
- public void glRenderbufferStorageOES(int target, int internalformat, int width, int height) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenf(int coord, int pname, float param) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenfv(int coord, int pname, float[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenfv(int coord, int pname, java.nio.FloatBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGeni(int coord, int pname, int param) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGeniv(int coord, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGeniv(int coord, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenx(int coord, int pname, int param) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenxv(int coord, int pname, int[] params, int offset) {
- throw new UnsupportedOperationException();
- }
-
- public void glTexGenxv(int coord, int pname, java.nio.IntBuffer params) {
- throw new UnsupportedOperationException();
- }
+ protected GL10 mgl;
+ protected GL10Ext mgl10Ext;
+ protected GL11 mgl11;
+ protected GL11Ext mgl11Ext;
+ protected GL11ExtensionPack mgl11ExtensionPack;
}
diff --git a/opengl/libagl/fixed_asm.S b/opengl/libagl/fixed_asm.S
index 6cbc56f..05044f2 100644
--- a/opengl/libagl/fixed_asm.S
+++ b/opengl/libagl/fixed_asm.S
@@ -20,7 +20,9 @@
.align
.global gglFloatToFixed
+ .type gglFloatToFixed, %function
.global gglFloatToFixedFast
+ .type gglFloatToFixedFast, %function
/*
diff --git a/opengl/libagl/iterators.S b/opengl/libagl/iterators.S
index daf2937..8c86482 100644
--- a/opengl/libagl/iterators.S
+++ b/opengl/libagl/iterators.S
@@ -21,6 +21,7 @@
.arm
.global iterators0032
+ .type iterators0032, %function
/*
* iterators0032
diff --git a/opengl/libs/Android.mk b/opengl/libs/Android.mk
index 6d20e80..7353385 100644
--- a/opengl/libs/Android.mk
+++ b/opengl/libs/Android.mk
@@ -120,3 +120,33 @@
endif
include $(BUILD_SHARED_LIBRARY)
+
+###############################################################################
+# Build the ETC1 host static library
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ ETC1/etc1.cpp \
+#
+
+LOCAL_LDLIBS := -lpthread -ldl
+LOCAL_MODULE:= libETC1
+
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+###############################################################################
+# Build the ETC1 device library
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ ETC1/etc1.cpp \
+#
+
+LOCAL_LDLIBS := -lpthread -ldl
+LOCAL_MODULE:= libETC1
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/opengl/libs/ETC1/etc1.cpp b/opengl/libs/ETC1/etc1.cpp
new file mode 100644
index 0000000..5ed2c3c
--- /dev/null
+++ b/opengl/libs/ETC1/etc1.cpp
@@ -0,0 +1,670 @@
+// Copyright 2009 Google Inc.
+//
+// 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 <ETC1/etc1.h>
+
+#include <string.h>
+
+/* From http://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt
+
+ The number of bits that represent a 4x4 texel block is 64 bits if
+ <internalformat> is given by ETC1_RGB8_OES.
+
+ The data for a block is a number of bytes,
+
+ {q0, q1, q2, q3, q4, q5, q6, q7}
+
+ where byte q0 is located at the lowest memory address and q7 at
+ the highest. The 64 bits specifying the block is then represented
+ by the following 64 bit integer:
+
+ int64bit = 256*(256*(256*(256*(256*(256*(256*q0+q1)+q2)+q3)+q4)+q5)+q6)+q7;
+
+ ETC1_RGB8_OES:
+
+ a) bit layout in bits 63 through 32 if diffbit = 0
+
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ -----------------------------------------------
+ | base col1 | base col2 | base col1 | base col2 |
+ | R1 (4bits)| R2 (4bits)| G1 (4bits)| G2 (4bits)|
+ -----------------------------------------------
+
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ ---------------------------------------------------
+ | base col1 | base col2 | table | table |diff|flip|
+ | B1 (4bits)| B2 (4bits)| cw 1 | cw 2 |bit |bit |
+ ---------------------------------------------------
+
+
+ b) bit layout in bits 63 through 32 if diffbit = 1
+
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ -----------------------------------------------
+ | base col1 | dcol 2 | base col1 | dcol 2 |
+ | R1' (5 bits) | dR2 | G1' (5 bits) | dG2 |
+ -----------------------------------------------
+
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ ---------------------------------------------------
+ | base col 1 | dcol 2 | table | table |diff|flip|
+ | B1' (5 bits) | dB2 | cw 1 | cw 2 |bit |bit |
+ ---------------------------------------------------
+
+
+ c) bit layout in bits 31 through 0 (in both cases)
+
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ -----------------------------------------------
+ | most significant pixel index bits |
+ | p| o| n| m| l| k| j| i| h| g| f| e| d| c| b| a|
+ -----------------------------------------------
+
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ --------------------------------------------------
+ | least significant pixel index bits |
+ | p| o| n| m| l| k| j| i| h| g| f| e| d| c | b | a |
+ --------------------------------------------------
+
+
+ Add table 3.17.2: Intensity modifier sets for ETC1 compressed textures:
+
+ table codeword modifier table
+ ------------------ ----------------------
+ 0 -8 -2 2 8
+ 1 -17 -5 5 17
+ 2 -29 -9 9 29
+ 3 -42 -13 13 42
+ 4 -60 -18 18 60
+ 5 -80 -24 24 80
+ 6 -106 -33 33 106
+ 7 -183 -47 47 183
+
+
+ Add table 3.17.3 Mapping from pixel index values to modifier values for
+ ETC1 compressed textures:
+
+ pixel index value
+ ---------------
+ msb lsb resulting modifier value
+ ----- ----- -------------------------
+ 1 1 -b (large negative value)
+ 1 0 -a (small negative value)
+ 0 0 a (small positive value)
+ 0 1 b (large positive value)
+
+
+ */
+
+static const int kModifierTable[] = {
+/* 0 */2, 8, -2, -8,
+/* 1 */5, 17, -5, -17,
+/* 2 */9, 29, -9, -29,
+/* 3 */13, 42, -13, -42,
+/* 4 */18, 60, -18, -60,
+/* 5 */24, 80, -24, -80,
+/* 6 */33, 106, -33, -106,
+/* 7 */47, 183, -47, -183 };
+
+static const int kLookup[8] = { 0, 1, 2, 3, -4, -3, -2, -1 };
+
+static inline etc1_byte clamp(int x) {
+ return (etc1_byte) (x >= 0 ? (x < 255 ? x : 255) : 0);
+}
+
+static
+inline int convert4To8(int b) {
+ int c = b & 0xf;
+ return (c << 4) | c;
+}
+
+static
+inline int convert5To8(int b) {
+ int c = b & 0x1f;
+ return (c << 3) | (c >> 2);
+}
+
+static
+inline int convert6To8(int b) {
+ int c = b & 0x3f;
+ return (c << 2) | (c >> 4);
+}
+
+static
+inline int divideBy255(int d) {
+ return (d + 128 + (d >> 8)) >> 8;
+}
+
+static
+inline int convert8To4(int b) {
+ int c = b & 0xff;
+ return divideBy255(b * 15);
+}
+
+static
+inline int convert8To5(int b) {
+ int c = b & 0xff;
+ return divideBy255(b * 31);
+}
+
+static
+inline int convertDiff(int base, int diff) {
+ return convert5To8((0x1f & base) + kLookup[0x7 & diff]);
+}
+
+static
+void decode_subblock(etc1_byte* pOut, int r, int g, int b, const int* table,
+ etc1_uint32 low, bool second, bool flipped) {
+ int baseX = 0;
+ int baseY = 0;
+ if (second) {
+ if (flipped) {
+ baseY = 2;
+ } else {
+ baseX = 2;
+ }
+ }
+ for (int i = 0; i < 8; i++) {
+ int x, y;
+ if (flipped) {
+ x = baseX + (i >> 1);
+ y = baseY + (i & 1);
+ } else {
+ x = baseX + (i >> 2);
+ y = baseY + (i & 3);
+ }
+ int k = y + (x * 4);
+ int offset = ((low >> k) & 1) | ((low >> (k + 15)) & 2);
+ int delta = table[offset];
+ etc1_byte* q = pOut + 3 * (x + 4 * y);
+ *q++ = clamp(r + delta);
+ *q++ = clamp(g + delta);
+ *q++ = clamp(b + delta);
+ }
+}
+
+// Input is an ETC1 compressed version of the data.
+// Output is a 4 x 4 square of 3-byte pixels in form R, G, B
+
+void etc1_decode_block(const etc1_byte* pIn, etc1_byte* pOut) {
+ etc1_uint32 high = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+ etc1_uint32 low = (pIn[4] << 24) | (pIn[5] << 16) | (pIn[6] << 8) | pIn[7];
+ int r1, r2, g1, g2, b1, b2;
+ if (high & 2) {
+ // differential
+ int rBase = high >> 27;
+ int gBase = high >> 19;
+ int bBase = high >> 11;
+ r1 = convert5To8(rBase);
+ r2 = convertDiff(rBase, high >> 24);
+ g1 = convert5To8(gBase);
+ g2 = convertDiff(gBase, high >> 16);
+ b1 = convert5To8(bBase);
+ b2 = convertDiff(bBase, high >> 8);
+ } else {
+ // not differential
+ r1 = convert4To8(high >> 28);
+ r2 = convert4To8(high >> 24);
+ g1 = convert4To8(high >> 20);
+ g2 = convert4To8(high >> 16);
+ b1 = convert4To8(high >> 12);
+ b2 = convert4To8(high >> 8);
+ }
+ int tableIndexA = 7 & (high >> 5);
+ int tableIndexB = 7 & (high >> 2);
+ const int* tableA = kModifierTable + tableIndexA * 4;
+ const int* tableB = kModifierTable + tableIndexB * 4;
+ bool flipped = (high & 1) != 0;
+ decode_subblock(pOut, r1, g1, b1, tableA, low, false, flipped);
+ decode_subblock(pOut, r2, g2, b2, tableB, low, true, flipped);
+}
+
+typedef struct {
+ etc1_uint32 high;
+ etc1_uint32 low;
+ etc1_uint32 score; // Lower is more accurate
+} etc_compressed;
+
+static
+inline void take_best(etc_compressed* a, const etc_compressed* b) {
+ if (a->score > b->score) {
+ *a = *b;
+ }
+}
+
+static
+void etc_average_colors_subblock(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc1_byte* pColors, bool flipped, bool second) {
+ int r = 0;
+ int g = 0;
+ int b = 0;
+
+ if (flipped) {
+ int by = 0;
+ if (second) {
+ by = 2;
+ }
+ for (int y = 0; y < 2; y++) {
+ int yy = by + y;
+ for (int x = 0; x < 4; x++) {
+ int i = x + 4 * yy;
+ if (inMask & (1 << i)) {
+ const etc1_byte* p = pIn + i * 3;
+ r += *(p++);
+ g += *(p++);
+ b += *(p++);
+ }
+ }
+ }
+ } else {
+ int bx = 0;
+ if (second) {
+ bx = 2;
+ }
+ for (int y = 0; y < 4; y++) {
+ for (int x = 0; x < 2; x++) {
+ int xx = bx + x;
+ int i = xx + 4 * y;
+ if (inMask & (1 << i)) {
+ const etc1_byte* p = pIn + i * 3;
+ r += *(p++);
+ g += *(p++);
+ b += *(p++);
+ }
+ }
+ }
+ }
+ pColors[0] = (etc1_byte)((r + 4) >> 3);
+ pColors[1] = (etc1_byte)((g + 4) >> 3);
+ pColors[2] = (etc1_byte)((b + 4) >> 3);
+}
+
+static
+inline int square(int x) {
+ return x * x;
+}
+
+static etc1_uint32 chooseModifier(const etc1_byte* pBaseColors,
+ const etc1_byte* pIn, etc1_uint32 *pLow, int bitIndex,
+ const int* pModifierTable) {
+ etc1_uint32 bestScore = ~0;
+ int bestIndex = 0;
+ int pixelR = pIn[0];
+ int pixelG = pIn[1];
+ int pixelB = pIn[2];
+ int r = pBaseColors[0];
+ int g = pBaseColors[1];
+ int b = pBaseColors[2];
+ for (int i = 0; i < 4; i++) {
+ int modifier = pModifierTable[i];
+ int decodedG = clamp(g + modifier);
+ etc1_uint32 score = (etc1_uint32) (6 * square(decodedG - pixelG));
+ if (score >= bestScore) {
+ continue;
+ }
+ int decodedR = clamp(r + modifier);
+ score += (etc1_uint32) (3 * square(decodedR - pixelR));
+ if (score >= bestScore) {
+ continue;
+ }
+ int decodedB = clamp(b + modifier);
+ score += (etc1_uint32) square(decodedB - pixelB);
+ if (score < bestScore) {
+ bestScore = score;
+ bestIndex = i;
+ }
+ }
+ etc1_uint32 lowMask = (((bestIndex >> 1) << 16) | (bestIndex & 1))
+ << bitIndex;
+ *pLow |= lowMask;
+ return bestScore;
+}
+
+static
+void etc_encode_subblock_helper(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc_compressed* pCompressed, bool flipped, bool second,
+ const etc1_byte* pBaseColors, const int* pModifierTable) {
+ int score = pCompressed->score;
+ if (flipped) {
+ int by = 0;
+ if (second) {
+ by = 2;
+ }
+ for (int y = 0; y < 2; y++) {
+ int yy = by + y;
+ for (int x = 0; x < 4; x++) {
+ int i = x + 4 * yy;
+ if (inMask & (1 << i)) {
+ score += chooseModifier(pBaseColors, pIn + i * 3,
+ &pCompressed->low, yy + x * 4, pModifierTable);
+ }
+ }
+ }
+ } else {
+ int bx = 0;
+ if (second) {
+ bx = 2;
+ }
+ for (int y = 0; y < 4; y++) {
+ for (int x = 0; x < 2; x++) {
+ int xx = bx + x;
+ int i = xx + 4 * y;
+ if (inMask & (1 << i)) {
+ score += chooseModifier(pBaseColors, pIn + i * 3,
+ &pCompressed->low, y + xx * 4, pModifierTable);
+ }
+ }
+ }
+ }
+ pCompressed->score = score;
+}
+
+static bool inRange4bitSigned(int color) {
+ return color >= -4 && color <= 3;
+}
+
+static void etc_encodeBaseColors(etc1_byte* pBaseColors,
+ const etc1_byte* pColors, etc_compressed* pCompressed) {
+ int r1, g1, b1, r2, g2, b2; // 8 bit base colors for sub-blocks
+ bool differential;
+ {
+ int r51 = convert8To5(pColors[0]);
+ int g51 = convert8To5(pColors[1]);
+ int b51 = convert8To5(pColors[2]);
+ int r52 = convert8To5(pColors[3]);
+ int g52 = convert8To5(pColors[4]);
+ int b52 = convert8To5(pColors[5]);
+
+ r1 = convert5To8(r51);
+ g1 = convert5To8(g51);
+ b1 = convert5To8(b51);
+
+ int dr = r52 - r51;
+ int dg = g52 - g51;
+ int db = b52 - b51;
+
+ differential = inRange4bitSigned(dr) && inRange4bitSigned(dg)
+ && inRange4bitSigned(db);
+ if (differential) {
+ r2 = convert5To8(r51 + dr);
+ g2 = convert5To8(g51 + dg);
+ b2 = convert5To8(b51 + db);
+ pCompressed->high |= (r51 << 27) | ((7 & dr) << 24) | (g51 << 19)
+ | ((7 & dg) << 16) | (b51 << 11) | ((7 & db) << 8) | 2;
+ }
+ }
+
+ if (!differential) {
+ int r41 = convert8To4(pColors[0]);
+ int g41 = convert8To4(pColors[1]);
+ int b41 = convert8To4(pColors[2]);
+ int r42 = convert8To4(pColors[3]);
+ int g42 = convert8To4(pColors[4]);
+ int b42 = convert8To4(pColors[5]);
+ r1 = convert4To8(r41);
+ g1 = convert4To8(g41);
+ b1 = convert4To8(b41);
+ r2 = convert4To8(r42);
+ g2 = convert4To8(g42);
+ b2 = convert4To8(b42);
+ pCompressed->high |= (r41 << 28) | (r42 << 24) | (g41 << 20) | (g42
+ << 16) | (b41 << 12) | (b42 << 8);
+ }
+ pBaseColors[0] = r1;
+ pBaseColors[1] = g1;
+ pBaseColors[2] = b1;
+ pBaseColors[3] = r2;
+ pBaseColors[4] = g2;
+ pBaseColors[5] = b2;
+}
+
+static
+void etc_encode_block_helper(const etc1_byte* pIn, etc1_uint32 inMask,
+ const etc1_byte* pColors, etc_compressed* pCompressed, bool flipped) {
+ pCompressed->score = ~0;
+ pCompressed->high = (flipped ? 1 : 0);
+ pCompressed->low = 0;
+
+ etc1_byte pBaseColors[6];
+
+ etc_encodeBaseColors(pBaseColors, pColors, pCompressed);
+
+ int originalHigh = pCompressed->high;
+
+ const int* pModifierTable = kModifierTable;
+ for (int i = 0; i < 8; i++, pModifierTable += 4) {
+ etc_compressed temp;
+ temp.score = 0;
+ temp.high = originalHigh | (i << 5);
+ temp.low = 0;
+ etc_encode_subblock_helper(pIn, inMask, &temp, flipped, false,
+ pBaseColors, pModifierTable);
+ take_best(pCompressed, &temp);
+ }
+ pModifierTable = kModifierTable;
+ etc_compressed firstHalf = *pCompressed;
+ for (int i = 0; i < 8; i++, pModifierTable += 4) {
+ etc_compressed temp;
+ temp.score = firstHalf.score;
+ temp.high = firstHalf.high | (i << 2);
+ temp.low = firstHalf.low;
+ etc_encode_subblock_helper(pIn, inMask, &temp, flipped, true,
+ pBaseColors + 3, pModifierTable);
+ if (i == 0) {
+ *pCompressed = temp;
+ } else {
+ take_best(pCompressed, &temp);
+ }
+ }
+}
+
+static void writeBigEndian(etc1_byte* pOut, etc1_uint32 d) {
+ pOut[0] = (etc1_byte)(d >> 24);
+ pOut[1] = (etc1_byte)(d >> 16);
+ pOut[2] = (etc1_byte)(d >> 8);
+ pOut[3] = (etc1_byte) d;
+}
+
+// Input is a 4 x 4 square of 3-byte pixels in form R, G, B
+// inmask is a 16-bit mask where bit (1 << (x + y * 4)) tells whether the corresponding (x,y)
+// pixel is valid or not. Invalid pixel color values are ignored when compressing.
+// Output is an ETC1 compressed version of the data.
+
+void etc1_encode_block(const etc1_byte* pIn, etc1_uint32 inMask,
+ etc1_byte* pOut) {
+ etc1_byte colors[6];
+ etc1_byte flippedColors[6];
+ etc_average_colors_subblock(pIn, inMask, colors, false, false);
+ etc_average_colors_subblock(pIn, inMask, colors + 3, false, true);
+ etc_average_colors_subblock(pIn, inMask, flippedColors, true, false);
+ etc_average_colors_subblock(pIn, inMask, flippedColors + 3, true, true);
+
+ etc_compressed a, b;
+ etc_encode_block_helper(pIn, inMask, colors, &a, false);
+ etc_encode_block_helper(pIn, inMask, flippedColors, &b, true);
+ take_best(&a, &b);
+ writeBigEndian(pOut, a.high);
+ writeBigEndian(pOut + 4, a.low);
+}
+
+// Return the size of the encoded image data (does not include size of PKM header).
+
+etc1_uint32 etc1_get_encoded_data_size(etc1_uint32 width, etc1_uint32 height) {
+ return (((width + 3) & ~3) * ((height + 3) & ~3)) >> 1;
+}
+
+// Encode an entire image.
+// pIn - pointer to the image data. Formatted such that the Red component of
+// pixel (x,y) is at pIn + pixelSize * x + stride * y + redOffset;
+// pOut - pointer to encoded data. Must be large enough to store entire encoded image.
+
+int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride, etc1_byte* pOut) {
+ if (pixelSize < 2 || pixelSize > 3) {
+ return -1;
+ }
+ static const unsigned short kYMask[] = { 0x0, 0xf, 0xff, 0xfff, 0xffff };
+ static const unsigned short kXMask[] = { 0x0, 0x1111, 0x3333, 0x7777,
+ 0xffff };
+ etc1_byte block[ETC1_DECODED_BLOCK_SIZE];
+ etc1_byte encoded[ETC1_ENCODED_BLOCK_SIZE];
+
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+
+ for (etc1_uint32 y = 0; y < encodedHeight; y += 4) {
+ etc1_uint32 yEnd = height - y;
+ if (yEnd > 4) {
+ yEnd = 4;
+ }
+ int ymask = kYMask[yEnd];
+ for (etc1_uint32 x = 0; x < encodedWidth; x += 4) {
+ etc1_uint32 xEnd = width - x;
+ if (xEnd > 4) {
+ xEnd = 4;
+ }
+ int mask = ymask & kXMask[xEnd];
+ for (etc1_uint32 cy = 0; cy < yEnd; cy++) {
+ etc1_byte* q = block + (cy * 4) * 3;
+ const etc1_byte* p = pIn + pixelSize * x + stride * (y + cy);
+ if (pixelSize == 3) {
+ memcpy(q, p, xEnd * 3);
+ } else {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ int pixel = (p[1] << 8) | p[0];
+ *q++ = convert5To8(pixel >> 11);
+ *q++ = convert6To8(pixel >> 5);
+ *q++ = convert5To8(pixel);
+ p += pixelSize;
+ }
+ }
+ }
+ etc1_encode_block(block, mask, encoded);
+ memcpy(pOut, encoded, sizeof(encoded));
+ pOut += sizeof(encoded);
+ }
+ }
+ return 0;
+}
+
+// Decode an entire image.
+// pIn - pointer to encoded data.
+// pOut - pointer to the image data. Will be written such that the Red component of
+// pixel (x,y) is at pIn + pixelSize * x + stride * y + redOffset. Must be
+// large enough to store entire image.
+
+
+int etc1_decode_image(const etc1_byte* pIn, etc1_byte* pOut,
+ etc1_uint32 width, etc1_uint32 height,
+ etc1_uint32 pixelSize, etc1_uint32 stride) {
+ if (pixelSize < 2 || pixelSize > 3) {
+ return -1;
+ }
+ etc1_byte block[ETC1_DECODED_BLOCK_SIZE];
+
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+
+ for (etc1_uint32 y = 0; y < encodedHeight; y += 4) {
+ etc1_uint32 yEnd = height - y;
+ if (yEnd > 4) {
+ yEnd = 4;
+ }
+ for (etc1_uint32 x = 0; x < encodedWidth; x += 4) {
+ etc1_uint32 xEnd = width - x;
+ if (xEnd > 4) {
+ xEnd = 4;
+ }
+ etc1_decode_block(pIn, block);
+ pIn += ETC1_ENCODED_BLOCK_SIZE;
+ for (etc1_uint32 cy = 0; cy < yEnd; cy++) {
+ const etc1_byte* q = block + (cy * 4) * 3;
+ etc1_byte* p = pOut + pixelSize * x + stride * (y + cy);
+ if (pixelSize == 3) {
+ memcpy(p, q, xEnd * 3);
+ } else {
+ for (etc1_uint32 cx = 0; cx < xEnd; cx++) {
+ etc1_byte r = *q++;
+ etc1_byte g = *q++;
+ etc1_byte b = *q++;
+ etc1_uint32 pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
+ *p++ = (etc1_byte) pixel;
+ *p++ = (etc1_byte) (pixel >> 8);
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+static const char kMagic[] = { 'P', 'K', 'M', ' ', '1', '0' };
+
+static const etc1_uint32 ETC1_PKM_FORMAT_OFFSET = 6;
+static const etc1_uint32 ETC1_PKM_ENCODED_WIDTH_OFFSET = 8;
+static const etc1_uint32 ETC1_PKM_ENCODED_HEIGHT_OFFSET = 10;
+static const etc1_uint32 ETC1_PKM_WIDTH_OFFSET = 12;
+static const etc1_uint32 ETC1_PKM_HEIGHT_OFFSET = 14;
+
+static const etc1_uint32 ETC1_RGB_NO_MIPMAPS = 0;
+
+static void writeBEUint16(etc1_byte* pOut, etc1_uint32 data) {
+ pOut[0] = (etc1_byte) (data >> 8);
+ pOut[1] = (etc1_byte) data;
+}
+
+static etc1_uint32 readBEUint16(const etc1_byte* pIn) {
+ return (pIn[0] << 8) | pIn[1];
+}
+
+// Format a PKM header
+
+void etc1_pkm_format_header(etc1_byte* pHeader, etc1_uint32 width, etc1_uint32 height) {
+ memcpy(pHeader, kMagic, sizeof(kMagic));
+ etc1_uint32 encodedWidth = (width + 3) & ~3;
+ etc1_uint32 encodedHeight = (height + 3) & ~3;
+ writeBEUint16(pHeader + ETC1_PKM_FORMAT_OFFSET, ETC1_RGB_NO_MIPMAPS);
+ writeBEUint16(pHeader + ETC1_PKM_ENCODED_WIDTH_OFFSET, encodedWidth);
+ writeBEUint16(pHeader + ETC1_PKM_ENCODED_HEIGHT_OFFSET, encodedHeight);
+ writeBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET, width);
+ writeBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET, height);
+}
+
+// Check if a PKM header is correctly formatted.
+
+etc1_bool etc1_pkm_is_valid(const etc1_byte* pHeader) {
+ if (memcmp(pHeader, kMagic, sizeof(kMagic))) {
+ return false;
+ }
+ etc1_uint32 format = readBEUint16(pHeader + ETC1_PKM_FORMAT_OFFSET);
+ etc1_uint32 encodedWidth = readBEUint16(pHeader + ETC1_PKM_ENCODED_WIDTH_OFFSET);
+ etc1_uint32 encodedHeight = readBEUint16(pHeader + ETC1_PKM_ENCODED_HEIGHT_OFFSET);
+ etc1_uint32 width = readBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET);
+ etc1_uint32 height = readBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET);
+ return format == ETC1_RGB_NO_MIPMAPS &&
+ encodedWidth >= width && encodedWidth - width < 4 &&
+ encodedHeight >= height && encodedHeight - height < 4;
+}
+
+// Read the image width from a PKM header
+
+etc1_uint32 etc1_pkm_get_width(const etc1_byte* pHeader) {
+ return readBEUint16(pHeader + ETC1_PKM_WIDTH_OFFSET);
+}
+
+// Read the image height from a PKM header
+
+etc1_uint32 etc1_pkm_get_height(const etc1_byte* pHeader){
+ return readBEUint16(pHeader + ETC1_PKM_HEIGHT_OFFSET);
+}
diff --git a/opengl/tests/fillrate/Android.mk b/opengl/tests/fillrate/Android.mk
index a7d30c2..191c59b 100644
--- a/opengl/tests/fillrate/Android.mk
+++ b/opengl/tests/fillrate/Android.mk
@@ -6,6 +6,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
+ libutils \
libEGL \
libGLESv1_CM \
libui
diff --git a/opengl/tests/finish/Android.mk b/opengl/tests/finish/Android.mk
index 5620814..aa607c6 100644
--- a/opengl/tests/finish/Android.mk
+++ b/opengl/tests/finish/Android.mk
@@ -6,6 +6,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
+ libutils \
libEGL \
libGLESv1_CM \
libui
diff --git a/opengl/tests/gl2_jni/Android.mk b/opengl/tests/gl2_jni/Android.mk
index 81247df..384966c 100644
--- a/opengl/tests/gl2_jni/Android.mk
+++ b/opengl/tests/gl2_jni/Android.mk
@@ -11,7 +11,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/opengl/tests/gl_basic/gl_basic.cpp b/opengl/tests/gl_basic/gl_basic.cpp
index 7dc2378..feb964a 100644
--- a/opengl/tests/gl_basic/gl_basic.cpp
+++ b/opengl/tests/gl_basic/gl_basic.cpp
@@ -1,32 +1,39 @@
// Simple OpenGL ES 1.x application showing how to initialize and draw something.
-#include <EGL/egl.h>
+#include <EGL/egl.h>
+
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <ui/FramebufferNativeWindow.h>
#include <ui/EGLUtils.h>
-#include <stdio.h>
+#include <stdio.h>
+
#include <stdlib.h>
#include <math.h>
using namespace android;
-
-EGLDisplay eglDisplay;
-EGLSurface eglSurface;
-EGLContext eglContext;
-GLuint texture;
-
+
+EGLDisplay eglDisplay;
+EGLSurface eglSurface;
+EGLContext eglContext;
+GLuint texture;
+
#define FIXED_ONE 0x10000
-#define ITERATIONS 50
-
-int init_gl_surface(void);
-void free_gl_surface(void);
-void init_scene(void);
-void render();
+#define ITERATIONS 50
+
+int init_gl_surface(void);
+void free_gl_surface(void);
+void init_scene(void);
+void render();
void create_texture(void);
-int readTimer(void);
+int readTimer(void);
+
+static void printGLString(const char *name, GLenum s) {
+ const char *v = (const char *) glGetString(s);
+ fprintf(stderr, "GL %s = %s\n", name, v);
+}
static void gluLookAt(float eyeX, float eyeY, float eyeZ,
float centerX, float centerY, float centerZ, float upX, float upY,
@@ -87,7 +94,6 @@
glTranslatef(-eyeX, -eyeY, -eyeZ);
}
-
void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
#define X(VAL) {VAL, #VAL}
@@ -183,125 +189,129 @@
free(configs);
return true;
}
-
-int main(int argc, char **argv)
-{
+
+int main(int argc, char **argv)
+{
int q;
- int start, end;
-
+ int start, end;
printf("Initializing EGL...\n");
-
- if(!init_gl_surface())
- {
- printf("GL initialisation failed - exiting\n");
- return 0;
- }
-
- init_scene();
-
- create_texture();
-
+ if(!init_gl_surface())
+ {
+ printf("GL initialisation failed - exiting\n");
+ return 0;
+ }
+ init_scene();
+ create_texture();
printf("Running...\n");
-
while(true) {
render();
- }
-
- free_gl_surface();
-
- return 0;
-}
-
-int init_gl_surface(void)
-{
- EGLint numConfigs = 1;
- EGLConfig myConfig = {0};
- EGLint attrib[] =
- {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_NONE
- };
-
- if ( (eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY )
- {
- printf("eglGetDisplay failed\n");
- return 0;
}
-
- if ( eglInitialize(eglDisplay, NULL, NULL) != EGL_TRUE )
- {
- printf("eglInitialize failed\n");
- return 0;
+ free_gl_surface();
+ return 0;
+}
+
+int init_gl_surface(void)
+{
+ EGLint numConfigs = 1;
+ EGLConfig myConfig = {0};
+ EGLint attrib[] =
+ {
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_NONE
+ };
+
+ if ( (eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY )
+ {
+ printf("eglGetDisplay failed\n");
+ return 0;
+ }
+
+ if ( eglInitialize(eglDisplay, NULL, NULL) != EGL_TRUE )
+ {
+ printf("eglInitialize failed\n");
+ return 0;
}
if (! printEGLConfigurations(eglDisplay)) {
printf("printEGLConfigurations failed.\n");
return 0;
- }
- EGLNativeWindowType window = android_createDisplaySurface();
- EGLUtils::selectConfigForNativeWindow(eglDisplay, attrib, window, &myConfig);
-
+ }
+
+ EGLNativeWindowType window = android_createDisplaySurface();
+ EGLUtils::selectConfigForNativeWindow(eglDisplay, attrib, window, &myConfig);
+
if ( (eglSurface = eglCreateWindowSurface(eglDisplay, myConfig,
- window, 0)) == EGL_NO_SURFACE )
- {
- printf("eglCreateWindowSurface failed\n");
- return 0;
- }
-
- if ( (eglContext = eglCreateContext(eglDisplay, myConfig, 0, 0)) == EGL_NO_CONTEXT )
- {
- printf("eglCreateContext failed\n");
- return 0;
- }
-
- if ( eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) != EGL_TRUE )
- {
- printf("eglMakeCurrent failed\n");
- return 0;
- }
-
- return 1;
-}
-
-void free_gl_surface(void)
-{
- if (eglDisplay != EGL_NO_DISPLAY)
- {
- eglMakeCurrent( EGL_NO_DISPLAY, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT );
- eglDestroyContext( eglDisplay, eglContext );
- eglDestroySurface( eglDisplay, eglSurface );
- eglTerminate( eglDisplay );
- eglDisplay = EGL_NO_DISPLAY;
- }
-}
-
-void init_scene(void)
-{
+ window, 0)) == EGL_NO_SURFACE )
+ {
+ printf("eglCreateWindowSurface failed\n");
+ return 0;
+ }
+
+ if ( (eglContext = eglCreateContext(eglDisplay, myConfig, 0, 0)) == EGL_NO_CONTEXT )
+ {
+ printf("eglCreateContext failed\n");
+ return 0;
+ }
+
+ if ( eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) != EGL_TRUE )
+ {
+ printf("eglMakeCurrent failed\n");
+ return 0;
+ }
+
+ int w, h;
+
+ eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &w);
+ checkEglError("eglQuerySurface");
+ eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &h);
+ checkEglError("eglQuerySurface");
+ GLint dim = w < h ? w : h;
+
+ fprintf(stderr, "Window dimensions: %d x %d\n", w, h);
+
+ printGLString("Version", GL_VERSION);
+ printGLString("Vendor", GL_VENDOR);
+ printGLString("Renderer", GL_RENDERER);
+ printGLString("Extensions", GL_EXTENSIONS);
+
+ return 1;
+}
+
+void free_gl_surface(void)
+{
+ if (eglDisplay != EGL_NO_DISPLAY)
+ {
+ eglMakeCurrent( EGL_NO_DISPLAY, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT );
+ eglDestroyContext( eglDisplay, eglContext );
+ eglDestroySurface( eglDisplay, eglSurface );
+ eglTerminate( eglDisplay );
+ eglDisplay = EGL_NO_DISPLAY;
+ }
+}
+
+void init_scene(void)
+{
glDisable(GL_DITHER);
glEnable(GL_CULL_FACE);
-
float ratio = 320.0f / 480.0f;
glViewport(0, 0, 320, 480);
-
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustumf(-ratio, ratio, -1, 1, 1, 10);
-
- glMatrixMode(GL_MODELVIEW);
+ glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
0, 0, 3, // eye
0, 0, 0, // center
0, 1, 0); // up
-
- glEnable(GL_TEXTURE_2D);
- glEnableClientState(GL_VERTEX_ARRAY);
+ glEnable(GL_TEXTURE_2D);
+ glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-}
-
-void create_texture(void)
-{
+}
+
+void create_texture(void)
+{
const unsigned int on = 0xff0000ff;
const unsigned int off = 0xffffffff;
const unsigned int pixels[] =
@@ -314,44 +324,42 @@
off, on, off, on, off, on, off, on,
on, off, on, off, on, off, on, off,
off, on, off, on, off, on, off, on,
- };
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-}
-
-void render()
-{
+ };
+
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+}
+
+void render()
+{
int i, j;
- int quads = 1;
-
- const GLfloat vertices[] = {
- -1, -1, 0,
- 1, -1, 0,
- 1, 1, 0,
- -1, 1, 0
- };
-
- const GLfixed texCoords[] = {
- 0, 0,
- FIXED_ONE, 0,
- FIXED_ONE, FIXED_ONE,
- 0, FIXED_ONE
- };
-
+ int quads = 1;
+
+ const GLfloat vertices[] = {
+ -1, -1, 0,
+ 1, -1, 0,
+ 1, 1, 0,
+ -1, 1, 0
+ };
+
+ const GLfixed texCoords[] = {
+ 0, 0,
+ FIXED_ONE, 0,
+ FIXED_ONE, FIXED_ONE,
+ 0, FIXED_ONE
+ };
+
const GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
-
- glVertexPointer(3, GL_FLOAT, 0, vertices);
+
+ glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FIXED, 0, texCoords);
-
glClearColor(1.0, 1.0, 1.0, 1.0);
-
int nelem = sizeof(indices)/sizeof(indices[0]);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, nelem, GL_UNSIGNED_SHORT, indices);
- eglSwapBuffers(eglDisplay, eglSurface);
-}
-
+ eglSwapBuffers(eglDisplay, eglSurface);
+}
diff --git a/opengl/tests/gl_jni/Android.mk b/opengl/tests/gl_jni/Android.mk
index 4029fa1..f1bd31d 100644
--- a/opengl/tests/gl_jni/Android.mk
+++ b/opengl/tests/gl_jni/Android.mk
@@ -11,7 +11,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/opengl/tests/gldual/Android.mk b/opengl/tests/gldual/Android.mk
index e73c249..995a5d7 100644
--- a/opengl/tests/gldual/Android.mk
+++ b/opengl/tests/gldual/Android.mk
@@ -11,7 +11,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/opengl/tests/gldual/res/layout/gldual_activity.xml b/opengl/tests/gldual/res/layout/gldual_activity.xml
index f2d59c7..d75acbc 100644
--- a/opengl/tests/gldual/res/layout/gldual_activity.xml
+++ b/opengl/tests/gldual/res/layout/gldual_activity.xml
@@ -17,14 +17,14 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<android.opengl.GLSurfaceView android:id="@+id/gl1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<com.android.gldual.GLDualGL2View android:id="@+id/gl2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
diff --git a/opengl/tests/swapinterval/Android.mk b/opengl/tests/swapinterval/Android.mk
index 619447c..9a4145e 100644
--- a/opengl/tests/swapinterval/Android.mk
+++ b/opengl/tests/swapinterval/Android.mk
@@ -6,6 +6,7 @@
LOCAL_SHARED_LIBRARIES := \
libcutils \
+ libutils \
libEGL \
libGLESv1_CM \
libui
diff --git a/packages/SettingsProvider/Android.mk b/packages/SettingsProvider/Android.mk
index 724e988..bf4ab1b 100644
--- a/packages/SettingsProvider/Android.mk
+++ b/packages/SettingsProvider/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml
index 1e1d729..a542518 100644
--- a/packages/SettingsProvider/AndroidManifest.xml
+++ b/packages/SettingsProvider/AndroidManifest.xml
@@ -9,7 +9,8 @@
android:process="system"
android:backupAgent="SettingsBackupAgent"
android:killAfterRestore="false"
- android:icon="@drawable/ic_launcher_settings">
+ android:icon="@drawable/ic_launcher_settings"
+ android:neverEncrypt="true">
<provider android:name="SettingsProvider" android:authorities="settings"
android:multiprocess="false"
diff --git a/packages/SettingsProvider/res/values-da/strings.xml b/packages/SettingsProvider/res/values-da/strings.xml
index f0afc0b..bc160f3 100644
--- a/packages/SettingsProvider/res/values-da/strings.xml
+++ b/packages/SettingsProvider/res/values-da/strings.xml
@@ -15,5 +15,5 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4567566098528588863">"Indstillingslagring"</string>
+ <string name="app_label" msgid="4567566098528588863">"Lagring af indstillinger"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index ab93d8c8..7686aa0 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -51,4 +51,10 @@
<!-- Default value for whether or not to pulse the notification LED when there is a
pending notification -->
<bool name="def_notification_pulse">true</bool>
+
+ <bool name="def_mount_play_notification_snd">true</bool>
+ <bool name="def_mount_ums_autostart">false</bool>
+ <bool name="def_mount_ums_prompt">true</bool>
+ <bool name="def_mount_ums_notify_enabled">true</bool>
+
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index ac2da97..a1dca7e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -71,7 +71,7 @@
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 44;
+ private static final int DATABASE_VERSION = 46;
private Context mContext;
@@ -100,13 +100,6 @@
createSecureTable(db);
- db.execSQL("CREATE TABLE gservices (" +
- "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
- "name TEXT UNIQUE ON CONFLICT REPLACE," +
- "value TEXT" +
- ");");
- db.execSQL("CREATE INDEX gservicesIndex1 ON gservices (name);");
-
db.execSQL("CREATE TABLE bluetooth_devices (" +
"_id INTEGER PRIMARY KEY," +
"name TEXT," +
@@ -557,6 +550,37 @@
upgradeVersion = 44;
}
+ if (upgradeVersion == 44) {
+ /*
+ * Gservices was moved into vendor/google.
+ */
+ db.execSQL("DROP TABLE IF EXISTS gservices");
+ db.execSQL("DROP INDEX IF EXISTS gservicesIndex1");
+ upgradeVersion = 45;
+ }
+
+ if (upgradeVersion == 45) {
+ /*
+ * New settings for MountService
+ */
+ db.beginTransaction();
+ try {
+ db.execSQL("INSERT INTO secure(name,value) values('" +
+ Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND + "','1');");
+ db.execSQL("INSERT INTO secure(name,value) values('" +
+ Settings.Secure.MOUNT_UMS_AUTOSTART + "','0');");
+ db.execSQL("INSERT INTO secure(name,value) values('" +
+ Settings.Secure.MOUNT_UMS_PROMPT + "','1');");
+ db.execSQL("INSERT INTO secure(name,value) values('" +
+ Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED + "','1');");
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ upgradeVersion = 46;
+ }
+
+
if (upgradeVersion != currentVersion) {
Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
+ ", must wipe the settings provider");
@@ -885,7 +909,19 @@
"1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);
loadSecure35Settings(stmt);
-
+
+ loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,
+ R.bool.def_mount_play_notification_snd);
+
+ loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART,
+ R.bool.def_mount_ums_autostart);
+
+ loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_PROMPT,
+ R.bool.def_mount_ums_prompt);
+
+ loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
+ R.bool.def_mount_ums_notify_enabled);
+
stmt.close();
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index d9f9041..265d138 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -75,8 +75,7 @@
throw new UnsupportedOperationException("WHERE clause not supported: " + url);
} else {
this.table = url.getPathSegments().get(0);
- if ("gservices".equals(this.table) || "system".equals(this.table)
- || "secure".equals(this.table)) {
+ if ("system".equals(this.table) || "secure".equals(this.table)) {
this.where = Settings.NameValueTable.NAME + "=?";
this.args = new String[] { url.getPathSegments().get(1) };
} else {
@@ -110,8 +109,7 @@
throw new IllegalArgumentException("Invalid URI: " + tableUri);
}
String table = tableUri.getPathSegments().get(0);
- if ("gservices".equals(table) || "system".equals(table)
- || "secure".equals(table)) {
+ if ("system".equals(table) || "secure".equals(table)) {
String name = values.getAsString(Settings.NameValueTable.NAME);
return Uri.withAppendedPath(tableUri, name);
} else {
@@ -139,8 +137,6 @@
} else if (table.equals("secure")) {
property = Settings.Secure.SYS_PROP_SETTING_VERSION;
backedUpDataChanged = true;
- } else if (table.equals("gservices")) {
- property = Settings.Gservices.SYS_PROP_SETTING_VERSION;
}
if (property != null) {
@@ -171,21 +167,12 @@
*/
private void checkWritePermissions(SqlArguments args) {
if ("secure".equals(args.table) &&
- getContext().checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SECURE_SETTINGS) !=
- PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException(
- String.format("Permission denial: writing to secure settings requires %1$s",
- android.Manifest.permission.WRITE_SECURE_SETTINGS));
-
- // TODO: Move gservices into its own provider so we don't need this nonsense.
- } else if ("gservices".equals(args.table) &&
getContext().checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_GSERVICES) !=
- PackageManager.PERMISSION_GRANTED) {
+ android.Manifest.permission.WRITE_SECURE_SETTINGS) !=
+ PackageManager.PERMISSION_GRANTED) {
throw new SecurityException(
- String.format("Permission denial: writing to gservices settings requires %1$s",
- android.Manifest.permission.WRITE_GSERVICES));
+ String.format("Permission denial: writing to secure settings requires %1$s",
+ android.Manifest.permission.WRITE_SECURE_SETTINGS));
}
}
diff --git a/packages/TtsService/Android.mk b/packages/TtsService/Android.mk
index 2737fb438..5eb6b9c 100644
--- a/packages/TtsService/Android.mk
+++ b/packages/TtsService/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files) \
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 0ec8dab..35b5675 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#define LOG_NDEBUG 0
#include <stdio.h>
#include <unistd.h>
@@ -42,8 +41,6 @@
#define FILTER_TRANSITION_FREQ 1100.0f // in Hz
#define FILTER_SHELF_SLOPE 1.0f // Q
#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.
#define USAGEMODE_PLAY_IMMEDIATELY 0
#define USAGEMODE_WRITE_TO_FILE 1
@@ -81,13 +78,19 @@
double out1;// y[n-1]
double out2;// y[n-2]
+static float fFilterLowshelfAttenuation = FILTER_LOWSHELF_ATTENUATION;
+static float fFilterTransitionFreq = FILTER_TRANSITION_FREQ;
+static float fFilterShelfSlope = FILTER_SHELF_SLOPE;
+static float fFilterGain = FILTER_GAIN;
+static bool bUseFilter = false;
+
void initializeEQ() {
- amp = float(pow(10.0, FILTER_LOWSHELF_ATTENUATION / 40.0));
- w = 2.0 * M_PI * (FILTER_TRANSITION_FREQ / DEFAULT_TTS_RATE);
+ amp = float(pow(10.0, fFilterLowshelfAttenuation / 40.0));
+ w = 2.0 * M_PI * (fFilterTransitionFreq / DEFAULT_TTS_RATE);
sinw = float(sin(w));
cosw = float(cos(w));
- beta = float(sqrt(amp)/FILTER_SHELF_SLOPE);
+ beta = float(sqrt(amp)/fFilterShelfSlope);
// initialize low-shelf parameters
b0 = amp * ((amp+1.0F) - ((amp-1.0F)*cosw) + (beta*sinw));
@@ -97,9 +100,9 @@
a1 = 2.0F * ((amp-1.0F) + ((amp+1.0F)*cosw));
a2 = -((amp+1.0F) + ((amp-1.0F)*cosw) - (beta*sinw));
- m_fa = FILTER_GAIN * b0/a0;
- m_fb = FILTER_GAIN * b1/a0;
- m_fc = FILTER_GAIN * b2/a0;
+ m_fa = fFilterGain * b0/a0;
+ m_fb = fFilterGain * b1/a0;
+ m_fc = fFilterGain * b2/a0;
m_fd = a1/a0;
m_fe = a2/a0;
}
@@ -231,9 +234,8 @@
mAudioOut = NULL;
} else {
//LOGI("AudioTrack OK");
- mAudioOut->setVolume(2.0f, 2.0f);
- mAudioOut->start();
- LOGV("AudioTrack started");
+ mAudioOut->setVolume(1.0f, 1.0f);
+ LOGV("AudioTrack ready");
}
}
};
@@ -286,7 +288,9 @@
if (bufferSize > 0) {
prepAudioTrack(pJniData, pForAfter->streamType, rate, (AudioSystem::audio_format)format, channel);
if (pJniData->mAudioOut) {
- applyFilter((int16_t*)wav, bufferSize/2);
+ if (bUseFilter) {
+ applyFilter((int16_t*)wav, bufferSize/2);
+ }
pJniData->mAudioOut->write(wav, bufferSize);
memset(wav, 0, bufferSize);
//LOGV("AudioTrack wrote: %d bytes", bufferSize);
@@ -302,7 +306,9 @@
return TTS_CALLBACK_HALT;
}
if (bufferSize > 0){
- applyFilter((int16_t*)wav, bufferSize/2);
+ if (bUseFilter) {
+ applyFilter((int16_t*)wav, bufferSize/2);
+ }
fwrite(wav, 1, bufferSize, pForAfter->outputFile);
memset(wav, 0, bufferSize);
}
@@ -336,23 +342,50 @@
// ----------------------------------------------------------------------------
-static void
+static int
+android_tts_SynthProxy_setLowShelf(JNIEnv *env, jobject thiz, jboolean applyFilter,
+ jfloat filterGain, jfloat attenuationInDb, jfloat freqInHz, jfloat slope)
+{
+ int result = TTS_SUCCESS;
+
+ bUseFilter = applyFilter;
+ if (applyFilter) {
+ fFilterLowshelfAttenuation = attenuationInDb;
+ fFilterTransitionFreq = freqInHz;
+ fFilterShelfSlope = slope;
+ fFilterGain = filterGain;
+
+ if (fFilterShelfSlope != 0.0f) {
+ initializeEQ();
+ } else {
+ LOGE("Invalid slope, can't be null");
+ result = TTS_FAILURE;
+ }
+ }
+
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+static int
android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz,
jobject weak_this, jstring nativeSoLib)
{
+ int result = TTS_FAILURE;
+
+ bUseFilter = false;
+
SynthProxyJniStorage* pJniStorage = new SynthProxyJniStorage();
prepAudioTrack(pJniStorage,
DEFAULT_TTS_STREAM_TYPE, DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS);
- const char *nativeSoLibNativeString =
- env->GetStringUTFChars(nativeSoLib, 0);
+ const char *nativeSoLibNativeString = env->GetStringUTFChars(nativeSoLib, 0);
void *engine_lib_handle = dlopen(nativeSoLibNativeString,
RTLD_NOW | RTLD_LOCAL);
if (engine_lib_handle == NULL) {
LOGE("android_tts_SynthProxy_native_setup(): engine_lib_handle == NULL");
- // TODO report error so the TTS can't be used
} else {
TtsEngine *(*get_TtsEngine)() =
reinterpret_cast<TtsEngine* (*)()>(dlsym(engine_lib_handle, "getTtsEngine"));
@@ -364,18 +397,19 @@
Mutex::Autolock l(engineMutex);
pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB);
}
+
+ result = TTS_SUCCESS;
}
// we use a weak reference so the SynthProxy object can be garbage collected.
pJniStorage->tts_ref = env->NewGlobalRef(weak_this);
// save the JNI resources so we can use them (and free them) later
- env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData,
- (int)pJniStorage);
-
- initializeEQ();
+ env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData, (int)pJniStorage);
env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString);
+
+ return result;
}
@@ -844,9 +878,13 @@
(void*)android_tts_SynthProxy_shutdown
},
{ "native_setup",
- "(Ljava/lang/Object;Ljava/lang/String;)V",
+ "(Ljava/lang/Object;Ljava/lang/String;)I",
(void*)android_tts_SynthProxy_native_setup
},
+ { "native_setLowShelf",
+ "(ZFFFF)I",
+ (void*)android_tts_SynthProxy_setLowShelf
+ },
{ "native_finalize",
"(I)V",
(void*)android_tts_SynthProxy_native_finalize
diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java
index 1d37ba0..6255275 100755
--- a/packages/TtsService/src/android/tts/SynthProxy.java
+++ b/packages/TtsService/src/android/tts/SynthProxy.java
@@ -32,6 +32,15 @@
@SuppressWarnings("unused")
public class SynthProxy {
+ // Default parameters of a filter to be applied when using the Pico engine.
+ // Such a huge filter 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.
+ private final static float PICO_FILTER_GAIN = 5.5f; // linear gain
+ private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -18.0f; // in dB
+ private final static float PICO_FILTER_TRANSITION_FREQ = 1100.0f; // in Hz
+ private final static float PICO_FILTER_SHELF_SLOPE = 1.0f; // Q
+
//
// External API
//
@@ -40,8 +49,11 @@
* Constructor; pass the location of the native TTS .so to use.
*/
public SynthProxy(String nativeSoLib) {
- Log.v(TtsService.SERVICE_TAG, "TTS is loading " + nativeSoLib);
+ boolean applyFilter = nativeSoLib.toLowerCase().contains("pico");
+ Log.v(TtsService.SERVICE_TAG, "about to load "+ nativeSoLib + ", applyFilter="+applyFilter);
native_setup(new WeakReference<SynthProxy>(this), nativeSoLib);
+ native_setLowShelf(applyFilter, PICO_FILTER_GAIN, PICO_FILTER_LOWSHELF_ATTENUATION,
+ PICO_FILTER_TRANSITION_FREQ, PICO_FILTER_SHELF_SLOPE);
}
/**
@@ -161,8 +173,10 @@
*/
private int mJniData = 0;
- private native final void native_setup(Object weak_this,
- String nativeSoLib);
+ private native final int native_setup(Object weak_this, String nativeSoLib);
+
+ private native final int native_setLowShelf(boolean applyFilter, float filterGain,
+ float attenuationInDb, float freqInHz, float slope);
private native final void native_finalize(int jniData);
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index 5c4bbb8..1efa5a3 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -20,8 +20,10 @@
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
@@ -39,6 +41,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;
@@ -146,6 +149,8 @@
private final ReentrantLock synthesizerLock = new ReentrantLock();
private static SynthProxy sNativeSynth = null;
+ private String currentSpeechEngineSOFile = "";
+
@Override
public void onCreate() {
super.onCreate();
@@ -153,6 +158,9 @@
mResolver = getContentResolver();
+ currentSpeechEngineSOFile = "";
+ setEngine(getDefaultEngine());
+
String soLibPath = "/system/lib/libttspico.so";
if (sNativeSynth == null) {
sNativeSynth = new SynthProxy(soLibPath);
@@ -194,6 +202,54 @@
}
+ private int setEngine(String enginePackageName) {
+ String soFilename = "";
+ // The SVOX TTS is an exception to how the TTS packaging scheme works
+ // because it is part of the system and not a 3rd party add-on; thus
+ // its binary is actually located under /system/lib/
+ if (enginePackageName.equals("com.svox.pico")) {
+ soFilename = "/system/lib/libttspico.so";
+ } else {
+ // Find the package
+ Intent intent = new Intent("android.intent.action.START_TTS_ENGINE");
+ intent.setPackage(enginePackageName);
+ ResolveInfo[] enginesArray = new ResolveInfo[0];
+ PackageManager pm = getPackageManager();
+ List <ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
+ if ((resolveInfos == null) || resolveInfos.isEmpty()) {
+ Log.e(SERVICE_TAG, "Invalid TTS Engine Package: " + enginePackageName);
+ return TextToSpeech.ERROR;
+ }
+ enginesArray = resolveInfos.toArray(enginesArray);
+ // Generate the TTS .so filename from the package
+ ActivityInfo aInfo = enginesArray[0].activityInfo;
+ soFilename = aInfo.name.replace(aInfo.packageName + ".", "") + ".so";
+ soFilename = soFilename.toLowerCase();
+ soFilename = "/data/data/" + aInfo.packageName + "/lib/libtts" + soFilename;
+ }
+
+ if (currentSpeechEngineSOFile.equals(soFilename)) {
+ return TextToSpeech.SUCCESS;
+ }
+
+ File f = new File(soFilename);
+ if (!f.exists()) {
+ Log.e(SERVICE_TAG, "Invalid TTS Binary: " + soFilename);
+ return TextToSpeech.ERROR;
+ }
+
+ if (sNativeSynth != null) {
+ sNativeSynth.stopSync();
+ sNativeSynth.shutdown();
+ sNativeSynth = null;
+ }
+ sNativeSynth = new SynthProxy(soFilename);
+ currentSpeechEngineSOFile = soFilename;
+ return TextToSpeech.SUCCESS;
+ }
+
+
+
private void setDefaultSettings() {
setLanguage("", this.getDefaultLanguage(), getDefaultCountry(), getDefaultLocVariant());
@@ -209,6 +265,15 @@
== 1 );
}
+ private String getDefaultEngine() {
+ String defaultEngine = android.provider.Settings.Secure.getString(mResolver,
+ android.provider.Settings.Secure.TTS_DEFAULT_SYNTH);
+ if (defaultEngine == null) {
+ return TextToSpeech.Engine.DEFAULT_SYNTH;
+ } else {
+ return defaultEngine;
+ }
+ }
private int getDefaultRate() {
return android.provider.Settings.Secure.getInt(mResolver,
@@ -679,6 +744,7 @@
String country = "";
String variant = "";
String speechRate = "";
+ String engine = "";
if (speechItem.mParams != null){
for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){
String param = speechItem.mParams.get(i);
@@ -700,12 +766,17 @@
} catch (NumberFormatException e) {
streamType = DEFAULT_STREAM_TYPE;
}
+ } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_ENGINE)) {
+ engine = speechItem.mParams.get(i + 1);
}
}
}
}
// Only do the synthesis if it has not been killed by a subsequent utterance.
if (mKillList.get(speechItem) == null) {
+ if (engine.length() > 0) {
+ setEngine(engine);
+ }
if (language.length() > 0){
setLanguage("", language, country, variant);
}
@@ -760,6 +831,7 @@
String country = "";
String variant = "";
String speechRate = "";
+ String engine = "";
if (speechItem.mParams != null){
for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){
String param = speechItem.mParams.get(i);
@@ -774,12 +846,17 @@
variant = speechItem.mParams.get(i+1);
} else if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)){
utteranceId = speechItem.mParams.get(i+1);
+ } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_ENGINE)) {
+ engine = speechItem.mParams.get(i + 1);
}
}
}
}
// Only do the synthesis if it has not been killed by a subsequent utterance.
if (mKillList.get(speechItem) == null){
+ if (engine.length() > 0) {
+ setEngine(engine);
+ }
if (language.length() > 0){
setLanguage("", language, country, variant);
}
@@ -1266,6 +1343,17 @@
return mSelf.synthesizeToFile(callingApp, text, speakingParams, filename);
}
+ /**
+ * Sets the speech synthesis engine for the TTS by specifying its packagename
+ *
+ * @param packageName the packageName of the speech synthesis engine (ie, "com.svox.pico")
+ *
+ * @return SUCCESS or ERROR as defined in android.speech.tts.TextToSpeech.
+ */
+ public int setEngineByPackageName(String packageName) {
+ return mSelf.setEngine(packageName);
+ }
+
};
}
diff --git a/packages/VpnServices/Android.mk b/packages/VpnServices/Android.mk
index eb27ed5..6cdf674 100644
--- a/packages/VpnServices/Android.mk
+++ b/packages/VpnServices/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
index e5be847..eeafd5a 100644
--- a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
@@ -26,7 +26,9 @@
import android.net.vpn.VpnManager;
import android.net.vpn.VpnProfile;
import android.net.vpn.VpnState;
+import android.os.Environment;
import android.os.IBinder;
+import android.os.SystemProperties;
import android.util.Log;
import java.io.File;
@@ -45,11 +47,18 @@
private static final String TAG = VpnServiceBinder.class.getSimpleName();
private static final boolean DBG = true;
- private static final String STATES_FILE_PATH = "/data/misc/vpn/.states";
+ private static final String STATES_FILE_RELATIVE_PATH = "/misc/vpn/.states";
// The actual implementation is delegated to the VpnService class.
private VpnService<? extends VpnProfile> mService;
+ // TODO(oam): Test VPN when EFS is enabled (will do later)...
+ private static String getStateFilePath() {
+ // This call will return the correcu directory whether Encrypted FS is enabled or not
+ // Disabled: /data/misc/vpn/.states Enabled: /data/secure/misc/vpn/.states
+ return Environment.getSecureDataDirectory().getPath() + STATES_FILE_RELATIVE_PATH;
+ }
+
private final IBinder mBinder = new IVpnService.Stub() {
public boolean connect(VpnProfile p, String username, String password) {
return VpnServiceBinder.this.connect(p, username, password);
@@ -84,14 +93,14 @@
void saveStates() throws IOException {
if (DBG) Log.d("VpnServiceBinder", " saving states");
ObjectOutputStream oos =
- new ObjectOutputStream(new FileOutputStream(STATES_FILE_PATH));
+ new ObjectOutputStream(new FileOutputStream(getStateFilePath()));
oos.writeObject(mService);
oos.close();
}
void removeStates() {
try {
- File f = new File(STATES_FILE_PATH);
+ File f = new File(getStateFilePath());
if (f.exists()) f.delete();
} catch (Throwable e) {
if (DBG) Log.d("VpnServiceBinder", " remove states: " + e);
@@ -134,7 +143,7 @@
private void checkSavedStates() {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
- STATES_FILE_PATH));
+ getStateFilePath()));
mService = (VpnService<? extends VpnProfile>) ois.readObject();
mService.recover(this);
ois.close();
diff --git a/preloaded-classes b/preloaded-classes
index b4b6c5b..ec4d74c 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1,1685 +1,1012 @@
# Classes which are preloaded by com.android.internal.os.ZygoteInit.
-# Automatically generated by frameworks/base/tools/preload/WritePreloadedClassFile.java.
-# MIN_LOAD_TIME_MICROS=1000
-SQLite.Blob
-SQLite.Database
-SQLite.FunctionContext
-SQLite.Stmt
-SQLite.Vm
android.R$styleable
-android.accounts.Account
-android.accounts.AccountManager
-android.accounts.AccountManager$3
-android.accounts.AccountManager$6
-android.accounts.AccountManager$AmsTask
-android.accounts.AccountManager$AmsTask$Response
-android.accounts.AccountManager$BaseFutureTask
-android.accounts.AccountManager$BaseFutureTask$1
-android.accounts.AccountManager$BaseFutureTask$Response
-android.accounts.AccountManager$Future2Task
-android.accounts.AccountManager$GetAuthTokenByTypeAndFeaturesTask
-android.accounts.AuthenticatorDescription
-android.accounts.IAccountAuthenticatorResponse$Stub
-android.accounts.IAccountManager$Stub
-android.accounts.IAccountManager$Stub$Proxy
-android.accounts.IAccountManagerResponse$Stub
android.app.Activity
android.app.ActivityGroup
-android.app.ActivityManager
-android.app.ActivityManager$RunningServiceInfo
+android.app.ActivityManager$MemoryInfo$1
android.app.ActivityManagerNative
android.app.ActivityManagerProxy
android.app.ActivityThread
+android.app.ActivityThread$ActivityRecord
+android.app.ActivityThread$AppBindData
android.app.ActivityThread$ApplicationThread
+android.app.ActivityThread$ContextCleanupInfo
android.app.ActivityThread$GcIdler
android.app.ActivityThread$H
+android.app.ActivityThread$Idler
android.app.ActivityThread$PackageInfo
+android.app.ActivityThread$PackageInfo$ReceiverDispatcher
android.app.ActivityThread$PackageInfo$ReceiverDispatcher$InnerReceiver
+android.app.ActivityThread$PackageInfo$ServiceDispatcher
android.app.ActivityThread$PackageInfo$ServiceDispatcher$InnerConnection
android.app.ActivityThread$ProviderRecord
+android.app.ActivityThread$ProviderRefCount
android.app.AlertDialog
-android.app.AlertDialog$Builder
android.app.Application
android.app.ApplicationContext
android.app.ApplicationContext$ApplicationContentResolver
android.app.ApplicationContext$ApplicationPackageManager
android.app.ApplicationContext$ApplicationPackageManager$PackageRemovedReceiver
+android.app.ApplicationContext$ApplicationPackageManager$ResourceName
android.app.ApplicationContext$SharedPreferencesImpl
-android.app.ApplicationContext$SharedPreferencesImpl$EditorImpl
android.app.ApplicationLoaders
android.app.ApplicationThreadNative
-android.app.BackupAgent
-android.app.DatePickerDialog
android.app.Dialog
android.app.ExpandableListActivity
android.app.IActivityManager
-android.app.IActivityManager$ContentProviderHolder
+android.app.IActivityManager$ContentProviderHolder$1
android.app.IAlarmManager$Stub
+android.app.IAlarmManager$Stub$Proxy
android.app.IApplicationThread
-android.app.IInstrumentationWatcher$Stub
android.app.INotificationManager$Stub
+android.app.INotificationManager$Stub$Proxy
+android.app.ISearchManager
android.app.ISearchManager$Stub
-android.app.ISearchManagerCallback$Stub
-android.app.IServiceConnection$Stub
-android.app.IStatusBar$Stub
-android.app.ITransientNotification$Stub
-android.app.IWallpaperManager$Stub
-android.app.IWallpaperManagerCallback$Stub
+android.app.ISearchManager$Stub$Proxy
android.app.Instrumentation
-android.app.Instrumentation$ActivityGoing
-android.app.Instrumentation$Idler
android.app.IntentReceiverLeaked
-android.app.IntentService
-android.app.IntentService$ServiceHandler
android.app.ListActivity
+android.app.ListActivity$1
+android.app.ListActivity$2
android.app.LocalActivityManager
android.app.Notification
android.app.NotificationManager
android.app.PendingIntent
+android.app.PendingIntent$1
android.app.ProgressDialog
android.app.ReceiverRestrictedContext
android.app.ResultInfo
-android.app.SearchManager$OnCancelListener
-android.app.SearchManager$SearchManagerCallback
-android.app.SearchableInfo
+android.app.ResultInfo$1
+android.app.SearchDialog
+android.app.SearchDialog$SearchAutoComplete
android.app.Service
+android.app.ServiceConnectionLeaked
android.app.TabActivity
-android.app.TimePickerDialog
-android.app.WallpaperManager
-android.app.WallpaperManager$Globals
-android.appwidget.AppWidgetHost
-android.appwidget.AppWidgetHost$Callbacks
-android.appwidget.AppWidgetHostView
-android.appwidget.AppWidgetHostView$1
-android.appwidget.AppWidgetHostView$ParcelableSparseArray
-android.appwidget.AppWidgetManager
-android.appwidget.AppWidgetProvider
-android.appwidget.AppWidgetProviderInfo
-android.backup.BackupDataInput
-android.backup.BackupDataInput$EntityHeader
-android.backup.BackupDataOutput
-android.backup.BackupHelperAgent
-android.backup.BackupHelperDispatcher
-android.backup.BackupHelperDispatcher$Header
-android.backup.BackupManager
-android.backup.FileBackupHelperBase
-android.backup.IBackupManager$Stub
-android.backup.IBackupManager$Stub$Proxy
-android.backup.IRestoreObserver$Stub
-android.backup.IRestoreSession$Stub
-android.backup.RestoreSet
-android.bluetooth.BluetoothA2dp
-android.bluetooth.BluetoothAdapter
-android.bluetooth.BluetoothAudioGateway
-android.bluetooth.BluetoothClass
-android.bluetooth.BluetoothDevice
-android.bluetooth.BluetoothHeadset
-android.bluetooth.BluetoothServerSocket
-android.bluetooth.BluetoothSocket
-android.bluetooth.HeadsetBase
-android.bluetooth.IBluetooth
-android.bluetooth.IBluetooth$Stub
-android.bluetooth.IBluetooth$Stub$Proxy
-android.bluetooth.IBluetoothA2dp
-android.bluetooth.IBluetoothA2dp$Stub
-android.bluetooth.IBluetoothHeadset$Stub
-android.bluetooth.IBluetoothHeadset$Stub$Proxy
-android.bluetooth.IBluetoothPbap$Stub
-android.bluetooth.ScoSocket
-android.content.AsyncQueryHandler
android.content.BroadcastReceiver
+android.content.ComponentCallbacks
android.content.ComponentName
-android.content.ContentProvider
+android.content.ComponentName$1
android.content.ContentProvider$Transport
-android.content.ContentProviderClient
-android.content.ContentProviderNative
-android.content.ContentProviderOperation
android.content.ContentProviderProxy
-android.content.ContentProviderResult
android.content.ContentQueryMap
+android.content.ContentQueryMap$1
android.content.ContentResolver
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
android.content.ContentValues
android.content.Context
android.content.ContextWrapper
-android.content.Entity
+android.content.DialogInterface
+android.content.DialogInterface$OnCancelListener
+android.content.DialogInterface$OnDismissListener
android.content.IContentProvider
+android.content.IContentService
android.content.IContentService$Stub
-android.content.IContentService$Stub$Proxy
-android.content.IIntentReceiver$Stub
-android.content.IIntentSender$Stub
-android.content.ISyncAdapter$Stub
-android.content.ISyncContext$Stub
android.content.Intent
-android.content.Intent$ShortcutIconResource
+android.content.Intent$1
android.content.IntentFilter
-android.content.IntentSender
-android.content.IntentSender$1
android.content.SearchRecentSuggestionsProvider
-android.content.SearchRecentSuggestionsProvider$DatabaseHelper
-android.content.SyncAdapterType
android.content.SyncResult
android.content.SyncStats
android.content.UriMatcher
android.content.pm.ActivityInfo
+android.content.pm.ActivityInfo$1
android.content.pm.ApplicationInfo
-android.content.pm.ConfigurationInfo
-android.content.pm.FeatureInfo
-android.content.pm.IPackageDataObserver$Stub
-android.content.pm.IPackageInstallObserver$Stub
+android.content.pm.ApplicationInfo$1
+android.content.pm.ComponentInfo
+android.content.pm.IPackageManager
android.content.pm.IPackageManager$Stub
android.content.pm.IPackageManager$Stub$Proxy
-android.content.pm.IPackageStatsObserver$Stub
android.content.pm.InstrumentationInfo
-android.content.pm.PackageInfo
+android.content.pm.InstrumentationInfo$1
+android.content.pm.PackageItemInfo
android.content.pm.PackageManager
android.content.pm.PackageManager$NameNotFoundException
-android.content.pm.PackageStats
-android.content.pm.PathPermission
-android.content.pm.PermissionGroupInfo
android.content.pm.PermissionInfo
android.content.pm.ProviderInfo
-android.content.pm.ResolveInfo
-android.content.pm.ResolveInfo$DisplayNameComparator
-android.content.pm.ServiceInfo
-android.content.pm.Signature
-android.content.res.AssetFileDescriptor
-android.content.res.AssetFileDescriptor$1
-android.content.res.AssetFileDescriptor$AutoCloseInputStream
+android.content.pm.ProviderInfo$1
+android.content.pm.ResolveInfo$1
+android.content.pm.ServiceInfo$1
android.content.res.AssetManager
android.content.res.AssetManager$AssetInputStream
android.content.res.ColorStateList
android.content.res.ColorStateList$1
-android.content.res.CompatibilityInfo
-android.content.res.CompatibilityInfo$1
-android.content.res.CompatibilityInfo$Translator
android.content.res.Configuration
-android.content.res.Configuration$1
-android.content.res.PluralRules
android.content.res.Resources
-android.content.res.Resources$1
+android.content.res.Resources$Theme
android.content.res.StringBlock
-android.content.res.StringBlock$Height
android.content.res.TypedArray
android.content.res.XmlBlock
android.content.res.XmlBlock$Parser
-android.content.res.XmlResourceParser
android.database.AbstractCursor
android.database.AbstractCursor$SelfContentObserver
android.database.AbstractWindowedCursor
android.database.BulkCursorNative
android.database.BulkCursorProxy
android.database.BulkCursorToCursorAdaptor
-android.database.CharArrayBuffer
+android.database.ContentObservable
android.database.ContentObserver$Transport
-android.database.CursorJoiner
-android.database.CursorJoiner$Result
+android.database.Cursor
android.database.CursorToBulkCursorAdaptor
+android.database.CursorToBulkCursorAdaptor$ContentObserverProxy
android.database.CursorWindow
-android.database.CursorWindow$1
android.database.CursorWrapper
android.database.DataSetObservable
-android.database.DatabaseUtils
-android.database.DatabaseUtils$InsertHelper
-android.database.IContentObserver$Stub
-android.database.MatrixCursor
+android.database.IContentObserver$Stub$Proxy
android.database.MergeCursor
-android.database.sqlite.SQLiteClosable
-android.database.sqlite.SQLiteContentHelper
android.database.sqlite.SQLiteCursor
android.database.sqlite.SQLiteDatabase
-android.database.sqlite.SQLiteDatabase$ConflictAlgorithm
-android.database.sqlite.SQLiteDebug
-android.database.sqlite.SQLiteDebug$PagerStats
+android.database.sqlite.SQLiteDatabase$CursorFactory
android.database.sqlite.SQLiteDirectCursorDriver
-android.database.sqlite.SQLiteDoneException
-android.database.sqlite.SQLiteException
-android.database.sqlite.SQLiteOpenHelper
-android.database.sqlite.SQLiteProgram
android.database.sqlite.SQLiteQuery
-android.database.sqlite.SQLiteQueryBuilder
android.database.sqlite.SQLiteStatement
android.ddm.DdmHandleAppName
android.ddm.DdmHandleExit
android.ddm.DdmHandleHeap
android.ddm.DdmHandleHello
android.ddm.DdmHandleNativeHeap
-android.ddm.DdmHandleProfiling
android.ddm.DdmHandleThread
android.ddm.DdmRegister
-android.debug.JNITest
-android.emoji.EmojiFactory
-android.graphics.AvoidXfermode
android.graphics.Bitmap
-android.graphics.Bitmap$1
-android.graphics.Bitmap$CompressFormat
-android.graphics.Bitmap$Config
-android.graphics.BitmapFactory
-android.graphics.BitmapFactory$Options
android.graphics.BitmapShader
-android.graphics.BlurMaskFilter
-android.graphics.Camera
android.graphics.Canvas
android.graphics.Canvas$EdgeType
android.graphics.Color
-android.graphics.ColorFilter
-android.graphics.ColorMatrixColorFilter
-android.graphics.ComposePathEffect
-android.graphics.ComposeShader
-android.graphics.CornerPathEffect
-android.graphics.DashPathEffect
-android.graphics.DiscretePathEffect
-android.graphics.DrawFilter
-android.graphics.EmbossMaskFilter
android.graphics.Interpolator
-android.graphics.LayerRasterizer
-android.graphics.LightingColorFilter
android.graphics.LinearGradient
-android.graphics.MaskFilter
android.graphics.Matrix
android.graphics.Matrix$ScaleToFit
-android.graphics.Movie
android.graphics.NinePatch
android.graphics.Paint
-android.graphics.Paint$Align
-android.graphics.Paint$Cap
-android.graphics.Paint$FontMetrics
-android.graphics.Paint$FontMetricsInt
-android.graphics.Paint$Join
-android.graphics.Paint$Style
android.graphics.PaintFlagsDrawFilter
android.graphics.Path
android.graphics.Path$Direction
-android.graphics.Path$FillType
-android.graphics.PathDashPathEffect
-android.graphics.PathEffect
-android.graphics.PathMeasure
android.graphics.Picture
-android.graphics.PixelFormat
-android.graphics.PixelXorXfermode
-android.graphics.Point
-android.graphics.PointF
+android.graphics.PorterDuff
android.graphics.PorterDuff$Mode
-android.graphics.PorterDuffColorFilter
android.graphics.PorterDuffXfermode
-android.graphics.RadialGradient
-android.graphics.Rasterizer
android.graphics.Rect
-android.graphics.Rect$1
android.graphics.RectF
-android.graphics.RectF$1
android.graphics.Region
-android.graphics.Region$1
android.graphics.Region$Op
-android.graphics.RegionIterator
android.graphics.Shader
android.graphics.Shader$TileMode
-android.graphics.SumPathEffect
-android.graphics.SweepGradient
android.graphics.Typeface
android.graphics.Xfermode
-android.graphics.drawable.Animatable
-android.graphics.drawable.AnimatedRotateDrawable
-android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState
android.graphics.drawable.AnimationDrawable
-android.graphics.drawable.AnimationDrawable$AnimationState
android.graphics.drawable.BitmapDrawable
android.graphics.drawable.BitmapDrawable$BitmapState
-android.graphics.drawable.ClipDrawable
-android.graphics.drawable.ClipDrawable$ClipState
android.graphics.drawable.ColorDrawable
android.graphics.drawable.ColorDrawable$ColorState
android.graphics.drawable.Drawable
-android.graphics.drawable.Drawable$Callback
-android.graphics.drawable.Drawable$ConstantState
android.graphics.drawable.DrawableContainer
-android.graphics.drawable.DrawableContainer$DrawableContainerState
android.graphics.drawable.GradientDrawable
-android.graphics.drawable.GradientDrawable$1
-android.graphics.drawable.GradientDrawable$GradientState
-android.graphics.drawable.GradientDrawable$Orientation
android.graphics.drawable.LayerDrawable
android.graphics.drawable.LayerDrawable$ChildDrawable
android.graphics.drawable.LayerDrawable$LayerState
-android.graphics.drawable.LevelListDrawable
android.graphics.drawable.NinePatchDrawable
android.graphics.drawable.NinePatchDrawable$NinePatchState
android.graphics.drawable.PaintDrawable
+android.graphics.drawable.RotateDrawable
+android.graphics.drawable.RotateDrawable$RotateState
+android.graphics.drawable.ScaleDrawable
+android.graphics.drawable.ScaleDrawable$ScaleState
android.graphics.drawable.ShapeDrawable
+android.graphics.drawable.ShapeDrawable$ShapeState
android.graphics.drawable.StateListDrawable
android.graphics.drawable.StateListDrawable$StateListState
android.graphics.drawable.TransitionDrawable
android.graphics.drawable.TransitionDrawable$TransitionState
-android.graphics.drawable.shapes.RectShape
android.graphics.drawable.shapes.RoundRectShape
-android.hardware.Camera
-android.hardware.Camera$Parameters
-android.hardware.ISensorService$Stub
android.hardware.SensorManager
-android.hardware.SensorManager$1
-android.hardware.SensorManager$LegacyListener
-android.inputmethodservice.AbstractInputMethodService
-android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodImpl
-android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodSessionImpl
-android.inputmethodservice.ExtractButton
-android.inputmethodservice.ExtractEditText
-android.inputmethodservice.IInputMethodSessionWrapper
-android.inputmethodservice.IInputMethodSessionWrapper$InputMethodEventCallbackWrapper
-android.inputmethodservice.IInputMethodWrapper
-android.inputmethodservice.IInputMethodWrapper$InputMethodSessionCallbackWrapper
-android.inputmethodservice.InputMethodService
-android.inputmethodservice.InputMethodService$InputMethodImpl
-android.inputmethodservice.InputMethodService$InputMethodSessionImpl
-android.inputmethodservice.Keyboard
-android.inputmethodservice.Keyboard$Key
android.inputmethodservice.KeyboardView
-android.inputmethodservice.KeyboardView$2
-android.inputmethodservice.SoftInputWindow
-android.location.GpsStatus
-android.location.IGpsStatusListener$Stub
-android.location.ILocationListener$Stub
android.location.ILocationManager$Stub
-android.location.ILocationManager$Stub$Proxy
-android.location.ILocationProvider
-android.location.ILocationProvider$Stub
android.location.Location
-android.location.LocationManager
-android.location.LocationManager$ListenerTransport
-android.media.AmrInputStream
-android.media.AudioFormat
android.media.AudioManager
-android.media.AudioRecord
-android.media.AudioSystem
-android.media.AudioTrack
-android.media.ExifInterface
android.media.IAudioService$Stub
android.media.IAudioService$Stub$Proxy
-android.media.JetPlayer
-android.media.MediaMetadataRetriever
-android.media.MediaPlayer
-android.media.MediaPlayer$OnVideoSizeChangedListener
-android.media.MediaRecorder
-android.media.MediaScanner
-android.media.MediaScannerConnection$MediaScannerConnectionClient
-android.media.Metadata
-android.media.Ringtone
-android.media.RingtoneManager
-android.media.ToneGenerator
-android.net.ConnectivityManager
-android.net.Credentials
-android.net.DhcpInfo
-android.net.DhcpInfo$1
-android.net.IConnectivityManager$Stub
-android.net.IConnectivityManager$Stub$Proxy
-android.net.LocalServerSocket
android.net.LocalSocket
+android.net.LocalSocketAddress
android.net.LocalSocketAddress$Namespace
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
android.net.NetworkInfo
android.net.NetworkInfo$DetailedState
-android.net.NetworkInfo$State
-android.net.NetworkUtils
+android.net.SSLCertificateSocketFactory
android.net.TrafficStats
android.net.Uri
+android.net.Uri$1
+android.net.Uri$AbstractHierarchicalUri
+android.net.Uri$AbstractPart
android.net.Uri$HierarchicalUri
android.net.Uri$OpaqueUri
android.net.Uri$Part
+android.net.Uri$Part$EmptyPart
+android.net.Uri$PathPart
android.net.Uri$PathSegments
android.net.Uri$StringUri
android.net.WebAddress
android.net.http.CertificateChainValidator
-android.net.http.Connection
-android.net.http.ConnectionThread
-android.net.http.DomainNameChecker
android.net.http.EventHandler
-android.net.http.Headers
android.net.http.HttpsConnection
-android.net.http.Request
-android.net.http.RequestHandle
android.net.http.RequestQueue
-android.net.http.RequestQueue$ActivePool
-android.net.http.SslCertificate
-android.net.http.SslCertificate$DName
android.net.http.SslError
-android.net.vpn.IVpnService$Stub
-android.net.vpn.IVpnService$Stub$Proxy
-android.net.vpn.PptpProfile
-android.net.vpn.VpnManager
-android.net.vpn.VpnType
android.net.wifi.IWifiManager$Stub
-android.net.wifi.IWifiManager$Stub$Proxy
-android.net.wifi.ScanResult
android.net.wifi.SupplicantState
android.net.wifi.WifiConfiguration
-android.net.wifi.WifiConfiguration$EnterpriseField
android.net.wifi.WifiInfo
-android.net.wifi.WifiManager
-android.net.wifi.WifiNative
-android.opengl.GLES10
-android.opengl.GLES10Ext
-android.opengl.GLES11
-android.opengl.GLES11Ext
-android.opengl.GLU
-android.opengl.GLUtils
-android.opengl.Matrix
-android.opengl.Visibility
-android.os.AsyncTask$1
-android.os.AsyncTask$2
-android.os.AsyncTask$3
-android.os.AsyncTask$Status
-android.os.Base64Utils
+android.opengl.Material
android.os.Binder
android.os.BinderProxy
android.os.Build
-android.os.Build$VERSION
android.os.Bundle
-android.os.DeadObjectException
-android.os.Debug
-android.os.Debug$MemoryInfo
-android.os.Debug$MemoryInfo$1
+android.os.Bundle$1
android.os.Environment
-android.os.FileObserver$ObserverThread
android.os.FileUtils
-android.os.FileUtils$FileStatus
android.os.Handler
android.os.HandlerThread
android.os.IBinder
-android.os.ICheckinService$Stub
-android.os.IInterface
-android.os.IMountService$Stub
-android.os.IMountService$Stub$Proxy
-android.os.INetStatService$Stub
-android.os.IParentalControlCallback$Stub
android.os.IPowerManager$Stub
android.os.IPowerManager$Stub$Proxy
+android.os.IServiceManager
android.os.IVibratorService$Stub
+android.os.IVibratorService$Stub$Proxy
android.os.Looper
-android.os.MemoryFile
android.os.Message
+android.os.Message$1
+android.os.MessageQueue
+android.os.MessageQueue$IdleHandler
android.os.Parcel
-android.os.Parcel$1
-android.os.ParcelFileDescriptor
-android.os.ParcelFileDescriptor$1
-android.os.Parcelable
-android.os.Parcelable$Creator
android.os.PatternMatcher
-android.os.PerformanceCollector
-android.os.Power
+android.os.PatternMatcher$1
android.os.PowerManager
+android.os.PowerManager$WakeLock
+android.os.PowerManager$WakeLock$1
android.os.Process
-android.os.RemoteCallbackList
-android.os.RemoteException
-android.os.ResultReceiver
-android.os.ResultReceiver$MyResultReceiver
android.os.ServiceManager
android.os.ServiceManagerNative
-android.os.StatFs
-android.os.SystemClock
-android.os.SystemProperties
-android.os.UEventObserver
-android.pim.EventRecurrence
-android.pim.ICalendar
-android.pim.ICalendar$Component
-android.pim.ICalendar$Parameter
-android.pim.ICalendar$ParserState
-android.pim.ICalendar$Property
-android.pim.RecurrenceSet
+android.os.ServiceManagerProxy
+android.os.Vibrator
android.preference.CheckBoxPreference
-android.preference.CheckBoxPreference$SavedState
android.preference.DialogPreference
android.preference.EditTextPreference
-android.preference.EditTextPreference$SavedState
-android.preference.EditTextPreference$SavedState$1
-android.preference.GenericInflater
android.preference.ListPreference
-android.preference.ListPreference$SavedState
android.preference.Preference
-android.preference.Preference$BaseSavedState
android.preference.PreferenceActivity
-android.preference.PreferenceCategory
android.preference.PreferenceGroup
android.preference.PreferenceGroupAdapter
-android.preference.PreferenceInflater
android.preference.PreferenceManager
android.preference.PreferenceScreen
android.preference.RingtonePreference
-android.preference.SeekBarPreference
-android.preference.VolumePreference
-android.preference.VolumePreference$SeekBarVolumizer
-android.provider.Browser
-android.provider.Calendar
-android.provider.Calendar$Attendees
-android.provider.Calendar$BusyBits
-android.provider.Calendar$CalendarAlerts
-android.provider.Calendar$Calendars
-android.provider.Calendar$Events
-android.provider.Calendar$Instances
-android.provider.Calendar$Reminders
-android.provider.CallLog
-android.provider.CallLog$Calls
-android.provider.Checkin
-android.provider.Checkin$Events
-android.provider.Checkin$Events$Tag
-android.provider.Checkin$Properties
-android.provider.Checkin$Properties$Tag
-android.provider.Checkin$Stats
-android.provider.Checkin$Stats$Tag
-android.provider.Contacts
-android.provider.Contacts$ContactMethods
-android.provider.ContactsContract
-android.provider.ContactsContract$CommonDataKinds$Email
-android.provider.ContactsContract$CommonDataKinds$Im
-android.provider.ContactsContract$CommonDataKinds$Organization
-android.provider.ContactsContract$CommonDataKinds$Phone
-android.provider.ContactsContract$CommonDataKinds$StructuredPostal
-android.provider.ContactsContract$Contacts
-android.provider.ContactsContract$Data
-android.provider.ContactsContract$DataColumnsWithJoins
-android.provider.ContactsContract$PhoneLookup
-android.provider.ContactsContract$Presence
-android.provider.ContactsContract$RawContacts
-android.provider.Downloads
-android.provider.DrmStore$Audio
-android.provider.MediaStore
-android.provider.MediaStore$Audio$Albums
-android.provider.MediaStore$Audio$Artists
-android.provider.MediaStore$Audio$Media
-android.provider.MediaStore$Images$Media
-android.provider.MediaStore$Images$Thumbnails
-android.provider.SearchRecentSuggestions
-android.provider.Settings
-android.provider.Settings$Gservices
-android.provider.Settings$NameValueTable
-android.provider.Settings$Secure
-android.provider.Settings$SettingNotFoundException
-android.provider.Settings$System
-android.provider.SocialContract
-android.provider.Telephony$BaseMmsColumns
-android.provider.Telephony$Mms
-android.provider.Telephony$Mms$Draft
-android.provider.Telephony$Mms$Inbox
-android.provider.Telephony$MmsSms
-android.provider.Telephony$Sms
-android.provider.Telephony$Sms$Conversations
-android.provider.Telephony$Sms$Intents
-android.provider.Telephony$Sms$Outbox
-android.provider.Telephony$Threads
-android.provider.UserDictionary
-android.provider.UserDictionary$Words
-android.security.KeyStore
-android.security.Md5MessageDigest
-android.security.MessageDigest
-android.security.Sha1MessageDigest
-android.server.BluetoothA2dpService
-android.server.BluetoothEventLoop
-android.server.BluetoothService
-android.speech.IRecognitionListener$Stub
-android.speech.IRecognitionService$Stub
-android.speech.RecognitionResult
-android.speech.RecognitionServiceUtil
-android.speech.RecognitionServiceUtil$Connection
-android.speech.srec.MicrophoneInputStream
-android.speech.srec.Recognizer
-android.speech.srec.Recognizer$Grammar
-android.speech.tts.ITts
-android.speech.tts.ITts$Stub
-android.speech.tts.ITts$Stub$Proxy
-android.speech.tts.ITtsCallback$Stub
-android.speech.tts.TextToSpeech
-android.speech.tts.TextToSpeech$2
-android.telephony.NeighboringCellInfo
-android.telephony.PhoneNumberFormattingTextWatcher
+android.sax.RootElement
android.telephony.PhoneNumberUtils
-android.telephony.PhoneStateListener$1
+android.telephony.PhoneStateListener
android.telephony.ServiceState
-android.telephony.SignalStrength
-android.telephony.SmsMessage
-android.telephony.SmsMessage$MessageClass
android.telephony.TelephonyManager
-android.text.AndroidCharacter
-android.text.Annotation
+android.telephony.SmsManager
+android.telephony.SmsMessage
android.text.AutoText
android.text.BoringLayout
+android.text.BoringLayout$Metrics
android.text.DynamicLayout
+android.text.DynamicLayout$ChangeWatcher
+android.text.Editable
android.text.Editable$Factory
-android.text.Html
+android.text.GetChars
+android.text.GraphicsOperations
android.text.Html$HtmlParser
-android.text.HtmlToSpannedConverter
-android.text.HtmlToSpannedConverter$Bold
-android.text.IClipboard$Stub
+android.text.InputFilter
android.text.Layout
android.text.Layout$Alignment
+android.text.Layout$Directions
android.text.Layout$Ellipsizer
-android.text.Layout$SpannedEllipsizer
-android.text.LoginFilter
-android.text.LoginFilter$UsernameFilterGMail
+android.text.NoCopySpan
+android.text.NoCopySpan$Concrete
+android.text.PackedIntVector
+android.text.PackedObjectVector
+android.text.ParcelableSpan
android.text.Selection
+android.text.Selection$END
+android.text.Selection$START
+android.text.SpanWatcher
+android.text.Spannable
+android.text.Spannable$Factory
android.text.SpannableString
android.text.SpannableStringBuilder
android.text.SpannableStringInternal
+android.text.Spanned
android.text.SpannedString
android.text.StaticLayout
+android.text.Styled
+android.text.TextPaint
android.text.TextUtils
+android.text.TextUtils$1
+android.text.TextUtils$EllipsizeCallback
android.text.TextUtils$SimpleStringSplitter
android.text.TextUtils$TruncateAt
-android.text.format.DateFormat
+android.text.TextWatcher
android.text.format.DateUtils
-android.text.format.Formatter
android.text.format.Time
android.text.method.ArrowKeyMovementMethod
android.text.method.BaseKeyListener
-android.text.method.DialerKeyListener
-android.text.method.HideReturnsTransformationMethod
-android.text.method.LinkMovementMethod
+android.text.method.KeyListener
android.text.method.MetaKeyKeyListener
-android.text.method.PasswordTransformationMethod
+android.text.method.MovementMethod
android.text.method.QwertyKeyListener
android.text.method.ReplacementTransformationMethod
android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
-android.text.method.ScrollingMovementMethod
android.text.method.SingleLineTransformationMethod
android.text.method.TextKeyListener
android.text.method.TextKeyListener$Capitalize
-android.text.style.BulletSpan
-android.text.style.ClickableSpan
-android.text.style.DynamicDrawableSpan
-android.text.style.ImageSpan
+android.text.method.TextKeyListener$SettingsObserver
+android.text.method.TransformationMethod
+android.text.style.AlignmentSpan
+android.text.style.CharacterStyle
+android.text.style.ForegroundColorSpan
+android.text.style.LeadingMarginSpan
+android.text.style.LineBackgroundSpan
+android.text.style.LineHeightSpan
android.text.style.MetricAffectingSpan
-android.text.style.QuoteSpan
+android.text.style.ParagraphStyle
+android.text.style.ReplacementSpan
android.text.style.StyleSpan
-android.text.style.TextAppearanceSpan
android.text.style.URLSpan
-android.text.style.UnderlineSpan
+android.text.style.UpdateAppearance
+android.text.style.UpdateLayout
+android.text.style.WrapTogetherSpan
android.text.util.Linkify
-android.text.util.Linkify$1
-android.text.util.Linkify$4
-android.text.util.Rfc822Tokenizer
android.util.AttributeSet
-android.util.DayOfMonthCursor
android.util.DisplayMetrics
-android.util.EventLog
-android.util.EventLog$Event
-android.util.EventLog$List
-android.util.FinitePool
android.util.FloatMath
-android.util.Log
-android.util.LongSparseArray
-android.util.Pair
android.util.SparseArray
-android.util.SparseIntArray
-android.util.StateSet
-android.util.TimingLogger
android.util.TypedValue
-android.util.Xml
-android.util.Xml$Encoding
android.util.Xml$XmlSerializerFactory
android.view.AbsSavedState
+android.view.ContextMenu
+android.view.ContextMenu$ContextMenuInfo
android.view.ContextThemeWrapper
android.view.Display
android.view.FocusFinder
-android.view.GestureDetector
+android.view.FocusFinder$1
android.view.GestureDetector$SimpleOnGestureListener
-android.view.IRotationWatcher$Stub
+android.view.Gravity
+android.view.IWindow
android.view.IWindow$Stub
+android.view.IWindowManager
android.view.IWindowManager$Stub
android.view.IWindowManager$Stub$Proxy
+android.view.IWindowSession
android.view.IWindowSession$Stub
android.view.IWindowSession$Stub$Proxy
android.view.KeyCharacterMap
-android.view.KeyCharacterMap$KeyData
android.view.KeyEvent
+android.view.KeyEvent$1
+android.view.KeyEvent$Callback
android.view.LayoutInflater
+android.view.LayoutInflater$Factory
+android.view.Menu
android.view.MenuInflater
-android.view.MenuInflater$MenuState
+android.view.MenuItem
android.view.MotionEvent
-android.view.OrientationEventListener$SensorEventListenerImpl
+android.view.MotionEvent$1
android.view.Surface
-android.view.Surface$1
-android.view.Surface$CompatibleCanvas
-android.view.SurfaceSession
+android.view.SurfaceHolder
android.view.SurfaceView
-android.view.SurfaceView$2
-android.view.SurfaceView$MyWindow
+android.view.TouchDelegate
android.view.VelocityTracker
android.view.View
+android.view.View$AttachInfo
android.view.View$AttachInfo$Callbacks
-android.view.View$AttachInfo$InvalidateInfo
android.view.View$BaseSavedState
+android.view.View$BaseSavedState$1
+android.view.View$MeasureSpec
+android.view.View$OnCreateContextMenuListener
+android.view.View$ScrollabilityCache
android.view.ViewConfiguration
-android.view.ViewDebug
android.view.ViewGroup
-android.view.ViewParent
+android.view.ViewGroup$LayoutParams
+android.view.ViewGroup$MarginLayoutParams
+android.view.ViewManager
android.view.ViewRoot
android.view.ViewRoot$1
android.view.ViewRoot$InputMethodCallback
+android.view.ViewRoot$RunQueue
+android.view.ViewRoot$TrackballAxis
android.view.ViewRoot$W
android.view.ViewStub
+android.view.ViewTreeObserver
+android.view.ViewTreeObserver$InternalInsetsInfo
+android.view.ViewTreeObserver$OnPreDrawListener
android.view.Window
+android.view.Window$Callback
+android.view.Window$LocalWindowManager
+android.view.WindowLeaked
+android.view.WindowManager
android.view.WindowManager$LayoutParams
+android.view.WindowManager$LayoutParams$1
android.view.WindowManagerImpl
-android.view.accessibility.AccessibilityEvent
-android.view.accessibility.AccessibilityManager
-android.view.accessibility.AccessibilityManager$1
-android.view.accessibility.IAccessibilityManager$Stub
-android.view.accessibility.IAccessibilityManagerClient$Stub
+android.view.animation.AccelerateDecelerateInterpolator
android.view.animation.AlphaAnimation
android.view.animation.Animation
android.view.animation.AnimationSet
android.view.animation.LinearInterpolator
-android.view.animation.ScaleAnimation
android.view.animation.Transformation
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.CompletionInfo
+android.view.inputmethod.CompletionInfo$1
+
android.view.inputmethod.EditorInfo
+android.view.inputmethod.EditorInfo$1
+
android.view.inputmethod.ExtractedText
+android.view.inputmethod.ExtractedText$1
+
android.view.inputmethod.ExtractedTextRequest
+android.view.inputmethod.ExtractedTextRequest$1
+
android.view.inputmethod.InputBinding
-android.view.inputmethod.InputConnectionWrapper
+android.view.inputmethod.InputBinding$1
+android.view.inputmethod.InputConnection
+android.view.inputmethod.InputMethod
+android.view.inputmethod.InputMethod$SessionCallback
+
+android.view.inputmethod.InputMethodInfo
+android.view.inputmethod.InputMethodInfo$1
android.view.inputmethod.InputMethodManager
android.view.inputmethod.InputMethodManager$1
+android.view.inputmethod.InputMethodManager$2
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
+android.view.inputmethod.InputMethodManager$H
+
+android.view.inputmethod.InputMethodSession
+android.view.inputmethod.InputMethodSession$EventCallback
android.webkit.BrowserFrame
-android.webkit.CacheLoader
android.webkit.CacheManager
-android.webkit.CacheManager$CacheResult
android.webkit.CallbackProxy
-android.webkit.CallbackProxy$ResultTransport
-android.webkit.ContentLoader
android.webkit.CookieManager
-android.webkit.CookieManager$CookieComparator
android.webkit.CookieSyncManager
-android.webkit.DataLoader
-android.webkit.DateSorter
-android.webkit.FrameLoader
-android.webkit.GeolocationPermissions
-android.webkit.GoogleLocationSettingManager
-android.webkit.HTML5VideoViewProxy
-android.webkit.HttpAuthHandler
android.webkit.HttpDateTime
android.webkit.JWebCoreJavaBridge
android.webkit.LoadListener
android.webkit.MimeTypeMap
-android.webkit.Network
-android.webkit.PluginManager
-android.webkit.SslErrorHandler
-android.webkit.StreamLoader
android.webkit.URLUtil
android.webkit.WebBackForwardList
-android.webkit.WebChromeClient
android.webkit.WebHistoryItem
android.webkit.WebIconDatabase
+android.webkit.WebIconDatabase$EventHandler
+android.webkit.WebIconDatabase$EventHandler$1
+android.webkit.WebIconDatabase$EventHandler$IconResult
android.webkit.WebSettings
+android.webkit.WebSettings$EventHandler
+android.webkit.WebSettings$EventHandler$1
+android.webkit.WebSettings$LayoutAlgorithm
+android.webkit.WebSettings$RenderPriority
android.webkit.WebSettings$TextSize
-android.webkit.WebStorage
android.webkit.WebSyncManager
android.webkit.WebSyncManager$SyncHandler
android.webkit.WebTextView
android.webkit.WebView
-android.webkit.WebView$1
-android.webkit.WebView$HitTestResult
-android.webkit.WebView$RequestFormData
-android.webkit.WebViewClient
+android.webkit.WebView$ExtendedZoomControls
+android.webkit.WebView$PrivateHandler
android.webkit.WebViewCore
android.webkit.WebViewCore$CursorData
-android.webkit.WebViewCore$TextSelectionData
-android.webkit.WebViewCore$TouchUpData
+android.webkit.WebViewCore$EventHub
+android.webkit.WebViewCore$EventHub$1
+android.webkit.WebViewCore$WebCoreThread
+android.webkit.WebViewCore$WebCoreThread$1
android.webkit.WebViewDatabase
android.widget.AbsListView
-android.widget.AbsListView$3
android.widget.AbsListView$CheckForLongPress
+android.widget.AbsListView$CheckForTap
+android.widget.AbsListView$LayoutParams
android.widget.AbsListView$PerformClick
android.widget.AbsListView$RecycleBin
android.widget.AbsListView$SavedState
+android.widget.AbsListView$SavedState$1
android.widget.AbsSeekBar
android.widget.AbsSpinner
-android.widget.AbsSpinner$SavedState
android.widget.AbsoluteLayout
+android.widget.AbsoluteLayout$LayoutParams
android.widget.AdapterView
android.widget.AdapterView$AdapterDataSetObserver
-android.widget.AlphabetIndexer
-android.widget.AnalogClock
-android.widget.AnalogClock$1
-android.widget.AppSecurityPermissions
-android.widget.AppSecurityPermissions$1
-android.widget.AppSecurityPermissions$State
android.widget.ArrayAdapter
android.widget.AutoCompleteTextView
+android.widget.AutoCompleteTextView$DropDownItemClickListener
android.widget.AutoCompleteTextView$DropDownListView
android.widget.BaseAdapter
-android.widget.BaseExpandableListAdapter
android.widget.Button
android.widget.CheckBox
+android.widget.Checkable
android.widget.CheckedTextView
-android.widget.Chronometer
android.widget.CompoundButton
-android.widget.CompoundButton$SavedState
android.widget.CursorAdapter
-android.widget.CursorFilter
+android.widget.CursorAdapter$ChangeObserver
+android.widget.CursorAdapter$MyDataSetObserver
android.widget.CursorTreeAdapter
-android.widget.CursorTreeAdapter$MyCursorHelper$MyDataSetObserver
-android.widget.DatePicker
-android.widget.DatePicker$1
android.widget.EditText
-android.widget.ExpandableListConnector
-android.widget.ExpandableListConnector$GroupMetadata
-android.widget.ExpandableListConnector$PositionMetadata
-android.widget.ExpandableListPosition
android.widget.ExpandableListView
-android.widget.ExpandableListView$SavedState
-android.widget.FastScroller
-android.widget.FastScroller$ScrollFade
-android.widget.Filter
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
-android.widget.GridView
+android.widget.Gallery
android.widget.HeaderViewListAdapter
-android.widget.HorizontalScrollView
-android.widget.ImageButton
android.widget.ImageView
android.widget.ImageView$ScaleType
android.widget.LinearLayout
android.widget.LinearLayout$LayoutParams
android.widget.ListView
+android.widget.ListView$ArrowScrollFocusResult
android.widget.ListView$SavedState
-android.widget.MediaController
-android.widget.MediaController$3
-android.widget.MediaController$4
-android.widget.MediaController$MediaPlayerControl
-android.widget.MultiAutoCompleteTextView
+android.widget.ListView$SavedState$1
android.widget.PopupWindow
-android.widget.PopupWindow$1
-android.widget.PopupWindow$PopupViewContainer
android.widget.ProgressBar
-android.widget.ProgressBar$SavedState
-android.widget.QuickContactBadge
-android.widget.RadioButton
android.widget.RadioGroup
-android.widget.RadioGroup$CheckedStateTracker
-android.widget.RadioGroup$PassThroughHierarchyChangeListener
android.widget.RatingBar
android.widget.RelativeLayout
-android.widget.RelativeLayout$DependencyGraph
-android.widget.RelativeLayout$DependencyGraph$Node
-android.widget.RelativeLayout$DependencyGraph$Node$1
+android.widget.RelativeLayout$LayoutParams
android.widget.RemoteViews
-android.widget.RemoteViews$ReflectionAction
-android.widget.RemoteViews$SetOnClickPendingIntent
-android.widget.ResourceCursorAdapter
-android.widget.ResourceCursorTreeAdapter
android.widget.ScrollBarDrawable
android.widget.ScrollView
android.widget.Scroller
android.widget.SeekBar
-android.widget.SimpleAdapter
android.widget.SimpleCursorAdapter
-android.widget.SimpleCursorTreeAdapter
android.widget.SlidingDrawer
android.widget.Spinner
+android.widget.Spinner$DropDownAdapter
android.widget.TabHost
-android.widget.TabHost$1
-android.widget.TabHost$2
-android.widget.TabHost$FactoryContentStrategy
-android.widget.TabHost$IntentContentStrategy
-android.widget.TabHost$LabelAndIconIndicatorStrategy
-android.widget.TabHost$OnTabChangeListener
android.widget.TabWidget
android.widget.TableLayout
-android.widget.TableLayout$PassThroughHierarchyChangeListener
android.widget.TableRow
android.widget.TextView
+android.widget.TextView$1
+android.widget.TextView$Blink
android.widget.TextView$BufferType
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
-android.widget.TextView$CommitSelectionReceiver
+android.widget.TextView$Drawables
+android.widget.TextView$InputContentType
+android.widget.TextView$InputMethodState
+android.widget.TextView$Marquee
android.widget.TextView$MenuHandler
android.widget.TextView$SavedState
-android.widget.TimePicker
-android.widget.TimePicker$2
-android.widget.Toast
-android.widget.Toast$TN
+android.widget.TextView$SavedState$1
+android.widget.ToggleButton
android.widget.TwoLineListItem
-android.widget.VideoView
-android.widget.VideoView$1
-android.widget.VideoView$2
-android.widget.VideoView$3
-android.widget.VideoView$4
-android.widget.VideoView$5
-android.widget.VideoView$6
android.widget.ViewAnimator
android.widget.ViewSwitcher
android.widget.ZoomButton
-android.widget.ZoomButton$1
-android.widget.ZoomButtonsController
-android.widget.ZoomButtonsController$3
-android.widget.ZoomButtonsController$5
-android.widget.ZoomButtonsController$Container
android.widget.ZoomControls
com.android.common.ArrayListCursor
com.android.common.FastXmlSerializer
com.android.common.NetworkConnectivityListener
com.android.common.NetworkConnectivityListener$State
com.android.common.XmlUtils
-com.android.internal.R$styleable
-com.android.internal.app.AlertActivity
-com.android.internal.app.AlertController
-com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$1
-com.android.internal.app.AlertController$RecycleListView
-com.android.internal.app.ChooserActivity
-com.android.internal.app.ResolverActivity
-com.android.internal.app.ResolverActivity$ResolveListAdapter
-com.android.internal.app.RingtonePickerActivity
-com.android.internal.appwidget.IAppWidgetHost$Stub
-com.android.internal.appwidget.IAppWidgetService$Stub
-com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
-com.android.internal.content.SyncStateContentProviderHelper
com.android.internal.database.SortCursor
-com.android.internal.graphics.NativeUtils
-com.android.internal.location.DummyLocationProvider
-com.android.internal.location.GpsLocationProvider
+com.android.internal.appwidget.IAppWidgetService$Stub
+com.android.internal.http.multipart.FilePart
+com.android.internal.http.multipart.MultipartEntity
+com.android.internal.http.multipart.Part
+com.android.internal.http.multipart.PartSource
+com.android.internal.http.multipart.StringPart
+com.android.internal.logging.AndroidConfig
com.android.internal.logging.AndroidHandler
-com.android.internal.logging.AndroidHandler$1
com.android.internal.os.AndroidPrintStream
-com.android.internal.os.BinderInternal
com.android.internal.os.BinderInternal$GcWatcher
-com.android.internal.os.HandlerCaller
-com.android.internal.os.IResultReceiver$Stub
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
com.android.internal.os.RuntimeInit
com.android.internal.os.RuntimeInit$1
com.android.internal.os.RuntimeInit$UncaughtHandler
-com.android.internal.os.SamplingProfilerIntegration
-com.android.internal.os.ZygoteConnection
-com.android.internal.os.ZygoteConnection$Arguments
-com.android.internal.os.ZygoteInit
com.android.internal.os.ZygoteInit$MethodAndArgsCaller
+com.android.internal.policy.IPolicy
com.android.internal.policy.PolicyManager
com.android.internal.policy.impl.PhoneLayoutInflater
com.android.internal.policy.impl.PhoneWindow
+com.android.internal.policy.impl.PhoneWindow$1
+com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
com.android.internal.policy.impl.PhoneWindow$DecorView
-com.android.internal.policy.impl.PhoneWindow$DrawableFeatureState
+com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
-com.android.internal.policy.impl.PhoneWindowManager
+com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1
com.android.internal.policy.impl.Policy
-com.android.internal.preference.YesNoPreference
-com.android.internal.telephony.DefaultPhoneNotifier
-com.android.internal.telephony.GsmAlphabet
+com.android.internal.telephony.Connection$DisconnectCause
+com.android.internal.telephony.Connection$PostDialState
com.android.internal.telephony.IPhoneStateListener$Stub
-com.android.internal.telephony.IPhoneSubInfo$Stub
-com.android.internal.telephony.ISms$Stub
-com.android.internal.telephony.ISms$Stub$Proxy
com.android.internal.telephony.ITelephony$Stub
-com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephonyRegistry$Stub
-com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
-com.android.internal.telephony.IccCard$State
+com.android.internal.telephony.Phone
+com.android.internal.telephony.Phone$DataActivityState
com.android.internal.telephony.Phone$DataState
com.android.internal.telephony.Phone$State
-com.android.internal.telephony.PhoneFactory
+com.android.internal.telephony.Phone$SuppService
+com.android.internal.telephony.PhoneBase
com.android.internal.telephony.PhoneStateIntentReceiver
-com.android.internal.telephony.SmsAddress
-com.android.internal.telephony.SmsMessageBase
-com.android.internal.telephony.gsm.GsmSmsAddress
-com.android.internal.telephony.gsm.SmsMessage
-com.android.internal.telephony.gsm.SmsMessage$PduParser
-com.android.internal.util.ArrayUtils
-com.android.internal.view.BaseIWindow
+com.android.internal.telephony.IccCard$State
+com.android.internal.telephony.BaseCommands
+com.android.internal.telephony.CallForwardInfo
+com.android.internal.telephony.CommandsInterface
+com.android.internal.telephony.DriverCall
+com.android.internal.telephony.DriverCall$State
+com.android.internal.telephony.gsm.GsmConnection
+com.android.internal.telephony.gsm.GSMPhone
+com.android.internal.telephony.GsmAlphabet
+com.android.internal.telephony.gsm.GsmMmiCode
+com.android.internal.telephony.gsm.SimCard
+com.android.internal.telephony.ISms$Stub
+com.android.internal.telephony.RIL
+com.android.internal.telephony.ServiceStateTracker
+
+com.android.internal.telephony.gsm.stk.ComprehensionTlvTag
+com.android.internal.telephony.gsm.stk.ResultCode
com.android.internal.view.IInputConnectionWrapper
+com.android.internal.view.IInputConnectionWrapper$MyHandler
+com.android.internal.view.IInputConnectionWrapper$SomeArgs
+
+com.android.internal.view.IInputContext
com.android.internal.view.IInputContext$Stub
com.android.internal.view.IInputContext$Stub$Proxy
+
+com.android.internal.view.IInputContextCallback
com.android.internal.view.IInputContextCallback$Stub
+com.android.internal.view.IInputContextCallback$Stub$Proxy
+
+com.android.internal.view.IInputMethod
com.android.internal.view.IInputMethod$Stub
+com.android.internal.view.IInputMethod$Stub$Proxy
+
+com.android.internal.view.IInputMethodCallback
com.android.internal.view.IInputMethodCallback$Stub
com.android.internal.view.IInputMethodCallback$Stub$Proxy
+
+com.android.internal.view.IInputMethodClient
com.android.internal.view.IInputMethodClient$Stub
+com.android.internal.view.IInputMethodClient$Stub$Proxy
+
+com.android.internal.view.IInputMethodManager
com.android.internal.view.IInputMethodManager$Stub
com.android.internal.view.IInputMethodManager$Stub$Proxy
+
+com.android.internal.view.IInputMethodSession
com.android.internal.view.IInputMethodSession$Stub
+com.android.internal.view.IInputMethodSession$Stub$Proxy
+
com.android.internal.view.InputBindResult
+com.android.internal.view.InputBindResult$1
+
com.android.internal.view.InputConnectionWrapper
com.android.internal.view.InputConnectionWrapper$InputContextCallback
-com.android.internal.view.menu.ContextMenuBuilder
com.android.internal.view.menu.ExpandedMenuView
com.android.internal.view.menu.IconMenuItemView
com.android.internal.view.menu.IconMenuView
-com.android.internal.view.menu.IconMenuView$SavedState
com.android.internal.view.menu.ListMenuItemView
com.android.internal.view.menu.MenuBuilder
-com.android.internal.view.menu.MenuBuilder$MenuType
+com.android.internal.view.menu.MenuBuilder$Callback
com.android.internal.view.menu.MenuDialogHelper
com.android.internal.view.menu.MenuItemImpl
com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.ContactHeaderWidget
-com.android.internal.widget.DialogTitle
-com.android.internal.widget.EditableInputConnection
-com.android.internal.widget.LockPatternUtils
com.android.internal.widget.RotarySelector
com.android.internal.widget.Smileys
com.google.android.gles_jni.EGLDisplayImpl
com.google.android.gles_jni.EGLImpl
-com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
-com.google.android.mms.util.SqliteWrapper
-com.google.android.net.GoogleHttpClient
-com.google.android.net.GoogleHttpClient$WrappedSocketFactory
-com.google.android.net.NetworkStatsEntity
-com.google.android.net.ParentalControl
-com.google.android.net.ParentalControl$RemoteCallback
-com.google.android.net.ParentalControlState
-com.google.android.net.ParentalControlState$1
-com.google.android.net.UrlRules
-com.google.android.net.UrlRules$Rule
+com.google.android.mms.ContentType
+com.google.android.mms.pdu.CharacterSets
+com.google.android.mms.pdu.PduPart
+com.google.android.mms.pdu.PduPersister
com.ibm.icu4jni.charset.CharsetDecoderICU
com.ibm.icu4jni.charset.CharsetEncoderICU
com.ibm.icu4jni.charset.CharsetICU
-com.ibm.icu4jni.charset.CharsetProviderICU
-com.ibm.icu4jni.charset.NativeConverter
-com.ibm.icu4jni.common.ErrorCode
-com.ibm.icu4jni.lang.UCharacter
-com.ibm.icu4jni.regex.NativeRegEx
com.ibm.icu4jni.text.CollationAttribute
-com.ibm.icu4jni.text.CollationKey
-com.ibm.icu4jni.text.Collator
com.ibm.icu4jni.text.DecimalFormat
com.ibm.icu4jni.text.DecimalFormatSymbols
-com.ibm.icu4jni.text.NativeBreakIterator
-com.ibm.icu4jni.text.NativeCollation
-com.ibm.icu4jni.text.NativeDecimalFormat
com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatAttribute
-com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatSymbol
com.ibm.icu4jni.text.RuleBasedCollator
-com.ibm.icu4jni.text.RuleBasedNumberFormat
-com.ibm.icu4jni.util.Resources
com.ibm.icu4jni.util.Resources$DefaultTimeZones
-com.ibm.icu4jni.util.Resources$Locale
-dalvik.system.NativeStart
+dalvik.system.DexFile
dalvik.system.PathClassLoader
-dalvik.system.SamplingProfiler
-dalvik.system.SamplingProfiler$State
-dalvik.system.TouchDex
-dalvik.system.VMDebug
-dalvik.system.VMRuntime
-dalvik.system.VMStack
-dalvik.system.Zygote
java.beans.PropertyChangeEvent
+java.beans.PropertyChangeListener
java.beans.PropertyChangeSupport
java.io.BufferedInputStream
-java.io.BufferedReader
java.io.ByteArrayInputStream
-java.io.Closeable
-java.io.DataInput
-java.io.DataInputStream
-java.io.DataOutput
-java.io.DataOutputStream
-java.io.EmulatedFieldsForDumping
-java.io.EmulatedFieldsForLoading
+java.io.ByteArrayOutputStream
java.io.File
java.io.FileDescriptor
java.io.FileInputStream
java.io.FileInputStream$RepositioningLock
java.io.FileNotFoundException
-java.io.FileOutputStream
-java.io.FilterOutputStream
-java.io.FilterReader
-java.io.Flushable
-java.io.InputStream
-java.io.InputStreamReader
-java.io.ObjectInput
-java.io.ObjectInputStream
-java.io.ObjectInputStream$GetField
-java.io.ObjectOutput
-java.io.ObjectOutputStream
+java.io.FilterInputStream
+java.io.IOException
java.io.ObjectStreamClass
-java.io.ObjectStreamClass$3
-java.io.ObjectStreamClass$OSCThreadLocalCache
-java.io.ObjectStreamConstants
-java.io.ObjectStreamField
-java.io.OutputStream
-java.io.OutputStreamWriter
-java.io.PrintStream
java.io.PrintWriter
-java.io.PushbackReader
java.io.RandomAccessFile
-java.io.Reader
-java.io.Serializable
-java.io.StreamCorruptedException
-java.io.StringReader
+java.io.RandomAccessFile$RepositionLock
java.io.StringWriter
java.io.Writer
-java.lang.AbstractStringBuilder
-java.lang.Appendable
-java.lang.ArrayIndexOutOfBoundsException
-java.lang.Boolean
-java.lang.BootClassLoader
-java.lang.Byte
-java.lang.CharSequence
-java.lang.Character
-java.lang.Character$valueOfCache
java.lang.Class
java.lang.ClassCache
-java.lang.ClassCache$EnumComparator
-java.lang.ClassLoader
-java.lang.ClassLoader$SystemClassLoader
-java.lang.Cloneable
-java.lang.Comparable
-java.lang.Double
-java.lang.Enum
-java.lang.Error
-java.lang.Exception
-java.lang.Float
+java.lang.ClassNotFoundException
java.lang.IllegalArgumentException
+java.lang.IllegalStateException
java.lang.Integer
-java.lang.Integer$valueOfCache
-java.lang.InternalError
-java.lang.InterruptedException
-java.lang.Iterable
-java.lang.LangAccessImpl
java.lang.LinkageError
java.lang.Long
-java.lang.Long$valueOfCache
-java.lang.Math
java.lang.NoClassDefFoundError
-java.lang.NoSuchFieldError
-java.lang.NoSuchMethodError
-java.lang.Number
java.lang.NumberFormatException
java.lang.Object
-java.lang.OutOfMemoryError
-java.lang.Package
-java.lang.Readable
-java.lang.Runnable
java.lang.Runtime
java.lang.RuntimeException
-java.lang.RuntimePermission
-java.lang.SecurityException
-java.lang.Short
-java.lang.Short$valueOfCache
-java.lang.StackOverflowError
-java.lang.StackTraceElement
-java.lang.StrictMath
java.lang.String
-java.lang.String$CaseInsensitiveComparator
java.lang.StringBuffer
java.lang.StringBuilder
-java.lang.System
-java.lang.SystemProperties
java.lang.Thread
-java.lang.Thread$State
-java.lang.Thread$UncaughtExceptionHandler
-java.lang.ThreadGroup
-java.lang.ThreadGroup$ChildrenGroupsLock
-java.lang.ThreadGroup$ChildrenThreadsLock
java.lang.ThreadLocal
java.lang.ThreadLocal$Values
java.lang.Throwable
-java.lang.UnsatisfiedLinkError
-java.lang.UnsupportedOperationException
-java.lang.VMClassLoader
java.lang.VMThread
-java.lang.VirtualMachineError
-java.lang.Void
-java.lang.annotation.Annotation
-java.lang.ref.PhantomReference
-java.lang.ref.Reference
java.lang.ref.ReferenceQueue
java.lang.ref.SoftReference
java.lang.ref.WeakReference
-java.lang.reflect.AccessibleObject
-java.lang.reflect.AnnotatedElement
-java.lang.reflect.Array
java.lang.reflect.Constructor
-java.lang.reflect.Field
-java.lang.reflect.GenericDeclaration
-java.lang.reflect.InvocationHandler
-java.lang.reflect.Member
java.lang.reflect.Method
java.lang.reflect.Modifier
-java.lang.reflect.Proxy
-java.lang.reflect.ReflectionAccessImpl
-java.lang.reflect.Type
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
java.math.Multiplication
-java.net.DatagramPacket
-java.net.HttpURLConnection
-java.net.Inet4Address
+java.net.ContentHandler
java.net.InetAddress
-java.net.InetAddress$1
-java.net.InetAddress$2
+java.net.InetAddress$CacheElement
java.net.InetAddress$WaitReachable
-java.net.InetSocketAddress
java.net.JarURLConnection
java.net.NegativeCache
-java.net.NetworkInterface
-java.net.Proxy
-java.net.Proxy$Type
-java.net.ProxySelector
+java.net.NetPermission
java.net.ProxySelectorImpl
-java.net.ResponseCache
-java.net.ServerSocket
-java.net.Socket
-java.net.SocketImpl
-java.net.SocketOptions
-java.net.SocketTimeoutException
+java.net.Socket$ConnectLock
java.net.URI
java.net.URL
java.net.URLConnection
java.net.URLConnection$DefaultContentHandler
java.net.URLStreamHandler
-java.nio.BaseByteBuffer
-java.nio.Buffer
-java.nio.BufferFactory
-java.nio.ByteBuffer
java.nio.ByteOrder
-java.nio.CharArrayBuffer
-java.nio.CharBuffer
java.nio.CharSequenceAdapter
-java.nio.CharToByteBufferAdapter
java.nio.DirectByteBuffer
-java.nio.DirectByteBuffer$SafeAddress
-java.nio.FloatToByteBufferAdapter
-java.nio.HeapByteBuffer
-java.nio.IntBuffer
-java.nio.IntToByteBufferAdapter
-java.nio.NIOAccess
-java.nio.ReadWriteCharArrayBuffer
java.nio.ReadWriteDirectByteBuffer
-java.nio.ReadWriteHeapByteBuffer
+java.nio.ReadWriteIntArrayBuffer
+java.nio.ReadWriteShortArrayBuffer
java.nio.ShortBuffer
java.nio.ShortToByteBufferAdapter
-java.nio.channels.ByteChannel
-java.nio.channels.Channel
-java.nio.channels.FileChannel
-java.nio.channels.GatheringByteChannel
-java.nio.channels.InterruptibleChannel
-java.nio.channels.ReadableByteChannel
-java.nio.channels.ScatteringByteChannel
-java.nio.channels.WritableByteChannel
-java.nio.channels.spi.AbstractInterruptibleChannel
-java.nio.channels.spi.AbstractInterruptibleChannel$1
-java.nio.charset.Charset
-java.nio.charset.Charset$1
-java.nio.charset.CharsetDecoder
java.nio.charset.CharsetEncoder
-java.nio.charset.CoderResult
-java.nio.charset.CodingErrorAction
-java.nio.charset.spi.CharsetProvider
-java.security.AccessController
-java.security.BasicPermission
-java.security.Guard
-java.security.KeyFactory
+java.security.AccessControlContext
+java.security.GeneralSecurityException
java.security.KeyStore
java.security.MessageDigest
-java.security.NoSuchAlgorithmException
-java.security.Permission
-java.security.PrivilegedAction
-java.security.PrivilegedExceptionAction
+java.security.ProtectionDomain
java.security.Provider
java.security.SecureRandom
java.security.Security
-java.security.Security$SecurityDoor
-java.security.cert.CertPath
java.security.cert.CertPathValidator
-java.security.cert.CertificateException
java.security.cert.CertificateFactory
-java.security.cert.CertificateParsingException
-java.security.cert.PKIXCertPathValidatorResult
java.security.cert.PKIXParameters
+java.security.cert.TrustAnchor
+java.security.cert.X509CertSelector
java.security.cert.X509Certificate
-java.security.interfaces.RSAPublicKey
-java.security.spec.X509EncodedKeySpec
-java.text.AttributedCharacterIterator$Attribute
-java.text.CollationKey
java.text.Collator
java.text.DateFormat
java.text.DateFormat$Field
-java.text.DateFormatSymbols
java.text.DecimalFormat
java.text.DecimalFormatSymbols
-java.text.Format
-java.text.Format$Field
+java.text.MessageFormat
java.text.NumberFormat
+java.text.RuleBasedCollator
java.text.SimpleDateFormat
-java.util.AbstractCollection
-java.util.AbstractList
java.util.AbstractList$FullListIterator
java.util.AbstractList$SimpleListIterator
-java.util.AbstractList$SubAbstractList
-java.util.AbstractList$SubAbstractListRandomAccess
-java.util.AbstractMap
-java.util.AbstractQueue
-java.util.AbstractSequentialList
-java.util.AbstractSet
java.util.ArrayList
java.util.Arrays
java.util.Arrays$ArrayList
-java.util.BitSet
java.util.Calendar
-java.util.Collection
-java.util.Collections
-java.util.Collections$EmptyList
-java.util.Collections$EmptyMap
-java.util.Collections$EmptySet
-java.util.Collections$SingletonList
-java.util.Collections$SingletonSet
java.util.Collections$SynchronizedCollection
-java.util.Collections$SynchronizedList
-java.util.Collections$SynchronizedRandomAccessList
-java.util.Collections$UnmodifiableCollection
-java.util.Collections$UnmodifiableCollection$1
java.util.Collections$UnmodifiableList
java.util.Collections$UnmodifiableMap
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet
java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1
-java.util.Collections$UnmodifiableRandomAccessList
-java.util.Collections$UnmodifiableSet
-java.util.Comparator
-java.util.Currency
java.util.Date
-java.util.Dictionary
java.util.EnumMap
-java.util.EnumSet
-java.util.Enumeration
+java.util.EventListener
+java.util.EventObject
java.util.Formatter
-java.util.Formatter$FormatToken
-java.util.Formatter$ParserStateMachine
-java.util.Formatter$Transformer
java.util.GregorianCalendar
java.util.HashMap
-java.util.HashMap$HashIterator
-java.util.HashMap$HashMapEntry
-java.util.HashMap$KeyIterator
-java.util.HashMap$KeySet
java.util.HashSet
java.util.Hashtable
-java.util.Hashtable$HashtableEntry
-java.util.Hashtable$KeyEnumeration
java.util.IdentityHashMap
-java.util.Iterator
java.util.LinkedHashMap
-java.util.LinkedHashMap$KeyIterator
-java.util.LinkedHashMap$ValueIterator
java.util.LinkedList
-java.util.LinkedList$LinkIterator
+java.util.LinkedList$Link
java.util.List
java.util.Locale
-java.util.Map
-java.util.Map$Entry
-java.util.MiniEnumSet
-java.util.MiniEnumSet$MiniEnumSetIterator
-java.util.Observable
-java.util.PriorityQueue
java.util.Properties
-java.util.PropertyPermission
-java.util.RandomAccess
+java.util.Random
java.util.ResourceBundle
-java.util.Set
java.util.SimpleTimeZone
-java.util.SortedMap
-java.util.SortedSet
-java.util.SpecialAccess
-java.util.Stack
-java.util.StringTokenizer
-java.util.TimSort
java.util.TimeZone
java.util.TreeMap
-java.util.TreeMap$1
-java.util.TreeMap$UnboundedKeyIterator
+java.util.TreeMap$MapEntry
java.util.TreeSet
-java.util.UUID
java.util.Vector
-java.util.Vector$1
java.util.WeakHashMap
-java.util.WeakHashMap$1
-java.util.WeakHashMap$1$1
java.util.WeakHashMap$Entry
-java.util.concurrent.AbstractExecutorService
-java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.ConcurrentHashMap
-java.util.concurrent.ConcurrentHashMap$Segment
java.util.concurrent.ConcurrentLinkedQueue
-java.util.concurrent.ConcurrentLinkedQueue$Node
-java.util.concurrent.CopyOnWriteArrayList
-java.util.concurrent.CopyOnWriteArrayList$COWIterator
-java.util.concurrent.CountDownLatch
-java.util.concurrent.CountDownLatch$Sync
-java.util.concurrent.Executors$DefaultThreadFactory
-java.util.concurrent.Executors$DelegatedExecutorService
-java.util.concurrent.Executors$FinalizableDelegatedExecutorService
-java.util.concurrent.Executors$RunnableAdapter
-java.util.concurrent.FutureTask
-java.util.concurrent.FutureTask$Sync
+java.util.concurrent.DelayQueue
java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.ScheduledThreadPoolExecutor
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
-java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
-java.util.concurrent.Semaphore
-java.util.concurrent.SynchronousQueue
-java.util.concurrent.SynchronousQueue$TransferStack
-java.util.concurrent.SynchronousQueue$TransferStack$SNode
-java.util.concurrent.ThreadPoolExecutor
-java.util.concurrent.ThreadPoolExecutor$AbortPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
java.util.concurrent.TimeUnit
+java.util.concurrent.atomic.AtomicBoolean
java.util.concurrent.atomic.AtomicInteger
-java.util.concurrent.atomic.AtomicLong
-java.util.concurrent.atomic.AtomicReference
java.util.concurrent.atomic.UnsafeAccess
java.util.concurrent.locks.AbstractQueuedSynchronizer
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
+java.util.concurrent.locks.Lock
+java.util.concurrent.locks.LockSupport
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantLock$FairSync
java.util.concurrent.locks.ReentrantLock$NonfairSync
java.util.concurrent.locks.ReentrantLock$Sync
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
-java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock
-java.util.concurrent.locks.ReentrantReadWriteLock$Sync
+java.util.concurrent.locks.UnsafeAccess
java.util.jar.Attributes
java.util.jar.Attributes$Name
+java.util.jar.InitManifest
+java.util.jar.JarEntry
java.util.jar.JarFile
+java.util.jar.JarFile$1JarFileEnumerator
+java.util.jar.JarFile$JarFileInputStream
java.util.jar.JarVerifier
java.util.jar.Manifest
java.util.logging.ErrorManager
+java.util.logging.Formatter
java.util.logging.Handler
java.util.logging.Level
java.util.logging.LogManager
+java.util.logging.LogManager$1
+java.util.logging.LogManager$2
+java.util.logging.LogManager$2$1
+java.util.logging.LogManager$3
java.util.logging.LogRecord
java.util.logging.Logger
-java.util.regex.MatchResult
+java.util.logging.LoggingPermission
+java.util.logging.SimpleFormatter
java.util.regex.Matcher
java.util.regex.Pattern
-java.util.zip.Adler32
-java.util.zip.CRC32
-java.util.zip.Checksum
-java.util.zip.Deflater
java.util.zip.DeflaterOutputStream
-java.util.zip.GZIPOutputStream
java.util.zip.Inflater
java.util.zip.InflaterInputStream
+java.util.zip.ZipConstants
java.util.zip.ZipEntry
+java.util.zip.ZipEntry$LittleEndianReader
java.util.zip.ZipFile
-javax.crypto.Cipher
-javax.crypto.CipherSpi
-javax.crypto.Mac
-javax.crypto.spec.SecretKeySpec
-javax.microedition.khronos.egl.EGL
-javax.microedition.khronos.egl.EGL10
+java.util.zip.ZipFile$2
+java.util.zip.ZipFile$RAFStream
javax.microedition.khronos.egl.EGLContext
-javax.microedition.khronos.opengles.GL
-javax.microedition.khronos.opengles.GL10
-javax.microedition.khronos.opengles.GL10Ext
-javax.microedition.khronos.opengles.GL11
-javax.microedition.khronos.opengles.GL11Ext
-javax.microedition.khronos.opengles.GL11ExtensionPack
-javax.net.ssl.DefaultHostnameVerifier
javax.net.ssl.HttpsURLConnection
-javax.net.ssl.KeyManagerFactory
-javax.net.ssl.SSLContext
-javax.net.ssl.SSLServerSocket
-javax.net.ssl.SSLSession
-javax.net.ssl.SSLSocket
-javax.net.ssl.SSLSocketFactory
-javax.net.ssl.TrustManagerFactory
-javax.net.ssl.X509ExtendedKeyManager
+javax.net.ssl.SSLHandshakeException
javax.security.auth.x500.X500Principal
javax.security.cert.X509Certificate
-javax.xml.parsers.SAXParserFactory
+javax.security.cert.X509Certificate$2
junit.framework.Assert
org.apache.commons.codec.binary.Base64
org.apache.commons.codec.binary.Hex
org.apache.commons.logging.LogFactory
org.apache.commons.logging.impl.Jdk14Logger
-org.apache.commons.logging.impl.WeakHashtable
-org.apache.harmony.crypto.internal.NullCipherSpi
-org.apache.harmony.dalvik.NativeTestTarget
+org.apache.harmony.archive.util.Util
+org.apache.harmony.dalvik.ddmc.Chunk
org.apache.harmony.dalvik.ddmc.ChunkHandler
org.apache.harmony.dalvik.ddmc.DdmServer
-org.apache.harmony.kernel.vm.LangAccess
-org.apache.harmony.kernel.vm.ReflectionAccess
-org.apache.harmony.lang.annotation.AnnotationFactory
-org.apache.harmony.lang.annotation.AnnotationMember
-org.apache.harmony.lang.annotation.AnnotationMember$DefaultValues
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConfiguration
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection
+org.apache.harmony.dalvik.ddmc.DdmVmInternal
+org.apache.harmony.luni.internal.net.www.protocol.file.FileURLConnection
+org.apache.harmony.luni.internal.net.www.protocol.file.Handler
+org.apache.harmony.luni.internal.net.www.protocol.http.Handler
+org.apache.harmony.luni.internal.net.www.protocol.https.Handler
org.apache.harmony.luni.internal.net.www.protocol.jar.Handler
+org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl
+org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl$1
+org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl$JarURLConnectionInputStream
org.apache.harmony.luni.internal.util.TimezoneGetter
org.apache.harmony.luni.internal.util.ZoneInfo
org.apache.harmony.luni.internal.util.ZoneInfoDB
-org.apache.harmony.luni.net.GenericIPMreq
org.apache.harmony.luni.net.PlainSocketImpl
-org.apache.harmony.luni.platform.Endianness
-org.apache.harmony.luni.platform.ICommonDataTypes
-org.apache.harmony.luni.platform.IFileSystem
-org.apache.harmony.luni.platform.IMemorySystem
-org.apache.harmony.luni.platform.INetworkSystem
-org.apache.harmony.luni.platform.OSFileSystem
-org.apache.harmony.luni.platform.OSMemory
-org.apache.harmony.luni.platform.OSNetworkSystem
-org.apache.harmony.luni.platform.Platform
org.apache.harmony.luni.platform.PlatformAddress
-org.apache.harmony.luni.platform.PlatformAddressFactory
-org.apache.harmony.luni.platform.RuntimeMemorySpy
-org.apache.harmony.luni.util.FloatingPointParser
-org.apache.harmony.luni.util.InputStreamExposer
-org.apache.harmony.luni.util.Msg
-org.apache.harmony.luni.util.NumberConverter
-org.apache.harmony.luni.util.PriviAction
-org.apache.harmony.luni.util.ThreadLocalCache
-org.apache.harmony.luni.util.ThreadLocalCache$1
org.apache.harmony.luni.util.TwoKeyHashMap
-org.apache.harmony.luni.util.Util
-org.apache.harmony.nio.AddressUtil
-org.apache.harmony.nio.FileChannelFactory
-org.apache.harmony.nio.internal.DirectBuffer
-org.apache.harmony.nio.internal.FileChannelImpl
org.apache.harmony.nio.internal.FileChannelImpl$RepositioningLock
org.apache.harmony.nio.internal.LockManager
org.apache.harmony.nio.internal.LockManager$1
-org.apache.harmony.nio.internal.WriteOnlyFileChannel
-org.apache.harmony.security.asn1.ASN1Any
-org.apache.harmony.security.asn1.ASN1Constructured
+org.apache.harmony.nio.internal.ReadOnlyFileChannel
+org.apache.harmony.security.asn1.ASN1BitString
+org.apache.harmony.security.asn1.ASN1BitString$ASN1NamedBitList
+org.apache.harmony.security.asn1.ASN1Boolean
+org.apache.harmony.security.asn1.ASN1Explicit
org.apache.harmony.security.asn1.ASN1GeneralizedTime
+org.apache.harmony.security.asn1.ASN1Implicit
org.apache.harmony.security.asn1.ASN1Integer
-org.apache.harmony.security.asn1.ASN1Oid
-org.apache.harmony.security.asn1.ASN1Sequence
+org.apache.harmony.security.asn1.ASN1OctetString
org.apache.harmony.security.asn1.ASN1SetOf
org.apache.harmony.security.asn1.ASN1StringType
-org.apache.harmony.security.asn1.ASN1Type
-org.apache.harmony.security.asn1.ASN1ValueCollection
-org.apache.harmony.security.asn1.BerInputStream
-org.apache.harmony.security.asn1.DerInputStream
-org.apache.harmony.security.asn1.DerOutputStream
+org.apache.harmony.security.asn1.ASN1StringType$1
+org.apache.harmony.security.asn1.ASN1StringType$2
+org.apache.harmony.security.asn1.ASN1StringType$3
+org.apache.harmony.security.asn1.ASN1StringType$4
+org.apache.harmony.security.asn1.ASN1StringType$5
+org.apache.harmony.security.asn1.ASN1StringType$6
+org.apache.harmony.security.asn1.ASN1StringType$7
+org.apache.harmony.security.asn1.ASN1UTCTime
+org.apache.harmony.security.asn1.BitString
+org.apache.harmony.security.fortress.Engine
org.apache.harmony.security.fortress.SecurityUtils
org.apache.harmony.security.fortress.Services
org.apache.harmony.security.pkcs7.ContentInfo
-org.apache.harmony.security.provider.cert.DRLCertFactory
org.apache.harmony.security.provider.cert.X509CertFactoryImpl
org.apache.harmony.security.provider.cert.X509CertImpl
org.apache.harmony.security.provider.cert.X509CertPathImpl
org.apache.harmony.security.provider.crypto.RandomBitsSupplier
org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl
-org.apache.harmony.security.provider.crypto.SHA1_MessageDigestImpl
org.apache.harmony.security.utils.AlgNameMapper
org.apache.harmony.security.x501.AttributeTypeAndValue
-org.apache.harmony.security.x501.AttributeTypeAndValue$2
+org.apache.harmony.security.x501.AttributeValue
org.apache.harmony.security.x501.DirectoryString
org.apache.harmony.security.x501.DirectoryString$1
org.apache.harmony.security.x501.Name
org.apache.harmony.security.x501.Name$1
org.apache.harmony.security.x509.AlgorithmIdentifier
+org.apache.harmony.security.x509.AlgorithmIdentifier$1
org.apache.harmony.security.x509.BasicConstraints
+org.apache.harmony.security.x509.BasicConstraints$1
org.apache.harmony.security.x509.Certificate
-org.apache.harmony.security.x509.EDIPartyName
+org.apache.harmony.security.x509.Certificate$1
org.apache.harmony.security.x509.Extension
org.apache.harmony.security.x509.Extension$1
+org.apache.harmony.security.x509.Extension$2
org.apache.harmony.security.x509.Extensions
+org.apache.harmony.security.x509.Extensions$1
org.apache.harmony.security.x509.GeneralName
org.apache.harmony.security.x509.GeneralNames
org.apache.harmony.security.x509.KeyUsage
org.apache.harmony.security.x509.ORAddress
-org.apache.harmony.security.x509.OtherName
org.apache.harmony.security.x509.SubjectPublicKeyInfo
+org.apache.harmony.security.x509.SubjectPublicKeyInfo$1
org.apache.harmony.security.x509.TBSCertificate
+org.apache.harmony.security.x509.TBSCertificate$1
org.apache.harmony.security.x509.Time
+org.apache.harmony.security.x509.Time$1
org.apache.harmony.security.x509.Validity
-org.apache.harmony.text.BidiWrapper
-org.apache.harmony.text.internal.nls.Messages
-org.apache.harmony.xml.ExpatAttributes
+org.apache.harmony.security.x509.Validity$1
org.apache.harmony.xml.ExpatParser
-org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatPullParser
-org.apache.harmony.xml.ExpatPullParser$ByteDocument
-org.apache.harmony.xml.ExpatPullParser$CharDocument
-org.apache.harmony.xml.ExpatPullParser$Document$SaxHandler
-org.apache.harmony.xml.ExpatPullParser$NamespaceStack
-org.apache.harmony.xml.ExpatPullParser$StartDocumentEvent
org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.parsers.SAXParserFactoryImpl
-org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.harmony.xnet.provider.jsse.AbstractSessionContext
org.apache.harmony.xnet.provider.jsse.ClientSessionContext
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.KeyManagerImpl
-org.apache.harmony.xnet.provider.jsse.NativeCrypto
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigest
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK$MD5
-org.apache.harmony.xnet.provider.jsse.OpenSSLServerSocketImpl
org.apache.harmony.xnet.provider.jsse.OpenSSLSessionImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$LoggerHolder
-org.apache.harmony.xnet.provider.jsse.ProtocolVersion
+org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$Finalizer
+org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream
+org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream
org.apache.harmony.xnet.provider.jsse.SSLContextImpl
org.apache.harmony.xnet.provider.jsse.SSLParameters
-org.apache.harmony.xnet.provider.jsse.ServerSessionContext
org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl
org.apache.harmony.xnet.provider.jsse.TrustManagerImpl
org.apache.http.HttpHost
+org.apache.http.HttpRequestInterceptor
org.apache.http.HttpVersion
-org.apache.http.NoHttpResponseException
-org.apache.http.ProtocolException
+org.apache.http.auth.AuthSchemeRegistry
org.apache.http.client.HttpClient
-org.apache.http.client.entity.UrlEncodedFormEntity
-org.apache.http.client.methods.HttpEntityEnclosingRequestBase
-org.apache.http.client.methods.HttpGet
-org.apache.http.client.methods.HttpPost
+org.apache.http.client.RequestDirector
org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.utils.URLEncodedUtils
-org.apache.http.conn.BasicManagedEntity
-org.apache.http.conn.params.ConnManagerParams
+org.apache.http.client.protocol.RequestAddCookies
+org.apache.http.client.protocol.RequestDefaultHeaders
+org.apache.http.client.protocol.RequestProxyAuthentication
+org.apache.http.client.protocol.RequestTargetAuthentication
+org.apache.http.client.protocol.ResponseProcessCookies
org.apache.http.conn.params.ConnManagerParams$1
org.apache.http.conn.params.ConnRouteParams
-org.apache.http.conn.routing.BasicRouteDirector
org.apache.http.conn.routing.HttpRoute
org.apache.http.conn.routing.RouteInfo$LayerType
org.apache.http.conn.routing.RouteInfo$TunnelType
@@ -1687,99 +1014,79 @@
org.apache.http.conn.scheme.PlainSocketFactory
org.apache.http.conn.scheme.Scheme
org.apache.http.conn.scheme.SchemeRegistry
-org.apache.http.conn.ssl.AbstractVerifier
org.apache.http.conn.ssl.AllowAllHostnameVerifier
+org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
org.apache.http.conn.ssl.SSLSocketFactory
+org.apache.http.conn.ssl.StrictHostnameVerifier
org.apache.http.conn.util.InetAddressUtils
-org.apache.http.entity.AbstractHttpEntity
-org.apache.http.entity.BasicHttpEntity
-org.apache.http.entity.ByteArrayEntity
-org.apache.http.entity.StringEntity
-org.apache.http.impl.AbstractHttpClientConnection
+org.apache.http.cookie.CookieSpecRegistry
org.apache.http.impl.DefaultConnectionReuseStrategy
org.apache.http.impl.DefaultHttpResponseFactory
org.apache.http.impl.EnglishReasonPhraseCatalog
org.apache.http.impl.HttpConnectionMetricsImpl
org.apache.http.impl.SocketHttpClientConnection
org.apache.http.impl.auth.BasicSchemeFactory
+org.apache.http.impl.auth.DigestSchemeFactory
org.apache.http.impl.client.AbstractAuthenticationHandler
org.apache.http.impl.client.AbstractHttpClient
-org.apache.http.impl.client.BasicCookieStore
org.apache.http.impl.client.BasicCredentialsProvider
-org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy
org.apache.http.impl.client.DefaultHttpClient
org.apache.http.impl.client.DefaultHttpRequestRetryHandler
+org.apache.http.impl.client.DefaultProxyAuthenticationHandler
org.apache.http.impl.client.DefaultRedirectHandler
-org.apache.http.impl.client.DefaultRequestDirector
org.apache.http.impl.client.DefaultTargetAuthenticationHandler
+org.apache.http.impl.client.DefaultUserTokenHandler
org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RequestWrapper
org.apache.http.impl.conn.AbstractClientConnAdapter
-org.apache.http.impl.conn.AbstractPooledConnAdapter
org.apache.http.impl.conn.DefaultClientConnection
org.apache.http.impl.conn.DefaultClientConnectionOperator
org.apache.http.impl.conn.DefaultHttpRoutePlanner
org.apache.http.impl.conn.DefaultResponseParser
-org.apache.http.impl.conn.SingleClientConnManager
-org.apache.http.impl.conn.SingleClientConnManager$1
-org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter
-org.apache.http.impl.conn.SingleClientConnManager$PoolEntry
-org.apache.http.impl.conn.tsccm.AbstractConnPool
+org.apache.http.impl.conn.IdleConnectionHandler
org.apache.http.impl.conn.tsccm.BasicPoolEntry
-org.apache.http.impl.conn.tsccm.BasicPooledConnAdapter
+org.apache.http.impl.conn.tsccm.BasicPoolEntryRef
org.apache.http.impl.conn.tsccm.ConnPoolByRoute
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1
+org.apache.http.impl.conn.tsccm.RefQueueWorker
+org.apache.http.impl.conn.tsccm.RouteSpecificPool
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
-org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
-org.apache.http.impl.cookie.AbstractCookieAttributeHandler
org.apache.http.impl.cookie.BasicClientCookie
-org.apache.http.impl.cookie.BestMatchSpec
org.apache.http.impl.cookie.BestMatchSpecFactory
-org.apache.http.impl.cookie.BrowserCompatSpec
-org.apache.http.impl.cookie.CookieSpecBase
+org.apache.http.impl.cookie.BrowserCompatSpecFactory
org.apache.http.impl.cookie.DateUtils
-org.apache.http.impl.cookie.DateUtils$DateFormatHolder
-org.apache.http.impl.cookie.NetscapeDomainHandler
-org.apache.http.impl.cookie.NetscapeDraftSpec
-org.apache.http.impl.cookie.RFC2109Spec
-org.apache.http.impl.cookie.RFC2109VersionHandler
-org.apache.http.impl.cookie.RFC2965Spec
+org.apache.http.impl.cookie.NetscapeDraftSpecFactory
+org.apache.http.impl.cookie.RFC2109SpecFactory
+org.apache.http.impl.cookie.RFC2965SpecFactory
+org.apache.http.impl.entity.EntityDeserializer
+org.apache.http.impl.entity.EntitySerializer
+org.apache.http.impl.entity.LaxContentLengthStrategy
org.apache.http.impl.entity.StrictContentLengthStrategy
-org.apache.http.impl.io.AbstractSessionInputBuffer
-org.apache.http.impl.io.AbstractSessionOutputBuffer
-org.apache.http.impl.io.ChunkedInputStream
-org.apache.http.impl.io.ContentLengthInputStream
org.apache.http.impl.io.HttpRequestWriter
+org.apache.http.impl.io.HttpTransportMetricsImpl
org.apache.http.impl.io.SocketInputBuffer
org.apache.http.impl.io.SocketOutputBuffer
-org.apache.http.message.AbstractHttpMessage
-org.apache.http.message.BasicHeader
-org.apache.http.message.BasicHeaderElement
-org.apache.http.message.BasicHeaderElementIterator
org.apache.http.message.BasicHeaderValueParser
-org.apache.http.message.BasicHttpRequest
+org.apache.http.message.BasicHttpEntityEnclosingRequest
org.apache.http.message.BasicHttpResponse
org.apache.http.message.BasicLineFormatter
org.apache.http.message.BasicLineParser
-org.apache.http.message.BasicListHeaderIterator
-org.apache.http.message.BasicNameValuePair
-org.apache.http.message.BasicRequestLine
-org.apache.http.message.BasicTokenIterator
-org.apache.http.message.HeaderGroup
-org.apache.http.params.AbstractHttpParams
org.apache.http.params.BasicHttpParams
-org.apache.http.params.HttpConnectionParams
-org.apache.http.params.HttpProtocolParams
-org.apache.http.protocol.BasicHttpContext
org.apache.http.protocol.BasicHttpProcessor
org.apache.http.protocol.HTTP
+org.apache.http.protocol.HttpRequestExecutor
+org.apache.http.protocol.HttpRequestInterceptorList
+org.apache.http.protocol.HttpResponseInterceptorList
+org.apache.http.protocol.RequestConnControl
+org.apache.http.protocol.RequestContent
+org.apache.http.protocol.RequestExpectContinue
+org.apache.http.protocol.RequestTargetHost
+org.apache.http.protocol.RequestUserAgent
+org.apache.http.util.ByteArrayBuffer
org.apache.http.util.CharArrayBuffer
+org.apache.http.util.EntityUtils
org.apache.http.util.VersionInfo
-org.bouncycastle.asn1.ASN1Encodable
-org.bouncycastle.asn1.ASN1EncodableVector
-org.bouncycastle.asn1.ASN1Sequence
org.bouncycastle.asn1.DERBitString
-org.bouncycastle.asn1.DERNull
+org.bouncycastle.asn1.DERIA5String
+org.bouncycastle.asn1.DERInteger
org.bouncycastle.asn1.DERObject
org.bouncycastle.asn1.DERObjectIdentifier
org.bouncycastle.asn1.DEROctetString
@@ -1787,62 +1094,41 @@
org.bouncycastle.asn1.DERSequence
org.bouncycastle.asn1.DERSet
org.bouncycastle.asn1.DERTaggedObject
-org.bouncycastle.asn1.iana.IANAObjectIdentifiers
+org.bouncycastle.asn1.DERUTCTime
+org.bouncycastle.asn1.DERUTF8String
+org.bouncycastle.asn1.OrderedTable
org.bouncycastle.asn1.nist.NISTObjectIdentifiers
-org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
-org.bouncycastle.asn1.x509.BasicConstraints
+org.bouncycastle.asn1.x509.AlgorithmIdentifier
org.bouncycastle.asn1.x509.RSAPublicKeyStructure
+org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
org.bouncycastle.asn1.x509.TBSCertificateStructure
org.bouncycastle.asn1.x509.Time
org.bouncycastle.asn1.x509.X509CertificateStructure
-org.bouncycastle.asn1.x509.X509DefaultEntryConverter
+org.bouncycastle.asn1.x509.X509Extension
org.bouncycastle.asn1.x509.X509Extensions
org.bouncycastle.asn1.x509.X509Name
-org.bouncycastle.crypto.BufferedBlockCipher
-org.bouncycastle.crypto.PBEParametersGenerator
-org.bouncycastle.crypto.digests.GeneralDigest
-org.bouncycastle.crypto.digests.SHA1Digest
+org.bouncycastle.asn1.x509.X509NameElementList
+org.bouncycastle.asn1.x9.X9ObjectIdentifiers
org.bouncycastle.crypto.engines.AESFastEngine
-org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
-org.bouncycastle.crypto.macs.HMac
-org.bouncycastle.crypto.paddings.PKCS7Padding
-org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
-org.bouncycastle.crypto.params.KeyParameter
-org.bouncycastle.jce.provider.BouncyCastleProvider
org.bouncycastle.jce.provider.CertPathValidatorUtilities
-org.bouncycastle.jce.provider.IndexedPKIXParameters
-org.bouncycastle.jce.provider.JCEBlockCipher
org.bouncycastle.jce.provider.JCEBlockCipher$AES
-org.bouncycastle.jce.provider.JCEMac
-org.bouncycastle.jce.provider.JCEMac$SHA1
org.bouncycastle.jce.provider.JCERSAPublicKey
-org.bouncycastle.jce.provider.JDKKeyFactory
+org.bouncycastle.jce.provider.JDKKeyFactory$RSA
org.bouncycastle.jce.provider.JDKKeyStore
-org.bouncycastle.jce.provider.JDKX509CertificateFactory
+org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry
org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi
-org.bouncycastle.jce.provider.PKIXPolicyNode
-org.bouncycastle.jce.provider.WrapCipherSpi
+org.bouncycastle.jce.provider.RSAUtil
org.bouncycastle.jce.provider.X509CertificateObject
-org.ccil.cowan.tagsoup.AttributesImpl
-org.ccil.cowan.tagsoup.Element
-org.ccil.cowan.tagsoup.ElementType
org.ccil.cowan.tagsoup.HTMLScanner
-org.ccil.cowan.tagsoup.HTMLSchema
org.ccil.cowan.tagsoup.Parser
-org.ccil.cowan.tagsoup.Schema
org.json.JSONArray
org.json.JSONObject
org.json.JSONStringer
-org.json.JSONTokener
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlSerializer
-org.openssl.NativeBN
-org.xml.sax.Attributes
-org.xml.sax.InputSource
-org.xml.sax.helpers.AttributesImpl
org.xml.sax.helpers.DefaultHandler
-org.xmlpull.v1.XmlPullParser
+org.xml.sax.helpers.NewInstance
org.xmlpull.v1.XmlPullParserFactory
-org.xmlpull.v1.XmlSerializer
+org.xmlpull.v1.sax2.Driver
sun.misc.Unsafe
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 3307932..2e45512 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -22,6 +22,10 @@
import android.app.IApplicationThread;
import android.app.IBackupAgent;
import android.app.PendingIntent;
+import android.backup.IBackupManager;
+import android.backup.IRestoreObserver;
+import android.backup.IRestoreSession;
+import android.backup.RestoreSet;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -31,11 +35,10 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
-import android.provider.Settings;
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
@@ -47,20 +50,15 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.provider.Settings;
import android.util.EventLog;
import android.util.Log;
import android.util.SparseArray;
-import android.backup.IBackupManager;
-import android.backup.IRestoreObserver;
-import android.backup.IRestoreSession;
-import android.backup.RestoreSet;
-
import com.android.internal.backup.BackupConstants;
-import com.android.internal.backup.LocalTransport;
import com.android.internal.backup.IBackupTransport;
-
-import com.android.server.PackageManagerBackupAgent;
+import com.android.internal.backup.LocalTransport;
import com.android.server.PackageManagerBackupAgent.Metadata;
import java.io.EOFException;
@@ -70,7 +68,6 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
-import java.lang.String;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -216,7 +213,10 @@
Settings.Secure.BACKUP_ENABLED, 0) != 0;
mProvisioned = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.BACKUP_PROVISIONED, 0) != 0;
- mBaseStateDir = new File(Environment.getDataDirectory(), "backup");
+ // If Encrypted file systems is enabled or disabled, this call will return the
+ // correct directory.
+ mBaseStateDir = new File(Environment.getSecureDataDirectory(), "backup");
+ mBaseStateDir.mkdirs();
mDataDir = Environment.getDownloadCacheDirectory();
// Alarm receivers for scheduled backups & initialization operations
@@ -497,11 +497,21 @@
}
}
- // Add a transport to our set of available backends
+ // Add a transport to our set of available backends. If 'transport' is null, this
+ // is an unregistration, and the transport's entry is removed from our bookkeeping.
private void registerTransport(String name, IBackupTransport transport) {
synchronized (mTransports) {
if (DEBUG) Log.v(TAG, "Registering transport " + name + " = " + transport);
- mTransports.put(name, transport);
+ if (transport != null) {
+ mTransports.put(name, transport);
+ } else {
+ mTransports.remove(name);
+ if (mCurrentTransport.equals(name)) {
+ mCurrentTransport = null;
+ }
+ // Nothing further to do in the unregistration case
+ return;
+ }
}
// If the init sentinel file exists, we need to be sure to perform the init
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index bdebc8d..f435ebc 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -413,10 +413,10 @@
private final void logOutlier(long duration) {
ContentResolver cr = mContext.getContentResolver();
- String dischargeThresholdString = Settings.Gservices.getString(cr,
- Settings.Gservices.BATTERY_DISCHARGE_THRESHOLD);
- String durationThresholdString = Settings.Gservices.getString(cr,
- Settings.Gservices.BATTERY_DISCHARGE_DURATION_THRESHOLD);
+ String dischargeThresholdString = Settings.Secure.getString(cr,
+ Settings.Secure.BATTERY_DISCHARGE_THRESHOLD);
+ String durationThresholdString = Settings.Secure.getString(cr,
+ Settings.Secure.BATTERY_DISCHARGE_DURATION_THRESHOLD);
if (dischargeThresholdString != null && durationThresholdString != null) {
try {
diff --git a/services/java/com/android/server/BootReceiver.java b/services/java/com/android/server/BootReceiver.java
index 84f0068..debbbb4 100644
--- a/services/java/com/android/server/BootReceiver.java
+++ b/services/java/com/android/server/BootReceiver.java
@@ -23,12 +23,11 @@
import android.os.Build;
import android.os.DropBoxManager;
import android.os.FileUtils;
+import android.os.RecoverySystem;
import android.os.SystemProperties;
import android.provider.Settings;
import android.util.Log;
-import com.android.internal.os.RecoverySystem;
-
import java.io.File;
import java.io.IOException;
@@ -39,6 +38,10 @@
public class BootReceiver extends BroadcastReceiver {
private static final String TAG = "BootReceiver";
+ // Negative meaning capture the *last* 64K of the file
+ // (passed to FileUtils.readTextFile)
+ private static final int LOG_SIZE = -65536;
+
@Override
public void onReceive(Context context, Intent intent) {
try {
@@ -68,16 +71,20 @@
private void logBootEvents(Context context) throws IOException {
DropBoxManager db = (DropBoxManager) context.getSystemService(Context.DROPBOX_SERVICE);
- String build =
- "Build: " + Build.FINGERPRINT + "\nKernel: " +
- FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n");
+ StringBuilder props = new StringBuilder();
+ props.append("Build: ").append(Build.FINGERPRINT).append("\n");
+ props.append("Hardware: ").append(Build.BOARD).append("\n");
+ props.append("Bootloader: ").append(Build.BOOTLOADER).append("\n");
+ props.append("Radio: ").append(Build.RADIO).append("\n");
+ props.append("Kernel: ");
+ props.append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n"));
if (SystemProperties.getLong("ro.runtime.firstboot", 0) == 0) {
String now = Long.toString(System.currentTimeMillis());
SystemProperties.set("ro.runtime.firstboot", now);
- if (db != null) db.addText("SYSTEM_BOOT", build);
+ if (db != null) db.addText("SYSTEM_BOOT", props.toString());
} else {
- if (db != null) db.addText("SYSTEM_RESTART", build);
+ if (db != null) db.addText("SYSTEM_RESTART", props.toString());
return; // Subsequent boot, don't log kernel boot log
}
@@ -99,6 +106,13 @@
String setting = "logfile:" + filename;
long lastTime = Settings.Secure.getLong(cr, setting, 0);
if (lastTime == fileTime) return; // Already logged this particular file
- db.addFile(tag, file, DropBoxManager.IS_TEXT);
+ Settings.Secure.putLong(cr, setting, fileTime);
+
+ StringBuilder report = new StringBuilder();
+ report.append("Build: ").append(Build.FINGERPRINT).append("\n");
+ report.append("Kernel: ");
+ report.append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n"));
+ report.append(FileUtils.readTextFile(new File(filename), LOG_SIZE, "[[TRUNCATED]]\n"));
+ db.addText(tag, report.toString());
}
}
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index b2463b5..80129d06 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -112,23 +112,9 @@
public NetworkAttributes(String init) {
String fragments[] = init.split(",");
mName = fragments[0].toLowerCase();
- if (fragments[1].toLowerCase().equals("wifi")) {
- mRadio = ConnectivityManager.TYPE_WIFI;
- } else {
- mRadio = ConnectivityManager.TYPE_MOBILE;
- }
- if (mName.equals("default")) {
- mType = mRadio;
- } else if (mName.equals("mms")) {
- mType = ConnectivityManager.TYPE_MOBILE_MMS;
- } else if (mName.equals("supl")) {
- mType = ConnectivityManager.TYPE_MOBILE_SUPL;
- } else if (mName.equals("dun")) {
- mType = ConnectivityManager.TYPE_MOBILE_DUN;
- } else if (mName.equals("hipri")) {
- mType = ConnectivityManager.TYPE_MOBILE_HIPRI;
- }
- mPriority = Integer.parseInt(fragments[2]);
+ mType = Integer.parseInt(fragments[1]);
+ mRadio = Integer.parseInt(fragments[2]);
+ mPriority = Integer.parseInt(fragments[3]);
mLastState = NetworkInfo.State.UNKNOWN;
}
public boolean isDefault() {
@@ -136,22 +122,15 @@
}
}
NetworkAttributes[] mNetAttributes;
+ int mNetworksDefined;
private static class RadioAttributes {
- public String mName;
- public int mPriority;
public int mSimultaneity;
public int mType;
public RadioAttributes(String init) {
String fragments[] = init.split(",");
- mName = fragments[0].toLowerCase();
- mPriority = Integer.parseInt(fragments[1]);
- mSimultaneity = Integer.parseInt(fragments[2]);
- if (mName.equals("wifi")) {
- mType = ConnectivityManager.TYPE_WIFI;
- } else {
- mType = ConnectivityManager.TYPE_MOBILE;
- }
+ mType = Integer.parseInt(fragments[0]);
+ mSimultaneity = Integer.parseInt(fragments[1]);
}
}
RadioAttributes[] mRadioAttributes;
@@ -208,48 +187,87 @@
mNetworkPreference = getPersistedNetworkPreference();
+ mRadioAttributes = new RadioAttributes[ConnectivityManager.MAX_RADIO_TYPE+1];
+ mNetAttributes = new NetworkAttributes[ConnectivityManager.MAX_NETWORK_TYPE+1];
+
// Load device network attributes from resources
- mNetAttributes = new NetworkAttributes[
- ConnectivityManager.MAX_NETWORK_TYPE+1];
- mRadioAttributes = new RadioAttributes[
- ConnectivityManager.MAX_RADIO_TYPE+1];
- String[] naStrings = context.getResources().getStringArray(
- com.android.internal.R.array.networkAttributes);
- // TODO - what if the setting has gaps/unknown types?
- for (String a : naStrings) {
- NetworkAttributes n = new NetworkAttributes(a);
- mNetAttributes[n.mType] = n;
- }
String[] raStrings = context.getResources().getStringArray(
com.android.internal.R.array.radioAttributes);
- for (String a : raStrings) {
- RadioAttributes r = new RadioAttributes(a);
+ for (String raString : raStrings) {
+ RadioAttributes r = new RadioAttributes(raString);
+ if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {
+ Log.e(TAG, "Error in radioAttributes - ignoring attempt to define type " + r.mType);
+ continue;
+ }
+ if (mRadioAttributes[r.mType] != null) {
+ Log.e(TAG, "Error in radioAttributes - ignoring attempt to redefine type " +
+ r.mType);
+ continue;
+ }
mRadioAttributes[r.mType] = r;
}
- // high priority first
- mPriorityList = new int[naStrings.length];
- {
- int priority = 0; //lowest
- int nextPos = naStrings.length-1;
- while (nextPos>-1) {
- for (int i = 0; i < mNetAttributes.length; i++) {
- if(mNetAttributes[i].mPriority == priority) {
- mPriorityList[nextPos--] = i;
- }
+ String[] naStrings = context.getResources().getStringArray(
+ com.android.internal.R.array.networkAttributes);
+ for (String naString : naStrings) {
+ try {
+ NetworkAttributes n = new NetworkAttributes(naString);
+ if (n.mType > ConnectivityManager.MAX_NETWORK_TYPE) {
+ Log.e(TAG, "Error in networkAttributes - ignoring attempt to define type " +
+ n.mType);
+ continue;
}
- priority++;
+ if (mNetAttributes[n.mType] != null) {
+ Log.e(TAG, "Error in networkAttributes - ignoring attempt to redefine type " +
+ n.mType);
+ continue;
+ }
+ if (mRadioAttributes[n.mRadio] == null) {
+ Log.e(TAG, "Error in networkAttributes - ignoring attempt to use undefined " +
+ "radio " + n.mRadio + " in network type " + n.mType);
+ continue;
+ }
+ mNetAttributes[n.mType] = n;
+ mNetworksDefined++;
+ } catch(Exception e) {
+ // ignore it - leave the entry null
}
}
- mNetRequestersPids =
- new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
- for (int i=0; i<=ConnectivityManager.MAX_NETWORK_TYPE; i++) {
+ // high priority first
+ mPriorityList = new int[mNetworksDefined];
+ {
+ int insertionPoint = mNetworksDefined-1;
+ int currentLowest = 0;
+ int nextLowest = 0;
+ while (insertionPoint > -1) {
+ for (NetworkAttributes na : mNetAttributes) {
+ if (na == null) continue;
+ if (na.mPriority < currentLowest) continue;
+ if (na.mPriority > currentLowest) {
+ if (na.mPriority < nextLowest || nextLowest == 0) {
+ nextLowest = na.mPriority;
+ }
+ continue;
+ }
+ mPriorityList[insertionPoint--] = na.mType;
+ }
+ currentLowest = nextLowest;
+ nextLowest = 0;
+ }
+ }
+
+ mNetRequestersPids = new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
+ for (int i : mPriorityList) {
mNetRequestersPids[i] = new ArrayList();
}
mFeatureUsers = new ArrayList();
+ mNumDnsEntries = 0;
+
+ mTestMode = SystemProperties.get("cm.test.mode").equals("true")
+ && SystemProperties.get("ro.build.type").equals("eng");
/*
* Create the network state trackers for Wi-Fi and mobile
* data. Maybe this could be done with a factory class,
@@ -257,49 +275,33 @@
* the number of different network types is not going
* to change very often.
*/
- if (DBG) Log.v(TAG, "Starting Wifi Service.");
- WifiStateTracker wst = new WifiStateTracker(context, mHandler);
- WifiService wifiService = new WifiService(context, wst);
- ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
- mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst;
+ for (int netType : mPriorityList) {
+ switch (mNetAttributes[netType].mRadio) {
+ case ConnectivityManager.TYPE_WIFI:
+ if (DBG) Log.v(TAG, "Starting Wifi Service.");
+ WifiStateTracker wst = new WifiStateTracker(context, mHandler);
+ WifiService wifiService = new WifiService(context, wst);
+ ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
+ mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst;
+ wst.startMonitoring();
- mNetTrackers[ConnectivityManager.TYPE_MOBILE] =
- new MobileDataStateTracker(context, mHandler,
- ConnectivityManager.TYPE_MOBILE, Phone.APN_TYPE_DEFAULT,
- "MOBILE");
-
- mNetTrackers[ConnectivityManager.TYPE_MOBILE_MMS] =
- new MobileDataStateTracker(context, mHandler,
- ConnectivityManager.TYPE_MOBILE_MMS, Phone.APN_TYPE_MMS,
- "MOBILE_MMS");
-
- mNetTrackers[ConnectivityManager.TYPE_MOBILE_SUPL] =
- new MobileDataStateTracker(context, mHandler,
- ConnectivityManager.TYPE_MOBILE_SUPL, Phone.APN_TYPE_SUPL,
- "MOBILE_SUPL");
-
- mNetTrackers[ConnectivityManager.TYPE_MOBILE_DUN] =
- new MobileDataStateTracker(context, mHandler,
- ConnectivityManager.TYPE_MOBILE_DUN, Phone.APN_TYPE_DUN,
- "MOBILE_DUN");
-
- mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI] =
- new MobileDataStateTracker(context, mHandler,
- ConnectivityManager.TYPE_MOBILE_HIPRI, Phone.APN_TYPE_HIPRI,
- "MOBILE_HIPRI");
-
- mNumDnsEntries = 0;
-
- mTestMode = SystemProperties.get("cm.test.mode").equals("true")
- && SystemProperties.get("ro.build.type").equals("eng");
-
- for (NetworkStateTracker t : mNetTrackers)
- t.startMonitoring();
-
- // Constructing this starts it too
- mWifiWatchdogService = new WifiWatchdogService(context, wst);
+ // Constructing this starts it too
+ mWifiWatchdogService = new WifiWatchdogService(context, wst);
+ break;
+ case ConnectivityManager.TYPE_MOBILE:
+ mNetTrackers[netType] = new MobileDataStateTracker(context, mHandler,
+ netType, mNetAttributes[netType].mName);
+ mNetTrackers[netType].startMonitoring();
+ break;
+ default:
+ Log.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
+ mNetAttributes[netType].mRadio);
+ continue;
+ }
+ }
}
+
/**
* Sets the preferred network.
* @param preference the new preference
@@ -307,6 +309,7 @@
public synchronized void setNetworkPreference(int preference) {
enforceChangePermission();
if (ConnectivityManager.isNetworkTypeValid(preference) &&
+ mNetAttributes[preference] != null &&
mNetAttributes[preference].isDefault()) {
if (mNetworkPreference != preference) {
persistNetworkPreference(preference);
@@ -354,7 +357,7 @@
return;
for (int t=0; t <= ConnectivityManager.MAX_RADIO_TYPE; t++) {
- if (t != mNetworkPreference &&
+ if (t != mNetworkPreference && mNetTrackers[t] != null &&
mNetTrackers[t].getNetworkInfo().isConnected()) {
if (DBG) {
Log.d(TAG, "tearing down " +
@@ -385,7 +388,7 @@
public NetworkInfo getActiveNetworkInfo() {
enforceAccessPermission();
for (int type=0; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
- if (!mNetAttributes[type].isDefault()) {
+ if (mNetAttributes[type] == null || !mNetAttributes[type].isDefault()) {
continue;
}
NetworkStateTracker t = mNetTrackers[type];
@@ -412,10 +415,10 @@
public NetworkInfo[] getAllNetworkInfo() {
enforceAccessPermission();
- NetworkInfo[] result = new NetworkInfo[mNetTrackers.length];
+ NetworkInfo[] result = new NetworkInfo[mNetworksDefined];
int i = 0;
for (NetworkStateTracker t : mNetTrackers) {
- result[i++] = t.getNetworkInfo();
+ if(t != null) result[i++] = t.getNetworkInfo();
}
return result;
}
@@ -424,7 +427,7 @@
boolean result = true;
enforceChangePermission();
for (NetworkStateTracker t : mNetTrackers) {
- result = t.setRadio(turnOn) && result;
+ if (t != null) result = t.setRadio(turnOn) && result;
}
return result;
}
@@ -451,6 +454,7 @@
IBinder mBinder;
int mPid;
int mUid;
+ long mCreateTime;
FeatureUser(int type, String feature, IBinder binder) {
super();
@@ -459,6 +463,7 @@
mBinder = binder;
mPid = getCallingPid();
mUid = getCallingUid();
+ mCreateTime = System.currentTimeMillis();
try {
mBinder.linkToDeath(this, 0);
@@ -473,15 +478,22 @@
public void binderDied() {
Log.d(TAG, "ConnectivityService FeatureUser binderDied(" +
- mNetworkType + ", " + mFeature + ", " + mBinder);
+ mNetworkType + ", " + mFeature + ", " + mBinder + "), created " +
+ (System.currentTimeMillis() - mCreateTime) + " mSec ago");
stopUsingNetworkFeature(this, false);
}
public void expire() {
Log.d(TAG, "ConnectivityService FeatureUser expire(" +
- mNetworkType + ", " + mFeature + ", " + mBinder);
+ mNetworkType + ", " + mFeature + ", " + mBinder +"), created " +
+ (System.currentTimeMillis() - mCreateTime) + " mSec ago");
stopUsingNetworkFeature(this, false);
}
+
+ public String toString() {
+ return "FeatureUser("+mNetworkType+","+mFeature+","+mPid+","+mUid+"), created " +
+ (System.currentTimeMillis() - mCreateTime) + " mSec ago";
+ }
}
// javadoc from interface
@@ -492,7 +504,8 @@
": " + feature);
}
enforceChangePermission();
- if (!ConnectivityManager.isNetworkTypeValid(networkType)) {
+ if (!ConnectivityManager.isNetworkTypeValid(networkType) ||
+ mNetAttributes[networkType] == null) {
return Phone.APN_REQUEST_FAILED;
}
@@ -595,6 +608,7 @@
return stopUsingNetworkFeature(u, true);
} else {
// none found!
+ if (DBG) Log.d(TAG, "ignoring stopUsingNetworkFeature - not a live request");
return 1;
}
}
@@ -639,6 +653,7 @@
if (x.mUid == u.mUid && x.mPid == u.mPid &&
x.mNetworkType == u.mNetworkType &&
TextUtils.equals(x.mFeature, u.mFeature)) {
+ if (DBG) Log.d(TAG, "ignoring stopUsingNetworkFeature as dup is found");
return 1;
}
}
@@ -658,7 +673,10 @@
}
}
tracker = mNetTrackers[usedNetworkType];
- if(usedNetworkType != networkType) {
+ if (tracker == null) {
+ return -1;
+ }
+ if (usedNetworkType != networkType) {
Integer currentPid = new Integer(pid);
mNetRequestersPids[usedNetworkType].remove(currentPid);
reassessPidDns(pid, true);
@@ -696,9 +714,10 @@
}
NetworkStateTracker tracker = mNetTrackers[networkType];
- if (!tracker.getNetworkInfo().isConnected() || tracker.isTeardownRequested()) {
+ if (tracker == null || !tracker.getNetworkInfo().isConnected() ||
+ tracker.isTeardownRequested()) {
if (DBG) {
- Log.d(TAG, "requestRouteToHost on down network (" + networkType + " - dropped");
+ Log.d(TAG, "requestRouteToHost on down network (" + networkType + ") - dropped");
}
return false;
}
@@ -736,7 +755,7 @@
int numConnectedNets = 0;
for (NetworkStateTracker nt : mNetTrackers) {
- if (nt.getNetworkInfo().isConnected() &&
+ if (nt != null && nt.getNetworkInfo().isConnected() &&
!nt.isTeardownRequested()) {
++numConnectedNets;
}
@@ -814,9 +833,8 @@
int newPriority = -1;
for (int checkType=0; checkType <=
ConnectivityManager.MAX_NETWORK_TYPE; checkType++) {
- if (checkType == prevNetType) {
- continue;
- }
+ if (checkType == prevNetType) continue;
+ if (mNetAttributes[checkType] == null) continue;
if (mNetAttributes[checkType].isDefault()) {
/* TODO - if we have multiple nets we could use
* we may want to put more thought into which we choose
@@ -825,11 +843,9 @@
newType = checkType;
break;
}
- if (mRadioAttributes[mNetAttributes[checkType].mRadio].
- mPriority > newPriority) {
+ if (mNetAttributes[checkType].mPriority > newPriority) {
newType = checkType;
- newPriority = mRadioAttributes[mNetAttributes[newType].
- mRadio].mPriority;
+ newPriority = mNetAttributes[newType].mPriority;
}
}
}
@@ -1194,14 +1210,32 @@
}
pw.println();
for (NetworkStateTracker nst : mNetTrackers) {
- if (nst.getNetworkInfo().isConnected()) {
- pw.println("Active network: " + nst.getNetworkInfo().
- getTypeName());
+ if (nst != null) {
+ if (nst.getNetworkInfo().isConnected()) {
+ pw.println("Active network: " + nst.getNetworkInfo().
+ getTypeName());
+ }
+ pw.println(nst.getNetworkInfo());
+ pw.println(nst);
+ pw.println();
}
- pw.println(nst.getNetworkInfo());
- pw.println(nst);
- pw.println();
}
+
+ pw.println("Network Requester Pids:");
+ for (int net : mPriorityList) {
+ String pidString = net + ": ";
+ for (Object pid : mNetRequestersPids[net]) {
+ pidString = pidString + pid.toString() + ", ";
+ }
+ pw.println(pidString);
+ }
+ pw.println();
+
+ pw.println("FeatureUsers:");
+ for (Object requester : mFeatureUsers) {
+ pw.println(requester.toString());
+ }
+ pw.println();
}
// must be stateless - things change under us.
diff --git a/services/java/com/android/server/DeviceStorageMonitorService.java b/services/java/com/android/server/DeviceStorageMonitorService.java
index 8e54c6e..e58d346 100644
--- a/services/java/com/android/server/DeviceStorageMonitorService.java
+++ b/services/java/com/android/server/DeviceStorageMonitorService.java
@@ -34,25 +34,29 @@
import android.os.StatFs;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.provider.Settings.Gservices;
+import android.provider.Settings;
import android.util.Config;
import android.util.EventLog;
import android.util.Log;
import android.provider.Settings;
/**
- * This class implements a service to monitor the amount of disk storage space
- * on the device. If the free storage on device is less than a tunable threshold value
- * (default is 10%. this value is a gservices parameter) a low memory notification is
- * displayed to alert the user. If the user clicks on the low memory notification the
- * Application Manager application gets launched to let the user free storage space.
- * Event log events:
- * A low memory event with the free storage on device in bytes is logged to the event log
- * when the device goes low on storage space.
- * The amount of free storage on the device is periodically logged to the event log. The log
- * interval is a gservices parameter with a default value of 12 hours
- * When the free storage differential goes below a threshold(again a gservices parameter with
- * a default value of 2MB), the free memory is logged to the event log
+ * This class implements a service to monitor the amount of disk
+ * storage space on the device. If the free storage on device is less
+ * than a tunable threshold value (a secure settings parameter;
+ * default 10%) a low memory notification is displayed to alert the
+ * user. If the user clicks on the low memory notification the
+ * Application Manager application gets launched to let the user free
+ * storage space.
+ *
+ * Event log events: A low memory event with the free storage on
+ * device in bytes is logged to the event log when the device goes low
+ * on storage space. The amount of free storage on the device is
+ * periodically logged to the event log. The log interval is a secure
+ * settings parameter with a default value of 12 hours. When the free
+ * storage differential goes below a threshold (again a secure
+ * settings parameter with a default value of 2MB), the free memory is
+ * logged to the event log.
*/
class DeviceStorageMonitorService extends Binder {
private static final String TAG = "DeviceStorageMonitorService";
@@ -131,9 +135,9 @@
if (!"".equals(debugFreeMem)) {
mFreeMem = Long.parseLong(debugFreeMem);
}
- // Read the log interval from Gservices
- long freeMemLogInterval = Gservices.getLong(mContentResolver,
- Gservices.SYS_FREE_STORAGE_LOG_INTERVAL,
+ // Read the log interval from secure settings
+ long freeMemLogInterval = Settings.Secure.getLong(mContentResolver,
+ Settings.Secure.SYS_FREE_STORAGE_LOG_INTERVAL,
DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES)*60*1000;
//log the amount of free memory in event log
long currTime = SystemClock.elapsedRealtime();
@@ -159,9 +163,9 @@
EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
mFreeMem, mFreeSystem, mFreeCache);
}
- // Read the reporting threshold from Gservices
- long threshold = Gservices.getLong(mContentResolver,
- Gservices.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
+ // Read the reporting threshold from secure settings
+ long threshold = Settings.Secure.getLong(mContentResolver,
+ Settings.Secure.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD);
// If mFree changed significantly log the new value
long delta = mFreeMem - mLastReportedFreeMem;
@@ -247,13 +251,13 @@
/*
* just query settings to retrieve the memory threshold.
- * Preferred this over using a ContentObserver since Settings.Gservices caches the value
+ * Preferred this over using a ContentObserver since Settings.Secure caches the value
* any way
*/
private long getMemThreshold() {
- int value = Settings.Gservices.getInt(
+ int value = Settings.Secure.getInt(
mContentResolver,
- Settings.Gservices.SYS_STORAGE_THRESHOLD_PERCENTAGE,
+ Settings.Secure.SYS_STORAGE_THRESHOLD_PERCENTAGE,
DEFAULT_THRESHOLD_PERCENTAGE);
if(localLOGV) Log.v(TAG, "Threshold Percentage="+value);
//evaluate threshold value
diff --git a/services/java/com/android/server/DropBoxManagerService.java b/services/java/com/android/server/DropBoxManagerService.java
index e1db6b6..090e9d3 100644
--- a/services/java/com/android/server/DropBoxManagerService.java
+++ b/services/java/com/android/server/DropBoxManagerService.java
@@ -22,9 +22,11 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.database.ContentObserver;
import android.net.Uri;
import android.os.Debug;
import android.os.DropBoxManager;
+import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.StatFs;
import android.os.SystemClock;
@@ -113,14 +115,21 @@
* @param context to use for receiving free space & gservices intents
* @param path to store drop box entries in
*/
- public DropBoxManagerService(Context context, File path) {
+ public DropBoxManagerService(final Context context, File path) {
mDropBoxDir = path;
// Set up intent receivers
mContext = context;
mContentResolver = context.getContentResolver();
context.registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW));
- context.registerReceiver(mReceiver, new IntentFilter(Settings.Gservices.CHANGED_ACTION));
+
+ mContentResolver.registerContentObserver(
+ Settings.Secure.CONTENT_URI, true,
+ new ContentObserver(new Handler()) {
+ public void onChange(boolean selfChange) {
+ mReceiver.onReceive(context, (Intent) null);
+ }
+ });
// The real work gets done lazily in init() -- that way service creation always
// succeeds, and things like disk problems cause individual method failures.
@@ -205,8 +214,8 @@
}
public boolean isTagEnabled(String tag) {
- return !"disabled".equals(Settings.Gservices.getString(
- mContentResolver, Settings.Gservices.DROPBOX_TAG_PREFIX + tag));
+ return !"disabled".equals(Settings.Secure.getString(
+ mContentResolver, Settings.Secure.DROPBOX_TAG_PREFIX + tag));
}
public synchronized DropBoxManager.Entry getNextEntry(String tag, long millis) {
@@ -296,6 +305,7 @@
if (!match) continue;
numFound++;
+ if (doPrint) out.append("========================================\n");
out.append(date).append(" ").append(entry.tag == null ? "(no tag)" : entry.tag);
if (entry.file == null) {
out.append(" (no file)\n");
@@ -330,6 +340,12 @@
if (n <= 0) break;
out.append(buf, 0, n);
newline = (buf[n - 1] == '\n');
+
+ // Flush periodically when printing to avoid out-of-memory.
+ if (out.length() > 65536) {
+ pw.write(out.toString());
+ out.setLength(0);
+ }
}
if (!newline) out.append("\n");
} else {
@@ -611,8 +627,8 @@
private synchronized long trimToFit() {
// Expunge aged items (including tombstones marking deleted data).
- int ageSeconds = Settings.Gservices.getInt(mContentResolver,
- Settings.Gservices.DROPBOX_AGE_SECONDS, DEFAULT_AGE_SECONDS);
+ int ageSeconds = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.DROPBOX_AGE_SECONDS, DEFAULT_AGE_SECONDS);
long cutoffMillis = System.currentTimeMillis() - ageSeconds * 1000;
while (!mAllFiles.contents.isEmpty()) {
EntryFile entry = mAllFiles.contents.first();
@@ -631,12 +647,12 @@
long uptimeMillis = SystemClock.uptimeMillis();
if (uptimeMillis > mCachedQuotaUptimeMillis + QUOTA_RESCAN_MILLIS) {
- int quotaPercent = Settings.Gservices.getInt(mContentResolver,
- Settings.Gservices.DROPBOX_QUOTA_PERCENT, DEFAULT_QUOTA_PERCENT);
- int reservePercent = Settings.Gservices.getInt(mContentResolver,
- Settings.Gservices.DROPBOX_RESERVE_PERCENT, DEFAULT_RESERVE_PERCENT);
- int quotaKb = Settings.Gservices.getInt(mContentResolver,
- Settings.Gservices.DROPBOX_QUOTA_KB, DEFAULT_QUOTA_KB);
+ int quotaPercent = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.DROPBOX_QUOTA_PERCENT, DEFAULT_QUOTA_PERCENT);
+ int reservePercent = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.DROPBOX_RESERVE_PERCENT, DEFAULT_RESERVE_PERCENT);
+ int quotaKb = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.DROPBOX_QUOTA_KB, DEFAULT_QUOTA_KB);
mStatFs.restat(mDropBoxDir.getPath());
int available = mStatFs.getAvailableBlocks();
diff --git a/services/java/com/android/server/FallbackCheckinService.java b/services/java/com/android/server/FallbackCheckinService.java
index 88c549b..fc0ab69 100644
--- a/services/java/com/android/server/FallbackCheckinService.java
+++ b/services/java/com/android/server/FallbackCheckinService.java
@@ -21,11 +21,11 @@
import android.os.Binder;
import android.os.ICheckinService;
import android.os.IParentalControlCallback;
+import android.os.RecoverySystem;
import android.util.Log;
import java.io.IOException;
-import com.android.internal.os.RecoverySystem;
import com.google.android.net.ParentalControlState;
/**
@@ -50,12 +50,29 @@
// Save the android ID so the new system can get it erased.
try {
- RecoverySystem.rebootAndWipe();
+ RecoverySystem.rebootWipeUserData(mContext);
} catch (IOException e) {
Log.e(TAG, "Reboot for masterClear() failed", e);
}
}
+ public void masterClearAndToggleEFS(boolean efsEnabled) {
+ if (mContext.checkCallingOrSelfPermission("android.permission.MASTER_CLEAR") !=
+ PackageManager.PERMISSION_GRANTED) {
+ Log.e(TAG, "Permission Denial: can't invoke masterClearAndToggleEFS from "
+ + "pid=" + Binder.getCallingPid() + ", "
+ + "uid=" + Binder.getCallingUid());
+ return;
+ }
+
+ // Save the android ID so the new system can get it erased.
+ try {
+ RecoverySystem.rebootToggleEFS(mContext, efsEnabled);
+ } catch (IOException e) {
+ Log.e(TAG, "Reboot for toggle EFS failed", e);
+ }
+ }
+
public void getParentalControlState(IParentalControlCallback p, String requestingApp)
throws android.os.RemoteException {
ParentalControlState state = new ParentalControlState();
diff --git a/services/java/com/android/server/INativeDaemonConnectorCallbacks.java b/services/java/com/android/server/INativeDaemonConnectorCallbacks.java
new file mode 100644
index 0000000..6fbf713
--- /dev/null
+++ b/services/java/com/android/server/INativeDaemonConnectorCallbacks.java
@@ -0,0 +1,24 @@
+
+/*
+ * 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.
+ */
+
+package com.android.server;
+
+interface INativeDaemonConnectorCallbacks {
+
+ void onDaemonConnected();
+ boolean onEvent(int code, String raw, String[] cooked);
+}
diff --git a/services/java/com/android/server/Installer.java b/services/java/com/android/server/Installer.java
index fe3ad15..6a7d432 100644
--- a/services/java/com/android/server/Installer.java
+++ b/services/java/com/android/server/Installer.java
@@ -166,11 +166,17 @@
}
}
- public int install(String name, int uid, int gid) {
+ public int install(String name, boolean useEncryptedFilesystem, int uid, int gid) {
StringBuilder builder = new StringBuilder("install");
builder.append(' ');
builder.append(name);
builder.append(' ');
+ if (useEncryptedFilesystem) {
+ builder.append('1');
+ } else {
+ builder.append('0');
+ }
+ builder.append(' ');
builder.append(uid);
builder.append(' ');
builder.append(gid);
@@ -203,24 +209,42 @@
return execute(builder.toString());
}
- public int remove(String name) {
+ public int remove(String name, boolean useEncryptedFilesystem) {
StringBuilder builder = new StringBuilder("remove");
builder.append(' ');
builder.append(name);
+ builder.append(' ');
+ if (useEncryptedFilesystem) {
+ builder.append('1');
+ } else {
+ builder.append('0');
+ }
return execute(builder.toString());
}
- public int deleteCacheFiles(String name) {
+ public int deleteCacheFiles(String name, boolean useEncryptedFilesystem) {
StringBuilder builder = new StringBuilder("rmcache");
builder.append(' ');
builder.append(name);
+ builder.append(' ');
+ if (useEncryptedFilesystem) {
+ builder.append('1');
+ } else {
+ builder.append('0');
+ }
return execute(builder.toString());
}
- public int clearUserData(String name) {
+ public int clearUserData(String name, boolean useEncryptedFilesystem) {
StringBuilder builder = new StringBuilder("rmuserdata");
builder.append(' ');
builder.append(name);
+ builder.append(' ');
+ if (useEncryptedFilesystem) {
+ builder.append('1');
+ } else {
+ builder.append('0');
+ }
return execute(builder.toString());
}
@@ -249,7 +273,7 @@
}
public int getSizeInfo(String pkgName, String apkPath,
- String fwdLockApkPath, PackageStats pStats) {
+ String fwdLockApkPath, PackageStats pStats, boolean useEncryptedFilesystem) {
StringBuilder builder = new StringBuilder("getsize");
builder.append(' ');
builder.append(pkgName);
@@ -257,6 +281,12 @@
builder.append(apkPath);
builder.append(' ');
builder.append(fwdLockApkPath != null ? fwdLockApkPath : "!");
+ builder.append(' ');
+ if (useEncryptedFilesystem) {
+ builder.append('1');
+ } else {
+ builder.append('0');
+ }
String s = transaction(builder.toString());
String res[] = s.split(" ");
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 4c3893c..406897d 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -37,6 +37,7 @@
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.location.Address;
+import android.location.GeocoderParams;
import android.location.IGeocodeProvider;
import android.location.IGpsStatusListener;
import android.location.IGpsStatusProvider;
@@ -552,10 +553,8 @@
}
// Use system settings
ContentResolver resolver = mContext.getContentResolver();
- String allowedProviders = Settings.Secure.getString(resolver,
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
- return ((allowedProviders != null) && (allowedProviders.contains(provider)));
+ return Settings.Secure.isLocationProviderEnabled(resolver, provider);
}
private void checkPermissionsSafe(String provider) {
@@ -1657,11 +1656,11 @@
// Geocoder
public String getFromLocation(double latitude, double longitude, int maxResults,
- String language, String country, String variant, String appName, List<Address> addrs) {
+ GeocoderParams params, List<Address> addrs) {
if (mGeocodeProvider != null) {
try {
- return mGeocodeProvider.getFromLocation(latitude, longitude, maxResults, language, country,
- variant, appName, addrs);
+ return mGeocodeProvider.getFromLocation(latitude, longitude, maxResults,
+ params, addrs);
} catch (RemoteException e) {
Log.e(TAG, "getFromLocation failed", e);
mGeocodeProvider = null;
@@ -1674,13 +1673,13 @@
public String getFromLocationName(String locationName,
double lowerLeftLatitude, double lowerLeftLongitude,
double upperRightLatitude, double upperRightLongitude, int maxResults,
- String language, String country, String variant, String appName, List<Address> addrs) {
+ GeocoderParams params, List<Address> addrs) {
if (mGeocodeProvider != null) {
try {
return mGeocodeProvider.getFromLocationName(locationName, lowerLeftLatitude,
lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
- maxResults, language, country, variant, appName, addrs);
+ maxResults, params, addrs);
} catch (RemoteException e) {
Log.e(TAG, "getFromLocationName failed", e);
mGeocodeProvider = null;
diff --git a/services/java/com/android/server/MountListener.java b/services/java/com/android/server/MountListener.java
deleted file mode 100644
index 3e53585..0000000
--- a/services/java/com/android/server/MountListener.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server;
-
-import android.net.LocalSocketAddress;
-import android.net.LocalSocket;
-import android.os.Environment;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.util.Config;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * Thread for communicating with the vol service daemon via a local socket.
- * Events received from the daemon are passed to the MountService instance,
- * and the MountService instance calls MountListener to send commands to the daemon.
- */
-final class MountListener implements Runnable {
-
- private static final String TAG = "MountListener";
-
- // ** THE FOLLOWING STRING CONSTANTS MUST MATCH VALUES IN system/vold/
-
- // socket name for connecting to vold
- private static final String VOLD_SOCKET = "vold";
-
- // vold commands
- private static final String VOLD_CMD_ENABLE_UMS = "enable_ums";
- private static final String VOLD_CMD_DISABLE_UMS = "disable_ums";
- private static final String VOLD_CMD_SEND_UMS_STATUS = "send_ums_status";
- private static final String VOLD_CMD_MOUNT_VOLUME = "mount_volume:";
- private static final String VOLD_CMD_EJECT_MEDIA = "eject_media:";
- private static final String VOLD_CMD_FORMAT_MEDIA = "format_media:";
-
- // vold events
- private static final String VOLD_EVT_UMS_ENABLED = "ums_enabled";
- private static final String VOLD_EVT_UMS_DISABLED = "ums_disabled";
- private static final String VOLD_EVT_UMS_CONNECTED = "ums_connected";
- private static final String VOLD_EVT_UMS_DISCONNECTED = "ums_disconnected";
-
- private static final String VOLD_EVT_NOMEDIA = "volume_nomedia:";
- private static final String VOLD_EVT_UNMOUNTED = "volume_unmounted:";
- private static final String VOLD_EVT_MOUNTED = "volume_mounted:";
- private static final String VOLD_EVT_MOUNTED_RO = "volume_mounted_ro:";
- private static final String VOLD_EVT_UMS = "volume_ums";
- private static final String VOLD_EVT_BAD_REMOVAL = "volume_badremoval:";
- private static final String VOLD_EVT_DAMAGED = "volume_damaged:";
- private static final String VOLD_EVT_CHECKING = "volume_checking:";
- private static final String VOLD_EVT_NOFS = "volume_nofs:";
- private static final String VOLD_EVT_EJECTING = "volume_ejecting:";
-
- /**
- * MountService that handles events received from the vol service daemon
- */
- private MountService mService;
-
- /**
- * Stream for sending commands to the vol service daemon.
- */
- private OutputStream mOutputStream;
-
- /**
- * Cached value indicating whether or not USB mass storage is enabled.
- */
- private boolean mUmsEnabled;
-
- /**
- * Cached value indicating whether or not USB mass storage is connected.
- */
- private boolean mUmsConnected;
-
- /**
- * Constructor for MountListener
- *
- * @param service The MountListener we are handling communication with USB
- * daemon for.
- */
- MountListener(MountService service) {
- mService = service;
- }
-
- /**
- * Process and dispatches events received from the vol service daemon
- *
- * @param event An event received from the vol service daemon
- */
- private void handleEvent(String event) {
- if (Config.LOGD) Log.d(TAG, "handleEvent " + event);
-
- int colonIndex = event.indexOf(':');
- String path = (colonIndex > 0 ? event.substring(colonIndex + 1) : null);
-
- if (event.equals(VOLD_EVT_UMS_ENABLED)) {
- mUmsEnabled = true;
- } else if (event.equals(VOLD_EVT_UMS_DISABLED)) {
- mUmsEnabled = false;
- } else if (event.equals(VOLD_EVT_UMS_CONNECTED)) {
- mUmsConnected = true;
- mService.notifyUmsConnected();
- } else if (event.equals(VOLD_EVT_UMS_DISCONNECTED)) {
- mUmsConnected = false;
- mService.notifyUmsDisconnected();
- } else if (event.startsWith(VOLD_EVT_NOMEDIA)) {
- mService.notifyMediaRemoved(path);
- } else if (event.startsWith(VOLD_EVT_UNMOUNTED)) {
- mService.notifyMediaUnmounted(path);
- } else if (event.startsWith(VOLD_EVT_CHECKING)) {
- mService.notifyMediaChecking(path);
- } else if (event.startsWith(VOLD_EVT_NOFS)) {
- mService.notifyMediaNoFs(path);
- } else if (event.startsWith(VOLD_EVT_MOUNTED)) {
- mService.notifyMediaMounted(path, false);
- } else if (event.startsWith(VOLD_EVT_MOUNTED_RO)) {
- mService.notifyMediaMounted(path, true);
- } else if (event.startsWith(VOLD_EVT_UMS)) {
- mService.notifyMediaShared(path);
- } else if (event.startsWith(VOLD_EVT_BAD_REMOVAL)) {
- mService.notifyMediaBadRemoval(path);
- // also send media eject intent, to notify apps to close any open
- // files on the media.
- mService.notifyMediaEject(path);
- } else if (event.startsWith(VOLD_EVT_DAMAGED)) {
- mService.notifyMediaUnmountable(path);
- } else if (event.startsWith(VOLD_EVT_EJECTING)) {
- mService.notifyMediaEject(path);
- }
- }
-
- /**
- * Sends a command to the mount service daemon via a local socket
- *
- * @param command The command to send to the mount service daemon
- */
- private void writeCommand(String command) {
- writeCommand2(command, null);
- }
-
- /**
- * Sends a command to the mount service daemon via a local socket
- * with a single argument
- *
- * @param command The command to send to the mount service daemon
- * @param argument The argument to send with the command (or null)
- */
- private void writeCommand2(String command, String argument) {
- synchronized (this) {
- if (mOutputStream == null) {
- Log.e(TAG, "No connection to vold", new IllegalStateException());
- } else {
- StringBuilder builder = new StringBuilder(command);
- if (argument != null) {
- builder.append(argument);
- }
- builder.append('\0');
-
- try {
- mOutputStream.write(builder.toString().getBytes());
- } catch (IOException ex) {
- Log.e(TAG, "IOException in writeCommand", ex);
- }
- }
- }
- }
-
- /**
- * Opens a socket to communicate with the mount service daemon and listens
- * for events from the daemon.
- *
- */
- private void listenToSocket() {
- LocalSocket socket = null;
-
- try {
- socket = new LocalSocket();
- LocalSocketAddress address = new LocalSocketAddress(VOLD_SOCKET,
- LocalSocketAddress.Namespace.RESERVED);
-
- socket.connect(address);
-
- InputStream inputStream = socket.getInputStream();
- mOutputStream = socket.getOutputStream();
-
- byte[] buffer = new byte[100];
-
- writeCommand(VOLD_CMD_SEND_UMS_STATUS);
- mountMedia(Environment.getExternalStorageDirectory().getAbsolutePath());
-
- while (true) {
- int count = inputStream.read(buffer);
- if (count < 0) break;
-
- int start = 0;
- for (int i = 0; i < count; i++) {
- if (buffer[i] == 0) {
- String event = new String(buffer, start, i - start);
- handleEvent(event);
- start = i + 1;
- }
- }
- }
- } catch (IOException ex) {
- // This exception is normal when running in desktop simulator
- // where there is no mount daemon to talk to
-
- // log("IOException in listenToSocket");
- }
-
- synchronized (this) {
- if (mOutputStream != null) {
- try {
- mOutputStream.close();
- } catch (IOException e) {
- Log.w(TAG, "IOException closing output stream");
- }
-
- mOutputStream = null;
- }
- }
-
- try {
- if (socket != null) {
- socket.close();
- }
- } catch (IOException ex) {
- Log.w(TAG, "IOException closing socket");
- }
-
- /*
- * Sleep before trying again.
- * This should not happen except while debugging.
- * Without this sleep, the emulator will spin and
- * create tons of throwaway LocalSockets, making
- * system_server GC constantly.
- */
- Log.e(TAG, "Failed to connect to vold", new IllegalStateException());
- SystemClock.sleep(2000);
- }
-
- /**
- * Main loop for MountListener thread.
- */
- public void run() {
- // ugly hack for the simulator.
- if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
- SystemProperties.set("EXTERNAL_STORAGE_STATE", Environment.MEDIA_MOUNTED);
- // usbd does not run in the simulator, so send a fake device mounted event to trigger the Media Scanner
- mService.notifyMediaMounted(Environment.getExternalStorageDirectory().getPath(), false);
-
- // no usbd in the simulator, so no point in hanging around.
- return;
- }
-
- try {
- while (true) {
- listenToSocket();
- }
- } catch (Throwable t) {
- // catch all Throwables so we don't bring down the system process
- Log.e(TAG, "Fatal error " + t + " in MountListener thread!");
- }
- }
-
- /**
- * @return true if USB mass storage is enabled
- */
- boolean getMassStorageEnabled() {
- return mUmsEnabled;
- }
-
- /**
- * Enables or disables USB mass storage support.
- *
- * @param enable true to enable USB mass storage support
- */
- void setMassStorageEnabled(boolean enable) {
- writeCommand(enable ? VOLD_CMD_ENABLE_UMS : VOLD_CMD_DISABLE_UMS);
- }
-
- /**
- * @return true if USB mass storage is connected
- */
- boolean getMassStorageConnected() {
- return mUmsConnected;
- }
-
- /**
- * Mount media at given mount point.
- */
- public void mountMedia(String mountPoint) {
- writeCommand2(VOLD_CMD_MOUNT_VOLUME, mountPoint);
- }
-
- /**
- * Unmount media at given mount point.
- */
- public void ejectMedia(String mountPoint) {
- writeCommand2(VOLD_CMD_EJECT_MEDIA, mountPoint);
- }
-
- /**
- * Format media at given mount point.
- */
- public void formatMedia(String mountPoint) {
- writeCommand2(VOLD_CMD_FORMAT_MEDIA, mountPoint);
- }
-}
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index 204389e..c8a6915 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -28,32 +28,70 @@
import android.net.Uri;
import android.os.IMountService;
import android.os.Environment;
-import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UEventObserver;
+import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
+import java.util.ArrayList;
+
+import android.provider.Settings;
+import android.content.ContentResolver;
+import android.database.ContentObserver;
import java.io.File;
import java.io.FileReader;
+import java.lang.IllegalStateException;
/**
* MountService implements an to the mount service daemon
* @hide
*/
-class MountService extends IMountService.Stub {
+class MountService extends IMountService.Stub
+ implements INativeDaemonConnectorCallbacks {
private static final String TAG = "MountService";
+ class VolumeState {
+ public static final int Init = -1;
+ public static final int NoMedia = 0;
+ public static final int Idle = 1;
+ public static final int Pending = 2;
+ public static final int Checking = 3;
+ public static final int Mounted = 4;
+ public static final int Unmounting = 5;
+ public static final int Formatting = 6;
+ public static final int Shared = 7;
+ public static final int SharedMnt = 8;
+ }
+
+ class VoldResponseCode {
+ public static final int VolumeListResult = 110;
+ public static final int AsecListResult = 111;
+
+ public static final int ShareAvailabilityResult = 210;
+ public static final int AsecPathResult = 211;
+
+ public static final int VolumeStateChange = 605;
+ public static final int VolumeMountFailedBlank = 610;
+ public static final int VolumeMountFailedDamaged = 611;
+ public static final int VolumeMountFailedNoMedia = 612;
+ public static final int ShareAvailabilityChange = 620;
+ public static final int VolumeDiskInserted = 630;
+ public static final int VolumeDiskRemoved = 631;
+ public static final int VolumeBadRemoval = 632;
+ }
+
+
/**
* Binder context for this service
*/
private Context mContext;
/**
- * listener object for communicating with the mount service daemon
+ * connectorr object for communicating with vold
*/
- private MountListener mListener;
+ private NativeDaemonConnector mConnector;
/**
* The notification that is shown when a USB mass storage host
@@ -82,7 +120,15 @@
private boolean mMounted;
+ private SettingsWatcher mSettingsWatcher;
private boolean mAutoStartUms;
+ private boolean mPromptUms;
+ private boolean mUmsActiveNotify;
+
+ private boolean mUmsConnected = false;
+ private boolean mUmsEnabled = false;
+
+ private String mLegacyState = Environment.MEDIA_REMOVED;
/**
* Constructs a new MountService instance
@@ -93,33 +139,182 @@
mContext = context;
// Register a BOOT_COMPLETED handler so that we can start
- // MountListener. We defer the startup so that we don't
+ // our NativeDaemonConnector. We defer the startup so that we don't
// start processing events before we ought-to
mContext.registerReceiver(mBroadcastReceiver,
new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null);
- mListener = new MountListener(this);
+ mConnector = new NativeDaemonConnector(this, "vold", 10, "VoldConnector");
mShowSafeUnmountNotificationWhenUnmounted = false;
mPlaySounds = SystemProperties.get("persist.service.mount.playsnd", "1").equals("1");
- mAutoStartUms = SystemProperties.get("persist.service.mount.umsauto", "0").equals("1");
+ ContentResolver cr = mContext.getContentResolver();
+ mAutoStartUms = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_AUTOSTART, 0) == 1);
+ mPromptUms = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_PROMPT, 1) == 1);
+ mUmsActiveNotify = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED, 1) == 1);
+
+ mSettingsWatcher = new SettingsWatcher(new Handler());
+ }
+
+ private class SettingsWatcher extends ContentObserver {
+ public SettingsWatcher(Handler handler) {
+ super(handler);
+ ContentResolver cr = mContext.getContentResolver();
+ cr.registerContentObserver(Settings.System.getUriFor(
+ Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND), false, this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.MOUNT_UMS_AUTOSTART), false, this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.MOUNT_UMS_PROMPT), false, this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED), false, this);
+ }
+
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ ContentResolver cr = mContext.getContentResolver();
+
+ boolean newPlayNotificationSounds = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND, 1) == 1);
+
+ boolean newUmsAutostart = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_AUTOSTART, 0) == 1);
+
+ if (newUmsAutostart != mAutoStartUms) {
+ mAutoStartUms = newUmsAutostart;
+ }
+
+ boolean newUmsPrompt = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_PROMPT, 1) == 1);
+
+ if (newUmsPrompt != mPromptUms) {
+ mPromptUms = newUmsAutostart;
+ }
+
+ boolean newUmsNotifyEnabled = (Settings.Secure.getInt(
+ cr, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED, 1) == 1);
+
+ if (mUmsEnabled) {
+ if (newUmsNotifyEnabled) {
+ Intent intent = new Intent();
+ intent.setClass(mContext, com.android.internal.app.UsbStorageStopActivity.class);
+ PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);
+ setUsbStorageNotification(com.android.internal.R.string.usb_storage_stop_notification_title,
+ com.android.internal.R.string.usb_storage_stop_notification_message,
+ com.android.internal.R.drawable.stat_sys_warning,
+ false, true, pi);
+ } else {
+ setUsbStorageNotification(0, 0, 0, false, false, null);
+ }
+ }
+ if (newUmsNotifyEnabled != mUmsActiveNotify) {
+ mUmsActiveNotify = newUmsNotifyEnabled;
+ }
+ }
}
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
- Thread thread = new Thread(mListener, MountListener.class.getName());
+ String action = intent.getAction();
+
+ if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
+ /*
+ * Vold does not run in the simulator, so fake out a mounted
+ * event to trigger MediaScanner
+ */
+ if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
+ notifyMediaMounted(
+ Environment.getExternalStorageDirectory().getPath(), false);
+ return;
+ }
+
+ Thread thread = new Thread(
+ mConnector, NativeDaemonConnector.class.getName());
thread.start();
}
}
};
+ public void shutdown() {
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.SHUTDOWN)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires SHUTDOWN permission");
+ }
+
+ Log.d(TAG, "Shutting down");
+ String state = Environment.getExternalStorageState();
+
+ if (state.equals(Environment.MEDIA_SHARED)) {
+ /*
+ * If the media is currently shared, unshare it.
+ * XXX: This is still dangerous!. We should not
+ * be rebooting at *all* if UMS is enabled, since
+ * the UMS host could have dirty FAT cache entries
+ * yet to flush.
+ */
+ try {
+ setMassStorageEnabled(false);
+ } catch (Exception e) {
+ Log.e(TAG, "ums disable failed", e);
+ }
+ } else if (state.equals(Environment.MEDIA_CHECKING)) {
+ /*
+ * If the media is being checked, then we need to wait for
+ * it to complete before being able to proceed.
+ */
+ // XXX: @hackbod - Should we disable the ANR timer here?
+ int retries = 30;
+ while (state.equals(Environment.MEDIA_CHECKING) && (retries-- >=0)) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException iex) {
+ Log.e(TAG, "Interrupted while waiting for media", iex);
+ break;
+ }
+ state = Environment.getExternalStorageState();
+ }
+ if (retries == 0) {
+ Log.e(TAG, "Timed out waiting for media to check");
+ }
+ }
+
+ if (state.equals(Environment.MEDIA_MOUNTED)) {
+ /*
+ * If the media is mounted, then gracefully unmount it.
+ */
+ try {
+ String m = Environment.getExternalStorageDirectory().toString();
+ unmountVolume(m);
+
+ int retries = 12;
+ while (!state.equals(Environment.MEDIA_UNMOUNTED) && (retries-- >=0)) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException iex) {
+ Log.e(TAG, "Interrupted while waiting for media", iex);
+ break;
+ }
+ state = Environment.getExternalStorageState();
+ }
+ if (retries == 0) {
+ Log.e(TAG, "Timed out waiting for media to unmount");
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "external storage unmount failed", e);
+ }
+ }
+ }
+
/**
* @return true if USB mass storage support is enabled.
*/
- public boolean getMassStorageEnabled() throws RemoteException {
- return mListener.getMassStorageEnabled();
+ public boolean getMassStorageEnabled() {
+ return mUmsEnabled;
}
/**
@@ -127,33 +322,77 @@
*
* @param enable true to enable USB mass storage support
*/
- public void setMassStorageEnabled(boolean enable) throws RemoteException {
- mListener.setMassStorageEnabled(enable);
+ public void setMassStorageEnabled(boolean enable) throws IllegalStateException {
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires MOUNT_UNMOUNT_FILESYSTEMS permission");
+ }
+ try {
+ String vp = Environment.getExternalStorageDirectory().getPath();
+ String vs = getVolumeState(vp);
+
+ if (enable && vs.equals(Environment.MEDIA_MOUNTED)) {
+ unmountVolume(vp);
+ updateUsbMassStorageNotification(true, false);
+ }
+
+ setShareMethodEnabled(vp, "ums", enable);
+ mUmsEnabled = enable;
+ if (!enable) {
+ mountVolume(vp);
+ if (mPromptUms) {
+ updateUsbMassStorageNotification(false, false);
+ } else {
+ updateUsbMassStorageNotification(true, false);
+ }
+ }
+ } catch (IllegalStateException rex) {
+ Log.e(TAG, "Failed to set ums enable {" + enable + "}");
+ return;
+ }
}
/**
* @return true if USB mass storage is connected.
*/
- public boolean getMassStorageConnected() throws RemoteException {
- return mListener.getMassStorageConnected();
+ public boolean getMassStorageConnected() {
+ return mUmsConnected;
}
+
+ /**
+ * @return state of the volume at the specified mount point
+ */
+ public String getVolumeState(String mountPoint) throws IllegalStateException {
+ /*
+ * XXX: Until we have multiple volume discovery, just hardwire
+ * this to /sdcard
+ */
+ if (!mountPoint.equals(Environment.getExternalStorageDirectory().getPath())) {
+ Log.w(TAG, "getVolumeState(" + mountPoint + "): Unknown volume");
+ throw new IllegalArgumentException();
+ }
+
+ return mLegacyState;
+ }
+
/**
* Attempt to mount external media
*/
- public void mountMedia(String mountPath) throws RemoteException {
+ public void mountVolume(String mountPath) throws IllegalStateException {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires MOUNT_UNMOUNT_FILESYSTEMS permission");
}
- mListener.mountMedia(mountPath);
+ mConnector.doCommand(String.format("mount %s", mountPath));
}
/**
* Attempt to unmount external media to prepare for eject
*/
- public void unmountMedia(String mountPath) throws RemoteException {
+ public void unmountVolume(String mountPath) throws IllegalStateException {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS)
!= PackageManager.PERMISSION_GRANTED) {
@@ -164,23 +403,51 @@
// to display the notification
mShowSafeUnmountNotificationWhenUnmounted = true;
- // tell mountd to unmount the media
- mListener.ejectMedia(mountPath);
+ mConnector.doCommand(String.format("unmount %s", mountPath));
}
/**
* Attempt to format external media
*/
- public void formatMedia(String formatPath) throws RemoteException {
+ public void formatVolume(String formatPath) throws IllegalStateException {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires MOUNT_FORMAT_FILESYSTEMS permission");
}
- mListener.formatMedia(formatPath);
+ mConnector.doCommand(String.format("format %s", formatPath));
}
+ boolean getShareAvailable(String method) throws IllegalStateException {
+ ArrayList<String> rsp = mConnector.doCommand("share_available " + method);
+
+ for (String line : rsp) {
+ String []tok = line.split(" ");
+ int code = Integer.parseInt(tok[0]);
+ if (code == VoldResponseCode.ShareAvailabilityResult) {
+ if (tok[2].equals("available"))
+ return true;
+ return false;
+ } else {
+ throw new IllegalStateException(String.format("Unexpected response code %d", code));
+ }
+ }
+ throw new IllegalStateException("Got an empty response");
+ }
+
+ /**
+ * Enables or disables USB mass storage support.
+ *
+ * @param enable true to enable USB mass storage support
+ */
+ void setShareMethodEnabled(String mountPoint, String method,
+ boolean enable) throws IllegalStateException {
+ mConnector.doCommand(String.format(
+ "%sshare %s %s", (enable ? "" : "un"), mountPoint, method));
+ }
+
+
/**
* Returns true if we're playing media notification sounds.
*/
@@ -201,24 +468,13 @@
SystemProperties.set("persist.service.mount.playsnd", (enabled ? "1" : "0"));
}
- /**
- * Returns true if we auto-start UMS on cable insertion.
- */
- public boolean getAutoStartUms() {
- return mAutoStartUms;
- }
-
- /**
- * Set whether or not we're playing media notification sounds.
- */
- public void setAutoStartUms(boolean enabled) {
- if (mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SETTINGS)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Requires WRITE_SETTINGS permission");
+ void updatePublicVolumeState(String mountPoint, String state) {
+ if (!mountPoint.equals(Environment.getExternalStorageDirectory().getPath())) {
+ Log.w(TAG, "Multiple volumes not currently supported");
+ return;
}
- mAutoStartUms = enabled;
- SystemProperties.set("persist.service.mount.umsauto", (enabled ? "1" : "0"));
+ Log.i(TAG, "State for {" + mountPoint + "} = {" + state + "}");
+ mLegacyState = state;
}
/**
@@ -241,7 +497,7 @@
} else {
setUsbStorageNotification(0, 0, 0, false, false, null);
}
- } catch (RemoteException e) {
+ } catch (IllegalStateException e) {
// Nothing to do
}
}
@@ -256,9 +512,118 @@
}
/**
+ *
+ * Callback from NativeDaemonConnector
+ */
+ public void onDaemonConnected() {
+ new Thread() {
+ public void run() {
+ try {
+ if (!getVolumeState(Environment.getExternalStorageDirectory().getPath())
+ .equals(Environment.MEDIA_MOUNTED)) {
+ try {
+ mountVolume(Environment.getExternalStorageDirectory().getPath());
+ } catch (Exception ex) {
+ Log.w(TAG, "Connection-mount failed");
+ }
+ } else {
+ Log.d(TAG, "Skipping connection-mount; already mounted");
+ }
+ } catch (IllegalStateException rex) {
+ Log.e(TAG, "Exception while handling connection mount ", rex);
+ }
+
+ try {
+ boolean avail = getShareAvailable("ums");
+ notifyShareAvailabilityChange("ums", avail);
+ } catch (Exception ex) {
+ Log.w(TAG, "Failed to get share availability");
+ }
+ }
+ }.start();
+ }
+
+ /**
+ *
+ * Callback from NativeDaemonConnector
+ */
+ public boolean onEvent(int code, String raw, String[] cooked) {
+ // Log.d(TAG, "event {" + raw + "}");
+ if (code == VoldResponseCode.VolumeStateChange) {
+ // FMT: NNN Volume <label> <mountpoint> state changed
+ // from <old_#> (<old_str>) to <new_#> (<new_str>)
+ notifyVolumeStateChange(
+ cooked[2], cooked[3], Integer.parseInt(cooked[7]),
+ Integer.parseInt(cooked[10]));
+ } else if (code == VoldResponseCode.VolumeMountFailedBlank) {
+ // FMT: NNN Volume <label> <mountpoint> mount failed - no supported file-systems
+ notifyMediaNoFs(cooked[3]);
+ // FMT: NNN Volume <label> <mountpoint> mount failed - no media
+ } else if (code == VoldResponseCode.VolumeMountFailedNoMedia) {
+ notifyMediaRemoved(cooked[3]);
+ } else if (code == VoldResponseCode.VolumeMountFailedDamaged) {
+ // FMT: NNN Volume <label> <mountpoint> mount failed - filesystem check failed
+ notifyMediaUnmountable(cooked[3]);
+ } else if (code == VoldResponseCode.ShareAvailabilityChange) {
+ // FMT: NNN Share method <method> now <available|unavailable>
+ boolean avail = false;
+ if (cooked[5].equals("available")) {
+ avail = true;
+ }
+ notifyShareAvailabilityChange(cooked[3], avail);
+ } else if (code == VoldResponseCode.VolumeDiskInserted) {
+ // FMT: NNN Volume <label> <mountpoint> disk inserted (<major>:<minor>)
+ notifyMediaInserted(cooked[3]);
+ } else if (code == VoldResponseCode.VolumeDiskRemoved) {
+ // FMT: NNN Volume <label> <mountpoint> disk removed (<major>:<minor>)
+ notifyMediaRemoved(cooked[3]);
+ } else if (code == VoldResponseCode.VolumeBadRemoval) {
+ // FMT: NNN Volume <label> <mountpoint> bad removal (<major>:<minor>)
+ notifyMediaBadRemoval(cooked[3]);
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ void notifyVolumeStateChange(String label, String mountPoint, int oldState,
+ int newState) throws IllegalStateException {
+ String vs = getVolumeState(mountPoint);
+
+ if (newState == VolumeState.Init) {
+ } else if (newState == VolumeState.NoMedia) {
+ // NoMedia is handled via Disk Remove events
+ } else if (newState == VolumeState.Idle) {
+ // Don't notify if we're in BAD_REMOVAL, NOFS, or UNMOUNTABLE
+ if (!vs.equals(Environment.MEDIA_BAD_REMOVAL) &&
+ !vs.equals(Environment.MEDIA_NOFS) &&
+ !vs.equals(Environment.MEDIA_UNMOUNTABLE)) {
+ notifyMediaUnmounted(mountPoint);
+ }
+ } else if (newState == VolumeState.Pending) {
+ } else if (newState == VolumeState.Checking) {
+ notifyMediaChecking(mountPoint);
+ } else if (newState == VolumeState.Mounted) {
+ notifyMediaMounted(mountPoint, false);
+ } else if (newState == VolumeState.Unmounting) {
+ notifyMediaUnmounting(mountPoint);
+ } else if (newState == VolumeState.Formatting) {
+ } else if (newState == VolumeState.Shared) {
+ notifyMediaShared(mountPoint, false);
+ } else if (newState == VolumeState.SharedMnt) {
+ notifyMediaShared(mountPoint, true);
+ } else {
+ Log.e(TAG, "Unhandled VolumeState {" + newState + "}");
+ }
+ }
+
+
+ /**
* Broadcasts the USB mass storage connected event to all clients.
*/
void notifyUmsConnected() {
+ mUmsConnected = true;
+
String storageState = Environment.getExternalStorageState();
if (!storageState.equals(Environment.MEDIA_REMOVED) &&
!storageState.equals(Environment.MEDIA_BAD_REMOVAL) &&
@@ -267,9 +632,9 @@
if (mAutoStartUms) {
try {
setMassStorageEnabled(true);
- } catch (RemoteException e) {
+ } catch (IllegalStateException e) {
}
- } else {
+ } else if (mPromptUms) {
updateUsbMassStorageNotification(false, true);
}
}
@@ -278,26 +643,80 @@
mContext.sendBroadcast(intent);
}
+ void notifyShareAvailabilityChange(String method, final boolean avail) {
+ if (!method.equals("ums")) {
+ Log.w(TAG, "Ignoring unsupported share method {" + method + "}");
+ return;
+ }
+
+ /*
+ * Notification needs to run in a different thread as
+ * it may need to call back into vold
+ */
+ new Thread() {
+ public void run() {
+ try {
+ if (avail) {
+ notifyUmsConnected();
+ } else {
+ notifyUmsDisconnected();
+ }
+ } catch (Exception ex) {
+ Log.w(TAG, "Failed to mount media on insertion");
+ }
+ }
+ }.start();
+ }
+
/**
* Broadcasts the USB mass storage disconnected event to all clients.
*/
void notifyUmsDisconnected() {
+ mUmsConnected = false;
+ if (mUmsEnabled) {
+ try {
+ Log.w(TAG, "UMS disconnected while enabled!");
+ setMassStorageEnabled(false);
+ } catch (Exception ex) {
+ Log.e(TAG, "Error disabling UMS on unsafe UMS disconnect", ex);
+ }
+ }
updateUsbMassStorageNotification(false, false);
Intent intent = new Intent(Intent.ACTION_UMS_DISCONNECTED);
mContext.sendBroadcast(intent);
}
+ void notifyMediaInserted(final String path) throws IllegalStateException {
+ new Thread() {
+ public void run() {
+ try {
+ mountVolume(path);
+ } catch (Exception ex) {
+ Log.w(TAG, "Failed to mount media on insertion", ex);
+ }
+ }
+ }.start();
+ }
+
/**
* Broadcasts the media removed event to all clients.
*/
- void notifyMediaRemoved(String path) {
+ void notifyMediaRemoved(String path) throws IllegalStateException {
+
+ // Suppress this on bad removal
+ if (getVolumeState(path).equals(Environment.MEDIA_BAD_REMOVAL)) {
+ return;
+ }
+
+ updatePublicVolumeState(path, Environment.MEDIA_REMOVED);
+
updateUsbMassStorageNotification(true, false);
setMediaStorageNotification(
- com.android.internal.R.string.ext_media_nomedia_notification_title,
- com.android.internal.R.string.ext_media_nomedia_notification_message,
- com.android.internal.R.drawable.stat_notify_sdcard_usb,
- true, false, null);
+ com.android.internal.R.string.ext_media_nomedia_notification_title,
+ com.android.internal.R.string.ext_media_nomedia_notification_message,
+ com.android.internal.R.drawable.stat_notify_sdcard_usb,
+ true, false, null);
handlePossibleExplicitUnmountBroadcast(path);
Intent intent = new Intent(Intent.ACTION_MEDIA_REMOVED,
@@ -309,6 +728,9 @@
* Broadcasts the media unmounted event to all clients.
*/
void notifyMediaUnmounted(String path) {
+
+ updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
+
if (mShowSafeUnmountNotificationWhenUnmounted) {
setMediaStorageNotification(
com.android.internal.R.string.ext_media_safe_unmount_notification_title,
@@ -330,6 +752,8 @@
* Broadcasts the media checking event to all clients.
*/
void notifyMediaChecking(String path) {
+ updatePublicVolumeState(path, Environment.MEDIA_CHECKING);
+
setMediaStorageNotification(
com.android.internal.R.string.ext_media_checking_notification_title,
com.android.internal.R.string.ext_media_checking_notification_message,
@@ -346,6 +770,7 @@
* Broadcasts the media nofs event to all clients.
*/
void notifyMediaNoFs(String path) {
+ updatePublicVolumeState(path, Environment.MEDIA_NOFS);
Intent intent = new Intent();
intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class);
@@ -365,6 +790,8 @@
* Broadcasts the media mounted event to all clients.
*/
void notifyMediaMounted(String path, boolean readOnly) {
+ updatePublicVolumeState(path, Environment.MEDIA_MOUNTED);
+
setMediaStorageNotification(0, 0, 0, false, false, null);
updateUsbMassStorageNotification(false, false);
Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,
@@ -377,16 +804,25 @@
/**
* Broadcasts the media shared event to all clients.
*/
- void notifyMediaShared(String path) {
- Intent intent = new Intent();
- intent.setClass(mContext, com.android.internal.app.UsbStorageStopActivity.class);
- PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);
- setUsbStorageNotification(com.android.internal.R.string.usb_storage_stop_notification_title,
- com.android.internal.R.string.usb_storage_stop_notification_message,
- com.android.internal.R.drawable.stat_sys_warning,
- false, true, pi);
+ void notifyMediaShared(String path, boolean mounted) {
+ if (mounted) {
+ Log.e(TAG, "Live shared mounts not supported yet!");
+ return;
+ }
+
+ updatePublicVolumeState(path, Environment.MEDIA_SHARED);
+
+ if (mUmsActiveNotify) {
+ Intent intent = new Intent();
+ intent.setClass(mContext, com.android.internal.app.UsbStorageStopActivity.class);
+ PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);
+ setUsbStorageNotification(com.android.internal.R.string.usb_storage_stop_notification_title,
+ com.android.internal.R.string.usb_storage_stop_notification_message,
+ com.android.internal.R.drawable.stat_sys_warning,
+ false, true, pi);
+ }
handlePossibleExplicitUnmountBroadcast(path);
- intent = new Intent(Intent.ACTION_MEDIA_SHARED,
+ Intent intent = new Intent(Intent.ACTION_MEDIA_SHARED,
Uri.parse("file://" + path));
mContext.sendBroadcast(intent);
}
@@ -395,6 +831,8 @@
* Broadcasts the media bad removal event to all clients.
*/
void notifyMediaBadRemoval(String path) {
+ updatePublicVolumeState(path, Environment.MEDIA_BAD_REMOVAL);
+
updateUsbMassStorageNotification(true, false);
setMediaStorageNotification(com.android.internal.R.string.ext_media_badremoval_notification_title,
com.android.internal.R.string.ext_media_badremoval_notification_message,
@@ -405,16 +843,14 @@
Intent intent = new Intent(Intent.ACTION_MEDIA_BAD_REMOVAL,
Uri.parse("file://" + path));
mContext.sendBroadcast(intent);
-
- intent = new Intent(Intent.ACTION_MEDIA_REMOVED,
- Uri.parse("file://" + path));
- mContext.sendBroadcast(intent);
}
/**
* Broadcasts the media unmountable event to all clients.
*/
void notifyMediaUnmountable(String path) {
+ updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTABLE);
+
Intent intent = new Intent();
intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class);
PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);
@@ -435,7 +871,7 @@
/**
* Broadcasts the media eject event to all clients.
*/
- void notifyMediaEject(String path) {
+ void notifyMediaUnmounting(String path) {
Intent intent = new Intent(Intent.ACTION_MEDIA_EJECT,
Uri.parse("file://" + path));
mContext.sendBroadcast(intent);
@@ -568,5 +1004,64 @@
notificationManager.cancel(notificationId);
}
}
+
+ public String[] getSecureContainerList() throws IllegalStateException {
+ ArrayList<String> rsp = mConnector.doCommand("list_asec");
+
+ String[] rdata = new String[rsp.size()];
+ int idx = 0;
+
+ for (String line : rsp) {
+ String []tok = line.split(" ");
+ int code = Integer.parseInt(tok[0]);
+ if (code == VoldResponseCode.AsecListResult) {
+ rdata[idx++] = tok[1];
+ } else if (code == NativeDaemonConnector.ResponseCode.CommandOkay) {
+ return rdata;
+ } else {
+ throw new IllegalStateException(String.format("Unexpected response code %d", code));
+ }
+ }
+ throw new IllegalStateException("Got an empty response");
+ }
+
+ public String createSecureContainer(String id, int sizeMb, String fstype,
+ String key, int ownerUid) throws IllegalStateException {
+ String cmd = String.format("create_asec %s %d %s %s %d",
+ id, sizeMb, fstype, key, ownerUid);
+ mConnector.doCommand(cmd);
+ return getSecureContainerPath(id);
+ }
+
+ public void finalizeSecureContainer(String id) throws IllegalStateException {
+ mConnector.doCommand(String.format("finalize_asec %s", id));
+ }
+
+ public void destroySecureContainer(String id) throws IllegalStateException {
+ mConnector.doCommand(String.format("destroy_asec %s", id));
+ }
+
+ public String mountSecureContainer(String id, String key,
+ int ownerUid) throws IllegalStateException {
+ String cmd = String.format("mount_asec %s %s %d",
+ id, key, ownerUid);
+ mConnector.doCommand(cmd);
+ return getSecureContainerPath(id);
+ }
+
+ public String getSecureContainerPath(String id) throws IllegalStateException {
+ ArrayList<String> rsp = mConnector.doCommand("asec_path " + id);
+
+ for (String line : rsp) {
+ String []tok = line.split(" ");
+ int code = Integer.parseInt(tok[0]);
+ if (code == VoldResponseCode.AsecPathResult) {
+ return tok[1];
+ } else {
+ throw new IllegalStateException(String.format("Unexpected response code %d", code));
+ }
+ }
+ throw new IllegalStateException("Got an empty response");
+ }
}
diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java
new file mode 100644
index 0000000..da3e562
--- /dev/null
+++ b/services/java/com/android/server/NativeDaemonConnector.java
@@ -0,0 +1,239 @@
+/*
+ * 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.
+ */
+
+package com.android.server;
+
+import android.net.LocalSocketAddress;
+import android.net.LocalSocket;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.util.Config;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.lang.IllegalStateException;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.ListIterator;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Generic connector class for interfacing with a native
+ * daemon which uses the libsysutils FrameworkListener
+ * protocol.
+ */
+final class NativeDaemonConnector implements Runnable {
+
+ private BlockingQueue<String> mResponseQueue;
+ private OutputStream mOutputStream;
+ private String TAG = "NativeDaemonConnector";
+ private String mSocket;
+ private INativeDaemonConnectorCallbacks mCallbacks;
+
+ class ResponseCode {
+ public static final int ActionInitiated = 100;
+
+ public static final int CommandOkay = 200;
+
+ // The range of 400 -> 599 is reserved for cmd failures
+ public static final int OperationFailed = 400;
+ public static final int CommandSyntaxError = 500;
+ public static final int CommandParameterError = 501;
+
+ public static final int UnsolicitedInformational = 600;
+
+ //
+ public static final int FailedRangeStart = 400;
+ public static final int FailedRangeEnd = 599;
+ }
+
+ NativeDaemonConnector(INativeDaemonConnectorCallbacks callbacks,
+ String socket, int responseQueueSize, String logTag) {
+ mCallbacks = callbacks;
+ if (logTag != null)
+ TAG = logTag;
+ mSocket = socket;
+ mResponseQueue = new LinkedBlockingQueue<String>(responseQueueSize);
+ }
+
+ public void run() {
+
+ while (true) {
+ try {
+ listenToSocket();
+ } catch (Exception e) {
+ Log.e(TAG, "Error in NativeDaemonConnector", e);
+ SystemClock.sleep(1000);
+ }
+ }
+ }
+
+ private void listenToSocket() {
+ LocalSocket socket = null;
+
+ try {
+ socket = new LocalSocket();
+ LocalSocketAddress address = new LocalSocketAddress(mSocket,
+ LocalSocketAddress.Namespace.RESERVED);
+
+ socket.connect(address);
+ mCallbacks.onDaemonConnected();
+
+ InputStream inputStream = socket.getInputStream();
+ mOutputStream = socket.getOutputStream();
+
+ byte[] buffer = new byte[4096];
+
+ while (true) {
+ int count = inputStream.read(buffer);
+ if (count < 0) break;
+
+ int start = 0;
+ for (int i = 0; i < count; i++) {
+ if (buffer[i] == 0) {
+ String event = new String(buffer, start, i - start);
+// Log.d(TAG, "Got packet {" + event + "}");
+
+ String[] tokens = event.split(" ");
+ try {
+ int code = Integer.parseInt(tokens[0]);
+
+ if (code >= ResponseCode.UnsolicitedInformational) {
+ try {
+ if (!mCallbacks.onEvent(code, event, tokens)) {
+ Log.w(TAG, String.format(
+ "Unhandled event (%s)", event));
+ }
+ } catch (Exception ex) {
+ Log.e(TAG, String.format(
+ "Error handling '%s'", event), ex);
+ }
+ } else {
+ try {
+ mResponseQueue.put(event);
+ } catch (InterruptedException ex) {
+ Log.e(TAG, "Failed to put response onto queue", ex);
+ }
+ }
+ } catch (NumberFormatException nfe) {
+ Log.w(TAG, String.format("Bad msg (%s)", event));
+ }
+ start = i + 1;
+ }
+ }
+ }
+ } catch (IOException ex) {
+ Log.e(TAG, "Communications error", ex);
+ }
+
+ synchronized (this) {
+ if (mOutputStream != null) {
+ try {
+ mOutputStream.close();
+ } catch (IOException e) {
+ Log.w(TAG, "Failed closing output stream", e);
+ }
+
+ mOutputStream = null;
+ }
+ }
+
+ try {
+ if (socket != null) {
+ socket.close();
+ }
+ } catch (IOException ex) {
+ Log.w(TAG, "Failed closing socket", ex);
+ }
+
+ Log.e(TAG, "Failed to connect to native daemon",
+ new IllegalStateException());
+ SystemClock.sleep(5000);
+ }
+
+ private void sendCommand(String command) {
+ sendCommand(command, null);
+ }
+
+ /**
+ * Sends a command to the daemon with a single argument
+ *
+ * @param command The command to send to the daemon
+ * @param argument The argument to send with the command (or null)
+ */
+ private void sendCommand(String command, String argument) {
+ synchronized (this) {
+ Log.d(TAG, "sendCommand {" + command + "} {" + argument + "}");
+ if (mOutputStream == null) {
+ Log.e(TAG, "No connection to daemon", new IllegalStateException());
+ } else {
+ StringBuilder builder = new StringBuilder(command);
+ if (argument != null) {
+ builder.append(argument);
+ }
+ builder.append('\0');
+
+ try {
+ mOutputStream.write(builder.toString().getBytes());
+ } catch (IOException ex) {
+ Log.e(TAG, "IOException in sendCommand", ex);
+ }
+ }
+ }
+ }
+
+ public synchronized ArrayList<String> doCommand(String cmd) throws IllegalStateException {
+ sendCommand(cmd);
+
+ ArrayList<String> response = new ArrayList<String>();
+ boolean complete = false;
+ int code = -1;
+
+ while (!complete) {
+ try {
+ String line = mResponseQueue.take();
+// Log.d(TAG, "Removed off queue -> " + line);
+ String[] tokens = line.split(" ");
+ try {
+ code = Integer.parseInt(tokens[0]);
+ } catch (NumberFormatException nfe) {
+ throw new IllegalStateException(
+ String.format("Invalid response from daemon (%s)", line));
+ }
+
+ if ((code >= 200) && (code < 600))
+ complete = true;
+ response.add(line);
+ } catch (InterruptedException ex) {
+ Log.e(TAG, "InterruptedException");
+ }
+ }
+
+ if (code >= ResponseCode.FailedRangeStart &&
+ code <= ResponseCode.FailedRangeEnd) {
+ throw new IllegalStateException(String.format(
+ "Command %s failed with code %d",
+ cmd, code));
+ }
+ return response;
+ }
+}
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 232c6d1..2b12268 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -122,6 +122,8 @@
private static final boolean GET_CERTIFICATES = true;
+ private static final String SYSTEM_PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
+
private static final int REMOVE_EVENTS =
FileObserver.CLOSE_WRITE | FileObserver.DELETE | FileObserver.MOVED_FROM;
private static final int ADD_EVENTS =
@@ -154,6 +156,10 @@
// This is where all application persistent data goes.
final File mAppDataDir;
+ // If Encrypted File System feature is enabled, all application persistent data
+ // should go here instead.
+ final File mSecureAppDataDir;
+
// This is the object monitoring the framework dir.
final FileObserver mFrameworkInstallObserver;
@@ -416,6 +422,7 @@
File dataDir = Environment.getDataDirectory();
mAppDataDir = new File(dataDir, "data");
+ mSecureAppDataDir = new File(dataDir, "secure/data");
mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
if (mInstaller == null) {
@@ -425,6 +432,7 @@
File miscDir = new File(dataDir, "misc");
miscDir.mkdirs();
mAppDataDir.mkdirs();
+ mSecureAppDataDir.mkdirs();
mDrmAppPrivateInstallDir.mkdirs();
}
@@ -567,7 +575,7 @@
mAppInstallDir.mkdirs(); // scanDirLI() assumes this dir exists
}
//look for any incomplete package installations
- ArrayList<String> deletePkgsList = mSettings.getListOfIncompleteInstallPackages();
+ ArrayList<PackageSetting> deletePkgsList = mSettings.getListOfIncompleteInstallPackages();
//clean up list
for(int i = 0; i < deletePkgsList.size(); i++) {
//clean up here
@@ -622,20 +630,20 @@
}
}
- void cleanupInstallFailedPackage(String packageName) {
+ void cleanupInstallFailedPackage(PackageSetting pkgSettings) {
if (mInstaller != null) {
- int retCode = mInstaller.remove(packageName);
+ boolean useSecureFS = useEncryptedFilesystemForPackage(pkgSettings.pkg);
+ int retCode = mInstaller.remove(pkgSettings.name, useSecureFS);
if (retCode < 0) {
Log.w(TAG, "Couldn't remove app data directory for package: "
- + packageName + ", retcode=" + retCode);
+ + pkgSettings.name + ", retcode=" + retCode);
}
} else {
//for emulator
- PackageParser.Package pkg = mPackages.get(packageName);
- File dataDir = new File(pkg.applicationInfo.dataDir);
+ File dataDir = new File(pkgSettings.pkg.applicationInfo.dataDir);
dataDir.delete();
}
- mSettings.removePackageLP(packageName);
+ mSettings.removePackageLP(pkgSettings.name);
}
void readPermissions() {
@@ -2150,6 +2158,11 @@
return performed ? DEX_OPT_PERFORMED : DEX_OPT_SKIPPED;
}
+ private static boolean useEncryptedFilesystemForPackage(PackageParser.Package pkg) {
+ return Environment.isEncryptedFilesystemEnabled() &&
+ ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_NEVER_ENCRYPT) == 0);
+ }
+
private PackageParser.Package scanPackageLI(
File scanFile, File destCodeFile, File destResourceFile,
PackageParser.Package pkg, int parseFlags, int scanMode) {
@@ -2358,8 +2371,9 @@
}
if (removeExisting) {
+ boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(pkg);
if (mInstaller != null) {
- int ret = mInstaller.remove(pkgName);
+ int ret = mInstaller.remove(pkgName, useEncryptedFSDir);
if (ret != 0) {
String msg = "System package " + pkg.packageName
+ " could not have data directory erased after signature change.";
@@ -2389,7 +2403,12 @@
pkg.applicationInfo.dataDir = dataPath.getPath();
} else {
// This is a normal package, need to make its data directory.
- dataPath = new File(mAppDataDir, pkgName);
+ boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(pkg);
+ if (useEncryptedFSDir) {
+ dataPath = new File(mSecureAppDataDir, pkgName);
+ } else {
+ dataPath = new File(mAppDataDir, pkgName);
+ }
if (dataPath.exists()) {
mOutPermissions[1] = 0;
FileUtils.getPermissions(dataPath.getPath(), mOutPermissions);
@@ -2402,7 +2421,7 @@
// If this is a system app, we can at least delete its
// current data so the application will still work.
if (mInstaller != null) {
- int ret = mInstaller.remove(pkgName);
+ int ret = mInstaller.remove(pkgName, useEncryptedFSDir);
if(ret >= 0) {
// Old data gone!
String msg = "System package " + pkg.packageName
@@ -2413,7 +2432,7 @@
recovered = true;
// And now re-install the app.
- ret = mInstaller.install(pkgName, pkg.applicationInfo.uid,
+ ret = mInstaller.install(pkgName, useEncryptedFSDir, pkg.applicationInfo.uid,
pkg.applicationInfo.uid);
if (ret == -1) {
// Ack should not happen!
@@ -2453,7 +2472,7 @@
Log.v(TAG, "Want this data dir: " + dataPath);
//invoke installer to do the actual installation
if (mInstaller != null) {
- int ret = mInstaller.install(pkgName, pkg.applicationInfo.uid,
+ int ret = mInstaller.install(pkgName, useEncryptedFSDir, pkg.applicationInfo.uid,
pkg.applicationInfo.uid);
if(ret < 0) {
// Error from installer
@@ -3810,7 +3829,13 @@
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
String installerPackageName, PackageInstalledInfo res) {
// Remember this for later, in case we need to rollback this install
- boolean dataDirExists = (new File(mAppDataDir, pkgName)).exists();
+ boolean dataDirExists;
+
+ if (useEncryptedFilesystemForPackage(pkg)) {
+ dataDirExists = (new File(mSecureAppDataDir, pkgName)).exists();
+ } else {
+ dataDirExists = (new File(mAppDataDir, pkgName)).exists();
+ }
res.name = pkgName;
synchronized(mPackages) {
if (mPackages.containsKey(pkgName) || mAppDirs.containsKey(destFilePath)) {
@@ -4540,8 +4565,9 @@
deletedPs = mSettings.mPackages.get(packageName);
}
if ((flags&PackageManager.DONT_DELETE_DATA) == 0) {
+ boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(p);
if (mInstaller != null) {
- int retCode = mInstaller.remove(packageName);
+ int retCode = mInstaller.remove(packageName, useEncryptedFSDir);
if (retCode < 0) {
Log.w(TAG, "Couldn't remove app data or cache directory for package: "
+ packageName + ", retcode=" + retCode);
@@ -4783,6 +4809,8 @@
p = ps.pkg;
}
}
+ boolean useEncryptedFSDir = false;
+
if(!dataOnly) {
//need to check this only for fully installed applications
if (p == null) {
@@ -4794,9 +4822,10 @@
Log.w(TAG, "Package " + packageName + " has no applicationInfo.");
return false;
}
+ useEncryptedFSDir = useEncryptedFilesystemForPackage(p);
}
if (mInstaller != null) {
- int retCode = mInstaller.clearUserData(packageName);
+ int retCode = mInstaller.clearUserData(packageName, useEncryptedFSDir);
if (retCode < 0) {
Log.w(TAG, "Couldn't remove cache files for package: "
+ packageName);
@@ -4847,8 +4876,9 @@
Log.w(TAG, "Package " + packageName + " has no applicationInfo.");
return false;
}
+ boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(p);
if (mInstaller != null) {
- int retCode = mInstaller.deleteCacheFiles(packageName);
+ int retCode = mInstaller.deleteCacheFiles(packageName, useEncryptedFSDir);
if (retCode < 0) {
Log.w(TAG, "Couldn't remove cache files for package: "
+ packageName);
@@ -4910,9 +4940,10 @@
}
publicSrcDir = isForwardLocked(p) ? applicationInfo.publicSourceDir : null;
}
+ boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(p);
if (mInstaller != null) {
int res = mInstaller.getSizeInfo(packageName, p.mPath,
- publicSrcDir, pStats);
+ publicSrcDir, pStats, useEncryptedFSDir);
if (res < 0) {
return false;
} else {
@@ -6061,11 +6092,18 @@
Settings() {
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
+ // TODO(oam): This secure dir creation needs to be moved somewhere else (later)
+ File systemSecureDir = new File(dataDir, "secure/system");
systemDir.mkdirs();
+ systemSecureDir.mkdirs();
FileUtils.setPermissions(systemDir.toString(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG
|FileUtils.S_IROTH|FileUtils.S_IXOTH,
-1, -1);
+ FileUtils.setPermissions(systemSecureDir.toString(),
+ FileUtils.S_IRWXU|FileUtils.S_IRWXG
+ |FileUtils.S_IROTH|FileUtils.S_IXOTH,
+ -1, -1);
mSettingsFilename = new File(systemDir, "packages.xml");
mBackupSettingsFilename = new File(systemDir, "packages-backup.xml");
}
@@ -6726,15 +6764,15 @@
return mReadMessages.toString();
}
- ArrayList<String> getListOfIncompleteInstallPackages() {
+ ArrayList<PackageSetting> getListOfIncompleteInstallPackages() {
HashSet<String> kList = new HashSet<String>(mPackages.keySet());
Iterator<String> its = kList.iterator();
- ArrayList<String> ret = new ArrayList<String>();
+ ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
while(its.hasNext()) {
String key = its.next();
PackageSetting ps = mPackages.get(key);
if(ps.getInstallStatus() == PKG_INSTALL_INCOMPLETE) {
- ret.add(key);
+ ret.add(ps);
}
}
return ret;
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index e11c3120..bf6996c 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -29,6 +29,7 @@
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.database.ContentObserver;
import android.database.Cursor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
@@ -36,15 +37,18 @@
import android.hardware.SensorManager;
import android.os.BatteryStats;
import android.os.Binder;
+import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.IMountService;
import android.os.IPowerManager;
import android.os.LocalPowerManager;
import android.os.Power;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemClock;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings;
@@ -85,7 +89,7 @@
| PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK;
// time since last state: time since last event:
- // The short keylight delay comes from Gservices; this is the default.
+ // The short keylight delay comes from secure settings; this is the default.
private static final int SHORT_KEYLIGHT_DELAY_DEFAULT = 6000; // t+6 sec
private static final int MEDIUM_KEYLIGHT_DELAY = 15000; // t+15 sec
private static final int LONG_KEYLIGHT_DELAY = 6000; // t+6 sec
@@ -100,7 +104,7 @@
// trigger proximity if distance is less than 5 cm
private static final float PROXIMITY_THRESHOLD = 5.0f;
- // Cached Gservices settings; see updateGservicesValues()
+ // Cached secure settings; see updateSettingsValues()
private int mShortKeylightDelay = SHORT_KEYLIGHT_DELAY_DEFAULT;
// flags for setPowerState
@@ -513,12 +517,15 @@
filter.addAction(Intent.ACTION_BOOT_COMPLETED);
mContext.registerReceiver(new BootCompletedReceiver(), filter);
- // Listen for Gservices changes
- IntentFilter gservicesChangedFilter =
- new IntentFilter(Settings.Gservices.CHANGED_ACTION);
- mContext.registerReceiver(new GservicesChangedReceiver(), gservicesChangedFilter);
- // And explicitly do the initial update of our cached settings
- updateGservicesValues();
+ // Listen for secure settings changes
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.CONTENT_URI, true,
+ new ContentObserver(new Handler()) {
+ public void onChange(boolean selfChange) {
+ updateSettingsValues();
+ }
+ });
+ updateSettingsValues();
if (mUseSoftwareAutoBrightness) {
// turn the screen on
@@ -2130,6 +2137,24 @@
public void reboot(String reason)
{
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
+
+ /*
+ * Manually shutdown the MountService to ensure media is
+ * put into a safe state.
+ */
+ IMountService mSvc = IMountService.Stub.asInterface(
+ ServiceManager.getService("mount"));
+
+ if (mSvc != null) {
+ try {
+ mSvc.shutdown();
+ } catch (Exception e) {
+ Log.e(TAG, "MountService shutdown failed", e);
+ }
+ } else {
+ Log.w(TAG, "MountService unavailable for shutdown");
+ }
+
try {
Power.reboot(reason);
} catch (IOException e) {
@@ -2137,6 +2162,24 @@
}
}
+ /**
+ * Crash the runtime (causing a complete restart of the Android framework).
+ * Requires REBOOT permission. Mostly for testing. Should not return.
+ */
+ public void crash(final String message)
+ {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
+ Thread t = new Thread("PowerManagerService.crash()") {
+ public void run() { throw new RuntimeException(message); }
+ };
+ try {
+ t.start();
+ t.join();
+ } catch (InterruptedException e) {
+ Log.wtf(TAG, e);
+ }
+ }
+
private void goToSleepLocked(long time, int reason) {
if (mLastEventTime <= time) {
@@ -2234,7 +2277,7 @@
* */
private void setScreenOffTimeoutsLocked() {
if ((mPokey & POKE_LOCK_SHORT_TIMEOUT) != 0) {
- mKeylightDelay = mShortKeylightDelay; // Configurable via Gservices
+ mKeylightDelay = mShortKeylightDelay; // Configurable via secure settings
mDimDelay = -1;
mScreenOffDelay = 0;
} else if ((mPokey & POKE_LOCK_MEDIUM_TIMEOUT) != 0) {
@@ -2269,28 +2312,15 @@
}
/**
- * Refreshes cached Gservices settings. Called once on startup, and
- * on subsequent Settings.Gservices.CHANGED_ACTION broadcasts (see
- * GservicesChangedReceiver).
+ * Refreshes cached secure settings. Called once on startup, and
+ * on subsequent changes to secure settings.
*/
- private void updateGservicesValues() {
- mShortKeylightDelay = Settings.Gservices.getInt(
+ private void updateSettingsValues() {
+ mShortKeylightDelay = Settings.Secure.getInt(
mContext.getContentResolver(),
- Settings.Gservices.SHORT_KEYLIGHT_DELAY_MS,
+ Settings.Secure.SHORT_KEYLIGHT_DELAY_MS,
SHORT_KEYLIGHT_DELAY_DEFAULT);
- // Log.i(TAG, "updateGservicesValues(): mShortKeylightDelay now " + mShortKeylightDelay);
- }
-
- /**
- * Receiver for the Gservices.CHANGED_ACTION broadcast intent,
- * which tells us we need to refresh our cached Gservices settings.
- */
- private class GservicesChangedReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- // Log.i(TAG, "GservicesChangedReceiver.onReceive(): " + intent);
- updateGservicesValues();
- }
+ // Log.i(TAG, "updateSettingsValues(): mShortKeylightDelay now " + mShortKeylightDelay);
}
private class LockList extends ArrayList<WakeLock>
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 214ecc1..674ade9 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -74,8 +74,6 @@
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,
SystemClock.uptimeMillis());
- ActivityManagerService.prepareTraceFile(false); // create dir
-
Looper.prepare();
android.os.Process.setThreadPriority(
diff --git a/services/java/com/android/server/ViewServer.java b/services/java/com/android/server/ViewServer.java
index 07826a6..e9a1951 100644
--- a/services/java/com/android/server/ViewServer.java
+++ b/services/java/com/android/server/ViewServer.java
@@ -45,7 +45,7 @@
private static final String LOG_TAG = "ViewServer";
private static final String VALUE_PROTOCOL_VERSION = "2";
- private static final String VALUE_SERVER_VERSION = "2";
+ private static final String VALUE_SERVER_VERSION = "3";
// Protocol commands
// Returns the protocol version
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index 7ea6775..81255ee 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -394,7 +394,7 @@
if (defaultComponent != null) {
// See if there is a default wallpaper component specified
componentName = ComponentName.unflattenFromString(defaultComponent);
- if (DEBUG) Log.v(TAG, "Use default component walpaper:" + componentName);
+ if (DEBUG) Log.v(TAG, "Use default component wallpaper:" + componentName);
}
if (componentName == null) {
// Fall back to static image wallpaper
@@ -635,8 +635,14 @@
loadSettingsLocked();
if (mNextWallpaperComponent != null &&
!mNextWallpaperComponent.equals(mImageWallpaperComponent)) {
- // We can't restore live wallpapers, so just go with the default
- bindWallpaperComponentLocked(null);
+ try {
+ bindWallpaperComponentLocked(mNextWallpaperComponent);
+ } catch (IllegalArgumentException e) {
+ // No such live wallpaper or other failure; fall back to the default
+ // live wallpaper (since the profile being restored indicated that the
+ // user had selected a live rather than static one).
+ bindWallpaperComponentLocked(null);
+ }
success = true;
} else {
// If there's a wallpaper name, we use that. If that can't be loaded, then we
diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java
index 2ff9100..a6bfd99 100644
--- a/services/java/com/android/server/Watchdog.java
+++ b/services/java/com/android/server/Watchdog.java
@@ -97,16 +97,16 @@
long mLastMemCheckRealtime = -(MEMCHECK_DEFAULT_LOG_REALTIME_INTERVAL*1000);
boolean mHaveGlobalPss;
final MemMonitor mSystemMemMonitor = new MemMonitor("system",
- Settings.Gservices.MEMCHECK_SYSTEM_ENABLED,
- Settings.Gservices.MEMCHECK_SYSTEM_SOFT_THRESHOLD,
+ Settings.Secure.MEMCHECK_SYSTEM_ENABLED,
+ Settings.Secure.MEMCHECK_SYSTEM_SOFT_THRESHOLD,
MEMCHECK_DEFAULT_SYSTEM_SOFT_THRESHOLD,
- Settings.Gservices.MEMCHECK_SYSTEM_HARD_THRESHOLD,
+ Settings.Secure.MEMCHECK_SYSTEM_HARD_THRESHOLD,
MEMCHECK_DEFAULT_SYSTEM_HARD_THRESHOLD);
final MemMonitor mPhoneMemMonitor = new MemMonitor("com.android.phone",
- Settings.Gservices.MEMCHECK_PHONE_ENABLED,
- Settings.Gservices.MEMCHECK_PHONE_SOFT_THRESHOLD,
+ Settings.Secure.MEMCHECK_PHONE_ENABLED,
+ Settings.Secure.MEMCHECK_PHONE_SOFT_THRESHOLD,
MEMCHECK_DEFAULT_PHONE_SOFT_THRESHOLD,
- Settings.Gservices.MEMCHECK_PHONE_HARD_THRESHOLD,
+ Settings.Secure.MEMCHECK_PHONE_HARD_THRESHOLD,
MEMCHECK_DEFAULT_PHONE_HARD_THRESHOLD);
final Calendar mCalendar = Calendar.getInstance();
@@ -161,11 +161,11 @@
}
void retrieveSettings(ContentResolver resolver) {
- mSoftThreshold = Settings.Gservices.getInt(
+ mSoftThreshold = Settings.Secure.getInt(
resolver, mSoftSetting, mSoftThreshold);
- mHardThreshold = Settings.Gservices.getInt(
+ mHardThreshold = Settings.Secure.getInt(
resolver, mHardSetting, mHardThreshold);
- mEnabled = Settings.Gservices.getInt(
+ mEnabled = Settings.Secure.getInt(
resolver, mEnabledSetting, 0) != 0;
}
@@ -255,8 +255,8 @@
// See if we should force a reboot.
int rebootInterval = mReqRebootInterval >= 0
- ? mReqRebootInterval : Settings.Gservices.getInt(
- mResolver, Settings.Gservices.REBOOT_INTERVAL,
+ ? mReqRebootInterval : Settings.Secure.getInt(
+ mResolver, Settings.Secure.REBOOT_INTERVAL,
REBOOT_DEFAULT_INTERVAL);
if (mRebootInterval != rebootInterval) {
mRebootInterval = rebootInterval;
@@ -266,8 +266,8 @@
}
// See if we should check memory conditions.
- long memCheckInterval = Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_INTERVAL,
+ long memCheckInterval = Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_INTERVAL,
MEMCHECK_DEFAULT_INTERVAL) * 1000;
if ((mLastMemCheckTime+memCheckInterval) < now) {
// It is now time to collect pss information. This
@@ -279,8 +279,8 @@
collectMemory();
mHavePss = true;
- long memCheckRealtimeInterval = Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_LOG_REALTIME_INTERVAL,
+ long memCheckRealtimeInterval = Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_LOG_REALTIME_INTERVAL,
MEMCHECK_DEFAULT_LOG_REALTIME_INTERVAL) * 1000;
long realtimeNow = SystemClock.elapsedRealtime();
if ((mLastMemCheckRealtime+memCheckRealtimeInterval) < realtimeNow) {
@@ -468,8 +468,8 @@
long curTime;
long nextTime = 0;
- long recheckInterval = Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_RECHECK_INTERVAL,
+ long recheckInterval = Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_RECHECK_INTERVAL,
MEMCHECK_DEFAULT_RECHECK_INTERVAL) * 1000;
mSystemMemMonitor.retrieveSettings(mResolver);
@@ -586,8 +586,8 @@
void checkReboot(boolean fromAlarm) {
int rebootInterval = mReqRebootInterval >= 0 ? mReqRebootInterval
- : Settings.Gservices.getInt(
- mResolver, Settings.Gservices.REBOOT_INTERVAL,
+ : Settings.Secure.getInt(
+ mResolver, Settings.Secure.REBOOT_INTERVAL,
REBOOT_DEFAULT_INTERVAL);
mRebootInterval = rebootInterval;
if (rebootInterval <= 0) {
@@ -598,16 +598,16 @@
}
long rebootStartTime = mReqRebootStartTime >= 0 ? mReqRebootStartTime
- : Settings.Gservices.getLong(
- mResolver, Settings.Gservices.REBOOT_START_TIME,
+ : Settings.Secure.getLong(
+ mResolver, Settings.Secure.REBOOT_START_TIME,
REBOOT_DEFAULT_START_TIME);
long rebootWindowMillis = (mReqRebootWindow >= 0 ? mReqRebootWindow
- : Settings.Gservices.getLong(
- mResolver, Settings.Gservices.REBOOT_WINDOW,
+ : Settings.Secure.getLong(
+ mResolver, Settings.Secure.REBOOT_WINDOW,
REBOOT_DEFAULT_WINDOW)) * 1000;
long recheckInterval = (mReqRecheckInterval >= 0 ? mReqRecheckInterval
- : Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_RECHECK_INTERVAL,
+ : Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_RECHECK_INTERVAL,
MEMCHECK_DEFAULT_RECHECK_INTERVAL)) * 1000;
retrieveBrutalityAmount();
@@ -688,12 +688,12 @@
*/
void retrieveBrutalityAmount() {
mMinScreenOff = (mReqMinScreenOff >= 0 ? mReqMinScreenOff
- : Settings.Gservices.getInt(
- mResolver, Settings.Gservices.MEMCHECK_MIN_SCREEN_OFF,
+ : Settings.Secure.getInt(
+ mResolver, Settings.Secure.MEMCHECK_MIN_SCREEN_OFF,
MEMCHECK_DEFAULT_MIN_SCREEN_OFF)) * 1000;
mMinAlarm = (mReqMinNextAlarm >= 0 ? mReqMinNextAlarm
- : Settings.Gservices.getInt(
- mResolver, Settings.Gservices.MEMCHECK_MIN_ALARM,
+ : Settings.Secure.getInt(
+ mResolver, Settings.Secure.MEMCHECK_MIN_ALARM,
MEMCHECK_DEFAULT_MIN_ALARM)) * 1000;
}
@@ -737,11 +737,11 @@
mMemcheckLastTime = curTime;
- long memcheckExecStartTime = Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_EXEC_START_TIME,
+ long memcheckExecStartTime = Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_EXEC_START_TIME,
MEMCHECK_DEFAULT_EXEC_START_TIME);
- long memcheckExecEndTime = Settings.Gservices.getLong(
- mResolver, Settings.Gservices.MEMCHECK_EXEC_END_TIME,
+ long memcheckExecEndTime = Settings.Secure.getLong(
+ mResolver, Settings.Secure.MEMCHECK_EXEC_END_TIME,
MEMCHECK_DEFAULT_EXEC_END_TIME);
mMemcheckExecEndTime = computeCalendarTime(mCalendar, curTime,
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 987a24e..d5de1f0 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -113,8 +113,8 @@
private final IBatteryStats mBatteryStats;
/**
- * See {@link Settings.Gservices#WIFI_IDLE_MS}. This is the default value if a
- * Settings.Gservices value is not present. This timeout value is chosen as
+ * See {@link Settings.Secure#WIFI_IDLE_MS}. This is the default value if a
+ * Settings.Secure value is not present. This timeout value is chosen as
* the approximate point at which the battery drain caused by Wi-Fi
* being enabled but not active exceeds the battery drain caused by
* re-establishing a connection to the mobile data network.
@@ -330,19 +330,32 @@
return false;
}
+ /**
+ * Multiple calls to unregisterReceiver() cause exception and a system crash.
+ * This can happen if a supplicant is lost (or firmware crash occurs) and user indicates
+ * disable wifi at the same time.
+ * Avoid doing a disable when the current Wifi state is UNKNOWN
+ * TODO: Handle driver load fail and supplicant lost as seperate states
+ */
+ if (mWifiState == WIFI_STATE_UNKNOWN && !enable) {
+ return false;
+ }
+
setWifiEnabledState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING, uid);
if (enable) {
- if (!WifiNative.loadDriver()) {
- Log.e(TAG, "Failed to load Wi-Fi driver.");
- setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
- return false;
- }
- if (!WifiNative.startSupplicant()) {
- WifiNative.unloadDriver();
- Log.e(TAG, "Failed to start supplicant daemon.");
- setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
- return false;
+ synchronized (mWifiStateTracker) {
+ if (!WifiNative.loadDriver()) {
+ Log.e(TAG, "Failed to load Wi-Fi driver.");
+ setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
+ return false;
+ }
+ if (!WifiNative.startSupplicant()) {
+ WifiNative.unloadDriver();
+ Log.e(TAG, "Failed to start supplicant daemon.");
+ setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
+ return false;
+ }
}
registerForBroadcasts();
mWifiStateTracker.startEventLoop();
@@ -353,21 +366,23 @@
mWifiStateTracker.setNotificationVisible(false, 0, false, 0);
boolean failedToStopSupplicantOrUnloadDriver = false;
- if (!WifiNative.stopSupplicant()) {
- Log.e(TAG, "Failed to stop supplicant daemon.");
- setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
- failedToStopSupplicantOrUnloadDriver = true;
- }
-
- // We must reset the interface before we unload the driver
- mWifiStateTracker.resetInterface(false);
-
- if (!WifiNative.unloadDriver()) {
- Log.e(TAG, "Failed to unload Wi-Fi driver.");
- if (!failedToStopSupplicantOrUnloadDriver) {
+ synchronized (mWifiStateTracker) {
+ if (!WifiNative.stopSupplicant()) {
+ Log.e(TAG, "Failed to stop supplicant daemon.");
setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
failedToStopSupplicantOrUnloadDriver = true;
}
+
+ // We must reset the interface before we unload the driver
+ mWifiStateTracker.resetInterface(false);
+
+ if (!WifiNative.unloadDriver()) {
+ Log.e(TAG, "Failed to unload Wi-Fi driver.");
+ if (!failedToStopSupplicantOrUnloadDriver) {
+ setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
+ failedToStopSupplicantOrUnloadDriver = true;
+ }
+ }
}
if (failedToStopSupplicantOrUnloadDriver) {
return false;
@@ -380,7 +395,6 @@
persistWifiEnabled(enable);
}
setWifiEnabledState(eventualWifiState, uid);
-
return true;
}
@@ -698,7 +712,7 @@
* @return the supplicant-assigned identifier for the new or updated
* network if the operation succeeds, or {@code -1} if it fails
*/
- public synchronized int addOrUpdateNetwork(WifiConfiguration config) {
+ public int addOrUpdateNetwork(WifiConfiguration config) {
enforceChangePermission();
/*
* If the supplied networkId is -1, we create a new empty
@@ -710,41 +724,41 @@
boolean doReconfig;
int currentPriority;
// networkId of -1 means we want to create a new network
- if (newNetwork) {
- netId = WifiNative.addNetworkCommand();
- if (netId < 0) {
- if (DBG) {
- Log.d(TAG, "Failed to add a network!");
+ synchronized (mWifiStateTracker) {
+ if (newNetwork) {
+ netId = WifiNative.addNetworkCommand();
+ if (netId < 0) {
+ if (DBG) {
+ Log.d(TAG, "Failed to add a network!");
+ }
+ return -1;
}
- return -1;
- }
- doReconfig = true;
- } else {
- String priorityVal = WifiNative.getNetworkVariableCommand(netId, WifiConfiguration.priorityVarName);
- currentPriority = -1;
- if (!TextUtils.isEmpty(priorityVal)) {
- try {
- currentPriority = Integer.parseInt(priorityVal);
- } catch (NumberFormatException ignore) {
+ doReconfig = true;
+ } else {
+ String priorityVal = WifiNative.getNetworkVariableCommand(netId, WifiConfiguration.priorityVarName);
+ currentPriority = -1;
+ if (!TextUtils.isEmpty(priorityVal)) {
+ try {
+ currentPriority = Integer.parseInt(priorityVal);
+ } catch (NumberFormatException ignore) {
+ }
}
+ doReconfig = currentPriority != config.priority;
}
- doReconfig = currentPriority != config.priority;
- }
- mNeedReconfig = mNeedReconfig || doReconfig;
+ mNeedReconfig = mNeedReconfig || doReconfig;
- setVariables: {
+ setVariables: {
/*
* Note that if a networkId for a non-existent network
* was supplied, then the first setNetworkVariableCommand()
* will fail, so we don't bother to make a separate check
* for the validity of the ID up front.
*/
-
if (config.SSID != null &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.ssidVarName,
- convertToQuotedString(config.SSID))) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.ssidVarName,
+ convertToQuotedString(config.SSID))) {
if (DBG) {
Log.d(TAG, "failed to set SSID: "+config.SSID);
}
@@ -752,10 +766,10 @@
}
if (config.BSSID != null &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.bssidVarName,
- config.BSSID)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.bssidVarName,
+ config.BSSID)) {
if (DBG) {
Log.d(TAG, "failed to set BSSID: "+config.BSSID);
}
@@ -765,13 +779,13 @@
String allowedKeyManagementString =
makeString(config.allowedKeyManagement, WifiConfiguration.KeyMgmt.strings);
if (config.allowedKeyManagement.cardinality() != 0 &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.KeyMgmt.varName,
- allowedKeyManagementString)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.KeyMgmt.varName,
+ allowedKeyManagementString)) {
if (DBG) {
Log.d(TAG, "failed to set key_mgmt: "+
- allowedKeyManagementString);
+ allowedKeyManagementString);
}
break setVariables;
}
@@ -779,13 +793,13 @@
String allowedProtocolsString =
makeString(config.allowedProtocols, WifiConfiguration.Protocol.strings);
if (config.allowedProtocols.cardinality() != 0 &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.Protocol.varName,
- allowedProtocolsString)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.Protocol.varName,
+ allowedProtocolsString)) {
if (DBG) {
Log.d(TAG, "failed to set proto: "+
- allowedProtocolsString);
+ allowedProtocolsString);
}
break setVariables;
}
@@ -793,13 +807,13 @@
String allowedAuthAlgorithmsString =
makeString(config.allowedAuthAlgorithms, WifiConfiguration.AuthAlgorithm.strings);
if (config.allowedAuthAlgorithms.cardinality() != 0 &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.AuthAlgorithm.varName,
- allowedAuthAlgorithmsString)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.AuthAlgorithm.varName,
+ allowedAuthAlgorithmsString)) {
if (DBG) {
Log.d(TAG, "failed to set auth_alg: "+
- allowedAuthAlgorithmsString);
+ allowedAuthAlgorithmsString);
}
break setVariables;
}
@@ -807,13 +821,13 @@
String allowedPairwiseCiphersString =
makeString(config.allowedPairwiseCiphers, WifiConfiguration.PairwiseCipher.strings);
if (config.allowedPairwiseCiphers.cardinality() != 0 &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.PairwiseCipher.varName,
- allowedPairwiseCiphersString)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.PairwiseCipher.varName,
+ allowedPairwiseCiphersString)) {
if (DBG) {
Log.d(TAG, "failed to set pairwise: "+
- allowedPairwiseCiphersString);
+ allowedPairwiseCiphersString);
}
break setVariables;
}
@@ -821,13 +835,13 @@
String allowedGroupCiphersString =
makeString(config.allowedGroupCiphers, WifiConfiguration.GroupCipher.strings);
if (config.allowedGroupCiphers.cardinality() != 0 &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.GroupCipher.varName,
- allowedGroupCiphersString)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.GroupCipher.varName,
+ allowedGroupCiphersString)) {
if (DBG) {
Log.d(TAG, "failed to set group: "+
- allowedGroupCiphersString);
+ allowedGroupCiphersString);
}
break setVariables;
}
@@ -835,10 +849,10 @@
// Prevent client screw-up by passing in a WifiConfiguration we gave it
// by preventing "*" as a key.
if (config.preSharedKey != null && !config.preSharedKey.equals("*") &&
- !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.pskVarName,
- config.preSharedKey)) {
+ !WifiNative.setNetworkVariableCommand(
+ netId,
+ WifiConfiguration.pskVarName,
+ config.preSharedKey)) {
if (DBG) {
Log.d(TAG, "failed to set psk: "+config.preSharedKey);
}
@@ -852,13 +866,13 @@
// by preventing "*" as a key.
if (config.wepKeys[i] != null && !config.wepKeys[i].equals("*")) {
if (!WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.wepKeyVarNames[i],
- config.wepKeys[i])) {
+ netId,
+ WifiConfiguration.wepKeyVarNames[i],
+ config.wepKeys[i])) {
if (DBG) {
Log.d(TAG,
- "failed to set wep_key"+i+": " +
- config.wepKeys[i]);
+ "failed to set wep_key"+i+": " +
+ config.wepKeys[i]);
}
break setVariables;
}
@@ -869,36 +883,36 @@
if (hasSetKey) {
if (!WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.wepTxKeyIdxVarName,
- Integer.toString(config.wepTxKeyIndex))) {
+ netId,
+ WifiConfiguration.wepTxKeyIdxVarName,
+ Integer.toString(config.wepTxKeyIndex))) {
if (DBG) {
Log.d(TAG,
- "failed to set wep_tx_keyidx: "+
- config.wepTxKeyIndex);
+ "failed to set wep_tx_keyidx: "+
+ config.wepTxKeyIndex);
}
break setVariables;
}
}
if (!WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.priorityVarName,
- Integer.toString(config.priority))) {
+ netId,
+ WifiConfiguration.priorityVarName,
+ Integer.toString(config.priority))) {
if (DBG) {
Log.d(TAG, config.SSID + ": failed to set priority: "
- +config.priority);
+ +config.priority);
}
break setVariables;
}
if (config.hiddenSSID && !WifiNative.setNetworkVariableCommand(
- netId,
- WifiConfiguration.hiddenSSIDVarName,
- Integer.toString(config.hiddenSSID ? 1 : 0))) {
+ netId,
+ WifiConfiguration.hiddenSSIDVarName,
+ Integer.toString(config.hiddenSSID ? 1 : 0))) {
if (DBG) {
Log.d(TAG, config.SSID + ": failed to set hiddenSSID: "+
- config.hiddenSSID);
+ config.hiddenSSID);
}
break setVariables;
}
@@ -912,32 +926,33 @@
value = convertToQuotedString(value);
}
if (!WifiNative.setNetworkVariableCommand(
- netId,
- varName,
- value)) {
+ netId,
+ varName,
+ value)) {
if (DBG) {
Log.d(TAG, config.SSID + ": failed to set " + varName +
- ": " + value);
+ ": " + value);
}
break setVariables;
}
}
}
return netId;
- }
+ }
- /*
- * For an update, if one of the setNetworkVariable operations fails,
- * we might want to roll back all the changes already made. But the
- * chances are that if anything is going to go wrong, it'll happen
- * the first time we try to set one of the variables.
- */
- if (newNetwork) {
- removeNetwork(netId);
- if (DBG) {
- Log.d(TAG,
- "Failed to set a network variable, removed network: "
- + netId);
+ /*
+ * For an update, if one of the setNetworkVariable operations fails,
+ * we might want to roll back all the changes already made. But the
+ * chances are that if anything is going to go wrong, it'll happen
+ * the first time we try to set one of the variables.
+ */
+ if (newNetwork) {
+ removeNetwork(netId);
+ if (DBG) {
+ Log.d(TAG,
+ "Failed to set a network variable, removed network: "
+ + netId);
+ }
}
}
return -1;
@@ -1317,11 +1332,12 @@
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
- long idleMillis = Settings.Gservices.getLong(mContext.getContentResolver(),
- Settings.Gservices.WIFI_IDLE_MS, DEFAULT_IDLE_MILLIS);
+ long idleMillis =
+ Settings.Secure.getLong(mContext.getContentResolver(),
+ Settings.Secure.WIFI_IDLE_MS, DEFAULT_IDLE_MILLIS);
int stayAwakeConditions =
- Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
+ Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
if (action.equals(Intent.ACTION_SCREEN_ON)) {
Log.d(TAG, "ACTION_SCREEN_ON");
mAlarmManager.cancel(mIdleIntent);
@@ -1848,13 +1864,14 @@
public void initializeMulticastFiltering() {
enforceMulticastChangePermission();
-
synchronized (mMulticasters) {
// if anybody had requested filters be off, leave off
if (mMulticasters.size() != 0) {
return;
} else {
- WifiNative.startPacketFiltering();
+ synchronized (mWifiStateTracker) {
+ WifiNative.startPacketFiltering();
+ }
}
}
}
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index d250e3c..1d14e5e 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -2020,7 +2020,7 @@
// to hold off on removing the window until the animation is done.
// If the display is frozen, just remove immediately, since the
// animation wouldn't be seen.
- if (win.mSurface != null && !mDisplayFrozen) {
+ if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) {
// If we are not currently running the exit animation, we
// need to see about starting one.
if (wasVisible=win.isWinVisibleLw()) {
@@ -2336,7 +2336,8 @@
win.mEnterAnimationPending = true;
}
if (displayed && win.mSurface != null && !win.mDrawPending
- && !win.mCommitDrawPending && !mDisplayFrozen) {
+ && !win.mCommitDrawPending && !mDisplayFrozen
+ && mPolicy.isScreenOn()) {
applyEnterAnimationLocked(win);
}
if (displayed && (win.mAttrs.flags
@@ -2376,6 +2377,18 @@
mInputMethodWindow = win;
imMayMove = true;
}
+ if (win.mAttrs.type == TYPE_BASE_APPLICATION
+ && win.mAppToken != null
+ && win.mAppToken.startingWindow != null) {
+ // Special handling of starting window over the base
+ // window of the app: propagate lock screen flags to it,
+ // to provide the correct semantics while starting.
+ final int mask =
+ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+ WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
+ sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
+ }
} else {
win.mEnterAnimationPending = false;
if (win.mSurface != null) {
@@ -2576,7 +2589,7 @@
// frozen, there is no reason to animate and it can cause strange
// artifacts when we unfreeze the display if some different animation
// is running.
- if (!mDisplayFrozen) {
+ if (!mDisplayFrozen && mPolicy.isScreenOn()) {
int anim = mPolicy.selectAnimationLw(win, transit);
int attr = -1;
Animation a = null;
@@ -2659,7 +2672,7 @@
// frozen, there is no reason to animate and it can cause strange
// artifacts when we unfreeze the display if some different animation
// is running.
- if (!mDisplayFrozen) {
+ if (!mDisplayFrozen && mPolicy.isScreenOn()) {
Animation a;
if (lp != null && (lp.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
a = new FadeInOutAnimation(enter);
@@ -3250,7 +3263,7 @@
// If the display is frozen, we won't do anything until the
// actual window is displayed so there is no reason to put in
// the starting window.
- if (mDisplayFrozen) {
+ if (mDisplayFrozen || !mPolicy.isScreenOn()) {
return;
}
@@ -4642,7 +4655,7 @@
index = parameters.length();
}
final String code = parameters.substring(0, index);
- int hashCode = "ffffffff".equals(code) ? -1 : Integer.parseInt(code, 16);
+ int hashCode = (int) Long.parseLong(code, 16);
// Extract the command's parameter after the window description
if (index < parameters.length()) {
@@ -7082,8 +7095,8 @@
w = mAttrs.width < 0 ? pw : mAttrs.width;
h = mAttrs.height< 0 ? ph : mAttrs.height;
} else {
- w = mAttrs.width == mAttrs.FILL_PARENT ? pw : mRequestedWidth;
- h = mAttrs.height== mAttrs.FILL_PARENT ? ph : mRequestedHeight;
+ w = mAttrs.width == mAttrs.MATCH_PARENT ? pw : mRequestedWidth;
+ h = mAttrs.height== mAttrs.MATCH_PARENT ? ph : mRequestedHeight;
}
final Rect content = mContentFrame;
@@ -7479,7 +7492,7 @@
// This must be called while inside a transaction. Returns true if
// there is more animation to run.
boolean stepAnimationLocked(long currentTime, int dw, int dh) {
- if (!mDisplayFrozen) {
+ if (!mDisplayFrozen && mPolicy.isScreenOn()) {
// We will run animations as long as the display isn't frozen.
if (!mDrawPending && !mCommitDrawPending && mAnimation != null) {
@@ -8409,7 +8422,7 @@
// This must be called while inside a transaction.
boolean stepAnimationLocked(long currentTime, int dw, int dh) {
- if (!mDisplayFrozen) {
+ if (!mDisplayFrozen && mPolicy.isScreenOn()) {
// We will run animations as long as the display isn't frozen.
if (animation == sDummyAnimation) {
@@ -8498,7 +8511,8 @@
final int N = allAppWindows.size();
for (int i=0; i<N; i++) {
WindowState win = allAppWindows.get(i);
- if (win == startingWindow || win.mAppFreezing) {
+ if (win == startingWindow || win.mAppFreezing
+ || win.mViewVisibility != View.VISIBLE) {
continue;
}
if (DEBUG_VISIBILITY) {
@@ -9379,6 +9393,7 @@
try {
boolean restart;
boolean forceHiding = false;
+ boolean wallpaperForceHidingChanged = false;
do {
final int transactionSequence = ++mTransactionSequence;
@@ -9399,13 +9414,16 @@
}
}
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "*** ANIM STEP: seq="
+ + transactionSequence + " tokensAnimating="
+ + tokensAnimating);
+
animating = tokensAnimating;
restart = false;
boolean tokenMayBeDrawn = false;
boolean wallpaperMayChange = false;
boolean focusMayChange = false;
- boolean wallpaperForceHidingChanged = false;
mPolicy.beginAnimationLw(dw, dh);
@@ -9718,6 +9736,14 @@
mLastEnterAnimParams = null;
}
+ // If all closing windows are obscured, then there is
+ // no need to do an animation. This is the case, for
+ // example, when this transition is being done behind
+ // the lock screen.
+ if (!mPolicy.allowAppAnimationsLw()) {
+ animLp = null;
+ }
+
NN = mOpeningApps.size();
for (i=0; i<NN; i++) {
AppWindowToken wtoken = mOpeningApps.get(i);
@@ -9790,7 +9816,7 @@
int adjResult = 0;
- if (wallpaperForceHidingChanged) {
+ if (wallpaperForceHidingChanged && !restart && !mAppTransitionReady) {
// At this point, there was a window with a wallpaper that
// was force hiding other windows behind it, but now it
// is going away. This may be simple -- just animate
@@ -9798,10 +9824,28 @@
// hard -- the wallpaper now needs to be shown behind
// something that was hidden.
WindowState oldWallpaper = mWallpaperTarget;
+ if (mLowerWallpaperTarget != null
+ && mLowerWallpaperTarget.mAppToken != null) {
+ if (DEBUG_WALLPAPER) Log.v(TAG,
+ "wallpaperForceHiding changed with lower="
+ + mLowerWallpaperTarget);
+ if (DEBUG_WALLPAPER) Log.v(TAG,
+ "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
+ " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
+ if (mLowerWallpaperTarget.mAppToken.hidden) {
+ // The lower target has become hidden before we
+ // actually started the animation... let's completely
+ // re-evaluate everything.
+ mLowerWallpaperTarget = mUpperWallpaperTarget = null;
+ restart = true;
+ }
+ }
adjResult = adjustWallpaperWindowsLocked();
wallpaperMayChange = false;
- if (false) Log.v(TAG, "****** OLD: " + oldWallpaper
- + " NEW: " + mWallpaperTarget);
+ wallpaperForceHidingChanged = false;
+ if (DEBUG_WALLPAPER) Log.v(TAG, "****** OLD: " + oldWallpaper
+ + " NEW: " + mWallpaperTarget
+ + " LOWER: " + mLowerWallpaperTarget);
if (mLowerWallpaperTarget == null) {
// Whoops, we don't need a special wallpaper animation.
// Clear them out.
@@ -9856,6 +9900,9 @@
performLayoutLockedInner();
}
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "*** ANIM STEP: restart="
+ + restart);
+
} while (restart);
// THIRD LOOP: Update the surfaces of all windows.
@@ -10089,8 +10136,8 @@
if (displayed) {
if (!covered) {
- if (attrs.width == LayoutParams.FILL_PARENT
- && attrs.height == LayoutParams.FILL_PARENT) {
+ if (attrs.width == LayoutParams.MATCH_PARENT
+ && attrs.height == LayoutParams.MATCH_PARENT) {
covered = true;
}
}
@@ -10245,7 +10292,8 @@
}
if (mDimAnimator != null && mDimAnimator.mDimShown) {
- animating |= mDimAnimator.updateSurface(dimming, currentTime, mDisplayFrozen);
+ animating |= mDimAnimator.updateSurface(dimming, currentTime,
+ mDisplayFrozen || !mPolicy.isScreenOn());
}
if (!blurring && mBlurShown) {
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 3c66445..40d194c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -25,6 +25,8 @@
import com.android.server.Watchdog;
import com.android.server.WindowManagerService;
+import dalvik.system.Zygote;
+
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
@@ -68,9 +70,12 @@
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
+import android.os.DropBoxManager;
import android.os.Environment;
+import android.os.FileObserver;
import android.os.FileUtils;
import android.os.Handler;
import android.os.IBinder;
@@ -100,10 +105,6 @@
import android.view.WindowManager;
import android.view.WindowManagerPolicy;
-import dalvik.system.Zygote;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -254,41 +255,36 @@
// the first to go! Value set in system/rootdir/init.rc on startup.
// This value is initalized in the constructor, careful when refering to
// this static variable externally.
- static int EMPTY_APP_ADJ;
-
- // This is a process with a content provider that does not have any clients
- // attached to it. If it did have any clients, its adjustment would be the
- // one for the highest-priority of those processes.
- static int CONTENT_PROVIDER_ADJ;
+ static final int EMPTY_APP_ADJ;
// This is a process only hosting activities that are not visible,
// so it can be killed without any disruption. Value set in
// system/rootdir/init.rc on startup.
- final int HIDDEN_APP_MAX_ADJ;
+ static final int HIDDEN_APP_MAX_ADJ;
static int HIDDEN_APP_MIN_ADJ;
// This is a process holding the home application -- we want to try
// avoiding killing it, even if it would normally be in the background,
// because the user interacts with it so much.
- final int HOME_APP_ADJ;
+ static final int HOME_APP_ADJ;
// This is a process currently hosting a backup operation. Killing it
// is not entirely fatal but is generally a bad idea.
- final int BACKUP_APP_ADJ;
+ static final int BACKUP_APP_ADJ;
// This is a process holding a secondary server -- killing it will not
// have much of an impact as far as the user is concerned. Value set in
// system/rootdir/init.rc on startup.
- final int SECONDARY_SERVER_ADJ;
+ static final int SECONDARY_SERVER_ADJ;
// This is a process only hosting activities that are visible to the
// user, so we'd prefer they don't disappear. Value set in
// system/rootdir/init.rc on startup.
- final int VISIBLE_APP_ADJ;
+ static final int VISIBLE_APP_ADJ;
// This is the process running the current foreground app. We'd really
// rather not kill it! Value set in system/rootdir/init.rc on startup.
- final int FOREGROUND_APP_ADJ;
+ static final int FOREGROUND_APP_ADJ;
// This is a process running a core server, such as telephony. Definitely
// don't want to kill it, but doing so is not completely fatal.
@@ -307,15 +303,60 @@
static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
// Corresponding memory levels for above adjustments.
- final int EMPTY_APP_MEM;
- final int HIDDEN_APP_MEM;
- final int HOME_APP_MEM;
- final int BACKUP_APP_MEM;
- final int SECONDARY_SERVER_MEM;
- final int VISIBLE_APP_MEM;
- final int FOREGROUND_APP_MEM;
+ static final int EMPTY_APP_MEM;
+ static final int HIDDEN_APP_MEM;
+ static final int HOME_APP_MEM;
+ static final int BACKUP_APP_MEM;
+ static final int SECONDARY_SERVER_MEM;
+ static final int VISIBLE_APP_MEM;
+ static final int FOREGROUND_APP_MEM;
+
+ // The minimum number of hidden apps we want to be able to keep around,
+ // without empty apps being able to push them out of memory.
+ static final int MIN_HIDDEN_APPS = 2;
- final int MY_PID;
+ // We put empty content processes after any hidden processes that have
+ // been idle for less than 30 seconds.
+ static final long CONTENT_APP_IDLE_OFFSET = 30*1000;
+
+ // We put empty content processes after any hidden processes that have
+ // been idle for less than 60 seconds.
+ static final long EMPTY_APP_IDLE_OFFSET = 60*1000;
+
+ static {
+ // These values are set in system/rootdir/init.rc on startup.
+ FOREGROUND_APP_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.FOREGROUND_APP_ADJ"));
+ VISIBLE_APP_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.VISIBLE_APP_ADJ"));
+ SECONDARY_SERVER_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_ADJ"));
+ BACKUP_APP_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.BACKUP_APP_ADJ"));
+ HOME_APP_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.HOME_APP_ADJ"));
+ HIDDEN_APP_MIN_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.HIDDEN_APP_MIN_ADJ"));
+ EMPTY_APP_ADJ =
+ Integer.valueOf(SystemProperties.get("ro.EMPTY_APP_ADJ"));
+ HIDDEN_APP_MAX_ADJ = EMPTY_APP_ADJ-1;
+ FOREGROUND_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.FOREGROUND_APP_MEM"))*PAGE_SIZE;
+ VISIBLE_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.VISIBLE_APP_MEM"))*PAGE_SIZE;
+ SECONDARY_SERVER_MEM =
+ Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_MEM"))*PAGE_SIZE;
+ BACKUP_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.BACKUP_APP_MEM"))*PAGE_SIZE;
+ HOME_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.HOME_APP_MEM"))*PAGE_SIZE;
+ HIDDEN_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.HIDDEN_APP_MEM"))*PAGE_SIZE;
+ EMPTY_APP_MEM =
+ Integer.valueOf(SystemProperties.get("ro.EMPTY_APP_MEM"))*PAGE_SIZE;
+ }
+
+ static final int MY_PID = Process.myPid();
static final String[] EMPTY_STRING_ARRAY = new String[0];
@@ -527,7 +568,7 @@
* It contains ApplicationRecord objects. This list does NOT include
* any persistent application records (since we never want to exit them).
*/
- final ArrayList<ProcessRecord> mLRUProcesses
+ final ArrayList<ProcessRecord> mLruProcesses
= new ArrayList<ProcessRecord>();
/**
@@ -1075,8 +1116,8 @@
} break;
case UPDATE_TIME_ZONE: {
synchronized (ActivityManagerService.this) {
- for (int i = mLRUProcesses.size() - 1 ; i >= 0 ; i--) {
- ProcessRecord r = mLRUProcesses.get(i);
+ for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
+ ProcessRecord r = mLruProcesses.get(i);
if (r.thread != null) {
try {
r.thread.updateTimeZone();
@@ -1154,7 +1195,7 @@
int uid = msg.arg1;
boolean restart = (msg.arg2 == 1);
String pkg = (String) msg.obj;
- uninstallPackageLocked(pkg, uid, restart);
+ forceStopPackageLocked(pkg, uid, restart);
}
} break;
}
@@ -1170,10 +1211,6 @@
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(m));
}
- ServiceManager.addService("activity.broadcasts", new BroadcastsBinder(m));
- ServiceManager.addService("activity.services", new ServicesBinder(m));
- ServiceManager.addService("activity.senders", new SendersBinder(m));
- ServiceManager.addService("activity.providers", new ProvidersBinder(m));
ServiceManager.addService("permission", new PermissionController(m));
ApplicationInfo info =
@@ -1186,13 +1223,13 @@
mSystemThread.getApplicationThread(), info,
info.processName);
app.persistent = true;
- app.pid = Process.myPid();
+ app.pid = MY_PID;
app.maxAdj = SYSTEM_ADJ;
mSelf.mProcessNames.put(app.processName, app.info.uid, app);
synchronized (mSelf.mPidsSelfLocked) {
mSelf.mPidsSelfLocked.put(app.pid, app);
}
- mSelf.updateLRUListLocked(app, true);
+ mSelf.updateLruProcessLocked(app, true, true);
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
@@ -1281,54 +1318,6 @@
}
}
- static class BroadcastsBinder extends Binder {
- ActivityManagerService mActivityManagerService;
- BroadcastsBinder(ActivityManagerService activityManagerService) {
- mActivityManagerService = activityManagerService;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mActivityManagerService.dumpBroadcasts(pw);
- }
- }
-
- static class ServicesBinder extends Binder {
- ActivityManagerService mActivityManagerService;
- ServicesBinder(ActivityManagerService activityManagerService) {
- mActivityManagerService = activityManagerService;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mActivityManagerService.dumpServices(pw);
- }
- }
-
- static class SendersBinder extends Binder {
- ActivityManagerService mActivityManagerService;
- SendersBinder(ActivityManagerService activityManagerService) {
- mActivityManagerService = activityManagerService;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mActivityManagerService.dumpSenders(pw);
- }
- }
-
- static class ProvidersBinder extends Binder {
- ActivityManagerService mActivityManagerService;
- ProvidersBinder(ActivityManagerService activityManagerService) {
- mActivityManagerService = activityManagerService;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mActivityManagerService.dumpProviders(pw);
- }
- }
-
static class MemBinder extends Binder {
ActivityManagerService mActivityManagerService;
MemBinder(ActivityManagerService activityManagerService) {
@@ -1349,8 +1338,8 @@
} catch (NumberFormatException e) {
}
- for (int i=0; i<service.mLRUProcesses.size(); i++) {
- ProcessRecord proc = service.mLRUProcesses.get(i);
+ for (int i=service.mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord proc = service.mLruProcesses.get(i);
if (proc.pid == pid) {
procs.add(proc);
} else if (proc.processName.equals(args[0])) {
@@ -1362,7 +1351,7 @@
return;
}
} else {
- procs = service.mLRUProcesses;
+ procs = service.mLruProcesses;
}
}
dumpApplicationMemoryUsage(fd, pw, procs, " ", args);
@@ -1395,8 +1384,6 @@
Log.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
- MY_PID = Process.myPid();
-
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
systemDir.mkdirs();
@@ -1417,39 +1404,6 @@
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
- // These values are set in system/rootdir/init.rc on startup.
- FOREGROUND_APP_ADJ =
- Integer.valueOf(SystemProperties.get("ro.FOREGROUND_APP_ADJ"));
- VISIBLE_APP_ADJ =
- Integer.valueOf(SystemProperties.get("ro.VISIBLE_APP_ADJ"));
- SECONDARY_SERVER_ADJ =
- Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_ADJ"));
- BACKUP_APP_ADJ =
- Integer.valueOf(SystemProperties.get("ro.BACKUP_APP_ADJ"));
- HOME_APP_ADJ =
- Integer.valueOf(SystemProperties.get("ro.HOME_APP_ADJ"));
- HIDDEN_APP_MIN_ADJ =
- Integer.valueOf(SystemProperties.get("ro.HIDDEN_APP_MIN_ADJ"));
- CONTENT_PROVIDER_ADJ =
- Integer.valueOf(SystemProperties.get("ro.CONTENT_PROVIDER_ADJ"));
- HIDDEN_APP_MAX_ADJ = CONTENT_PROVIDER_ADJ-1;
- EMPTY_APP_ADJ =
- Integer.valueOf(SystemProperties.get("ro.EMPTY_APP_ADJ"));
- FOREGROUND_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.FOREGROUND_APP_MEM"))*PAGE_SIZE;
- VISIBLE_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.VISIBLE_APP_MEM"))*PAGE_SIZE;
- SECONDARY_SERVER_MEM =
- Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_MEM"))*PAGE_SIZE;
- BACKUP_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.BACKUP_APP_MEM"))*PAGE_SIZE;
- HOME_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.HOME_APP_MEM"))*PAGE_SIZE;
- HIDDEN_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.HIDDEN_APP_MEM"))*PAGE_SIZE;
- EMPTY_APP_MEM =
- Integer.valueOf(SystemProperties.get("ro.EMPTY_APP_MEM"))*PAGE_SIZE;
-
mProcessStatsThread = new Thread("ProcessStats") {
public void run() {
while (true) {
@@ -1602,12 +1556,54 @@
}
}
- private final void updateLRUListLocked(ProcessRecord app,
- boolean oomAdj) {
+ private final void updateLruProcessLocked(ProcessRecord app,
+ boolean oomAdj, boolean updateActivityTime) {
// put it on the LRU to keep track of when it should be exited.
- int lrui = mLRUProcesses.indexOf(app);
- if (lrui >= 0) mLRUProcesses.remove(lrui);
- mLRUProcesses.add(app);
+ int lrui = mLruProcesses.indexOf(app);
+ if (lrui >= 0) mLruProcesses.remove(lrui);
+
+ int i = mLruProcesses.size()-1;
+ int skipTop = 0;
+
+ // compute the new weight for this process.
+ if (updateActivityTime) {
+ app.lastActivityTime = SystemClock.uptimeMillis();
+ }
+ if (app.activities.size() > 0) {
+ // If this process has activities, we more strongly want to keep
+ // it around.
+ app.lruWeight = app.lastActivityTime;
+ } else if (app.pubProviders.size() > 0) {
+ // If this process contains content providers, we want to keep
+ // it a little more strongly.
+ app.lruWeight = app.lastActivityTime - CONTENT_APP_IDLE_OFFSET;
+ // Also don't let it kick out the first few "real" hidden processes.
+ skipTop = MIN_HIDDEN_APPS;
+ } else {
+ // If this process doesn't have activities, we less strongly
+ // want to keep it around, and generally want to avoid getting
+ // in front of any very recently used activities.
+ app.lruWeight = app.lastActivityTime - EMPTY_APP_IDLE_OFFSET;
+ // Also don't let it kick out the first few "real" hidden processes.
+ skipTop = MIN_HIDDEN_APPS;
+ }
+ while (i >= 0) {
+ ProcessRecord p = mLruProcesses.get(i);
+ // If this app shouldn't be in front of the first N background
+ // apps, then skip over that many that are currently hidden.
+ if (skipTop > 0 && p.setAdj >= HIDDEN_APP_MIN_ADJ) {
+ skipTop--;
+ }
+ if (p.lruWeight <= app.lruWeight){
+ mLruProcesses.add(i+1, app);
+ break;
+ }
+ i--;
+ }
+ if (i < 0) {
+ mLruProcesses.add(0, app);
+ }
+
//Log.i(TAG, "Putting proc to front: " + app.processName);
if (oomAdj) {
updateOomAdjLocked();
@@ -1725,7 +1721,7 @@
if (idx < 0) {
app.activities.add(r);
}
- updateLRUListLocked(app, true);
+ updateLruProcessLocked(app, true, true);
try {
if (app.thread == null) {
@@ -2657,7 +2653,7 @@
next.state = ActivityState.RESUMED;
mResumedActivity = next;
next.task.touchActiveTime();
- updateLRUListLocked(next.app, true);
+ updateLruProcessLocked(next.app, true, true);
updateLRUListLocked(next);
// Have the window manager re-evaluate the orientation of
@@ -2737,8 +2733,7 @@
// Whoops, need to restart this activity!
next.state = lastState;
mResumedActivity = lastResumedActivity;
- if (Config.LOGD) Log.d(TAG,
- "Restarting because process died: " + next);
+ Log.i(TAG, "Restarting because process died: " + next);
if (!next.hasBeenLaunched) {
next.hasBeenLaunched = true;
} else {
@@ -4296,7 +4291,9 @@
cleanUpActivityLocked(r, false);
- if (r.app != null) {
+ final boolean hadApp = r.app != null;
+
+ if (hadApp) {
if (removeFromApp) {
int idx = r.app.activities.indexOf(r);
if (idx >= 0) {
@@ -4305,6 +4302,11 @@
if (r.persistent) {
decPersistentCountLocked(r.app);
}
+ if (r.app.activities.size() == 0) {
+ // No longer have activities, so update location in
+ // LRU list.
+ updateLruProcessLocked(r.app, true, false);
+ }
}
boolean skipDestroy = false;
@@ -4348,16 +4350,14 @@
r.configChangeFlags = 0;
- if (!mLRUActivities.remove(r)) {
+ if (!mLRUActivities.remove(r) && hadApp) {
Log.w(TAG, "Activity " + r + " being finished, but not in LRU list");
}
return removedFromHistory;
}
- private static void removeHistoryRecordsForAppLocked(ArrayList list,
- ProcessRecord app)
- {
+ private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
int i = list.size();
if (localLOGV) Log.v(
TAG, "Removing app " + app + " from list " + list
@@ -4383,7 +4383,7 @@
boolean restarting) {
cleanUpApplicationRecordLocked(app, restarting, -1);
if (!restarting) {
- mLRUProcesses.remove(app);
+ mLruProcesses.remove(app);
}
// Just in case...
@@ -4476,10 +4476,8 @@
IBinder threadBinder = thread.asBinder();
// Find the application record.
- int count = mLRUProcesses.size();
- int i;
- for (i=0; i<count; i++) {
- ProcessRecord rec = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord rec = mLruProcesses.get(i);
if (rec.thread != null && rec.thread.asBinder() == threadBinder) {
return i;
}
@@ -4494,7 +4492,7 @@
}
int appIndex = getLRURecordIndexForAppLocked(thread);
- return appIndex >= 0 ? mLRUProcesses.get(appIndex) : null;
+ return appIndex >= 0 ? mLruProcesses.get(appIndex) : null;
}
private final void appDiedLocked(ProcessRecord app, int pid,
@@ -4517,10 +4515,8 @@
// and the app that died was not running instrumentation,
// then tell everyone we are now low on memory.
boolean haveBg = false;
- int count = mLRUProcesses.size();
- int i;
- for (i=0; i<count; i++) {
- ProcessRecord rec = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord rec = mLruProcesses.get(i);
if (rec.thread != null && rec.setAdj >= HIDDEN_APP_MIN_ADJ) {
haveBg = true;
break;
@@ -4529,10 +4525,10 @@
if (!haveBg) {
Log.i(TAG, "Low Memory: No more background processes.");
- EventLog.writeEvent(EventLogTags.AM_LOW_MEMORY, mLRUProcesses.size());
+ EventLog.writeEvent(EventLogTags.AM_LOW_MEMORY, mLruProcesses.size());
long now = SystemClock.uptimeMillis();
- for (i=0; i<count; i++) {
- ProcessRecord rec = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord rec = mLruProcesses.get(i);
if (rec != app && rec.thread != null &&
(rec.lastLowMemory+GC_MIN_INTERVAL) <= now) {
// The low memory report is overriding any current
@@ -4552,148 +4548,147 @@
scheduleAppGcsLocked();
}
}
- } else if (Config.LOGD) {
+ } else if (DEBUG_PROCESSES) {
Log.d(TAG, "Received spurious death notification for thread "
+ thread.asBinder());
}
}
- final String readFile(String filename) {
- try {
- FileInputStream fs = new FileInputStream(filename);
- byte[] inp = new byte[8192];
- int size = fs.read(inp);
- fs.close();
- return new String(inp, 0, 0, size);
- } catch (java.io.IOException e) {
+ /**
+ * If a stack trace dump file is configured, dump process stack traces.
+ * @param pids of dalvik VM processes to dump stack traces for
+ * @return file containing stack traces, or null if no dump file is configured
+ */
+ private static File dumpStackTraces(ArrayList<Integer> pids) {
+ String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
+ if (tracesPath == null || tracesPath.length() == 0) {
+ return null;
}
- return "";
+
+ File tracesFile = new File(tracesPath);
+ try {
+ File tracesDir = tracesFile.getParentFile();
+ if (!tracesDir.exists()) tracesFile.mkdirs();
+ FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x
+
+ if (tracesFile.exists()) tracesFile.delete();
+ tracesFile.createNewFile();
+ FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
+ } catch (IOException e) {
+ Log.w(TAG, "Unable to prepare ANR traces file: " + tracesPath, e);
+ return null;
+ }
+
+ // Use a FileObserver to detect when traces finish writing.
+ // The order of traces is considered important to maintain for legibility.
+ FileObserver observer = new FileObserver(tracesPath, FileObserver.CLOSE_WRITE) {
+ public synchronized void onEvent(int event, String path) { notify(); }
+ };
+
+ try {
+ observer.startWatching();
+ int num = pids.size();
+ for (int i = 0; i < num; i++) {
+ synchronized (observer) {
+ Process.sendSignal(pids.get(i), Process.SIGNAL_QUIT);
+ observer.wait(200); // Wait for write-close, give up after 200msec
+ }
+ }
+ } catch (InterruptedException e) {
+ Log.wtf(TAG, e);
+ } finally {
+ observer.stopWatching();
+ }
+
+ return tracesFile;
}
- final void appNotRespondingLocked(ProcessRecord app, HistoryRecord activity,
- HistoryRecord reportedActivity, final String annotation) {
+ final void appNotRespondingLocked(ProcessRecord app, HistoryRecord activity,
+ HistoryRecord parent, final String annotation) {
if (app.notResponding || app.crashing) {
return;
}
-
+
// Log the ANR to the event log.
EventLog.writeEvent(EventLogTags.ANR, app.pid, app.processName, annotation);
-
- // If we are on a secure build and the application is not interesting to the user (it is
- // not visible or in the background), just kill it instead of displaying a dialog.
- boolean isSecure = "1".equals(SystemProperties.get(SYSTEM_SECURE, "0"));
- if (isSecure && !app.isInterestingToUserLocked() && Process.myPid() != app.pid) {
- Process.killProcess(app.pid);
- return;
- }
-
- // DeviceMonitor.start();
- String processInfo = null;
- if (MONITOR_CPU_USAGE) {
- updateCpuStatsNow();
- synchronized (mProcessStatsThread) {
- processInfo = mProcessStats.printCurrentState();
+ // Dump thread traces as quickly as we can, starting with "interesting" processes.
+ ArrayList<Integer> pids = new ArrayList<Integer>(20);
+ pids.add(app.pid);
+
+ int parentPid = app.pid;
+ if (parent != null && parent.app != null && parent.app.pid > 0) parentPid = parent.app.pid;
+ if (parentPid != app.pid) pids.add(parentPid);
+
+ if (MY_PID != app.pid && MY_PID != parentPid) pids.add(MY_PID);
+
+ for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
+ ProcessRecord r = mLruProcesses.get(i);
+ if (r != null && r.thread != null) {
+ int pid = r.pid;
+ if (pid > 0 && pid != app.pid && pid != parentPid && pid != MY_PID) pids.add(pid);
}
}
+ File tracesFile = dumpStackTraces(pids);
+
+ // Log the ANR to the main log.
StringBuilder info = mStringBuilder;
info.setLength(0);
- info.append("ANR in process: ");
- info.append(app.processName);
- if (reportedActivity != null && reportedActivity.app != null) {
- info.append(" (last in ");
- info.append(reportedActivity.app.processName);
- info.append(")");
+ info.append("ANR in ").append(app.processName);
+ if (activity != null && activity.shortComponentName != null) {
+ info.append(" (").append(activity.shortComponentName).append(")");
}
if (annotation != null) {
- info.append("\nAnnotation: ");
- info.append(annotation);
+ info.append("\nReason: ").append(annotation).append("\n");
}
- if (MONITOR_CPU_USAGE) {
- info.append("\nCPU usage:\n");
- info.append(processInfo);
+ if (parent != null && parent != activity) {
+ info.append("\nParent: ").append(parent.shortComponentName);
}
- Log.i(TAG, info.toString());
- // The application is not responding. Dump as many thread traces as we can.
- boolean fileDump = prepareTraceFile(true);
- if (!fileDump) {
- // Dumping traces to the log, just dump the process that isn't responding so
- // we don't overflow the log
- Process.sendSignal(app.pid, Process.SIGNAL_QUIT);
- } else {
- // Dumping traces to a file so dump all active processes we know about
- synchronized (this) {
- // First, these are the most important processes.
- final int[] imppids = new int[3];
- int i=0;
- imppids[0] = app.pid;
- i++;
- if (reportedActivity != null && reportedActivity.app != null
- && reportedActivity.app.thread != null
- && reportedActivity.app.pid != app.pid) {
- imppids[i] = reportedActivity.app.pid;
- i++;
- }
- imppids[i] = Process.myPid();
- for (i=0; i<imppids.length && imppids[i] != 0; i++) {
- Process.sendSignal(imppids[i], Process.SIGNAL_QUIT);
- synchronized (this) {
- try {
- wait(200);
- } catch (InterruptedException e) {
- }
- }
- }
- for (i = mLRUProcesses.size() - 1 ; i >= 0 ; i--) {
- ProcessRecord r = mLRUProcesses.get(i);
- boolean done = false;
- for (int j=0; j<imppids.length && imppids[j] != 0; j++) {
- if (imppids[j] == r.pid) {
- done = true;
- break;
- }
- }
- if (!done && r.thread != null) {
- Process.sendSignal(r.pid, Process.SIGNAL_QUIT);
- synchronized (this) {
- try {
- wait(200);
- } catch (InterruptedException e) {
- }
- }
- }
- }
- }
+ String cpuInfo = null;
+ if (MONITOR_CPU_USAGE) {
+ updateCpuStatsNow();
+ synchronized (mProcessStatsThread) { cpuInfo = mProcessStats.printCurrentState(); }
+ info.append(cpuInfo);
}
+ Log.e(TAG, info.toString());
+ if (tracesFile == null) {
+ // There is no trace file, so dump (only) the alleged culprit's threads to the log
+ Process.sendSignal(app.pid, Process.SIGNAL_QUIT);
+ }
+
+ addErrorToDropBox("anr", app, activity, parent, annotation, cpuInfo, tracesFile, null);
+
if (mController != null) {
try {
- int res = mController.appNotResponding(app.processName,
- app.pid, info.toString());
+ // 0 == show dialog, 1 = keep waiting, -1 = kill process immediately
+ int res = mController.appNotResponding(app.processName, app.pid, info.toString());
if (res != 0) {
- if (res < 0) {
- // wait until the SIGQUIT has had a chance to process before killing the
- // process.
- try {
- wait(2000);
- } catch (InterruptedException e) {
- }
-
- Process.killProcess(app.pid);
- return;
- }
+ if (res < 0 && app.pid != MY_PID) Process.killProcess(app.pid);
+ return;
}
} catch (RemoteException e) {
mController = null;
}
}
+ // Unless configured otherwise, swallow ANRs in background processes & kill the process.
+ boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+ if (!showBackground && !app.isInterestingToUserLocked() && app.pid != MY_PID) {
+ Process.killProcess(app.pid);
+ return;
+ }
+
+ // Set the app's notResponding state, and look up the errorReportReceiver
makeAppNotRespondingLocked(app,
activity != null ? activity.shortComponentName : null,
annotation != null ? "ANR " + annotation : "ANR",
info.toString());
+
+ // Bring up the infamous App Not Responding dialog
Message msg = Message.obtain();
HashMap map = new HashMap();
msg.what = SHOW_NOT_RESPONDING_MSG;
@@ -4707,53 +4702,6 @@
return;
}
- /**
- * If a stack trace file has been configured, prepare the filesystem
- * by creating the directory if it doesn't exist and optionally
- * removing the old trace file.
- *
- * @param removeExisting If set, the existing trace file will be removed.
- * @return Returns true if the trace file preparations succeeded
- */
- public static boolean prepareTraceFile(boolean removeExisting) {
- String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
- boolean fileReady = false;
- if (!TextUtils.isEmpty(tracesPath)) {
- File f = new File(tracesPath);
- if (!f.exists()) {
- // Ensure the enclosing directory exists
- File dir = f.getParentFile();
- if (!dir.exists()) {
- fileReady = dir.mkdirs();
- FileUtils.setPermissions(dir.getAbsolutePath(),
- FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH, -1, -1);
- } else if (dir.isDirectory()) {
- fileReady = true;
- }
- } else if (removeExisting) {
- // Remove the previous traces file, so we don't fill the disk.
- // The VM will recreate it
- Log.i(TAG, "Removing old ANR trace file from " + tracesPath);
- fileReady = f.delete();
- }
-
- if (removeExisting) {
- try {
- f.createNewFile();
- FileUtils.setPermissions(f.getAbsolutePath(),
- FileUtils.S_IRWXU | FileUtils.S_IRWXG
- | FileUtils.S_IWOTH | FileUtils.S_IROTH, -1, -1);
- fileReady = true;
- } catch (IOException e) {
- Log.w(TAG, "Unable to make ANR traces file", e);
- }
- }
- }
-
- return fileReady;
- }
-
-
private final void decPersistentCountLocked(ProcessRecord app)
{
app.persistentActivities--;
@@ -4854,7 +4802,7 @@
android.Manifest.permission.CLEAR_APP_USER_DATA,
pid, uid, -1)
== PackageManager.PERMISSION_GRANTED) {
- restartPackageLocked(packageName, pkgUid);
+ forceStopPackageLocked(packageName, pkgUid);
} else {
throw new SecurityException(pid+" does not have permission:"+
android.Manifest.permission.CLEAR_APP_USER_DATA+" to clear data" +
@@ -4879,13 +4827,15 @@
return true;
}
- public void restartPackage(final String packageName) {
- if (checkCallingPermission(android.Manifest.permission.RESTART_PACKAGES)
- != PackageManager.PERMISSION_GRANTED) {
- String msg = "Permission Denial: restartPackage() from pid="
+ public void killBackgroundProcesses(final String packageName) {
+ if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
+ != PackageManager.PERMISSION_GRANTED &&
+ checkCallingPermission(android.Manifest.permission.RESTART_PACKAGES)
+ != PackageManager.PERMISSION_GRANTED) {
+ String msg = "Permission Denial: killBackgroundProcesses() from pid="
+ Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid()
- + " requires " + android.Manifest.permission.RESTART_PACKAGES;
+ + " requires " + android.Manifest.permission.KILL_BACKGROUND_PROCESSES;
Log.w(TAG, msg);
throw new SecurityException(msg);
}
@@ -4903,7 +4853,39 @@
Log.w(TAG, "Invalid packageName: " + packageName);
return;
}
- restartPackageLocked(packageName, pkgUid);
+ killPackageProcessesLocked(packageName, pkgUid,
+ SECONDARY_SERVER_ADJ, false);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ public void forceStopPackage(final String packageName) {
+ if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
+ != PackageManager.PERMISSION_GRANTED) {
+ String msg = "Permission Denial: forceStopPackage() from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid()
+ + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
+ Log.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+
+ long callingId = Binder.clearCallingIdentity();
+ try {
+ IPackageManager pm = ActivityThread.getPackageManager();
+ int pkgUid = -1;
+ synchronized(this) {
+ try {
+ pkgUid = pm.getPackageUid(packageName);
+ } catch (RemoteException e) {
+ }
+ if (pkgUid == -1) {
+ Log.w(TAG, "Invalid packageName: " + packageName);
+ return;
+ }
+ forceStopPackageLocked(packageName, pkgUid);
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -5013,8 +4995,8 @@
}
}
- private void restartPackageLocked(final String packageName, int uid) {
- uninstallPackageLocked(packageName, uid, false);
+ private void forceStopPackageLocked(final String packageName, int uid) {
+ forceStopPackageLocked(packageName, uid, false);
Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED,
Uri.fromParts("package", packageName, null));
intent.putExtra(Intent.EXTRA_UID, uid);
@@ -5023,13 +5005,41 @@
false, false, MY_PID, Process.SYSTEM_UID);
}
- private final void uninstallPackageLocked(String name, int uid,
- boolean callerWillRestart) {
- if (Config.LOGD) Log.d(TAG, "Uninstalling process " + name);
+ private final void killPackageProcessesLocked(String packageName, int uid,
+ int minOomAdj, boolean callerWillRestart) {
+ ArrayList<ProcessRecord> procs = new ArrayList<ProcessRecord>();
+ // Remove all processes this package may have touched: all with the
+ // same UID (except for the system or root user), and all whose name
+ // matches the package name.
+ final String procNamePrefix = packageName + ":";
+ for (SparseArray<ProcessRecord> apps : mProcessNames.getMap().values()) {
+ final int NA = apps.size();
+ for (int ia=0; ia<NA; ia++) {
+ ProcessRecord app = apps.valueAt(ia);
+ if (app.removed) {
+ procs.add(app);
+ } else if ((uid > 0 && uid != Process.SYSTEM_UID && app.info.uid == uid)
+ || app.processName.equals(packageName)
+ || app.processName.startsWith(procNamePrefix)) {
+ if (app.setAdj >= minOomAdj) {
+ app.removed = true;
+ procs.add(app);
+ }
+ }
+ }
+ }
+
+ int N = procs.size();
+ for (int i=0; i<N; i++) {
+ removeProcessLocked(procs.get(i), callerWillRestart);
+ }
+ }
+
+ private final void forceStopPackageLocked(String name, int uid,
+ boolean callerWillRestart) {
int i, N;
- final String procNamePrefix = name + ":";
if (uid < 0) {
try {
uid = ActivityThread.getPackageManager().getPackageUid(name);
@@ -5037,6 +5047,8 @@
}
}
+ Log.i(TAG, "Force stopping package " + name + " uid=" + uid);
+
Iterator<SparseArray<Long>> badApps = mProcessCrashTimes.getMap().values().iterator();
while (badApps.hasNext()) {
SparseArray<Long> ba = badApps.next();
@@ -5045,37 +5057,12 @@
}
}
- ArrayList<ProcessRecord> procs = new ArrayList<ProcessRecord>();
-
- // Remove all processes this package may have touched: all with the
- // same UID (except for the system or root user), and all whose name
- // matches the package name.
- for (SparseArray<ProcessRecord> apps : mProcessNames.getMap().values()) {
- final int NA = apps.size();
- for (int ia=0; ia<NA; ia++) {
- ProcessRecord app = apps.valueAt(ia);
- if (app.removed) {
- procs.add(app);
- } else if ((uid > 0 && uid != Process.SYSTEM_UID && app.info.uid == uid)
- || app.processName.equals(name)
- || app.processName.startsWith(procNamePrefix)) {
- app.removed = true;
- procs.add(app);
- }
- }
- }
-
- N = procs.size();
- for (i=0; i<N; i++) {
- removeProcessLocked(procs.get(i), callerWillRestart);
- }
+ killPackageProcessesLocked(name, uid, -100, callerWillRestart);
for (i=mHistory.size()-1; i>=0; i--) {
HistoryRecord r = (HistoryRecord)mHistory.get(i);
if (r.packageName.equals(name)) {
- if (Config.LOGD) Log.d(
- TAG, " Force finishing activity "
- + r.intent.getComponent().flattenToShortString());
+ Log.i(TAG, " Force finishing activity " + r);
if (r.app != null) {
r.app.removed = true;
}
@@ -5087,6 +5074,7 @@
ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>();
for (ServiceRecord service : mServices.values()) {
if (service.packageName.equals(name)) {
+ Log.i(TAG, " Force stopping service " + service);
if (service.app != null) {
service.app.removed = true;
}
@@ -5106,7 +5094,7 @@
private final boolean removeProcessLocked(ProcessRecord app, boolean callerWillRestart) {
final String name = app.processName;
final int uid = app.info.uid;
- if (Config.LOGD) Log.d(
+ if (DEBUG_PROCESSES) Log.d(
TAG, "Force removing process " + app + " (" + name
+ "/" + uid + ")");
@@ -5119,7 +5107,7 @@
mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
}
handleAppDiedLocked(app, true);
- mLRUProcesses.remove(app);
+ mLruProcesses.remove(app);
Process.killProcess(pid);
if (app.persistent) {
@@ -5297,7 +5285,7 @@
app.instrumentationArguments, app.instrumentationWatcher, testMode,
isRestrictedBackupMode || !normalMode,
mConfiguration, getCommonServicesLocked());
- updateLRUListLocked(app, false);
+ updateLruProcessLocked(app, false, true);
app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
} catch (Exception e) {
// todo: Yikes! What should we do? For now we will try to
@@ -7841,7 +7829,7 @@
if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
- updateLRUListLocked(app, true);
+ updateLruProcessLocked(app, true, true);
}
if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
@@ -7863,7 +7851,7 @@
synchronized(this) {
int count = mHistory.size();
- if (Config.LOGD) Log.d(
+ if (DEBUG_SWITCH) Log.d(
TAG, "Performing unhandledBack(): stack size = " + count);
if (count > 1) {
final long origId = Binder.clearCallingIdentity();
@@ -8064,7 +8052,7 @@
mDebugTransient = !persistent;
if (packageName != null) {
final long origId = Binder.clearCallingIdentity();
- uninstallPackageLocked(packageName, -1, false);
+ forceStopPackageLocked(packageName, -1, false);
Binder.restoreCallingIdentity(origId);
}
}
@@ -8218,8 +8206,8 @@
synchronized (this) {
mRequestPssCallback = completeCallback;
mRequestPssList.clear();
- for (int i=mLRUProcesses.size()-1; i>=0; i--) {
- ProcessRecord proc = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord proc = mLruProcesses.get(i);
if (!proc.persistent) {
mRequestPssList.add(proc);
}
@@ -8279,8 +8267,8 @@
i++;
}
- for (i=mLRUProcesses.size()-1; i>=0; i--) {
- ProcessRecord proc = mLRUProcesses.get(i);
+ for (i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord proc = mLruProcesses.get(i);
if (proc.persistent) {
continue;
}
@@ -8289,15 +8277,14 @@
stats.mNoPssCount++;
continue;
}
- if (proc.setAdj == EMPTY_APP_ADJ) {
- stats.mEmptyPss += proc.lastPss;
- stats.mEmptyCount++;
- } else if (proc.setAdj == CONTENT_PROVIDER_ADJ) {
- stats.mEmptyPss += proc.lastPss;
- stats.mEmptyCount++;
- } else if (proc.setAdj >= HIDDEN_APP_MIN_ADJ) {
- stats.mBackgroundPss += proc.lastPss;
- stats.mBackgroundCount++;
+ if (proc.setAdj >= HIDDEN_APP_MIN_ADJ) {
+ if (proc.empty) {
+ stats.mEmptyPss += proc.lastPss;
+ stats.mEmptyCount++;
+ } else {
+ stats.mBackgroundPss += proc.lastPss;
+ stats.mBackgroundCount++;
+ }
} else if (proc.setAdj >= VISIBLE_APP_ADJ) {
stats.mVisiblePss += proc.lastPss;
stats.mVisibleCount++;
@@ -8533,20 +8520,19 @@
}
private boolean makeAppCrashingLocked(ProcessRecord app,
- String tag, String shortMsg, String longMsg, String stackTrace) {
+ String shortMsg, String longMsg, String stackTrace) {
app.crashing = true;
app.crashingReport = generateProcessError(app,
- ActivityManager.ProcessErrorStateInfo.CRASHED, tag, shortMsg, longMsg,
- stackTrace);
+ ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
startAppProblemLocked(app);
app.stopFreezingAllLocked();
return handleAppCrashLocked(app);
}
private ComponentName getErrorReportReceiver(ProcessRecord app) {
- // check if error reporting is enabled in Gservices
- int enabled = Settings.Gservices.getInt(mContext.getContentResolver(),
- Settings.Gservices.SEND_ACTION_APP_ERROR, 0);
+ // check if error reporting is enabled in secure settings
+ int enabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.SEND_ACTION_APP_ERROR, 0);
if (enabled == 0) {
return null;
}
@@ -8611,10 +8597,11 @@
}
private void makeAppNotRespondingLocked(ProcessRecord app,
- String tag, String shortMsg, String longMsg) {
+ String activity, String shortMsg, String longMsg) {
app.notResponding = true;
app.notRespondingReport = generateProcessError(app,
- ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING, tag, shortMsg, longMsg, null);
+ ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING,
+ activity, shortMsg, longMsg, null);
startAppProblemLocked(app);
app.stopFreezingAllLocked();
}
@@ -8625,7 +8612,7 @@
* @param app The ProcessRecord in which the error occurred.
* @param condition Crashing, Application Not Responding, etc. Values are defined in
* ActivityManager.AppErrorStateInfo
- * @param tag The tag that was passed into handleApplicationError(). Typically the classname.
+ * @param activity The activity associated with the crash, if known.
* @param shortMsg Short message describing the crash.
* @param longMsg Long message describing the crash.
* @param stackTrace Full crash stack trace, may be null.
@@ -8633,14 +8620,14 @@
* @return Returns a fully-formed AppErrorStateInfo record.
*/
private ActivityManager.ProcessErrorStateInfo generateProcessError(ProcessRecord app,
- int condition, String tag, String shortMsg, String longMsg, String stackTrace) {
+ int condition, String activity, String shortMsg, String longMsg, String stackTrace) {
ActivityManager.ProcessErrorStateInfo report = new ActivityManager.ProcessErrorStateInfo();
report.condition = condition;
report.processName = app.processName;
report.pid = app.pid;
report.uid = app.info.uid;
- report.tag = tag;
+ report.tag = activity;
report.shortMsg = shortMsg;
report.longMsg = longMsg;
report.stackTrace = stackTrace;
@@ -8648,8 +8635,7 @@
return report;
}
- void killAppAtUsersRequest(ProcessRecord app, Dialog fromDialog,
- boolean crashed) {
+ void killAppAtUsersRequest(ProcessRecord app, Dialog fromDialog) {
synchronized (this) {
app.crashing = false;
app.crashingReport = null;
@@ -8662,18 +8648,15 @@
app.waitDialog = null;
}
if (app.pid > 0 && app.pid != MY_PID) {
- if (crashed) {
- handleAppCrashLocked(app);
- }
+ handleAppCrashLocked(app);
Log.i(ActivityManagerService.TAG, "Killing process "
+ app.processName
+ " (pid=" + app.pid + ") at user's request");
Process.killProcess(app.pid);
}
-
}
}
-
+
private boolean handleAppCrashLocked(ProcessRecord app) {
long now = SystemClock.uptimeMillis();
@@ -8689,8 +8672,7 @@
for (int i=mHistory.size()-1; i>=0; i--) {
HistoryRecord r = (HistoryRecord)mHistory.get(i);
if (r.app == app) {
- if (Config.LOGD) Log.d(
- TAG, " Force finishing activity "
+ Log.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
finishActivityLocked(r, i, Activity.RESULT_CANCELED, null, "crashed");
}
@@ -8757,10 +8739,149 @@
}
}
- public void handleApplicationError(IBinder app, String tag,
+ /**
+ * Used by {@link com.android.internal.os.RuntimeInit} to report when an application crashes.
+ * The application process will exit immediately after this call returns.
+ * @param app object of the crashing app, null for the system server
+ * @param crashInfo describing the exception
+ */
+ public void handleApplicationCrash(IBinder app, ApplicationErrorReport.CrashInfo crashInfo) {
+ ProcessRecord r = findAppProcess(app);
+
+ EventLog.writeEvent(EventLogTags.AM_CRASH, Binder.getCallingPid(),
+ app == null ? "system" : (r == null ? "unknown" : r.processName),
+ crashInfo.exceptionClassName,
+ crashInfo.exceptionMessage,
+ crashInfo.throwFileName,
+ crashInfo.throwLineNumber);
+
+ addErrorToDropBox("crash", r, null, null, null, null, null, crashInfo);
+
+ crashApplication(r, crashInfo);
+ }
+
+ /**
+ * Used by {@link Log} via {@link com.android.internal.os.RuntimeInit} to report serious errors.
+ * @param app object of the crashing app, null for the system server
+ * @param tag reported by the caller
+ * @param crashInfo describing the context of the error
+ * @return true if the process should exit immediately (WTF is fatal)
+ */
+ public boolean handleApplicationWtf(IBinder app, String tag,
ApplicationErrorReport.CrashInfo crashInfo) {
- AppErrorResult result = new AppErrorResult();
- ProcessRecord r = null;
+ ProcessRecord r = findAppProcess(app);
+
+ EventLog.writeEvent(EventLogTags.AM_WTF, Binder.getCallingPid(),
+ app == null ? "system" : (r == null ? "unknown" : r.processName),
+ tag, crashInfo.exceptionMessage);
+
+ addErrorToDropBox("wtf", r, null, null, tag, null, null, crashInfo);
+
+ if (Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.WTF_IS_FATAL, 0) != 0) {
+ crashApplication(r, crashInfo);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param app object of some object (as stored in {@link com.android.internal.os.RuntimeInit})
+ * @return the corresponding {@link ProcessRecord} object, or null if none could be found
+ */
+ private ProcessRecord findAppProcess(IBinder app) {
+ if (app == null) {
+ return null;
+ }
+
+ synchronized (this) {
+ for (SparseArray<ProcessRecord> apps : mProcessNames.getMap().values()) {
+ final int NA = apps.size();
+ for (int ia=0; ia<NA; ia++) {
+ ProcessRecord p = apps.valueAt(ia);
+ if (p.thread != null && p.thread.asBinder() == app) {
+ return p;
+ }
+ }
+ }
+
+ Log.w(TAG, "Can't find mystery application: " + app);
+ return null;
+ }
+ }
+
+ /**
+ * Write a description of an error (crash, WTF, ANR) to the drop box.
+ * @param eventType to include in the drop box tag ("crash", "wtf", etc.)
+ * @param process which caused the error, null means the system server
+ * @param activity which triggered the error, null if unknown
+ * @param parent activity related to the error, null if unknown
+ * @param subject line related to the error, null if absent
+ * @param report in long form describing the error, null if absent
+ * @param logFile to include in the report, null if none
+ * @param crashInfo giving an application stack trace, null if absent
+ */
+ private void addErrorToDropBox(String eventType,
+ ProcessRecord process, HistoryRecord activity, HistoryRecord parent,
+ String subject, String report, File logFile,
+ ApplicationErrorReport.CrashInfo crashInfo) {
+ String dropboxTag;
+ if (process == null || process.pid == MY_PID) {
+ dropboxTag = "system_server_" + eventType;
+ } else if ((process.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ dropboxTag = "system_app_" + eventType;
+ } else {
+ dropboxTag = "data_app_" + eventType;
+ }
+
+ DropBoxManager dbox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
+ if (dbox != null && dbox.isTagEnabled(dropboxTag)) {
+ StringBuilder sb = new StringBuilder(1024);
+ if (process == null || process.pid == MY_PID) {
+ sb.append("Process: system_server\n");
+ } else {
+ sb.append("Process: ").append(process.processName).append("\n");
+ }
+ if (activity != null) {
+ sb.append("Activity: ").append(activity.shortComponentName).append("\n");
+ }
+ if (parent != null && parent.app != null && parent.app.pid != process.pid) {
+ sb.append("Parent-Process: ").append(parent.app.processName).append("\n");
+ }
+ if (parent != null && parent != activity) {
+ sb.append("Parent-Activity: ").append(parent.shortComponentName).append("\n");
+ }
+ if (subject != null) {
+ sb.append("Subject: ").append(subject).append("\n");
+ }
+ sb.append("Build: ").append(Build.FINGERPRINT).append("\n");
+ sb.append("\n");
+ if (report != null) {
+ sb.append(report);
+ }
+ if (logFile != null) {
+ try {
+ sb.append(FileUtils.readTextFile(logFile, 128 * 1024, "\n\n[[TRUNCATED]]"));
+ } catch (IOException e) {
+ Log.e(TAG, "Error reading " + logFile, e);
+ }
+ }
+ if (crashInfo != null && crashInfo.stackTrace != null) {
+ sb.append(crashInfo.stackTrace);
+ }
+ dbox.addText(dropboxTag, sb.toString());
+ }
+ }
+
+ /**
+ * Bring up the "unexpected error" dialog box for a crashing app.
+ * Deal with edge cases (intercepts from instrumented applications,
+ * ActivityController, error intent receivers, that sort of thing).
+ * @param r the application crashing
+ * @param crashInfo describing the failure
+ */
+ private void crashApplication(ProcessRecord r, ApplicationErrorReport.CrashInfo crashInfo) {
long timeMillis = System.currentTimeMillis();
String shortMsg = crashInfo.exceptionClassName;
String longMsg = crashInfo.exceptionMessage;
@@ -8771,33 +8892,13 @@
longMsg = shortMsg;
}
+ AppErrorResult result = new AppErrorResult();
synchronized (this) {
- if (app != null) {
- for (SparseArray<ProcessRecord> apps : mProcessNames.getMap().values()) {
- final int NA = apps.size();
- for (int ia=0; ia<NA; ia++) {
- ProcessRecord p = apps.valueAt(ia);
- if (p.thread != null && p.thread.asBinder() == app) {
- r = p;
- break;
- }
- }
- }
- }
-
- if (r != null) {
- // The application has crashed. Send the SIGQUIT to the process so
- // that it can dump its state.
- Process.sendSignal(r.pid, Process.SIGNAL_QUIT);
- //Log.i(TAG, "Current system threads:");
- //Process.sendSignal(MY_PID, Process.SIGNAL_QUIT);
- }
-
if (mController != null) {
try {
String name = r != null ? r.processName : null;
int pid = r != null ? r.pid : Binder.getCallingPid();
- if (!mController.appCrashed(name, pid, tag,
+ if (!mController.appCrashed(name, pid,
shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
Log.w(TAG, "Force-killing crashed app " + name
+ " at watcher's request");
@@ -8825,15 +8926,9 @@
return;
}
- if (r != null) {
- if (!makeAppCrashingLocked(r, tag, shortMsg, longMsg, stackTrace)) {
- return;
- }
- } else {
- Log.w(TAG, "Some application object " + app + " tag " + tag
- + " has crashed, but I don't know who it is.");
- Log.w(TAG, "ShortMsg:" + shortMsg);
- Log.w(TAG, "LongMsg:" + longMsg);
+ // If we can't identify the process or it's already exceeded its crash quota,
+ // quit right away without showing a crash dialog.
+ if (r == null || !makeAppCrashingLocked(r, shortMsg, longMsg, stackTrace)) {
Binder.restoreCallingIdentity(origId);
return;
}
@@ -8922,9 +9017,8 @@
synchronized (this) {
// iterate across all processes
- final int N = mLRUProcesses.size();
- for (int i = 0; i < N; i++) {
- ProcessRecord app = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord app = mLruProcesses.get(i);
if ((app.thread != null) && (app.crashing || app.notResponding)) {
// This one's in trouble, so we'll generate a report for it
// crashes are higher priority (in case there's a crash *and* an anr)
@@ -8957,9 +9051,8 @@
List<ActivityManager.RunningAppProcessInfo> runList = null;
synchronized (this) {
// Iterate across all processes
- final int N = mLRUProcesses.size();
- for (int i = 0; i < N; i++) {
- ProcessRecord app = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord app = mLruProcesses.get(i);
if ((app.thread != null) && (!app.crashing && !app.notResponding)) {
// Generate process state info for running application
ActivityManager.RunningAppProcessInfo currApp =
@@ -8967,7 +9060,7 @@
app.pid, app.getPackageList());
currApp.uid = app.info.uid;
int adj = app.curAdj;
- if (adj >= CONTENT_PROVIDER_ADJ) {
+ if (adj >= EMPTY_APP_ADJ) {
currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_EMPTY;
} else if (adj >= HIDDEN_APP_MIN_ADJ) {
currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
@@ -9006,69 +9099,190 @@
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- synchronized (this) {
- if (checkCallingPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ActivityManager from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " without permission "
- + android.Manifest.permission.DUMP);
+ if (checkCallingPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump ActivityManager from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid()
+ + " without permission "
+ + android.Manifest.permission.DUMP);
+ return;
+ }
+
+ boolean dumpAll = false;
+
+ int opti = 0;
+ while (opti < args.length) {
+ String opt = args[opti];
+ if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {
+ break;
+ }
+ opti++;
+ if ("-a".equals(opt)) {
+ dumpAll = true;
+ } else if ("-h".equals(opt)) {
+ pw.println("Activity manager dump options:");
+ pw.println(" [-a] [h- [cmd] ...");
+ pw.println(" cmd may be one of:");
+ pw.println(" activities: activity stack state");
+ pw.println(" broadcasts: broadcast state");
+ pw.println(" intents: pending intent state");
+ pw.println(" processes: process state");
+ pw.println(" providers: content provider state");
+ pw.println(" services: service state");
+ pw.println(" service [name]: service client-side state");
return;
+ } else {
+ pw.println("Unknown argument: " + opt + "; use -h for help");
}
- if (args.length != 0 && "service".equals(args[0])) {
- dumpService(fd, pw, args);
- return;
- }
- pw.println("Activities in Current Activity Manager State:");
- dumpHistoryList(pw, mHistory, " ", "Hist", true);
- pw.println(" ");
- pw.println(" Running activities (most recent first):");
- dumpHistoryList(pw, mLRUActivities, " ", "Run", false);
- if (mWaitingVisibleActivities.size() > 0) {
- pw.println(" ");
- pw.println(" Activities waiting for another to become visible:");
- dumpHistoryList(pw, mWaitingVisibleActivities, " ", "Wait", false);
- }
- if (mStoppingActivities.size() > 0) {
- pw.println(" ");
- pw.println(" Activities waiting to stop:");
- dumpHistoryList(pw, mStoppingActivities, " ", "Stop", false);
- }
- if (mFinishingActivities.size() > 0) {
- pw.println(" ");
- pw.println(" Activities waiting to finish:");
- dumpHistoryList(pw, mFinishingActivities, " ", "Fin", false);
- }
-
- pw.println(" ");
- pw.println(" mPausingActivity: " + mPausingActivity);
- pw.println(" mResumedActivity: " + mResumedActivity);
- pw.println(" mFocusedActivity: " + mFocusedActivity);
- pw.println(" mLastPausedActivity: " + mLastPausedActivity);
-
- if (mRecentTasks.size() > 0) {
- pw.println(" ");
- pw.println("Recent tasks in Current Activity Manager State:");
-
- final int N = mRecentTasks.size();
- for (int i=0; i<N; i++) {
- TaskRecord tr = mRecentTasks.get(i);
- pw.print(" * Recent #"); pw.print(i); pw.print(": ");
- pw.println(tr);
- mRecentTasks.get(i).dump(pw, " ");
+ }
+
+ // Is the caller requesting to dump a particular piece of data?
+ if (opti < args.length) {
+ String cmd = args[opti];
+ opti++;
+ if ("activities".equals(cmd) || "a".equals(cmd)) {
+ synchronized (this) {
+ dumpActivitiesLocked(fd, pw, args, opti, true, true);
}
+ return;
+ } else if ("broadcasts".equals(cmd) || "b".equals(cmd)) {
+ synchronized (this) {
+ dumpBroadcastsLocked(fd, pw, args, opti, true);
+ }
+ return;
+ } else if ("intents".equals(cmd) || "i".equals(cmd)) {
+ synchronized (this) {
+ dumpPendingIntentsLocked(fd, pw, args, opti, true);
+ }
+ return;
+ } else if ("processes".equals(cmd) || "p".equals(cmd)) {
+ synchronized (this) {
+ dumpProcessesLocked(fd, pw, args, opti, true);
+ }
+ return;
+ } else if ("providers".equals(cmd) || "prov".equals(cmd)) {
+ synchronized (this) {
+ dumpProvidersLocked(fd, pw, args, opti, true);
+ }
+ return;
+ } else if ("service".equals(cmd)) {
+ dumpService(fd, pw, args, opti, true);
+ return;
+ } else if ("services".equals(cmd) || "s".equals(cmd)) {
+ synchronized (this) {
+ dumpServicesLocked(fd, pw, args, opti, true);
+ }
+ return;
}
-
+ }
+
+ // No piece of data specified, dump everything.
+ synchronized (this) {
+ boolean needSep;
+ if (dumpAll) {
+ pw.println("Providers in Current Activity Manager State:");
+ }
+ needSep = dumpProvidersLocked(fd, pw, args, opti, dumpAll);
+ if (needSep) {
+ pw.println(" ");
+ }
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ pw.println("Broadcasts in Current Activity Manager State:");
+ }
+ needSep = dumpBroadcastsLocked(fd, pw, args, opti, dumpAll);
+ if (needSep) {
+ pw.println(" ");
+ }
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ pw.println("Services in Current Activity Manager State:");
+ }
+ needSep = dumpServicesLocked(fd, pw, args, opti, dumpAll);
+ if (needSep) {
+ pw.println(" ");
+ }
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ pw.println("PendingIntents in Current Activity Manager State:");
+ }
+ needSep = dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll);
+ if (needSep) {
+ pw.println(" ");
+ }
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ pw.println("Activities in Current Activity Manager State:");
+ }
+ needSep = dumpActivitiesLocked(fd, pw, args, opti, dumpAll, !dumpAll);
+ if (needSep) {
+ pw.println(" ");
+ }
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ pw.println("Processes in Current Activity Manager State:");
+ }
+ dumpProcessesLocked(fd, pw, args, opti, dumpAll);
+ }
+ }
+
+ boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, boolean needHeader) {
+ if (needHeader) {
+ pw.println(" Activity stack:");
+ }
+ dumpHistoryList(pw, mHistory, " ", "Hist", true);
+ pw.println(" ");
+ pw.println(" Running activities (most recent first):");
+ dumpHistoryList(pw, mLRUActivities, " ", "Run", false);
+ if (mWaitingVisibleActivities.size() > 0) {
pw.println(" ");
- pw.println(" mCurTask: " + mCurTask);
-
+ pw.println(" Activities waiting for another to become visible:");
+ dumpHistoryList(pw, mWaitingVisibleActivities, " ", "Wait", false);
+ }
+ if (mStoppingActivities.size() > 0) {
pw.println(" ");
- pw.println("Processes in Current Activity Manager State:");
+ pw.println(" Activities waiting to stop:");
+ dumpHistoryList(pw, mStoppingActivities, " ", "Stop", false);
+ }
+ if (mFinishingActivities.size() > 0) {
+ pw.println(" ");
+ pw.println(" Activities waiting to finish:");
+ dumpHistoryList(pw, mFinishingActivities, " ", "Fin", false);
+ }
- boolean needSep = false;
- int numPers = 0;
+ pw.println(" ");
+ pw.println(" mPausingActivity: " + mPausingActivity);
+ pw.println(" mResumedActivity: " + mResumedActivity);
+ pw.println(" mFocusedActivity: " + mFocusedActivity);
+ pw.println(" mLastPausedActivity: " + mLastPausedActivity);
+ if (dumpAll && mRecentTasks.size() > 0) {
+ pw.println(" ");
+ pw.println("Recent tasks in Current Activity Manager State:");
+
+ final int N = mRecentTasks.size();
+ for (int i=0; i<N; i++) {
+ TaskRecord tr = mRecentTasks.get(i);
+ pw.print(" * Recent #"); pw.print(i); pw.print(": ");
+ pw.println(tr);
+ mRecentTasks.get(i).dump(pw, " ");
+ }
+ }
+
+ pw.println(" ");
+ pw.println(" mCurTask: " + mCurTask);
+
+ return true;
+ }
+
+ boolean dumpProcessesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
+ boolean needSep = false;
+ int numPers = 0;
+
+ if (dumpAll) {
for (SparseArray<ProcessRecord> procs : mProcessNames.getMap().values()) {
final int NA = procs.size();
for (int ia=0; ia<NA; ia++) {
@@ -9086,142 +9300,151 @@
}
}
}
-
- if (mLRUProcesses.size() > 0) {
+ }
+
+ if (mLruProcesses.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Running processes (most recent first):");
+ dumpProcessList(pw, this, mLruProcesses, " ",
+ "App ", "PERS", true);
+ needSep = true;
+ }
+
+ synchronized (mPidsSelfLocked) {
+ if (mPidsSelfLocked.size() > 0) {
if (needSep) pw.println(" ");
needSep = true;
- pw.println(" Running processes (most recent first):");
- dumpProcessList(pw, this, mLRUProcesses, " ",
- "App ", "PERS", true);
- needSep = true;
- }
-
- synchronized (mPidsSelfLocked) {
- if (mPidsSelfLocked.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" PID mappings:");
- for (int i=0; i<mPidsSelfLocked.size(); i++) {
- pw.print(" PID #"); pw.print(mPidsSelfLocked.keyAt(i));
- pw.print(": "); pw.println(mPidsSelfLocked.valueAt(i));
- }
+ pw.println(" PID mappings:");
+ for (int i=0; i<mPidsSelfLocked.size(); i++) {
+ pw.print(" PID #"); pw.print(mPidsSelfLocked.keyAt(i));
+ pw.print(": "); pw.println(mPidsSelfLocked.valueAt(i));
}
}
-
- if (mForegroundProcesses.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Foreground Processes:");
- for (int i=0; i<mForegroundProcesses.size(); i++) {
- pw.print(" PID #"); pw.print(mForegroundProcesses.keyAt(i));
- pw.print(": "); pw.println(mForegroundProcesses.valueAt(i));
- }
+ }
+
+ if (mForegroundProcesses.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Foreground Processes:");
+ for (int i=0; i<mForegroundProcesses.size(); i++) {
+ pw.print(" PID #"); pw.print(mForegroundProcesses.keyAt(i));
+ pw.print(": "); pw.println(mForegroundProcesses.valueAt(i));
}
-
- if (mPersistentStartingProcesses.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Persisent processes that are starting:");
- dumpProcessList(pw, this, mPersistentStartingProcesses, " ",
- "Starting Norm", "Restarting PERS", false);
- }
+ }
+
+ if (mPersistentStartingProcesses.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Persisent processes that are starting:");
+ dumpProcessList(pw, this, mPersistentStartingProcesses, " ",
+ "Starting Norm", "Restarting PERS", false);
+ }
- if (mStartingProcesses.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Processes that are starting:");
- dumpProcessList(pw, this, mStartingProcesses, " ",
- "Starting Norm", "Starting PERS", false);
- }
+ if (mStartingProcesses.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Processes that are starting:");
+ dumpProcessList(pw, this, mStartingProcesses, " ",
+ "Starting Norm", "Starting PERS", false);
+ }
- if (mRemovedProcesses.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Processes that are being removed:");
- dumpProcessList(pw, this, mRemovedProcesses, " ",
- "Removed Norm", "Removed PERS", false);
- }
-
- if (mProcessesOnHold.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Processes that are on old until the system is ready:");
- dumpProcessList(pw, this, mProcessesOnHold, " ",
- "OnHold Norm", "OnHold PERS", false);
- }
+ if (mRemovedProcesses.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Processes that are being removed:");
+ dumpProcessList(pw, this, mRemovedProcesses, " ",
+ "Removed Norm", "Removed PERS", false);
+ }
+
+ if (mProcessesOnHold.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Processes that are on old until the system is ready:");
+ dumpProcessList(pw, this, mProcessesOnHold, " ",
+ "OnHold Norm", "OnHold PERS", false);
+ }
- if (mProcessesToGc.size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Processes that are waiting to GC:");
- long now = SystemClock.uptimeMillis();
- for (int i=0; i<mProcessesToGc.size(); i++) {
- ProcessRecord proc = mProcessesToGc.get(i);
- pw.print(" Process "); pw.println(proc);
- pw.print(" lowMem="); pw.print(proc.reportLowMemory);
- pw.print(", last gced=");
- pw.print(now-proc.lastRequestedGc);
- pw.print(" ms ago, last lowMem=");
- pw.print(now-proc.lastLowMemory);
+ if (mProcessesToGc.size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Processes that are waiting to GC:");
+ long now = SystemClock.uptimeMillis();
+ for (int i=0; i<mProcessesToGc.size(); i++) {
+ ProcessRecord proc = mProcessesToGc.get(i);
+ pw.print(" Process "); pw.println(proc);
+ pw.print(" lowMem="); pw.print(proc.reportLowMemory);
+ pw.print(", last gced=");
+ pw.print(now-proc.lastRequestedGc);
+ pw.print(" ms ago, last lowMem=");
+ pw.print(now-proc.lastLowMemory);
+ pw.println(" ms ago");
+
+ }
+ }
+
+ if (mProcessCrashTimes.getMap().size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Time since processes crashed:");
+ long now = SystemClock.uptimeMillis();
+ for (Map.Entry<String, SparseArray<Long>> procs
+ : mProcessCrashTimes.getMap().entrySet()) {
+ SparseArray<Long> uids = procs.getValue();
+ final int N = uids.size();
+ for (int i=0; i<N; i++) {
+ pw.print(" Process "); pw.print(procs.getKey());
+ pw.print(" uid "); pw.print(uids.keyAt(i));
+ pw.print(": last crashed ");
+ pw.print((now-uids.valueAt(i)));
pw.println(" ms ago");
-
}
}
-
- if (mProcessCrashTimes.getMap().size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Time since processes crashed:");
- long now = SystemClock.uptimeMillis();
- for (Map.Entry<String, SparseArray<Long>> procs
- : mProcessCrashTimes.getMap().entrySet()) {
- SparseArray<Long> uids = procs.getValue();
- final int N = uids.size();
- for (int i=0; i<N; i++) {
- pw.print(" Process "); pw.print(procs.getKey());
- pw.print(" uid "); pw.print(uids.keyAt(i));
- pw.print(": last crashed ");
- pw.print((now-uids.valueAt(i)));
- pw.println(" ms ago");
- }
- }
- }
+ }
- if (mBadProcesses.getMap().size() > 0) {
- if (needSep) pw.println(" ");
- needSep = true;
- pw.println(" Bad processes:");
- for (Map.Entry<String, SparseArray<Long>> procs
- : mBadProcesses.getMap().entrySet()) {
- SparseArray<Long> uids = procs.getValue();
- final int N = uids.size();
- for (int i=0; i<N; i++) {
- pw.print(" Bad process "); pw.print(procs.getKey());
- pw.print(" uid "); pw.print(uids.keyAt(i));
- pw.print(": crashed at time ");
- pw.println(uids.valueAt(i));
- }
+ if (mBadProcesses.getMap().size() > 0) {
+ if (needSep) pw.println(" ");
+ needSep = true;
+ pw.println(" Bad processes:");
+ for (Map.Entry<String, SparseArray<Long>> procs
+ : mBadProcesses.getMap().entrySet()) {
+ SparseArray<Long> uids = procs.getValue();
+ final int N = uids.size();
+ for (int i=0; i<N; i++) {
+ pw.print(" Bad process "); pw.print(procs.getKey());
+ pw.print(" uid "); pw.print(uids.keyAt(i));
+ pw.print(": crashed at time ");
+ pw.println(uids.valueAt(i));
}
}
+ }
- pw.println(" ");
+ pw.println(" ");
+ pw.println(" mHomeProcess: " + mHomeProcess);
+ pw.println(" mConfiguration: " + mConfiguration);
+ pw.println(" mSleeping=" + mSleeping + " mShuttingDown=" + mShuttingDown);
+ if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
+ || mOrigWaitForDebugger) {
+ pw.println(" mDebugApp=" + mDebugApp + "/orig=" + mOrigDebugApp
+ + " mDebugTransient=" + mDebugTransient
+ + " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
+ }
+ if (mAlwaysFinishActivities || mController != null) {
+ pw.println(" mAlwaysFinishActivities=" + mAlwaysFinishActivities
+ + " mController=" + mController);
+ }
+ if (dumpAll) {
pw.println(" Total persistent processes: " + numPers);
- pw.println(" mHomeProcess: " + mHomeProcess);
- pw.println(" mConfiguration: " + mConfiguration);
pw.println(" mStartRunning=" + mStartRunning
+ " mSystemReady=" + mSystemReady
+ " mBooting=" + mBooting
+ " mBooted=" + mBooted
+ " mFactoryTest=" + mFactoryTest);
- pw.println(" mSleeping=" + mSleeping + " mShuttingDown=" + mShuttingDown);
pw.println(" mGoingToSleep=" + mGoingToSleep);
pw.println(" mLaunchingActivity=" + mLaunchingActivity);
- pw.println(" mDebugApp=" + mDebugApp + "/orig=" + mOrigDebugApp
- + " mDebugTransient=" + mDebugTransient
- + " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
- pw.println(" mAlwaysFinishActivities=" + mAlwaysFinishActivities
- + " mController=" + mController);
}
+
+ return true;
}
/**
@@ -9232,20 +9455,22 @@
* - the first arg isn't the flattened component name of an existing service:
* dump all services whose component contains the first arg as a substring
*/
- protected void dumpService(FileDescriptor fd, PrintWriter pw, String[] args) {
+ protected void dumpService(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
String[] newArgs;
String componentNameString;
ServiceRecord r;
- if (args.length == 1) {
+ if (opti <= args.length) {
componentNameString = null;
newArgs = EMPTY_STRING_ARRAY;
r = null;
} else {
- componentNameString = args[1];
+ componentNameString = args[opti];
+ opti++;
ComponentName componentName = ComponentName.unflattenFromString(componentNameString);
r = componentName != null ? mServices.get(componentName) : null;
- newArgs = new String[args.length - 2];
- if (args.length > 2) System.arraycopy(args, 2, newArgs, 0, args.length - 2);
+ newArgs = new String[args.length - opti];
+ if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, args.length - opti);
}
if (r != null) {
@@ -9279,19 +9504,11 @@
}
}
- void dumpBroadcasts(PrintWriter pw) {
- synchronized (this) {
- if (checkCallingPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ActivityManager from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " without permission "
- + android.Manifest.permission.DUMP);
- return;
- }
- pw.println("Broadcasts in Current Activity Manager State:");
-
+ boolean dumpBroadcastsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
+ boolean needSep = false;
+
+ if (dumpAll) {
if (mRegisteredReceivers.size() > 0) {
pw.println(" ");
pw.println(" Registered Receivers:");
@@ -9302,38 +9519,42 @@
r.dump(pw, " ");
}
}
-
+
pw.println(" ");
pw.println("Receiver Resolver Table:");
mReceiverResolver.dump(pw, " ");
-
- if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
- || mPendingBroadcast != null) {
- if (mParallelBroadcasts.size() > 0) {
- pw.println(" ");
- pw.println(" Active broadcasts:");
- }
- for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
- pw.println(" Broadcast #" + i + ":");
- mParallelBroadcasts.get(i).dump(pw, " ");
- }
- if (mOrderedBroadcasts.size() > 0) {
- pw.println(" ");
- pw.println(" Active serialized broadcasts:");
- }
- for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
- pw.println(" Serialized Broadcast #" + i + ":");
- mOrderedBroadcasts.get(i).dump(pw, " ");
- }
+ needSep = true;
+ }
+
+ if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
+ || mPendingBroadcast != null) {
+ if (mParallelBroadcasts.size() > 0) {
pw.println(" ");
- pw.println(" Pending broadcast:");
- if (mPendingBroadcast != null) {
- mPendingBroadcast.dump(pw, " ");
- } else {
- pw.println(" (null)");
- }
+ pw.println(" Active broadcasts:");
}
+ for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
+ pw.println(" Broadcast #" + i + ":");
+ mParallelBroadcasts.get(i).dump(pw, " ");
+ }
+ if (mOrderedBroadcasts.size() > 0) {
+ pw.println(" ");
+ pw.println(" Active serialized broadcasts:");
+ }
+ for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
+ pw.println(" Serialized Broadcast #" + i + ":");
+ mOrderedBroadcasts.get(i).dump(pw, " ");
+ }
+ pw.println(" ");
+ pw.println(" Pending broadcast:");
+ if (mPendingBroadcast != null) {
+ mPendingBroadcast.dump(pw, " ");
+ } else {
+ pw.println(" (null)");
+ }
+ needSep = true;
+ }
+ if (dumpAll) {
pw.println(" ");
pw.println(" Historical broadcasts:");
for (int i=0; i<MAX_BROADCAST_HISTORY; i++) {
@@ -9344,54 +9565,50 @@
pw.println(" Historical Broadcast #" + i + ":");
r.dump(pw, " ");
}
-
+ needSep = true;
+ }
+
+ if (mStickyBroadcasts != null) {
pw.println(" ");
- pw.println(" mBroadcastsScheduled=" + mBroadcastsScheduled);
- if (mStickyBroadcasts != null) {
- pw.println(" ");
- pw.println(" Sticky broadcasts:");
- StringBuilder sb = new StringBuilder(128);
- for (Map.Entry<String, ArrayList<Intent>> ent
- : mStickyBroadcasts.entrySet()) {
- pw.print(" * Sticky action "); pw.print(ent.getKey());
- pw.println(":");
- ArrayList<Intent> intents = ent.getValue();
- final int N = intents.size();
- for (int i=0; i<N; i++) {
- sb.setLength(0);
- sb.append(" Intent: ");
- intents.get(i).toShortString(sb, true, false);
- pw.println(sb.toString());
- Bundle bundle = intents.get(i).getExtras();
- if (bundle != null) {
- pw.print(" ");
- pw.println(bundle.toString());
- }
+ pw.println(" Sticky broadcasts:");
+ StringBuilder sb = new StringBuilder(128);
+ for (Map.Entry<String, ArrayList<Intent>> ent
+ : mStickyBroadcasts.entrySet()) {
+ pw.print(" * Sticky action "); pw.print(ent.getKey());
+ pw.println(":");
+ ArrayList<Intent> intents = ent.getValue();
+ final int N = intents.size();
+ for (int i=0; i<N; i++) {
+ sb.setLength(0);
+ sb.append(" Intent: ");
+ intents.get(i).toShortString(sb, true, false);
+ pw.println(sb.toString());
+ Bundle bundle = intents.get(i).getExtras();
+ if (bundle != null) {
+ pw.print(" ");
+ pw.println(bundle.toString());
}
}
}
-
+ needSep = true;
+ }
+
+ if (dumpAll) {
pw.println(" ");
+ pw.println(" mBroadcastsScheduled=" + mBroadcastsScheduled);
pw.println(" mHandler:");
mHandler.dump(new PrintWriterPrinter(pw), " ");
+ needSep = true;
}
+
+ return needSep;
}
- void dumpServices(PrintWriter pw) {
- synchronized (this) {
- if (checkCallingPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ActivityManager from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " without permission "
- + android.Manifest.permission.DUMP);
- return;
- }
- pw.println("Services in Current Activity Manager State:");
+ boolean dumpServicesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
+ boolean needSep = false;
- boolean needSep = false;
-
+ if (dumpAll) {
if (mServices.size() > 0) {
pw.println(" Active services:");
Iterator<ServiceRecord> it = mServices.values().iterator();
@@ -9402,40 +9619,42 @@
}
needSep = true;
}
+ }
- if (mPendingServices.size() > 0) {
- if (needSep) pw.println(" ");
- pw.println(" Pending services:");
- for (int i=0; i<mPendingServices.size(); i++) {
- ServiceRecord r = mPendingServices.get(i);
- pw.print(" * Pending "); pw.println(r);
- r.dump(pw, " ");
- }
- needSep = true;
+ if (mPendingServices.size() > 0) {
+ if (needSep) pw.println(" ");
+ pw.println(" Pending services:");
+ for (int i=0; i<mPendingServices.size(); i++) {
+ ServiceRecord r = mPendingServices.get(i);
+ pw.print(" * Pending "); pw.println(r);
+ r.dump(pw, " ");
}
+ needSep = true;
+ }
- if (mRestartingServices.size() > 0) {
- if (needSep) pw.println(" ");
- pw.println(" Restarting services:");
- for (int i=0; i<mRestartingServices.size(); i++) {
- ServiceRecord r = mRestartingServices.get(i);
- pw.print(" * Restarting "); pw.println(r);
- r.dump(pw, " ");
- }
- needSep = true;
+ if (mRestartingServices.size() > 0) {
+ if (needSep) pw.println(" ");
+ pw.println(" Restarting services:");
+ for (int i=0; i<mRestartingServices.size(); i++) {
+ ServiceRecord r = mRestartingServices.get(i);
+ pw.print(" * Restarting "); pw.println(r);
+ r.dump(pw, " ");
}
+ needSep = true;
+ }
- if (mStoppingServices.size() > 0) {
- if (needSep) pw.println(" ");
- pw.println(" Stopping services:");
- for (int i=0; i<mStoppingServices.size(); i++) {
- ServiceRecord r = mStoppingServices.get(i);
- pw.print(" * Stopping "); pw.println(r);
- r.dump(pw, " ");
- }
- needSep = true;
+ if (mStoppingServices.size() > 0) {
+ if (needSep) pw.println(" ");
+ pw.println(" Stopping services:");
+ for (int i=0; i<mStoppingServices.size(); i++) {
+ ServiceRecord r = mStoppingServices.get(i);
+ pw.print(" * Stopping "); pw.println(r);
+ r.dump(pw, " ");
}
+ needSep = true;
+ }
+ if (dumpAll) {
if (mServiceConnections.size() > 0) {
if (needSep) pw.println(" ");
pw.println(" Connection bindings to services:");
@@ -9446,26 +9665,18 @@
pw.print(" * "); pw.println(r);
r.dump(pw, " ");
}
+ needSep = true;
}
}
+
+ return needSep;
}
- void dumpProviders(PrintWriter pw) {
- synchronized (this) {
- if (checkCallingPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ActivityManager from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " without permission "
- + android.Manifest.permission.DUMP);
- return;
- }
+ boolean dumpProvidersLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
+ boolean needSep = false;
- pw.println("Content Providers in Current Activity Manager State:");
-
- boolean needSep = false;
-
+ if (dumpAll) {
if (mProvidersByClass.size() > 0) {
if (needSep) pw.println(" ");
pw.println(" Published content providers (by class):");
@@ -9478,7 +9689,7 @@
}
needSep = true;
}
-
+
if (mProvidersByName.size() > 0) {
pw.println(" ");
pw.println(" Authority to provider mappings:");
@@ -9491,55 +9702,50 @@
}
needSep = true;
}
-
- if (mLaunchingProviders.size() > 0) {
- if (needSep) pw.println(" ");
- pw.println(" Launching content providers:");
- for (int i=mLaunchingProviders.size()-1; i>=0; i--) {
- pw.print(" Launching #"); pw.print(i); pw.print(": ");
- pw.println(mLaunchingProviders.get(i));
- }
- needSep = true;
- }
-
- if (mGrantedUriPermissions.size() > 0) {
- pw.println();
- pw.println("Granted Uri Permissions:");
- for (int i=0; i<mGrantedUriPermissions.size(); i++) {
- int uid = mGrantedUriPermissions.keyAt(i);
- HashMap<Uri, UriPermission> perms
- = mGrantedUriPermissions.valueAt(i);
- pw.print(" * UID "); pw.print(uid);
- pw.println(" holds:");
- for (UriPermission perm : perms.values()) {
- pw.print(" "); pw.println(perm);
- perm.dump(pw, " ");
- }
- }
- }
}
+
+ if (mLaunchingProviders.size() > 0) {
+ if (needSep) pw.println(" ");
+ pw.println(" Launching content providers:");
+ for (int i=mLaunchingProviders.size()-1; i>=0; i--) {
+ pw.print(" Launching #"); pw.print(i); pw.print(": ");
+ pw.println(mLaunchingProviders.get(i));
+ }
+ needSep = true;
+ }
+
+ if (mGrantedUriPermissions.size() > 0) {
+ pw.println();
+ pw.println("Granted Uri Permissions:");
+ for (int i=0; i<mGrantedUriPermissions.size(); i++) {
+ int uid = mGrantedUriPermissions.keyAt(i);
+ HashMap<Uri, UriPermission> perms
+ = mGrantedUriPermissions.valueAt(i);
+ pw.print(" * UID "); pw.print(uid);
+ pw.println(" holds:");
+ for (UriPermission perm : perms.values()) {
+ pw.print(" "); pw.println(perm);
+ perm.dump(pw, " ");
+ }
+ }
+ needSep = true;
+ }
+
+ return needSep;
}
- void dumpSenders(PrintWriter pw) {
- synchronized (this) {
- if (checkCallingPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ActivityManager from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " without permission "
- + android.Manifest.permission.DUMP);
- return;
- }
-
- pw.println("Pending Intents in Current Activity Manager State:");
-
+ boolean dumpPendingIntentsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll) {
+ boolean needSep = false;
+
+ if (dumpAll) {
if (this.mIntentSenderRecords.size() > 0) {
Iterator<WeakReference<PendingIntentRecord>> it
= mIntentSenderRecords.values().iterator();
while (it.hasNext()) {
WeakReference<PendingIntentRecord> ref = it.next();
PendingIntentRecord rec = ref != null ? ref.get(): null;
+ needSep = true;
if (rec != null) {
pw.print(" * "); pw.println(rec);
rec.dump(pw, " ");
@@ -9549,6 +9755,8 @@
}
}
}
+
+ return needSep;
}
private static final void dumpHistoryList(PrintWriter pw, List list,
@@ -9597,35 +9805,23 @@
} else if (inclOomAdj) {
String oomAdj;
if (r.setAdj >= EMPTY_APP_ADJ) {
- oomAdj = buildOomTag("empty", null, r.setAdj,
- EMPTY_APP_ADJ);
- } else if (r.setAdj >= CONTENT_PROVIDER_ADJ) {
- oomAdj = buildOomTag("cprov", null, r.setAdj,
- CONTENT_PROVIDER_ADJ);
+ oomAdj = buildOomTag("empty", null, r.setAdj, EMPTY_APP_ADJ);
} else if (r.setAdj >= HIDDEN_APP_MIN_ADJ) {
- oomAdj = buildOomTag("hid", " ", r.setAdj,
- HIDDEN_APP_MIN_ADJ);
- } else if (r.setAdj >= service.HOME_APP_ADJ) {
- oomAdj = buildOomTag("home ", null, r.setAdj,
- service.HOME_APP_ADJ);
- } else if (r.setAdj >= service.SECONDARY_SERVER_ADJ) {
- oomAdj = buildOomTag("svc", " ", r.setAdj,
- service.SECONDARY_SERVER_ADJ);
- } else if (r.setAdj >= service.BACKUP_APP_ADJ) {
- oomAdj = buildOomTag("bckup", null, r.setAdj,
- service.BACKUP_APP_ADJ);
- } else if (r.setAdj >= service.VISIBLE_APP_ADJ) {
- oomAdj = buildOomTag("vis ", null, r.setAdj,
- service.VISIBLE_APP_ADJ);
- } else if (r.setAdj >= service.FOREGROUND_APP_ADJ) {
- oomAdj = buildOomTag("fore ", null, r.setAdj,
- service.FOREGROUND_APP_ADJ);
+ oomAdj = buildOomTag("bak", " ", r.setAdj, HIDDEN_APP_MIN_ADJ);
+ } else if (r.setAdj >= HOME_APP_ADJ) {
+ oomAdj = buildOomTag("home ", null, r.setAdj, HOME_APP_ADJ);
+ } else if (r.setAdj >= SECONDARY_SERVER_ADJ) {
+ oomAdj = buildOomTag("svc", " ", r.setAdj, SECONDARY_SERVER_ADJ);
+ } else if (r.setAdj >= BACKUP_APP_ADJ) {
+ oomAdj = buildOomTag("bckup", null, r.setAdj, BACKUP_APP_ADJ);
+ } else if (r.setAdj >= VISIBLE_APP_ADJ) {
+ oomAdj = buildOomTag("vis ", null, r.setAdj, VISIBLE_APP_ADJ);
+ } else if (r.setAdj >= FOREGROUND_APP_ADJ) {
+ oomAdj = buildOomTag("fore ", null, r.setAdj, FOREGROUND_APP_ADJ);
} else if (r.setAdj >= CORE_SERVER_ADJ) {
- oomAdj = buildOomTag("core ", null, r.setAdj,
- CORE_SERVER_ADJ);
+ oomAdj = buildOomTag("core ", null, r.setAdj, CORE_SERVER_ADJ);
} else if (r.setAdj >= SYSTEM_ADJ) {
- oomAdj = buildOomTag("sys ", null, r.setAdj,
- SYSTEM_ADJ);
+ oomAdj = buildOomTag("sys ", null, r.setAdj, SYSTEM_ADJ);
} else {
oomAdj = Integer.toString(r.setAdj);
}
@@ -9643,10 +9839,10 @@
}
pw.println(String.format("%s%s #%2d: adj=%s/%s %s (%s)",
prefix, (r.persistent ? persistentLabel : normalLabel),
- i, oomAdj, schedGroup, r.toString(), r.adjType));
+ i, oomAdj, schedGroup, r.toShortString(), r.adjType));
if (r.adjSource != null || r.adjTarget != null) {
pw.println(prefix + " " + r.adjTarget
- + " used by " + r.adjSource);
+ + "<=" + r.adjSource);
}
} else {
pw.println(String.format("%s%s #%2d: %s",
@@ -9877,7 +10073,7 @@
private final void cleanUpApplicationRecordLocked(ProcessRecord app,
boolean restarting, int index) {
if (index >= 0) {
- mLRUProcesses.remove(index);
+ mLruProcesses.remove(index);
}
mProcessesToGc.remove(app);
@@ -10086,7 +10282,7 @@
if (r.startRequested) {
info.flags |= ActivityManager.RunningServiceInfo.FLAG_STARTED;
}
- if (r.app != null && r.app.pid == Process.myPid()) {
+ if (r.app != null && r.app.pid == MY_PID) {
info.flags |= ActivityManager.RunningServiceInfo.FLAG_SYSTEM_PROCESS;
}
if (r.app != null && r.app.persistent) {
@@ -10400,7 +10596,7 @@
app.services.add(r);
bumpServiceExecutingLocked(r);
- updateLRUListLocked(app, true);
+ updateLruProcessLocked(app, true, true);
boolean created = false;
try {
@@ -11387,9 +11583,9 @@
nextTime = sr.executingStart;
}
}
- if (timeout != null && mLRUProcesses.contains(proc)) {
+ if (timeout != null && mLruProcesses.contains(proc)) {
Log.w(TAG, "Timeout executing service: " + timeout);
- appNotRespondingLocked(proc, null, null, "Executing service " + timeout.name);
+ appNotRespondingLocked(proc, null, null, "Executing service " + timeout.shortName);
} else {
Message msg = mHandler.obtainMessage(SERVICE_TIMEOUT_MSG);
msg.obj = proc;
@@ -11726,7 +11922,7 @@
String ssp;
if (data != null && (ssp=data.getSchemeSpecificPart()) != null) {
if (!intent.getBooleanExtra(Intent.EXTRA_DONT_KILL_APP, false)) {
- uninstallPackageLocked(ssp,
+ forceStopPackageLocked(ssp,
intent.getIntExtra(Intent.EXTRA_UID, -1), false);
AttributeCache ac = AttributeCache.instance();
if (ac != null) {
@@ -12245,7 +12441,7 @@
r.receiver = app.thread.asBinder();
r.curApp = app;
app.curReceiver = r;
- updateLRUListLocked(app, true);
+ updateLruProcessLocked(app, true, true);
// Tell the application to launch this receiver.
r.intent.setComponent(r.curComponent);
@@ -12694,7 +12890,7 @@
}
final long origId = Binder.clearCallingIdentity();
- uninstallPackageLocked(ii.targetPackage, -1, true);
+ forceStopPackageLocked(ii.targetPackage, -1, true);
ProcessRecord app = addAppLocked(ai);
app.instrumentationClass = className;
app.instrumentationInfo = ai;
@@ -12749,7 +12945,7 @@
app.instrumentationProfileFile = null;
app.instrumentationArguments = null;
- uninstallPackageLocked(app.processName, -1, false);
+ forceStopPackageLocked(app.processName, -1, false);
}
public void finishInstrumentation(IApplicationThread target,
@@ -12859,9 +13055,8 @@
msg.obj = new Configuration(mConfiguration);
mHandler.sendMessage(msg);
- final int N = mLRUProcesses.size();
- for (int i=0; i<N; i++) {
- ProcessRecord app = mLRUProcesses.get(i);
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord app = mLruProcesses.get(i);
try {
if (app.thread != null) {
if (DEBUG_CONFIGURATION) Log.v(TAG, "Sending to proc "
@@ -13075,10 +13270,16 @@
// LIFETIME MANAGEMENT
// =========================================================
- private final int computeOomAdjLocked(
- ProcessRecord app, int hiddenAdj, ProcessRecord TOP_APP) {
+ private final int computeOomAdjLocked(ProcessRecord app, int hiddenAdj,
+ ProcessRecord TOP_APP, boolean recursed) {
if (mAdjSeq == app.adjSeq) {
- // This adjustment has already been computed.
+ // This adjustment has already been computed. If we are calling
+ // from the top, we may have already computed our adjustment with
+ // an earlier hidden adjustment that isn't really for us... if
+ // so, use the new hidden adjustment.
+ if (!recursed && app.hidden) {
+ app.curAdj = hiddenAdj;
+ }
return app.curAdj;
}
@@ -13101,6 +13302,8 @@
app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN;
app.adjSource = null;
app.adjTarget = null;
+ app.empty = false;
+ app.hidden = false;
// Determine the importance of the process, starting with most
// important to least, and assign an appropriate OOM adjustment.
@@ -13154,12 +13357,15 @@
app.adjType = "home";
} else if ((N=app.activities.size()) != 0) {
// This app is in the background with paused activities.
+ app.hidden = true;
adj = hiddenAdj;
schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
app.adjType = "bg-activities";
+ N = app.activities.size();
for (int j=0; j<N; j++) {
if (((HistoryRecord)app.activities.get(j)).visible) {
// This app has a visible activity!
+ app.hidden = false;
adj = VISIBLE_APP_ADJ;
schedGroup = Process.THREAD_GROUP_DEFAULT;
app.adjType = "visible";
@@ -13167,12 +13373,17 @@
}
}
} else {
- // A very not-needed process.
- adj = EMPTY_APP_ADJ;
+ // A very not-needed process. If this is lower in the lru list,
+ // we will push it in to the empty bucket.
+ app.hidden = true;
+ app.empty = true;
schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
- app.adjType = "empty";
+ adj = hiddenAdj;
+ app.adjType = "bg-empty";
}
+ //Log.i(TAG, "OOM " + app + ": initial adj=" + adj);
+
// By default, we use the computed adjustment. It may be changed if
// there are applications dependent on our services or providers, but
// this gives us a baseline and makes sure we don't get into an
@@ -13186,6 +13397,7 @@
if (DEBUG_BACKUP) Log.v(TAG, "oom BACKUP_APP_ADJ for " + app);
adj = BACKUP_APP_ADJ;
app.adjType = "backup";
+ app.hidden = false;
}
}
@@ -13205,6 +13417,7 @@
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
+ app.hidden = false;
}
}
}
@@ -13231,10 +13444,13 @@
}
}
int clientAdj = computeOomAdjLocked(
- client, myHiddenAdj, TOP_APP);
+ client, myHiddenAdj, TOP_APP, true);
if (adj > clientAdj) {
adj = clientAdj > VISIBLE_APP_ADJ
? clientAdj : VISIBLE_APP_ADJ;
+ if (!client.hidden) {
+ app.hidden = false;
+ }
app.adjType = "service";
app.adjTypeCode = ActivityManager.RunningAppProcessInfo
.REASON_SERVICE_IN_USE;
@@ -13256,6 +13472,7 @@
|| a.state == ActivityState.PAUSING)) {
adj = FOREGROUND_APP_ADJ;
schedGroup = Process.THREAD_GROUP_DEFAULT;
+ app.hidden = false;
app.adjType = "service";
app.adjTypeCode = ActivityManager.RunningAppProcessInfo
.REASON_SERVICE_IN_USE;
@@ -13273,6 +13490,7 @@
// its services we may bump it up from there.
if (adj > hiddenAdj) {
adj = hiddenAdj;
+ app.hidden = false;
app.adjType = "bg-services";
}
}
@@ -13300,10 +13518,13 @@
}
}
int clientAdj = computeOomAdjLocked(
- client, myHiddenAdj, TOP_APP);
+ client, myHiddenAdj, TOP_APP, true);
if (adj > clientAdj) {
adj = clientAdj > FOREGROUND_APP_ADJ
? clientAdj : FOREGROUND_APP_ADJ;
+ if (!client.hidden) {
+ app.hidden = false;
+ }
app.adjType = "provider";
app.adjTypeCode = ActivityManager.RunningAppProcessInfo
.REASON_PROVIDER_IN_USE;
@@ -13322,20 +13543,12 @@
if (adj > FOREGROUND_APP_ADJ) {
adj = FOREGROUND_APP_ADJ;
schedGroup = Process.THREAD_GROUP_DEFAULT;
+ app.hidden = false;
app.adjType = "provider";
app.adjTarget = cpr.info.name;
}
}
}
-
- // Finally, if this process has published any content providers,
- // then its adjustment makes it at least as important as any of the
- // processes using those providers, and no less important than
- // CONTENT_PROVIDER_ADJ, which is just shy of EMPTY.
- if (adj > CONTENT_PROVIDER_ADJ) {
- adj = CONTENT_PROVIDER_ADJ;
- app.adjType = "pub-providers";
- }
}
app.curRawAdj = adj;
@@ -13493,7 +13706,7 @@
return true;
}
- int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP);
+ int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP, false);
if ((app.pid != 0 && app.pid != MY_PID) || Process.supportsProcesses()) {
if (app.curRawAdj != app.setRawAdj) {
@@ -13599,13 +13812,14 @@
// First try updating the OOM adjustment for each of the
// application processes based on their current state.
- int i = mLRUProcesses.size();
+ int i = mLruProcesses.size();
int curHiddenAdj = HIDDEN_APP_MIN_ADJ;
while (i > 0) {
i--;
- ProcessRecord app = mLRUProcesses.get(i);
+ ProcessRecord app = mLruProcesses.get(i);
+ //Log.i(TAG, "OOM " + app + ": cur hidden=" + curHiddenAdj);
if (updateOomAdjLocked(app, curHiddenAdj, TOP_APP)) {
- if (curHiddenAdj < HIDDEN_APP_MAX_ADJ
+ if (curHiddenAdj < EMPTY_APP_ADJ
&& app.curAdj == curHiddenAdj) {
curHiddenAdj++;
}
@@ -13614,8 +13828,9 @@
}
}
- // todo: for now pretend like OOM ADJ didn't work, because things
- // aren't behaving as expected on Linux -- it's not killing processes.
+ // If we return false, we will fall back on killing processes to
+ // have a fixed limit. Do this if a limit has been requested; else
+ // only return false if one of the adjustments failed.
return ENFORCE_PROCESS_LIMIT || mProcessLimit > 0 ? false : didOomAdj;
}
@@ -13662,8 +13877,8 @@
// Count how many processes are running services.
int numServiceProcs = 0;
- for (i=mLRUProcesses.size()-1; i>=0; i--) {
- final ProcessRecord app = mLRUProcesses.get(i);
+ for (i=mLruProcesses.size()-1; i>=0; i--) {
+ final ProcessRecord app = mLruProcesses.get(i);
if (app.persistent || app.services.size() != 0
|| app.curReceiver != null
@@ -13688,10 +13903,10 @@
// process count. First remove any processes that no longer
// have activites running in them.
for ( i=0;
- i<mLRUProcesses.size()
- && mLRUProcesses.size() > curMaxProcs;
+ i<mLruProcesses.size()
+ && mLruProcesses.size() > curMaxProcs;
i++) {
- final ProcessRecord app = mLRUProcesses.get(i);
+ final ProcessRecord app = mLruProcesses.get(i);
// Quit an application only if it is not currently
// running any activities.
if (!app.persistent && app.activities.size() == 0
@@ -13722,13 +13937,13 @@
// If we still have too many processes, now from the least
// recently used process we start finishing activities.
if (Config.LOGV) Log.v(
- TAG, "*** NOW HAVE " + mLRUProcesses.size() +
+ TAG, "*** NOW HAVE " + mLruProcesses.size() +
" of " + curMaxProcs + " processes");
for ( i=0;
- i<mLRUProcesses.size()
- && mLRUProcesses.size() > curMaxProcs;
+ i<mLruProcesses.size()
+ && mLruProcesses.size() > curMaxProcs;
i++) {
- final ProcessRecord app = mLRUProcesses.get(i);
+ final ProcessRecord app = mLruProcesses.get(i);
// Quit the application only if we have a state saved for
// all of its activities.
boolean canQuit = !app.persistent && app.curReceiver == null
@@ -13827,8 +14042,8 @@
+ android.Manifest.permission.SIGNAL_PERSISTENT_PROCESSES);
}
- for (int i = mLRUProcesses.size() - 1 ; i >= 0 ; i--) {
- ProcessRecord r = mLRUProcesses.get(i);
+ for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
+ ProcessRecord r = mLruProcesses.get(i);
if (r.thread != null && r.persistent) {
Process.sendSignal(r.pid, sig);
}
diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java
index 1851853..17f3467 100644
--- a/services/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/java/com/android/server/am/AppNotRespondingDialog.java
@@ -104,8 +104,7 @@
switch (msg.what) {
case FORCE_CLOSE:
// Kill the application.
- mService.killAppAtUsersRequest(mProc,
- AppNotRespondingDialog.this, true);
+ mService.killAppAtUsersRequest(mProc, AppNotRespondingDialog.this);
break;
case WAIT_AND_REPORT:
case WAIT:
diff --git a/services/java/com/android/server/am/AppWaitingForDebuggerDialog.java b/services/java/com/android/server/am/AppWaitingForDebuggerDialog.java
index 0992d4d..8e9818d 100644
--- a/services/java/com/android/server/am/AppWaitingForDebuggerDialog.java
+++ b/services/java/com/android/server/am/AppWaitingForDebuggerDialog.java
@@ -62,8 +62,7 @@
switch (msg.what) {
case 1:
// Kill the application.
- mService.killAppAtUsersRequest(mProc,
- AppWaitingForDebuggerDialog.this, true);
+ mService.killAppAtUsersRequest(mProc, AppWaitingForDebuggerDialog.this);
break;
}
}
diff --git a/services/java/com/android/server/am/EventLogTags.logtags b/services/java/com/android/server/am/EventLogTags.logtags
index 7e4ea35..952555b 100644
--- a/services/java/com/android/server/am/EventLogTags.logtags
+++ b/services/java/com/android/server/am/EventLogTags.logtags
@@ -79,4 +79,7 @@
# The activity manager gave up on a new process taking too long to start
30037 am_process_start_timeout (PID|1|5),(UID|1|5),(Process Name|3)
-
+# Unhandled exception
+30039 am_crash (PID|1|5),(Process Name|3),(Exception|3),(Message|3),(File|3),(Line|1|5)
+# Log.wtf() called
+30040 am_wtf (PID|1|5),(Process Name|3),(Tag|3),(Message|3)
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 6202257..28195ce 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -28,6 +28,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.util.PrintWriterPrinter;
import java.io.PrintWriter;
@@ -50,6 +51,8 @@
// are in the process of launching the app)
int pid; // The process of this application; 0 if none
boolean starting; // True if the process is being started
+ long lastActivityTime; // For managing the LRU list
+ long lruWeight; // Weight for ordering in LRU list
int maxAdj; // Maximum OOM adjustment for this process
int hiddenAdj; // If hidden, this is the adjustment to use
int curRawAdj; // Current OOM unlimited adjustment for this process
@@ -73,6 +76,8 @@
long lastRequestedGc; // When we last asked the app to do a gc
long lastLowMemory; // When we last told the app that memory is low
boolean reportLowMemory; // Set to true when waiting to report low mem
+ boolean empty; // Is this an empty background process?
+ boolean hidden; // Is this a hidden process?
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.
@@ -108,6 +113,7 @@
boolean waitedForDebugger; // has process show wait for debugger dialog?
Dialog waitDialog; // current wait for debugger dialog
+ String shortStringName; // caching of toShortString() result.
String stringName; // caching of toString() result.
// These reports are generated & stored when an app gets into an error condition.
@@ -120,6 +126,7 @@
ComponentName errorReportReceiver;
void dump(PrintWriter pw, String prefix) {
+ long now = SystemClock.uptimeMillis();
if (info.className != null) {
pw.print(prefix); pw.print("class="); pw.println(info.className);
}
@@ -149,6 +156,10 @@
pw.print(" curReceiver="); pw.println(curReceiver);
pw.print(prefix); pw.print("pid="); pw.print(pid); pw.print(" starting=");
pw.print(starting); pw.print(" lastPss="); pw.println(lastPss);
+ pw.print(prefix); pw.print("lastActivityTime="); pw.print(lastActivityTime);
+ pw.print(" lruWeight="); pw.println(lruWeight);
+ pw.print(" hidden="); pw.print(hidden);
+ pw.print(" empty="); pw.println(empty);
pw.print(prefix); pw.print("oom: max="); pw.print(maxAdj);
pw.print(" hidden="); pw.print(hiddenAdj);
pw.print(" curRaw="); pw.print(curRawAdj);
@@ -220,6 +231,7 @@
public void setPid(int _pid) {
pid = _pid;
+ shortStringName = null;
stringName = null;
}
@@ -256,12 +268,16 @@
}
}
- public String toString() {
- if (stringName != null) {
- return stringName;
+ public String toShortString() {
+ if (shortStringName != null) {
+ return shortStringName;
}
StringBuilder sb = new StringBuilder(128);
- sb.append("ProcessRecord{");
+ toShortString(sb);
+ return shortStringName = sb.toString();
+ }
+
+ void toShortString(StringBuilder sb) {
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(' ');
sb.append(pid);
@@ -269,6 +285,15 @@
sb.append(processName);
sb.append('/');
sb.append(info.uid);
+ }
+
+ public String toString() {
+ if (stringName != null) {
+ return stringName;
+ }
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("ProcessRecord{");
+ toShortString(sb);
sb.append('}');
return stringName = sb.toString();
}
diff --git a/services/java/com/android/server/status/StatusBarIcon.java b/services/java/com/android/server/status/StatusBarIcon.java
index 857784b..b20d3f6 100644
--- a/services/java/com/android/server/status/StatusBarIcon.java
+++ b/services/java/com/android/server/status/StatusBarIcon.java
@@ -4,7 +4,6 @@
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Typeface;
-import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.Log;
@@ -12,7 +11,6 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -41,7 +39,7 @@
mTextView = t;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.FILL_PARENT);
+ LinearLayout.LayoutParams.MATCH_PARENT);
t.setTextSize(16);
t.setTextColor(0xff000000);
t.setTypeface(Typeface.DEFAULT_BOLD);
diff --git a/services/java/com/android/server/status/StatusBarService.java b/services/java/com/android/server/status/StatusBarService.java
index a103dcb..2d0f254 100644
--- a/services/java/com/android/server/status/StatusBarService.java
+++ b/services/java/com/android/server/status/StatusBarService.java
@@ -329,7 +329,7 @@
public void systemReady() {
final StatusBarView view = mStatusBarView;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
view.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height),
WindowManager.LayoutParams.TYPE_STATUS_BAR,
@@ -1486,8 +1486,8 @@
}
lp = new WindowManager.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
@@ -1496,6 +1496,7 @@
// lp.token = mStatusBarView.getWindowToken();
lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
lp.setTitle("TrackingView");
+ lp.y = mTrackingPosition;
mTrackingParams = lp;
WindowManagerImpl.getDefault().addView(mTrackingView, lp);
@@ -1520,7 +1521,7 @@
final int disph = mDisplay.getHeight();
lp = mExpandedDialog.getWindow().getAttributes();
- lp.width = ViewGroup.LayoutParams.FILL_PARENT;
+ lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
lp.x = 0;
mTrackingPosition = lp.y = -disph; // sufficiently large negative
@@ -1539,7 +1540,7 @@
mExpandedDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
mExpandedDialog.setContentView(mExpandedView,
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mExpandedDialog.show();
FrameLayout hack = (FrameLayout)mExpandedView.getParent();
@@ -1575,8 +1576,11 @@
// Maybe the view was resized.
if (!mExpandedVisible) {
if (mTrackingView != null) {
- mTrackingPosition = mTrackingParams.y = -disph;
- WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams);
+ mTrackingPosition = -disph;
+ if (mTrackingParams != null) {
+ mTrackingParams.y = mTrackingPosition;
+ WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams);
+ }
}
if (mExpandedParams != null) {
mExpandedParams.y = -disph;
@@ -1672,7 +1676,10 @@
// act accordingly
if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((net & StatusBarManager.DISABLE_EXPAND) != 0) {
- animateCollapse();
+ Log.d(TAG, "DISABLE_EXPAND: yes");
+ mAnimating = false;
+ updateExpandedViewPos(0);
+ performCollapse();
}
}
if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
diff --git a/services/jni/com_android_server_SensorService.cpp b/services/jni/com_android_server_SensorService.cpp
index 3911d1f..77db6da 100644
--- a/services/jni/com_android_server_SensorService.cpp
+++ b/services/jni/com_android_server_SensorService.cpp
@@ -16,7 +16,6 @@
#define LOG_TAG "SensorService"
-#define LOG_NDEBUG 0
#include "utils/Log.h"
#include <hardware/sensors.h>
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index 9bfd900..4f9cb2e4 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -153,7 +153,7 @@
* @see ServiceState#STATE_IN_SERVICE
* @see ServiceState#STATE_OUT_OF_SERVICE
* @see ServiceState#STATE_POWER_OFF
- * @deprecated see #onSignalStrengthsChanged
+ * @deprecated Use {@link #onSignalStrengthsChanged(SignalStrength)}
*/
@Deprecated
public void onSignalStrengthChanged(int asu) {
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index 01b1746..cf89848 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -22,6 +22,7 @@
import android.net.Uri;
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import static android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.telephony.TelephonyManager;
import android.telephony.PhoneNumberUtils;
@@ -118,7 +119,6 @@
* number. The returned CallerInfo is null if no number is supplied.
*/
public static CallerInfo getCallerInfo(Context context, Uri contactRef, Cursor cursor) {
-
CallerInfo info = new CallerInfo();
info.photoResource = 0;
info.phoneLabel = null;
@@ -132,6 +132,9 @@
if (cursor != null) {
if (cursor.moveToFirst()) {
+ // TODO: photo_id is always available but not taken
+ // care of here. Maybe we should store it in the
+ // CallerInfo object as well.
int columnIndex;
@@ -160,10 +163,34 @@
}
}
- // Look for the person ID
- columnIndex = cursor.getColumnIndex(PhoneLookup._ID);
+ // Look for the person ID.
+
+ // TODO: This is pretty ugly now, see bug 2269240 for
+ // more details. With tel: URI the contact id is in
+ // col "_id" while when we use a
+ // content://contacts/data/phones URI, the contact id
+ // is col "contact_id". As a work around we use the
+ // type of the contact url to figure out which column
+ // we should look at to get the contact_id.
+
+ final String mimeType = context.getContentResolver().getType(contactRef);
+
+ columnIndex = -1;
+ if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ // content://com.android.contacts/data/phones URL
+ columnIndex = cursor.getColumnIndex(RawContacts.CONTACT_ID);
+ } else {
+ // content://com.android.contacts/phone_lookup URL
+ // TODO: mime type is null here so we cannot test
+ // if we have the right url type. phone_lookup URL
+ // should resolve to a mime type.
+ columnIndex = cursor.getColumnIndex(PhoneLookup._ID);
+ }
+
if (columnIndex != -1) {
info.person_id = cursor.getLong(columnIndex);
+ } else {
+ Log.e(TAG, "Column missing for " + contactRef);
}
// look for the custom ringtone, create from the string stored
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index 7809fed..a01bc09 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -16,43 +16,137 @@
package com.android.internal.telephony;
+import com.android.internal.telephony.gsm.ApnSetting;
+
+import com.android.internal.util.HierarchicalState;
+import com.android.internal.util.HierarchicalStateMachine;
+
import android.os.AsyncResult;
-import android.os.Handler;
import android.os.Message;
-import android.util.Log;
+import android.os.SystemProperties;
+import android.util.EventLog;
/**
* {@hide}
+ *
+ * DataConnection HierarchicalStateMachine.
+ *
+ * This is an abstract base class for representing a single data connection.
+ * Instances of this class such as <code>CdmaDataConnection</code> and
+ * <code>GsmDataConnection</code>, * represent a connection via the cellular network.
+ * There may be multiple data connections and all of them are managed by the
+ * <code>DataConnectionTracker</code>.
+ *
+ * Instances are asynchronous state machines and have two primary entry points
+ * <code>connect()</code> and <code>disconnect</code>. The message a parameter will be returned
+ * hen the operation completes. The <code>msg.obj</code> will contain an AsyncResult
+ * object and <code>AsyncResult.userObj</code> is the original <code>msg.obj</code>. if successful
+ * with the <code>AsyncResult.result == null</code> and <code>AsyncResult.exception == null</code>.
+ * If an error <code>AsyncResult.result = FailCause</code> and
+ * <code>AsyncResult.exception = new Exception()</code>.
+ *
+ * The other public methods are provided for debugging.
+ *
+ * Below is the state machine description for this class.
+ *
+ * DataConnection {
+ * + mDefaultState {
+ * EVENT_RESET { clearSettings, >mInactiveState }.
+ * EVENT_CONNECT { notifyConnectCompleted(FailCause.UNKNOWN) }.
+ * EVENT_DISCONNECT { notifyDisconnectCompleted }.
+ *
+ * // Ignored messages
+ * EVENT_SETUP_DATA_CONNECTION_DONE,
+ * EVENT_GET_LAST_FAIL_DONE,
+ * EVENT_DEACTIVATE_DONE.
+ * }
+ * ++ # mInactiveState {
+ * EVENT_RESET.
+ * EVENT_CONNECT {startConnecting, >mActivatingState }.
+ * }
+ * ++ mActivatingState {
+ * EVENT_DISCONNECT { %EVENT_DISCONNECT }.
+ * EVENT_SETUP_DATA_CONNECTION_DONE {
+ * if (SUCCESS) { notifyConnectCompleted(FailCause.NONE), >mActiveState }.
+ * if (ERR_BadCommand) {
+ * notifyConnectCompleted(FailCause.UNKNOWN), >mInactiveState }.
+ * if (ERR_BadDns) { tearDownData($DEACTIVATE_DONE), >mDisconnectingBadDnsState }.
+ * if (ERR_Other) { getLastDataCallFailCause($EVENT_GET_LAST_FAIL_DONE) }.
+ * if (ERR_Stale) {}.
+ * }
+ * EVENT_GET_LAST_FAIL_DONE { notifyConnectCompleted(result), >mInactive }.
+ * }
+ * ++ mActiveState {
+ * EVENT_DISCONNECT { tearDownData($EVENT_DEACTIVATE_DONE), >mDisconnecting }.
+ * }
+ * ++ mDisconnectingState {
+ * EVENT_DEACTIVATE_DONE { notifyDisconnectCompleted, >mInactiveState }.
+ * }
+ * ++ mDisconnectingBadDnsState {
+ * EVENT_DEACTIVATE_DONE { notifyConnectComplete(FailCause.UNKNOWN), >mInactiveState }.
+ * }
+ * }
*/
-public abstract class DataConnection extends Handler {
+public abstract class DataConnection extends HierarchicalStateMachine {
+ protected static final boolean DBG = true;
- // the inherited class
+ protected static Object mCountLock = new Object();
+ protected static int mCount;
- public enum State {
- ACTIVE, /* has active data connection */
- ACTIVATING, /* during connecting process */
- INACTIVE; /* has empty data connection */
+ /**
+ * Class returned by onSetupConnectionCompleted.
+ */
+ protected enum SetupResult {
+ ERR_BadCommand,
+ ERR_BadDns,
+ ERR_Other,
+ ERR_Stale,
+ SUCCESS;
+ public FailCause mFailCause;
+
+ @Override
public String toString() {
switch (this) {
- case ACTIVE:
- return "active";
- case ACTIVATING:
- return "setting up";
- default:
- return "inactive";
+ case ERR_BadCommand: return "Bad Command";
+ case ERR_BadDns: return "Bad DNS";
+ case ERR_Other: return "Other error";
+ case ERR_Stale: return "Stale command";
+ case SUCCESS: return "SUCCESS";
+ default: return "unknown";
}
}
-
- public boolean isActive() {
- return this == ACTIVE;
- }
-
- public boolean isInactive() {
- return this == INACTIVE;
- }
}
+ /**
+ * Used internally for saving connecting parameters.
+ */
+ protected static class ConnectionParams {
+ public ConnectionParams(ApnSetting apn, Message onCompletedMsg) {
+ this.apn = apn;
+ this.onCompletedMsg = onCompletedMsg;
+ }
+
+ public int tag;
+ public ApnSetting apn;
+ public Message onCompletedMsg;
+ }
+
+ /**
+ * Used internally for saving disconnecting parameters.
+ */
+ protected static class DisconnectParams {
+ public DisconnectParams(Message onCompletedMsg) {
+ this.onCompletedMsg = onCompletedMsg;
+ }
+
+ public int tag;
+ public Message onCompletedMsg;
+ }
+
+ /**
+ * Returned as the reason for a connection failure.
+ */
public enum FailCause {
NONE,
OPERATOR_BARRED,
@@ -71,8 +165,7 @@
GPRS_REGISTRATION_FAIL,
UNKNOWN,
- RADIO_NOT_AVAILABLE,
- RADIO_ERROR_RETRY;
+ RADIO_NOT_AVAILABLE;
public boolean isPermanentFail() {
return (this == OPERATOR_BARRED) || (this == MISSING_UKNOWN_APN) ||
@@ -128,117 +221,139 @@
return "Data Network Registration Failure";
case RADIO_NOT_AVAILABLE:
return "Radio Not Available";
- case RADIO_ERROR_RETRY:
- return "Transient Radio Rrror";
default:
return "Unknown Data Error";
}
}
}
- // ***** Event codes
- protected static final int EVENT_SETUP_DATA_CONNECTION_DONE = 1;
- protected static final int EVENT_GET_LAST_FAIL_DONE = 2;
- protected static final int EVENT_LINK_STATE_CHANGED = 3;
- protected static final int EVENT_DEACTIVATE_DONE = 4;
- protected static final int EVENT_FORCE_RETRY = 5;
+ // ***** Event codes for driving the state machine
+ protected static final int EVENT_RESET = 1;
+ protected static final int EVENT_CONNECT = 2;
+ protected static final int EVENT_SETUP_DATA_CONNECTION_DONE = 3;
+ protected static final int EVENT_GET_LAST_FAIL_DONE = 4;
+ protected static final int EVENT_DEACTIVATE_DONE = 5;
+ protected static final int EVENT_DISCONNECT = 6;
//***** Tag IDs for EventLog
protected static final int EVENT_LOG_BAD_DNS_ADDRESS = 50100;
-
//***** Member Variables
+ protected int mTag;
protected PhoneBase phone;
- protected Message onConnectCompleted;
- protected Message onDisconnect;
protected int cid;
protected String interfaceName;
protected String ipAddress;
protected String gatewayAddress;
protected String[] dnsServers;
- protected State state;
protected long createTime;
protected long lastFailTime;
protected FailCause lastFailCause;
protected static final String NULL_IP = "0.0.0.0";
Object userData;
- // receivedDisconnectReq is set when disconnect during activation
- protected boolean receivedDisconnectReq;
+ //***** Abstract methods
+ public abstract String toString();
- /* Instance Methods */
- protected abstract void onSetupConnectionCompleted(AsyncResult ar);
-
- protected abstract void onDeactivated(AsyncResult ar);
-
- protected abstract void disconnect(Message msg);
-
- protected abstract void notifyFail(FailCause cause, Message onCompleted);
-
- protected abstract void notifyDisconnect(Message msg);
-
- protected abstract void onLinkStateChanged(DataLink.LinkState linkState);
+ protected abstract void onConnect(ConnectionParams cp);
protected abstract FailCause getFailCauseFromRequest(int rilCause);
- public abstract String toString();
+ protected abstract boolean isDnsOk(String[] domainNameServers);
protected abstract void log(String s);
//***** Constructor
- protected DataConnection(PhoneBase phone) {
- super();
+ protected DataConnection(PhoneBase phone, String name) {
+ super(name);
+ if (DBG) log("DataConnection constructor E");
this.phone = phone;
- onConnectCompleted = null;
- onDisconnect = null;
this.cid = -1;
- receivedDisconnectReq = false;
this.dnsServers = new String[2];
clearSettings();
+
+ setDbg(false);
+ addState(mDefaultState);
+ addState(mInactiveState, mDefaultState);
+ addState(mActivatingState, mDefaultState);
+ addState(mActiveState, mDefaultState);
+ addState(mDisconnectingState, mDefaultState);
+ addState(mDisconnectingBadDnsState, mDefaultState);
+ setInitialState(mInactiveState);
+ if (DBG) log("DataConnection constructor X");
+ }
+
+ /**
+ * TearDown the data connection.
+ *
+ * @param o will be returned in AsyncResult.userObj
+ * and is either a DisconnectParams or ConnectionParams.
+ */
+ private void tearDownData(Object o) {
+ if (phone.mCM.getRadioState().isOn()) {
+ if (DBG) log("tearDownData radio is on, call deactivateDataCall");
+ phone.mCM.deactivateDataCall(cid, obtainMessage(EVENT_DEACTIVATE_DONE, o));
+ } else {
+ if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately");
+ sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, o));
+ }
+ }
+
+ /**
+ * Send the connectionCompletedMsg.
+ *
+ * @param cp is the ConnectionParams
+ * @param cause
+ */
+ private void notifyConnectCompleted(ConnectionParams cp, FailCause cause) {
+ Message connectionCompletedMsg = cp.onCompletedMsg;
+ if (connectionCompletedMsg == null) {
+ return;
+ }
+
+ long timeStamp = System.currentTimeMillis();
+ connectionCompletedMsg.arg1 = cid;
+
+ if (cause == FailCause.NONE) {
+ createTime = timeStamp;
+ AsyncResult.forMessage(connectionCompletedMsg);
+ } else {
+ lastFailCause = cause;
+ lastFailTime = timeStamp;
+ AsyncResult.forMessage(connectionCompletedMsg, cause, new Exception());
+ }
+ if (DBG) log("notifyConnection at " + timeStamp + " cause=" + cause);
+
+ connectionCompletedMsg.sendToTarget();
+ }
+
+ /**
+ * Send ar.userObj if its a message, which is should be back to originator.
+ *
+ * @param dp is the DisconnectParams.
+ */
+ private void notifyDisconnectCompleted(DisconnectParams dp) {
+ if (DBG) log("NotifyDisconnectCompleted");
+
+ Message msg = dp.onCompletedMsg;
+ AsyncResult.forMessage(msg);
+ msg.sendToTarget();
+
+ clearSettings();
}
- protected void setHttpProxy(String httpProxy, String httpPort) {
- if (httpProxy == null || httpProxy.length() == 0) {
- phone.setSystemProperty("net.gprs.http-proxy", null);
- return;
- }
+ /**
+ * Clear all settings called when entering mInactiveState.
+ */
+ protected void clearSettings() {
+ if (DBG) log("clearSettings");
- if (httpPort == null || httpPort.length() == 0) {
- httpPort = "8080"; // Default to port 8080
- }
-
- phone.setSystemProperty("net.gprs.http-proxy",
- "http://" + httpProxy + ":" + httpPort + "/");
- }
-
- public String getInterface() {
- return interfaceName;
- }
-
- public String getIpAddress() {
- return ipAddress;
- }
-
- public String getGatewayAddress() {
- return gatewayAddress;
- }
-
- public String[] getDnsServers() {
- return dnsServers;
- }
-
- public void clearSettings() {
- log("DataConnection.clearSettings()");
-
- this.state = State.INACTIVE;
this.createTime = -1;
this.lastFailTime = -1;
this.lastFailCause = FailCause.NONE;
- receivedDisconnectReq = false;
- onConnectCompleted = null;
interfaceName = null;
ipAddress = null;
gatewayAddress = null;
@@ -246,80 +361,441 @@
dnsServers[1] = null;
}
- protected void onGetLastFailCompleted(AsyncResult ar) {
- if (receivedDisconnectReq) {
- // Don't bother reporting the error if there's already a
- // pending disconnect request, since DataConnectionTracker
- // has already updated its state.
- notifyDisconnect(onDisconnect);
- } else {
- FailCause cause = FailCause.UNKNOWN;
+ /**
+ * Process setup completion.
+ *
+ * @param ar is the result
+ * @return SetupResult.
+ */
+ private SetupResult onSetupConnectionCompleted(AsyncResult ar) {
+ SetupResult result;
+ String[] response = ((String[]) ar.result);
+ ConnectionParams cp = (ConnectionParams) ar.userObj;
- if (ar.exception == null) {
- int rilFailCause = ((int[]) (ar.result))[0];
- cause = getFailCauseFromRequest(rilFailCause);
+ if (ar.exception != null) {
+ if (DBG) log("DataConnection Init failed " + ar.exception);
+
+ if (ar.exception instanceof CommandException
+ && ((CommandException) (ar.exception)).getCommandError()
+ == CommandException.Error.RADIO_NOT_AVAILABLE) {
+ result = SetupResult.ERR_BadCommand;
+ result.mFailCause = FailCause.RADIO_NOT_AVAILABLE;
+ } else {
+ result = SetupResult.ERR_Other;
}
- notifyFail(cause, onConnectCompleted);
- }
- }
-
- protected void onForceRetry() {
- if (receivedDisconnectReq) {
- notifyDisconnect(onDisconnect);
+ } else if (cp.tag != mTag) {
+ if (DBG) {
+ log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag);
+ }
+ result = SetupResult.ERR_Stale;
} else {
- notifyFail(FailCause.RADIO_ERROR_RETRY, onConnectCompleted);
+// log("onSetupConnectionCompleted received " + response.length + " response strings:");
+// for (int i = 0; i < response.length; i++) {
+// log(" response[" + i + "]='" + response[i] + "'");
+// }
+ if (response.length >= 2) {
+ cid = Integer.parseInt(response[0]);
+ interfaceName = response[1];
+ if (response.length > 2) {
+ ipAddress = response[2];
+ String prefix = "net." + interfaceName + ".";
+ gatewayAddress = SystemProperties.get(prefix + "gw");
+ dnsServers[0] = SystemProperties.get(prefix + "dns1");
+ dnsServers[1] = SystemProperties.get(prefix + "dns2");
+ if (DBG) {
+ log("interface=" + interfaceName + " ipAddress=" + ipAddress
+ + " gateway=" + gatewayAddress + " DNS1=" + dnsServers[0]
+ + " DNS2=" + dnsServers[1]);
+ }
+
+ if (isDnsOk(dnsServers)) {
+ result = SetupResult.SUCCESS;
+ } else {
+ result = SetupResult.ERR_BadDns;
+ }
+ } else {
+ result = SetupResult.SUCCESS;
+ }
+ } else {
+ result = SetupResult.ERR_Other;
+ }
+ }
+
+ if (DBG) log("DataConnection setup result='" + result + "' on cid=" + cid);
+ return result;
+ }
+
+ /**
+ * The parent state for all other states.
+ */
+ private class DcDefaultState extends HierarchicalState {
+ @Override
+ protected boolean processMessage(Message msg) {
+ AsyncResult ar;
+
+ switch (msg.what) {
+ case EVENT_RESET:
+ if (DBG) log("DcDefaultState: msg.what=EVENT_RESET");
+ clearSettings();
+ transitionTo(mInactiveState);
+ break;
+
+ case EVENT_CONNECT:
+ if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected");
+ ConnectionParams cp = (ConnectionParams) msg.obj;
+ notifyConnectCompleted(cp, FailCause.UNKNOWN);
+ break;
+
+ case EVENT_DISCONNECT:
+ if (DBG) log("DcDefaultState: msg.what=EVENT_DISCONNECT");
+ notifyDisconnectCompleted((DisconnectParams) msg.obj);
+ break;
+
+ default:
+ if (DBG) {
+ log("DcDefaultState: shouldn't happen but ignore msg.what=" + msg.what);
+ }
+ break;
+ }
+
+ return true;
}
}
+ private DcDefaultState mDefaultState = new DcDefaultState();
- @Override
- public void handleMessage(Message msg) {
- AsyncResult ar;
+ /**
+ * The state machine is inactive and expects a EVENT_CONNECT.
+ */
+ private class DcInactiveState extends HierarchicalState {
+ @Override protected void enter() {
+ mTag += 1;
+ }
+ @Override protected boolean processMessage(Message msg) {
+ boolean retVal;
- log("DataConnection.handleMessage()");
+ switch (msg.what) {
+ case EVENT_RESET:
+ if (DBG) {
+ log("DcInactiveState: msg.what=EVENT_RESET, ignore we're already reset");
+ }
+ retVal = true;
+ break;
- switch (msg.what) {
+ case EVENT_CONNECT:
+ if (DBG) log("DcInactiveState msg.what=EVENT_CONNECT");
+ ConnectionParams cp = (ConnectionParams) msg.obj;
+ cp.tag = mTag;
+ onConnect(cp);
+ transitionTo(mActivatingState);
+ retVal = true;
+ break;
- case EVENT_SETUP_DATA_CONNECTION_DONE:
- onSetupConnectionCompleted((AsyncResult) msg.obj);
- break;
-
- case EVENT_FORCE_RETRY:
- onForceRetry();
- break;
-
- case EVENT_GET_LAST_FAIL_DONE:
- onGetLastFailCompleted((AsyncResult) msg.obj);
- break;
-
- case EVENT_LINK_STATE_CHANGED:
- ar = (AsyncResult) msg.obj;
- DataLink.LinkState ls = (DataLink.LinkState) ar.result;
- onLinkStateChanged(ls);
- break;
-
- case EVENT_DEACTIVATE_DONE:
- onDeactivated((AsyncResult) msg.obj);
- break;
+ default:
+ if (DBG) log("DcInactiveState nothandled msg.what=" + msg.what);
+ retVal = false;
+ break;
+ }
+ return retVal;
}
}
+ private DcInactiveState mInactiveState = new DcInactiveState();
- public State getState() {
- log("DataConnection.getState()");
- return state;
+ /**
+ * The state machine is activating a connection.
+ */
+ private class DcActivatingState extends HierarchicalState {
+ @Override protected boolean processMessage(Message msg) {
+ boolean retVal;
+ AsyncResult ar;
+ ConnectionParams cp;
+
+ switch (msg.what) {
+ case EVENT_DISCONNECT:
+ if (DBG) log("DcActivatingState deferring msg.what=EVENT_DISCONNECT");
+ deferMessage(msg);
+ retVal = true;
+ break;
+
+ case EVENT_SETUP_DATA_CONNECTION_DONE:
+ if (DBG) log("DcActivatingState msg.what=EVENT_SETUP_DATA_CONNECTION_DONE");
+
+ ar = (AsyncResult) msg.obj;
+ cp = (ConnectionParams) ar.userObj;
+
+ SetupResult result = onSetupConnectionCompleted(ar);
+ switch (result) {
+ case SUCCESS:
+ // All is well
+ notifyConnectCompleted(cp, FailCause.NONE);
+ transitionTo(mActiveState);
+ break;
+ case ERR_BadCommand:
+ // Vendor ril rejected the command and didn't connect.
+ notifyConnectCompleted(cp, result.mFailCause);
+ transitionTo(mInactiveState);
+ break;
+ case ERR_BadDns:
+ // Connection succeeded but DNS info is bad so disconnect
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_BAD_DNS_ADDRESS,
+ dnsServers[0]);
+ tearDownData(cp);
+ transitionTo(mDisconnectingBadDnsState);
+ break;
+ case ERR_Other:
+ // Request the failure cause and process in this state
+ phone.mCM.getLastDataCallFailCause(
+ obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp));
+ break;
+ case ERR_Stale:
+ // Request is stale, ignore.
+ break;
+ default:
+ throw new RuntimeException("Unkown SetupResult, should not happen");
+ }
+ retVal = true;
+ break;
+
+ case EVENT_GET_LAST_FAIL_DONE:
+ ar = (AsyncResult) msg.obj;
+ cp = (ConnectionParams) ar.userObj;
+ FailCause cause = FailCause.UNKNOWN;
+
+ if (cp.tag == mTag) {
+ if (DBG) log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE");
+ if (ar.exception == null) {
+ int rilFailCause = ((int[]) (ar.result))[0];
+ cause = getFailCauseFromRequest(rilFailCause);
+ }
+ notifyConnectCompleted(cp, cause);
+ transitionTo(mInactiveState);
+ } else {
+ if (DBG) {
+ log("DcActivatingState EVENT_GET_LAST_FAIL_DONE is stale cp.tag="
+ + cp.tag + ", mTag=" + mTag);
+ }
+ }
+
+ retVal = true;
+ break;
+
+ default:
+ if (DBG) log("DcActivatingState not handled msg.what=" + msg.what);
+ retVal = false;
+ break;
+ }
+ return retVal;
+ }
+ }
+ private DcActivatingState mActivatingState = new DcActivatingState();
+
+ /**
+ * The state machine is connected, expecting an EVENT_DISCONNECT.
+ */
+ private class DcActiveState extends HierarchicalState {
+ @Override protected boolean processMessage(Message msg) {
+ boolean retVal;
+
+ switch (msg.what) {
+ case EVENT_DISCONNECT:
+ if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT");
+ DisconnectParams dp = (DisconnectParams) msg.obj;
+ dp.tag = mTag;
+ tearDownData(dp);
+ transitionTo(mDisconnectingState);
+ retVal = true;
+ break;
+
+ default:
+ if (DBG) log("DcActiveState nothandled msg.what=" + msg.what);
+ retVal = false;
+ break;
+ }
+ return retVal;
+ }
+ }
+ private DcActiveState mActiveState = new DcActiveState();
+
+ /**
+ * The state machine is disconnecting.
+ */
+ private class DcDisconnectingState extends HierarchicalState {
+ @Override protected boolean processMessage(Message msg) {
+ boolean retVal;
+
+ switch (msg.what) {
+ case EVENT_DEACTIVATE_DONE:
+ if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE");
+ AsyncResult ar = (AsyncResult) msg.obj;
+ DisconnectParams dp = (DisconnectParams) ar.userObj;
+ if (dp.tag == mTag) {
+ notifyDisconnectCompleted((DisconnectParams) ar.userObj);
+ transitionTo(mInactiveState);
+ } else {
+ if (DBG) log("DcDisconnectState EVENT_DEACTIVATE_DONE stale dp.tag="
+ + dp.tag + " mTag=" + mTag);
+ }
+ retVal = true;
+ break;
+
+ default:
+ if (DBG) log("DcDisconnectingState not handled msg.what=" + msg.what);
+ retVal = false;
+ break;
+ }
+ return retVal;
+ }
+ }
+ private DcDisconnectingState mDisconnectingState = new DcDisconnectingState();
+
+ /**
+ * The state machine is disconnecting after a bad dns setup
+ * was found in mInactivatingState.
+ */
+ private class DcDisconnectingBadDnsState extends HierarchicalState {
+ @Override protected boolean processMessage(Message msg) {
+ boolean retVal;
+
+ switch (msg.what) {
+ case EVENT_DEACTIVATE_DONE:
+ AsyncResult ar = (AsyncResult) msg.obj;
+ ConnectionParams cp = (ConnectionParams) ar.userObj;
+ if (cp.tag == mTag) {
+ if (DBG) log("DcDisconnectingBadDnsState msg.what=EVENT_DEACTIVATE_DONE");
+ notifyConnectCompleted(cp, FailCause.UNKNOWN);
+ transitionTo(mInactiveState);
+ } else {
+ if (DBG) log("DcDisconnectingBadDnsState EVENT_DEACTIVE_DONE stale dp.tag="
+ + cp.tag + ", mTag=" + mTag);
+ }
+ retVal = true;
+ break;
+
+ default:
+ if (DBG) log("DcDisconnectingBadDnsState not handled msg.what=" + msg.what);
+ retVal = false;
+ break;
+ }
+ return retVal;
+ }
+ }
+ private DcDisconnectingBadDnsState mDisconnectingBadDnsState = new DcDisconnectingBadDnsState();
+
+ // ******* public interface
+
+ /**
+ * Disconnect from the network.
+ */
+ public void reset() {
+ sendMessage(obtainMessage(EVENT_RESET));
}
+ /**
+ * Connect to the apn and return an AsyncResult in onCompletedMsg.
+ * Used for cellular networks that use Acess Point Names (APN) such
+ * as GSM networks.
+ *
+ * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
+ * With AsyncResult.userObj set to the original msg.obj,
+ * AsyncResult.result = FailCause and AsyncResult.exception = Exception().
+ * @param apn is the Acces Point Name to connect to
+ */
+ public void connect(Message onCompletedMsg, ApnSetting apn) {
+ sendMessage(obtainMessage(EVENT_CONNECT, new ConnectionParams(apn, onCompletedMsg)));
+ }
+
+ /**
+ * Connect to the apn and return an AsyncResult in onCompletedMsg.
+ *
+ * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
+ * With AsyncResult.userObj set to the original msg.obj,
+ * AsyncResult.result = FailCause and AsyncResult.exception = Exception().
+ */
+ public void connect(Message onCompletedMsg) {
+ sendMessage(obtainMessage(EVENT_CONNECT, new ConnectionParams(null, onCompletedMsg)));
+ }
+
+ /**
+ * Disconnect from the network.
+ *
+ * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
+ * With AsyncResult.userObj set to the original msg.obj.
+ */
+ public void disconnect(Message onCompletedMsg) {
+ sendMessage(obtainMessage(EVENT_DISCONNECT, new DisconnectParams(onCompletedMsg)));
+ }
+
+ // ****** The following are used for debugging.
+
+ /**
+ * @return true if the state machine is in the inactive state.
+ */
+ public boolean isInactive() {
+ boolean retVal = getCurrentState() == mInactiveState;
+ return retVal;
+ }
+
+ /**
+ * @return true if the state machine is in the inactive state.
+ */
+ public boolean isActive() {
+ boolean retVal = getCurrentState() == mActiveState;
+ return retVal;
+ }
+
+ /**
+ * @return the interface name as a string.
+ */
+ public String getInterface() {
+ return interfaceName;
+ }
+
+ /**
+ * @return the ip address as a string.
+ */
+ public String getIpAddress() {
+ return ipAddress;
+ }
+
+ /**
+ * @return the gateway address as a string.
+ */
+ public String getGatewayAddress() {
+ return gatewayAddress;
+ }
+
+ /**
+ * @return an array of associated DNS addresses.
+ */
+ public String[] getDnsServers() {
+ return dnsServers;
+ }
+
+ /**
+ * @return the current state as a string.
+ */
+ public String getStateAsString() {
+ String retVal = getCurrentState().getName();
+ return retVal;
+ }
+
+ /**
+ * @return the time of when this connection was created.
+ */
public long getConnectionTime() {
- log("DataConnection.getConnectionTime()");
return createTime;
}
+ /**
+ * @return the time of the last failure.
+ */
public long getLastFailTime() {
- log("DataConnection.getLastFailTime()");
return lastFailTime;
}
+ /**
+ * @return the last cause of failure.
+ */
public FailCause getLastFailCause() {
- log("DataConnection.getLastFailCause()");
return lastFailCause;
}
}
diff --git a/telephony/java/com/android/internal/telephony/DataLink.java b/telephony/java/com/android/internal/telephony/DataLink.java
deleted file mode 100644
index 8132d91..0000000
--- a/telephony/java/com/android/internal/telephony/DataLink.java
+++ /dev/null
@@ -1,40 +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;
-
-import android.os.Handler;
-import android.os.Registrant;
-
-/**
- * Base class representing the data link layer (eg, PPP).
- *
- * {@hide}
- */
-public abstract class DataLink extends Handler implements DataLinkInterface {
-
- /** Registrant for link status change notifications. */
- protected Registrant mLinkChangeRegistrant;
- protected DataConnectionTracker dataConnection;
-
- protected DataLink(DataConnectionTracker dc) {
- dataConnection = dc;
- }
-
- public void setOnLinkChange(Handler h, int what, Object obj) {
- mLinkChangeRegistrant = new Registrant(h, what, obj);
- }
-}
diff --git a/telephony/java/com/android/internal/telephony/DataLinkInterface.java b/telephony/java/com/android/internal/telephony/DataLinkInterface.java
deleted file mode 100644
index e8148a8..0000000
--- a/telephony/java/com/android/internal/telephony/DataLinkInterface.java
+++ /dev/null
@@ -1,77 +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;
-
-import android.database.Cursor;
-import android.os.Handler;
-
-/**
- * Data link interface.
- *
- * {@hide}
- */
-public interface DataLinkInterface {
- /**
- * Link state enumeration.
- *
- */
- enum LinkState {
- LINK_UNKNOWN,
- LINK_UP,
- LINK_DOWN,
- LINK_EXITED
- }
-
- /** Normal exit */
- final static int EXIT_OK = 0;
- /** Open failed */
- final static int EXIT_OPEN_FAILED = 7;
-
- /**
- * Sets the handler for link state change events.
- *
- * @param h Handler
- * @param what User-defined message code
- * @param obj User object
- */
- void setOnLinkChange(Handler h, int what, Object obj);
-
- /**
- * Sets up the data link.
- */
- void connect();
-
- /**
- * Tears down the data link.
- */
- void disconnect();
-
- /**
- * Returns the exit code for a data link failure.
- *
- * @return exit code
- */
- int getLastLinkExitCode();
-
- /**
- * Sets password information that may be required by the data link
- * (eg, PAP secrets).
- *
- * @param cursor cursor to carriers table
- */
- void setPasswordInfo(Cursor cursor);
-}
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index c113581..a8ad80e 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -28,7 +28,7 @@
import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.gsm.NetworkInfo;
-import com.android.internal.telephony.gsm.PdpConnection;
+import com.android.internal.telephony.gsm.GsmDataConnection;
import com.android.internal.telephony.test.SimulatedRadioControl;
import java.util.List;
@@ -1176,21 +1176,7 @@
void invokeOemRilRequestStrings(String[] strings, Message response);
/**
- * Get the current active PDP context list
- *
- * @deprecated
- * @param response <strong>On success</strong>, "response" bytes is
- * made available as:
- * (String[])(((AsyncResult)response.obj).result).
- * <strong>On failure</strong>,
- * (((AsyncResult)response.obj).result) == null and
- * (((AsyncResult)response.obj).exception) being an instance of
- * com.android.internal.telephony.gsm.CommandException
- */
- void getPdpContextList(Message response);
-
- /**
- * Get the current active Data Call list, substitutes getPdpContextList
+ * Get the current active Data Call list
*
* @param response <strong>On success</strong>, "response" bytes is
* made available as:
@@ -1203,19 +1189,11 @@
void getDataCallList(Message response);
/**
- * Get current mutiple PDP link status
- *
- * @deprecated
- * @return list of pdp link connections
- */
- List<PdpConnection> getCurrentPdpList ();
-
- /**
* Get current mutiple data connection status
*
* @return list of data connections
*/
- List<DataConnection> getCurrentDataConnectionList ();
+ List<DataConnection> getCurrentDataConnectionList();
/**
* Update the ServiceState CellLocation for current network registration.
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index 50dd76a..bad9ab3 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -35,7 +35,7 @@
import android.util.Log;
import com.android.internal.R;
-import com.android.internal.telephony.gsm.PdpConnection;
+import com.android.internal.telephony.gsm.GsmDataConnection;
import com.android.internal.telephony.test.SimulatedRadioControl;
import java.util.List;
@@ -692,16 +692,6 @@
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
}
- /**
- * This should only be called in GSM mode.
- * Only here for some backward compatibility
- * issues concerning the GSMPhone class.
- * @deprecated Always returns null.
- */
- public List<PdpConnection> getCurrentPdpList() {
- return null;
- }
-
public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
// This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java
index 3eadd81..d56d99f 100644
--- a/telephony/java/com/android/internal/telephony/PhoneProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java
@@ -34,7 +34,7 @@
import com.android.internal.telephony.cdma.CDMAPhone;
import com.android.internal.telephony.gsm.GSMPhone;
import com.android.internal.telephony.gsm.NetworkInfo;
-import com.android.internal.telephony.gsm.PdpConnection;
+import com.android.internal.telephony.gsm.GsmDataConnection;
import com.android.internal.telephony.test.SimulatedRadioControl;
import java.util.List;
@@ -564,24 +564,10 @@
mActivePhone.invokeOemRilRequestStrings(strings, response);
}
- /**
- * @deprecated
- */
- public void getPdpContextList(Message response) {
- mActivePhone.getPdpContextList(response);
- }
-
public void getDataCallList(Message response) {
mActivePhone.getDataCallList(response);
}
- /**
- * @deprecated
- */
- public List<PdpConnection> getCurrentPdpList() {
- return mActivePhone.getCurrentPdpList();
- }
-
public List<DataConnection> getCurrentDataConnectionList() {
return mActivePhone.getCurrentDataConnectionList();
}
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 279f57f..1ffcf9b 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -800,6 +800,7 @@
rr.mp.writeString(address);
rr.mp.writeInt(clirMode);
+ rr.mp.writeInt(0); // UUS information is absent
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
@@ -2824,6 +2825,13 @@
dc.numberPresentation = DriverCall.presentationFromCLIP(np);
dc.name = p.readString();
dc.namePresentation = p.readInt();
+ int uusInfoPresent = p.readInt();
+ if (uusInfoPresent == 1) {
+ // TODO: Copy the data to dc to forward to the apps.
+ p.readInt();
+ p.readInt();
+ p.createByteArray();
+ }
// Make sure there's a leading + on addresses with a TOA of 145
dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
index 53c0bef..4a4282fc 100644
--- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
@@ -224,11 +224,11 @@
createWakelock();
- int check_period = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.SMS_OUTGOING_CHECK_INTERVAL_MS,
+ int check_period = Settings.Secure.getInt(mResolver,
+ Settings.Secure.SMS_OUTGOING_CHECK_INTERVAL_MS,
DEFAULT_SMS_CHECK_PERIOD);
- int max_count = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.SMS_OUTGOING_CEHCK_MAX_COUNT,
+ int max_count = Settings.Secure.getInt(mResolver,
+ Settings.Secure.SMS_OUTGOING_CHECK_MAX_COUNT,
DEFAULT_SMS_MAX_COUNT);
mCounter = new SmsCounter(max_count, check_period);
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index 422cc19..d4b1652 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -561,15 +561,7 @@
public DataState getDataConnectionState() {
DataState ret = DataState.DISCONNECTED;
- if ((SystemProperties.get("adb.connected", "").length() > 0)
- && (SystemProperties.get("android.net.use-adb-networking", "")
- .length() > 0)) {
- // We're connected to an ADB host and we have USB networking
- // turned on. No matter what the radio state is,
- // we report data connected
-
- ret = DataState.CONNECTED;
- } else if (mSST == null) {
+ if (mSST == null) {
// Radio Technology Change is ongoning, dispose() and removeReferences() have
// already been called
@@ -665,13 +657,6 @@
mSST.disableLocationUpdates();
}
- /**
- * @deprecated
- */
- public void getPdpContextList(Message response) {
- getDataCallList(response);
- }
-
public void getDataCallList(Message response) {
mCM.getDataCallList(response);
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
index 4588f36..6c20204 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
@@ -16,221 +16,77 @@
package com.android.internal.telephony.cdma;
-import android.os.*;
-import android.util.EventLog;
+import android.os.Message;
import android.util.Log;
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.DataConnection;
-import com.android.internal.telephony.DataLink;
import com.android.internal.telephony.RILConstants;
-import com.android.internal.telephony.TelephonyEventLog;
/**
* {@hide}
- *
*/
public class CdmaDataConnection extends DataConnection {
private static final String LOG_TAG = "CDMA";
- private static final boolean DBG = true;
/** Fail cause of last Data Call activate from RIL_LastDataCallActivateFailCause */
private final static int PS_NET_DOWN_REASON_OPERATOR_DETERMINED_BARRING = 8;
- private final static int PS_NET_DOWN_REASON_UNKNOWN_APN = 27;
private final static int PS_NET_DOWN_REASON_AUTH_FAILED = 29;
private final static int PS_NET_DOWN_REASON_OPTION_NOT_SUPPORTED = 32;
private final static int PS_NET_DOWN_REASON_OPTION_UNSUBSCRIBED = 33;
-/** It is likely that the number of error codes listed below will be removed
- * in the foreseeable future. They have been added, but not agreed upon.
- *
- */
- private final static int PS_NET_DOWN_REASON_NOT_SPECIFIED = 0;
- private final static int PS_NET_DOWN_REASON_CLOSE_IN_PROGRESS = 1;
- private final static int PS_NET_DOWN_REASON_NW_INITIATED_TERMINATION = 2;
- private final static int PS_NET_DOWN_REASON_APP_PREEMPTED = 3;
- private final static int PS_NET_DOWN_REASON_LLC_SNDCP_FAILURE = 25;
- private final static int PS_NET_DOWN_REASON_INSUFFICIENT_RESOURCES = 26;
- private final static int PS_NET_DOWN_REASON_UNKNOWN_PDP = 28;
- private final static int PS_NET_DOWN_REASON_GGSN_REJECT = 30;
- private final static int PS_NET_DOWN_REASON_ACTIVATION_REJECT = 31;
- private final static int PS_NET_DOWN_REASON_OPTION_TEMP_OOO = 34;
- private final static int PS_NET_DOWN_REASON_NSAPI_ALREADY_USED = 35;
- private final static int PS_NET_DOWN_REASON_REGULAR_DEACTIVATION = 36;
- private final static int PS_NET_DOWN_REASON_QOS_NOT_ACCEPTED = 37;
- private final static int PS_NET_DOWN_REASON_NETWORK_FAILURE = 38;
- private final static int PS_NET_DOWN_REASON_UMTS_REATTACH_REQ = 39;
- private final static int PS_NET_DOWN_REASON_TFT_SEMANTIC_ERROR = 41;
- private final static int PS_NET_DOWN_REASON_TFT_SYNTAX_ERROR = 42;
- private final static int PS_NET_DOWN_REASON_UNKNOWN_PDP_CONTEXT = 43;
- private final static int PS_NET_DOWN_REASON_FILTER_SEMANTIC_ERROR = 44;
- private final static int PS_NET_DOWN_REASON_FILTER_SYNTAX_ERROR = 45;
- private final static int PS_NET_DOWN_REASON_PDP_WITHOUT_ACTIVE_TFT = 46;
- private final static int PS_NET_DOWN_REASON_INVALID_TRANSACTION_ID = 81;
- private final static int PS_NET_DOWN_REASON_MESSAGE_INCORRECT_SEMANTIC = 95;
- private final static int PS_NET_DOWN_REASON_INVALID_MANDATORY_INFO = 96;
- private final static int PS_NET_DOWN_REASON_MESSAGE_TYPE_UNSUPPORTED = 97;
- private final static int PS_NET_DOWN_REASON_MSG_TYPE_NONCOMPATIBLE_STATE = 98;
- private final static int PS_NET_DOWN_REASON_UNKNOWN_INFO_ELEMENT = 99;
- private final static int PS_NET_DOWN_REASON_CONDITIONAL_IE_ERROR = 100;
- private final static int PS_NET_DOWN_REASON_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 101;
- private final static int PS_NET_DOWN_REASON_PROTOCOL_ERROR = 111;
- private final static int PS_NET_DOWN_REASON_APN_TYPE_CONFLICT = 112;
- private final static int PS_NET_DOWN_REASON_UNKNOWN_CAUSE_CODE = 113;
- private final static int PS_NET_DOWN_REASON_INTERNAL_MIN = 200;
- private final static int PS_NET_DOWN_REASON_INTERNAL_ERROR = 201;
- private final static int PS_NET_DOWN_REASON_INTERNAL_CALL_ENDED = 202;
- private final static int PS_NET_DOWN_REASON_INTERNAL_UNKNOWN_CAUSE_CODE = 203;
- private final static int PS_NET_DOWN_REASON_INTERNAL_MAX = 204;
- private final static int PS_NET_DOWN_REASON_CDMA_LOCK = 500;
- private final static int PS_NET_DOWN_REASON_INTERCEPT = 501;
- private final static int PS_NET_DOWN_REASON_REORDER = 502;
- private final static int PS_NET_DOWN_REASON_REL_SO_REJ = 503;
- private final static int PS_NET_DOWN_REASON_INCOM_CALL = 504;
- private final static int PS_NET_DOWN_REASON_ALERT_STOP = 505;
- private final static int PS_NET_DOWN_REASON_ACTIVATION = 506;
- private final static int PS_NET_DOWN_REASON_MAX_ACCESS_PROBE = 507;
- private final static int PS_NET_DOWN_REASON_CCS_NOT_SUPPORTED_BY_BS = 508;
- private final static int PS_NET_DOWN_REASON_NO_RESPONSE_FROM_BS = 509;
- private final static int PS_NET_DOWN_REASON_REJECTED_BY_BS = 510;
- private final static int PS_NET_DOWN_REASON_INCOMPATIBLE = 511;
- private final static int PS_NET_DOWN_REASON_ALREADY_IN_TC = 512;
- private final static int PS_NET_DOWN_REASON_USER_CALL_ORIG_DURING_GPS = 513;
- private final static int PS_NET_DOWN_REASON_USER_CALL_ORIG_DURING_SMS = 514;
- private final static int PS_NET_DOWN_REASON_NO_CDMA_SRV = 515;
- private final static int PS_NET_DOWN_REASON_CONF_FAILED = 1000;
- private final static int PS_NET_DOWN_REASON_INCOM_REJ = 1001;
- private final static int PS_NET_DOWN_REASON_NO_GW_SRV = 1002;
- private final static int PS_NET_DOWN_REASON_CD_GEN_OR_BUSY = 1500;
- private final static int PS_NET_DOWN_REASON_CD_BILL_OR_AUTH = 1501;
- private final static int PS_NET_DOWN_REASON_CHG_HDR = 1502;
- private final static int PS_NET_DOWN_REASON_EXIT_HDR = 1503;
- private final static int PS_NET_DOWN_REASON_HDR_NO_SESSION = 1504;
- private final static int PS_NET_DOWN_REASON_HDR_ORIG_DURING_GPS_FIX = 1505;
- private final static int PS_NET_DOWN_REASON_HDR_CS_TIMEOUT = 1506;
- private final static int PS_NET_DOWN_REASON_HDR_RELEASED_BY_CM = 1507;
- private final static int PS_NET_DOWN_REASON_CLIENT_END = 2000;
- private final static int PS_NET_DOWN_REASON_NO_SRV = 2001;
- private final static int PS_NET_DOWN_REASON_FADE = 2002;
- private final static int PS_NET_DOWN_REASON_REL_NORMAL = 2003;
- private final static int PS_NET_DOWN_REASON_ACC_IN_PROG = 2004;
- private final static int PS_NET_DOWN_REASON_ACC_FAIL = 2005;
- private final static int PS_NET_DOWN_REASON_REDIR_OR_HANDOFF = 2006;
-
- // ***** Instance Variables
// ***** Constructor
- CdmaDataConnection(CDMAPhone phone) {
- super(phone);
-
- if (DBG) log("CdmaDataConnection <constructor>");
+ private CdmaDataConnection(CDMAPhone phone, String name) {
+ super(phone, name);
}
/**
- * Setup a data connection
+ * Create the connection object
*
- * @param onCompleted
- * notify success or not after down
+ * @param phone
+ * @return CdmaDataConnection that was created.
*/
- void connect(Message onCompleted) {
+ static CdmaDataConnection makeDataConnection(CDMAPhone phone) {
+ synchronized (mCountLock) {
+ mCount += 1;
+ }
+ CdmaDataConnection cdmaDc = new CdmaDataConnection(phone, "CdmaDataConnection-" + mCount);
+ cdmaDc.start();
+ if (DBG) cdmaDc.log("Made " + cdmaDc.getName());
+ return cdmaDc;
+ }
+
+ /**
+ * Begin setting up a data connection, calls setupDataCall
+ * and the ConnectionParams will be returned with the
+ * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj.
+ *
+ * @param cp is the connection parameters
+ */
+ @Override
+ protected void onConnect(ConnectionParams cp) {
if (DBG) log("CdmaDataConnection Connecting...");
- state = State.ACTIVATING;
- onConnectCompleted = onCompleted;
createTime = -1;
lastFailTime = -1;
lastFailCause = FailCause.NONE;
- receivedDisconnectReq = false;
+
+ // msg.obj will be returned in AsyncResult.userObj;
+ Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
+ msg.obj = cp;
phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_CDMA),
Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), null, null,
- null, Integer.toString(RILConstants.SETUP_DATA_AUTH_PAP_CHAP),
- obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE));
+ null, Integer.toString(RILConstants.SETUP_DATA_AUTH_PAP_CHAP), msg);
}
- private void tearDownData(Message msg) {
- if (phone.mCM.getRadioState().isOn()) {
- phone.mCM.deactivateDataCall(cid, obtainMessage(EVENT_DEACTIVATE_DONE, msg));
- }
- }
-
- protected void disconnect(Message msg) {
- onDisconnect = msg;
- if (state == State.ACTIVE) {
- tearDownData(msg);
- } else if (state == State.ACTIVATING) {
- receivedDisconnectReq = true;
- } else {
- // state == INACTIVE. Nothing to do, so notify immediately.
- notifyDisconnect(msg);
- }
- }
-
-
+ @Override
public String toString() {
- return "State=" + state + " create=" + createTime + " lastFail="
- + lastFailTime + " lastFailCause=" + lastFailCause;
+ return "State=" + getCurrentState().getName() + " create=" + createTime + " lastFail="
+ + lastFailTime + " lastFasilCause=" + lastFailCause;
}
-
- protected void notifyFail(FailCause cause, Message onCompleted) {
- if (onCompleted == null) {
- return;
- }
- state = State.INACTIVE;
- lastFailCause = cause;
- lastFailTime = System.currentTimeMillis();
- onConnectCompleted = null;
-
- if(DBG) {
- log("Notify data connection fail at " + lastFailTime +
- " due to " + lastFailCause);
- }
-
- AsyncResult.forMessage(onCompleted, cause, new Exception());
- onCompleted.sendToTarget();
- }
-
- protected void notifySuccess(Message onCompleted) {
- if (onCompleted == null) {
- return;
- }
-
- state = State.ACTIVE;
- createTime = System.currentTimeMillis();
- onConnectCompleted = null;
- onCompleted.arg1 = cid;
-
- if (DBG) log("Notify data connection success at " + createTime);
-
- AsyncResult.forMessage(onCompleted);
- onCompleted.sendToTarget();
- }
-
- protected void notifyDisconnect(Message msg) {
- if (DBG) log("Notify data connection disconnect");
-
- if (msg != null) {
- AsyncResult.forMessage(msg);
- msg.sendToTarget();
- }
- clearSettings();
- }
-
- protected void onLinkStateChanged(DataLink.LinkState linkState) {
- switch (linkState) {
- case LINK_UP:
- notifySuccess(onConnectCompleted);
- break;
-
- case LINK_DOWN:
- case LINK_EXITED:
- phone.mCM.getLastDataCallFailCause(obtainMessage(EVENT_GET_LAST_FAIL_DONE));
- break;
- }
- }
-
+ @Override
protected FailCause getFailCauseFromRequest(int rilCause) {
FailCause cause;
@@ -253,73 +109,19 @@
return cause;
}
- protected void log(String s) {
- Log.d(LOG_TAG, "[CdmaDataConnection] " + s);
- }
-
@Override
- protected void onDeactivated(AsyncResult ar) {
- notifyDisconnect((Message) ar.userObj);
- if (DBG) log("CDMA Connection Deactivated");
- }
-
- @Override
- protected void onSetupConnectionCompleted(AsyncResult ar) {
- if (ar.exception != null) {
- Log.e(LOG_TAG, "CdmaDataConnection Init failed " + ar.exception);
-
- if (receivedDisconnectReq) {
- // Don't bother reporting the error if there's already a
- // pending disconnect request, since DataConnectionTracker
- // has already updated its state.
- notifyDisconnect(onDisconnect);
- } else {
- if (ar.exception instanceof CommandException
- && ((CommandException) (ar.exception)).getCommandError()
- == CommandException.Error.RADIO_NOT_AVAILABLE) {
- notifyFail(FailCause.RADIO_NOT_AVAILABLE, onConnectCompleted);
- } else {
- phone.mCM.getLastDataCallFailCause(obtainMessage(EVENT_GET_LAST_FAIL_DONE));
- }
- }
+ protected boolean isDnsOk(String[] domainNameServers) {
+ if ((NULL_IP.equals(domainNameServers[0])
+ && NULL_IP.equals(domainNameServers[1])
+ && !((CDMAPhone) phone).isDnsCheckDisabled())) {
+ return false;
} else {
- if (receivedDisconnectReq) {
- // Don't bother reporting success if there's already a
- // pending disconnect request, since DataConnectionTracker
- // has already updated its state.
- tearDownData(onDisconnect);
- } else {
- String[] response = ((String[]) ar.result);
- cid = Integer.parseInt(response[0]);
-
- if (response.length > 2) {
- interfaceName = response[1];
- ipAddress = response[2];
- String prefix = "net." + interfaceName + ".";
- gatewayAddress = SystemProperties.get(prefix + "gw");
- dnsServers[0] = SystemProperties.get(prefix + "dns1");
- dnsServers[1] = SystemProperties.get(prefix + "dns2");
- if (DBG) {
- log("interface=" + interfaceName + " ipAddress=" + ipAddress
- + " gateway=" + gatewayAddress + " DNS1=" + dnsServers[0]
- + " DNS2=" + dnsServers[1]);
- }
-
- if (NULL_IP.equals(dnsServers[0]) && NULL_IP.equals(dnsServers[1])
- && !((CDMAPhone) phone).isDnsCheckDisabled()) {
- // Work around a race condition where QMI does not fill in DNS:
- // Deactivate PDP and let DataConnectionTracker retry.
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_BAD_DNS_ADDRESS,
- dnsServers[0]);
- phone.mCM.deactivateDataCall(cid, obtainMessage(EVENT_FORCE_RETRY));
- return;
- }
- }
-
- onLinkStateChanged(DataLink.LinkState.LINK_UP);
-
- if (DBG) log("CdmaDataConnection setup on cid = " + cid);
- }
+ return true;
}
}
+
+ @Override
+ protected void log(String s) {
+ Log.d(LOG_TAG, "[" + getName() + "] " + s);
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index b63b0c4..979b8ba 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -386,7 +386,7 @@
Message msg = obtainMessage(EVENT_DISCONNECT_DONE, reason);
conn.disconnect(msg);
} else {
- conn.clearSettings();
+ conn.reset();
}
}
}
@@ -403,7 +403,7 @@
private CdmaDataConnection findFreeDataConnection() {
for (DataConnection connBase : dataConnectionList) {
CdmaDataConnection conn = (CdmaDataConnection) connBase;
- if (conn.getState() == DataConnection.State.INACTIVE) {
+ if (conn.isInactive()) {
return conn;
}
}
@@ -801,7 +801,7 @@
CdmaDataConnection dataConn;
for (int i = 0; i < DATA_CONNECTION_POOL_SIZE; i++) {
- dataConn = new CdmaDataConnection(mCdmaPhone);
+ dataConn = CdmaDataConnection.makeDataConnection(mCdmaPhone);
dataConnectionList.add(dataConn);
}
}
@@ -822,11 +822,9 @@
mRetryMgr.resetRetryCount();
CdmaCellLocation loc = (CdmaCellLocation)(phone.getCellLocation());
- int bsid = (loc != null) ? loc.getBaseStationId() : -1;
-
- EventLog.List val = new EventLog.List(bsid,
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CDMA_DATA_SETUP_FAILED,
+ loc != null ? loc.getBaseStationId() : -1,
TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CDMA_DATA_SETUP_FAILED, val);
}
trySetupData(Phone.REASON_CDMA_DATA_DETACHED);
}
@@ -865,10 +863,9 @@
private void writeEventLogCdmaDataDrop() {
CdmaCellLocation loc = (CdmaCellLocation)(phone.getCellLocation());
- int bsid = (loc != null) ? loc.getBaseStationId() : -1;
- EventLog.List val = new EventLog.List(bsid,
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CDMA_DATA_DROP,
+ loc != null ? loc.getBaseStationId() : -1,
TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CDMA_DATA_DROP, val);
}
protected void onDataStateChanged(AsyncResult ar) {
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index aee45bff..ed93aea 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -167,7 +167,8 @@
// 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)) {
+ (SmsEnvelope.TELESERVICE_WEMT != teleService) &&
+ (SmsEnvelope.MESSAGE_TYPE_BROADCAST != sms.getMessageType())) {
return Intents.RESULT_SMS_UNSUPPORTED;
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index 8698b38..af3cbd5 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -537,11 +537,9 @@
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
-
- EventLog.List val = new EventLog.List(
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF,
dcTracker.getStateInString(),
- (dcTracker.getAnyDataEnabled() ? 1 : 0) );
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF, val);
+ dcTracker.getAnyDataEnabled() ? 1 : 0);
}
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
@@ -1465,10 +1463,10 @@
*/
long gained = c.getTimeInMillis() - System.currentTimeMillis();
long timeSinceLastUpdate = SystemClock.elapsedRealtime() - mSavedAtTime;
- int nitzUpdateSpacing = Settings.Gservices.getInt(cr,
- Settings.Gservices.NITZ_UPDATE_SPACING, mNitzUpdateSpacing);
- int nitzUpdateDiff = Settings.Gservices.getInt(cr,
- Settings.Gservices.NITZ_UPDATE_DIFF, mNitzUpdateDiff);
+ int nitzUpdateSpacing = Settings.Secure.getInt(cr,
+ Settings.Secure.NITZ_UPDATE_SPACING, mNitzUpdateSpacing);
+ int nitzUpdateDiff = Settings.Secure.getInt(cr,
+ Settings.Secure.NITZ_UPDATE_DIFF, mNitzUpdateDiff);
if ((mSavedAtTime == 0) || (timeSinceLastUpdate > nitzUpdateSpacing)
|| (Math.abs(gained) > nitzUpdateDiff)) {
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index 3e491d1..403b7a1 100755
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -458,11 +458,22 @@
* {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#TELESERVICE_VMN},
* {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#TELESERVICE_WAP}
*/
- public int getTeleService() {
+ /* package */ int getTeleService() {
return mEnvelope.teleService;
}
/**
+ * Returns the message type of the message.
+ * @return the message type:
+ * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#MESSAGE_TYPE_POINT_TO_POINT},
+ * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#MESSAGE_TYPE_BROADCAST},
+ * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#MESSAGE_TYPE_ACKNOWLEDGE},
+ */
+ /* package */ int getMessageType() {
+ return mEnvelope.messageType;
+ }
+
+ /**
* Decodes pdu to an empty SMS object.
* In the CDMA case the pdu is just an internal byte stream representation
* of the SMS Java-object.
diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
index 2843cde..2bb7968 100755
--- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -293,15 +293,7 @@
public DataState getDataConnectionState() {
DataState ret = DataState.DISCONNECTED;
- if ((SystemProperties.get("adb.connected", "").length() > 0)
- && (SystemProperties.get("android.net.use-adb-networking", "")
- .length() > 0)) {
- // We're connected to an ADB host and we have USB networking
- // turned on. No matter what the radio state is,
- // we report data connected
-
- ret = DataState.CONNECTED;
- } else if (mSST == null) {
+ if (mSST == null) {
// Radio Technology Change is ongoning, dispose() and removeReferences() have
// already been called
@@ -1058,33 +1050,10 @@
return mCT.getMute();
}
- /**
- * @deprecated Do not use.
- */
- @Deprecated
- public void getPdpContextList(Message response) {
- getDataCallList(response);
- }
-
public void getDataCallList(Message response) {
mCM.getDataCallList(response);
}
- /**
- * @deprecated Do not use.
- */
- @Deprecated
- public List<PdpConnection> getCurrentPdpList() {
- ArrayList<DataConnection> connections = new ArrayList<DataConnection>();
- ArrayList<PdpConnection> pdp_list = new ArrayList<PdpConnection>();
-
- for(int n = 0; n < connections.size(); n++) {
- pdp_list.add((PdpConnection) connections.get(n));
- }
-
- return pdp_list;
- }
-
public List<DataConnection> getCurrentDataConnectionList () {
return mDataConnection.getAllDataConnections();
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
index 91c089e..f4b9931 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
@@ -868,13 +868,10 @@
causeCode == CallFailCause.QOS_NOT_AVAIL ||
causeCode == CallFailCause.BEARER_NOT_AVAIL ||
causeCode == CallFailCause.ERROR_UNSPECIFIED) {
- int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
-
- EventLog.List val = new EventLog.List(causeCode, cid,
- TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CALL_DROP, val);
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CALL_DROP,
+ causeCode, loc != null ? loc.getCid() : -1,
+ TelephonyManager.getDefault().getNetworkType());
}
for (int i = 0, s = droppedDuringPoll.size()
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
new file mode 100644
index 0000000..905d5e3
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
@@ -0,0 +1,226 @@
+/*
+ * 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.gsm;
+
+import android.os.Message;
+import android.util.Log;
+
+import com.android.common.Patterns;
+import com.android.internal.telephony.DataConnection;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.RILConstants;
+
+/**
+ * {@hide}
+ */
+public class GsmDataConnection extends DataConnection {
+
+ private static final String LOG_TAG = "GSM";
+
+ /** Fail cause of last PDP activate, from RIL_LastPDPActivateFailCause */
+ private static final int PDP_FAIL_OPERATOR_BARRED = 0x08;
+ private static final int PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A;
+ private static final int PDP_FAIL_MISSING_UKNOWN_APN = 0x1B;
+ private static final int PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C;
+ private static final int PDP_FAIL_USER_AUTHENTICATION = 0x1D;
+ private static final int PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E;
+ private static final int PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F;
+ private static final int PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20;
+ private static final int PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21;
+ private static final int PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22;
+ private static final int PDP_FAIL_NSAPI_IN_USE = 0x23;
+ private static final int PDP_FAIL_PROTOCOL_ERRORS = 0x6F;
+ private static final int PDP_FAIL_ERROR_UNSPECIFIED = 0xffff;
+
+ private static final int PDP_FAIL_REGISTRATION_FAIL = -1;
+ private static final int PDP_FAIL_GPRS_REGISTRATION_FAIL = -2;
+
+ //***** Instance Variables
+ private ApnSetting apn;
+
+ //***** Constructor
+ private GsmDataConnection(GSMPhone phone, String name) {
+ super(phone, name);
+ }
+
+ /**
+ * Create the connection object
+ *
+ * @param phone
+ * @return GsmDataConnection that was created.
+ */
+ static GsmDataConnection makeDataConnection(GSMPhone phone) {
+ synchronized (mCountLock) {
+ mCount += 1;
+ }
+ GsmDataConnection gsmDc = new GsmDataConnection(phone, "GsmDataConnection-" + mCount);
+ gsmDc.start();
+ if (DBG) gsmDc.log("Made " + gsmDc.getName());
+ return gsmDc;
+ }
+
+ /**
+ * Begin setting up a data connection, calls setupDataCall
+ * and the ConnectionParams will be returned with the
+ * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj.
+ *
+ * @param cp is the connection parameters
+ */
+ @Override
+ protected
+ void onConnect(ConnectionParams cp) {
+ apn = cp.apn;
+
+ if (DBG) log("Connecting to carrier: '" + apn.carrier
+ + "' APN: '" + apn.apn
+ + "' proxy: '" + apn.proxy + "' port: '" + apn.port);
+
+ setHttpProxy (apn.proxy, apn.port);
+
+ createTime = -1;
+ lastFailTime = -1;
+ lastFailCause = FailCause.NONE;
+
+ // msg.obj will be returned in AsyncResult.userObj;
+ Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
+ msg.obj = cp;
+
+ int authType = apn.authType;
+ if (authType == -1) {
+ authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
+ RILConstants.SETUP_DATA_AUTH_NONE;
+ }
+ phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
+ Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), apn.apn, apn.user,
+ apn.password, Integer.toString(authType), msg);
+ }
+
+ @Override
+ protected void clearSettings() {
+ super.clearSettings();
+ apn = null;
+ }
+
+ @Override
+ public String toString() {
+ return "State=" + getCurrentState().getName() + " Apn=" + apn +
+ " create=" + createTime + " lastFail=" + lastFailTime +
+ " lastFailCause=" + lastFailCause;
+ }
+
+ @Override
+ protected FailCause getFailCauseFromRequest(int rilCause) {
+ FailCause cause;
+
+ switch (rilCause) {
+ case PDP_FAIL_OPERATOR_BARRED:
+ cause = FailCause.OPERATOR_BARRED;
+ break;
+ case PDP_FAIL_INSUFFICIENT_RESOURCES:
+ cause = FailCause.INSUFFICIENT_RESOURCES;
+ break;
+ case PDP_FAIL_MISSING_UKNOWN_APN:
+ cause = FailCause.MISSING_UKNOWN_APN;
+ break;
+ case PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE:
+ cause = FailCause.UNKNOWN_PDP_ADDRESS;
+ break;
+ case PDP_FAIL_USER_AUTHENTICATION:
+ cause = FailCause.USER_AUTHENTICATION;
+ break;
+ case PDP_FAIL_ACTIVATION_REJECT_GGSN:
+ cause = FailCause.ACTIVATION_REJECT_GGSN;
+ break;
+ case PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED:
+ cause = FailCause.ACTIVATION_REJECT_UNSPECIFIED;
+ break;
+ case PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER:
+ cause = FailCause.SERVICE_OPTION_OUT_OF_ORDER;
+ break;
+ case PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED:
+ cause = FailCause.SERVICE_OPTION_NOT_SUPPORTED;
+ break;
+ case PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED:
+ cause = FailCause.SERVICE_OPTION_NOT_SUBSCRIBED;
+ break;
+ case PDP_FAIL_NSAPI_IN_USE:
+ cause = FailCause.NSAPI_IN_USE;
+ break;
+ case PDP_FAIL_PROTOCOL_ERRORS:
+ cause = FailCause.PROTOCOL_ERRORS;
+ break;
+ case PDP_FAIL_ERROR_UNSPECIFIED:
+ cause = FailCause.UNKNOWN;
+ break;
+ case PDP_FAIL_REGISTRATION_FAIL:
+ cause = FailCause.REGISTRATION_FAIL;
+ break;
+ case PDP_FAIL_GPRS_REGISTRATION_FAIL:
+ cause = FailCause.GPRS_REGISTRATION_FAIL;
+ break;
+ default:
+ cause = FailCause.UNKNOWN;
+ }
+ return cause;
+ }
+
+ @Override
+ protected boolean isDnsOk(String[] domainNameServers) {
+ if (NULL_IP.equals(dnsServers[0]) && NULL_IP.equals(dnsServers[1])
+ && !((GSMPhone) phone).isDnsCheckDisabled()) {
+ // Work around a race condition where QMI does not fill in DNS:
+ // Deactivate PDP and let DataConnectionTracker retry.
+ // Do not apply the race condition workaround for MMS APN
+ // if Proxy is an IP-address.
+ // Otherwise, the default APN will not be restored anymore.
+ if (!apn.types[0].equals(Phone.APN_TYPE_MMS)
+ || !isIpAddress(apn.mmsProxy)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected void log(String s) {
+ Log.d(LOG_TAG, "[" + getName() + "] " + s);
+ }
+
+ public ApnSetting getApn() {
+ return this.apn;
+ }
+
+ private void setHttpProxy(String httpProxy, String httpPort) {
+ if (httpProxy == null || httpProxy.length() == 0) {
+ phone.setSystemProperty("net.gprs.http-proxy", null);
+ return;
+ }
+
+ if (httpPort == null || httpPort.length() == 0) {
+ httpPort = "8080"; // Default to port 8080
+ }
+
+ phone.setSystemProperty("net.gprs.http-proxy",
+ "http://" + httpProxy + ":" + httpPort + "/");
+ }
+
+ private boolean isIpAddress(String address) {
+ if (address == null) return false;
+
+ return Patterns.IP_ADDRESS.matcher(apn.mmsProxy).matches();
+ }
+}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index fb7aa3d..3f52eff 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -126,8 +126,8 @@
*/
private ArrayList<DataConnection> pdpList;
- /** Currently active PdpConnection */
- private PdpConnection mActivePdp;
+ /** Currently active DataConnection */
+ private GsmDataConnection mActivePdp;
/** Is packet service restricted by network */
private boolean mIsPsRestricted = false;
@@ -137,7 +137,7 @@
// TODO: Increase this to match the max number of simultaneous
// PDP contexts we plan to support.
/**
- * Pool size of PdpConnection objects.
+ * Pool size of DataConnection objects.
*/
private static final int PDP_CONNECTION_POOL_SIZE = 1;
@@ -382,7 +382,7 @@
}
/**
- * Formerly this method was ArrayList<PdpConnection> getAllPdps()
+ * Formerly this method was ArrayList<GsmDataConnection> getAllPdps()
*/
public ArrayList<DataConnection> getAllDataConnections() {
ArrayList<DataConnection> pdps = (ArrayList<DataConnection>)pdpList.clone();
@@ -452,7 +452,7 @@
waitingApns = buildWaitingApns();
if (waitingApns.isEmpty()) {
if (DBG) log("No APN found");
- notifyNoData(PdpConnection.FailCause.MISSING_UKNOWN_APN);
+ notifyNoData(GsmDataConnection.FailCause.MISSING_UKNOWN_APN);
return false;
} else {
log ("Create from allApns : " + apnListToString(allApns));
@@ -487,7 +487,7 @@
* there is no mechanism for abandoning an INITING/CONNECTING session,
* but would likely involve cancelling pending async requests or
* setting a flag or new state to ignore them when they came in
- * @param tearDown true if the underlying PdpConnection should be
+ * @param tearDown true if the underlying GsmDataConnection should be
* disconnected.
* @param reason reason for the clean up.
*/
@@ -505,12 +505,11 @@
setState(State.DISCONNECTING);
for (DataConnection conn : pdpList) {
- PdpConnection pdp = (PdpConnection) conn;
if (tearDown) {
Message msg = obtainMessage(EVENT_DISCONNECT_DONE, reason);
- pdp.disconnect(msg);
+ conn.disconnect(msg);
} else {
- pdp.clearSettings();
+ conn.reset();
}
}
stopNetStatPoll();
@@ -564,10 +563,10 @@
return result;
}
- private PdpConnection findFreePdp() {
+ private GsmDataConnection findFreePdp() {
for (DataConnection conn : pdpList) {
- PdpConnection pdp = (PdpConnection) conn;
- if (pdp.getState() == DataConnection.State.INACTIVE) {
+ GsmDataConnection pdp = (GsmDataConnection) conn;
+ if (pdp.isInactive()) {
return pdp;
}
}
@@ -576,13 +575,13 @@
private boolean setupData(String reason) {
ApnSetting apn;
- PdpConnection pdp;
+ GsmDataConnection pdp;
apn = getNextApn();
if (apn == null) return false;
pdp = findFreePdp();
if (pdp == null) {
- if (DBG) log("setupData: No free PdpConnection found!");
+ if (DBG) log("setupData: No free GsmDataConnection found!");
return false;
}
mActiveApn = apn;
@@ -591,7 +590,7 @@
Message msg = obtainMessage();
msg.what = EVENT_DATA_SETUP_COMPLETE;
msg.obj = reason;
- pdp.connect(apn, msg);
+ pdp.connect(msg, apn);
setState(State.INITING);
phone.notifyDataConnection(reason);
@@ -711,12 +710,10 @@
Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting");
// Add an event log when the network drops PDP
- int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
- EventLog.List val = new EventLog.List(cid,
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP,
+ loc != null ? loc.getCid() : -1,
TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val);
cleanUpConnection(true, null);
return;
@@ -734,12 +731,10 @@
+ " Reconnecting");
// Log the network drop on the event log.
- int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
- EventLog.List val = new EventLog.List(cid,
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP,
+ loc != null ? loc.getCid() : -1,
TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val);
cleanUpConnection(true, null);
}
@@ -778,8 +773,8 @@
private void doRecovery() {
if (state == State.CONNECTED) {
- int maxPdpReset = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT,
+ int maxPdpReset = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT,
DEFAULT_MAX_PDP_RESET_FAIL);
if (mPdpResetCount < maxPdpReset) {
mPdpResetCount++;
@@ -880,8 +875,8 @@
}
}
- int watchdogTrigger = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
+ int watchdogTrigger = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
NUMBER_SENT_PACKETS_OF_HANG);
if (sentSinceLastRecv >= watchdogTrigger) {
@@ -891,8 +886,8 @@
sentSinceLastRecv);
}
- int noRecvPollLimit = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_ERROR_POLL_COUNT, NO_RECV_POLL_LIMIT);
+ int noRecvPollLimit = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_ERROR_POLL_COUNT, NO_RECV_POLL_LIMIT);
if (mNoRecvPollCount < noRecvPollLimit) {
// It's possible the PDP context went down and we weren't notified.
@@ -903,8 +898,8 @@
mNoRecvPollCount++;
// Slow down the poll interval to let things happen
- netStatPollPeriod = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS,
+ netStatPollPeriod = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS,
POLL_NETSTAT_SLOW_MILLIS);
} else {
if (DBG) log("Sent " + String.valueOf(sentSinceLastRecv) +
@@ -923,11 +918,11 @@
} else {
mNoRecvPollCount = 0;
if (mIsScreenOn) {
- netStatPollPeriod = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS);
+ netStatPollPeriod = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS);
} else {
- netStatPollPeriod = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS,
+ netStatPollPeriod = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS,
POLL_NETSTAT_SCREEN_OFF_MILLIS);
}
}
@@ -941,10 +936,10 @@
private void runPingTest () {
int status = -1;
try {
- String address = Settings.Gservices.getString(mResolver,
- Settings.Gservices.PDP_WATCHDOG_PING_ADDRESS);
- int deadline = Settings.Gservices.getInt(mResolver,
- Settings.Gservices.PDP_WATCHDOG_PING_DEADLINE, DEFAULT_PING_DEADLINE);
+ String address = Settings.Secure.getString(mResolver,
+ Settings.Secure.PDP_WATCHDOG_PING_ADDRESS);
+ int deadline = Settings.Secure.getInt(mResolver,
+ Settings.Secure.PDP_WATCHDOG_PING_DEADLINE, DEFAULT_PING_DEADLINE);
if (DBG) log("pinging " + address + " for " + deadline + "s");
if (address != null && !NULL_IP.equals(address)) {
Process p = Runtime.getRuntime()
@@ -974,13 +969,8 @@
* seems like it deserves an error notification.
* Transient errors are ignored
*/
- private boolean shouldPostNotification(PdpConnection.FailCause cause) {
- boolean shouldPost = true;
- // TODO CHECK
- // if (dataLink != null) {
- // shouldPost = dataLink.getLastLinkExitCode() != DataLink.EXIT_OPEN_FAILED;
- //}
- return (shouldPost && cause != PdpConnection.FailCause.UNKNOWN);
+ private boolean shouldPostNotification(GsmDataConnection.FailCause cause) {
+ return (cause != GsmDataConnection.FailCause.UNKNOWN);
}
/**
@@ -1046,7 +1036,7 @@
}
}
- private void notifyNoData(PdpConnection.FailCause lastFailCauseCode) {
+ private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode) {
setState(State.FAILED);
}
@@ -1069,7 +1059,7 @@
mRetryMgr.resetRetryCount();
// TODO: To support simultaneous PDP contexts, this should really only call
- // cleanUpConnection if it needs to free up a PdpConnection.
+ // cleanUpConnection if it needs to free up a GsmDataConnection.
cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
}
@@ -1149,19 +1139,15 @@
// that the existing connection may service that type, in which
// case we should try the next type, etc.
} else {
- PdpConnection.FailCause cause;
- cause = (PdpConnection.FailCause) (ar.result);
+ GsmDataConnection.FailCause cause;
+ cause = (GsmDataConnection.FailCause) (ar.result);
if(DBG) log("PDP setup failed " + cause);
// Log this failure to the Event Logs.
if (cause.isEventLoggable()) {
- int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
-
- EventLog.List val = new EventLog.List(
- cause.ordinal(), cid,
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_RADIO_PDP_SETUP_FAIL,
+ cause.ordinal(), loc != null ? loc.getCid() : -1,
TelephonyManager.getDefault().getNetworkType());
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_RADIO_PDP_SETUP_FAIL, val);
}
// No try for permanent failure
@@ -1259,9 +1245,9 @@
if (cursor.getCount() > 0) {
allApns = createApnList(cursor);
// TODO: Figure out where this fits in. This basically just
- // writes the pap-secrets file. No longer tied to PdpConnection
+ // writes the pap-secrets file. No longer tied to GsmDataConnection
// object. Not used on current platform (no ppp).
- //PdpConnection pdp = pdpList.get(pdp_name);
+ //GsmDataConnection pdp = pdpList.get(pdp_name);
//if (pdp != null && pdp.dataLink != null) {
// pdp.dataLink.setPasswordInfo(cursor);
//}
@@ -1273,7 +1259,7 @@
if (allApns.isEmpty()) {
if (DBG) log("No APN found for carrier: " + operator);
preferredApn = null;
- notifyNoData(PdpConnection.FailCause.MISSING_UKNOWN_APN);
+ notifyNoData(GsmDataConnection.FailCause.MISSING_UKNOWN_APN);
} else {
preferredApn = getPreferredApn();
Log.d(LOG_TAG, "Get PreferredAPN");
@@ -1289,14 +1275,14 @@
DataConnection pdp;
for (int i = 0; i < PDP_CONNECTION_POOL_SIZE; i++) {
- pdp = new PdpConnection(mGsmPhone);
+ pdp = GsmDataConnection.makeDataConnection(mGsmPhone);
pdpList.add(pdp);
}
}
private void destroyAllPdpList() {
if(pdpList != null) {
- PdpConnection pdp;
+ GsmDataConnection pdp;
pdpList.removeAll(pdpList);
}
}
@@ -1361,7 +1347,7 @@
return result.toString();
}
- private void startDelayedRetry(PdpConnection.FailCause cause, String reason) {
+ private void startDelayedRetry(GsmDataConnection.FailCause cause, String reason) {
notifyNoData(cause);
reconnectAfterFail(cause, reason);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index f82474c..c2c89c01 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -482,12 +482,9 @@
// Can't register data sevice while voice service is ok
// i.e. CREG is ok while CGREG is not
// possible a network or baseband side error
- int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
-
- EventLog.List val = new EventLog.List(ss.getOperatorNumeric(), cid);
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CGREG_FAIL, val);
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_CGREG_FAIL,
+ ss.getOperatorNumeric(), loc != null ? loc.getCid() : -1);
mReportedGprsNoReg = true;
}
mStartedGprsRegCheck = false;
@@ -518,11 +515,8 @@
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
-
- EventLog.List val = new EventLog.List(
- dcTracker.getStateInString(),
- (dcTracker.getAnyDataEnabled() ? 1 : 0) );
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF, val);
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF,
+ dcTracker.getStateInString(), dcTracker.getAnyDataEnabled() ? 1 : 0);
}
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
@@ -965,9 +959,9 @@
if (!mStartedGprsRegCheck && !mReportedGprsNoReg) {
mStartedGprsRegCheck = true;
- int check_period = Settings.Gservices.getInt(
+ int check_period = Settings.Secure.getInt(
phone.getContext().getContentResolver(),
- Settings.Gservices.GPRS_REGISTER_CHECK_PERIOD_MS,
+ Settings.Secure.GPRS_REGISTER_CHECK_PERIOD_MS,
DEFAULT_GPRS_CHECK_PERIOD_MILLIS);
sendMessageDelayed(obtainMessage(EVENT_CHECK_REPORT_GPRS),
check_period);
diff --git a/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java b/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java
deleted file mode 100644
index 02b061c..0000000
--- a/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java
+++ /dev/null
@@ -1,327 +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.gsm;
-
-import android.os.*;
-import android.util.EventLog;
-import android.util.Log;
-
-import com.android.common.Patterns;
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.DataConnection;
-import com.android.internal.telephony.DataLink;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.RILConstants;
-import com.android.internal.telephony.TelephonyEventLog;
-
-/**
- * {@hide}
- */
-public class PdpConnection extends DataConnection {
-
- private static final String LOG_TAG = "GSM";
- private static final boolean DBG = true;
-
- /** Fail cause of last PDP activate, from RIL_LastPDPActivateFailCause */
- private static final int PDP_FAIL_OPERATOR_BARRED = 0x08;
- private static final int PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A;
- private static final int PDP_FAIL_MISSING_UKNOWN_APN = 0x1B;
- private static final int PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C;
- private static final int PDP_FAIL_USER_AUTHENTICATION = 0x1D;
- private static final int PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E;
- private static final int PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F;
- private static final int PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20;
- private static final int PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21;
- private static final int PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22;
- private static final int PDP_FAIL_NSAPI_IN_USE = 0x23;
- private static final int PDP_FAIL_PROTOCOL_ERRORS = 0x6F;
- private static final int PDP_FAIL_ERROR_UNSPECIFIED = 0xffff;
-
- private static final int PDP_FAIL_REGISTRATION_FAIL = -1;
- private static final int PDP_FAIL_GPRS_REGISTRATION_FAIL = -2;
-
- //***** Instance Variables
- private String pdp_name;
- private ApnSetting apn;
-
- //***** Constructor
- PdpConnection(GSMPhone phone) {
- super(phone);
- }
-
- /**
- * Setup PDP connection for provided apn
- * @param apn for this connection
- * @param onCompleted notify success or not after down
- */
- void connect(ApnSetting apn, Message onCompleted) {
- if (DBG) log("Connecting to carrier: '" + apn.carrier
- + "' APN: '" + apn.apn
- + "' proxy: '" + apn.proxy + "' port: '" + apn.port);
-
- setHttpProxy (apn.proxy, apn.port);
-
- state = State.ACTIVATING;
- this.apn = apn;
- onConnectCompleted = onCompleted;
- createTime = -1;
- lastFailTime = -1;
- lastFailCause = FailCause.NONE;
- receivedDisconnectReq = false;
-
- int authType = apn.authType;
- if (authType == -1) {
- authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
- RILConstants.SETUP_DATA_AUTH_NONE;
- }
- phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
- Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), apn.apn, apn.user,
- apn.password, Integer.toString(authType),
- obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE));
- }
-
- private void tearDownData(Message msg) {
- if (phone.mCM.getRadioState().isOn()) {
- phone.mCM.deactivateDataCall(cid, obtainMessage(EVENT_DEACTIVATE_DONE, msg));
- }
- }
-
- protected void disconnect(Message msg) {
- onDisconnect = msg;
- if (state == State.ACTIVE) {
- tearDownData(msg);
- } else if (state == State.ACTIVATING) {
- receivedDisconnectReq = true;
- } else {
- // state == INACTIVE. Nothing to do, so notify immediately.
- notifyDisconnect(msg);
- }
- }
-
- public void clearSettings() {
- super.clearSettings();
- apn = null;
- }
-
- public String toString() {
- return "State=" + state + " Apn=" + apn +
- " create=" + createTime + " lastFail=" + lastFailTime +
- " lastFailCause=" + lastFailCause;
- }
-
-
- protected void notifyFail(FailCause cause, Message onCompleted) {
- if (onCompleted == null) return;
-
- state = State.INACTIVE;
- lastFailCause = cause;
- lastFailTime = System.currentTimeMillis();
- onConnectCompleted = null;
-
- if (DBG) {
- log("Notify PDP fail at " + lastFailTime +
- " due to " + lastFailCause);
- }
-
- AsyncResult.forMessage(onCompleted, cause, new Exception());
- onCompleted.sendToTarget();
- }
-
- protected void notifySuccess(Message onCompleted) {
- if (onCompleted == null) {
- return;
- }
-
- state = State.ACTIVE;
- createTime = System.currentTimeMillis();
- onConnectCompleted = null;
- onCompleted.arg1 = cid;
-
- if (DBG) log("Notify PDP success at " + createTime);
-
- AsyncResult.forMessage(onCompleted);
- onCompleted.sendToTarget();
- }
-
- protected void notifyDisconnect(Message msg) {
- if (DBG) log("Notify PDP disconnect");
-
- if (msg != null) {
- AsyncResult.forMessage(msg);
- msg.sendToTarget();
- }
- clearSettings();
- }
-
- protected void onLinkStateChanged(DataLink.LinkState linkState) {
- switch (linkState) {
- case LINK_UP:
- notifySuccess(onConnectCompleted);
- break;
-
- case LINK_DOWN:
- case LINK_EXITED:
- phone.mCM.getLastPdpFailCause(
- obtainMessage (EVENT_GET_LAST_FAIL_DONE));
- break;
- }
- }
-
- protected FailCause getFailCauseFromRequest(int rilCause) {
- FailCause cause;
-
- switch (rilCause) {
- case PDP_FAIL_OPERATOR_BARRED:
- cause = FailCause.OPERATOR_BARRED;
- break;
- case PDP_FAIL_INSUFFICIENT_RESOURCES:
- cause = FailCause.INSUFFICIENT_RESOURCES;
- break;
- case PDP_FAIL_MISSING_UKNOWN_APN:
- cause = FailCause.MISSING_UKNOWN_APN;
- break;
- case PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE:
- cause = FailCause.UNKNOWN_PDP_ADDRESS;
- break;
- case PDP_FAIL_USER_AUTHENTICATION:
- cause = FailCause.USER_AUTHENTICATION;
- break;
- case PDP_FAIL_ACTIVATION_REJECT_GGSN:
- cause = FailCause.ACTIVATION_REJECT_GGSN;
- break;
- case PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED:
- cause = FailCause.ACTIVATION_REJECT_UNSPECIFIED;
- break;
- case PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER:
- cause = FailCause.SERVICE_OPTION_OUT_OF_ORDER;
- break;
- case PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED:
- cause = FailCause.SERVICE_OPTION_NOT_SUPPORTED;
- break;
- case PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED:
- cause = FailCause.SERVICE_OPTION_NOT_SUBSCRIBED;
- break;
- case PDP_FAIL_NSAPI_IN_USE:
- cause = FailCause.NSAPI_IN_USE;
- break;
- case PDP_FAIL_PROTOCOL_ERRORS:
- cause = FailCause.PROTOCOL_ERRORS;
- break;
- case PDP_FAIL_ERROR_UNSPECIFIED:
- cause = FailCause.UNKNOWN;
- break;
- case PDP_FAIL_REGISTRATION_FAIL:
- cause = FailCause.REGISTRATION_FAIL;
- break;
- case PDP_FAIL_GPRS_REGISTRATION_FAIL:
- cause = FailCause.GPRS_REGISTRATION_FAIL;
- break;
- default:
- cause = FailCause.UNKNOWN;
- }
- return cause;
- }
-
- protected void log(String s) {
- Log.d(LOG_TAG, "[PdpConnection] " + s);
- }
-
- @Override
- protected void onDeactivated(AsyncResult ar) {
- notifyDisconnect((Message) ar.userObj);
- if (DBG) log("PDP Connection Deactivated");
- }
-
- @Override
- protected void onSetupConnectionCompleted(AsyncResult ar) {
- if (ar.exception != null) {
- Log.e(LOG_TAG, "PDP Context Init failed " + ar.exception);
-
- if (receivedDisconnectReq) {
- // Don't bother reporting the error if there's already a
- // pending disconnect request, since DataConnectionTracker
- // has already updated its state.
- notifyDisconnect(onDisconnect);
- } else {
- if ( ar.exception instanceof CommandException &&
- ((CommandException) (ar.exception)).getCommandError()
- == CommandException.Error.RADIO_NOT_AVAILABLE) {
- notifyFail(FailCause.RADIO_NOT_AVAILABLE,
- onConnectCompleted);
- } else {
- phone.mCM.getLastPdpFailCause(
- obtainMessage(EVENT_GET_LAST_FAIL_DONE));
- }
- }
- } else {
- if (receivedDisconnectReq) {
- // Don't bother reporting success if there's already a
- // pending disconnect request, since DataConnectionTracker
- // has already updated its state.
- tearDownData(onDisconnect);
- } else {
- String[] response = ((String[]) ar.result);
- cid = Integer.parseInt(response[0]);
-
- if (response.length > 2) {
- interfaceName = response[1];
- ipAddress = response[2];
- String prefix = "net." + interfaceName + ".";
- gatewayAddress = SystemProperties.get(prefix + "gw");
- dnsServers[0] = SystemProperties.get(prefix + "dns1");
- dnsServers[1] = SystemProperties.get(prefix + "dns2");
- if (DBG) {
- log("interface=" + interfaceName + " ipAddress=" + ipAddress
- + " gateway=" + gatewayAddress + " DNS1=" + dnsServers[0]
- + " DNS2=" + dnsServers[1]);
- }
-
- if (NULL_IP.equals(dnsServers[0]) && NULL_IP.equals(dnsServers[1])
- && !((GSMPhone) phone).isDnsCheckDisabled()) {
- // Work around a race condition where QMI does not fill in DNS:
- // Deactivate PDP and let DataConnectionTracker retry.
- // Do not apply the race condition workaround for MMS APN
- // if Proxy is an IP-address.
- // Otherwise, the default APN will not be restored anymore.
- if (!apn.types[0].equals(Phone.APN_TYPE_MMS)
- || !isIpAddress(apn.mmsProxy)) {
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_BAD_DNS_ADDRESS,
- dnsServers[0]);
- phone.mCM.deactivateDataCall(cid, obtainMessage(EVENT_FORCE_RETRY));
- return;
- }
- }
- }
-
- onLinkStateChanged(DataLink.LinkState.LINK_UP);
-
- if (DBG) log("PDP setup on cid = " + cid);
- }
- }
- }
-
- private boolean isIpAddress(String address) {
- if (address == null) return false;
-
- return Patterns.IP_ADDRESS.matcher(apn.mmsProxy).matches();
- }
-
- public ApnSetting getApn() {
- return this.apn;
- }
-}
diff --git a/telephony/java/com/android/internal/telephony/gsm/stk/StkService.java b/telephony/java/com/android/internal/telephony/gsm/stk/StkService.java
index 9268037..29ed95c 100644
--- a/telephony/java/com/android/internal/telephony/gsm/stk/StkService.java
+++ b/telephony/java/com/android/internal/telephony/gsm/stk/StkService.java
@@ -467,8 +467,7 @@
sInstance = new StkService(ci, sr, context, fh, sc);
StkLog.d(sInstance, "NEW sInstance");
} else if ((sr != null) && (mSimRecords != sr)) {
- StkLog.d(sInstance, String.format(
- "Reinitialize the Service with SIMRecords sr=0x%x.", sr));
+ StkLog.d(sInstance, "Reinitialize the Service with SIMRecords");
mSimRecords = sr;
// re-Register for SIM ready event.
diff --git a/tests/AndroidTests/AndroidManifest.xml b/tests/AndroidTests/AndroidManifest.xml
index 786178c..eb422be 100644
--- a/tests/AndroidTests/AndroidManifest.xml
+++ b/tests/AndroidTests/AndroidManifest.xml
@@ -48,8 +48,8 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="com.android.unit_tests.permission.TEST_GRANTED" />
<uses-permission android:name="com.google.android.googleapps.permission.ACCESS_GOOGLE_PASSWORD" />
diff --git a/tests/AndroidTests/res/layout/layout_five.xml b/tests/AndroidTests/res/layout/layout_five.xml
index fd1e0ef..9923eaf 100644
--- a/tests/AndroidTests/res/layout/layout_five.xml
+++ b/tests/AndroidTests/res/layout/layout_five.xml
@@ -17,6 +17,6 @@
** limitations under the License.
*/
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TextView android:id="@+id/text" android:text="@string/layout_five_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
+ <TextView android:id="@+id/text" android:text="@string/layout_five_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/tests/AndroidTests/res/layout/layout_one.xml b/tests/AndroidTests/res/layout/layout_one.xml
index f5c78bd..c326b2b 100644
--- a/tests/AndroidTests/res/layout/layout_one.xml
+++ b/tests/AndroidTests/res/layout/layout_one.xml
@@ -17,4 +17,4 @@
** limitations under the License.
*/
-->
-<view xmlns:android="http://schemas.android.com/apk/res/android" class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/viewOne" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+<view xmlns:android="http://schemas.android.com/apk/res/android" class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/viewOne" android:layout_width="match_parent" android:layout_height="match_parent"/>
diff --git a/tests/AndroidTests/res/layout/layout_six.xml b/tests/AndroidTests/res/layout/layout_six.xml
index 6efcdf3..b78082d 100644
--- a/tests/AndroidTests/res/layout/layout_six.xml
+++ b/tests/AndroidTests/res/layout/layout_six.xml
@@ -17,11 +17,11 @@
** limitations under the License.
*/
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView android:id="@+id/text" android:text="@string/layout_six_text_text" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/tests/AndroidTests/res/layout/layout_tag.xml b/tests/AndroidTests/res/layout/layout_tag.xml
index 1f17701..72874a6 100644
--- a/tests/AndroidTests/res/layout/layout_tag.xml
+++ b/tests/AndroidTests/res/layout/layout_tag.xml
@@ -20,4 +20,4 @@
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.unit_tests.InflateTest$ViewOne"
android:id="@+id/viewOne" android:tag="MyTag"
- android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+ android:layout_width="match_parent" android:layout_height="match_parent"/>
diff --git a/tests/AndroidTests/res/layout/layout_three.xml b/tests/AndroidTests/res/layout/layout_three.xml
index 77b2aa9..7b1ccc5 100644
--- a/tests/AndroidTests/res/layout/layout_three.xml
+++ b/tests/AndroidTests/res/layout/layout_three.xml
@@ -17,11 +17,11 @@
** limitations under the License.
*/
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view1" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view2" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view3" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view4" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view5" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view6" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="match_parent"/>
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="match_parent"/>
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view3" android:layout_width="match_parent" android:layout_height="match_parent"/>
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view4" android:layout_width="match_parent" android:layout_height="match_parent"/>
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view5" android:layout_width="match_parent" android:layout_height="match_parent"/>
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/view6" android:layout_width="match_parent" android:layout_height="match_parent"/>
</LinearLayout>
diff --git a/tests/AndroidTests/res/layout/layout_two.xml b/tests/AndroidTests/res/layout/layout_two.xml
index 9c99710..af14228 100644
--- a/tests/AndroidTests/res/layout/layout_two.xml
+++ b/tests/AndroidTests/res/layout/layout_two.xml
@@ -17,7 +17,7 @@
** limitations under the License.
*/
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/viewOne" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
+ <view class="com.android.unit_tests.InflateTest$ViewOne" android:id="@+id/viewOne" android:layout_width="match_parent" android:layout_height="match_parent"/>
</LinearLayout>
diff --git a/tests/AndroidTests/res/raw/medium.xml b/tests/AndroidTests/res/raw/medium.xml
index 51c952c..5757a24 100644
--- a/tests/AndroidTests/res/raw/medium.xml
+++ b/tests/AndroidTests/res/raw/medium.xml
@@ -17,11 +17,11 @@
** limitations under the License.
*/
-->
-<LinearLayout id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
- <TextView id="@+id/text" android:text="S" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView id="@+id/text" android:text="M" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView id="@+id/text" android:text="T" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView id="@+id/text" android:text="W" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView id="@+id/text" android:text="H" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <TextView id="@+id/text" android:text="F" android:layout_width="fill_parent" android:layout_height="wrap_content" />
+<LinearLayout id="@+id/content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
+ <TextView id="@+id/text" android:text="S" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView id="@+id/text" android:text="M" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView id="@+id/text" android:text="T" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView id="@+id/text" android:text="W" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView id="@+id/text" android:text="H" android:layout_width="match_parent" android:layout_height="wrap_content" />
+ <TextView id="@+id/text" android:text="F" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/tests/AndroidTests/res/raw/small.xml b/tests/AndroidTests/res/raw/small.xml
index 2697fb8..ee859b9 100644
--- a/tests/AndroidTests/res/raw/small.xml
+++ b/tests/AndroidTests/res/raw/small.xml
@@ -17,4 +17,4 @@
** limitations under the License.
*/
-->
-<view class="com.android.tests.InflateTest$ViewOne" id="@+id/viewOne" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+<view class="com.android.tests.InflateTest$ViewOne" id="@+id/viewOne" android:layout_width="match_parent" android:layout_height="match_parent"/>
diff --git a/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java b/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java
deleted file mode 100644
index cf759e0..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.android.unit_tests;
-
-import junit.framework.TestSuite;
-
-public class ApacheHttpTests {
- public static TestSuite suite() {
- TestSuite suite = new TestSuite(ApacheHttpTests.class.getName());
-
- suite.addTestSuite(TestHttpService.class);
-
- return suite;
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/CreateViewTest.java b/tests/AndroidTests/src/com/android/unit_tests/CreateViewTest.java
index 342094d..0c57ac4 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/CreateViewTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/CreateViewTest.java
@@ -21,7 +21,7 @@
import android.test.PerformanceTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
-import static android.view.ViewGroup.LayoutParams.FILL_PARENT;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -45,7 +45,7 @@
public void testLayout2() throws Exception {
LinearLayout vert = new LinearLayout(mContext);
vert.addView(new CreateViewTest.ViewOne(mContext),
- new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
}
@SmallTest
@@ -53,22 +53,22 @@
LinearLayout vert = new LinearLayout(mContext);
ViewOne one = new ViewOne(mContext);
- vert.addView(one, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(one, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
ViewOne two = new ViewOne(mContext);
- vert.addView(two, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(two, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
ViewOne three = new ViewOne(mContext);
- vert.addView(three, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(three, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
ViewOne four = new ViewOne(mContext);
- vert.addView(four, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(four, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
ViewOne five = new ViewOne(mContext);
- vert.addView(five, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(five, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
ViewOne six = new ViewOne(mContext);
- vert.addView(six, new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 0));
+ vert.addView(six, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT, 0));
}
@SmallTest
@@ -83,7 +83,7 @@
text.setText("S");
LinearLayout vert = new LinearLayout(mContext);
- vert.addView(text, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(text, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
}
@SmallTest
@@ -92,27 +92,27 @@
TextView one = new TextView(mContext);
one.setText("S");
- vert.addView(one, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(one, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
TextView two = new TextView(mContext);
two.setText("M");
- vert.addView(two, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(two, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
TextView three = new TextView(mContext);
three.setText("T");
- vert.addView(three, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(three, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
TextView four = new TextView(mContext);
four.setText("W");
- vert.addView(four, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(four, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
TextView five = new TextView(mContext);
five.setText("H");
- vert.addView(five, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(five, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
TextView six = new TextView(mContext);
six.setText("F");
- vert.addView(six, new LinearLayout.LayoutParams(FILL_PARENT, WRAP_CONTENT, 0));
+ vert.addView(six, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 0));
}
public static class ViewOne extends View {
diff --git a/tests/AndroidTests/src/com/android/unit_tests/DbSSLSessionCacheTest.java b/tests/AndroidTests/src/com/android/unit_tests/DbSSLSessionCacheTest.java
deleted file mode 100644
index 8d7d797..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/DbSSLSessionCacheTest.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * 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 com.android.unit_tests;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.Suppress;
-
-import com.google.android.net.GoogleHttpClient;
-
-import com.android.internal.net.DbSSLSessionCache;
-import com.android.internal.net.DbSSLSessionCache.DatabaseHelper;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-
-import java.io.IOException;
-import java.security.Principal;
-import java.security.cert.Certificate;
-
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSessionContext;
-import javax.security.cert.X509Certificate;
-
-/** Unit test for SSL session caching with {@link GoogleHttpClient}.
- * Uses network resources.
- */
-@Suppress
-public class DbSSLSessionCacheTest extends AndroidTestCase {
-
- protected void setUp() throws Exception {
- }
-
- protected void tearDown() throws Exception {
- }
-
- /**
- * We want to test the actual database write - the actual hooking into
- * low-level SSL is tested.
- */
- @LargeTest
- public void testSslCacheAdd() throws Exception {
- // Let's verify the database has the rows.
- // Use internal details of the implementation - could make the field
- // visible for testing, but it's same.
-
- // Use default database
- DbSSLSessionCache cache = DbSSLSessionCache.getInstanceForPackage(getContext());
- cache.clear();
-
-
- makeRequestInNewContext("https://www.google.com");
-
- // Verify the key was inserted
- SQLiteOpenHelper helper = new DatabaseHelper(getContext());
- Cursor query = null;
- try {
- query = helper.getReadableDatabase().query(DbSSLSessionCache.SSL_CACHE_TABLE,
- new String[] {"hostport"}, null,
- null, null, null, null);
-
- assertTrue(query.moveToFirst()); // one row inserted
- String hostPort = query.getString(0);
- assertEquals(hostPort, "www.google.com:443");
- } finally {
- query.close();
- }
- }
-
- @LargeTest
- public void testExpire() throws Exception {
- DatabaseHelper helper = new DatabaseHelper(getContext());
- // clean up
- DbSSLSessionCache cache = new DbSSLSessionCache(helper);
- cache.clear();
-
- long t0 = System.currentTimeMillis();
- for (int i = 0; i < DbSSLSessionCache.MAX_CACHE_SIZE + 2; i++) {
- final int port = i;
- cache.putSessionData(new MockSession() {
-
- public String getPeerHost() {
- return "test.host.com";
- }
-
- public int getPeerPort() {
- return port;
- }
- }, new byte[256]);
- }
- long t1 = System.currentTimeMillis();
-
- System.err.println("Time to insert " +
- (DbSSLSessionCache.MAX_CACHE_SIZE + 2) + " " + (t1 - t0));
-
- // first entry should have port 1.
- Cursor query = helper.getReadableDatabase().query(DbSSLSessionCache.SSL_CACHE_TABLE,
- new String[] {"hostport", "session"}, null,
- null, null, null, null);
-
- int cnt = query.getCount();
-
- assertTrue(query.moveToFirst()); // one row inserted
- String hostPort = query.getString(0);
- assertEquals("test.host.com:2", hostPort);
- while (query.moveToNext()) {
- hostPort = query.getString(0);
- String session = query.getString(1);
- }
- long t2 = System.currentTimeMillis();
- System.err.println("Time to load " + cnt + " " + (t2 - t1));
-
- query.close();
- }
-
- private void makeRequestInNewContext(String url) throws IOException {
- GoogleHttpClient client = new GoogleHttpClient(getContext(), "Test",
- false /* no gzip */);
-
- try {
- // Note: we must test against a real server, because the connection
- // gets established before the interceptor can crash the request.
- HttpGet method = new HttpGet(url);
- HttpResponse response = client.execute(method);
- } finally {
- client.close();
- }
- }
-
- private static class MockSession implements SSLSession {
-
- public String getPeerHost() {
- throw new UnsupportedOperationException();
- }
-
-
- public int getPeerPort() {
- throw new UnsupportedOperationException();
- }
-
-
-
- public int getApplicationBufferSize() {
- throw new UnsupportedOperationException();
- }
-
-
- public String getCipherSuite() {
- throw new UnsupportedOperationException();
- }
-
-
- public long getCreationTime() {
- throw new UnsupportedOperationException();
- }
-
-
- public byte[] getId() {
- throw new UnsupportedOperationException();
- }
-
-
- public long getLastAccessedTime() {
- throw new UnsupportedOperationException();
- }
-
-
- public Certificate[] getLocalCertificates() {
- throw new UnsupportedOperationException();
- }
-
-
- public Principal getLocalPrincipal() {
- throw new UnsupportedOperationException();
- }
-
-
- public int getPacketBufferSize() {
- throw new UnsupportedOperationException();
- }
-
-
- public X509Certificate[] getPeerCertificateChain()
- throws SSLPeerUnverifiedException {
- throw new UnsupportedOperationException();
- }
-
-
- public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
- throw new UnsupportedOperationException();
- }
-
-
- public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
- throw new UnsupportedOperationException();
- }
-
-
- public String getProtocol() {
- throw new UnsupportedOperationException();
- }
-
-
- public SSLSessionContext getSessionContext() {
- throw new UnsupportedOperationException();
- }
-
-
- public Object getValue(String name) {
- throw new UnsupportedOperationException();
- }
-
-
- public String[] getValueNames() {
- throw new UnsupportedOperationException();
- }
-
-
- public void invalidate() {
- throw new UnsupportedOperationException();
- }
-
-
- public boolean isValid() {
- throw new UnsupportedOperationException();
- }
-
-
- public void putValue(String name, Object value) {
- throw new UnsupportedOperationException();
- }
-
-
- public void removeValue(String name) {
- throw new UnsupportedOperationException();
- }
- }
-
-
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/DropBoxTest.java b/tests/AndroidTests/src/com/android/unit_tests/DropBoxTest.java
index 305788d..d20abd9 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/DropBoxTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/DropBoxTest.java
@@ -16,7 +16,7 @@
package com.android.unit_tests;
-import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.DropBoxManager;
@@ -37,11 +37,10 @@
/** Test {@link DropBoxManager} functionality. */
public class DropBoxTest extends AndroidTestCase {
public void tearDown() throws Exception {
- Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
- override.putExtra(Settings.Gservices.DROPBOX_AGE_SECONDS, "");
- override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, "");
- override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
- waitForBroadcast(override);
+ ContentResolver cr = getContext().getContentResolver();
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_AGE_SECONDS, "");
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, "");
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
}
public void testAddText() throws Exception {
@@ -246,16 +245,15 @@
dropbox.addText("DropBoxTest", "TEST-ENABLED");
assertTrue(dropbox.isTagEnabled("DropBoxTest"));
- Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
- override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "disabled");
- waitForBroadcast(override);
+ ContentResolver cr = getContext().getContentResolver();
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest",
+ "disabled");
dropbox.addText("DropBoxTest", "TEST-DISABLED");
assertFalse(dropbox.isTagEnabled("DropBoxTest"));
- override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
- override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
- waitForBroadcast(override);
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest",
+ "");
dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
assertTrue(dropbox.isTagEnabled("DropBoxTest"));
@@ -323,9 +321,8 @@
// Limit storage to 10 blocks
int kb = blockSize * 10 / 1024;
- Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
- override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, Integer.toString(kb));
- waitForBroadcast(override);
+ ContentResolver cr = getContext().getContentResolver();
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, Integer.toString(kb));
// Three tags using a total of 12 blocks:
// DropBoxTest0 [ ][ ]
@@ -426,10 +423,9 @@
// Limit storage to 10 blocks with an expiration of 1 second
int kb = blockSize * 10 / 1024;
- Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
- override.putExtra(Settings.Gservices.DROPBOX_AGE_SECONDS, "1");
- override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, Integer.toString(kb));
- waitForBroadcast(override);
+ ContentResolver cr = getContext().getContentResolver();
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_AGE_SECONDS, "1");
+ Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, Integer.toString(kb));
// Write one normal entry and another so big that it is instantly tombstoned
long before = System.currentTimeMillis();
@@ -505,15 +501,6 @@
return length;
}
- private void waitForBroadcast(Intent intent) throws InterruptedException {
- BroadcastReceiver receiver = new BroadcastReceiver() {
- public synchronized void onReceive(Context context, Intent intent) { notify(); }
- };
-
- getContext().sendOrderedBroadcast(intent, null, receiver, null, 0, null, null);
- synchronized (receiver) { receiver.wait(); }
- }
-
private void recursiveDelete(File file) {
if (!file.delete() && file.isDirectory()) {
for (File f : file.listFiles()) recursiveDelete(f);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/GoogleHttpClientTest.java b/tests/AndroidTests/src/com/android/unit_tests/GoogleHttpClientTest.java
deleted file mode 100644
index bf0245c..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/GoogleHttpClientTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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 com.android.unit_tests;
-
-import android.content.ContentResolver;
-import android.provider.Checkin;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import com.google.android.collect.Lists;
-import com.google.android.net.GoogleHttpClient;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.util.EntityUtils;
-
-import java.io.IOException;
-
-/** Unit test for {@link GoogleHttpClient}. */
-public class GoogleHttpClientTest extends AndroidTestCase {
- private TestHttpServer mServer;
- private String mServerUrl;
-
- protected void setUp() throws Exception {
- // Run a test server that echoes the URI back to the caller.
- mServer = new TestHttpServer();
- mServer.registerHandler("*", new HttpRequestHandler() {
- public void handle(
- HttpRequest request,
- HttpResponse response,
- HttpContext context) throws HttpException, IOException {
- String uri = request.getRequestLine().getUri();
- response.setEntity(new StringEntity(uri));
- }
- });
-
- mServer.start();
- mServerUrl = "http://localhost:" + mServer.getPort() + "/";
- }
-
- protected void tearDown() throws Exception {
- if (mServer != null) mServer.shutdown();
- }
-
- //
- // Fix this test to use the new mechanism to indicate that the
- // Http client is running in the UI thread
- // bug: http://b/2322326
- @LargeTest
- public void testThreadCheck() throws Exception {
- ContentResolver resolver = getContext().getContentResolver();
- GoogleHttpClient client = new GoogleHttpClient(resolver, "Test",
- false /* no gzip */);
-
- try {
- // Note: we must test against a real server, because the connection
- // gets established before the interceptor can crash the request.
- HttpGet method = new HttpGet(mServerUrl);
-
- // This is actually an AndroidHttpClient feature...
- // TODO: somehow test that Activity threads have the flag set?
- // Thus now uses the looper state to determine if it is in a UI
- // thread
- //AndroidHttpClient.setThreadBlocked(true);
-
- try {
- client.execute(method);
- fail("\"thread forbids HTTP requests\" exception expected");
- } catch (RuntimeException e) {
- if (!e.toString().contains("forbids HTTP requests")) throw e;
- } finally {
- // AndroidHttpClient.setThreadBlocked(false);
- }
-
- HttpResponse response = client.execute(method);
- assertEquals("/", EntityUtils.toString(response.getEntity()));
- } finally {
- client.close();
- }
- }
-
- @MediumTest
- public void testUrlRewriteRules() throws Exception {
- // Don't do anything exotic; UrlRulesTest checks the actual rewriter.
- // Just make sure that URLs are, in fact, rewritten.
-
- // TODO: Use a MockContentProvider/MockContentResolver instead.
- ContentResolver resolver = getContext().getContentResolver();
- GoogleHttpClient client = new GoogleHttpClient(resolver, "Test",
- false /* not gzip capable */);
- Settings.Gservices.putString(resolver,
- "url:test", "http://foo.bar/ rewrite " + mServerUrl + "new/");
-
- // Update the digest, so the UrlRules cache is reloaded.
- Settings.Gservices.putString(resolver, "digest", mServerUrl);
-
- try {
- HttpGet method = new HttpGet("http://foo.bar/path");
- HttpResponse response = client.execute(method);
- String body = EntityUtils.toString(response.getEntity());
- assertEquals("/new/path", body);
- } finally {
- client.close();
- }
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java b/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java
deleted file mode 100644
index 5d7349f..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.android.unit_tests;
-
-import com.google.android.net.SSLClientSessionCacheFactory;
-import com.android.internal.net.DbSSLSessionCache;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-
-/**
- * Unit test for {@link SSLClientSessionCacheFactory}.
- */
-@MediumTest
-public final class SSLClientSessionCacheFactoryTest extends AndroidTestCase {
-
- protected void tearDown() throws Exception {
- setSslSessionCacheValue(getContext(), "");
- super.tearDown();
- }
-
- private static void setSslSessionCacheValue(Context context, String value) {
- ContentResolver resolver = context.getContentResolver();
- Settings.Gservices.putString(resolver, Settings.Gservices.SSL_SESSION_CACHE, value);
- }
-
- private static SSLClientSessionCache getCache(Context context, String type) {
- setSslSessionCacheValue(context, type);
- return SSLClientSessionCacheFactory.getCache(context);
- }
-
- public void testGetDbCache() throws Exception {
- Context context = getContext();
- SSLClientSessionCache cache = getCache(context, "db");
- assertNotNull(cache);
- assertTrue(cache instanceof DbSSLSessionCache);
- }
-
- public void testGetFileCache() throws Exception {
- Context context = getContext();
- SSLClientSessionCache cache = getCache(context, "file");
- assertNotNull(cache);
- // yuck =)
- assertEquals("org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl",
- cache.getClass().getName());
- }
-
- public void testGetNoCache() throws Exception {
- Context context = getContext();
- SSLClientSessionCache cache = getCache(context, "none");
- assertNull(cache);
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SettingsProviderTest.java b/tests/AndroidTests/src/com/android/unit_tests/SettingsProviderTest.java
index 8b1db97..7d828ec 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SettingsProviderTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SettingsProviderTest.java
@@ -31,16 +31,16 @@
@MediumTest
public void testNameValueCache() {
ContentResolver r = getContext().getContentResolver();
- Settings.Gservices.putString(r, "test_service", "Value");
- assertEquals("Value", Settings.Gservices.getString(r, "test_service"));
+ Settings.Secure.putString(r, "test_service", "Value");
+ assertEquals("Value", Settings.Secure.getString(r, "test_service"));
// Make sure the value can be overwritten.
- Settings.Gservices.putString(r, "test_service", "New");
- assertEquals("New", Settings.Gservices.getString(r, "test_service"));
+ Settings.Secure.putString(r, "test_service", "New");
+ assertEquals("New", Settings.Secure.getString(r, "test_service"));
// Also that delete works.
- assertEquals(1, r.delete(Settings.Gservices.getUriFor("test_service"), null, null));
- assertEquals(null, Settings.Gservices.getString(r, "test_service"));
+ assertEquals(1, r.delete(Settings.Secure.getUriFor("test_service"), null, null));
+ assertEquals(null, Settings.Secure.getString(r, "test_service"));
// Try all the same things in the System table
Settings.System.putString(r, "test_setting", "Value");
@@ -60,10 +60,10 @@
assertEquals("content://settings/system/test_setting",
Settings.System.getUriFor("test_setting").toString());
assertEquals("content://settings/gservices/test_service",
- Settings.Gservices.getUriFor("test_service").toString());
+ Settings.Secure.getUriFor("test_service").toString());
// These tables use the row name (not ID) as their content URI.
- Uri tables[] = { Settings.System.CONTENT_URI, Settings.Gservices.CONTENT_URI };
+ Uri tables[] = { Settings.System.CONTENT_URI, Settings.Secure.CONTENT_URI };
for (Uri table : tables) {
ContentValues v = new ContentValues();
v.put(Settings.System.NAME, "test_key");
@@ -119,7 +119,7 @@
}
assertEquals(null, Settings.System.getString(r, "test_key"));
- assertEquals(null, Settings.Gservices.getString(r, "test_key"));
+ assertEquals(null, Settings.Secure.getString(r, "test_key"));
}
@MediumTest
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SimplePullParserTest.java b/tests/AndroidTests/src/com/android/unit_tests/SimplePullParserTest.java
deleted file mode 100644
index 9758298..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/SimplePullParserTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.unit_tests;
-
-import com.google.android.util.SimplePullParser;
-import junit.framework.TestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-public class SimplePullParserTest extends TestCase {
- @SmallTest
- public void testTwoLevels() throws Exception {
- String xml = ""
- + "<top a='1' b='hello'>\n"
- + " <next c='2' d='there'/>\n"
- + " <next c='3' d='bye'/>\n"
- + "</top>";
- SimplePullParser parser = new SimplePullParser(xml);
- int depth0 = parser.getDepth();
- assertEquals(0, depth0);
- assertEquals("top", parser.nextTag(depth0));
- assertEquals(1, parser.getIntAttribute(null, "a"));
- assertEquals("hello", parser.getStringAttribute(null, "b"));
-
- int depth1 = parser.getDepth();
- assertEquals(1, depth1);
- assertEquals("next", parser.nextTag(depth1));
- assertEquals(2, parser.getIntAttribute(null, "c"));
- assertEquals("there", parser.getStringAttribute(null, "d"));
- assertEquals("next", parser.nextTag(depth1));
- assertEquals(3, parser.getIntAttribute(null, "c"));
- assertEquals("bye", parser.getStringAttribute(null, "d"));
- assertNull(parser.nextTag(depth1));
-
- assertNull(parser.nextTag(depth0));
- }
-
- @SmallTest
- public void testAttributes() throws Exception {
- String xml = "<top a='1' b='hello'/>";
- SimplePullParser parser = new SimplePullParser(xml);
- int depth = parser.getDepth();
- parser.nextTag(depth);
-
- assertEquals(2, parser.numAttributes());
- assertEquals("a", parser.getAttributeName(0));
- assertEquals("b", parser.getAttributeName(1));
-
- assertEquals(1, parser.getIntAttribute(null, "a"));
- assertEquals(5, parser.getIntAttribute(null, "c", 5));
- assertEquals("hello", parser.getStringAttribute(null, "b"));
- assertEquals("not", parser.getStringAttribute(null, "d", "not"));
- }
-
- @SmallTest
- public void testRecovery() throws Exception {
- String xml = ""
- + "<top a='1' b='hello'>\n"
- + " <middle c='2' d='there'>\n"
- + " <inner/>\n"
- + " <inner2/>\n"
- + " <inner3/>\n"
- + " </middle>\n"
- + " <middle2/>\n"
- + "</top>";
- SimplePullParser parser = new SimplePullParser(xml);
- assertEquals(0, parser.getDepth());
- assertEquals("top", parser.nextTag(0));
- assertEquals(1, parser.getDepth());
- assertEquals("middle", parser.nextTag(1));
- assertEquals(2, parser.getDepth());
- assertEquals("inner", parser.nextTag(2));
- // Now skip some elements.
- assertEquals("middle2", parser.nextTag(1));
- }
-
- @SmallTest
- public void testCdata() throws Exception {
- StringBuilder cdataBuilder;
- String xml = ""
- + "<top>"
- + "<![CDATA[data0]]>"
- + "<next0/>"
- + "<![CDATA[data1]]>"
- + "<next1/>"
- + "<![CDATA[data2]]>"
- + "<next2/>"
- + "<![CDATA[data3]]>"
- + "<next3/>"
- + "<![CDATA[data4]]>"
- + "<next4/>"
- + "<![CDATA[data5]]>"
- + "</top>";
- SimplePullParser parser = new SimplePullParser(xml);
- assertEquals("top", parser.nextTag(0));
-
- // We can ignore cdata by not passing a cdata builder.
- assertEquals("next0", parser.nextTag(1));
-
- // We can get the most recent cdata by passing an empty cdata builder.
- cdataBuilder = new StringBuilder();
- assertSame(SimplePullParser.TEXT_TAG, parser.nextTagOrText(1, cdataBuilder));
- assertEquals("data1", cdataBuilder.toString());
- assertEquals("next1", parser.nextTag(1));
-
- // We can join multiple cdatas by reusing a builder.
- cdataBuilder = new StringBuilder();
- assertSame(SimplePullParser.TEXT_TAG, parser.nextTagOrText(1, cdataBuilder));
- assertEquals("next2", parser.nextTag(1));
- assertSame(SimplePullParser.TEXT_TAG, parser.nextTagOrText(1, cdataBuilder));
- assertEquals("data2data3", cdataBuilder.toString());
- assertEquals("next3", parser.nextTag(1));
-
- // We can read all of the remaining cdata while ignoring any elements.
- cdataBuilder = new StringBuilder();
- parser.readRemainingText(1, cdataBuilder);
- assertEquals("data4data5", cdataBuilder.toString());
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java b/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java
deleted file mode 100644
index aae21b3..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/jakarta/httpcomponents/httpcore/tags/4.0-alpha6/module-main/src/test/java/org/apache/http/mockup/TestHttpServer.java $
- * $Revision: 576077 $
- * $Date: 2007-09-16 04:50:22 -0700 (Sun, 16 Sep 2007) $
- *
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package com.android.unit_tests;
-
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponseFactory;
-import org.apache.http.HttpServerConnection;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.DefaultHttpServerConnection;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.CoreConnectionPNames;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpExpectationVerifier;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpRequestHandlerRegistry;
-import org.apache.http.protocol.HttpService;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
-
-public class TestHttpServer {
-
- private final HttpParams params;
- private final BasicHttpProcessor httpproc;
- private final ConnectionReuseStrategy connStrategy;
- private final HttpResponseFactory responseFactory;
- private final HttpRequestHandlerRegistry reqistry;
- private final ServerSocket serversocket;
-
- private HttpExpectationVerifier expectationVerifier;
-
- private Thread listener;
- private volatile boolean shutdown;
-
- public TestHttpServer() throws IOException {
- super();
- this.params = new BasicHttpParams();
- this.params
- .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 20000)
- .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
- .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
- .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
- .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "TEST-SERVER/1.1");
- this.httpproc = new BasicHttpProcessor();
- this.httpproc.addInterceptor(new ResponseDate());
- this.httpproc.addInterceptor(new ResponseServer());
- this.httpproc.addInterceptor(new ResponseContent());
- this.httpproc.addInterceptor(new ResponseConnControl());
- this.connStrategy = new DefaultConnectionReuseStrategy();
- this.responseFactory = new DefaultHttpResponseFactory();
- this.reqistry = new HttpRequestHandlerRegistry();
- this.serversocket = new ServerSocket(0);
- }
-
- public void registerHandler(
- final String pattern,
- final HttpRequestHandler handler) {
- this.reqistry.register(pattern, handler);
- }
-
- public void setExpectationVerifier(final HttpExpectationVerifier expectationVerifier) {
- this.expectationVerifier = expectationVerifier;
- }
-
- private HttpServerConnection acceptConnection() throws IOException {
- Socket socket = this.serversocket.accept();
- DefaultHttpServerConnection conn = new DefaultHttpServerConnection();
- conn.bind(socket, this.params);
- return conn;
- }
-
- public int getPort() {
- return this.serversocket.getLocalPort();
- }
-
- public InetAddress getInetAddress() {
- return this.serversocket.getInetAddress();
- }
-
- public void start() {
- if (this.listener != null) {
- throw new IllegalStateException("Listener already running");
- }
- this.listener = new Thread(new Runnable() {
-
- public void run() {
- while (!shutdown && !Thread.interrupted()) {
- try {
- // Set up HTTP connection
- HttpServerConnection conn = acceptConnection();
- // Set up the HTTP service
- HttpService httpService = new HttpService(
- httpproc,
- connStrategy,
- responseFactory);
- httpService.setParams(params);
- httpService.setExpectationVerifier(expectationVerifier);
- httpService.setHandlerResolver(reqistry);
-
- // Start worker thread
- Thread t = new WorkerThread(httpService, conn);
- t.setDaemon(true);
- t.start();
- } catch (InterruptedIOException ex) {
- break;
- } catch (IOException e) {
- break;
- }
- }
- }
-
- });
- this.listener.start();
- }
-
- public void shutdown() {
- if (this.shutdown) {
- return;
- }
- this.shutdown = true;
- try {
- this.serversocket.close();
- } catch (IOException ignore) {}
- this.listener.interrupt();
- try {
- this.listener.join(1000);
- } catch (InterruptedException ignore) {}
- }
-
- static class WorkerThread extends Thread {
-
- private final HttpService httpservice;
- private final HttpServerConnection conn;
-
- public WorkerThread(
- final HttpService httpservice,
- final HttpServerConnection conn) {
- super();
- this.httpservice = httpservice;
- this.conn = conn;
- }
-
- public void run() {
- HttpContext context = new BasicHttpContext(null);
- try {
- while (!Thread.interrupted() && this.conn.isOpen()) {
- this.httpservice.handleRequest(this.conn, context);
- }
- } catch (ConnectionClosedException ex) {
- } catch (IOException ex) {
- System.err.println("I/O error: " + ex.getMessage());
- } catch (HttpException ex) {
- System.err.println("Unrecoverable HTTP protocol violation: " + ex.getMessage());
- } finally {
- try {
- this.conn.shutdown();
- } catch (IOException ignore) {}
- }
- }
-
- }
-
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java b/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java
deleted file mode 100644
index 6b57d13..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/jakarta/httpcomponents/httpcore/tags/4.0-alpha6/module-main/src/test/java/org/apache/http/protocol/TestHttpServiceAndExecutor.java $
- * $Revision: 576073 $
- * $Date: 2007-09-16 03:53:13 -0700 (Sun, 16 Sep 2007) $
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package com.android.unit_tests;
-
-import org.apache.http.protocol.HttpExpectationVerifier;
-import org.apache.http.protocol.HttpRequestHandler;
-import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import junit.framework.TestCase;
-
-import org.apache.http.Header;
-import org.apache.http.HttpConnectionMetrics;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.DefaultHttpClientConnection;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
-import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EncodingUtils;
-import org.apache.http.util.EntityUtils;
-
-
-import java.io.IOException;
-import java.net.Socket;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class TestHttpService extends TestCase implements PerformanceTestCase {
-
- public boolean isPerformanceOnly() {
- // TODO Auto-generated method stub
- return false;
- }
-
- public int startPerformance(Intermediates intermediates) {
- // TODO Auto-generated method stub
- return 0;
- }
-
- private TestHttpServer server;
- private TestHttpClient client;
-
- protected void setUp() throws Exception {
- this.server = new TestHttpServer();
- this.client = new TestHttpClient();
- }
-
- protected void tearDown() throws Exception {
- if (server != null) {
- this.server.shutdown();
- }
- }
-
- /**
- * This test case executes a series of simple GET requests
- */
- @LargeTest
- public void testSimpleBasicHttpRequests() throws Exception {
-
- int reqNo = 20;
-
- Random rnd = new Random();
-
- // Prepare some random data
- final List testData = new ArrayList(reqNo);
- for (int i = 0; i < reqNo; i++) {
- int size = rnd.nextInt(5000);
- byte[] data = new byte[size];
- rnd.nextBytes(data);
- testData.add(data);
- }
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- String s = request.getRequestLine().getUri();
- if (s.startsWith("/?")) {
- s = s.substring(2);
- }
- int index = Integer.parseInt(s);
- byte[] data = (byte []) testData.get(index);
- ByteArrayEntity entity = new ByteArrayEntity(data);
- response.setEntity(entity);
- }
-
- });
-
- this.server.start();
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpRequest get = new BasicHttpRequest("GET", "/?" + r);
- HttpResponse response = this.client.execute(get, host, conn);
- byte[] received = EntityUtils.toByteArray(response.getEntity());
- byte[] expected = (byte[]) testData.get(r);
-
- assertEquals(expected.length, received.length);
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], received[i]);
- }
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
-
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
-
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
- /**
- * This test case executes a series of simple POST requests with content length
- * delimited content.
- */
- @LargeTest
- public void testSimpleHttpPostsWithContentLength() throws Exception {
-
- int reqNo = 20;
-
- Random rnd = new Random();
-
- // Prepare some random data
- List testData = new ArrayList(reqNo);
- for (int i = 0; i < reqNo; i++) {
- int size = rnd.nextInt(5000);
- byte[] data = new byte[size];
- rnd.nextBytes(data);
- testData.add(data);
- }
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- if (request instanceof HttpEntityEnclosingRequest) {
- HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
- byte[] data = EntityUtils.toByteArray(incoming);
-
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(false);
- response.setEntity(outgoing);
- } else {
- StringEntity outgoing = new StringEntity("No content");
- response.setEntity(outgoing);
- }
- }
-
- });
-
- this.server.start();
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
- byte[] data = (byte[]) testData.get(r);
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- post.setEntity(outgoing);
-
- HttpResponse response = this.client.execute(post, host, conn);
- byte[] received = EntityUtils.toByteArray(response.getEntity());
- byte[] expected = (byte[]) testData.get(r);
-
- assertEquals(expected.length, received.length);
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], received[i]);
- }
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
-
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
- /**
- * This test case executes a series of simple POST requests with chunk
- * coded content content.
- */
- @LargeTest
- public void testSimpleHttpPostsChunked() throws Exception {
-
- int reqNo = 20;
-
- Random rnd = new Random();
-
- // Prepare some random data
- List testData = new ArrayList(reqNo);
- for (int i = 0; i < reqNo; i++) {
- int size = rnd.nextInt(20000);
- byte[] data = new byte[size];
- rnd.nextBytes(data);
- testData.add(data);
- }
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- if (request instanceof HttpEntityEnclosingRequest) {
- HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
- byte[] data = EntityUtils.toByteArray(incoming);
-
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(true);
- response.setEntity(outgoing);
- } else {
- StringEntity outgoing = new StringEntity("No content");
- response.setEntity(outgoing);
- }
- }
-
- });
-
- this.server.start();
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
- byte[] data = (byte[]) testData.get(r);
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(true);
- post.setEntity(outgoing);
-
- HttpResponse response = this.client.execute(post, host, conn);
- byte[] received = EntityUtils.toByteArray(response.getEntity());
- byte[] expected = (byte[]) testData.get(r);
-
- assertEquals(expected.length, received.length);
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], received[i]);
- }
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
- /**
- * This test case executes a series of simple HTTP/1.0 POST requests.
- */
- @LargeTest
- public void testSimpleHttpPostsHTTP10() throws Exception {
-
- int reqNo = 20;
-
- Random rnd = new Random();
-
- // Prepare some random data
- List testData = new ArrayList(reqNo);
- for (int i = 0; i < reqNo; i++) {
- int size = rnd.nextInt(5000);
- byte[] data = new byte[size];
- rnd.nextBytes(data);
- testData.add(data);
- }
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- if (request instanceof HttpEntityEnclosingRequest) {
- HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
- byte[] data = EntityUtils.toByteArray(incoming);
-
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(false);
- response.setEntity(outgoing);
- } else {
- StringEntity outgoing = new StringEntity("No content");
- response.setEntity(outgoing);
- }
- }
-
- });
-
- this.server.start();
-
- // Set protocol level to HTTP/1.0
- this.client.getParams().setParameter(
- CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
- byte[] data = (byte[]) testData.get(r);
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- post.setEntity(outgoing);
-
- HttpResponse response = this.client.execute(post, host, conn);
- assertEquals(HttpVersion.HTTP_1_0, response.getStatusLine().getProtocolVersion());
- byte[] received = EntityUtils.toByteArray(response.getEntity());
- byte[] expected = (byte[]) testData.get(r);
-
- assertEquals(expected.length, received.length);
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], received[i]);
- }
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
-
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
- /**
- * This test case executes a series of simple POST requests using
- * the 'expect: continue' handshake.
- */
- @LargeTest
- public void testHttpPostsWithExpectContinue() throws Exception {
-
- int reqNo = 20;
-
- Random rnd = new Random();
-
- // Prepare some random data
- List testData = new ArrayList(reqNo);
- for (int i = 0; i < reqNo; i++) {
- int size = rnd.nextInt(5000);
- byte[] data = new byte[size];
- rnd.nextBytes(data);
- testData.add(data);
- }
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- if (request instanceof HttpEntityEnclosingRequest) {
- HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
- byte[] data = EntityUtils.toByteArray(incoming);
-
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(true);
- response.setEntity(outgoing);
- } else {
- StringEntity outgoing = new StringEntity("No content");
- response.setEntity(outgoing);
- }
- }
-
- });
-
- this.server.start();
-
- // Activate 'expect: continue' handshake
- this.client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
- byte[] data = (byte[]) testData.get(r);
- ByteArrayEntity outgoing = new ByteArrayEntity(data);
- outgoing.setChunked(true);
- post.setEntity(outgoing);
-
- HttpResponse response = this.client.execute(post, host, conn);
- byte[] received = EntityUtils.toByteArray(response.getEntity());
- byte[] expected = (byte[]) testData.get(r);
-
- assertEquals(expected.length, received.length);
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], received[i]);
- }
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
-
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
-
- /**
- * This test case executes a series of simple POST requests that do not
- * meet the target server expectations.
- */
- @LargeTest
- public void testHttpPostsWithExpectationVerification() throws Exception {
-
- int reqNo = 3;
-
- // Initialize the server-side request handler
- this.server.registerHandler("*", new HttpRequestHandler() {
-
- public void handle(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException, IOException {
-
- StringEntity outgoing = new StringEntity("No content");
- response.setEntity(outgoing);
- }
-
- });
-
- this.server.setExpectationVerifier(new HttpExpectationVerifier() {
-
- public void verify(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws HttpException {
- Header someheader = request.getFirstHeader("Secret");
- if (someheader != null) {
- int secretNumber;
- try {
- secretNumber = Integer.parseInt(someheader.getValue());
- } catch (NumberFormatException ex) {
- response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
- return;
- }
- if (secretNumber < 2) {
- response.setStatusCode(HttpStatus.SC_EXPECTATION_FAILED);
- ByteArrayEntity outgoing = new ByteArrayEntity(
- EncodingUtils.getAsciiBytes("Wrong secret number"));
- response.setEntity(outgoing);
- }
- }
- }
-
- });
-
- this.server.start();
-
- // Activate 'expect: continue' handshake
- this.client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
-
- DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
- HttpHost host = new HttpHost("localhost", this.server.getPort());
-
- try {
- for (int r = 0; r < reqNo; r++) {
- if (!conn.isOpen()) {
- Socket socket = new Socket(host.getHostName(), host.getPort());
- conn.bind(socket, this.client.getParams());
- }
-
- BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
- post.addHeader("Secret", Integer.toString(r));
- ByteArrayEntity outgoing = new ByteArrayEntity(
- EncodingUtils.getAsciiBytes("No content"));
- post.setEntity(outgoing);
-
- HttpResponse response = this.client.execute(post, host, conn);
-
- HttpEntity entity = response.getEntity();
- assertNotNull(entity);
- entity.consumeContent();
-
- if (r < 2) {
- assertEquals(HttpStatus.SC_EXPECTATION_FAILED, response.getStatusLine().getStatusCode());
- } else {
- assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
- }
-
- if (!this.client.keepAlive(response)) {
- conn.close();
- }
- }
- //Verify the connection metrics
- HttpConnectionMetrics cm = conn.getMetrics();
- assertEquals(reqNo, cm.getRequestCount());
- assertEquals(reqNo, cm.getResponseCount());
- } finally {
- conn.close();
- this.server.shutdown();
- }
- }
-
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/TimeTest.java b/tests/AndroidTests/src/com/android/unit_tests/TimeTest.java
index 110caa4..3b33a99 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/TimeTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/TimeTest.java
@@ -20,6 +20,7 @@
import android.test.suitebuilder.annotation.Suppress;
import android.text.format.Time;
import android.util.Log;
+import android.util.TimeFormatException;
import junit.framework.TestCase;
@@ -354,6 +355,86 @@
}
@SmallTest
+ public void testParse33390() throws Exception {
+ Time t = new Time(Time.TIMEZONE_UTC);
+
+ t.parse3339("1980-05-23");
+ if (!t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23) {
+ fail("Did not parse all-day date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != 0) {
+ fail("Did not parse timezone-offset-less date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50Z");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != 0) {
+ fail("Did not parse UTC date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50.0Z");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != 0) {
+ fail("Did not parse UTC date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50.12Z");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != 0) {
+ fail("Did not parse UTC date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50.123Z");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != 0) {
+ fail("Did not parse UTC date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50-06:00");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != -6*3600) {
+ fail("Did not parse timezone-offset date correctly");
+ }
+
+ t.parse3339("1980-05-23T09:50:50.123-06:00");
+ if (t.allDay || t.year != 1980 || t.month != 05 || t.monthDay != 23 ||
+ t.hour != 9 || t.minute != 50 || t.second != 50 ||
+ t.gmtoff != -6*3600) {
+ fail("Did not parse timezone-offset date correctly");
+ }
+
+ try {
+ t.parse3339("1980");
+ fail("Did not throw error on truncated input length");
+ } catch (TimeFormatException e) {
+ // Successful
+ }
+
+ try {
+ t.parse3339("1980-05-23T09:50:50.123+");
+ fail("Did not throw error on truncated timezone offset");
+ } catch (TimeFormatException e1) {
+ // Successful
+ }
+
+ try {
+ t.parse3339("1980-05-23T09:50:50.123+05:0");
+ fail("Did not throw error on truncated timezone offset");
+ } catch (TimeFormatException e1) {
+ // Successful
+ }
+ }
+
+ @SmallTest
public void testSet0() throws Exception {
Time t = new Time(Time.TIMEZONE_UTC);
t.set(1000L);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
index d17e2c3..42066d9 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
@@ -541,4 +541,33 @@
assertEquals(nestedUrl,
Uri.decode(uri.getQueryParameters("nested").get(0)));
}
+
+ public void testGetQueryParameterEdgeCases() {
+ Uri uri;
+
+ // key at beginning of URL
+ uri = Uri.parse("http://test/").buildUpon()
+ .appendQueryParameter("key", "a b")
+ .appendQueryParameter("keya", "c d")
+ .appendQueryParameter("bkey", "e f")
+ .build();
+ assertEquals("a b", uri.getQueryParameter("key"));
+
+ // key in middle of URL
+ uri = Uri.parse("http://test/").buildUpon()
+ .appendQueryParameter("akeyb", "a b")
+ .appendQueryParameter("keya", "c d")
+ .appendQueryParameter("key", "e f")
+ .appendQueryParameter("bkey", "g h")
+ .build();
+ assertEquals("e f", uri.getQueryParameter("key"));
+
+ // key at end of URL
+ uri = Uri.parse("http://test/").buildUpon()
+ .appendQueryParameter("akeyb", "a b")
+ .appendQueryParameter("keya", "c d")
+ .appendQueryParameter("key", "y z")
+ .build();
+ assertEquals("y z", uri.getQueryParameter("key"));
+ }
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java b/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java
deleted file mode 100644
index a7c19a7..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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 com.android.unit_tests;
-
-import android.content.ContentResolver;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.google.android.net.UrlRules;
-import static com.google.android.net.UrlRules.Rule;
-
-/** Test loading and matching URL rewrite rules for UrlRules. */
-public class UrlRulesTest extends AndroidTestCase {
- @SmallTest
- public void testEmptyRules() {
- UrlRules rules = new UrlRules(new Rule[] { });
- assertTrue(rules.matchRule("http://foo.bar/") == Rule.DEFAULT);
- }
-
- @SmallTest
- public void testInvalidRule() throws Exception {
- try {
- new Rule("rule", "foo bar");
- } catch (Exception e) {
- // Re-throw any exception except the one we're looking for.
- if (!e.toString().contains("Illegal rule: foo bar")) throw e;
- }
- }
-
- @SmallTest
- public void testRewriteRule() throws UrlRules.RuleFormatException {
- Rule rule = new Rule("test_rule",
- "http://foo.bar/ rewrite http://bar.foo/");
- assertEquals("test_rule", rule.mName);
- assertEquals("http://foo.bar/", rule.mPrefix);
- assertEquals("http://bar.foo/", rule.mRewrite);
- assertFalse(rule.mBlock);
- assertEquals("http://bar.foo/bat", rule.apply("http://foo.bar/bat"));
- }
-
- @SmallTest
- public void testBlockRule() throws UrlRules.RuleFormatException {
- Rule rule = new Rule("test_rule",
- "http://foo.bar/ block");
- assertEquals("test_rule", rule.mName);
- assertEquals("http://foo.bar/", rule.mPrefix);
- assertTrue(rule.mRewrite == null);
- assertTrue(rule.mBlock);
- assertTrue(rule.apply("http://foo.bar/bat") == null);
- }
-
- @SmallTest
- public void testMatchRule() throws UrlRules.RuleFormatException {
- UrlRules rules = new UrlRules(new Rule[] {
- new Rule("12", "http://one.two/ rewrite http://buckle.my.shoe/"),
- new Rule("34", "http://three.four/ rewrite http://close.the.door/"),
- new Rule("56", "http://five.six/ rewrite http://pick.up.sticks/"),
- });
-
- assertTrue(rules.matchRule("https://one.two/") == Rule.DEFAULT);
- assertTrue(rules.matchRule("http://one.two") == Rule.DEFAULT);
- assertEquals("12", rules.matchRule("http://one.two/foo").mName);
-
- String u = "http://five.six/bar";
- assertEquals("http://pick.up.sticks/bar", rules.matchRule(u).apply(u));
- }
-
- @SmallTest
- public void testAmbiguousMatch() throws UrlRules.RuleFormatException {
- // Rule is the longest match wins.
- UrlRules rules = new UrlRules(new Rule[] {
- new Rule("1", "http://xyz/one rewrite http://rewrite/"),
- new Rule("123", "http://xyz/onetwothree rewrite http://rewrite/"),
- new Rule("12", "http://xyz/onetwo rewrite http://rewrite/"),
- });
-
- assertEquals("1", rules.matchRule("http://xyz/one").mName);
- assertEquals("1", rules.matchRule("http://xyz/one...").mName);
- assertEquals("12", rules.matchRule("http://xyz/onetwo...").mName);
- assertEquals("123", rules.matchRule("http://xyz/onetwothree...").mName);
-
- }
-
- @MediumTest
- public void testGservicesRules() {
- // TODO: use a MockContentProvider/MockContentResolver instead.
- ContentResolver r = getContext().getContentResolver();
-
- // Update the digest, so the UrlRules cache is reloaded.
- Settings.Gservices.putString(r, "digest", "testGservicesRules");
- Settings.Gservices.putString(r, "url:blank_test", "");
- Settings.Gservices.putString(r, "url:test",
- "http://foo.bar/ rewrite http://bar.foo/");
-
- UrlRules rules = UrlRules.getRules(r); // Don't crash, please. :)
- assertTrue(rules.matchRule("http://bar.foo/") == Rule.DEFAULT);
-
- Rule rule = rules.matchRule("http://foo.bar/bat");
- assertEquals("test", rule.mName);
- assertEquals("http://foo.bar/", rule.mPrefix);
- assertEquals("http://bar.foo/", rule.mRewrite);
- assertFalse(rule.mBlock);
- }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/ExportTestResolver.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/ExportTestResolver.java
index 38aed6f..a76dfd8 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/ExportTestResolver.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/vcard/ExportTestResolver.java
@@ -110,8 +110,41 @@
return contactEntry;
}
+ /**
+ * <p>
+ * An old method which had existed but was removed from ContentResolver.
+ * </p>
+ * <p>
+ * We still keep using this method since we don't have a propeer way to know
+ * which value in the ContentValue corresponds to the entry in Contacts database.
+ * </p>
+ * <p>
+ * Detail:
+ * There's an easy way to know which index "family name" corresponds to, via
+ * {@link android.provider.ContactsContract}.
+ * FAMILY_NAME equals DATA3, so the corresponding index
+ * for "family name" should be 2 (note that index is 0-origin).
+ * However, we cannot know what the index 2 corresponds to; it may be "family name",
+ * "label" for now, but may be the other some column in the future. We don't have
+ * convenient way to know the original data structure.
+ * </p>
+ */
+ public EntityIterator queryEntities(Uri uri,
+ String selection, String[] selectionArgs, String sortOrder) {
+ mTestCase.assertTrue(uri != null);
+ mTestCase.assertTrue(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
+ final String authority = uri.getAuthority();
+ mTestCase.assertTrue(RawContacts.CONTENT_URI.getAuthority().equals(authority));
+ mTestCase.assertTrue((Data.CONTACT_ID + "=?").equals(selection));
+ mTestCase.assertEquals(1, selectionArgs.length);
+ final int id = Integer.parseInt(selectionArgs[0]);
+ mTestCase.assertTrue(id >= 0 && id < mContactEntryList.size());
+
+ return new MockEntityIterator(mContactEntryList.get(id).getList());
+ }
+
@Override
- public Cursor query(Uri uri, String[] projection,
+ public Cursor query(Uri uri,String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
mTestCase.assertTrue(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri));
// In this test, following arguments are not supported.
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardVerifier.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardVerifier.java
index e5cdf63..4b97750 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardVerifier.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardVerifier.java
@@ -15,8 +15,11 @@
*/
package com.android.unit_tests.vcard;
+import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.EntityIterator;
+import android.net.Uri;
import android.pim.vcard.VCardComposer;
import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardEntryConstructor;
@@ -32,6 +35,7 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Method;
import java.util.Arrays;
/* package */ class CustomMockContext extends MockContext {
@@ -259,8 +263,24 @@
}
}
+ public static EntityIterator mockGetEntityIteratorMethod(
+ final ContentResolver resolver,
+ final Uri uri, final String selection,
+ final String[] selectionArgs, final String sortOrder) {
+ final ContentProvider provider =
+ resolver.acquireContentProviderClient(uri).getLocalContentProvider();
+ return ((ExportTestProvider)provider).queryEntities(
+ uri, selection, selectionArgs, sortOrder);
+ }
+
+ private Method getMockGetEntityIteratorMethod()
+ throws SecurityException, NoSuchMethodException {
+ return this.getClass().getMethod("mockGetEntityIteratorMethod",
+ ContentResolver.class, Uri.class, String.class, String[].class, String.class);
+ }
+
private void verifyForExportTest() {
- VCardComposer composer =
+ final VCardComposer composer =
new VCardComposer(new CustomMockContext(mExportTestResolver), mVCardType);
composer.addHandler(mLineVerifier);
composer.addHandler(mVCardVerifierInternal);
@@ -270,7 +290,14 @@
mTestCase.assertFalse(composer.isAfterLast());
try {
while (!composer.isAfterLast()) {
- mTestCase.assertTrue(composer.createOneEntry());
+ try {
+ final Method mockGetEntityIteratorMethod = getMockGetEntityIteratorMethod();
+ mTestCase.assertTrue(
+ composer.createOneEntry(getMockGetEntityIteratorMethod()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ mTestCase.fail();
+ }
}
} finally {
composer.terminate();
diff --git a/tests/BatteryWaster/res/layout/battery_waster.xml b/tests/BatteryWaster/res/layout/battery_waster.xml
index b6eab03..e1cb6bf 100644
--- a/tests/BatteryWaster/res/layout/battery_waster.xml
+++ b/tests/BatteryWaster/res/layout/battery_waster.xml
@@ -15,13 +15,13 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
>
<CheckBox android:id="@+id/checkbox"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginTop="25dp"
@@ -31,12 +31,12 @@
/>
<ScrollView android:id="@+id/scroll"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
>
<TextView android:id="@+id/log"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:textSize="12sp"
diff --git a/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java
index 77e390b..e750ac8 100644
--- a/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java
+++ b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java
@@ -65,8 +65,8 @@
webView.setWebChromeClient(chromeClient);
contentView.addView(webView, new LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
handler = new Handler() {
@Override
diff --git a/tests/CoreTests/android/core/DatabaseSessionCache.java b/tests/CoreTests/android/core/DatabaseSessionCache.java
index c344d9c..040a13e 100644
--- a/tests/CoreTests/android/core/DatabaseSessionCache.java
+++ b/tests/CoreTests/android/core/DatabaseSessionCache.java
@@ -136,8 +136,8 @@
}
// public static boolean enabled(Context androidContext) {
-// String sslCache = Settings.Gservices.getString(androidContext.getContentResolver(),
-// Settings.Gservices.SSL_SESSION_CACHE);
+// String sslCache = Settings.Secure.getString(androidContext.getContentResolver(),
+// Settings.Secure.SSL_SESSION_CACHE);
//
// if (Log.isLoggable(TAG, Log.DEBUG)) {
// Log.d(TAG, "enabled " + sslCache + " " + androidContext.getPackageName());
@@ -309,4 +309,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
index ae53b76..cde2c71 100644
--- a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
+++ b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
@@ -141,20 +141,20 @@
private View scrollWrap(View view) {
ScrollView scroller = new ScrollView(this);
- scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.FILL_PARENT,
- ScrollView.LayoutParams.FILL_PARENT));
+ scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
+ ScrollView.LayoutParams.MATCH_PARENT));
return scroller;
}
private void addLabelToRoot(LinearLayout root, String text) {
TextView label = new TextView(this);
label.setText(text);
- root.addView(label, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
+ root.addView(label, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
}
private void addChildToRoot(LinearLayout root, LinearLayout layout) {
- root.addView(layout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
+ root.addView(layout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
index fbce78a..9a4e99e 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
@@ -85,8 +85,8 @@
webView.setWebChromeClient(chromeClient);
contentView.addView(webView, new LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
handler = new Handler() {
@Override
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index b6b1661..5763b85 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -126,7 +126,7 @@
mWebView.addJavascriptInterface(mCallbackProxy, "eventSender");
setupWebViewForLayoutTests(mWebView, mCallbackProxy);
- contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
+ contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
diff --git a/tests/FrameworkTest/res/layout/add_column_in_table.xml b/tests/FrameworkTest/res/layout/add_column_in_table.xml
index 62c27f3..05f55a8 100644
--- a/tests/FrameworkTest/res/layout/add_column_in_table.xml
+++ b/tests/FrameworkTest/res/layout/add_column_in_table.xml
@@ -16,11 +16,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<TableLayout android:id="@+id/table"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1.0">
diff --git a/tests/FrameworkTest/res/layout/autocompletetextview_simple.xml b/tests/FrameworkTest/res/layout/autocompletetextview_simple.xml
index d408a86..1a200764 100644
--- a/tests/FrameworkTest/res/layout/autocompletetextview_simple.xml
+++ b/tests/FrameworkTest/res/layout/autocompletetextview_simple.xml
@@ -20,12 +20,12 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<AutoCompleteTextView
android:id="@+id/autocompletetextview1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text|textAutoComplete"
android:completionThreshold="1" />
diff --git a/tests/FrameworkTest/res/layout/baseline_0width_and_weight.xml b/tests/FrameworkTest/res/layout/baseline_0width_and_weight.xml
index 83f3fcb..aa3132d 100644
--- a/tests/FrameworkTest/res/layout/baseline_0width_and_weight.xml
+++ b/tests/FrameworkTest/res/layout/baseline_0width_and_weight.xml
@@ -19,10 +19,10 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout android:id="@+id/layout"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
diff --git a/tests/FrameworkTest/res/layout/baseline_buttons.xml b/tests/FrameworkTest/res/layout/baseline_buttons.xml
index ae942017..3e364bd 100644
--- a/tests/FrameworkTest/res/layout/baseline_buttons.xml
+++ b/tests/FrameworkTest/res/layout/baseline_buttons.xml
@@ -19,7 +19,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
diff --git a/tests/FrameworkTest/res/layout/baseline_center_gravity.xml b/tests/FrameworkTest/res/layout/baseline_center_gravity.xml
index 9793ab4..dd1318d 100644
--- a/tests/FrameworkTest/res/layout/baseline_center_gravity.xml
+++ b/tests/FrameworkTest/res/layout/baseline_center_gravity.xml
@@ -19,7 +19,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/button1"
android:layout_height="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/descendant_focusability.xml b/tests/FrameworkTest/res/layout/descendant_focusability.xml
index 6a30d50d..0cb75fd 100644
--- a/tests/FrameworkTest/res/layout/descendant_focusability.xml
+++ b/tests/FrameworkTest/res/layout/descendant_focusability.xml
@@ -20,19 +20,19 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/beforeDescendants"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
>
<Button
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
@@ -40,12 +40,12 @@
<LinearLayout
android:id="@+id/afterDescendants"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="afterDescendants"
>
<Button
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
@@ -53,12 +53,12 @@
<LinearLayout
android:id="@+id/blocksDescendants"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
>
<Button
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/disabled.xml b/tests/FrameworkTest/res/layout/disabled.xml
index ed7ff06..4b41248 100644
--- a/tests/FrameworkTest/res/layout/disabled.xml
+++ b/tests/FrameworkTest/res/layout/disabled.xml
@@ -23,8 +23,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/clickableParent"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/disabledButton"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/fill_in_wrap.xml b/tests/FrameworkTest/res/layout/fill_in_wrap.xml
index b61fd30..1c3f811 100644
--- a/tests/FrameworkTest/res/layout/fill_in_wrap.xml
+++ b/tests/FrameworkTest/res/layout/fill_in_wrap.xml
@@ -15,7 +15,7 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:baselineAligned="false"
@@ -28,7 +28,7 @@
/>
<LinearLayout android:id="@+id/layout"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="0dip"
android:paddingRight="0dip"
@@ -43,7 +43,7 @@
<EditText android:id="@+id/data"
android:layout_width="0dip"
android:layout_weight="1"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_marginLeft="8dip"
android:paddingBottom="4dip"
android:layout_gravity="center_vertical"
diff --git a/tests/FrameworkTest/res/layout/focus_after_removal.xml b/tests/FrameworkTest/res/layout/focus_after_removal.xml
index 7cf6cbe..f4e388d 100644
--- a/tests/FrameworkTest/res/layout/focus_after_removal.xml
+++ b/tests/FrameworkTest/res/layout/focus_after_removal.xml
@@ -20,7 +20,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout android:id="@+id/leftLayout"
diff --git a/tests/FrameworkTest/res/layout/focus_listener.xml b/tests/FrameworkTest/res/layout/focus_listener.xml
index a838205..6faa21c 100644
--- a/tests/FrameworkTest/res/layout/focus_listener.xml
+++ b/tests/FrameworkTest/res/layout/focus_listener.xml
@@ -20,7 +20,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/left"
diff --git a/tests/FrameworkTest/res/layout/framelayout_gravity.xml b/tests/FrameworkTest/res/layout/framelayout_gravity.xml
index ce48825..e89fce5 100644
--- a/tests/FrameworkTest/res/layout/framelayout_gravity.xml
+++ b/tests/FrameworkTest/res/layout/framelayout_gravity.xml
@@ -16,8 +16,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/left"
android:layout_gravity="left"
diff --git a/tests/FrameworkTest/res/layout/framelayout_margin.xml b/tests/FrameworkTest/res/layout/framelayout_margin.xml
index 1e14899..9120bcb 100644
--- a/tests/FrameworkTest/res/layout/framelayout_margin.xml
+++ b/tests/FrameworkTest/res/layout/framelayout_margin.xml
@@ -16,8 +16,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/left"
android:layout_gravity="left"
diff --git a/tests/FrameworkTest/res/layout/grid_in_horizontal.xml b/tests/FrameworkTest/res/layout/grid_in_horizontal.xml
index 835dce3..62d7bcb 100644
--- a/tests/FrameworkTest/res/layout/grid_in_horizontal.xml
+++ b/tests/FrameworkTest/res/layout/grid_in_horizontal.xml
@@ -16,12 +16,12 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<GridView android:id="@+id/grid"
android:layout_width="0dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:padding="10dip"
android:verticalSpacing="10dp"
diff --git a/tests/FrameworkTest/res/layout/grid_in_vertical.xml b/tests/FrameworkTest/res/layout/grid_in_vertical.xml
index 731bc54..fea459a 100644
--- a/tests/FrameworkTest/res/layout/grid_in_vertical.xml
+++ b/tests/FrameworkTest/res/layout/grid_in_vertical.xml
@@ -16,8 +16,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<GridView android:id="@+id/grid"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/grid_scroll_listener.xml b/tests/FrameworkTest/res/layout/grid_scroll_listener.xml
index c02aed9..82b1058 100644
--- a/tests/FrameworkTest/res/layout/grid_scroll_listener.xml
+++ b/tests/FrameworkTest/res/layout/grid_scroll_listener.xml
@@ -16,11 +16,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<GridView android:id="@+id/grid"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:padding="10dip"
@@ -32,7 +32,7 @@
android:gravity="center"/>
<TextView android:id="@+id/text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
diff --git a/tests/FrameworkTest/res/layout/grid_thrasher.xml b/tests/FrameworkTest/res/layout/grid_thrasher.xml
index 1a260df..346acff 100644
--- a/tests/FrameworkTest/res/layout/grid_thrasher.xml
+++ b/tests/FrameworkTest/res/layout/grid_thrasher.xml
@@ -16,12 +16,12 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<GridView android:id="@+id/grid"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:padding="10dip"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
@@ -31,7 +31,7 @@
android:gravity="center"/>
<TextView android:id="@+id/text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
diff --git a/tests/FrameworkTest/res/layout/include_tag.xml b/tests/FrameworkTest/res/layout/include_tag.xml
index d1047f1..b2f6ab1 100644
--- a/tests/FrameworkTest/res/layout/include_tag.xml
+++ b/tests/FrameworkTest/res/layout/include_tag.xml
@@ -16,8 +16,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<TextView
android:text="@string/include_label"
diff --git a/tests/FrameworkTest/res/layout/inflated_expandablelistview.xml b/tests/FrameworkTest/res/layout/inflated_expandablelistview.xml
index d01e7c5..6f683e5 100644
--- a/tests/FrameworkTest/res/layout/inflated_expandablelistview.xml
+++ b/tests/FrameworkTest/res/layout/inflated_expandablelistview.xml
@@ -16,5 +16,5 @@
<ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/elv"
- android:layout_height="fill_parent"
- android:layout_width="fill_parent" />
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
diff --git a/tests/FrameworkTest/res/layout/linear_layout_buttons.xml b/tests/FrameworkTest/res/layout/linear_layout_buttons.xml
index f60692a..bcb28e7 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_buttons.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_buttons.xml
@@ -20,26 +20,26 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button
android:id="@+id/button1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:text="@string/keypad_one"/>
<Button
android:id="@+id/button2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:text="@string/keypad_two"/>
<Button
android:id="@+id/button3"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:text="@string/keypad_three"/>
diff --git a/tests/FrameworkTest/res/layout/linear_layout_edittext_then_button.xml b/tests/FrameworkTest/res/layout/linear_layout_edittext_then_button.xml
index 21e7399..ab76e29 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_edittext_then_button.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_edittext_then_button.xml
@@ -20,18 +20,18 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"/>
<Button
android:id="@+id/button"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:text="@string/keypad_one"/>
diff --git a/tests/FrameworkTest/res/layout/linear_layout_grid.xml b/tests/FrameworkTest/res/layout/linear_layout_grid.xml
index 81f7b15..67b6877 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_grid.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_grid.xml
@@ -20,80 +20,80 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout android:id="@+id/column1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_one"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_two"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_three"/>
</LinearLayout>
<LinearLayout android:id="@+id/column2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_four"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_five"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_six"/>
</LinearLayout>
<LinearLayout android:id="@+id/column3"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0sp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_seven"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_eight"/>
<Button
android:layout_width="0sp"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/keypad_nine"/>
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/linear_layout_listview_height.xml b/tests/FrameworkTest/res/layout/linear_layout_listview_height.xml
index 10ef2ce..873b2d2 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_listview_height.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_listview_height.xml
@@ -20,19 +20,19 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<!-- Outer linear layout providing vertical layout -->
<LinearLayout
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- The control buttons -->
<LinearLayout
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
@@ -58,7 +58,7 @@
<ListView
android:id="@+id/inner_list"
android:layout_width="200dip"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:background="@android:drawable/spinner_dropdown_background"
android:divider="@android:drawable/divider_horizontal_bright" />
diff --git a/tests/FrameworkTest/res/layout/linear_layout_spinner_then_button.xml b/tests/FrameworkTest/res/layout/linear_layout_spinner_then_button.xml
index 7ed245b..53c0280 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_spinner_then_button.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_spinner_then_button.xml
@@ -20,7 +20,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Spinner android:id="@+id/reminder_value"
diff --git a/tests/FrameworkTest/res/layout/linear_layout_textviews.xml b/tests/FrameworkTest/res/layout/linear_layout_textviews.xml
index 84a898c..ccec213 100644
--- a/tests/FrameworkTest/res/layout/linear_layout_textviews.xml
+++ b/tests/FrameworkTest/res/layout/linear_layout_textviews.xml
@@ -21,7 +21,7 @@
android:id="@+id/layout"
android:background="#FFFF0000"
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
diff --git a/tests/FrameworkTest/res/layout/list_dividers.xml b/tests/FrameworkTest/res/layout/list_dividers.xml
index b56511e6..93810b4 100644
--- a/tests/FrameworkTest/res/layout/list_dividers.xml
+++ b/tests/FrameworkTest/res/layout/list_dividers.xml
@@ -16,8 +16,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/list_filter.xml b/tests/FrameworkTest/res/layout/list_filter.xml
index cea518c..0ab7101 100644
--- a/tests/FrameworkTest/res/layout/list_filter.xml
+++ b/tests/FrameworkTest/res/layout/list_filter.xml
@@ -16,24 +16,24 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<FrameLayout android:id="@+id/frame"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1">
<ListView android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:drawSelectorOnTop="false" />
</FrameLayout>
<LinearLayout
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/hide"
diff --git a/tests/FrameworkTest/res/layout/list_in_horizontal.xml b/tests/FrameworkTest/res/layout/list_in_horizontal.xml
index 371cb84..b770628 100644
--- a/tests/FrameworkTest/res/layout/list_in_horizontal.xml
+++ b/tests/FrameworkTest/res/layout/list_in_horizontal.xml
@@ -15,8 +15,8 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<TableRow>
diff --git a/tests/FrameworkTest/res/layout/list_in_vertical.xml b/tests/FrameworkTest/res/layout/list_in_vertical.xml
index 0ea2475..f951cb7 100644
--- a/tests/FrameworkTest/res/layout/list_in_vertical.xml
+++ b/tests/FrameworkTest/res/layout/list_in_vertical.xml
@@ -15,16 +15,16 @@
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView android:id="@+id/list"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageButton
diff --git a/tests/FrameworkTest/res/layout/list_recycler_profiling.xml b/tests/FrameworkTest/res/layout/list_recycler_profiling.xml
index 9678eb7..3fc6bd6 100644
--- a/tests/FrameworkTest/res/layout/list_recycler_profiling.xml
+++ b/tests/FrameworkTest/res/layout/list_recycler_profiling.xml
@@ -16,11 +16,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ListView android:id="@+id/list"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1.0" />
diff --git a/tests/FrameworkTest/res/layout/list_scroll_listener.xml b/tests/FrameworkTest/res/layout/list_scroll_listener.xml
index 001296a..58ab55f 100644
--- a/tests/FrameworkTest/res/layout/list_scroll_listener.xml
+++ b/tests/FrameworkTest/res/layout/list_scroll_listener.xml
@@ -16,17 +16,17 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ListView android:id="@android:id/list"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView android:id="@+id/text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
diff --git a/tests/FrameworkTest/res/layout/list_take_focus_from_side.xml b/tests/FrameworkTest/res/layout/list_take_focus_from_side.xml
index cf141cc..ee40019 100644
--- a/tests/FrameworkTest/res/layout/list_take_focus_from_side.xml
+++ b/tests/FrameworkTest/res/layout/list_take_focus_from_side.xml
@@ -16,19 +16,19 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ListView android:id="@android:id/list"
android:layout_width="0dip"
android:layout_weight="1"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:drawSelectorOnTop="false"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
- android:layout_height="fill_parent">
+ android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/list_thrasher.xml b/tests/FrameworkTest/res/layout/list_thrasher.xml
index 001296a..58ab55f 100644
--- a/tests/FrameworkTest/res/layout/list_thrasher.xml
+++ b/tests/FrameworkTest/res/layout/list_thrasher.xml
@@ -16,17 +16,17 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ListView android:id="@android:id/list"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView android:id="@+id/text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
diff --git a/tests/FrameworkTest/res/layout/list_with_button_above.xml b/tests/FrameworkTest/res/layout/list_with_button_above.xml
index 25db016..18bcf6b 100644
--- a/tests/FrameworkTest/res/layout/list_with_button_above.xml
+++ b/tests/FrameworkTest/res/layout/list_with_button_above.xml
@@ -19,18 +19,18 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/button"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_above_list_label"/>
<ListView android:id="@android:id/list"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:paddingTop="2dip"
diff --git a/tests/FrameworkTest/res/layout/list_with_disappearing_item_bug_item.xml b/tests/FrameworkTest/res/layout/list_with_disappearing_item_bug_item.xml
index 0163d96..82af6cad 100644
--- a/tests/FrameworkTest/res/layout/list_with_disappearing_item_bug_item.xml
+++ b/tests/FrameworkTest/res/layout/list_with_disappearing_item_bug_item.xml
@@ -16,13 +16,13 @@
<!-- A layout is needed to reprod the bug. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight">
<TextView
android:id="@+id/text1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:paddingLeft="27dip"
diff --git a/tests/FrameworkTest/res/layout/list_with_empty_view.xml b/tests/FrameworkTest/res/layout/list_with_empty_view.xml
index 00d81a7..23bb658 100644
--- a/tests/FrameworkTest/res/layout/list_with_empty_view.xml
+++ b/tests/FrameworkTest/res/layout/list_with_empty_view.xml
@@ -16,17 +16,17 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
<ListView android:id="@android:id/list"
android:drawSelectorOnTop="false"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
<TextView android:id="@+id/empty"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:gravity="center"
android:textSize="36sp"
android:textColor="#999"
diff --git a/tests/FrameworkTest/res/layout/longpress.xml b/tests/FrameworkTest/res/layout/longpress.xml
index ef3672c..3a69fae 100644
--- a/tests/FrameworkTest/res/layout/longpress.xml
+++ b/tests/FrameworkTest/res/layout/longpress.xml
@@ -20,8 +20,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<View android:id="@+id/simple_view"
android:background="@drawable/blue"
diff --git a/tests/FrameworkTest/res/layout/mail_message.xml b/tests/FrameworkTest/res/layout/mail_message.xml
index ed52751..7f15e4f 100644
--- a/tests/FrameworkTest/res/layout/mail_message.xml
+++ b/tests/FrameworkTest/res/layout/mail_message.xml
@@ -18,11 +18,11 @@
a list with a list of messages.-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/subject"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<WebView android:id="@+id/body"
diff --git a/tests/FrameworkTest/res/layout/popup_window_visibility.xml b/tests/FrameworkTest/res/layout/popup_window_visibility.xml
index 21c94bb..3aa714d 100644
--- a/tests/FrameworkTest/res/layout/popup_window_visibility.xml
+++ b/tests/FrameworkTest/res/layout/popup_window_visibility.xml
@@ -16,25 +16,25 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<FrameLayout android:id="@+id/frame"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1">
<LinearLayout
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Spinner android:id="@+id/spinner"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content" />
<AutoCompleteTextView android:id="@+id/auto"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
@@ -43,7 +43,7 @@
<LinearLayout
android:orientation="horizontal"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/hide"
diff --git a/tests/FrameworkTest/res/layout/pre_draw_listener.xml b/tests/FrameworkTest/res/layout/pre_draw_listener.xml
index d348d9f..7a8f33f 100644
--- a/tests/FrameworkTest/res/layout/pre_draw_listener.xml
+++ b/tests/FrameworkTest/res/layout/pre_draw_listener.xml
@@ -16,20 +16,20 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ScrollView
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1">
<view class="com.android.frameworktest.view.PreDrawListener$MyLinearLayout" android:id="@+id/frame"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
</ScrollView>
diff --git a/tests/FrameworkTest/res/layout/radiogroup_checkedchild.xml b/tests/FrameworkTest/res/layout/radiogroup_checkedchild.xml
index 7724729..db88f4d 100644
--- a/tests/FrameworkTest/res/layout/radiogroup_checkedchild.xml
+++ b/tests/FrameworkTest/res/layout/radiogroup_checkedchild.xml
@@ -21,23 +21,23 @@
<RadioButton
android:id="@+id/value_one"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:textColor="#555555"
android:checked="true"
android:text="@string/visibility_1_view_1" />
<RadioButton
android:id="@+id/value_two"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:textColor="#555555"
android:text="@string/visibility_1_view_2" />
<RadioButton
android:id="@+id/value_three"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:textColor="#555555"
android:text="@string/visibility_1_view_3" />
diff --git a/tests/FrameworkTest/res/layout/remote_view_host.xml b/tests/FrameworkTest/res/layout/remote_view_host.xml
index dc52181..19d0a73 100644
--- a/tests/FrameworkTest/res/layout/remote_view_host.xml
+++ b/tests/FrameworkTest/res/layout/remote_view_host.xml
@@ -20,6 +20,6 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/remote_view_test_bad_1.xml b/tests/FrameworkTest/res/layout/remote_view_test_bad_1.xml
index 6a65976..bdac697 100644
--- a/tests/FrameworkTest/res/layout/remote_view_test_bad_1.xml
+++ b/tests/FrameworkTest/res/layout/remote_view_test_bad_1.xml
@@ -21,8 +21,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<EditText android:id="@+id/edit"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/remote_view_test_bad_2.xml b/tests/FrameworkTest/res/layout/remote_view_test_bad_2.xml
index 70613c3..630e603 100644
--- a/tests/FrameworkTest/res/layout/remote_view_test_bad_2.xml
+++ b/tests/FrameworkTest/res/layout/remote_view_test_bad_2.xml
@@ -21,8 +21,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<WebView android:id="@+id/web"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/remote_view_test_good.xml b/tests/FrameworkTest/res/layout/remote_view_test_good.xml
index 54f4db9..ce9755b 100644
--- a/tests/FrameworkTest/res/layout/remote_view_test_good.xml
+++ b/tests/FrameworkTest/res/layout/remote_view_test_good.xml
@@ -21,8 +21,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/scroll_to_rect_with_internal_scroll.xml b/tests/FrameworkTest/res/layout/scroll_to_rect_with_internal_scroll.xml
index d22122d..b6ec479 100644
--- a/tests/FrameworkTest/res/layout/scroll_to_rect_with_internal_scroll.xml
+++ b/tests/FrameworkTest/res/layout/scroll_to_rect_with_internal_scroll.xml
@@ -22,24 +22,24 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/scrollToBlob"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/scroll_top_button"/>
<TextView android:id="@+id/blob"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="80dip"
android:layout_marginTop="500dip"
android:layout_marginBottom="5dip"/>
diff --git a/tests/FrameworkTest/res/layout/scroll_to_rectangle.xml b/tests/FrameworkTest/res/layout/scroll_to_rectangle.xml
index 0839b1a..55d057d 100644
--- a/tests/FrameworkTest/res/layout/scroll_to_rectangle.xml
+++ b/tests/FrameworkTest/res/layout/scroll_to_rectangle.xml
@@ -22,55 +22,55 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/scrollToRectFromTop"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/scroll_top_button"/>
<Button android:id="@+id/scrollToRectFromTop2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dip"
android:text="@string/scroll_top_button2"/>
<TextView android:id="@+id/topBlob"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"/>
<TextView android:id="@+id/childToMakeVisible"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
android:text="@string/scroll_to_me"/>
<TextView android:id="@+id/bottomBlob"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"/>
<Button android:id="@+id/scrollToRectFromBottom2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:text="@string/scroll_bottom_button2"/>
<Button android:id="@+id/scrollToRectFromBottom"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/scroll_bottom_button"/>
diff --git a/tests/FrameworkTest/res/layout/scrollview_linear_layout.xml b/tests/FrameworkTest/res/layout/scrollview_linear_layout.xml
index 536d2ed..a3c12ce 100644
--- a/tests/FrameworkTest/res/layout/scrollview_linear_layout.xml
+++ b/tests/FrameworkTest/res/layout/scrollview_linear_layout.xml
@@ -16,14 +16,14 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/scrollview_with_webviews.xml b/tests/FrameworkTest/res/layout/scrollview_with_webviews.xml
index 79634752..e0c0c66 100644
--- a/tests/FrameworkTest/res/layout/scrollview_with_webviews.xml
+++ b/tests/FrameworkTest/res/layout/scrollview_with_webviews.xml
@@ -16,27 +16,27 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:id="@+id/layout"
android:orientation="vertical"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<WebView android:id="@+id/wb1"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/button"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<WebView android:id="@+id/wb2"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/table_layout_cell_span.xml b/tests/FrameworkTest/res/layout/table_layout_cell_span.xml
index 26831e4..fceef0a 100644
--- a/tests/FrameworkTest/res/layout/table_layout_cell_span.xml
+++ b/tests/FrameworkTest/res/layout/table_layout_cell_span.xml
@@ -18,7 +18,7 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
diff --git a/tests/FrameworkTest/res/layout/table_layout_fixed_width.xml b/tests/FrameworkTest/res/layout/table_layout_fixed_width.xml
index 91d9128..507701e 100644
--- a/tests/FrameworkTest/res/layout/table_layout_fixed_width.xml
+++ b/tests/FrameworkTest/res/layout/table_layout_fixed_width.xml
@@ -19,7 +19,7 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
diff --git a/tests/FrameworkTest/res/layout/table_layout_horizontal_gravity.xml b/tests/FrameworkTest/res/layout/table_layout_horizontal_gravity.xml
index dee81a5..fb72d81 100644
--- a/tests/FrameworkTest/res/layout/table_layout_horizontal_gravity.xml
+++ b/tests/FrameworkTest/res/layout/table_layout_horizontal_gravity.xml
@@ -19,7 +19,7 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="1">
diff --git a/tests/FrameworkTest/res/layout/table_layout_vertical_gravity.xml b/tests/FrameworkTest/res/layout/table_layout_vertical_gravity.xml
index 6a8b784..ae17ada 100644
--- a/tests/FrameworkTest/res/layout/table_layout_vertical_gravity.xml
+++ b/tests/FrameworkTest/res/layout/table_layout_vertical_gravity.xml
@@ -19,7 +19,7 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
diff --git a/tests/FrameworkTest/res/layout/table_layout_weight.xml b/tests/FrameworkTest/res/layout/table_layout_weight.xml
index 432c04a..ba4fade 100644
--- a/tests/FrameworkTest/res/layout/table_layout_weight.xml
+++ b/tests/FrameworkTest/res/layout/table_layout_weight.xml
@@ -19,7 +19,7 @@
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow android:id="@+id/row"
diff --git a/tests/FrameworkTest/res/layout/translucent_background.xml b/tests/FrameworkTest/res/layout/translucent_background.xml
index 6b6e1cf..c4a1acf 100644
--- a/tests/FrameworkTest/res/layout/translucent_background.xml
+++ b/tests/FrameworkTest/res/layout/translucent_background.xml
@@ -19,6 +19,6 @@
<!-- This screen consists of a single text field that displays some text. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:layout_width="match_parent" android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:text="@string/translucent_background"/>
diff --git a/tests/FrameworkTest/res/layout/viewgroupchildren.xml b/tests/FrameworkTest/res/layout/viewgroupchildren.xml
index a5bb7cb..22595ed 100644
--- a/tests/FrameworkTest/res/layout/viewgroupchildren.xml
+++ b/tests/FrameworkTest/res/layout/viewgroupchildren.xml
@@ -23,7 +23,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/group"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/viewstub.xml b/tests/FrameworkTest/res/layout/viewstub.xml
index 9a6f376..8b32d8f 100644
--- a/tests/FrameworkTest/res/layout/viewstub.xml
+++ b/tests/FrameworkTest/res/layout/viewstub.xml
@@ -20,8 +20,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/vis"
android:layout_width="wrap_content"
diff --git a/tests/FrameworkTest/res/layout/visibility.xml b/tests/FrameworkTest/res/layout/visibility.xml
index b4f9d8b..7edfa33 100644
--- a/tests/FrameworkTest/res/layout/visibility.xml
+++ b/tests/FrameworkTest/res/layout/visibility.xml
@@ -22,30 +22,30 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:background="@drawable/box"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/refUp"
android:background="@drawable/red"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_1"/>
<TextView android:id="@+id/victim"
android:background="@drawable/green"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_2"/>
<TextView android:id="@+id/refDown"
android:background="@drawable/blue"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_3"/>
diff --git a/tests/FrameworkTest/res/layout/visibility_callback.xml b/tests/FrameworkTest/res/layout/visibility_callback.xml
index 8fd7c8f..322b640 100644
--- a/tests/FrameworkTest/res/layout/visibility_callback.xml
+++ b/tests/FrameworkTest/res/layout/visibility_callback.xml
@@ -22,35 +22,35 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:background="@drawable/box"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/refUp"
android:background="@drawable/red"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_1"/>
<FrameLayout android:id="@+id/parent"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content">
<view class="com.android.frameworktest.view.VisibilityCallback$MonitoredTextView"
android:id="@+id/victim"
android:background="@drawable/green"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_2"/>
</FrameLayout>
<TextView android:id="@+id/refDown"
android:background="@drawable/blue"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/visibility_1_view_3"/>
diff --git a/tests/FrameworkTest/res/layout/weight_sum.xml b/tests/FrameworkTest/res/layout/weight_sum.xml
index 249dc68..f8921ec 100644
--- a/tests/FrameworkTest/res/layout/weight_sum.xml
+++ b/tests/FrameworkTest/res/layout/weight_sum.xml
@@ -22,8 +22,8 @@
android:orientation="horizontal"
android:weightSum="1.0"
android:gravity="center_horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<Button android:id="@+id/child"
android:layout_width="0dip"
diff --git a/tests/FrameworkTest/res/layout/with_bitmap_background.xml b/tests/FrameworkTest/res/layout/with_bitmap_background.xml
index b32d99e..01605d5 100644
--- a/tests/FrameworkTest/res/layout/with_bitmap_background.xml
+++ b/tests/FrameworkTest/res/layout/with_bitmap_background.xml
@@ -20,8 +20,8 @@
<LinearLayout android:id="@+id/container" xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="@drawable/bitmap_drawable">
</LinearLayout>
diff --git a/tests/FrameworkTest/res/layout/zero_sized.xml b/tests/FrameworkTest/res/layout/zero_sized.xml
index c837bf9..f1c94f8 100644
--- a/tests/FrameworkTest/res/layout/zero_sized.xml
+++ b/tests/FrameworkTest/res/layout/zero_sized.xml
@@ -22,8 +22,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<View android:id="@+id/dimension"
android:background="#ffff0000"
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/expandablelistview/InflatedExpandableListView.java b/tests/FrameworkTest/src/com/android/frameworktest/expandablelistview/InflatedExpandableListView.java
index f1089a1..aff0507 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/expandablelistview/InflatedExpandableListView.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/expandablelistview/InflatedExpandableListView.java
@@ -65,7 +65,7 @@
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, 64);
+ ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(InflatedExpandableListView.this);
textView.setLayoutParams(lp);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/AdjacentVerticalRectLists.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/AdjacentVerticalRectLists.java
index c4e2705..09bec2c 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/AdjacentVerticalRectLists.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/AdjacentVerticalRectLists.java
@@ -66,11 +66,11 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.HORIZONTAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,
- ViewGroup.LayoutParams.FILL_PARENT, 1);
+ ViewGroup.LayoutParams.MATCH_PARENT, 1);
mLeftColumn = new InternalSelectionView(this, 5, "left column");
mLeftColumn.setLayoutParams(params);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/GoneParentFocusedChild.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/GoneParentFocusedChild.java
index 91bd7b4..8f2245f 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/GoneParentFocusedChild.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/GoneParentFocusedChild.java
@@ -58,15 +58,15 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.HORIZONTAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mGoneGroup = new LinearLayout(this);
mGoneGroup.setOrientation(LinearLayout.HORIZONTAL);
mGoneGroup.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mButton = new Button(this);
mButton.setLayoutParams(new LinearLayout.LayoutParams(
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/HorizontalFocusSearch.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/HorizontalFocusSearch.java
index 01a9821..05f05ee 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/HorizontalFocusSearch.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/HorizontalFocusSearch.java
@@ -61,8 +61,8 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.HORIZONTAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mLeftTall = makeTall("left tall");
mLayout.addView(mLeftTall);
@@ -95,7 +95,7 @@
button.setText(label);
button.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT));
return button;
}
@@ -118,7 +118,7 @@
ll.setOrientation(LinearLayout.VERTICAL);
ll.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT));
if (atBottom) {
ll.addView(filler);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfEditTexts.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfEditTexts.java
index f59e2b7..41a276a 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfEditTexts.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfEditTexts.java
@@ -45,14 +45,14 @@
mLinearLayout = new LinearLayout(this);
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
mLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
// add a button above
Button buttonAbove = new Button(this);
buttonAbove.setLayoutParams(
new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
buttonAbove.setText("button above list");
mLinearLayout.addView(buttonAbove);
@@ -60,12 +60,12 @@
// add a list view to it
mListView = new ListView(this);
mListView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mListView.setDrawSelectorOnTop(false);
mListView.setItemsCanFocus(true);
mListView.setLayoutParams((new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
0,
1f)));
@@ -82,7 +82,7 @@
Button buttonBelow = new Button(this);
buttonBelow.setLayoutParams(
new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
buttonBelow.setText("button below list");
mLinearLayout.addView(buttonBelow);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfInternalSelectionViews.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfInternalSelectionViews.java
index 4bbca74..6104068 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfInternalSelectionViews.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/ListOfInternalSelectionViews.java
@@ -119,8 +119,8 @@
mListView = new ListView(this);
mListView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mListView.setDrawSelectorOnTop(false);
mListView.setAdapter(new MyAdapter());
mListView.setItemsCanFocus(true);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/focus/VerticalFocusSearch.java b/tests/FrameworkTest/src/com/android/frameworktest/focus/VerticalFocusSearch.java
index d1b83a3..a8f12d8 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/focus/VerticalFocusSearch.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/focus/VerticalFocusSearch.java
@@ -68,8 +68,8 @@
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setHorizontalGravity(Gravity.LEFT);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mTopWide = makeWide("top wide");
mLayout.addView(mTopWide);
@@ -102,7 +102,7 @@
Button button = new MyButton(this);
button.setText(label);
button.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
return button;
}
@@ -133,7 +133,7 @@
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
if (atRight) {
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemISVAndButton.java b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemISVAndButton.java
index d6c11b7..ceb94b7 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemISVAndButton.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemISVAndButton.java
@@ -47,13 +47,13 @@
final InternalSelectionView isv = new InternalSelectionView(context, 8, "ISV postion " + position);
isv.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
desiredHeight - 240));
ll.addView(isv);
final LinearLayout.LayoutParams buttonLp =
new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
40);
final Button topButton = new Button(context);
topButton.setLayoutParams(
@@ -63,7 +63,7 @@
final TextView filler = new TextView(context);
filler.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
200));
filler.setText("filler");
ll.addView(filler);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemsExpandOnSelection.java b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemsExpandOnSelection.java
index a137116..b0ad5e9 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemsExpandOnSelection.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListItemsExpandOnSelection.java
@@ -44,7 +44,7 @@
result.setFocusable(mItemsFocusable);
result.setText(getValueAtPosition(position));
final AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
result.setLayoutParams(lp);
return result;
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListSetSelection.java b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListSetSelection.java
index 87888ca..45d5892 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListSetSelection.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListSetSelection.java
@@ -51,7 +51,7 @@
});
getListViewContainer().addView(mButton, new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
));
}
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java
index 17222d9..1d6d598 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java
@@ -70,14 +70,14 @@
}
});
- // Clicking this button will show the list view and set it fill_parent height
+ // Clicking this button will show the list view and set it match_parent height
// If you then hide the views, there is an NPE when calculating the ListView height.
mButton2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// set listview to fill screen
ViewGroup.MarginLayoutParams lp;
lp = (ViewGroup.MarginLayoutParams) mInnerList.getLayoutParams();
- lp.height = lp.FILL_PARENT;
+ lp.height = lp.MATCH_PARENT;
mInnerList.setLayoutParams(lp);
// enable list adapter
mInnerList.setAdapter(mAdapter);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/scroll/ScrollViewButtonsAndLabels.java b/tests/FrameworkTest/src/com/android/frameworktest/scroll/ScrollViewButtonsAndLabels.java
index 4763ab1..2d3be2e 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/scroll/ScrollViewButtonsAndLabels.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/scroll/ScrollViewButtonsAndLabels.java
@@ -70,7 +70,7 @@
mLinearLayout = (LinearLayout) findViewById(R.id.layout);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/util/ExpandableListScenario.java b/tests/FrameworkTest/src/com/android/frameworktest/util/ExpandableListScenario.java
index f72cbe8..5aa9479 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/util/ExpandableListScenario.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/util/ExpandableListScenario.java
@@ -18,7 +18,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Random;
import android.view.Gravity;
import android.view.View;
@@ -256,7 +255,7 @@
result.setHeight(desiredHeight);
result.setText(getValueAtPosition(packedPosition));
final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
result.setLayoutParams(lp);
result.setGravity(Gravity.CENTER_VERTICAL);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/util/GridScenario.java b/tests/FrameworkTest/src/com/android/frameworktest/util/GridScenario.java
index 746cf23..76a1101 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/util/GridScenario.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/util/GridScenario.java
@@ -242,8 +242,8 @@
mGridView = new GridView(this);
mGridView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mGridView.setDrawSelectorOnTop(false);
if (mNumColumns >= GridView.AUTO_FIT) {
mGridView.setNumColumns(mNumColumns);
@@ -330,7 +330,7 @@
result.setHeight(desiredHeight);
result.setText(getValueAtPosition(position));
final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
result.setLayoutParams(lp);
result.setId(position);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/util/ListItemFactory.java b/tests/FrameworkTest/src/com/android/frameworktest/util/ListItemFactory.java
index 4327a8a..2c1cf5b 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/util/ListItemFactory.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/util/ListItemFactory.java
@@ -50,7 +50,7 @@
final LinearLayout.LayoutParams buttonLp =
new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
50);
final Button topButton = new Button(context);
@@ -61,7 +61,7 @@
final TextView middleFiller = new TextView(context);
middleFiller.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
desiredHeight - 100));
middleFiller.setText("filler");
ll.addView(middleFiller);
@@ -157,7 +157,7 @@
result.setHeight(desiredHeight);
result.setText(text);
final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
result.setLayoutParams(lp);
result.setId(position);
@@ -197,7 +197,7 @@
result.setHeight(desiredHeight);
result.setText(text);
final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
result.setLayoutParams(lp);
result.setId(position);
@@ -239,7 +239,7 @@
final AbsListView.LayoutParams lp =
new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
desiredHeight);
ll.setLayoutParams(lp);
ll.setId(position);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/util/ListScenario.java b/tests/FrameworkTest/src/com/android/frameworktest/util/ListScenario.java
index 5889658..a6ae188 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/util/ListScenario.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/util/ListScenario.java
@@ -315,8 +315,8 @@
mListView = createListView();
mListView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mListView.setDrawSelectorOnTop(false);
for (int i=0; i<mHeaderViewCount; i++) {
@@ -375,16 +375,16 @@
mHeaderTextView = new TextView(this);
mHeaderTextView.setText("hi");
mHeaderTextView.setLayoutParams(new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mLinearLayout.addView(mHeaderTextView);
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
mLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mListView.setLayoutParams((new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
0,
1f)));
@@ -394,10 +394,10 @@
mLinearLayout = new LinearLayout(this);
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
mLinearLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mListView.setLayoutParams((new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
0,
1f)));
mLinearLayout.addView(mListView);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/util/ScrollViewScenario.java b/tests/FrameworkTest/src/com/android/frameworktest/util/ScrollViewScenario.java
index aa17194..daa168d 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/util/ScrollViewScenario.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/util/ScrollViewScenario.java
@@ -174,7 +174,7 @@
// fill width, equally weighted on height
final LinearLayout.LayoutParams lp =
new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, 0, 1f);
+ ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f);
for (int i = 0; i < numButtons; i++) {
final Button button = new Button(context);
button.setText(prefix + i);
@@ -240,15 +240,15 @@
// create views specified by params
for (ViewFactory viewFactory : params.mViewFactories) {
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
(int) (viewFactory.getHeightRatio() * screenHeight));
mLinearLayout.addView(viewFactory.create(this), lp);
}
mScrollView = createScrollView();
mScrollView.addView(mLinearLayout, new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
// no animation to speed up tests
mScrollView.setSmoothScrollingEnabled(false);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/view/BigCache.java b/tests/FrameworkTest/src/com/android/frameworktest/view/BigCache.java
index 6f5eb00..52f7a07 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/view/BigCache.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/view/BigCache.java
@@ -39,7 +39,7 @@
final LinearLayout testBed = new LinearLayout(this);
testBed.setOrientation(LinearLayout.VERTICAL);
testBed.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+ ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
final int cacheSize = ViewConfiguration.getMaximumDrawingCacheSize();
final Display display = getWindowManager().getDefaultDisplay();
@@ -60,7 +60,7 @@
final ScrollView scroller = new ScrollView(this);
scroller.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
testBed.addView(tiny);
testBed.addView(large);
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/view/PreDrawListener.java b/tests/FrameworkTest/src/com/android/frameworktest/view/PreDrawListener.java
index cb456b2..e907b24 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/view/PreDrawListener.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/view/PreDrawListener.java
@@ -60,7 +60,7 @@
if (mCancelNextDraw) {
Button b = new Button(this.getContext());
b.setText("Hello");
- addView(b, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
+ addView(b, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
mCancelNextDraw = false;
return false;
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
index cc8fa6e..d11a39ba 100644
--- a/tests/FrameworkTest/tests/src/com/android/frameworktest/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
+++ b/tests/FrameworkTest/tests/src/com/android/frameworktest/gridview/touch/GridTouchVerticalSpacingStackFromBottomTest.java
@@ -16,6 +16,7 @@
package com.android.frameworktest.gridview.touch;
+import android.content.Context;
import android.test.ActivityInstrumentationTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
@@ -30,6 +31,7 @@
public class GridTouchVerticalSpacingStackFromBottomTest extends ActivityInstrumentationTestCase<GridVerticalSpacingStackFromBottom> {
private GridVerticalSpacingStackFromBottom mActivity;
private GridView mGridView;
+ private ViewConfiguration mViewConfig;
public GridTouchVerticalSpacingStackFromBottomTest() {
super("com.android.frameworktest", GridVerticalSpacingStackFromBottom.class);
@@ -41,6 +43,8 @@
mActivity = getActivity();
mGridView = getActivity().getGridView();
+ final Context context = mActivity.getApplicationContext();
+ mViewConfig = ViewConfiguration.get(context);
}
@MediumTest
@@ -83,7 +87,7 @@
int lastTop = lastChild.getTop();
TouchUtils.dragViewBy(this, firstChild, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,
- ViewConfiguration.getTouchSlop() + 1 + 10);
+ mViewConfig.getScaledTouchSlop() + 1 + 10);
View newLastChild = mGridView.getChildAt(mGridView.getChildCount() - 1);
@@ -107,7 +111,7 @@
(int) (mActivity.getWindowManager().getDefaultDisplay().getHeight() * 0.75f));
assertEquals("View scrolled to wrong position", firstTop
- + (distance - ViewConfiguration.getTouchSlop() - 1), firstChild.getTop());
+ + (distance - mViewConfig.getScaledTouchSlop() - 1), firstChild.getTop());
}
@LargeTest
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/view/ViewGroupChildrenTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/view/ViewGroupChildrenTest.java
index fceec51..a6007e1 100644
--- a/tests/FrameworkTest/tests/src/com/android/frameworktest/view/ViewGroupChildrenTest.java
+++ b/tests/FrameworkTest/tests/src/com/android/frameworktest/view/ViewGroupChildrenTest.java
@@ -260,7 +260,7 @@
TextView view = new TextView(getActivity());
view.setText(text);
view.setLayoutParams(new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
));
return view;
diff --git a/tests/ImfTest/res/layout/dialog_edit_text_no_scroll.xml b/tests/ImfTest/res/layout/dialog_edit_text_no_scroll.xml
index e8ffa1c..1a2b7eb 100644
--- a/tests/ImfTest/res/layout/dialog_edit_text_no_scroll.xml
+++ b/tests/ImfTest/res/layout/dialog_edit_text_no_scroll.xml
@@ -15,21 +15,21 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:padding="20dip"
android:orientation="vertical">
<View
android:id="@+id/blank"
android:layout_height="0dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_weight="1"/>
<EditText
android:id="@+id/dialog_edit_text"
android:layout_height="wrap_content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:scrollHorizontally="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
diff --git a/tests/ImfTest/res/layout/full_screen_edit_text.xml b/tests/ImfTest/res/layout/full_screen_edit_text.xml
index f22aa2f..e760ac1 100755
--- a/tests/ImfTest/res/layout/full_screen_edit_text.xml
+++ b/tests/ImfTest/res/layout/full_screen_edit_text.xml
@@ -20,8 +20,8 @@
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/data"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:minLines="15"
android:gravity="top"/>
diff --git a/tests/ImfTest/res/layout/one_edit_text_activity.xml b/tests/ImfTest/res/layout/one_edit_text_activity.xml
index 09925e1..0558228 100755
--- a/tests/ImfTest/res/layout/one_edit_text_activity.xml
+++ b/tests/ImfTest/res/layout/one_edit_text_activity.xml
@@ -18,32 +18,32 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
android:baselineAligned="false">
<View android:id="@+id/blank"
android:layout_height="0dip"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_weight="1"
/>
<EditText android:id="@+id/dialog_edit_text"
android:layout_height="wrap_content"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:scrollHorizontally="true"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
</LinearLayout>
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:background="@android:drawable/divider_horizontal_dark"
/>
diff --git a/tests/ImfTest/res/layout/sample_edit_text.xml b/tests/ImfTest/res/layout/sample_edit_text.xml
index 99a5cf8..3ff6767 100755
--- a/tests/ImfTest/res/layout/sample_edit_text.xml
+++ b/tests/ImfTest/res/layout/sample_edit_text.xml
@@ -18,12 +18,12 @@
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
@@ -46,7 +46,7 @@
</LinearLayout>
<View
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="1dip"
android:background="@android:drawable/divider_horizontal_dark"
/>
diff --git a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollablePanScan.java b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollablePanScan.java
index 9754381..21734a6 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollablePanScan.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollablePanScan.java
@@ -7,9 +7,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.widget.EditText;
import android.widget.LinearLayout;
-import android.widget.ScrollView;
public class BigEditTextActivityNonScrollablePanScan extends Activity {
@@ -25,8 +23,8 @@
mRootView = new LinearLayout(this);
((LinearLayout) mRootView).setOrientation(LinearLayout.VERTICAL);
mRootView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
View view = getLayoutInflater().inflate(
R.layout.full_screen_edit_text, ((LinearLayout) mRootView), false);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollableResize.java b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollableResize.java
index 701795f..48287fb 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollableResize.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityNonScrollableResize.java
@@ -7,9 +7,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.widget.EditText;
import android.widget.LinearLayout;
-import android.widget.ScrollView;
public class BigEditTextActivityNonScrollableResize extends Activity {
@@ -25,8 +23,8 @@
mRootView = new LinearLayout(this);
((LinearLayout) mRootView).setOrientation(LinearLayout.VERTICAL);
mRootView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
View view = getLayoutInflater().inflate(
R.layout.full_screen_edit_text, ((LinearLayout) mRootView), false);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollablePanScan.java b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollablePanScan.java
index bb3f7671..48e1359 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollablePanScan.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollablePanScan.java
@@ -7,7 +7,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
@@ -26,14 +25,14 @@
mRootView = new ScrollView(this);
((ScrollView) mRootView).setFillViewport(true);
mRootView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
View view = getLayoutInflater().inflate(
R.layout.full_screen_edit_text, ((ScrollView) mRootView), false);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollableResize.java b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollableResize.java
index f2cae1c..d51e8a7 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollableResize.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/BigEditTextActivityScrollableResize.java
@@ -7,7 +7,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
@@ -26,14 +25,14 @@
mRootView = new ScrollView(this);
((ScrollView) mRootView).setFillViewport(true);
mRootView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
View view = getLayoutInflater().inflate(
R.layout.full_screen_edit_text, ((ScrollView) mRootView), false);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/DialogActivity.java b/tests/ImfTest/src/com/android/imftest/samples/DialogActivity.java
index e49301c..f65e1fd 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/DialogActivity.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/DialogActivity.java
@@ -2,18 +2,14 @@
import android.app.Activity;
import android.os.Bundle;
-import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.EditText;
import android.widget.Button;
import android.view.LayoutInflater;
import android.app.Dialog;
-import com.android.internal.R;
-
public class DialogActivity extends Activity {
private static final int DIALOG_WITHOUT_EDITTEXT = 0;
@@ -34,8 +30,8 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mButton1 = new Button(this);
mButton1.setText("Dialog WITHOUT EditText");//(R.string.open_dialog_scrollable);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/EditTextActivityDialog.java b/tests/ImfTest/src/com/android/imftest/samples/EditTextActivityDialog.java
index bd1e934..d4726fc 100644
--- a/tests/ImfTest/src/com/android/imftest/samples/EditTextActivityDialog.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/EditTextActivityDialog.java
@@ -3,7 +3,6 @@
import com.android.imftest.R;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -33,8 +32,8 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mButton1 = new Button(this);
mButton1.setText(R.string.open_dialog_scrollable);
diff --git a/tests/ImfTest/src/com/android/imftest/samples/InputTypeActivity.java b/tests/ImfTest/src/com/android/imftest/samples/InputTypeActivity.java
index 17f6bdc..25ac2f0 100755
--- a/tests/ImfTest/src/com/android/imftest/samples/InputTypeActivity.java
+++ b/tests/ImfTest/src/com/android/imftest/samples/InputTypeActivity.java
@@ -21,17 +21,13 @@
import android.app.Activity;
import android.widget.EditText;
import android.widget.LinearLayout;
-import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.ViewRoot;
import android.view.inputmethod.EditorInfo;
-import android.content.Context;
public class InputTypeActivity extends Activity {
@@ -49,8 +45,8 @@
mLayout = new LinearLayout(this);
mLayout.setOrientation(LinearLayout.VERTICAL);
mLayout.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
mInflater = getLayoutInflater();
mParent = mLayout;
diff --git a/tests/LowStorageTest/res/layout/main.xml b/tests/LowStorageTest/res/layout/main.xml
index cc99102..f1cc680 100644
--- a/tests/LowStorageTest/res/layout/main.xml
+++ b/tests/LowStorageTest/res/layout/main.xml
@@ -14,8 +14,8 @@
limitations under the License.
-->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:stretchColumns="1">
<TextView
diff --git a/tests/StatusBar/res/layout/chrono_notification.xml b/tests/StatusBar/res/layout/chrono_notification.xml
index 913a860..98a9fdd 100644
--- a/tests/StatusBar/res/layout/chrono_notification.xml
+++ b/tests/StatusBar/res/layout/chrono_notification.xml
@@ -1,12 +1,12 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="80sp"
android:orientation="horizontal"
>
<LinearLayout
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
android:layout_weight="0"
android:orientation="vertical"
>
diff --git a/tests/TransformTest/Android.mk b/tests/TransformTest/Android.mk
new file mode 100644
index 0000000..2d3637d
--- /dev/null
+++ b/tests/TransformTest/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := TransformTest
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_PACKAGE)
diff --git a/tests/TransformTest/AndroidManifest.xml b/tests/TransformTest/AndroidManifest.xml
new file mode 100644
index 0000000..5c9995f
--- /dev/null
+++ b/tests/TransformTest/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.android.test.transform">
+ <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" />
+ <application android:label="TransformTest">
+ <activity android:name="TransformTestActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/TransformTest/res/drawable/logo.png b/tests/TransformTest/res/drawable/logo.png
new file mode 100644
index 0000000..4d717a8
--- /dev/null
+++ b/tests/TransformTest/res/drawable/logo.png
Binary files differ
diff --git a/core/res/res/values-mcc230-nb/strings.xml b/tests/TransformTest/res/values/strings.xml
similarity index 65%
rename from core/res/res/values-mcc230-nb/strings.xml
rename to tests/TransformTest/res/values/strings.xml
index 63ade62..a0eb81f 100644
--- a/core/res/res/values-mcc230-nb/strings.xml
+++ b/tests/TransformTest/res/values/strings.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
-->
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="locale_replacement" msgid="9011721823833053909">"cs_cz"</string>
+
+<resources>
+ <string name="act_title">TransformTest</string>
</resources>
diff --git a/tests/TransformTest/src/com/google/android/test/transform/TransformTestActivity.java b/tests/TransformTest/src/com/google/android/test/transform/TransformTestActivity.java
new file mode 100644
index 0000000..52286d1
--- /dev/null
+++ b/tests/TransformTest/src/com/google/android/test/transform/TransformTestActivity.java
@@ -0,0 +1,171 @@
+/*
+ * 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 com.google.android.test.transform;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.TransformGestureDetector;
+import android.view.View;
+import android.widget.LinearLayout;
+
+public class TransformTestActivity extends Activity {
+ public TransformTestActivity() {
+ super();
+ init(false);
+ }
+
+ public TransformTestActivity(boolean noCompat) {
+ super();
+ init(noCompat);
+ }
+
+ public void init(boolean noCompat) {
+
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final LayoutInflater li = (LayoutInflater)getSystemService(
+ LAYOUT_INFLATER_SERVICE);
+
+ this.setTitle(R.string.act_title);
+ LinearLayout root = new LinearLayout(this);
+ root.setOrientation(LinearLayout.VERTICAL);
+
+ TransformView view = new TransformView(getApplicationContext());
+ Drawable drawable = getResources().getDrawable(R.drawable.logo);
+ drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicWidth());
+ view.setDrawable(drawable);
+
+ root.addView(view);
+ setContentView(root);
+ }
+
+ private class TransformView extends View {
+ private Drawable mDrawable;
+ private float mPosX;
+ private float mPosY;
+ private float mScale = 1.f;
+ private Matrix mMatrix;
+ private TransformGestureDetector mDetector;
+
+ private class Listener implements TransformGestureDetector.OnTransformGestureListener {
+
+ public boolean onTransform(TransformGestureDetector detector) {
+ Log.d("ttest", "Translation: (" + detector.getTranslateX() +
+ ", " + detector.getTranslateY() + ")");
+ float scale = detector.getScaleFactor();
+ Log.d("ttest", "Scale: " + scale);
+ if (mScale * scale > 0.1f) {
+ if (mScale * scale < 10.f) {
+ mScale *= scale;
+ } else {
+ mScale = 10.f;
+ }
+ } else {
+ mScale = 0.1f;
+ }
+
+ mPosX += detector.getTranslateX();
+ mPosY += detector.getTranslateY();
+
+ Log.d("ttest", "mScale: " + mScale + " mPos: (" + mPosX + ", " + mPosY + ")");
+
+ float sizeX = mDrawable.getIntrinsicWidth()/2;
+ float sizeY = mDrawable.getIntrinsicHeight()/2;
+ float centerX = detector.getCenterX();
+ float centerY = detector.getCenterY();
+ float diffX = centerX - mPosX;
+ float diffY = centerY - mPosY;
+ diffX = diffX*scale - diffX;
+ diffY = diffY*scale - diffY;
+ mPosX -= diffX;
+ mPosY -= diffY;
+ mMatrix.reset();
+ mMatrix.postTranslate(-sizeX, -sizeY);
+ mMatrix.postScale(mScale, mScale);
+ mMatrix.postTranslate(mPosX, mPosY);
+
+ invalidate();
+
+ return true;
+ }
+
+ public boolean onTransformBegin(TransformGestureDetector detector) {
+ return true;
+ }
+
+ public boolean onTransformEnd(TransformGestureDetector detector) {
+ return true;
+ }
+
+ public boolean onTransformFling(TransformGestureDetector detector) {
+ return false;
+ }
+
+ }
+
+ public TransformView(Context context) {
+ super(context);
+ mMatrix = new Matrix();
+ mDetector = new TransformGestureDetector(context, new Listener());
+ DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+ mPosX = metrics.widthPixels/2;
+ mPosY = metrics.heightPixels/2;
+ }
+
+ public void setDrawable(Drawable d) {
+ mDrawable = d;
+
+ float sizeX = mDrawable.getIntrinsicWidth()/2;
+ float sizeY = mDrawable.getIntrinsicHeight()/2;
+ mMatrix.reset();
+ mMatrix.postTranslate(-sizeX, -sizeY);
+ mMatrix.postScale(mScale, mScale);
+ mMatrix.postTranslate(mPosX, mPosY);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ boolean handled = mDetector.onTouchEvent(event);
+
+ int pointerCount = event.getPointerCount();
+ Log.d("ttest", "pointerCount: " + pointerCount);
+
+ return handled;
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ int saveCount = canvas.getSaveCount();
+ canvas.save();
+ canvas.concat(mMatrix);
+ mDrawable.draw(canvas);
+ canvas.restoreToCount(saveCount);
+ }
+ }
+}
diff --git a/tests/appwidgets/AppWidgetHostTest/Android.mk b/tests/appwidgets/AppWidgetHostTest/Android.mk
index 1bb1e54..4d0c704 100644
--- a/tests/appwidgets/AppWidgetHostTest/Android.mk
+++ b/tests/appwidgets/AppWidgetHostTest/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/tests/appwidgets/AppWidgetHostTest/res/layout/appwidget_host.xml b/tests/appwidgets/AppWidgetHostTest/res/layout/appwidget_host.xml
index e5c3b28..88c6488 100644
--- a/tests/appwidgets/AppWidgetHostTest/res/layout/appwidget_host.xml
+++ b/tests/appwidgets/AppWidgetHostTest/res/layout/appwidget_host.xml
@@ -16,8 +16,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
@@ -26,7 +26,7 @@
/>
<ScrollView
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
>
diff --git a/tests/appwidgets/AppWidgetHostTest/res/layout/test_appwidget_configure.xml b/tests/appwidgets/AppWidgetHostTest/res/layout/test_appwidget_configure.xml
index 0d9b983..a0f9cc2 100644
--- a/tests/appwidgets/AppWidgetHostTest/res/layout/test_appwidget_configure.xml
+++ b/tests/appwidgets/AppWidgetHostTest/res/layout/test_appwidget_configure.xml
@@ -15,21 +15,21 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/oh_hai_text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/oh_hai"
/>
<EditText
android:id="@+id/edit_text"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
diff --git a/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/AppWidgetHostActivity.java b/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/AppWidgetHostActivity.java
index 2fb2d1de..bb0fa60 100644
--- a/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/AppWidgetHostActivity.java
+++ b/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/AppWidgetHostActivity.java
@@ -129,7 +129,7 @@
// Add it to the list
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mAppWidgetContainer.addView(view, layoutParams);
diff --git a/tests/appwidgets/AppWidgetProviderTest/Android.mk b/tests/appwidgets/AppWidgetProviderTest/Android.mk
index c87a0f2..6084fb9 100644
--- a/tests/appwidgets/AppWidgetProviderTest/Android.mk
+++ b/tests/appwidgets/AppWidgetProviderTest/Android.mk
@@ -1,7 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := user
+LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/tests/framework-tests/src/android/test/FrameworkTests.java b/tests/framework-tests/src/android/test/FrameworkTests.java
index b5f6292..623e294 100644
--- a/tests/framework-tests/src/android/test/FrameworkTests.java
+++ b/tests/framework-tests/src/android/test/FrameworkTests.java
@@ -1,8 +1,6 @@
package android.test;
import com.android.internal.os.LoggingPrintStreamTest;
-import android.util.EventLogFunctionalTest;
-import android.util.EventLogTest;
import junit.framework.TestSuite;
import com.android.internal.http.multipart.MultipartTest;
import com.android.internal.policy.impl.LockPatternKeyguardViewTest;
@@ -18,8 +16,6 @@
TestSuite suite = new TestSuite(FrameworkTests.class.getName());
suite.addTestSuite(MultipartTest.class);
- suite.addTestSuite(EventLogTest.class);
- suite.addTestSuite(EventLogFunctionalTest.class);
suite.addTestSuite(LoggingPrintStreamTest.class);
suite.addTestSuite(LockPatternKeyguardViewTest.class);
diff --git a/tests/framework-tests/src/android/util/EventLogFunctionalTest.java b/tests/framework-tests/src/android/util/EventLogFunctionalTest.java
deleted file mode 100644
index 8263083..0000000
--- a/tests/framework-tests/src/android/util/EventLogFunctionalTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.
- */
-
-package android.util;
-
-import android.os.Process;
-
-import com.google.android.collect.Lists;
-
-import junit.framework.TestCase;
-import junit.framework.Assert;
-
-import java.util.ArrayList;
-
-/**
- * Functional tests of EventLog.
- */
-
-public class EventLogFunctionalTest extends TestCase {
- private static final String TAG = "EventLogFunctionalTest";
-
- private static final int TAG_SIZE = 4;
- private static final int TYPE_FIELD_SIZE = 1;
- private static final int STARTING_POS_OF_PAYLOAD = TAG_SIZE + TYPE_FIELD_SIZE;
-
- private static final int TEST_TAG = 42;
- private static final int TEST_TAG2 = 314;
-
- //todo: For now all we do is test the returned length. More to come.
- public void testLogOfPosInt() throws Exception {
- final int numBytes = EventLog.writeEvent(TEST_TAG, 0x01020304);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 4, numBytes);
- }
-
- //todo: For now all we do is test the returned length. More to come.
- public void testLogOfPosLong() throws Exception {
- final int numBytes = EventLog.writeEvent(TEST_TAG2, 0x0102030405060708L);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 8, numBytes);
- }
-
- //todo: For now all we do is test the returned length. More to come.
- public void testLogOfString() throws Exception {
- final String valueStr = "foo bar baz";
- final int numBytes = EventLog.writeEvent(TEST_TAG, valueStr);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 4 + valueStr.length() + 1, numBytes);
- }
-
- public void testLogOfListWithOneInt() throws Exception {
- final EventLog.List list = new EventLog.List(1234);
- final int numBytes = EventLog.writeEvent(TEST_TAG, list);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 1 + 1 + 4 + 1, numBytes);
- }
-
- public void testLogOfListWithMultipleInts() throws Exception {
- final EventLog.List list = new EventLog.List(1234, 2345, 3456);
- final int numBytes = EventLog.writeEvent(TEST_TAG, list);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 1 + 1 + 4 + 1 + 4 + 1 + 4 + 1, numBytes);
- }
-
- public void testLogOfListWithEmbeddedList() throws Exception {
- final EventLog.List list = new EventLog.List(
- new EventLog.List(1234, 2345, 3456));
- final int numBytes = EventLog.writeEvent(TEST_TAG, list);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 2 + 1 + 1 + 4 + 1 + 4 + 1 + 4 + 1, numBytes);
- }
-
- public void testEventLargerThanInitialBufferCapacity() throws Exception {
- final Integer[] array = new Integer[127];
- for (int i = 0; i < array.length; i++) {
- array[i] = i;
- }
- final EventLog.List list = new EventLog.List((Object[]) array);
- final int numBytes = EventLog.writeEvent(TEST_TAG, list);
- Assert.assertEquals(STARTING_POS_OF_PAYLOAD + 1 + (5 * array.length) + 1, numBytes);
- }
-
- // This test is obsolete. See http://b/issue?id=1262082
- public void disableTestReadSimpleEvent() throws Exception {
- long when = System.currentTimeMillis();
- EventLog.writeEvent(2718, 12345);
- Log.i(TAG, "Wrote simple event at T=" + when);
-
- ArrayList<EventLog.Event> list = new ArrayList<EventLog.Event>();
- EventLog.readEvents(new int[] { 2718 }, list);
-
- boolean found = false;
- for (EventLog.Event event : list) {
- assertEquals(event.getTag(), 2718);
- long eventTime = event.getTimeNanos() / 1000000;
- Log.i(TAG, " Found event T=" + eventTime);
- if (eventTime > when - 100 && eventTime < when + 1000) {
- assertEquals(event.getProcessId(), Process.myPid());
- assertEquals(event.getThreadId(), Process.myTid());
- assertEquals(event.getData(), 12345);
-
- assertFalse(found);
- found = true;
- }
- }
-
- assertTrue(found);
- }
-
- // This test is obsolete. See http://b/issue?id=1262082
- public void disableTestReadCompoundEntry() throws Exception {
- long when = System.currentTimeMillis();
- EventLog.writeEvent(2719,
- new EventLog.List(1l, new EventLog.List("2", "three", "4"), 5));
- Log.i(TAG, "Wrote compound event at T=" + when);
-
- ArrayList<EventLog.Event> list = new ArrayList<EventLog.Event>();
- EventLog.readEvents(new int[] { 2719 }, list);
-
- boolean found = false;
- for (EventLog.Event event : list) {
- long eventTime = event.getTimeNanos() / 1000000;
- Log.i(TAG, " Found event T=" + eventTime);
- if (eventTime > when - 100 && eventTime < when + 1000) {
- EventLog.List data = (EventLog.List) event.getData();
- assertEquals(data.getNumItems(), 3);
-
- EventLog.List nested = (EventLog.List) data.getItem(1);
- assertEquals(nested.getNumItems(), 3);
-
- assertEquals(data.getItem(0), 1l);
- assertEquals(nested.getItem(0), "2");
- assertEquals(nested.getItem(1), "three");
- assertEquals(nested.getItem(2), "4");
- assertEquals(data.getItem(2), 5);
-
- assertFalse(found);
- found = true;
- }
- }
-
- assertTrue(found);
- }
-
- public void testEventLogTagsFile() throws Exception {
- EventLogTags tags = new EventLogTags();
- assertEquals(tags.get("answer").mTag, 42);
- assertEquals(tags.get("pi").mTag, 314);
- assertEquals(tags.get("e").mTag, 2718);
- assertEquals(tags.get(42).mName, "answer");
- assertEquals(tags.get(314).mName, "pi");
- assertEquals(tags.get(2718).mName, "e");
- }
-}
diff --git a/tests/framework-tests/src/android/util/EventLogTest.java b/tests/framework-tests/src/android/util/EventLogTest.java
deleted file mode 100644
index 4a5d888..0000000
--- a/tests/framework-tests/src/android/util/EventLogTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.
- */
-
-package android.util;
-
-import com.google.android.collect.Lists;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * tests for {@link EventLog}
- */
-
-public class EventLogTest extends TestCase {
- private static final int TEST_TAG = 42;
-
- public void testIllegalListTypesThrowException() throws Exception {
- try {
- EventLog.writeEvent(TEST_TAG, new EventLog.List(new Object()));
- fail("Can't create List with any old Object");
- } catch (IllegalArgumentException e) {
- // expected
- }
- try {
- EventLog.writeEvent(TEST_TAG, new EventLog.List((byte) 1));
- fail("Can't create List with any old byte");
- } catch (IllegalArgumentException e) {
- // expected
- }
- }
-
- void assertIntInByteArrayEquals(int expected, byte[] buf, int pos) {
- ByteBuffer computedBuf = ByteBuffer.wrap(buf).order(ByteOrder.nativeOrder());
- int computed = computedBuf.getInt(pos);
- Assert.assertEquals(expected, computed);
- }
-
- void assertLongInByteArrayEquals(long expected, byte[] buf, int pos) {
- ByteBuffer computedBuf = ByteBuffer.wrap(buf).order(ByteOrder.nativeOrder());
- long computed = computedBuf.getLong(pos);
- Assert.assertEquals(expected, computed);
- }
-
- void assertStringInByteArrayEquals(String expected, byte[] buf, int pos) {
- byte[] expectedBytes = expected.getBytes();
- Assert.assertTrue(expectedBytes.length <= buf.length - pos);
- for (byte expectedByte : expectedBytes) {
- Assert.assertEquals(expectedByte, buf[pos++]);
- }
- }
-}
diff --git a/tests/framework-tests/src/com/android/internal/os/LoggingPrintStreamTest.java b/tests/framework-tests/src/com/android/internal/os/LoggingPrintStreamTest.java
index 8e3a034..4d016d1 100644
--- a/tests/framework-tests/src/com/android/internal/os/LoggingPrintStreamTest.java
+++ b/tests/framework-tests/src/com/android/internal/os/LoggingPrintStreamTest.java
@@ -18,12 +18,12 @@
import junit.framework.TestCase;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.io.StringWriter;
import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
public class LoggingPrintStreamTest extends TestCase {
@@ -121,6 +121,58 @@
assertEquals(Arrays.asList("Foo", "4", "a"), out.lines);
}
+ public void testMultiByteCharactersSpanningBuffers() throws Exception {
+ // assume 3*1000 bytes won't fit in LoggingPrintStream's internal buffer
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < 1000; i++) {
+ builder.append("\u20AC"); // a Euro character; 3 bytes in UTF-8
+ }
+ String expected = builder.toString();
+
+ out.write(expected.getBytes("UTF-8"));
+ out.flush();
+ assertEquals(Arrays.asList(expected), out.lines);
+ }
+
+ public void testWriteOneByteAtATimeMultibyteCharacters() throws Exception {
+ String expected = " \u20AC \u20AC \u20AC \u20AC ";
+ for (byte b : expected.getBytes()) {
+ out.write(b);
+ }
+ out.flush();
+ assertEquals(Arrays.asList(expected), out.lines);
+ }
+
+ public void testWriteByteArrayAtATimeMultibyteCharacters() throws Exception {
+ String expected = " \u20AC \u20AC \u20AC \u20AC ";
+ out.write(expected.getBytes());
+ out.flush();
+ assertEquals(Arrays.asList(expected), out.lines);
+ }
+
+ public void testWriteWithOffsetsMultibyteCharacters() throws Exception {
+ String expected = " \u20AC \u20AC \u20AC \u20AC ";
+ byte[] bytes = expected.getBytes();
+ int i = 0;
+ while (i < bytes.length - 5) {
+ out.write(bytes, i, 5);
+ i += 5;
+ }
+ out.write(bytes, i, bytes.length - i);
+ out.flush();
+ assertEquals(Arrays.asList(expected), out.lines);
+ }
+
+ public void testWriteFlushesOnNewlines() throws Exception {
+ String a = " \u20AC \u20AC ";
+ String b = " \u20AC \u20AC ";
+ String c = " ";
+ String toWrite = a + "\n" + b + "\n" + c;
+ out.write(toWrite.getBytes());
+ out.flush();
+ assertEquals(Arrays.asList(a, b, c), out.lines);
+ }
+
static class TestPrintStream extends LoggingPrintStream {
final List<String> lines = new ArrayList<String>();
@@ -129,5 +181,4 @@
lines.add(line);
}
}
-
}
diff --git a/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java b/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java
deleted file mode 100644
index f55998f..0000000
--- a/tests/permission/src/com/android/framework/permission/tests/SettingsPermissionsTests.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.framework.permission.tests;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-/**
- * Verify that accessing private-API protected Settings require specific permissions.
- */
-public class SettingsPermissionsTests extends AndroidTestCase {
-
- private ContentResolver mContentResolver;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mContentResolver = getContext().getContentResolver();
- }
-
- /**
- * Verify that writing to the GServices table in Settings provider requires permissions.
- * <p>Tests Permission:
- * {@link android.Manifest.permission#WRITE_GSERVICES}
- */
- @MediumTest
- public void testWriteGServices() {
- try {
- ContentValues values = new ContentValues();
- values.put("url", "android");
- mContentResolver.insert(Settings.Gservices.CONTENT_URI, values);
- fail("Write into Gservices provider did not throw SecurityException as expected.");
- } catch (SecurityException e) {
- // expected
- }
- }
-}
\ No newline at end of file
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 51af965..5d345e6 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -679,7 +679,7 @@
REQ_NAVIGATION_ATTR, NULL, 0);
int32_t reqFiveWayNav = getIntegerAttribute(tree,
REQ_FIVE_WAY_NAV_ATTR, NULL, 0);
- printf("uses-configuation:");
+ printf("uses-configuration:");
if (reqTouchScreen != 0) {
printf(" reqTouchScreen='%d'", reqTouchScreen);
}
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index de6ff14..ae8f242 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -1768,31 +1768,33 @@
fprintf(stderr, "ERROR: %s\n", error.string());
return -1;
}
- // asdf --> package.asdf
- // .asdf .a.b --> package.asdf package.a.b
- // asdf.adsf --> asdf.asdf
- String8 rule("-keep class ");
- const char* p = name.string();
- const char* q = strchr(p, '.');
- if (p == q) {
- rule += pkg;
- rule += name;
- } else if (q == NULL) {
- rule += pkg;
- rule += ".";
- rule += name;
- } else {
- rule += name;
+ if (name.length() > 0) {
+ // asdf --> package.asdf
+ // .asdf .a.b --> package.asdf package.a.b
+ // asdf.adsf --> asdf.asdf
+ String8 rule("-keep class ");
+ const char* p = name.string();
+ const char* q = strchr(p, '.');
+ if (p == q) {
+ rule += pkg;
+ rule += name;
+ } else if (q == NULL) {
+ rule += pkg;
+ rule += ".";
+ rule += name;
+ } else {
+ rule += name;
+ }
+
+ String8 location = tag;
+ location += " ";
+ location += assFile->getSourceFile();
+ char lineno[20];
+ sprintf(lineno, ":%d", tree.getLineNumber());
+ location += lineno;
+
+ keep->add(rule, location);
}
-
- String8 location = tag;
- location += " ";
- location += assFile->getSourceFile();
- char lineno[20];
- sprintf(lineno, ":%d", tree.getLineNumber());
- location += lineno;
-
- keep->add(rule, location);
}
}
}
diff --git a/tools/layoutlib/.gitignore b/tools/layoutlib/.gitignore
index d44a17d..0ec5000 100644
--- a/tools/layoutlib/.gitignore
+++ b/tools/layoutlib/.gitignore
@@ -1,3 +1,2 @@
-api/bin
bridge/bin
create/bin
diff --git a/tools/layoutlib/api/.classpath b/tools/layoutlib/api/.classpath
deleted file mode 100644
index a09ce5f..0000000
--- a/tools/layoutlib/api/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_SRC/dalvik/libcore/xml/src/main/java"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/layoutlib/api/.project b/tools/layoutlib/api/.project
deleted file mode 100644
index 4e4ca3b..0000000
--- a/tools/layoutlib/api/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>layoutlib_api</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/tools/layoutlib/api/Android.mk b/tools/layoutlib/api/Android.mk
deleted file mode 100644
index d60987c..0000000
--- a/tools/layoutlib/api/Android.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-
-LOCAL_JAVA_LIBRARIES := \
- kxml2-2.3.0
-
-LOCAL_MODULE := layoutlib_api
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java b/tools/layoutlib/api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java
deleted file mode 100644
index 57a776f..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-/**
- * Represents an Android Resources that has a density info attached to it.
- */
-public interface IDensityBasedResourceValue extends IResourceValue {
-
- public static enum Density {
- HIGH(240),
- MEDIUM(160),
- LOW(120),
- NODPI(0);
-
- public final static int DEFAULT_DENSITY = 160;
-
- private final int mValue;
-
- Density(int value) {
- mValue = value;
- }
-
- public int getValue() {
- return mValue;
- }
- }
-
- /**
- * Returns the density associated to the resource.
- */
- Density getDensity();
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java b/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java
deleted file mode 100644
index 4dbcfdc..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-import java.util.Map;
-
-/**
- * Entry point of the Layout Lib. Implementations of this interface provide a method to compute
- * and render a layout.
- * <p/>
- * <p/>{@link #getApiLevel()} gives the ability to know which methods are available.
- * <p/>
- * Changes in API level 4:
- * <ul>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, boolean, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- * Changes in API level 3:
- * <ul>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- * Changes in API level 2:
- * <ul>
- * <li>new API Level method: {@link #getApiLevel()}</li>
- * <li>new render method: {@link #computeLayout(IXmlPullParser, Object, int, int, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * <li>deprecated {@link #computeLayout(IXmlPullParser, Object, int, int, String, Map, Map, IProjectCallback, ILayoutLog)}</li>
- * </ul>
- */
-public interface ILayoutBridge {
-
- final int API_CURRENT = 4;
-
- /**
- * Returns the API level of the layout library.
- * While no methods will ever be removed, some may become deprecated, and some new ones
- * will appear.
- * <p/>If calling this method throws an {@link AbstractMethodError}, then the API level
- * should be considered to be 1.
- */
- int getApiLevel();
-
- /**
- * Initializes the Bridge object.
- * @param fontOsLocation the location of the fonts.
- * @param enumValueMap map attrName => { map enumFlagName => Integer value }.
- * @return true if success.
- * @since 1
- */
- boolean init(String fontOsLocation, Map<String, Map<String, Integer>> enumValueMap);
-
- /**
- * Computes and renders a layout
- * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
- * layout file.
- * @param projectKey An Object identifying the project. This is used for the cache mechanism.
- * @param screenWidth the screen width
- * @param screenHeight the screen height
- * @param renderFullSize if true, the rendering will render the full size needed by the
- * layout. This size is never smaller than <var>screenWidth</var> x <var>screenHeight</var>.
- * @param density the density factor for the screen.
- * @param xdpi the screen actual dpi in X
- * @param ydpi the screen actual dpi in Y
- * @param themeName The name of the theme to use.
- * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
- * @param projectResources the resources of the project. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the
- * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
- * and the value is the resource value.
- * @param frameworkResources the framework resources. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the map
- * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
- * value is the resource value.
- * @param projectCallback The {@link IProjectCallback} object to get information from
- * the project.
- * @param logger the object responsible for displaying warning/errors to the user.
- * @return a new {@link ILayoutResult} object that contains the result of the layout.
- * @since 4
- */
- ILayoutResult computeLayout(IXmlPullParser layoutDescription,
- Object projectKey,
- int screenWidth, int screenHeight, boolean renderFullSize,
- int density, float xdpi, float ydpi,
- String themeName, boolean isProjectTheme,
- Map<String, Map<String, IResourceValue>> projectResources,
- Map<String, Map<String, IResourceValue>> frameworkResources,
- IProjectCallback projectCallback, ILayoutLog logger);
-
- /**
- * Computes and renders a layout
- * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
- * layout file.
- * @param projectKey An Object identifying the project. This is used for the cache mechanism.
- * @param screenWidth the screen width
- * @param screenHeight the screen height
- * @param density the density factor for the screen.
- * @param xdpi the screen actual dpi in X
- * @param ydpi the screen actual dpi in Y
- * @param themeName The name of the theme to use.
- * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
- * @param projectResources the resources of the project. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the
- * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
- * and the value is the resource value.
- * @param frameworkResources the framework resources. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the map
- * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
- * value is the resource value.
- * @param projectCallback The {@link IProjectCallback} object to get information from
- * the project.
- * @param logger the object responsible for displaying warning/errors to the user.
- * @return a new {@link ILayoutResult} object that contains the result of the layout.
- * @since 3
- */
- @Deprecated
- ILayoutResult computeLayout(IXmlPullParser layoutDescription,
- Object projectKey,
- int screenWidth, int screenHeight, int density, float xdpi, float ydpi,
- String themeName, boolean isProjectTheme,
- Map<String, Map<String, IResourceValue>> projectResources,
- Map<String, Map<String, IResourceValue>> frameworkResources,
- IProjectCallback projectCallback, ILayoutLog logger);
-
- /**
- * Computes and renders a layout
- * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
- * layout file.
- * @param projectKey An Object identifying the project. This is used for the cache mechanism.
- * @param screenWidth the screen width
- * @param screenHeight the screen height
- * @param themeName The name of the theme to use.
- * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme.
- * @param projectResources the resources of the project. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the
- * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
- * and the value is the resource value.
- * @param frameworkResources the framework resources. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the map
- * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
- * value is the resource value.
- * @param projectCallback The {@link IProjectCallback} object to get information from
- * the project.
- * @param logger the object responsible for displaying warning/errors to the user.
- * @return a new {@link ILayoutResult} object that contains the result of the layout.
- * @deprecated Use {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}
- * @since 2
- */
- @Deprecated
- ILayoutResult computeLayout(IXmlPullParser layoutDescription,
- Object projectKey,
- int screenWidth, int screenHeight, String themeName, boolean isProjectTheme,
- Map<String, Map<String, IResourceValue>> projectResources,
- Map<String, Map<String, IResourceValue>> frameworkResources,
- IProjectCallback projectCallback, ILayoutLog logger);
-
- /**
- * Computes and renders a layout
- * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the
- * layout file.
- * @param projectKey An Object identifying the project. This is used for the cache mechanism.
- * @param screenWidth
- * @param screenHeight
- * @param themeName The name of the theme to use. In order to differentiate project and platform
- * themes sharing the same name, all project themes must be prepended with a '*' character.
- * @param projectResources the resources of the project. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the
- * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
- * and the value is the resource value.
- * @param frameworkResources the framework resources. The map contains (String, map) pairs
- * where the string is the type of the resource reference used in the layout file, and the map
- * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
- * value is the resource value.
- * @param projectCallback The {@link IProjectCallback} object to get information from
- * the project.
- * @param logger the object responsible for displaying warning/errors to the user.
- * @return a new {@link ILayoutResult} object that contains the result of the layout.
- * @deprecated Use {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)}
- * @since 1
- */
- @Deprecated
- ILayoutResult computeLayout(IXmlPullParser layoutDescription,
- Object projectKey,
- int screenWidth, int screenHeight, String themeName,
- Map<String, Map<String, IResourceValue>> projectResources,
- Map<String, Map<String, IResourceValue>> frameworkResources,
- IProjectCallback projectCallback, ILayoutLog logger);
-
- /**
- * Clears the resource cache for a specific project.
- * <p/>This cache contains bitmaps and nine patches that are loaded from the disk and reused
- * until this method is called.
- * <p/>The cache is not configuration dependent and should only be cleared when a
- * resource changes (at this time only bitmaps and 9 patches go into the cache).
- * @param projectKey the key for the project.
- * @since 1
- */
- void clearCaches(Object projectKey);
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutLog.java b/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutLog.java
deleted file mode 100644
index cae15d3..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutLog.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-/**
- * Callback interface to display warnings/errors that happened during the computation and
- * rendering of the layout.
- */
-public interface ILayoutLog {
-
- /**
- * Displays a warning message.
- * @param message the message to display.
- */
- void warning(String message);
-
- /**
- * Displays an error message.
- * @param message the message to display.
- */
- void error(String message);
-
- /**
- * Displays an exception
- * @param t the {@link Throwable} to display.
- */
- void error(Throwable t);
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutResult.java b/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutResult.java
deleted file mode 100644
index 2d8a210..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutResult.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-import java.awt.image.BufferedImage;
-
-/**
- * The result of a layout computation through
- * {@link ILayoutLibBridge#computeLayout(IXmlPullParser, int, int, String, java.util.Map, java.util.Map, java.util.Map, IFontLoader, ILayoutLibLog, ICustomViewLoader)}
- */
-public interface ILayoutResult {
- /**
- * Success return code
- */
- final static int SUCCESS = 0;
-
- /**
- * Error return code, in which case an error message is guaranteed to be defined.
- * @See {@link #getErrorMessage()}
- */
- final static int ERROR = 1;
-
- /**
- * Returns the result code.
- * @see #SUCCESS
- * @see #ERROR
- */
- int getSuccess();
-
- /**
- * Returns the {@link ILayoutViewInfo} object for the top level view.
- */
- ILayoutViewInfo getRootView();
-
- /**
- * Returns the rendering of the full layout.
- */
- BufferedImage getImage();
-
- /**
- * Returns the error message.
- * <p/>Only valid when {@link #getSuccess()} returns {@link #ERROR}
- */
- String getErrorMessage();
-
- /**
- * Layout information for a specific view.
- */
- public interface ILayoutViewInfo {
-
- /**
- * Returns the list of children views.
- */
- ILayoutViewInfo[] getChildren();
-
- /**
- * Returns the key associated with the node.
- * @see IXmlPullParser#getViewKey()
- */
- Object getViewKey();
-
- /**
- * Returns the name of the view.
- */
- String getName();
-
- /**
- * Returns the left of the view bounds.
- */
- int getLeft();
-
- /**
- * Returns the top of the view bounds.
- */
- int getTop();
-
- /**
- * Returns the right of the view bounds.
- */
- int getRight();
-
- /**
- * Returns the bottom of the view bounds.
- */
- int getBottom();
- }
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/IProjectCallback.java b/tools/layoutlib/api/src/com/android/layoutlib/api/IProjectCallback.java
deleted file mode 100644
index 5ad5082..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/IProjectCallback.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-/**
- * Callback for project information needed by the Layout Library.
- * Classes implementing this interface provide methods giving access to some project data, like
- * resource resolution, namespace information, and instantiation of custom view.
- */
-public interface IProjectCallback {
-
- /**
- * Loads a custom view with the given constructor signature and arguments.
- * @param name The fully qualified name of the class.
- * @param constructorSignature The signature of the class to use
- * @param constructorArgs The arguments to use on the constructor
- * @return A newly instantiated android.view.View object.
- * @throws ClassNotFoundException.
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
- throws ClassNotFoundException, Exception;
-
- /**
- * Returns the namespace of the application.
- * <p/>This lets the Layout Lib load custom attributes for custom views.
- */
- String getNamespace();
-
- /**
- * Resolves the id of a resource Id.
- * <p/>The resource id is the value of a <code>R.<type>.<name></code>, and
- * this method will return both the type and name of the resource.
- * @param id the Id to resolve.
- * @return an array of 2 strings containing the resource name and type, or null if the id
- * does not match any resource.
- */
- String[] resolveResourceValue(int id);
-
- /**
- * Resolves the id of a resource Id of type int[]
- * <p/>The resource id is the value of a R.styleable.<name>, and this method will
- * return the name of the resource.
- * @param id the Id to resolve.
- * @return the name of the resource or <code>null</code> if not found.
- */
- String resolveResourceValue(int[] id);
-
- /**
- * Returns the id of a resource.
- * <p/>The provided type and name must match an existing constant defined as
- * <code>R.<type>.<name></code>.
- * @param type the type of the resource
- * @param name the name of the resource
- * @return an Integer containing the resource Id, or <code>null</code> if not found.
- */
- Integer getResourceValue(String type, String name);
-
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/IResourceValue.java b/tools/layoutlib/api/src/com/android/layoutlib/api/IResourceValue.java
deleted file mode 100644
index 1da9508..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/IResourceValue.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-/**
- * Represents an android resource with a name and a string value.
- */
-public interface IResourceValue {
-
- /**
- * Returns the type of the resource. For instance "drawable", "color", etc...
- */
- String getType();
-
- /**
- * Returns the name of the resource, as defined in the XML.
- */
- String getName();
-
- /**
- * Returns the value of the resource, as defined in the XML. This can be <code>null</code>
- */
- String getValue();
-
- /**
- * Returns whether the resource is a framework resource (<code>true</code>) or a project
- * resource (<code>false</false>).
- */
- boolean isFramework();
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/IStyleResourceValue.java b/tools/layoutlib/api/src/com/android/layoutlib/api/IStyleResourceValue.java
deleted file mode 100644
index 2f17e69..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/IStyleResourceValue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-
-/**
- * Represents an android style resources with a name and a list of children {@link IResourceValue}.
- */
-public interface IStyleResourceValue extends IResourceValue {
-
- /**
- * Returns the parent style name or <code>null</code> if unknown.
- */
- String getParentStyle();
-
- /**
- * Find an item in the list by name
- * @param name
- */
- IResourceValue findItem(String name);
-}
diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/IXmlPullParser.java b/tools/layoutlib/api/src/com/android/layoutlib/api/IXmlPullParser.java
deleted file mode 100644
index cd43c56..0000000
--- a/tools/layoutlib/api/src/com/android/layoutlib/api/IXmlPullParser.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 com.android.layoutlib.api;
-
-import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
-
-import org.xmlpull.v1.XmlPullParser;
-
-/**
- * Extended version of {@link XmlPullParser} to use with
- * {@link ILayoutLibBridge#computeLayout(XmlPullParser, int, int, String, java.util.Map, java.util.Map, java.util.Map, com.android.layoutlib.api.ILayoutLibBridge.IFontInfo)}
- */
-public interface IXmlPullParser extends XmlPullParser {
-
- /**
- * Returns a key for the current XML node.
- * <p/>This key will be passed back in the {@link ILayoutViewInfo} objects, allowing association
- * of a particular XML node with its result from the layout computation.
- */
- Object getViewKey();
-}
-
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
index b5b7ceb..791e53b 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
@@ -60,6 +60,7 @@
public final static String REFERENCE_STYLE = RES_STYLE + "/";
public final static String REFERENCE_NULL = "@null";
+ public final static String MATCH_PARENT = "match_parent";
public final static String FILL_PARENT = "fill_parent";
public final static String WRAP_CONTENT = "wrap_content";
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
index 1e9f573..b670eee 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
@@ -259,7 +259,18 @@
// resolve the defStyleAttr value into a IStyleResourceValue
IStyleResourceValue defStyleValues = null;
- if (defStyleAttr != 0) {
+
+ // look for a custom style.
+ String customStyle = parser.getAttributeValue(null /* namespace*/, "style");
+ if (customStyle != null) {
+ IResourceValue item = findResValue(customStyle);
+
+ if (item instanceof IStyleResourceValue) {
+ defStyleValues = (IStyleResourceValue)item;
+ }
+ }
+
+ if (defStyleValues == null && defStyleAttr != 0) {
// get the name from the int.
String defStyleName = searchAttr(defStyleAttr);
@@ -1104,7 +1115,7 @@
Bundle initialExtras) {
// TODO Auto-generated method stub
}
-
+
@Override
public void setTheme(int arg0) {
// TODO Auto-generated method stub
@@ -1137,7 +1148,7 @@
throws IntentSender.SendIntentException {
// TODO Auto-generated method stub
}
-
+
@Override
public boolean startInstrumentation(ComponentName arg0, String arg1,
Bundle arg2) {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
index 1fafef4..6358abb 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
@@ -239,8 +239,9 @@
String v = value.getValue();
if (v != null) {
- if (v.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.FILL_PARENT;
+ if (v.equals(BridgeConstants.MATCH_PARENT) ||
+ v.equals(BridgeConstants.FILL_PARENT)) {
+ return LayoutParams.MATCH_PARENT;
} else if (v.equals(BridgeConstants.WRAP_CONTENT)) {
return LayoutParams.WRAP_CONTENT;
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java
index 6f203ba..efd222e 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java
@@ -392,8 +392,8 @@
if (s == null) {
return defValue;
- } else if (s.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.FILL_PARENT;
+ } else if (s.equals(BridgeConstants.MATCH_PARENT)) {
+ return LayoutParams.MATCH_PARENT;
} else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
return LayoutParams.WRAP_CONTENT;
}
@@ -460,8 +460,8 @@
if (s == null) {
return defValue;
- } else if (s.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.FILL_PARENT;
+ } else if (s.equals(BridgeConstants.MATCH_PARENT)) {
+ return LayoutParams.MATCH_PARENT;
} else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
return LayoutParams.WRAP_CONTENT;
}
diff --git a/tools/layoutlib/bridge/tests/com/android/layoutlib/testdata/layout1.xml b/tools/layoutlib/bridge/tests/com/android/layoutlib/testdata/layout1.xml
index 554f541..b8fc947 100644
--- a/tools/layoutlib/bridge/tests/com/android/layoutlib/testdata/layout1.xml
+++ b/tools/layoutlib/bridge/tests/com/android/layoutlib/testdata/layout1.xml
@@ -17,8 +17,8 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
@@ -31,8 +31,8 @@
</Button>
<View
android:id="@+id/surface"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:layout_weight="2"
/>
<TextView
@@ -40,7 +40,7 @@
android:paddingLeft="2dip"
android:layout_weight="0"
android:background="@drawable/black"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
android:gravity="center_vertical|center_horizontal"
diff --git a/tools/preload/20080522.compiled b/tools/preload/20080522.compiled
new file mode 100644
index 0000000..a2af422
--- /dev/null
+++ b/tools/preload/20080522.compiled
Binary files differ
diff --git a/tools/preload/20090811.compiled b/tools/preload/20090811.compiled
new file mode 100644
index 0000000..6dbeca0
--- /dev/null
+++ b/tools/preload/20090811.compiled
Binary files differ
diff --git a/tools/preload/20090922.compiled b/tools/preload/20090922.compiled
deleted file mode 100644
index fc66405..0000000
--- a/tools/preload/20090922.compiled
+++ /dev/null
Binary files differ
diff --git a/tools/preload/Android.mk b/tools/preload/Android.mk
index 65b7d1a..f325870 100644
--- a/tools/preload/Android.mk
+++ b/tools/preload/Android.mk
@@ -8,7 +8,6 @@
MemoryUsage.java \
Operation.java \
Policy.java \
- PrintBugReports.java \
PrintCsv.java \
PrintHtmlDiff.java \
PrintPsTree.java \
diff --git a/tools/preload/LoadedClass.java b/tools/preload/LoadedClass.java
index 02cff10..86e5dfc 100644
--- a/tools/preload/LoadedClass.java
+++ b/tools/preload/LoadedClass.java
@@ -15,11 +15,7 @@
*/
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
/**
* A loaded class.
@@ -54,30 +50,6 @@
this.systemClass = systemClass;
}
- /**
- * Returns true if this class was loaded by more than one proc.
- */
- boolean isSharable() {
- Set<String> procNames = new HashSet<String>();
- for (Operation load : loads) {
- if (load.process.fromZygote()) {
- procNames.add(load.process.name);
- if (procNames.size() > 1) {
- return true;
- }
- }
- }
- for (Operation init : initializations) {
- if (init.process.fromZygote()) {
- procNames.add(init.process.name);
- if (procNames.size() > 1) {
- return true;
- }
- }
- }
- return false;
- }
-
void measureMemoryUsage() {
this.memoryUsage = MemoryUsage.forClass(name);
}
diff --git a/tools/preload/PrintBugReports.java b/tools/preload/PrintBugReports.java
deleted file mode 100644
index a6d4187..0000000
--- a/tools/preload/PrintBugReports.java
+++ /dev/null
@@ -1,272 +0,0 @@
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.util.Map;
-import java.util.List;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.Iterator;
-
-/**
- * Prints HTML reports that can be attached to bugs.
- */
-public class PrintBugReports {
-
- private static final String DIR = "out/preload";
- private static boolean PRINT_MEMORY_USAGE = false;
-
- private static final Comparator<LoadedClass> DEFAULT_ORDER
- = new Comparator<LoadedClass>() {
- public int compare(LoadedClass a, LoadedClass b) {
- // Longest load time first.
- int diff = b.medianTimeMicros() - a.medianTimeMicros();
- if (diff != 0) {
- return diff;
- }
-
- return a.name.compareTo(b.name);
- }
- };
-
- public static void main(String[] args)
- throws IOException, ClassNotFoundException {
- Root root = Root.fromFile(args[0]);
- String baseUrl = "";
- if (args.length > 1) {
- baseUrl = args[1];
- }
-
- new File(DIR).mkdirs();
-
- Map<String, List<Proc>> procsByName = new HashMap<String, List<Proc>>();
- for (Proc proc : root.processes.values()) {
- if (proc.fromZygote()) {
- List<Proc> procs = procsByName.get(proc.name);
- if (procs == null) {
- procs = new ArrayList<Proc>();
- procsByName.put(proc.name, procs);
- }
- procs.add(proc);
- }
- }
-
- Set<LoadedClass> coreClasses = new TreeSet<LoadedClass>(DEFAULT_ORDER);
- Set<LoadedClass> frameworkClasses = new TreeSet<LoadedClass>(DEFAULT_ORDER);
-
- for (List<Proc> procs : procsByName.values()) {
- Proc first = procs.get(0);
- Set<LoadedClass> classes = new TreeSet<LoadedClass>(DEFAULT_ORDER);
- Set<LoadedClass> sharedClasses
- = new TreeSet<LoadedClass>(DEFAULT_ORDER);
- for (Proc proc : procs) {
- for (Operation operation : proc.operations) {
- LoadedClass clazz = operation.loadedClass;
- if (clazz.isSharable() && clazz.systemClass) {
- if (clazz.name.startsWith("dalvik")
- || clazz.name.startsWith("org")
- || clazz.name.startsWith("java")) {
- coreClasses.add(clazz);
- } else {
- frameworkClasses.add(clazz);
- }
- sharedClasses.add(clazz);
- } else {
- classes.add(clazz);
- }
- }
- }
- printApplicationHtml(first.name, root.baseline, classes,
- sharedClasses);
- }
-
- printHtml("core", root.baseline, coreClasses);
- printHtml("framework", root.baseline, frameworkClasses);
-
- PrintStream out = new PrintStream(DIR + "/toc.html");
- out.println("<html><body>");
- out.println("<a href='" + baseUrl
- + "/core.html'>core</a><br/>");
- out.println("<a href='" + baseUrl
- + "/framework.html'>framework</a><br/>");
-
- for (String s : new TreeSet<String>(procsByName.keySet())) {
- out.println("<a href='" + baseUrl + "/"
- + s + ".html'>" + s + "</a><br/>");
- }
- out.println("</body></html>");
- out.close();
- }
-
- static void printApplicationHtml(String name, MemoryUsage baseline,
- Iterable<LoadedClass> classes, Iterable<LoadedClass> sharedClasses)
- throws IOException {
- PrintStream out = new PrintStream(DIR + "/" + name + ".html");
-
- printHeader(name, out);
- out.println("<body>");
- out.println("<h1><tt>" + name + "</tt></h1>");
- out.println("<p><i>Click a column header to sort by that column.</i></p>");
-
- out.println("<p><a href=\"#shared\">Shared Classes</a></p>");
-
- out.println("<h3>Application-Specific Classes</h3>");
-
- out.println("<p>These classes were loaded only by " + name + ". If"
- + " the value of the <i>Preloaded</i> column is <i>yes</i> or "
- + " <i>no</i>, the class is in the boot classpath; if it's not"
- + " part of the published API, consider"
- + " moving it into the APK.</p>");
-
- printTable(out, baseline, classes, false);
-
- out.println("<p><a href=\"#\">Top</a></p>");
-
- out.println("<a name=\"shared\"/><h3>Shared Classes</h3>");
-
- out.println("<p>These classes are in the boot classpath. They are used"
- + " by " + name + " as well as others.");
-
- printTable(out, baseline, sharedClasses, true);
-
- out.println("</body></html>");
- out.close();
- }
-
- static void printHtml(String name, MemoryUsage baseline,
- Iterable<LoadedClass> classes)
- throws IOException {
- PrintStream out = new PrintStream(DIR + "/" + name + ".html");
-
- printHeader(name, out);
- out.println("<body>");
- out.println("<h1><tt>" + name + "</tt></h1>");
- out.println("<p><i>Click a column header to sort by that column.</i></p>");
-
- printTable(out, baseline, classes, true);
-
- out.println("</body></html>");
- out.close();
- }
-
- private static void printHeader(String name, PrintStream out)
- throws IOException {
- out.println("<html><head>");
- out.println("<title>" + name + "</title>");
- out.println("<style>");
- out.println("a, th, td, h1, h3, p { font-family: arial }");
- out.println("th, td { font-size: small }");
- out.println("</style>");
- out.println("<script language=\"javascript\">");
- out.write(SCRIPT);
- out.println("</script>");
- out.println("</head>");
- }
-
- static void printTable(PrintStream out, MemoryUsage baseline,
- Iterable<LoadedClass> classes, boolean showProcNames) {
- out.println("<p><table border=\"1\" cellpadding=\"5\""
- + " class=\"sortable\" cellspacing=\"0\">");
-
- out.println("<thead bgcolor=\"#eeeeee\"><tr>");
- out.println("<th>Name</th>");
- out.println("<th>Preloaded</th>");
- out.println("<th>Total Time (us)</th>");
- out.println("<th>Load Time (us)</th>");
- out.println("<th>Init Time (us)</th>");
- if (PRINT_MEMORY_USAGE) {
- out.println("<th>Total Heap (B)</th>");
- out.println("<th>Dalvik Heap (B)</th>");
- out.println("<th>Native Heap (B)</th>");
- out.println("<th>Total Pages (kB)</th>");
- out.println("<th>Dalvik Pages (kB)</th>");
- out.println("<th>Native Pages (kB)</th>");
- out.println("<th>Other Pages (kB)</th>");
- }
- if (showProcNames) {
- out.println("<th>Loaded by</th>");
- }
- out.println("</tr></thead>");
-
- for (LoadedClass clazz : classes) {
- out.println("<tr>");
- out.println("<td>" + clazz.name + "</td>");
-
- out.println("<td>" + ((clazz.systemClass)
- ? ((clazz.preloaded) ? "yes" : "no") : "n/a") + "</td>");
-
- out.println("<td>" + clazz.medianTimeMicros() + "</td>");
- out.println("<td>" + clazz.medianLoadTimeMicros() + "</td>");
- out.println("<td>" + clazz.medianInitTimeMicros() + "</td>");
-
- if (PRINT_MEMORY_USAGE) {
- if (clazz.memoryUsage.isAvailable()) {
- MemoryUsage subtracted
- = clazz.memoryUsage.subtract(baseline);
-
- long totalHeap = subtracted.javaHeapSize()
- + subtracted.nativeHeapSize;
- out.println("<td>" + totalHeap + "</td>");
- out.println("<td>" + subtracted.javaHeapSize() + "</td>");
- out.println("<td>" + subtracted.nativeHeapSize + "</td>");
-
- out.println("<td>" + subtracted.totalPages() + "</td>");
- out.println("<td>" + subtracted.javaPagesInK() + "</td>");
- out.println("<td>" + subtracted.nativePagesInK() + "</td>");
- out.println("<td>" + subtracted.otherPagesInK() + "</td>");
- } else {
- for (int i = 0; i < 7; i++) {
- out.println("<td> </td>");
- }
- }
- }
-
- if (showProcNames) {
- out.println("<td>");
- Set<String> procNames = new TreeSet<String>();
- for (Operation op : clazz.loads) {
- procNames.add(op.process.name);
- }
- for (Operation op : clazz.initializations) {
- procNames.add(op.process.name);
- }
- if (procNames.size() <= 3) {
- for (String name : procNames) {
- out.print(name + "<br/>");
- }
- } else {
- Iterator<String> i = procNames.iterator();
- out.print(i.next() + "<br/>");
- out.print(i.next() + "<br/>");
- out.print("...and " + (procNames.size() - 2)
- + " others.");
- }
- out.println("</td>");
- }
-
- out.println("</tr>");
- }
-
- out.println("</table></p>");
- }
-
- static byte[] SCRIPT;
- static {
- try {
- File script = new File(
- "frameworks/base/tools/preload/sorttable.js");
- int length = (int) script.length();
- SCRIPT = new byte[length];
- DataInputStream in = new DataInputStream(
- new FileInputStream(script));
- in.readFully(SCRIPT);
- in.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/tools/preload/Root.java b/tools/preload/Root.java
index 3f12dea..0bc29bf 100644
--- a/tools/preload/Root.java
+++ b/tools/preload/Root.java
@@ -46,8 +46,7 @@
final Map<String, LoadedClass> loadedClasses
= new HashMap<String, LoadedClass>();
-// MemoryUsage baseline = MemoryUsage.baseline();
- MemoryUsage baseline = MemoryUsage.NOT_AVAILABLE;
+ MemoryUsage baseline = MemoryUsage.baseline();
/**
* Records class loads and initializations.
@@ -74,7 +73,7 @@
if (loadedClass.systemClass) {
// Only measure memory for classes in the boot
// classpath.
-// loadedClass.measureMemoryUsage();
+ loadedClass.measureMemoryUsage();
}
loadedClasses.put(name, loadedClass);
}
diff --git a/tools/preload/WritePreloadedClassFile.java b/tools/preload/WritePreloadedClassFile.java
index 757d17d3..96c539b 100644
--- a/tools/preload/WritePreloadedClassFile.java
+++ b/tools/preload/WritePreloadedClassFile.java
@@ -32,7 +32,7 @@
/**
* Preload any class that take longer to load than MIN_LOAD_TIME_MICROS us.
*/
- static final int MIN_LOAD_TIME_MICROS = 1000;
+ static final int MIN_LOAD_TIME_MICROS = 1250;
public static void main(String[] args) throws IOException,
ClassNotFoundException {
diff --git a/tools/preload/preload.ipr b/tools/preload/preload.ipr
index dddca3b..0c9621c 100644
--- a/tools/preload/preload.ipr
+++ b/tools/preload/preload.ipr
@@ -364,7 +364,7 @@
</component>
<component name="ProjectFileVersion" converted="true" />
<component name="ProjectKey">
- <option name="state" value="project:///Volumes/Android/eclair/frameworks/base/tools/preload/preload.ipr" />
+ <option name="state" value="project:///Volumes/Android/donut/frameworks/base/tools/preload/preload.ipr" />
</component>
<component name="ProjectModuleManager">
<modules>
diff --git a/tools/preload/sorttable.js b/tools/preload/sorttable.js
index f03859e..25bccb2 100644
--- a/tools/preload/sorttable.js
+++ b/tools/preload/sorttable.js
@@ -6,7 +6,7 @@
Instructions:
Download this file
- Add <script src="sorttable.js"> to your HTML
+ Add <script src="sorttable.js"></script> to your HTML
Add class="sortable" to any table you'd like to make sortable
Click on the headers to sort
@@ -88,7 +88,6 @@
}
// make it clickable to sort
headrow[i].sorttable_columnindex = i;
- headrow[i].style.cursor = "pointer";
headrow[i].sorttable_tbody = table.tBodies[0];
dean_addEvent(headrow[i],"click", function(e) {
diff --git a/vpn/java/android/net/vpn/VpnManager.java b/vpn/java/android/net/vpn/VpnManager.java
index 6df612e..ce40b5d 100644
--- a/vpn/java/android/net/vpn/VpnManager.java
+++ b/vpn/java/android/net/vpn/VpnManager.java
@@ -16,11 +16,15 @@
package android.net.vpn;
+import java.io.File;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.os.Environment;
+import android.os.SystemProperties;
import android.util.Log;
/**
@@ -65,7 +69,7 @@
/** Error code to indicate a successful connection. */
public static final int VPN_ERROR_NO_ERROR = 0;
- public static final String PROFILES_PATH = "/data/misc/vpn/profiles";
+ public static final String PROFILES_PATH = "/misc/vpn/profiles";
private static final String PACKAGE_PREFIX =
VpnManager.class.getPackage().getName() + ".";
@@ -77,7 +81,13 @@
private static final String ACTION_VPN_SETTINGS =
PACKAGE_PREFIX + "SETTINGS";
- private static final String TAG = VpnManager.class.getSimpleName();
+ public static final String TAG = VpnManager.class.getSimpleName();
+
+ // TODO(oam): Test VPN when EFS is enabled (will do later)...
+ public static String getProfilePath() {
+ // This call will return the correct path if Encrypted FS is enabled or not.
+ return Environment.getSecureDataDirectory().getPath() + PROFILES_PATH;
+ }
/**
* Returns all supported VPN types.
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 9d8f730..2668fe0 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -616,7 +616,7 @@
* @return {@code true} if the operation succeeds, {@code false} otherwise, e.g.,
* the number of channels is invalid.
*/
- public boolean setNumAllowedChannels() {
+ public synchronized boolean setNumAllowedChannels() {
try {
return setNumAllowedChannels(
Settings.Secure.getInt(mContext.getContentResolver(),
@@ -859,7 +859,9 @@
// Only do this if we haven't gotten a new supplicant status since the timer
// started
if (mNumSupplicantStateChanges == msg.arg1) {
- WifiNative.scanCommand(false); // do a passive scan
+ synchronized (this) {
+ WifiNative.scanCommand(false); // do a passive scan
+ }
}
break;
@@ -1154,7 +1156,6 @@
// [31- 1] Reserved for future use
// [ 0- 0] Interface configuration succeeded (1) or failed (0)
EventLog.writeEvent(EVENTLOG_INTERFACE_CONFIGURATION_STATE_CHANGED, 0);
-
mHaveIpAddress = false;
mWifiInfo.setIpAddress(0);
mObtainingIpAddress = false;