Merge change 21977 into donut
* changes:
docs only. add reference information for new <path-permission> element
diff --git a/api/current.xml b/api/current.xml
index ffbe6e2..fc54859 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -109309,6 +109309,17 @@
visibility="public"
>
</field>
+<field name="ACTION_TTS_DATA_INSTALLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.speech.tts.engine.TTS_DATA_INSTALLED""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="CHECK_VOICE_DATA_BAD_DATA"
type="int"
transient="false"
@@ -109375,6 +109386,17 @@
visibility="public"
>
</field>
+<field name="EXTRA_TTS_DATA_INSTALLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""dataInstalled""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_VOICE_DATA_FILES"
type="java.lang.String"
transient="false"
@@ -178497,6 +178519,211 @@
</parameter>
</method>
</class>
+<class name="ZoomButtonsController"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.view.View.OnTouchListener">
+</implements>
+<constructor name="ZoomButtonsController"
+ type="android.widget.ZoomButtonsController"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="ownerView" type="android.view.View">
+</parameter>
+</constructor>
+<method name="getContainer"
+ return="android.view.ViewGroup"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getZoomControls"
+ return="android.view.View"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isAutoDismissed"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isVisible"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="onTouch"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="v" type="android.view.View">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="setAutoDismissed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="autoDismiss" type="boolean">
+</parameter>
+</method>
+<method name="setFocusable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="focusable" type="boolean">
+</parameter>
+</method>
+<method name="setOnZoomListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.widget.ZoomButtonsController.OnZoomListener">
+</parameter>
+</method>
+<method name="setVisible"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="visible" type="boolean">
+</parameter>
+</method>
+<method name="setZoomInEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
+<method name="setZoomOutEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
+<method name="setZoomSpeed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="speed" type="long">
+</parameter>
+</method>
+</class>
+<interface name="ZoomButtonsController.OnZoomListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onVisibilityChanged"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="visible" type="boolean">
+</parameter>
+</method>
+<method name="onZoom"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="zoomIn" type="boolean">
+</parameter>
+</method>
+</interface>
<class name="ZoomControls"
extends="android.widget.LinearLayout"
abstract="false"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 4ac3b9e..f2905a7 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2521,7 +2521,7 @@
* no extra data is required.
* @param globalSearch If false, this will only launch the search that has been specifically
* defined by the application (which is usually defined as a local search). If no default
- * search is defined in the current application or activity, no search will be launched.
+ * search is defined in the current application or activity, global search will be launched.
* If true, this will always launch a platform-global (e.g. web-based) search instead.
*
* @see android.app.SearchManager
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 97d46f8..d2a3a1d 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1683,7 +1683,7 @@
* no extra data is required.
* @param globalSearch If false, this will only launch the search that has been specifically
* defined by the application (which is usually defined as a local search). If no default
- * search is defined in the current application or activity, no search will be launched.
+ * search is defined in the current application or activity, global search will be launched.
* If true, this will always launch a platform-global (e.g. web-based) search instead.
*
* @see android.app.Activity#onSearchRequested
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9a9ddc9..4a4d2de 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2973,6 +2973,18 @@
"vending_pd_resend_frequency_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.
*/
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 4405a53..a6d76d6 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -61,7 +61,7 @@
/**
- * Denotes the language is available exactly as specified by the locale
+ * Denotes the language is available exactly as specified by the locale.
*/
public static final int LANG_COUNTRY_VAR_AVAILABLE = 2;
@@ -176,7 +176,7 @@
// intents to ask engine to install data or check its data
/**
- * Broadcast Action: Triggers the platform Text-To-Speech engine to
+ * Activity Action: Triggers the platform Text-To-Speech engine to
* start the activity that installs the resource files on the device
* that are required for TTS to be operational. Since the installation
* of the data can be interrupted or declined by the user, the application
@@ -184,18 +184,20 @@
* and if need be, should check installation status with
* {@link #ACTION_CHECK_TTS_DATA}.
*/
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_INSTALL_TTS_DATA =
"android.speech.tts.engine.INSTALL_TTS_DATA";
/**
- * {@hide}
+ * Broadcast Action: broadcast to signal the completion of the installation of
+ * the data files used by the synthesis engine. Success or failure is indicated in the
+ * {@link #EXTRA_TTS_DATA_INSTALLED} extra.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_TTS_DATA_INSTALLED =
"android.speech.tts.engine.TTS_DATA_INSTALLED";
/**
- * Broadcast Action: Starts the activity from the platform Text-To-Speech
+ * Activity Action: Starts the activity from the platform Text-To-Speech
* engine to verify the proper installation and availability of the
* resource files on the system. Upon completion, the activity will
* return one of the following codes:
@@ -217,7 +219,7 @@
* and YYY is the 3-letter ISO country code.</li>
* </ul>
*/
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CHECK_TTS_DATA =
"android.speech.tts.engine.CHECK_TTS_DATA";
@@ -241,11 +243,11 @@
// extras for a TTS engine's data installation
/**
- * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent
- * which indicates whether the TTS data installation requested with
- * {@link #ACTION_INSTALL_TTS_DATA} completed successfully or not. The value is
- * {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
- * {@hide}
+ * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent.
+ * It indicates whether the data files for the synthesis engine were successfully
+ * installed. The installation was initiated with the {@link #ACTION_INSTALL_TTS_DATA}
+ * intent. The possible values for this extra are
+ * {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}.
*/
public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java
index bae4dad..a41e2e3 100644
--- a/core/java/android/widget/ZoomButtonsController.java
+++ b/core/java/android/widget/ZoomButtonsController.java
@@ -69,7 +69,6 @@
* {@link #setVisible(boolean) setVisible(false)} from the
* {@link View#onDetachedFromWindow}.
*
- * @hide
*/
public class ZoomButtonsController implements View.OnTouchListener {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 4558660..cf2184c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -49,7 +49,6 @@
<protected-broadcast android:name="android.intent.action.ACTION_SHUTDOWN" />
<protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_LOW" />
<protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_OK" />
- <protected-broadcast android:name="android.intent.action.AIRPLANE_MODE" />
<protected-broadcast android:name="android.intent.action.NEW_OUTGOING_CALL" />
<protected-broadcast android:name="android.intent.action.REBOOT" />
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ad52251..d858a79 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -168,7 +168,7 @@
<string name="permdesc_receiveSms" msgid="6298292335965966117">"Umožňuje aplikaci přijímat a zpracovávat zprávy SMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
<string name="permlab_receiveMms" msgid="8894700916188083287">"příjem zpráv MMS"</string>
<string name="permdesc_receiveMms" msgid="4563346832000174373">"Umožňuje aplikaci přijímat a zpracovávat zprávy MMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
- <string name="permlab_sendSms" msgid="5600830612147671529">"odesílat zprávy SMS"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"odesílaní zpráv SMS"</string>
<string name="permdesc_sendSms" msgid="1946540351763502120">"Umožňuje aplikaci odesílat zprávy SMS. Škodlivé aplikace mohou bez vašeho potvrzení odesílat zpoplatněné zprávy."</string>
<string name="permlab_readSms" msgid="4085333708122372256">"čtení zpráv SMS a MMS"</string>
<string name="permdesc_readSms" msgid="3002170087197294591">"Umožňuje aplikaci číst zprávy SMS uložené ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou načíst vaše soukromé zprávy."</string>
@@ -182,7 +182,7 @@
<string name="permdesc_reorderTasks" msgid="126252774270522835">"Umožňuje aplikaci přesouvat úlohy do popředí či pozadí. Škodlivé aplikace mohou vynutit své přesunutí do popředí bez vašeho přičinění."</string>
<string name="permlab_setDebugApp" msgid="4339730312925176742">"povolit ladění aplikací"</string>
<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ěny vašeho nastavení uživatelského rozhraní"</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>
@@ -190,9 +190,9 @@
<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>
<string name="permdesc_dump" msgid="2198776174276275220">"Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat."</string>
- <string name="permlab_shutdown" msgid="7185747824038909016">"Částečné vypnutí"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"částečné vypnutí"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"Uvede správce činností do vypnutého stavu. Nedojde však k úplnému vypnutí."</string>
- <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"Zabránit přepínání aplikací"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zabránění přepínání aplikací"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Zabrání uživateli přepnout na jinou aplikaci."</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"sledování a řízení spouštění všech aplikací"</string>
<string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu."</string>
@@ -208,13 +208,13 @@
<string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Umožňuje aplikaci ovládat, zda jsou činnosti vždy dokončeny po přesunutí do pozadí. Běžné aplikace toto nastavení nikdy nevyužívají."</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"změna statistických údajů o baterii"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace."</string>
- <string name="permlab_backup" msgid="470013022865453920">"Ovládat zálohování a obnovu systému"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
<string name="permdesc_backup" msgid="2305432853944929371">"Umožňuje aplikaci ovládat mechanizmus zálohování a obnovy systému. Není určeno k použití v běžných aplikacích."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazení nepovolených oken"</string>
<string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají."</string>
<string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazení upozornění systémové úrovně"</string>
<string name="permdesc_systemAlertWindow" msgid="5109622689323490558">"Umožňuje aplikaci zobrazit okna s výstrahami systému. Škodlivé aplikace mohou převzít kontrolu nad celou obrazovkou telefonu."</string>
- <string name="permlab_setAnimationScale" msgid="2805103241153907174">"globální změny rychlosti animace"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"změna globální rychlosti animace"</string>
<string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Umožňuje aplikaci kdykoli globálně změnit rychlost animace (rychlejší či pomalejší animace)."</string>
<string name="permlab_manageAppTokens" msgid="17124341698093865">"správa tokenů aplikací"</string>
<string name="permdesc_manageAppTokens" msgid="977127907524195988">"Umožňuje aplikaci vytvořit a spravovat své vlastní tokeny a obejít jejich obvyklé řazení typu Z. Toto nastavení by nikdy nemělo být potřeba pro běžné aplikace."</string>
@@ -250,11 +250,11 @@
<string name="permdesc_changeComponentState" msgid="4569107043246700630">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce telefonu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string>
<string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nastavení upřednostňovaných aplikací"</string>
<string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Umožňuje aplikaci změnit vaše upřednostňované aplikace. Toto nastavení může škodlivým aplikacím umožnit nepozorovaně změnit spouštěné aplikace a oklamat vaše existující aplikace tak, aby shromažďovaly vaše soukromá data."</string>
- <string name="permlab_writeSettings" msgid="1365523497395143704">"změny globálních nastavení systému"</string>
+ <string name="permlab_writeSettings" msgid="1365523497395143704">"změna globálních nastavení systému"</string>
<string name="permdesc_writeSettings" msgid="838789419871034696">"Umožňuje aplikaci upravit data nastavení systému. Škodlivé aplikace mohou poškodit konfiguraci vašeho systému."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"změny zabezpečených nastavení systému"</string>
<string name="permdesc_writeSecureSettings" msgid="4116616249170428132">"Umožňuje aplikaci změnit data zabezpečených nastavení systému. Běžné aplikace toto nastavení nevyužívají."</string>
- <string name="permlab_writeGservices" msgid="2149426664226152185">"změny mapy služeb Google"</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"změna mapy služeb Google"</string>
<string name="permdesc_writeGservices" msgid="6602362746516676175">"Umožňuje aplikaci změnit mapu služeb Google. Běžné aplikace toto nastavení nevyužívají."</string>
<string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automatické spuštění při startu"</string>
<string name="permdesc_receiveBootCompleted" msgid="698336728415008796">"Umožňuje aplikaci spuštění ihned po spuštění systému. Toto nastavení může zpomalit spuštění telefonu a umožnit aplikaci celkově zpomalit telefon, protože bude neustále spuštěna."</string>
@@ -276,7 +276,7 @@
<string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Vytváří simulované zdroje polohy pro účely testování. Škodlivé aplikace mohou pomocí tohoto nastavení změnit polohu či stav vrácený zdroji skutečné polohy, jako je např. jednotka GPS či poskytovatelé sítě."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"přístup k dalším příkazům poskytovatele polohy"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Umožňuje získat přístup k dalším příkazům poskytovatele polohy. Škodlivé aplikace mohou pomocí tohoto nastavení narušit funkci GPS či jiných zdrojů polohy."</string>
- <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Oprávnění k instalaci poskytovatele polohy"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"oprávnění k instalaci poskytovatele polohy"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Vytvořit simulace zdrojů polohy pro účely testování. Škodlivé aplikace mohou toto nastavení využít k přepsání polohy nebo stavu vráceného zdroji skutečné polohy, například systémem GPS nebo poskytovateli sítí. Mohou také monitorovat polohu a ohlásit ji externímu zdroji."</string>
<string name="permlab_accessFineLocation" msgid="8116127007541369477">"upřesnění polohy (GPS)"</string>
<string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Umožňuje aplikaci přístup ke zdrojům přesné polohy v telefonu, jako je například systém GPS, je-li k dispozici. Škodlivé aplikace mohou pomocí tohoto nastavení zjistit vaši polohu a mohou zvýšit spotřebu baterie."</string>
@@ -316,7 +316,7 @@
<string name="permdesc_checkinProperties" msgid="7150307006141883832">"Umožňuje čtení i zápis vlastností nahraných službou Checkin. Běžné aplikace toto nastavení obvykle nevyužívají."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"zvolit widgety"</string>
<string name="permdesc_bindGadget" msgid="2098697834497452046">"Umožňuje aplikaci sdělit systému, které aplikace mohou používat které widgety. Aplikace s tímto oprávněním mohou zpřístupnit osobní údaje jiným aplikacím. Není určeno pro běžné aplikace."</string>
- <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"změny stavu telefonu"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"změna stavu telefonu"</string>
<string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním může přepínat sítě nebo zapnout či vypnout bezdrátové připojení telefonu bez vašeho svolení."</string>
<!-- no translation found for permlab_readPhoneState (2326172951448691631) -->
<skip />
@@ -342,7 +342,7 @@
<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="permdesc_createNetworkSockets" msgid="4593339106921772192">"Umožňuje aplikaci vytvořit síťové sokety."</string>
- <string name="permlab_writeApnSettings" msgid="7823599210086622545">"zápis nastavení pro název přístupového bodu (APN)"</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>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"změna připojení k síti"</string>
<string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Umožňuje aplikaci změnit stav připojení k síti."</string>
@@ -350,9 +350,9 @@
<string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Umožňuje aplikaci změnit nastavení použití dat na pozadí."</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"zobrazení stavu WiFi"</string>
<string name="permdesc_accessWifiState" msgid="485796529139236346">"Umožňuje aplikaci zobrazit informace o stavu připojení WiFi."</string>
- <string name="permlab_changeWifiState" msgid="7280632711057112137">"Změnit stav WiFi"</string>
+ <string name="permlab_changeWifiState" msgid="7280632711057112137">"změna stavu WiFi"</string>
<string name="permdesc_changeWifiState" msgid="2950383153656873267">"Umožňuje aplikaci připojit se k přístupovým bodům WiFi či se od nich odpojit a provádět změny nakonfigurovaných sítí WiFi."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Povolit příjem Wi-Fi Multicast"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"povolení příjmu Wi-Fi Multicast"</string>
<string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Povoluje aplikaci přijímat pakety, které nebyly adresovány přímo vašemu zařízení. Pomocí této možnosti můžete objevit služby nabízené ve vaší blízkosti. Spotřeba energie je vyšší než u režimu bez vícesměrového vysílání (multicast)."</string>
<string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"správa rozhraní Bluetooth"</string>
<string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
@@ -370,11 +370,11 @@
<string name="permdesc_subscribedFeedsRead" msgid="3622200625634207660">"Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"zápis odebíraných zdrojů"</string>
<string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Umožňuje aplikaci upravit vaše aktuálně synchronizované zdroje. To může škodlivým aplikacím umožnit změnu vašich synchronizovaných zdrojů."</string>
- <string name="permlab_readDictionary" msgid="432535716804748781">"číst slovník definovaný uživatelem"</string>
+ <string name="permlab_readDictionary" msgid="432535716804748781">"člení slovníku definovaného uživatelem"</string>
<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">"zapisovat do slovníku definovaného uživatelem"</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ěnit/smazat obsah karty SD"</string>
+ <string name="permlab_sdcardWrite" msgid="8079403759001777291">"změna/smazání obsah karty SD"</string>
<string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domů"</item>
@@ -473,10 +473,10 @@
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload" msgid="1901675448179653089">"Chcete opustit tuto stránku?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vyberte OK, chcete-li pokračovat, nebo Zrušit, chcete-li na stránce zůstat."</string>
<string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string>
- <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"Čtení historie a záložek prohlížeče"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky prohlížeče."</string>
- <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Zapisovat historii a záložky prohlížeče"</string>
- <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data prohlížeče."</string>
+ <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"čtení historie a záložek Prohlížeče"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky Prohlížeče."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zápis do historie a záložek Prohlížeče"</string>
+ <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data Prohlížeče."</string>
<string name="save_password_message" msgid="767344687139195790">"Chcete, aby si prohlížeč zapamatoval toto heslo?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Nyní ne"</string>
<string name="save_password_remember" msgid="6491879678996749466">"Zapamatovat"</string>
@@ -630,7 +630,7 @@
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Přehrávání pomocí rozhraní Bluetooth"</string>
<string name="volume_call" msgid="3941680041282788711">"Hlasitost hovoru"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"Hlasitost příchozích hovorů při připojení Bluetooth"</string>
- <string name="volume_alarm" msgid="1985191616042689100">"Hlasitost upozornění a budíku"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Hlasitost budíku"</string>
<string name="volume_notification" msgid="2422265656744276715">"Hlasitost oznámení"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Hlasitost"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Výchozí vyzváněcí tón"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b8bfdf6..29e3818 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -455,7 +455,7 @@
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ユーザー名またはパスワードが正しくありません。"</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>
+ <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_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d0126ab..fd677ce 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -426,7 +426,7 @@
<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">"按下 [選單] 解鎖或撥打緊急電話。"</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>
@@ -484,7 +484,7 @@
<string name="open_permission_deny" msgid="5661861460947222274">"您沒有開啟此頁的權限。"</string>
<string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
- <string name="prepend_shortcut_label" msgid="2572214461676015642">"[選單] +"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"[Menu] +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"空白鍵"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"輸入"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"刪除"</string>
diff --git a/keystore/MODULE_LICENSE_APACHE2 b/keystore/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/keystore/MODULE_LICENSE_APACHE2
diff --git a/keystore/NOTICE b/keystore/NOTICE
new file mode 100644
index 0000000..64aaa8d
--- /dev/null
+++ b/keystore/NOTICE
@@ -0,0 +1,190 @@
+
+ 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.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 99d7723..1bab717 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -26,16 +26,25 @@
#include <android_runtime/AndroidRuntime.h>
#include <tts/TtsEngine.h>
#include <media/AudioTrack.h>
+#include <math.h>
#include <dlfcn.h>
#define DEFAULT_TTS_RATE 16000
#define DEFAULT_TTS_FORMAT AudioSystem::PCM_16_BIT
#define DEFAULT_TTS_NB_CHANNELS 1
-#define DEFAULT_TTS_BUFFERSIZE 1024
+#define DEFAULT_TTS_BUFFERSIZE 2048
// TODO use the TTS stream type when available
#define DEFAULT_TTS_STREAM_TYPE AudioSystem::MUSIC
+// EQ + BOOST parameters
+#define FILTER_LOWSHELF_ATTENUATION -18.0f // in dB
+#define FILTER_TRANSITION_FREQ 1100.0f // in Hz
+#define FILTER_SHELF_SLOPE 1.0f // Q
+#define FILTER_GAIN 6.0f // linear gain
+// 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
@@ -57,6 +66,79 @@
};
// ----------------------------------------------------------------------------
+// EQ data
+double amp;
+double w;
+double sinw;
+double cosw;
+double beta;
+double a0, a1, a2, b0, b1, b2;
+double m_fa, m_fb, m_fc, m_fd, m_fe;
+double x0; // x[n]
+double x1; // x[n-1]
+double x2; // x[n-2]
+double out0;// y[n]
+double out1;// y[n-1]
+double out2;// y[n-2]
+
+void initializeEQ() {
+
+ amp = float(pow(10.0, FILTER_LOWSHELF_ATTENUATION / 40.0));
+ w = 2.0 * M_PI * (FILTER_TRANSITION_FREQ / DEFAULT_TTS_RATE);
+ sinw = float(sin(w));
+ cosw = float(cos(w));
+ beta = float(sqrt(amp)/FILTER_SHELF_SLOPE);
+
+ // initialize low-shelf parameters
+ b0 = amp * ((amp+1.0F) - ((amp-1.0F)*cosw) + (beta*sinw));
+ b1 = 2.0F * amp * ((amp-1.0F) - ((amp+1.0F)*cosw));
+ b2 = amp * ((amp+1.0F) - ((amp-1.0F)*cosw) - (beta*sinw));
+ a0 = (amp+1.0F) + ((amp-1.0F)*cosw) + (beta*sinw);
+ 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_fd = a1/a0;
+ m_fe = a2/a0;
+}
+
+void initializeFilter() {
+ x0 = 0.0f;
+ x1 = 0.0f;
+ x2 = 0.0f;
+ out0 = 0.0f;
+ out1 = 0.0f;
+ out2 = 0.0f;
+}
+
+void applyFilter(int16_t* buffer, size_t sampleCount) {
+
+ for (size_t i=0 ; i<sampleCount ; i++) {
+
+ x0 = (double) buffer[i];
+
+ out0 = (m_fa*x0) + (m_fb*x1) + (m_fc*x2) + (m_fd*out1) + (m_fe*out2);
+
+ x2 = x1;
+ x1 = x0;
+
+ out2 = out1;
+ out1 = out0;
+
+ if (out0 > 32767.0f) {
+ buffer[i] = 32767;
+ } else if (out0 < -32768.0f) {
+ buffer[i] = -32768;
+ } else {
+ buffer[i] = (int16_t) out0;
+ }
+ }
+}
+
+
+// ----------------------------------------------------------------------------
static fields_t javaTTSFields;
// TODO move to synth member once we have multiple simultaneous engines running
@@ -198,12 +280,13 @@
if (wav == NULL) {
delete pForAfter;
- LOGI("Null: speech has completed");
+ LOGV("Null: speech has completed");
}
if (bufferSize > 0) {
prepAudioTrack(pJniData, pForAfter->streamType, rate, format, channel);
if (pJniData->mAudioOut) {
+ applyFilter((int16_t*)wav, bufferSize/2);
pJniData->mAudioOut->write(wav, bufferSize);
memset(wav, 0, bufferSize);
//LOGV("AudioTrack wrote: %d bytes", bufferSize);
@@ -212,13 +295,14 @@
}
}
} else if (pForAfter->usageMode == USAGEMODE_WRITE_TO_FILE) {
- LOGV("Save to file");
+ //LOGV("Save to file");
if (wav == NULL) {
delete pForAfter;
LOGV("Null: speech has completed");
return TTS_CALLBACK_HALT;
}
if (bufferSize > 0){
+ applyFilter((int16_t*)wav, bufferSize/2);
fwrite(wav, 1, bufferSize, pForAfter->outputFile);
memset(wav, 0, bufferSize);
}
@@ -289,6 +373,8 @@
env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData,
(int)pJniStorage);
+ initializeEQ();
+
env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString);
}
@@ -479,6 +565,8 @@
return result;
}
+ initializeFilter();
+
Mutex::Autolock l(engineMutex);
// Retrieve audio parameters before writing the file header
@@ -583,6 +671,8 @@
return result;
}
+ initializeFilter();
+
Mutex::Autolock l(engineMutex);
SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
diff --git a/preloaded-classes b/preloaded-classes
index 7d1f960..69c596c 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1,119 +1,66 @@
# Classes which are preloaded by com.android.internal.os.ZygoteInit.
-# Automatically generated by /frameworks/base/tools/preload.
-# percent=75, weight=500, bucket_size=5
+# Automatically generated by frameworks/base/tools/preload/WritePreloadedClassFile.java.
+# MIN_LOAD_TIME_MICROS=1250
SQLite.Blob
SQLite.Database
SQLite.FunctionContext
SQLite.Stmt
SQLite.Vm
android.R$styleable
-android.accounts.AccountMonitor
-android.accounts.AccountMonitor$AccountUpdater
-android.accounts.AccountMonitorListener
-android.accounts.AccountsServiceConstants
-android.accounts.IAccountsService
android.accounts.IAccountsService$Stub
android.app.Activity
-android.app.Activity$ManagedCursor
android.app.ActivityGroup
+android.app.ActivityManager
+android.app.ActivityManager$MemoryInfo
android.app.ActivityManagerNative
android.app.ActivityManagerProxy
android.app.ActivityThread
-android.app.ActivityThread$ActivityRecord
-android.app.ActivityThread$AppBindData
android.app.ActivityThread$ApplicationThread
-android.app.ActivityThread$BindServiceData
-android.app.ActivityThread$ContextCleanupInfo
-android.app.ActivityThread$CreateServiceData
-android.app.ActivityThread$GcIdler
android.app.ActivityThread$H
-android.app.ActivityThread$Idler
-android.app.ActivityThread$NewIntentData
-android.app.ActivityThread$PackageInfo
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher$InnerReceiver
-android.app.ActivityThread$PackageInfo$ServiceDispatcher
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$ConnectionInfo
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$DeathMonitor
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$InnerConnection
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$RunConnection
-android.app.ActivityThread$ProviderRecord
-android.app.ActivityThread$ProviderRefCount
-android.app.ActivityThread$ReceiverData
-android.app.ActivityThread$ResourcesKey
-android.app.ActivityThread$ResultData
-android.app.ActivityThread$ServiceArgsData
-android.app.ActivityThread$StopInfo
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.ApplicationContext$WallpaperCallback
android.app.ApplicationThreadNative
+android.app.DatePickerDialog
android.app.Dialog
-android.app.Dialog$1
-android.app.Dialog$ListenersHandler
android.app.ExpandableListActivity
android.app.IActivityManager
android.app.IActivityManager$ContentProviderHolder
-android.app.IActivityManager$ContentProviderHolder$1
-android.app.IAlarmManager
android.app.IAlarmManager$Stub
-android.app.IAlarmManager$Stub$Proxy
-android.app.IApplicationThread
-android.app.IInstrumentationWatcher
-android.app.IInstrumentationWatcher$Stub
-android.app.INotificationManager
android.app.INotificationManager$Stub
-android.app.INotificationManager$Stub$Proxy
-android.app.ISearchManager
android.app.ISearchManager$Stub
-android.app.ISearchManager$Stub$Proxy
-android.app.ISearchManagerCallback
android.app.ISearchManagerCallback$Stub
-android.app.IServiceConnection
-android.app.IServiceConnection$Stub
-android.app.ITransientNotification
+android.app.IStatusBar$Stub
android.app.ITransientNotification$Stub
+android.app.IWallpaperService$Stub
+android.app.IWallpaperServiceCallback$Stub
android.app.Instrumentation
-android.app.IntentReceiverLeaked
+android.app.IntentService
android.app.ListActivity
-android.app.ListActivity$1
-android.app.ListActivity$2
android.app.LocalActivityManager
-android.app.LocalActivityManager$LocalActivityRecord
android.app.Notification
-android.app.Notification$1
-android.app.NotificationManager
android.app.PendingIntent
-android.app.PendingIntent$1
android.app.ProgressDialog
-android.app.ReceiverRestrictedContext
android.app.ResultInfo
-android.app.ResultInfo$1
android.app.SearchManager$SearchManagerCallback
-android.app.SearchManager$SearchManagerCallback$1
-android.app.SearchManager$SearchManagerCallback$2
android.app.Service
-android.app.ServiceConnectionLeaked
+android.app.StatusBarManager
android.app.TabActivity
+android.app.TimePickerDialog
+android.appwidget.AppWidgetHost
android.appwidget.AppWidgetHostView
android.appwidget.AppWidgetManager
android.appwidget.AppWidgetProvider
+android.appwidget.AppWidgetProviderInfo
android.backup.BackupDataInput
android.backup.BackupDataInput$EntityHeader
android.backup.BackupDataOutput
android.backup.BackupHelperDispatcher
android.backup.BackupHelperDispatcher$Header
android.backup.FileBackupHelperBase
-android.bluetooth.BluetoothA2dp
android.bluetooth.BluetoothAudioGateway
android.bluetooth.BluetoothDevice
android.bluetooth.Database
@@ -125,89 +72,44 @@
android.bluetooth.IBluetoothDevice$Stub$Proxy
android.bluetooth.RfcommSocket
android.bluetooth.ScoSocket
-android.content.AsyncQueryHandler
-android.content.AsyncQueryHandler$WorkerArgs
-android.content.AsyncQueryHandler$WorkerHandler
-android.content.BroadcastReceiver
-android.content.ComponentCallbacks
+android.content.AbstractSyncableContentProvider
+android.content.AbstractTableMerger
android.content.ComponentName
-android.content.ComponentName$1
-android.content.ContentProvider
android.content.ContentProvider$Transport
-android.content.ContentProviderNative
-android.content.ContentProviderProxy
-android.content.ContentQueryMap
-android.content.ContentQueryMap$1
android.content.ContentResolver
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
-android.content.ContentUris
android.content.ContentValues
-android.content.ContentValues$1
android.content.Context
android.content.ContextWrapper
-android.content.DialogInterface
-android.content.DialogInterface$OnCancelListener
-android.content.DialogInterface$OnClickListener
-android.content.DialogInterface$OnDismissListener
-android.content.DialogInterface$OnKeyListener
android.content.DialogInterface$OnMultiChoiceClickListener
-android.content.IContentProvider
-android.content.IContentService
android.content.IContentService$Stub
-android.content.IContentService$Stub$Proxy
-android.content.IIntentReceiver
-android.content.IIntentReceiver$Stub
-android.content.IIntentSender
-android.content.IIntentSender$Stub
-android.content.IIntentSender$Stub$Proxy
-android.content.ISyncAdapter
android.content.ISyncAdapter$Stub
android.content.Intent
-android.content.Intent$1
+android.content.Intent$ShortcutIconResource
android.content.IntentFilter
-android.content.IntentFilter$1
-android.content.SearchRecentSuggestionsProvider
-android.content.SearchRecentSuggestionsProvider$DatabaseHelper
-android.content.ServiceConnection
-android.content.SharedPreferences
-android.content.SharedPreferences$Editor
-android.content.SharedPreferences$OnSharedPreferenceChangeListener
-android.content.SyncAdapter
android.content.SyncAdapter$Transport
-android.content.SyncContext
android.content.SyncResult
+android.content.SyncStateContentProviderHelper
android.content.SyncStats
+android.content.SyncableContentProvider
+android.content.TempProviderSyncAdapter
android.content.UriMatcher
android.content.pm.ActivityInfo
-android.content.pm.ActivityInfo$1
android.content.pm.ApplicationInfo
-android.content.pm.ApplicationInfo$1
-android.content.pm.ComponentInfo
android.content.pm.ConfigurationInfo
-android.content.pm.ConfigurationInfo$1
+android.content.pm.IPackageDataObserver$Stub
android.content.pm.IPackageDeleteObserver$Stub
-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.InstrumentationInfo$1
android.content.pm.PackageInfo
-android.content.pm.PackageInfo$1
-android.content.pm.PackageItemInfo
android.content.pm.PackageManager
+android.content.pm.PackageStats
android.content.pm.PathPermission
-android.content.pm.PathPermission$1
android.content.pm.PermissionInfo
-android.content.pm.PermissionInfo$1
-android.content.pm.ProviderInfo
-android.content.pm.ProviderInfo$1
android.content.pm.ResolveInfo
-android.content.pm.ResolveInfo$1
-android.content.pm.ServiceInfo
-android.content.pm.ServiceInfo$1
android.content.pm.Signature
-android.content.pm.Signature$1
android.content.res.AssetFileDescriptor
android.content.res.AssetFileDescriptor$1
android.content.res.AssetManager
@@ -216,65 +118,38 @@
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.PluralRules$en
android.content.res.Resources
android.content.res.Resources$1
-android.content.res.Resources$Theme
android.content.res.StringBlock
-android.content.res.StringBlock$StyleIDs
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
-android.database.ContentObserver$NotificationRunnable
-android.database.ContentObserver$Transport
-android.database.CrossProcessCursor
-android.database.Cursor
+android.database.CursorJoiner$Result
android.database.CursorToBulkCursorAdaptor
-android.database.CursorToBulkCursorAdaptor$ContentObserverProxy
android.database.CursorWindow
android.database.CursorWindow$1
android.database.CursorWrapper
-android.database.DataSetObservable
-android.database.DataSetObserver
android.database.DatabaseUtils
-android.database.DatabaseUtils$InsertHelper
-android.database.IBulkCursor
-android.database.IContentObserver
-android.database.IContentObserver$Stub
-android.database.IContentObserver$Stub$Proxy
android.database.MatrixCursor
-android.database.Observable
-android.database.SQLException
+android.database.MergeCursor
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteCursor
-android.database.sqlite.SQLiteCursorDriver
android.database.sqlite.SQLiteDatabase
-android.database.sqlite.SQLiteDatabase$CursorFactory
+android.database.sqlite.SQLiteDatabase$ConflictAlgorithm
android.database.sqlite.SQLiteDebug
android.database.sqlite.SQLiteDebug$PagerStats
android.database.sqlite.SQLiteDirectCursorDriver
-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
@@ -294,7 +169,6 @@
android.graphics.BlurMaskFilter
android.graphics.Camera
android.graphics.Canvas
-android.graphics.Canvas$EdgeType
android.graphics.Color
android.graphics.ColorFilter
android.graphics.ColorMatrixColorFilter
@@ -311,7 +185,6 @@
android.graphics.LinearGradient
android.graphics.MaskFilter
android.graphics.Matrix
-android.graphics.Matrix$ScaleToFit
android.graphics.Movie
android.graphics.NinePatch
android.graphics.Paint
@@ -323,7 +196,6 @@
android.graphics.Paint$Style
android.graphics.PaintFlagsDrawFilter
android.graphics.Path
-android.graphics.Path$Direction
android.graphics.Path$FillType
android.graphics.PathDashPathEffect
android.graphics.PathEffect
@@ -350,7 +222,6 @@
android.graphics.Shader$TileMode
android.graphics.SumPathEffect
android.graphics.SweepGradient
-android.graphics.TemporaryBuffer
android.graphics.Typeface
android.graphics.Xfermode
android.graphics.drawable.Animatable
@@ -370,7 +241,6 @@
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
@@ -379,55 +249,38 @@
android.graphics.drawable.NinePatchDrawable
android.graphics.drawable.NinePatchDrawable$NinePatchState
android.graphics.drawable.PaintDrawable
+android.graphics.drawable.RotateDrawable
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.graphics.drawable.shapes.Shape
android.hardware.Camera
-android.hardware.ISensorService
android.hardware.ISensorService$Stub
-android.hardware.ISensorService$Stub$Proxy
-android.hardware.Sensor
-android.hardware.SensorEvent
-android.hardware.SensorEventListener
-android.hardware.SensorListener
android.hardware.SensorManager
-android.hardware.SensorManager$1
-android.hardware.SensorManager$LegacyListener
-android.hardware.SensorManager$ListenerDelegate
-android.hardware.SensorManager$ListenerDelegate$1
-android.hardware.SensorManager$LmsFilter
-android.hardware.SensorManager$SensorThread
-android.hardware.SensorManager$SensorThread$SensorThreadRunnable
+android.inputmethodservice.AbstractInputMethodService
+android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodSessionImpl
+android.inputmethodservice.ExtractButton
android.inputmethodservice.ExtractEditText
+android.inputmethodservice.IInputMethodSessionWrapper
+android.inputmethodservice.IInputMethodSessionWrapper$InputMethodEventCallbackWrapper
+android.inputmethodservice.IInputMethodWrapper
android.inputmethodservice.InputMethodService
+android.inputmethodservice.Keyboard
+android.inputmethodservice.Keyboard$Key
android.inputmethodservice.KeyboardView
+android.inputmethodservice.KeyboardView$2
android.location.Address
-android.location.Address$1
-android.location.Geocoder
-android.location.GpsSatellite
-android.location.GpsStatus
-android.location.GpsStatus$1
-android.location.ILocationListener
-android.location.ILocationListener$Stub
-android.location.ILocationManager
+android.location.Criteria
android.location.ILocationManager$Stub
android.location.ILocationManager$Stub$Proxy
android.location.ILocationProvider
android.location.ILocationProvider$Stub
android.location.Location
-android.location.Location$1
-android.location.LocationListener
android.location.LocationManager
android.location.LocationManager$ListenerTransport
-android.location.LocationManager$ListenerTransport$1
-android.location.LocationProvider
-android.media.AmrInputStream
+android.location.LocationManager$LpPowerComparator
android.media.AudioFormat
android.media.AudioManager
android.media.AudioRecord
@@ -435,70 +288,56 @@
android.media.AudioTrack
android.media.ExifInterface
android.media.FaceDetector
-android.media.IAudioService
+android.media.FaceDetector$Face
android.media.IAudioService$Stub
android.media.IAudioService$Stub$Proxy
android.media.JetPlayer
android.media.MediaMetadataRetriever
android.media.MediaPlayer
-android.media.MediaPlayer$EventHandler
-android.media.MediaPlayer$OnBufferingUpdateListener
-android.media.MediaPlayer$OnCompletionListener
-android.media.MediaPlayer$OnErrorListener
-android.media.MediaPlayer$OnPreparedListener
android.media.MediaRecorder
android.media.MediaScanner
-android.media.ResampleInputStream
+android.media.MediaScanner$MyMediaScannerClient
+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
android.net.IConnectivityManager$Stub
-android.net.IConnectivityManager$Stub$Proxy
android.net.LocalServerSocket
android.net.LocalSocket
+android.net.LocalSocketAddress$Namespace
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
android.net.NetworkConnectivityListener
-android.net.NetworkConnectivityListener$ConnectivityBroadcastReceiver
-android.net.NetworkConnectivityListener$State
android.net.NetworkInfo
-android.net.NetworkInfo$1
android.net.NetworkInfo$DetailedState
-android.net.NetworkInfo$State
android.net.NetworkUtils
android.net.Uri
-android.net.Uri$1
-android.net.Uri$AbstractHierarchicalUri
-android.net.Uri$AbstractPart
-android.net.Uri$Builder
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$PathSegmentsBuilder
android.net.Uri$StringUri
android.net.WebAddress
android.net.http.AndroidHttpClient
-android.net.http.AndroidHttpClient$1
android.net.http.AndroidHttpClient$2
-android.net.http.AndroidHttpClient$CurlLogger
-android.net.http.AndroidHttpClient$LoggingConfiguration
android.net.http.CertificateChainValidator
+android.net.http.Connection
+android.net.http.DomainNameChecker
android.net.http.EventHandler
android.net.http.Headers
-android.net.http.Headers$HeaderCallback
android.net.http.HttpsConnection
+android.net.http.Request
+android.net.http.RequestQueue
+android.net.http.SslCertificate
android.net.vpn.IVpnService$Stub
+android.net.vpn.PptpProfile
android.net.vpn.VpnManager
+android.net.vpn.VpnProfile
+android.net.vpn.VpnState
android.net.vpn.VpnType
-android.net.wifi.IWifiManager
android.net.wifi.IWifiManager$Stub
android.net.wifi.IWifiManager$Stub$Proxy
android.net.wifi.WifiManager
@@ -507,6 +346,7 @@
android.opengl.GLES10Ext
android.opengl.GLES11
android.opengl.GLES11Ext
+android.opengl.GLU
android.opengl.GLUtils
android.opengl.Matrix
android.opengl.Visibility
@@ -516,7 +356,7 @@
android.os.Build
android.os.Build$VERSION
android.os.Bundle
-android.os.Bundle$1
+android.os.DeadObjectException
android.os.Debug
android.os.Debug$MemoryInfo
android.os.Environment
@@ -525,126 +365,111 @@
android.os.FileUtils
android.os.FileUtils$FileStatus
android.os.Handler
-android.os.HandlerThread
android.os.Hardware
android.os.IBinder
-android.os.IBinder$DeathRecipient
-android.os.ICheckinService
android.os.ICheckinService$Stub
-android.os.ICheckinService$Stub$Proxy
-android.os.IHardwareService
android.os.IHardwareService$Stub
-android.os.IHardwareService$Stub$Proxy
android.os.IInterface
-android.os.IMessenger
-android.os.IPowerManager
+android.os.IMountService$Stub
+android.os.IParentalControlCallback$Stub
android.os.IPowerManager$Stub
-android.os.IPowerManager$Stub$Proxy
-android.os.IServiceManager
android.os.Looper
android.os.MemoryFile
android.os.Message
-android.os.Message$1
-android.os.MessageQueue
-android.os.MessageQueue$IdleHandler
android.os.NetStat
android.os.Parcel
android.os.Parcel$1
android.os.ParcelFileDescriptor
android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$AutoCloseInputStream
android.os.Parcelable
android.os.Parcelable$Creator
android.os.PatternMatcher
-android.os.PatternMatcher$1
android.os.Power
-android.os.PowerManager
-android.os.PowerManager$WakeLock
-android.os.PowerManager$WakeLock$1
android.os.Process
-android.os.RemoteException
-android.os.ServiceManager
-android.os.ServiceManagerNative
-android.os.ServiceManagerProxy
+android.os.ResultReceiver
android.os.StatFs
android.os.SystemClock
android.os.SystemProperties
android.os.UEventObserver
-android.os.Vibrator
android.pim.EventRecurrence
android.preference.CheckBoxPreference
+android.preference.CheckBoxPreference$SavedState
android.preference.DialogPreference
android.preference.EditTextPreference
-android.preference.GenericInflater
-android.preference.GenericInflater$Parent
android.preference.ListPreference
-android.preference.ListPreference$1
-android.preference.OnDependencyChangeListener
+android.preference.ListPreference$SavedState
android.preference.Preference
-android.preference.Preference$BaseSavedState
-android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeInternalListener
-android.preference.Preference$OnPreferenceChangeListener
-android.preference.Preference$OnPreferenceClickListener
android.preference.PreferenceActivity
-android.preference.PreferenceActivity$1
-android.preference.PreferenceCategory
android.preference.PreferenceGroup
android.preference.PreferenceGroupAdapter
-android.preference.PreferenceGroupAdapter$1
android.preference.PreferenceInflater
android.preference.PreferenceManager
-android.preference.PreferenceManager$OnActivityDestroyListener
-android.preference.PreferenceManager$OnActivityResultListener
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.preference.PreferenceScreen
android.preference.RingtonePreference
-android.provider.BaseColumns
+android.preference.VolumePreference
+android.preference.VolumePreference$SeekBarVolumizer
android.provider.Browser
-android.provider.Checkin
+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.CallLog$Calls
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.Contacts$ContactMethodsColumns
android.provider.Contacts$People
-android.provider.Contacts$PeopleColumns
android.provider.Contacts$Phones
-android.provider.Contacts$PhonesColumns
-android.provider.Contacts$PresenceColumns
+android.provider.Contacts$Presence
+android.provider.Contacts$Settings
android.provider.Downloads
android.provider.Gmail
+android.provider.Gmail$AttachmentOrigin
+android.provider.Gmail$AttachmentRendition
+android.provider.Gmail$ConversationCursor
+android.provider.Gmail$CursorStatus
android.provider.Gmail$LabelMap
+android.provider.Gmail$MessageCursor
android.provider.Gmail$PersonalLevel
android.provider.Gmail$Settings
-android.provider.Im$CommonPresenceColumns
+android.provider.Im$Account
+android.provider.Im$Avatars
+android.provider.Im$Chats
+android.provider.Im$Contacts
+android.provider.Im$LastRmqId
+android.provider.Im$Messages
+android.provider.Im$OutgoingRmq
+android.provider.Im$Presence
android.provider.Im$Provider
-android.provider.MediaStore$Audio$AudioColumns
+android.provider.Im$ProviderSettings
+android.provider.MediaStore
+android.provider.MediaStore$Audio$Albums
+android.provider.MediaStore$Audio$Artists
+android.provider.MediaStore$Audio$Artists$Albums
android.provider.MediaStore$Audio$Media
+android.provider.MediaStore$Audio$Playlists
android.provider.MediaStore$Images$Media
-android.provider.MediaStore$MediaColumns
+android.provider.MediaStore$Images$Thumbnails
android.provider.SearchRecentSuggestions
android.provider.Settings$Gservices
-android.provider.Settings$NameValueCache
-android.provider.Settings$NameValueTable
android.provider.Settings$Secure
android.provider.Settings$System
-android.provider.SubscribedFeeds$FeedColumns
android.provider.SubscribedFeeds$Feeds
-android.provider.SyncConstValue
+android.provider.Telephony$Carriers
android.provider.Telephony$Mms
android.provider.Telephony$MmsSms
android.provider.Telephony$MmsSms$PendingMessages
+android.provider.Telephony$Sms
+android.provider.Telephony$Sms$Conversations
android.provider.Telephony$Threads
+android.provider.UserDictionary
android.provider.UserDictionary$Words
-android.sax.Children
-android.sax.Children$Child
-android.sax.Element
-android.sax.EndTextElementListener
android.sax.RootElement
android.sax.RootElement$Handler
-android.sax.StartElementListener
android.security.Keystore
android.security.Keystore$FileKeystore
android.security.Md5MessageDigest
@@ -656,681 +481,324 @@
android.server.BluetoothEventLoop
android.server.data.BuildData
android.server.data.CrashData
-android.server.data.StackTraceElementData
android.server.data.ThrowableData
android.server.search.SearchableInfo
-android.server.search.SearchableInfo$1
+android.server.search.Searchables
+android.speech.IRecognitionListener$Stub
android.speech.IRecognitionService$Stub
+android.speech.RecognitionResult
+android.speech.RecognitionServiceUtil
+android.speech.srec.MicrophoneInputStream
android.speech.srec.Recognizer
android.speech.tts.ITts$Stub
android.speech.tts.ITts$Stub$Proxy
android.speech.tts.TextToSpeech
-android.telephony.CellLocation
android.telephony.PhoneNumberUtils
-android.telephony.PhoneStateListener
android.telephony.PhoneStateListener$1
-android.telephony.PhoneStateListener$2
android.telephony.ServiceState
-android.telephony.ServiceState$1
android.telephony.SignalStrength
+android.telephony.SmsMessage
android.telephony.TelephonyManager
-android.telephony.gsm.GsmCellLocation
android.text.AndroidCharacter
android.text.Annotation
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.GetChars
-android.text.GraphicsOperations
+android.text.Html
android.text.Html$HtmlParser
+android.text.HtmlToSpannedConverter
android.text.IClipboard$Stub
-android.text.InputFilter
-android.text.InputType
android.text.Layout
-android.text.Layout$Alignment
-android.text.Layout$Directions
-android.text.Layout$Ellipsizer
-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$StringSplitter
-android.text.TextUtils$TruncateAt
-android.text.TextWatcher
-android.text.format.DateFormat
android.text.format.DateUtils
android.text.format.Formatter
android.text.format.Time
android.text.method.ArrowKeyMovementMethod
android.text.method.BaseKeyListener
-android.text.method.KeyListener
+android.text.method.DialerKeyListener
+android.text.method.DigitsKeyListener
+android.text.method.LinkMovementMethod
android.text.method.MetaKeyKeyListener
-android.text.method.MovementMethod
-android.text.method.NumberKeyListener
-android.text.method.PasswordTransformationMethod
-android.text.method.PasswordTransformationMethod$PasswordCharSequence
-android.text.method.PasswordTransformationMethod$ViewReference
-android.text.method.PasswordTransformationMethod$Visible
android.text.method.QwertyKeyListener
-android.text.method.QwertyKeyListener$Replaced
-android.text.method.ReplacementTransformationMethod
-android.text.method.ReplacementTransformationMethod$ReplacementCharSequence
android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
android.text.method.SingleLineTransformationMethod
android.text.method.TextKeyListener
-android.text.method.TextKeyListener$Capitalize
-android.text.method.TextKeyListener$SettingsObserver
-android.text.method.Touch
-android.text.method.Touch$DragState
-android.text.method.TransformationMethod
-android.text.style.AlignmentSpan
-android.text.style.CharacterStyle
-android.text.style.ClickableSpan
-android.text.style.ForegroundColorSpan
-android.text.style.LeadingMarginSpan
-android.text.style.LineBackgroundSpan
-android.text.style.LineHeightSpan
+android.text.style.BulletSpan
+android.text.style.ImageSpan
android.text.style.MetricAffectingSpan
-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$2
-android.text.util.Linkify$3
-android.text.util.Linkify$4
-android.text.util.Linkify$MatchFilter
-android.text.util.Linkify$TransformFilter
android.text.util.Regex
android.text.util.Rfc822Validator
-android.util.AndroidException
-android.util.AndroidRuntimeException
android.util.AttributeSet
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.Pool
-android.util.Poolable
-android.util.PoolableManager
-android.util.Pools
-android.util.Printer
android.util.SparseArray
-android.util.SparseBooleanArray
-android.util.SparseIntArray
android.util.StateSet
-android.util.SynchronizedPool
android.util.TypedValue
android.util.Xml
+android.util.Xml$Encoding
android.view.AbsSavedState
-android.view.AbsSavedState$1
-android.view.AbsSavedState$2
-android.view.ContextMenu
-android.view.ContextMenu$ContextMenuInfo
android.view.ContextThemeWrapper
android.view.Display
-android.view.Display$CompatibleDisplay
android.view.FocusFinder
-android.view.FocusFinder$1
android.view.GestureDetector
-android.view.GestureDetector$GestureHandler
-android.view.GestureDetector$OnDoubleTapListener
-android.view.GestureDetector$OnGestureListener
android.view.GestureDetector$SimpleOnGestureListener
-android.view.Gravity
-android.view.IRotationWatcher
android.view.IRotationWatcher$Stub
-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.LayoutInflater$Filter
-android.view.Menu
-android.view.MenuInflater
android.view.MenuInflater$MenuState
-android.view.MenuItem
android.view.MotionEvent
-android.view.MotionEvent$1
android.view.Surface
android.view.Surface$1
-android.view.Surface$CompatibleCanvas
-android.view.SurfaceHolder
-android.view.SurfaceHolder$Callback
android.view.SurfaceSession
android.view.SurfaceView
-android.view.SurfaceView$1
-android.view.SurfaceView$2
-android.view.SurfaceView$MyWindow
-android.view.TouchDelegate
android.view.VelocityTracker
-android.view.VelocityTracker$1
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$CheckForLongPress
-android.view.View$MeasureSpec
-android.view.View$OnClickListener
-android.view.View$OnCreateContextMenuListener
-android.view.View$OnFocusChangeListener
-android.view.View$OnKeyListener
-android.view.View$OnLongClickListener
-android.view.View$OnTouchListener
-android.view.View$ScrollabilityCache
-android.view.View$UnsetPressedState
-android.view.ViewConfiguration
android.view.ViewGroup
-android.view.ViewGroup$LayoutParams
-android.view.ViewGroup$MarginLayoutParams
-android.view.ViewGroup$OnHierarchyChangeListener
-android.view.ViewManager
android.view.ViewParent
android.view.ViewRoot
-android.view.ViewRoot$1
-android.view.ViewRoot$InputMethodCallback
-android.view.ViewRoot$RunQueue
-android.view.ViewRoot$RunQueue$HandlerAction
-android.view.ViewRoot$TrackballAxis
-android.view.ViewRoot$W
-android.view.ViewTreeObserver
-android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
-android.view.ViewTreeObserver$OnGlobalLayoutListener
-android.view.ViewTreeObserver$OnPreDrawListener
-android.view.ViewTreeObserver$OnScrollChangedListener
-android.view.ViewTreeObserver$OnTouchModeChangeListener
+android.view.ViewStub
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.AccessibilityEvent$1
-android.view.accessibility.AccessibilityEventSource
-android.view.accessibility.AccessibilityManager
-android.view.accessibility.AccessibilityManager$1
-android.view.accessibility.AccessibilityManager$MyHandler
-android.view.accessibility.IAccessibilityManager
-android.view.accessibility.IAccessibilityManager$Stub
-android.view.accessibility.IAccessibilityManager$Stub$Proxy
-android.view.accessibility.IAccessibilityManagerClient
-android.view.accessibility.IAccessibilityManagerClient$Stub
-android.view.animation.AccelerateDecelerateInterpolator
-android.view.animation.AccelerateInterpolator
-android.view.animation.AlphaAnimation
android.view.animation.Animation
-android.view.animation.Animation$AnimationListener
-android.view.animation.Animation$Description
android.view.animation.AnimationSet
-android.view.animation.AnimationUtils
-android.view.animation.Interpolator
-android.view.animation.LayoutAnimationController
-android.view.animation.ScaleAnimation
-android.view.animation.Transformation
-android.view.animation.TranslateAnimation
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.CompletionInfo
-android.view.inputmethod.CompletionInfo$1
-android.view.inputmethod.ComposingText
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.InputConnection
-android.view.inputmethod.InputConnectionWrapper
+android.view.inputmethod.InputMethodInfo
android.view.inputmethod.InputMethodManager
android.view.inputmethod.InputMethodManager$1
-android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
-android.view.inputmethod.InputMethodManager$H
android.webkit.BrowserFrame
-android.webkit.ByteArrayBuilder
-android.webkit.ByteArrayBuilder$Chunk
+android.webkit.CacheLoader
android.webkit.CacheManager
android.webkit.CallbackProxy
+android.webkit.CallbackProxy$ResultTransport
android.webkit.CookieManager
android.webkit.CookieSyncManager
android.webkit.DataLoader
-android.webkit.FrameLoader
-android.webkit.HttpAuthHandler
+android.webkit.GearsPermissionsManager
android.webkit.HttpDateTime
android.webkit.JWebCoreJavaBridge
android.webkit.LoadListener
-android.webkit.LoadListener$1
android.webkit.MimeTypeMap
-android.webkit.PerfChecker
-android.webkit.SslErrorHandler
-android.webkit.StreamLoader
android.webkit.TextDialog
android.webkit.URLUtil
-android.webkit.WebBackForwardList
-android.webkit.WebHistoryItem
-android.webkit.WebIconDatabase
-android.webkit.WebIconDatabase$EventHandler
-android.webkit.WebIconDatabase$EventHandler$1
+android.webkit.WebIconDatabase$IconListener
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.WebSettings$ZoomDensity
-android.webkit.WebSyncManager
-android.webkit.WebSyncManager$SyncHandler
android.webkit.WebView
-android.webkit.WebView$1
-android.webkit.WebView$2
-android.webkit.WebView$FocusNode
android.webkit.WebView$HitTestResult
-android.webkit.WebView$PrivateHandler
android.webkit.WebViewCore
-android.webkit.WebViewCore$DrawData
-android.webkit.WebViewCore$EventHub
-android.webkit.WebViewCore$EventHub$1
-android.webkit.WebViewCore$FocusData
-android.webkit.WebViewCore$WebCoreThread
-android.webkit.WebViewCore$WebCoreThread$1
android.webkit.WebViewDatabase
+android.webkit.gears.ApacheHttpRequestAndroid
+android.webkit.gears.ApacheHttpRequestAndroid$Buffer
+android.webkit.gears.NativeDialog
android.widget.AbsListView
-android.widget.AbsListView$1
-android.widget.AbsListView$2
android.widget.AbsListView$3
-android.widget.AbsListView$CheckForLongPress
-android.widget.AbsListView$CheckForTap
-android.widget.AbsListView$FlingRunnable
-android.widget.AbsListView$LayoutParams
-android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$PerformClick
-android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$RecyclerListener
android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
-android.widget.AbsListView$WindowRunnnable
android.widget.AbsSeekBar
android.widget.AbsSpinner
-android.widget.AbsSpinner$RecycleBin
android.widget.AbsSpinner$SavedState
-android.widget.AbsSpinner$SavedState$1
android.widget.AbsoluteLayout
-android.widget.Adapter
android.widget.AdapterView
-android.widget.AdapterView$AdapterDataSetObserver
-android.widget.AdapterView$OnItemClickListener
-android.widget.AdapterView$OnItemLongClickListener
-android.widget.AdapterView$OnItemSelectedListener
android.widget.AnalogClock
android.widget.AppSecurityPermissions
+android.widget.AppSecurityPermissions$State
android.widget.ArrayAdapter
android.widget.AutoCompleteTextView
-android.widget.AutoCompleteTextView$1
-android.widget.AutoCompleteTextView$2
-android.widget.AutoCompleteTextView$DropDownItemClickListener
android.widget.AutoCompleteTextView$DropDownListView
-android.widget.AutoCompleteTextView$ListSelectorHider
-android.widget.AutoCompleteTextView$MyWatcher
-android.widget.AutoCompleteTextView$PassThroughClickListener
-android.widget.AutoCompleteTextView$PopupTouchIntercepter
-android.widget.AutoCompleteTextView$Validator
android.widget.BaseAdapter
-android.widget.Button
+android.widget.BaseExpandableListAdapter
android.widget.CheckBox
-android.widget.Checkable
android.widget.CheckedTextView
android.widget.Chronometer
android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
android.widget.CompoundButton$SavedState
-android.widget.CompoundButton$SavedState$1
android.widget.CursorAdapter
-android.widget.CursorAdapter$ChangeObserver
-android.widget.CursorAdapter$MyDataSetObserver
-android.widget.CursorFilter
-android.widget.CursorFilter$CursorFilterClient
android.widget.CursorTreeAdapter
android.widget.DatePicker
android.widget.EditText
android.widget.ExpandableListConnector
+android.widget.ExpandableListConnector$GroupMetadata
android.widget.ExpandableListView
android.widget.FastScroller
-android.widget.Filter
-android.widget.Filter$FilterListener
-android.widget.Filter$FilterResults
-android.widget.Filter$RequestArguments
-android.widget.Filter$RequestHandler
-android.widget.Filter$ResultsHandler
-android.widget.FilterQueryProvider
-android.widget.Filterable
android.widget.FrameLayout
-android.widget.FrameLayout$LayoutParams
android.widget.Gallery
android.widget.GridView
android.widget.HeaderViewListAdapter
-android.widget.ImageButton
android.widget.ImageView
android.widget.ImageView$ScaleType
android.widget.LinearLayout
-android.widget.LinearLayout$LayoutParams
-android.widget.ListAdapter
android.widget.ListView
-android.widget.ListView$ArrowScrollFocusResult
-android.widget.ListView$FixedViewInfo
android.widget.ListView$SavedState
-android.widget.ListView$SavedState$1
android.widget.MediaController
android.widget.MultiAutoCompleteTextView
android.widget.PopupWindow
-android.widget.PopupWindow$1
android.widget.PopupWindow$PopupViewContainer
android.widget.ProgressBar
android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
+android.widget.RadioButton
android.widget.RadioGroup
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$1
-android.widget.RemoteViews$Action
-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.SeekBar$OnSeekBarChangeListener
+android.widget.SimpleAdapter
android.widget.SimpleCursorAdapter
+android.widget.SimpleCursorTreeAdapter
android.widget.SlidingDrawer
android.widget.Spinner
-android.widget.SpinnerAdapter
+android.widget.Spinner$DropDownAdapter
android.widget.TabHost
-android.widget.TabHost$1
-android.widget.TabHost$2
-android.widget.TabHost$ContentStrategy
-android.widget.TabHost$IndicatorStrategy
-android.widget.TabHost$IntentContentStrategy
-android.widget.TabHost$LabelAndIconIndicatorStrategy
-android.widget.TabHost$OnTabChangeListener
-android.widget.TabHost$TabSpec
-android.widget.TabHost$ViewIndicatorStrategy
android.widget.TabWidget
-android.widget.TabWidget$OnTabSelectionChanged
-android.widget.TabWidget$TabClickListener
android.widget.TableLayout
-android.widget.TableLayout$LayoutParams
-android.widget.TableLayout$PassThroughHierarchyChangeListener
android.widget.TableRow
-android.widget.TableRow$ChildrenTracker
-android.widget.TableRow$LayoutParams
android.widget.TextView
-android.widget.TextView$2
-android.widget.TextView$3
-android.widget.TextView$Blink
android.widget.TextView$BufferType
-android.widget.TextView$ChangeWatcher
-android.widget.TextView$CharWrapper
-android.widget.TextView$Drawables
-android.widget.TextView$InputContentType
-android.widget.TextView$InputMethodState
-android.widget.TextView$OnEditorActionListener
+android.widget.TextView$CommitSelectionReceiver
android.widget.TextView$SavedState
-android.widget.TextView$SavedState$1
android.widget.TimePicker
+android.widget.TimePicker$SavedState
android.widget.Toast
android.widget.Toast$TN
-android.widget.Toast$TN$1
-android.widget.Toast$TN$2
+android.widget.TwoLineListItem
android.widget.VideoView
android.widget.ViewAnimator
android.widget.ViewSwitcher
-android.widget.WrapperListAdapter
android.widget.ZoomButton
-android.widget.ZoomButton$1
android.widget.ZoomButtonsController
-android.widget.ZoomButtonsController$1
-android.widget.ZoomButtonsController$2
-android.widget.ZoomButtonsController$3
-android.widget.ZoomButtonsController$4
-android.widget.ZoomButtonsController$Container
-android.widget.ZoomButtonsController$OnZoomListener
android.widget.ZoomControls
com.android.internal.R$drawable
com.android.internal.R$styleable
com.android.internal.app.AlertActivity
com.android.internal.app.AlertController
-com.android.internal.app.AlertController$1
com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$3
-com.android.internal.app.AlertController$ButtonHandler
+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.IAppWidgetService
+com.android.internal.appwidget.IAppWidgetHost$Stub
com.android.internal.appwidget.IAppWidgetService$Stub
-com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
+com.android.internal.database.ArrayListCursor
com.android.internal.database.SortCursor
+com.android.internal.database.SortCursor$1
com.android.internal.graphics.NativeUtils
com.android.internal.location.DummyLocationProvider
com.android.internal.location.GpsLocationProvider
-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.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.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.PhoneWindow$PanelFeatureState$SavedState$1
com.android.internal.policy.impl.PhoneWindowManager
com.android.internal.policy.impl.Policy
-com.android.internal.telephony.BaseCommands
-com.android.internal.telephony.Connection$DisconnectCause
com.android.internal.telephony.GsmAlphabet
-com.android.internal.telephony.IPhoneStateListener
com.android.internal.telephony.IPhoneStateListener$Stub
-com.android.internal.telephony.IPhoneSubInfo
com.android.internal.telephony.IPhoneSubInfo$Stub
-com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
-com.android.internal.telephony.ITelephony
com.android.internal.telephony.ITelephony$Stub
com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephonyRegistry
com.android.internal.telephony.ITelephonyRegistry$Stub
-com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
-com.android.internal.telephony.IccCardApplication$PersoSubState
-com.android.internal.telephony.IccProvider
+com.android.internal.telephony.IccCard$State
com.android.internal.telephony.Phone$State
-com.android.internal.telephony.PhoneBase
-com.android.internal.telephony.PhoneProxy
com.android.internal.telephony.PhoneStateIntentReceiver
-com.android.internal.telephony.RIL
com.android.internal.telephony.SmsMessageBase
-com.android.internal.telephony.gsm.GSMPhone
-com.android.internal.telephony.gsm.GsmDataConnectionTracker
-com.android.internal.telephony.gsm.GsmMmiCode
-com.android.internal.telephony.gsm.MccTable
+com.android.internal.telephony.gsm.GsmSmsAddress
com.android.internal.telephony.gsm.SmsMessage
-com.android.internal.telephony.gsm.stk.CommandDetails
-com.android.internal.telephony.gsm.stk.ResultCode
+com.android.internal.telephony.gsm.SmsMessage$SubmitPdu
com.android.internal.util.ArrayUtils
com.android.internal.util.FastXmlSerializer
-com.android.internal.util.XmlUtils
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.IInputContextCallback
-com.android.internal.view.IInputContextCallback$Stub
-com.android.internal.view.IInputContextCallback$Stub$Proxy
-com.android.internal.view.IInputMethodCallback
-com.android.internal.view.IInputMethodCallback$Stub
-com.android.internal.view.IInputMethodClient
-com.android.internal.view.IInputMethodClient$Stub
-com.android.internal.view.IInputMethodManager
+com.android.internal.view.IInputMethod$Stub
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$InputContextCallback
com.android.internal.view.menu.ExpandedMenuView
com.android.internal.view.menu.IconMenuItemView
com.android.internal.view.menu.IconMenuView
-com.android.internal.view.menu.IconMenuView$1
-com.android.internal.view.menu.IconMenuView$LayoutParams
com.android.internal.view.menu.IconMenuView$SavedState
-com.android.internal.view.menu.IconMenuView$SavedState$1
com.android.internal.view.menu.ListMenuItemView
com.android.internal.view.menu.MenuBuilder
-com.android.internal.view.menu.MenuBuilder$Callback
-com.android.internal.view.menu.MenuBuilder$ItemInvoker
-com.android.internal.view.menu.MenuBuilder$MenuAdapter
-com.android.internal.view.menu.MenuBuilder$MenuType
com.android.internal.view.menu.MenuItemImpl
-com.android.internal.view.menu.MenuView
-com.android.internal.view.menu.MenuView$ItemView
com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.DialogTitle
-com.android.internal.widget.EditableInputConnection
com.android.internal.widget.LockPatternUtils
com.android.internal.widget.NumberPicker
-com.google.android.collect.Lists
-com.google.android.collect.Maps
-com.google.android.collect.Sets
+com.android.internal.widget.NumberPickerButton
+com.android.internal.widget.Smileys
com.google.android.gdata.client.AndroidGDataClient
+com.google.android.gdata.client.AndroidXmlParserFactory
com.google.android.gles_jni.EGLImpl
com.google.android.gles_jni.GLImpl
com.google.android.mms.pdu.PduPersister
com.google.android.mms.util.PduCache
com.google.android.net.GoogleHttpClient
-com.google.android.net.GoogleHttpClient$WrappedLayeredSocketFactory
-com.google.android.net.GoogleHttpClient$WrappedSocketFactory
com.google.android.net.NetworkStatsEntity
-com.google.android.net.SSLClientSessionCacheFactory
com.google.android.net.UrlRules
com.google.android.net.UrlRules$Rule
-com.google.common.Clock
com.google.common.Config
-com.google.common.GenericClock
-com.google.common.I18n
com.google.common.Log
-com.google.common.StaticUtil
-com.google.common.android.AndroidClock
com.google.common.android.AndroidConfig
-com.google.common.android.AndroidConfig$1
-com.google.common.graphics.FontFactory
-com.google.common.graphics.ImageFactory
-com.google.common.graphics.InterpolatedFontFactory
-com.google.common.graphics.android.AndroidFontFactory
-com.google.common.graphics.android.AndroidImageFactory
-com.google.common.io.BaseConnectionFactory
+com.google.common.async.AsyncHttpRequestFactory$AsyncHttpRequestImpl
+com.google.common.graphics.android.AndroidGraphics
com.google.common.io.BaseHttpConnectionFactory
-com.google.common.io.BasePersistentStore
-com.google.common.io.BaseTcpConnectionFactory
-com.google.common.io.ConnectionFactory
-com.google.common.io.GoogleHttpConnection
-com.google.common.io.Gunzipper
-com.google.common.io.Gunzipper$GunzipInterface
-com.google.common.io.HttpConnectionFactory
-com.google.common.io.InMemoryPersistentStore
-com.google.common.io.PersistentStore
-com.google.common.io.PersistentStore$PersistentStoreException
-com.google.common.io.PreferenceStore
-com.google.common.io.TcpConnectionFactory
-com.google.common.io.android.AndroidFixedPersistentStore
+com.google.common.io.IoUtil
com.google.common.io.android.AndroidHttpClient
-com.google.common.io.android.AndroidHttpClient$1
-com.google.common.io.android.AndroidHttpClient$2
-com.google.common.io.android.AndroidHttpClient$CurlLogger
-com.google.common.io.android.AndroidHttpClient$LoggingConfiguration
com.google.common.io.android.AndroidHttpConnectionFactory
-com.google.common.io.android.AndroidHttpConnectionFactory$1
-com.google.common.io.android.AndroidHttpConnectionFactory$AndroidGoogleHttpConnection
com.google.common.io.android.AndroidPersistentStore
-com.google.common.io.android.AndroidTcpConnectionFactory
-com.google.common.io.android.CountingByteChannel$Counter
-com.google.common.io.android.GoogleHttpClient
-com.google.common.io.android.J2SeTcpConnectionFactory
com.google.common.io.protocol.ProtoBuf
com.google.common.io.protocol.ProtoBufType
com.google.common.util.text.TextUtil
-com.google.debug.DebugUtil
+com.google.masf.BlockingByteQueue
com.google.masf.MobileServiceMux
+com.google.masf.protocol.PlainRequest
+com.google.masf.services.EventLogService
com.google.masf.services.LogserviceMessageTypes
com.google.masf.services.resume.WindowResumeService
com.google.wireless.gdata.calendar.client.CalendarClient
+com.google.wireless.gdata.client.GDataServiceClient
com.google.wireless.gdata.contacts.client.ContactsClient
+com.google.wireless.gdata.contacts.parser.xml.XmlContactsGDataParserFactory
com.ibm.icu4jni.charset.CharsetDecoderICU
com.ibm.icu4jni.charset.CharsetEncoderICU
com.ibm.icu4jni.charset.CharsetICU
@@ -1339,23 +807,14 @@
com.ibm.icu4jni.common.ErrorCode
com.ibm.icu4jni.lang.UCharacter
com.ibm.icu4jni.regex.NativeRegEx
-com.ibm.icu4jni.text.CollationAttribute
-com.ibm.icu4jni.text.Collator
com.ibm.icu4jni.text.DecimalFormat
-com.ibm.icu4jni.text.DecimalFormatSymbols
-com.ibm.icu4jni.text.DecimalFormatSymbols$1
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$ISO4Currencies
-com.ibm.icu4jni.util.Resources$ISO4CurrenciesToDigits
-com.ibm.icu4jni.util.Resources$Locale
-dalvik.system.DexFile
dalvik.system.NativeStart
dalvik.system.PathClassLoader
dalvik.system.TouchDex
@@ -1364,53 +823,39 @@
dalvik.system.VMStack
dalvik.system.Zygote
java.beans.PropertyChangeEvent
-java.beans.PropertyChangeListener
java.beans.PropertyChangeSupport
java.io.BufferedInputStream
-java.io.BufferedOutputStream
java.io.BufferedReader
-java.io.ByteArrayInputStream
-java.io.ByteArrayOutputStream
java.io.Closeable
java.io.DataInput
-java.io.DataInputStream
java.io.DataOutput
java.io.DataOutputStream
-java.io.Externalizable
+java.io.EmulatedFieldsForDumping
+java.io.EmulatedFieldsForLoading
java.io.File
java.io.FileDescriptor
java.io.FileInputStream
java.io.FileInputStream$RepositioningLock
-java.io.FileNotFoundException
java.io.FileOutputStream
-java.io.FilterInputStream
java.io.FilterOutputStream
java.io.Flushable
-java.io.IOException
java.io.InputStream
java.io.InputStreamReader
-java.io.InterruptedIOException
java.io.ObjectInput
java.io.ObjectInputStream
java.io.ObjectOutput
java.io.ObjectOutputStream
java.io.ObjectStreamClass
java.io.ObjectStreamConstants
-java.io.ObjectStreamException
java.io.ObjectStreamField
-java.io.ObjectStreamField$1
java.io.OutputStream
java.io.PrintStream
java.io.PrintWriter
+java.io.PushbackReader
java.io.RandomAccessFile
-java.io.RandomAccessFile$RepositionLock
java.io.Reader
java.io.Serializable
-java.io.StreamCorruptedException
-java.io.StringReader
java.io.StringWriter
-java.io.UnsupportedEncodingException
-java.io.Writer
java.lang.AbstractStringBuilder
java.lang.Appendable
java.lang.ArrayIndexOutOfBoundsException
@@ -1423,23 +868,16 @@
java.lang.Class
java.lang.ClassCache
java.lang.ClassCache$EnumComparator
-java.lang.ClassCastException
java.lang.ClassLoader
java.lang.ClassLoader$SystemClassLoader
-java.lang.ClassNotFoundException
-java.lang.CloneNotSupportedException
java.lang.Cloneable
java.lang.Comparable
java.lang.Double
java.lang.Enum
java.lang.Error
java.lang.Exception
-java.lang.ExceptionInInitializerError
java.lang.Float
java.lang.IllegalArgumentException
-java.lang.IllegalStateException
-java.lang.IncompatibleClassChangeError
-java.lang.IndexOutOfBoundsException
java.lang.Integer
java.lang.Integer$valueOfCache
java.lang.InternalError
@@ -1451,9 +889,6 @@
java.lang.Long$valueOfCache
java.lang.Math
java.lang.NoClassDefFoundError
-java.lang.NoSuchFieldException
-java.lang.NoSuchMethodException
-java.lang.NullPointerException
java.lang.Number
java.lang.NumberFormatException
java.lang.Object
@@ -1481,8 +916,6 @@
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
@@ -1510,45 +943,26 @@
java.lang.reflect.Type
java.math.BigDecimal
java.math.BigInt
-java.math.BigInt$Context
java.math.BigInteger
java.math.Multiplication
-java.net.ContentHandler
java.net.DatagramPacket
java.net.HttpURLConnection
java.net.Inet4Address
-java.net.Inet6Address
java.net.InetAddress
-java.net.InetAddress$Cache
-java.net.InetAddress$CacheElement
java.net.InetAddress$WaitReachable
java.net.InetSocketAddress
java.net.JarURLConnection
-java.net.NegativeCache
-java.net.NetPermission
java.net.NetworkInterface
java.net.Proxy
-java.net.Proxy$Type
java.net.ProxySelector
java.net.ProxySelectorImpl
-java.net.ProxySelectorImpl$1
-java.net.ResponseCache
java.net.ServerSocket
java.net.Socket
-java.net.Socket$ConnectLock
-java.net.SocketAddress
java.net.SocketImpl
java.net.SocketOptions
-java.net.SocketTimeoutException
java.net.URI
-java.net.URI$Helper
-java.net.URIEncoderDecoder
-java.net.URISyntaxException
java.net.URL
java.net.URLConnection
-java.net.URLConnection$DefaultContentHandler
-java.net.URLEncoder
-java.net.URLStreamHandler
java.nio.BaseByteBuffer
java.nio.Buffer
java.nio.BufferFactory
@@ -1557,13 +971,18 @@
java.nio.CharArrayBuffer
java.nio.CharBuffer
java.nio.CharSequenceAdapter
+java.nio.CharToByteBufferAdapter
java.nio.DirectByteBuffer
+java.nio.FloatBuffer
+java.nio.FloatToByteBufferAdapter
java.nio.HeapByteBuffer
java.nio.IntToByteBufferAdapter
java.nio.NIOAccess
java.nio.ReadWriteCharArrayBuffer
java.nio.ReadWriteDirectByteBuffer
java.nio.ReadWriteHeapByteBuffer
+java.nio.ReadWriteIntArrayBuffer
+java.nio.ShortToByteBufferAdapter
java.nio.channels.ByteChannel
java.nio.channels.Channel
java.nio.channels.FileChannel
@@ -1581,248 +1000,127 @@
java.nio.charset.CoderResult
java.nio.charset.CodingErrorAction
java.nio.charset.spi.CharsetProvider
-java.security.AccessControlContext
java.security.AccessController
java.security.BasicPermission
-java.security.GeneralSecurityException
java.security.Guard
-java.security.Key
-java.security.KeyFactory
-java.security.KeyFactorySpi
java.security.KeyStore
-java.security.KeyStore$1
-java.security.KeyStoreSpi
java.security.MessageDigest
-java.security.MessageDigestSpi
java.security.Permission
-java.security.Principal
java.security.PrivilegedAction
java.security.PrivilegedExceptionAction
-java.security.ProtectionDomain
java.security.Provider
-java.security.Provider$Service
-java.security.Provider$Service$1
-java.security.PublicKey
java.security.SecureRandom
-java.security.SecureRandomSpi
java.security.Security
-java.security.Security$1
-java.security.Security$SecurityDoor
-java.security.cert.CertPath
-java.security.cert.CertPathParameters
-java.security.cert.CertPathValidator
-java.security.cert.CertPathValidatorResult
-java.security.cert.CertPathValidatorSpi
-java.security.cert.CertSelector
-java.security.cert.Certificate
-java.security.cert.CertificateFactory
-java.security.cert.CertificateFactorySpi
-java.security.cert.PKIXCertPathValidatorResult
+java.security.cert.CertificateParsingException
java.security.cert.PKIXParameters
-java.security.cert.PolicyNode
-java.security.cert.TrustAnchor
java.security.cert.X509CertSelector
java.security.cert.X509Certificate
-java.security.cert.X509Extension
-java.security.interfaces.RSAKey
-java.security.interfaces.RSAPublicKey
-java.security.spec.EncodedKeySpec
-java.security.spec.KeySpec
-java.security.spec.X509EncodedKeySpec
-java.text.AttributedCharacterIterator$Attribute
java.text.Collator
java.text.DateFormat
java.text.DateFormat$Field
-java.text.DateFormatSymbols
java.text.DecimalFormat
-java.text.DecimalFormat$2
java.text.DecimalFormatSymbols
-java.text.FieldPosition
java.text.Format
-java.text.Format$1
-java.text.Format$Field
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.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$SynchronizedCollection
-java.util.Collections$SynchronizedSet
+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.ComparableTimSort
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.Formattable
java.util.Formatter
-java.util.Formatter$FloatUtil
-java.util.Formatter$FormatToken
-java.util.Formatter$ParserStateMachine
-java.util.Formatter$Transformer
java.util.GregorianCalendar
java.util.HashMap
java.util.HashMap$1
java.util.HashMap$1$1
-java.util.HashMap$2
-java.util.HashMap$2$1
java.util.HashMap$Entry
-java.util.HashMap$HashMapEntrySet
-java.util.HashMap$HashMapEntrySet$1
java.util.HashMap$HashMapIterator
java.util.HashSet
java.util.Hashtable
java.util.Hashtable$1
-java.util.Hashtable$2
-java.util.Hashtable$2$1
-java.util.Hashtable$4
-java.util.Hashtable$4$1
java.util.Hashtable$Entry
-java.util.Hashtable$HashEnumerator
-java.util.Hashtable$HashIterator
java.util.IdentityHashMap
java.util.Iterator
-java.util.LinkedHashMap
-java.util.LinkedHashMap$1
-java.util.LinkedHashMap$1$1
-java.util.LinkedHashMap$LinkedHashIterator
-java.util.LinkedHashMap$LinkedHashMapEntry
-java.util.LinkedHashMap$LinkedHashMapEntrySet
-java.util.LinkedHashMap$LinkedHashMapEntrySet$1
java.util.LinkedList
-java.util.LinkedList$Link
-java.util.LinkedList$LinkIterator
java.util.List
-java.util.ListIterator
-java.util.ListResourceBundle
java.util.Locale
-java.util.Locale$1
java.util.Map
java.util.Map$Entry
java.util.MapEntry
java.util.MapEntry$Type
-java.util.Observable
-java.util.Observer
java.util.PriorityQueue
java.util.Properties
java.util.PropertyPermission
-java.util.PropertyResourceBundle
-java.util.Queue
-java.util.Random
java.util.RandomAccess
java.util.ResourceBundle
-java.util.ResourceBundle$1
-java.util.ResourceBundle$MissingBundle
java.util.Scanner
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.Timer
java.util.TreeMap
-java.util.TreeMap$2
-java.util.TreeMap$AbstractMapIterator
-java.util.TreeMap$Entry
-java.util.TreeMap$UnboundedKeyIterator
java.util.TreeSet
java.util.Vector
+java.util.Vector$1
java.util.WeakHashMap
-java.util.WeakHashMap$1
-java.util.WeakHashMap$1$1
-java.util.WeakHashMap$2
-java.util.WeakHashMap$2$1
java.util.WeakHashMap$Entry
-java.util.WeakHashMap$Entry$Type
-java.util.WeakHashMap$HashIterator
java.util.concurrent.AbstractExecutorService
-java.util.concurrent.BlockingQueue
-java.util.concurrent.Callable
+java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.ConcurrentHashMap
+java.util.concurrent.ConcurrentHashMap$Segment
java.util.concurrent.CopyOnWriteArrayList
-java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl
-java.util.concurrent.Executor
-java.util.concurrent.ExecutorService
-java.util.concurrent.Executors
-java.util.concurrent.Executors$DefaultThreadFactory
-java.util.concurrent.Future
-java.util.concurrent.FutureTask
-java.util.concurrent.FutureTask$Sync
+java.util.concurrent.DelayQueue
+java.util.concurrent.Executors$DelegatedExecutorService
+java.util.concurrent.Executors$DelegatedScheduledExecutorService
java.util.concurrent.LinkedBlockingQueue
-java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.RejectedExecutionHandler
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.ThreadFactory
+java.util.concurrent.SynchronousQueue$Node
java.util.concurrent.ThreadPoolExecutor
-java.util.concurrent.ThreadPoolExecutor$AbortPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
java.util.concurrent.TimeUnit
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.Condition
-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.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.logging.LoggingPermission
java.util.regex.MatchResult
java.util.regex.Matcher
java.util.regex.Pattern
@@ -1831,102 +1129,47 @@
java.util.zip.Checksum
java.util.zip.Deflater
java.util.zip.DeflaterOutputStream
-java.util.zip.GZIPInputStream
-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
-java.util.zip.ZipFile$2
-java.util.zip.ZipFile$RAFStream
+javax.crypto.Cipher
+javax.crypto.spec.SecretKeySpec
javax.microedition.khronos.egl.EGL
javax.microedition.khronos.egl.EGL10
+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.SocketFactory
javax.net.ssl.DefaultHostnameVerifier
-javax.net.ssl.HostnameVerifier
javax.net.ssl.HttpsURLConnection
-javax.net.ssl.KeyManager
-javax.net.ssl.KeyManagerFactory
-javax.net.ssl.KeyManagerFactory$1
-javax.net.ssl.KeyManagerFactorySpi
-javax.net.ssl.SSLContextSpi
+javax.net.ssl.SSLContext
+javax.net.ssl.SSLHandshakeException
javax.net.ssl.SSLServerSocket
javax.net.ssl.SSLSession
-javax.net.ssl.SSLSessionContext
javax.net.ssl.SSLSocket
-javax.net.ssl.SSLSocketFactory
-javax.net.ssl.SSLSocketFactory$1
-javax.net.ssl.TrustManager
-javax.net.ssl.TrustManagerFactory
-javax.net.ssl.TrustManagerFactory$1
-javax.net.ssl.TrustManagerFactorySpi
-javax.net.ssl.X509ExtendedKeyManager
-javax.net.ssl.X509KeyManager
-javax.net.ssl.X509TrustManager
-javax.security.auth.x500.X500Principal
-javax.security.cert.Certificate
javax.security.cert.X509Certificate
-javax.security.cert.X509Certificate$1
-javax.security.cert.X509Certificate$2
-javax.xml.parsers.DocumentBuilder
-javax.xml.parsers.DocumentBuilderFactory
junit.framework.Assert
-org.apache.commons.codec.BinaryDecoder
-org.apache.commons.codec.BinaryEncoder
-org.apache.commons.codec.Decoder
-org.apache.commons.codec.Encoder
org.apache.commons.codec.binary.Base64
org.apache.commons.codec.binary.Hex
-org.apache.commons.logging.Log
org.apache.commons.logging.LogFactory
org.apache.commons.logging.impl.Jdk14Logger
-org.apache.commons.logging.impl.WeakHashtable
-org.apache.harmony.archive.util.Util
org.apache.harmony.dalvik.NativeTestTarget
-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.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.http.Header
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConfiguration
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool
+org.apache.harmony.lang.annotation.AnnotationMember$DefaultValues
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$1
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$LimitedInputStream
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.JarURLConnection
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$1
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$CacheEntry
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$JarURLConnectionInputStream
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$LRUComparator
-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.NetUtil
-org.apache.harmony.luni.net.NetUtil$Action
org.apache.harmony.luni.net.PlainSocketImpl
-org.apache.harmony.luni.net.PlainSocketImpl2
-org.apache.harmony.luni.net.SocketImplProvider
-org.apache.harmony.luni.net.SocketInputStream
-org.apache.harmony.luni.net.SocketOutputStream
org.apache.harmony.luni.platform.AdapterManager
org.apache.harmony.luni.platform.Endianness
org.apache.harmony.luni.platform.IAdaptable
@@ -1944,19 +1187,9 @@
org.apache.harmony.luni.platform.Platform
org.apache.harmony.luni.platform.PlatformAddress
org.apache.harmony.luni.platform.PlatformAddressFactory
-org.apache.harmony.luni.util.Base64
org.apache.harmony.luni.util.FloatingPointParser
-org.apache.harmony.luni.util.FloatingPointParser$StringExponentPair
-org.apache.harmony.luni.util.Inet6Util
-org.apache.harmony.luni.util.MsgHelp
-org.apache.harmony.luni.util.MsgHelp$1
org.apache.harmony.luni.util.NumberConverter
org.apache.harmony.luni.util.PriviAction
-org.apache.harmony.luni.util.TwoKeyHashMap
-org.apache.harmony.luni.util.TwoKeyHashMap$Entry
-org.apache.harmony.luni.util.TwoKeyHashMap$EntryIteratorImpl
-org.apache.harmony.luni.util.TwoKeyHashMap$ValueIteratorImpl
-org.apache.harmony.luni.util.TwoKeyHashMap$ValuesCollectionImpl
org.apache.harmony.luni.util.Util
org.apache.harmony.nio.AddressUtil
org.apache.harmony.nio.FileChannelFactory
@@ -1966,508 +1199,160 @@
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.ASN1BitString
-org.apache.harmony.security.asn1.ASN1BitString$ASN1NamedBitList
-org.apache.harmony.security.asn1.ASN1Boolean
-org.apache.harmony.security.asn1.ASN1Choice
-org.apache.harmony.security.asn1.ASN1Constants
-org.apache.harmony.security.asn1.ASN1Constructured
-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.ASN1OctetString
org.apache.harmony.security.asn1.ASN1Oid
-org.apache.harmony.security.asn1.ASN1Oid$1
-org.apache.harmony.security.asn1.ASN1Primitive
org.apache.harmony.security.asn1.ASN1Sequence
-org.apache.harmony.security.asn1.ASN1SequenceOf
-org.apache.harmony.security.asn1.ASN1SetOf
org.apache.harmony.security.asn1.ASN1StringType
-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.ASN1Time
-org.apache.harmony.security.asn1.ASN1Type
-org.apache.harmony.security.asn1.ASN1TypeCollection
-org.apache.harmony.security.asn1.ASN1UTCTime
-org.apache.harmony.security.asn1.ASN1ValueCollection
-org.apache.harmony.security.asn1.BerInputStream
-org.apache.harmony.security.asn1.BerOutputStream
-org.apache.harmony.security.asn1.BitString
org.apache.harmony.security.asn1.DerInputStream
org.apache.harmony.security.asn1.DerOutputStream
-org.apache.harmony.security.asn1.ObjectIdentifier
-org.apache.harmony.security.fortress.Engine
-org.apache.harmony.security.fortress.SecurityAccess
-org.apache.harmony.security.fortress.SecurityUtils
org.apache.harmony.security.fortress.Services
-org.apache.harmony.security.fortress.Services$1
-org.apache.harmony.security.internal.nls.Messages
org.apache.harmony.security.pkcs7.ContentInfo
-org.apache.harmony.security.pkcs7.ContentInfo$1
-org.apache.harmony.security.provider.cert.Cache
org.apache.harmony.security.provider.cert.DRLCertFactory
-org.apache.harmony.security.provider.cert.DRLCertFactory$1
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.cert.X509CertPathImpl$1
-org.apache.harmony.security.provider.cert.X509CertPathImpl$2
-org.apache.harmony.security.provider.cert.X509CertPathImpl$3
-org.apache.harmony.security.provider.crypto.CryptoProvider
-org.apache.harmony.security.provider.crypto.CryptoProvider$1
org.apache.harmony.security.provider.crypto.RandomBitsSupplier
-org.apache.harmony.security.provider.crypto.RandomBitsSupplier$1
-org.apache.harmony.security.provider.crypto.SHA1Impl
org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl
-org.apache.harmony.security.provider.crypto.SHA1_Data
+org.apache.harmony.security.provider.crypto.SHA1_MessageDigestImpl
org.apache.harmony.security.utils.AlgNameMapper
-org.apache.harmony.security.utils.ObjectIdentifier
org.apache.harmony.security.x501.AttributeTypeAndValue
-org.apache.harmony.security.x501.AttributeTypeAndValue$1
-org.apache.harmony.security.x501.AttributeTypeAndValue$2
-org.apache.harmony.security.x501.AttributeTypeAndValueComparator
-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.Certificate$1
-org.apache.harmony.security.x509.DNParser
org.apache.harmony.security.x509.EDIPartyName
-org.apache.harmony.security.x509.EDIPartyName$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.ExtensionValue
org.apache.harmony.security.x509.Extensions
-org.apache.harmony.security.x509.Extensions$1
org.apache.harmony.security.x509.GeneralName
-org.apache.harmony.security.x509.GeneralName$1
org.apache.harmony.security.x509.GeneralNames
-org.apache.harmony.security.x509.GeneralNames$1
org.apache.harmony.security.x509.KeyUsage
org.apache.harmony.security.x509.ORAddress
-org.apache.harmony.security.x509.ORAddress$1
-org.apache.harmony.security.x509.ORAddress$2
org.apache.harmony.security.x509.OtherName
-org.apache.harmony.security.x509.OtherName$1
+org.apache.harmony.security.x509.PolicyQualifierInfo
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.Utils
org.apache.harmony.security.x509.Validity
-org.apache.harmony.security.x509.Validity$1
org.apache.harmony.text.BidiWrapper
org.apache.harmony.xml.ExpatAttributes
org.apache.harmony.xml.ExpatParser
-org.apache.harmony.xml.ExpatParser$ClonedAttributes
-org.apache.harmony.xml.ExpatParser$CurrentAttributes
-org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatPullParser
org.apache.harmony.xml.ExpatPullParser$ByteDocument
-org.apache.harmony.xml.ExpatPullParser$Document
-org.apache.harmony.xml.ExpatPullParser$Document$SaxHandler
-org.apache.harmony.xml.ExpatPullParser$EndTagEvent
-org.apache.harmony.xml.ExpatPullParser$Event
-org.apache.harmony.xml.ExpatPullParser$NamespaceStack
-org.apache.harmony.xml.ExpatPullParser$NamespaceStack$Builder
-org.apache.harmony.xml.ExpatPullParser$StartDocumentEvent
-org.apache.harmony.xml.ExpatPullParser$StartTagEvent
-org.apache.harmony.xml.ExpatPullParser$TextEvent
org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.DOMImplementationImpl
+org.apache.harmony.xml.dom.AttrImpl
+org.apache.harmony.xml.dom.CharacterDataImpl
+org.apache.harmony.xml.dom.CommentImpl
org.apache.harmony.xml.dom.DocumentImpl
+org.apache.harmony.xml.dom.ElementImpl
+org.apache.harmony.xml.dom.InnerNodeImpl
+org.apache.harmony.xml.dom.NodeImpl
+org.apache.harmony.xml.dom.TextImpl
org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
org.apache.harmony.xml.parsers.DocumentBuilderImpl
+org.apache.harmony.xml.parsers.SAXParserFactoryImpl
org.apache.harmony.xnet.provider.jsse.AbstractSessionContext
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext$1
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext$HostAndPort
org.apache.harmony.xnet.provider.jsse.FileClientSessionCache
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl
-org.apache.harmony.xnet.provider.jsse.JSSEProvider
-org.apache.harmony.xnet.provider.jsse.JSSEProvider$1
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl$1
-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.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$Finalizer
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$LoggerHolder
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream
org.apache.harmony.xnet.provider.jsse.ProtocolVersion
-org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache
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.ServerSessionContext$1
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl$1
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl$2
-org.apache.harmony.xnet.provider.jsse.TrustManagerImpl
-org.apache.http.ConnectionReuseStrategy
-org.apache.http.FormattedHeader
-org.apache.http.Header
-org.apache.http.HeaderElement
-org.apache.http.HeaderElementIterator
-org.apache.http.HeaderIterator
-org.apache.http.HttpClientConnection
-org.apache.http.HttpConnection
-org.apache.http.HttpConnectionMetrics
-org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
-org.apache.http.HttpException
-org.apache.http.HttpHost
-org.apache.http.HttpInetConnection
-org.apache.http.HttpMessage
-org.apache.http.HttpRequest
-org.apache.http.HttpRequestInterceptor
-org.apache.http.HttpResponse
-org.apache.http.HttpResponseFactory
-org.apache.http.HttpResponseInterceptor
org.apache.http.HttpVersion
-org.apache.http.NameValuePair
+org.apache.http.NoHttpResponseException
org.apache.http.ProtocolException
-org.apache.http.ProtocolVersion
-org.apache.http.ReasonPhraseCatalog
-org.apache.http.RequestLine
-org.apache.http.StatusLine
-org.apache.http.TokenIterator
-org.apache.http.auth.AuthSchemeFactory
-org.apache.http.auth.AuthSchemeRegistry
-org.apache.http.auth.AuthState
-org.apache.http.client.AuthenticationHandler
-org.apache.http.client.ClientProtocolException
-org.apache.http.client.CookieStore
-org.apache.http.client.CredentialsProvider
org.apache.http.client.HttpClient
-org.apache.http.client.HttpRequestRetryHandler
-org.apache.http.client.RedirectHandler
-org.apache.http.client.RequestDirector
-org.apache.http.client.ResponseHandler
-org.apache.http.client.UserTokenHandler
-org.apache.http.client.methods.AbortableHttpRequest
org.apache.http.client.methods.HttpEntityEnclosingRequestBase
org.apache.http.client.methods.HttpGet
org.apache.http.client.methods.HttpPost
org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpUriRequest
-org.apache.http.client.params.HttpClientParams
-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.client.utils.URIUtils
org.apache.http.conn.BasicManagedEntity
-org.apache.http.conn.ClientConnectionManager
-org.apache.http.conn.ClientConnectionOperator
-org.apache.http.conn.ClientConnectionRequest
-org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionReleaseTrigger
-org.apache.http.conn.EofSensorInputStream
-org.apache.http.conn.EofSensorWatcher
-org.apache.http.conn.ManagedClientConnection
-org.apache.http.conn.OperatedClientConnection
-org.apache.http.conn.params.ConnManagerPNames
org.apache.http.conn.params.ConnManagerParams
-org.apache.http.conn.params.ConnManagerParams$1
-org.apache.http.conn.params.ConnPerRoute
-org.apache.http.conn.params.ConnPerRouteBean
-org.apache.http.conn.params.ConnRoutePNames
org.apache.http.conn.params.ConnRouteParams
-org.apache.http.conn.routing.BasicRouteDirector
org.apache.http.conn.routing.HttpRoute
-org.apache.http.conn.routing.HttpRouteDirector
-org.apache.http.conn.routing.HttpRoutePlanner
-org.apache.http.conn.routing.RouteInfo
-org.apache.http.conn.routing.RouteInfo$LayerType
-org.apache.http.conn.routing.RouteInfo$TunnelType
-org.apache.http.conn.routing.RouteTracker
-org.apache.http.conn.scheme.LayeredSocketFactory
org.apache.http.conn.scheme.PlainSocketFactory
-org.apache.http.conn.scheme.Scheme
-org.apache.http.conn.scheme.SchemeRegistry
-org.apache.http.conn.scheme.SocketFactory
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.ssl.X509HostnameVerifier
-org.apache.http.cookie.ClientCookie
-org.apache.http.cookie.Cookie
-org.apache.http.cookie.CookieAttributeHandler
-org.apache.http.cookie.CookieIdentityComparator
-org.apache.http.cookie.CookieOrigin
-org.apache.http.cookie.CookiePathComparator
-org.apache.http.cookie.CookieSpec
-org.apache.http.cookie.CookieSpecFactory
-org.apache.http.cookie.CookieSpecRegistry
-org.apache.http.cookie.SetCookie
-org.apache.http.entity.AbstractHttpEntity
+org.apache.http.conn.util.InetAddressUtils
org.apache.http.entity.BasicHttpEntity
-org.apache.http.entity.ByteArrayEntity
-org.apache.http.entity.ContentLengthStrategy
-org.apache.http.entity.HttpEntityWrapper
+org.apache.http.entity.InputStreamEntity
org.apache.http.entity.StringEntity
org.apache.http.impl.AbstractHttpClientConnection
-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.ClientParamsStack
-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.client.RoutedRequest
org.apache.http.impl.conn.AbstractClientConnAdapter
-org.apache.http.impl.conn.AbstractPoolEntry
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.IdleConnectionHandler
-org.apache.http.impl.conn.IdleConnectionHandler$TimeValues
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.tsccm.BasicPoolEntry
-org.apache.http.impl.conn.tsccm.BasicPoolEntryRef
-org.apache.http.impl.conn.tsccm.BasicPooledConnAdapter
org.apache.http.impl.conn.tsccm.ConnPoolByRoute
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1
-org.apache.http.impl.conn.tsccm.PoolEntryRequest
-org.apache.http.impl.conn.tsccm.RefQueueHandler
-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.conn.tsccm.WaitingThreadAborter
-org.apache.http.impl.cookie.AbstractCookieAttributeHandler
-org.apache.http.impl.cookie.AbstractCookieSpec
org.apache.http.impl.cookie.BasicClientCookie
-org.apache.http.impl.cookie.BasicCommentHandler
-org.apache.http.impl.cookie.BasicDomainHandler
-org.apache.http.impl.cookie.BasicExpiresHandler
-org.apache.http.impl.cookie.BasicMaxAgeHandler
-org.apache.http.impl.cookie.BasicPathHandler
-org.apache.http.impl.cookie.BasicSecureHandler
-org.apache.http.impl.cookie.BestMatchSpec
-org.apache.http.impl.cookie.BestMatchSpecFactory
org.apache.http.impl.cookie.BrowserCompatSpec
-org.apache.http.impl.cookie.BrowserCompatSpecFactory
-org.apache.http.impl.cookie.CookieSpecBase
org.apache.http.impl.cookie.DateUtils
-org.apache.http.impl.cookie.NetscapeDraftSpecFactory
-org.apache.http.impl.cookie.RFC2109DomainHandler
org.apache.http.impl.cookie.RFC2109Spec
-org.apache.http.impl.cookie.RFC2109SpecFactory
-org.apache.http.impl.cookie.RFC2109VersionHandler
-org.apache.http.impl.cookie.RFC2965CommentUrlAttributeHandler
-org.apache.http.impl.cookie.RFC2965DiscardAttributeHandler
-org.apache.http.impl.cookie.RFC2965DomainAttributeHandler
-org.apache.http.impl.cookie.RFC2965PortAttributeHandler
org.apache.http.impl.cookie.RFC2965Spec
-org.apache.http.impl.cookie.RFC2965SpecFactory
-org.apache.http.impl.cookie.RFC2965VersionAttributeHandler
-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.AbstractMessageParser
-org.apache.http.impl.io.AbstractMessageWriter
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.ContentLengthOutputStream
-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.io.HttpMessageParser
-org.apache.http.io.HttpMessageWriter
-org.apache.http.io.HttpTransportMetrics
-org.apache.http.io.SessionInputBuffer
-org.apache.http.io.SessionOutputBuffer
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.BasicHttpEntityEnclosingRequest
+org.apache.http.message.BasicHttpRequest
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.BasicStatusLine
org.apache.http.message.BasicTokenIterator
-org.apache.http.message.BufferedHeader
-org.apache.http.message.HeaderGroup
-org.apache.http.message.HeaderValueParser
-org.apache.http.message.LineFormatter
-org.apache.http.message.LineParser
-org.apache.http.message.ParserCursor
org.apache.http.params.AbstractHttpParams
org.apache.http.params.BasicHttpParams
-org.apache.http.params.CoreConnectionPNames
-org.apache.http.params.CoreProtocolPNames
-org.apache.http.params.HttpConnectionParams
-org.apache.http.params.HttpParams
-org.apache.http.params.HttpProtocolParams
-org.apache.http.protocol.BasicHttpContext
org.apache.http.protocol.BasicHttpProcessor
org.apache.http.protocol.HTTP
-org.apache.http.protocol.HttpContext
-org.apache.http.protocol.HttpProcessor
-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.LangUtils
-org.apache.http.util.VersionInfo
-org.bouncycastle.asn1.ASN1Choice
-org.bouncycastle.asn1.ASN1Collection
-org.bouncycastle.asn1.ASN1Collection$ASN1CollectionEnumeration
-org.bouncycastle.asn1.ASN1Encodable
-org.bouncycastle.asn1.ASN1EncodableVector
-org.bouncycastle.asn1.ASN1InputStream
-org.bouncycastle.asn1.ASN1InputStream$1
-org.bouncycastle.asn1.ASN1Null
-org.bouncycastle.asn1.ASN1OctetString
-org.bouncycastle.asn1.ASN1OutputStream
-org.bouncycastle.asn1.ASN1Sequence
-org.bouncycastle.asn1.ASN1Set
-org.bouncycastle.asn1.ASN1TaggedObject
-org.bouncycastle.asn1.DERBitString
-org.bouncycastle.asn1.DERBoolean
-org.bouncycastle.asn1.DEREncodable
-org.bouncycastle.asn1.DEREncodableVector
-org.bouncycastle.asn1.DERIA5String
-org.bouncycastle.asn1.DERInteger
org.bouncycastle.asn1.DERNull
org.bouncycastle.asn1.DERObject
org.bouncycastle.asn1.DERObjectIdentifier
-org.bouncycastle.asn1.DEROctetString
-org.bouncycastle.asn1.DEROutputStream
-org.bouncycastle.asn1.DERPrintableString
-org.bouncycastle.asn1.DERSequence
-org.bouncycastle.asn1.DERSet
-org.bouncycastle.asn1.DERString
-org.bouncycastle.asn1.DERTaggedObject
-org.bouncycastle.asn1.DERTags
-org.bouncycastle.asn1.DERUTCTime
-org.bouncycastle.asn1.DERUTF8String
-org.bouncycastle.asn1.OIDTokenizer
-org.bouncycastle.asn1.OrderedTable
org.bouncycastle.asn1.iana.IANAObjectIdentifiers
org.bouncycastle.asn1.nist.NISTObjectIdentifiers
org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
-org.bouncycastle.asn1.x509.AlgorithmIdentifier
-org.bouncycastle.asn1.x509.BasicConstraints
-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.X509Extension
org.bouncycastle.asn1.x509.X509Extensions
org.bouncycastle.asn1.x509.X509Name
-org.bouncycastle.asn1.x509.X509NameElementList
-org.bouncycastle.asn1.x509.X509ObjectIdentifiers
-org.bouncycastle.crypto.CipherParameters
-org.bouncycastle.crypto.Digest
-org.bouncycastle.crypto.ExtendedDigest
-org.bouncycastle.crypto.Mac
-org.bouncycastle.crypto.PBEParametersGenerator
+org.bouncycastle.crypto.digests.SHA1Digest
org.bouncycastle.crypto.engines.AESFastEngine
org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
-org.bouncycastle.crypto.io.MacInputStream
org.bouncycastle.crypto.macs.HMac
-org.bouncycastle.crypto.params.KeyParameter
-org.bouncycastle.jce.interfaces.BCKeyStore
-org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
org.bouncycastle.jce.provider.BouncyCastleProvider
org.bouncycastle.jce.provider.CertPathValidatorUtilities
+org.bouncycastle.jce.provider.JCEBlockCipher
org.bouncycastle.jce.provider.JCEBlockCipher$AES
-org.bouncycastle.jce.provider.JCERSAPublicKey
+org.bouncycastle.jce.provider.JCEMac
org.bouncycastle.jce.provider.JDKKeyFactory
org.bouncycastle.jce.provider.JDKKeyFactory$RSA
org.bouncycastle.jce.provider.JDKKeyStore
-org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry
org.bouncycastle.jce.provider.JDKX509CertificateFactory
org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi
-org.bouncycastle.jce.provider.PKIXPolicyNode
-org.bouncycastle.jce.provider.RSAUtil
+org.bouncycastle.jce.provider.WrapCipherSpi
org.bouncycastle.jce.provider.X509CertificateObject
-org.bouncycastle.util.Strings
+org.ccil.cowan.tagsoup.AttributesImpl
org.ccil.cowan.tagsoup.HTMLScanner
+org.ccil.cowan.tagsoup.HTMLSchema
org.ccil.cowan.tagsoup.Parser
-org.json.JSONArray
org.json.JSONObject
-org.json.JSONObject$Null
-org.json.JSONTokener
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlSerializer
org.openssl.NativeBN
-org.w3c.dom.DOMImplementation
org.xml.sax.Attributes
-org.xml.sax.ContentHandler
-org.xml.sax.DTDHandler
-org.xml.sax.EntityResolver
-org.xml.sax.ErrorHandler
-org.xml.sax.InputSource
-org.xml.sax.Locator
-org.xml.sax.XMLReader
org.xml.sax.helpers.DefaultHandler
org.xmlpull.v1.XmlPullParser
-org.xmlpull.v1.XmlPullParserFactory
-org.xmlpull.v1.XmlSerializer
+org.xmlpull.v1.XmlPullParserException
+org.xmlpull.v1.sax2.Driver
sun.misc.Unsafe
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 04bfae6..30a9c59 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -924,6 +924,7 @@
static final int RESUME_TOP_ACTIVITY_MSG = 19;
static final int PROC_START_TIMEOUT_MSG = 20;
static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 21;
+ static final int KILL_APPLICATION_MSG = 22;
AlertDialog mUidAlert;
@@ -1153,6 +1154,14 @@
doPendingActivityLaunchesLocked(true);
}
}
+ case KILL_APPLICATION_MSG: {
+ synchronized (ActivityManagerService.this) {
+ int uid = msg.arg1;
+ boolean restart = (msg.arg2 == 1);
+ String pkg = (String) msg.obj;
+ uninstallPackageLocked(pkg, uid, restart);
+ }
+ } break;
}
}
};
@@ -4804,7 +4813,12 @@
int callerUid = Binder.getCallingUid();
// Only the system server can kill an application
if (callerUid == Process.SYSTEM_UID) {
- uninstallPackageLocked(pkg, uid, false);
+ // Post an aysnc message to kill the application
+ Message msg = mHandler.obtainMessage(KILL_APPLICATION_MSG);
+ msg.arg1 = uid;
+ msg.arg2 = 0;
+ msg.obj = pkg;
+ mHandler.sendMessage(msg);
} else {
throw new SecurityException(callerUid + " cannot kill pkg: " +
pkg);
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index e04491d..5f80ade 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -321,6 +321,7 @@
LABEL_ATTR = 0x01010001,
ICON_ATTR = 0x01010002,
MIN_SDK_VERSION_ATTR = 0x0101020c,
+ MAX_SDK_VERSION_ATTR = 0x01010271,
REQ_TOUCH_SCREEN_ATTR = 0x01010227,
REQ_KEYBOARD_TYPE_ATTR = 0x01010228,
REQ_HARD_KEYBOARD_ATTR = 0x01010229,
@@ -585,6 +586,10 @@
targetSdk = code;
printf("sdkVersion:'%d'\n", code);
}
+ code = getIntegerAttribute(tree, MAX_SDK_VERSION_ATTR, NULL, -1);
+ if (code != -1) {
+ printf("maxSdkVersion:'%d'\n", code);
+ }
code = getIntegerAttribute(tree, TARGET_SDK_VERSION_ATTR, &error);
if (error != "") {
error = "";
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
index 6bc01b1..7dde634 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
@@ -16,7 +16,6 @@
package android.graphics;
-import com.android.layoutlib.bridge.BridgeCanvas;
import java.awt.image.BufferedImage;
import java.io.File;
@@ -25,15 +24,15 @@
import javax.imageio.ImageIO;
public final class Bitmap extends _Original_Bitmap {
-
+
private BufferedImage mImage;
public Bitmap(File input) throws IOException {
super(1, true, null);
-
+
mImage = ImageIO.read(input);
}
-
+
Bitmap(BufferedImage image) {
super(1, true, null);
mImage = image;
@@ -42,9 +41,9 @@
public BufferedImage getImage() {
return mImage;
}
-
+
// ----- overriden methods
-
+
public enum Config {
// these native values must match up with the enum in SkBitmap.h
ALPHA_8 (2),
@@ -56,27 +55,26 @@
this.nativeInt = ni;
}
final int nativeInt;
-
+
/* package */ static Config nativeToConfig(int ni) {
return sConfigs[ni];
}
-
+
private static Config sConfigs[] = {
null, null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
};
}
-
@Override
public int getWidth() {
return mImage.getWidth();
}
-
+
@Override
public int getHeight() {
return mImage.getHeight();
}
-
+
/**
* Returns an immutable bitmap from the source bitmap. The new bitmap may
* be the same object as source, or a copy may have been made.
@@ -100,7 +98,7 @@
int width, int height) {
return new Bitmap(source.mImage.getSubimage(x, y, width, height));
}
-
+
/**
* Returns an immutable bitmap from subset of the source bitmap,
* transformed by the optional matrix.
@@ -158,7 +156,7 @@
neww = Math.round(deviceR.width());
newh = Math.round(deviceR.height());
- BridgeCanvas canvas = new BridgeCanvas(neww, newh);
+ Canvas canvas = new Canvas(neww, newh);
canvas.translate(-deviceR.left, -deviceR.top);
canvas.concat(m);
@@ -169,10 +167,10 @@
}
canvas.drawBitmap(source, srcR, dstR, paint);
-
+
return new Bitmap(canvas.getImage());
}
-
+
/**
* Returns a mutable bitmap with the specified width and height.
*
@@ -184,7 +182,7 @@
public static Bitmap createBitmap(int width, int height, Config config) {
return new Bitmap(new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB));
}
-
+
/**
* Returns a immutable bitmap with the specified width and height, with each
* pixel value set to the corresponding value in the colors array.
@@ -215,7 +213,7 @@
|| (lastScanline + width > length)) {
throw new ArrayIndexOutOfBoundsException();
}
-
+
// TODO: create an immutable bitmap...
throw new UnsupportedOperationException();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java b/tools/layoutlib/bridge/src/android/graphics/Canvas.java
similarity index 89%
rename from tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java
rename to tools/layoutlib/bridge/src/android/graphics/Canvas.java
index 4710691..3fa1d1d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas.java
@@ -14,24 +14,16 @@
* limitations under the License.
*/
-package com.android.layoutlib.bridge;
+package android.graphics;
import com.android.layoutlib.api.ILayoutLog;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
import android.graphics.DrawFilter;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
import android.graphics.Picture;
import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
-import android.graphics.Shader;
import android.graphics.Xfermode;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
@@ -43,6 +35,7 @@
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Stack;
@@ -51,36 +44,59 @@
/**
* Re-implementation of the Canvas, 100% in java on top of a BufferedImage.
*/
-public class BridgeCanvas extends Canvas {
-
+public class Canvas extends _Original_Canvas {
+
private BufferedImage mBufferedImage;
private final Stack<Graphics2D> mGraphicsStack = new Stack<Graphics2D>();
private final ILayoutLog mLogger;
- public BridgeCanvas(int width, int height, ILayoutLog logger) {
+ public Canvas() {
+ mLogger = null;
+ // the mBufferedImage will be taken from a bitmap in #setBitmap()
+ }
+
+ public Canvas(Bitmap bitmap) {
+ mLogger = null;
+ mBufferedImage = bitmap.getImage();
+ mGraphicsStack.push(mBufferedImage.createGraphics());
+ }
+
+ public Canvas(int nativeCanvas) {
+ mLogger = null;
+ throw new UnsupportedOperationException("Can't create Canvas(int)");
+ }
+
+ public Canvas(javax.microedition.khronos.opengles.GL gl) {
+ mLogger = null;
+ throw new UnsupportedOperationException("Can't create Canvas(javax.microedition.khronos.opengles.GL)");
+ }
+
+ // custom constructors for our use.
+ public Canvas(int width, int height, ILayoutLog logger) {
mLogger = logger;
mBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
mGraphicsStack.push(mBufferedImage.createGraphics());
}
-
- public BridgeCanvas(int width, int height) {
+
+ public Canvas(int width, int height) {
this(width, height, null /* logger*/);
}
-
+
+ // custom mehtods
public BufferedImage getImage() {
return mBufferedImage;
}
-
- Graphics2D getGraphics2d() {
+
+ public Graphics2D getGraphics2d() {
return mGraphicsStack.peek();
}
-
- void dispose() {
+
+ public void dispose() {
while (mGraphicsStack.size() > 0) {
mGraphicsStack.pop().dispose();
}
}
-
+
/**
* Creates a new {@link Graphics2D} based on the {@link Paint} parameters.
* <p/>The object must be disposed ({@link Graphics2D#dispose()}) after being used.
@@ -91,11 +107,11 @@
g.setColor(new Color(paint.getColor()));
int alpha = paint.getAlpha();
float falpha = alpha / 255.f;
-
+
Xfermode xfermode = paint.getXfermode();
if (xfermode instanceof PorterDuffXfermode) {
PorterDuff.Mode mode = ((PorterDuffXfermode)xfermode).getMode();
-
+
setModeInGraphics(mode, g, falpha);
} else {
if (mLogger != null && xfermode != null) {
@@ -105,7 +121,7 @@
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha));
}
-
+
Shader shader = paint.getShader();
if (shader instanceof LinearGradient) {
g.setPaint(((LinearGradient)shader).getPaint());
@@ -116,10 +132,10 @@
shader.getClass().getCanonicalName()));
}
}
-
+
return g;
}
-
+
private void setModeInGraphics(PorterDuff.Mode mode, Graphics2D g, float falpha) {
switch (mode) {
case CLEAR:
@@ -168,14 +184,43 @@
break;
}
}
-
+
+
// --------------------
-
+ // OVERRIDEN ENUMS
+ // This is needed since we rename Canvas into _Original_Canvas
+ // --------------------
+
+ public enum EdgeType {
+ BW(0), //!< treat edges by just rounding to nearest pixel boundary
+ AA(1); //!< treat edges by rounding-out, since they may be antialiased
+
+ EdgeType(int nativeInt) {
+ this.nativeInt = nativeInt;
+ }
+ final int nativeInt;
+ }
+
+
+ // --------------------
+ // OVERRIDEN METHODS
+ // --------------------
+
@Override
public void finalize() throws Throwable {
// pass
}
-
+
+ /* (non-Javadoc)
+ * @see android.graphics.Canvas#setBitmap(android.graphics.Bitmap)
+ */
+ @Override
+ public void setBitmap(Bitmap bitmap) {
+ mBufferedImage = bitmap.getImage();
+ mGraphicsStack.push(mBufferedImage.createGraphics());
+ }
+
+
/* (non-Javadoc)
* @see android.graphics.Canvas#translate(float, float)
*/
@@ -183,7 +228,7 @@
public void translate(float dx, float dy) {
getGraphics2d().translate(dx, dy);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#save()
*/
@@ -191,7 +236,7 @@
public int save() {
Graphics2D g = (Graphics2D)getGraphics2d().create();
mGraphicsStack.push(g);
-
+
return mGraphicsStack.size() - 1;
}
@@ -203,7 +248,7 @@
// For now we ignore saveFlags
return save();
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#restore()
*/
@@ -221,7 +266,7 @@
mGraphicsStack.pop();
}
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#getSaveCount()
*/
@@ -229,8 +274,8 @@
public int getSaveCount() {
return mGraphicsStack.size() - 1;
}
-
-
+
+
/* (non-Javadoc)
* @see android.graphics.Canvas#clipRect(float, float, float, float, android.graphics.Region.Op)
*/
@@ -288,23 +333,36 @@
public boolean clipRect(RectF rect) {
return clipRect(rect.left, rect.top, rect.right, rect.bottom);
}
-
- @Override
+
public boolean quickReject(RectF rect, EdgeType type) {
return false;
}
@Override
+ public boolean quickReject(RectF rect, _Original_Canvas.EdgeType type) {
+ throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+ }
+
public boolean quickReject(Path path, EdgeType type) {
return false;
}
@Override
+ public boolean quickReject(Path path, _Original_Canvas.EdgeType type) {
+ throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+ }
+
public boolean quickReject(float left, float top, float right, float bottom,
EdgeType type) {
return false;
}
+ @Override
+ public boolean quickReject(float left, float top, float right, float bottom,
+ _Original_Canvas.EdgeType type) {
+ throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+ }
+
/**
* Retrieve the clip bounds, returning true if they are non-empty.
*
@@ -324,31 +382,31 @@
}
return false;
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawColor(int, android.graphics.PorterDuff.Mode)
*/
@Override
public void drawColor(int color, PorterDuff.Mode mode) {
Graphics2D g = getGraphics2d();
-
+
// save old color
Color c = g.getColor();
-
+
Composite composite = g.getComposite();
-
+
// get the alpha from the color
int alpha = color >>> 24;
float falpha = alpha / 255.f;
-
+
setModeInGraphics(mode, g, falpha);
-
+
g.setColor(new Color(color));
-
+
getGraphics2d().fillRect(0, 0, getWidth(), getHeight());
-
+
g.setComposite(composite);
-
+
// restore color
g.setColor(c);
}
@@ -360,7 +418,7 @@
public void drawColor(int color) {
drawColor(color, PorterDuff.Mode.SRC_OVER);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawARGB(int, int, int, int)
*/
@@ -368,7 +426,7 @@
public void drawARGB(int a, int r, int g, int b) {
drawColor(a << 24 | r << 16 | g << 8 | b, PorterDuff.Mode.SRC_OVER);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawRGB(int, int, int)
*/
@@ -377,7 +435,7 @@
drawColor(0xFF << 24 | r << 16 | g << 8 | b, PorterDuff.Mode.SRC_OVER);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#getWidth()
*/
@@ -385,7 +443,7 @@
public int getWidth() {
return mBufferedImage.getWidth();
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#getHeight()
*/
@@ -401,7 +459,7 @@
public void drawPaint(Paint paint) {
drawColor(paint.getColor());
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint)
*/
@@ -417,7 +475,32 @@
*/
@Override
public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
- throw new UnsupportedOperationException();
+ boolean needsRestore = false;
+ if (matrix.isIdentity() == false) {
+ // create a new graphics and apply the matrix to it
+ save(); // this creates a new Graphics2D, and stores it for children call to use
+ needsRestore = true;
+ Graphics2D g = getGraphics2d(); // get the newly create Graphics2D
+
+ // get the Graphics2D current matrix
+ AffineTransform currentTx = g.getTransform();
+ // get the AffineTransform from the matrix
+ AffineTransform matrixTx = matrix.getTransform();
+
+ // combine them so that the matrix is applied after.
+ currentTx.preConcatenate(matrixTx);
+
+ // give it to the graphics as a new matrix replacing all previous transform
+ g.setTransform(currentTx);
+ }
+
+ // draw the bitmap
+ drawBitmap(bitmap, 0, 0, paint);
+
+ if (needsRestore) {
+ // remove the new graphics
+ restore();
+ }
}
/* (non-Javadoc)
@@ -456,39 +539,42 @@
int height, boolean hasAlpha, Paint paint) {
throw new UnsupportedOperationException();
}
-
+
private void drawBitmap(Bitmap bitmap, int sleft, int stop, int sright, int sbottom, int dleft,
int dtop, int dright, int dbottom, Paint paint) {
BufferedImage image = bitmap.getImage();
-
+
Graphics2D g = getGraphics2d();
-
+
Composite c = null;
-
- if (paint.isFilterBitmap()) {
- g = (Graphics2D)g.create();
- g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+
+ if (paint != null) {
+ if (paint.isFilterBitmap()) {
+ g = (Graphics2D)g.create();
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ }
+
+ if (paint.getAlpha() != 0xFF) {
+ c = g.getComposite();
+ g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+ paint.getAlpha()/255.f));
+ }
}
-
- if (paint.getAlpha() != 0xFF) {
- c = g.getComposite();
- g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
- paint.getAlpha()/255.f));
- }
-
+
g.drawImage(image, dleft, dtop, dright, dbottom,
sleft, stop, sright, sbottom, null);
- if (paint.isFilterBitmap()) {
- g.dispose();
- }
-
- if (c != null) {
- g.setComposite(c);
+ if (paint != null) {
+ if (paint.isFilterBitmap()) {
+ g.dispose();
+ }
+ if (c != null) {
+ g.setComposite(c);
+ }
}
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#rotate(float, float, float)
*/
@@ -509,7 +595,7 @@
public void rotate(float degrees) {
getGraphics2d().rotate(Math.toRadians(degrees));
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#scale(float, float, float, float)
*/
@@ -528,19 +614,19 @@
public void scale(float sx, float sy) {
getGraphics2d().scale(sx, sy);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawText(char[], int, int, float, float, android.graphics.Paint)
*/
@Override
public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {
Graphics2D g = getGraphics2d();
-
+
g = (Graphics2D)g.create();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
+
g.setFont(paint.getFont());
-
+
// set the color. because this only handles RGB we have to handle the alpha separately
g.setColor(new Color(paint.getColor()));
int alpha = paint.getAlpha();
@@ -557,9 +643,9 @@
x -= m;
}
}
-
+
g.drawChars(text, index, count, (int)x, (int)y);
-
+
g.dispose();
}
@@ -586,7 +672,7 @@
public void drawText(String text, int start, int end, float x, float y, Paint paint) {
drawText(text.toCharArray(), start, end - start, x, y, paint);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawRect(android.graphics.RectF, android.graphics.Paint)
*/
@@ -594,7 +680,7 @@
public void drawRect(RectF rect, Paint paint) {
doDrawRect((int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(), paint);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawRect(float, float, float, float, android.graphics.Paint)
*/
@@ -614,11 +700,11 @@
private final void doDrawRect(int left, int top, int width, int height, Paint paint) {
// get current graphisc
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
Style style = paint.getStyle();
-
+
// draw
if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
g.fillRect(left, top, width, height);
@@ -639,16 +725,16 @@
public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
// get current graphisc
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
Style style = paint.getStyle();
-
+
// draw
-
+
int arcWidth = (int)(rx * 2);
int arcHeight = (int)(ry * 2);
-
+
if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
g.fillRoundRect((int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(),
arcWidth, arcHeight);
@@ -671,7 +757,7 @@
public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
// get current graphisc
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
g.drawLine((int)startX, (int)startY, (int)stopX, (int)stopY);
@@ -679,7 +765,7 @@
// dispose Graphics2D object
g.dispose();
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawLines(float[], int, int, android.graphics.Paint)
*/
@@ -687,7 +773,7 @@
public void drawLines(float[] pts, int offset, int count, Paint paint) {
// get current graphisc
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
for (int i = 0 ; i < count ; i += 4) {
@@ -706,7 +792,7 @@
public void drawLines(float[] pts, Paint paint) {
drawLines(pts, 0, pts.length, paint);
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawCircle(float, float, float, android.graphics.Paint)
*/
@@ -714,11 +800,11 @@
public void drawCircle(float cx, float cy, float radius, Paint paint) {
// get current graphisc
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
Style style = paint.getStyle();
-
+
int size = (int)(radius * 2);
// draw
@@ -741,11 +827,11 @@
public void drawOval(RectF oval, Paint paint) {
// get current graphics
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
Style style = paint.getStyle();
-
+
// draw
if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
g.fillOval((int)oval.left, (int)oval.top, (int)oval.width(), (int)oval.height());
@@ -758,7 +844,7 @@
// dispose Graphics2D object
g.dispose();
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#drawPath(android.graphics.Path, android.graphics.Paint)
*/
@@ -766,11 +852,11 @@
public void drawPath(Path path, Paint paint) {
// get current graphics
Graphics2D g = getGraphics2d();
-
+
g = getNewGraphics(paint, g);
Style style = paint.getStyle();
-
+
// draw
if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
g.fill(path.getAwtShape());
@@ -783,7 +869,7 @@
// dispose Graphics2D object
g.dispose();
}
-
+
/* (non-Javadoc)
* @see android.graphics.Canvas#setMatrix(android.graphics.Matrix)
*/
@@ -795,10 +881,10 @@
// get the new current graphics
Graphics2D g = getGraphics2d();
-
+
// and apply the matrix
g.setTransform(matrix.getTransform());
-
+
if (mLogger != null && matrix.hasPerspective()) {
mLogger.warning("android.graphics.Canvas#setMatrix(android.graphics.Matrix) only supports affine transformations in the Layout Editor.");
}
@@ -1059,15 +1145,6 @@
}
/* (non-Javadoc)
- * @see android.graphics.Canvas#setBitmap(android.graphics.Bitmap)
- */
- @Override
- public void setBitmap(Bitmap bitmap) {
- // TODO Auto-generated method stub
- super.setBitmap(bitmap);
- }
-
- /* (non-Javadoc)
* @see android.graphics.Canvas#setDrawFilter(android.graphics.DrawFilter)
*/
@Override
diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix.java b/tools/layoutlib/bridge/src/android/graphics/Matrix.java
index 18c0e17..3974e08 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Matrix.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Matrix.java
@@ -17,6 +17,7 @@
package android.graphics;
import java.awt.geom.AffineTransform;
+import java.awt.geom.NoninvertibleTransformException;
/**
@@ -747,7 +748,24 @@
* inverted, ignore inverse and return false.
*/
public boolean invert(Matrix inverse) {
- throw new UnsupportedOperationException("STUB NEEDED");
+ if (inverse == null) {
+ return false;
+ }
+
+ try {
+ AffineTransform affineTransform = getTransform();
+ AffineTransform inverseTransform = affineTransform.createInverse();
+ inverse.mValues[0] = (float)inverseTransform.getScaleX();
+ inverse.mValues[1] = (float)inverseTransform.getShearX();
+ inverse.mValues[2] = (float)inverseTransform.getTranslateX();
+ inverse.mValues[3] = (float)inverseTransform.getScaleX();
+ inverse.mValues[4] = (float)inverseTransform.getShearY();
+ inverse.mValues[5] = (float)inverseTransform.getTranslateY();
+
+ return true;
+ } catch (NoninvertibleTransformException e) {
+ return false;
+ }
}
@Override
@@ -770,7 +788,19 @@
public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex,
int pointCount) {
checkPointArrays(src, srcIndex, dst, dstIndex, pointCount);
- throw new UnsupportedOperationException("STUB NEEDED");
+
+ for (int i = 0 ; i < pointCount ; i++) {
+ // just in case we are doing in place, we better put this in temp vars
+ float x = mValues[0] * src[i + srcIndex] +
+ mValues[1] * src[i + srcIndex + 1] +
+ mValues[2];
+ float y = mValues[3] * src[i + srcIndex] +
+ mValues[4] * src[i + srcIndex + 1] +
+ mValues[5];
+
+ dst[i + dstIndex] = x;
+ dst[i + dstIndex + 1] = y;
+ }
}
/**
@@ -858,7 +888,26 @@
if (dst == null || src == null) {
throw new NullPointerException();
}
- throw new UnsupportedOperationException("STUB NEEDED");
+
+ // array with 4 corners
+ float[] corners = new float[] {
+ src.left, src.top,
+ src.right, src.top,
+ src.right, src.bottom,
+ src.left, src.bottom,
+ };
+
+ // apply the transform to them.
+ mapPoints(corners);
+
+ // now put the result in the rect. We take the min/max of Xs and min/max of Ys
+ dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
+ dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
+
+ dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
+ dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
+
+ return rectStaysRect();
}
/**
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index fd77d51..145a045 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -31,6 +31,7 @@
import com.android.tools.layoutlib.create.OverrideMethod;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Typeface;
@@ -358,7 +359,7 @@
windowBackground = context.findItemInStyle(currentTheme, "windowBackground");
windowBackground = context.resolveResValue(windowBackground);
- screenOffset = getScreenOffset(currentTheme, context);
+ screenOffset = getScreenOffset(frameworkResources, currentTheme, context);
}
// we need to make sure the Looper has been initialized for this thread.
@@ -401,8 +402,7 @@
view.layout(0, screenOffset, screenWidth, screenHeight);
// draw them
- BridgeCanvas canvas = new BridgeCanvas(screenWidth, screenHeight - screenOffset,
- logger);
+ Canvas canvas = new Canvas(screenWidth, screenHeight - screenOffset, logger);
root.draw(canvas);
canvas.dispose();
@@ -673,9 +673,13 @@
/**
* Returns the top screen offset. This depends on whether the current theme defines the user
* of the title and status bars.
+ * @param frameworkResources The framework resources
+ * @param currentTheme The current theme
+ * @param context The context
* @return the pixel height offset
*/
- private int getScreenOffset(IStyleResourceValue currentTheme, BridgeContext context) {
+ private int getScreenOffset(Map<String, Map<String, IResourceValue>> frameworkResources,
+ IStyleResourceValue currentTheme, BridgeContext context) {
int offset = 0;
// get the title bar flag from the current theme.
@@ -687,22 +691,25 @@
// if there's a value and it's true (default is false)
if (value == null || value.getValue() == null ||
XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) {
+ // default size of the window title bar
+ int defaultOffset = DEFAULT_TITLE_BAR_HEIGHT;
+
// get value from the theme.
value = context.findItemInStyle(currentTheme, "windowTitleSize");
// resolve it
value = context.resolveResValue(value);
- // default value
- offset = DEFAULT_TITLE_BAR_HEIGHT;
-
- // get the real value;
if (value != null) {
+ // get the numerical value, if available
TypedValue typedValue = ResourceHelper.getValue(value.getValue());
if (typedValue != null) {
- offset = (int)typedValue.getDimension(context.getResources().mMetrics);
+ // compute the pixel value based on the display metrics
+ defaultOffset = (int)typedValue.getDimension(context.getResources().mMetrics);
}
}
+
+ offset += defaultOffset;
}
// get the fullscreen flag from the current theme.
@@ -713,8 +720,25 @@
if (value == null || value.getValue() == null ||
XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) {
- // FIXME: Right now this is hard-coded in the platform, but once there's a constant, we'll need to use it.
- offset += DEFAULT_STATUS_BAR_HEIGHT;
+
+ // default value
+ int defaultOffset = DEFAULT_STATUS_BAR_HEIGHT;
+
+ // get the real value, first the list of Dimensions from the framework map
+ Map<String, IResourceValue> dimens = frameworkResources.get(BridgeConstants.RES_DIMEN);
+
+ // now get the value
+ value = dimens.get("status_bar_height");
+ if (value != null) {
+ TypedValue typedValue = ResourceHelper.getValue(value.getValue());
+ if (typedValue != null) {
+ // compute the pixel value based on the display metrics
+ defaultOffset = (int)typedValue.getDimension(context.getResources().mMetrics);
+ }
+ }
+
+ // add the computed offset.
+ offset += defaultOffset;
}
return offset;
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 b426247..b5b7ceb 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
@@ -45,11 +45,12 @@
public final static String PREFIX_RESOURCE_REF = "@";
public final static String PREFIX_ANDROID_THEME_REF = "?android:";
public final static String PREFIX_THEME_REF = "?";
-
+
public final static String PREFIX_ANDROID = "android:";
-
+
public final static String RES_STYLE = "style";
public final static String RES_ATTR = "attr";
+ public final static String RES_DIMEN = "dimen";
public final static String RES_DRAWABLE = "drawable";
public final static String RES_COLOR = "color";
public final static String RES_LAYOUT = "layout";
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 8a040e41..2b0100b 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
@@ -497,6 +497,24 @@
}
@Override
+ public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
+ getValue(id, value, true);
+
+ File f = new File(value.string.toString());
+ if (f.isFile()) {
+ try {
+ return new FileInputStream(f);
+ } catch (FileNotFoundException e) {
+ NotFoundException exception = new NotFoundException();
+ exception.initCause(e);
+ throw exception;
+ }
+ }
+
+ throw new NotFoundException();
+ }
+
+ @Override
public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
throw new UnsupportedOperationException();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
index 5f0852e..abbf2f0 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
@@ -30,17 +30,17 @@
NinePatchDrawable(NinePatch ninePatch) {
m9Patch = ninePatch;
}
-
+
@Override
public int getMinimumWidth() {
return m9Patch.getWidth();
}
-
+
@Override
public int getMinimumHeight() {
return m9Patch.getHeight();
}
-
+
/**
* Return the intrinsic width of the underlying drawable object. Returns
* -1 if it has no intrinsic width, such as with a solid color.
@@ -58,7 +58,7 @@
public int getIntrinsicHeight() {
return m9Patch.getHeight();
}
-
+
/**
* Return in padding the insets suggested by this Drawable for placing
* content inside the drawable's bounds. Positive values move toward the
@@ -76,24 +76,18 @@
padding.bottom = padd[3];
return true;
}
-
+
@Override
public void draw(Canvas canvas) {
- if (canvas instanceof BridgeCanvas) {
- BridgeCanvas bridgeCanvas = (BridgeCanvas)canvas;
-
- Rect r = getBounds();
- m9Patch.draw(bridgeCanvas.getGraphics2d(), r.left, r.top, r.width(), r.height());
-
- return;
- }
+ Rect r = getBounds();
+ m9Patch.draw(canvas.getGraphics2d(), r.left, r.top, r.width(), r.height());
- throw new UnsupportedOperationException();
+ return;
}
-
+
// ----------- Not implemented methods ---------------
-
+
@Override
public int getOpacity() {
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
index c07baff..47184f1 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
@@ -54,18 +54,19 @@
},
new String[] { // classes to rename (so that we can replace them in layoutlib)
// original-platform-class-name ======> renamed-class-name
+ "android.graphics.Bitmap", "android.graphics._Original_Bitmap",
+ "android.graphics.BitmapShader", "android.graphics._Original_BitmapShader",
+ "android.graphics.Canvas", "android.graphics._Original_Canvas",
+ "android.graphics.ComposeShader", "android.graphics._Original_ComposeShader",
+ "android.graphics.LinearGradient", "android.graphics._Original_LinearGradient",
"android.graphics.Matrix", "android.graphics._Original_Matrix",
"android.graphics.Paint", "android.graphics._Original_Paint",
- "android.graphics.Typeface", "android.graphics._Original_Typeface",
- "android.graphics.Bitmap", "android.graphics._Original_Bitmap",
"android.graphics.Path", "android.graphics._Original_Path",
"android.graphics.PorterDuffXfermode", "android.graphics._Original_PorterDuffXfermode",
- "android.graphics.Shader", "android.graphics._Original_Shader",
- "android.graphics.LinearGradient", "android.graphics._Original_LinearGradient",
- "android.graphics.BitmapShader", "android.graphics._Original_BitmapShader",
- "android.graphics.ComposeShader", "android.graphics._Original_ComposeShader",
"android.graphics.RadialGradient", "android.graphics._Original_RadialGradient",
+ "android.graphics.Shader", "android.graphics._Original_Shader",
"android.graphics.SweepGradient", "android.graphics._Original_SweepGradient",
+ "android.graphics.Typeface", "android.graphics._Original_Typeface",
"android.os.ServiceManager", "android.os._Original_ServiceManager",
"android.util.FloatMath", "android.util._Original_FloatMath",
"android.view.SurfaceView", "android.view._Original_SurfaceView",
diff --git a/tools/preload/20090811.compiled b/tools/preload/20090811.compiled
index dd61487..6dbeca0 100644
--- a/tools/preload/20090811.compiled
+++ b/tools/preload/20090811.compiled
Binary files differ
diff --git a/tools/preload/Android.mk b/tools/preload/Android.mk
index e6fa103..f325870 100644
--- a/tools/preload/Android.mk
+++ b/tools/preload/Android.mk
@@ -3,13 +3,13 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
- ClassRank.java \
Compile.java \
LoadedClass.java \
MemoryUsage.java \
Operation.java \
Policy.java \
PrintCsv.java \
+ PrintHtmlDiff.java \
PrintPsTree.java \
Proc.java \
Record.java \
diff --git a/tools/preload/ClassRank.java b/tools/preload/ClassRank.java
deleted file mode 100644
index c562d5c..0000000
--- a/tools/preload/ClassRank.java
+++ /dev/null
@@ -1,53 +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.
- */
-
-import java.util.Comparator;
-
-/**
- * Ranks classes for preloading based on how long their operations took
- * and how early the operations happened. Higher ranked classes come first.
- */
-class ClassRank implements Comparator<Operation> {
-
- /**
- * Increase this number to add more weight to classes which were loaded
- * earlier.
- */
- static final int SEQUENCE_WEIGHT = 500; // 0.5ms
-
- static final int BUCKET_SIZE = 5;
-
- public int compare(Operation a, Operation b) {
- // Higher ranked operations should come first.
- int result = rankOf(b) - rankOf(a);
- if (result != 0) {
- return result;
- }
-
- // Make sure we don't drop one of two classes w/ the same rank.
- // If a load and an initialization have the same rank, it's OK
- // to treat the operations equally.
- return a.loadedClass.name.compareTo(b.loadedClass.name);
- }
-
- /** Ranks the given operation. */
- private static int rankOf(Operation o) {
- return o.medianExclusiveTimeMicros()
- + SEQUENCE_WEIGHT / (o.index / BUCKET_SIZE + 1);
- }
-}
-
-
diff --git a/tools/preload/LoadedClass.java b/tools/preload/LoadedClass.java
index 9ef17f5..86e5dfc 100644
--- a/tools/preload/LoadedClass.java
+++ b/tools/preload/LoadedClass.java
@@ -51,7 +51,7 @@
}
void measureMemoryUsage() {
-// this.memoryUsage = MemoryUsage.forClass(name);
+ this.memoryUsage = MemoryUsage.forClass(name);
}
int mlt = -1;
@@ -76,6 +76,10 @@
return mit = calculateMedian(initializations);
}
+ int medianTimeMicros() {
+ return medianInitTimeMicros() + medianLoadTimeMicros();
+ }
+
/** Calculates the median duration for a list of operations. */
private static int calculateMedian(List<Operation> operations) {
int size = operations.size();
@@ -99,18 +103,18 @@
}
}
- /** Returns names of apps that loaded this class. */
- Set<String> applicationNames() {
- Set<String> appNames = new HashSet<String>();
- addProcessNames(loads, appNames);
- addProcessNames(initializations, appNames);
- return appNames;
+ /** Returns names of processes that loaded this class. */
+ Set<String> processNames() {
+ Set<String> names = new HashSet<String>();
+ addProcessNames(loads, names);
+ addProcessNames(initializations, names);
+ return names;
}
- private void addProcessNames(List<Operation> ops, Set<String> appNames) {
+ private void addProcessNames(List<Operation> ops, Set<String> names) {
for (Operation operation : ops) {
- if (operation.process.isApplication()) {
- appNames.add(operation.process.name);
+ if (operation.process.fromZygote()) {
+ names.add(operation.process.name);
}
}
}
@@ -123,31 +127,4 @@
public String toString() {
return name;
}
-
- /**
- * Returns true if this class's initialization causes the given class to
- * initialize.
- */
- public boolean initializes(LoadedClass clazz, Set<LoadedClass> visited) {
- // Avoid infinite recursion.
- if (!visited.add(this)) {
- return false;
- }
-
- if (clazz == this) {
- return true;
- }
-
- for (Operation initialization : initializations) {
- if (initialization.loadedClass.initializes(clazz, visited)) {
- return true;
- }
- }
-
- return false;
- }
-
- public boolean isPreloadable() {
- return systemClass && Policy.isPreloadableClass(name);
- }
}
diff --git a/tools/preload/MemoryUsage.java b/tools/preload/MemoryUsage.java
index e5dfb2a..bc21b6f 100644
--- a/tools/preload/MemoryUsage.java
+++ b/tools/preload/MemoryUsage.java
@@ -34,8 +34,8 @@
static final MemoryUsage NOT_AVAILABLE = new MemoryUsage();
static int errorCount = 0;
- static final int MAXIMUM_ERRORS = 10; // give up after this many fails
+ // These values are in 1kB increments (not 4kB like you'd expect).
final int nativeSharedPages;
final int javaSharedPages;
final int otherSharedPages;
@@ -123,15 +123,24 @@
return allocSize - freedSize;
}
+ int totalHeap() {
+ return javaHeapSize() + (int) nativeHeapSize;
+ }
+
int javaPagesInK() {
- return (javaSharedPages + javaPrivatePages) * 4;
+ return javaSharedPages + javaPrivatePages;
}
int nativePagesInK() {
- return (nativeSharedPages + nativePrivatePages) * 4;
+ return nativeSharedPages + nativePrivatePages;
}
int otherPagesInK() {
- return (otherSharedPages + otherPrivatePages) * 4;
+ return otherSharedPages + otherPrivatePages;
+ }
+
+ int totalPages() {
+ return javaSharedPages + javaPrivatePages + nativeSharedPages +
+ nativePrivatePages + otherSharedPages + otherPrivatePages;
}
/**
@@ -163,13 +172,6 @@
* Measures memory usage for the given class.
*/
static MemoryUsage forClass(String className) {
-
- // This is a coarse approximation for determining that no device is connected,
- // or that the communication protocol has changed, but we'll keep going and stop whining.
- if (errorCount >= MAXIMUM_ERRORS) {
- return NOT_AVAILABLE;
- }
-
MeasureWithTimeout measurer = new MeasureWithTimeout(className);
new Thread(measurer).start();
@@ -280,4 +282,17 @@
e.printStackTrace();
}
}
+
+ /** Measures memory usage information and stores it in the model. */
+ public static void main(String[] args) throws IOException,
+ ClassNotFoundException {
+ Root root = Root.fromFile(args[0]);
+ root.baseline = baseline();
+ for (LoadedClass loadedClass : root.loadedClasses.values()) {
+ if (loadedClass.systemClass) {
+ loadedClass.measureMemoryUsage();
+ }
+ }
+ root.toFile(args[0]);
+ }
}
diff --git a/tools/preload/Policy.java b/tools/preload/Policy.java
index ade889e3..7a190ac 100644
--- a/tools/preload/Policy.java
+++ b/tools/preload/Policy.java
@@ -19,10 +19,10 @@
import java.util.Set;
/**
- * This is not instantiated - we just provide data for other classes to use
+ * Policy that governs which classes are preloaded.
*/
public class Policy {
-
+
/**
* No constructor - use static methods only
*/
@@ -31,18 +31,24 @@
/**
* This location (in the build system) of the preloaded-classes file.
*/
- private static final String PRELOADED_CLASS_FILE
+ static final String PRELOADED_CLASS_FILE
= "frameworks/base/preloaded-classes";
/**
* Long running services. These are restricted in their contribution to the
* preloader because their launch time is less critical.
*/
+ // TODO: Generate this automatically from package manager.
private static final Set<String> SERVICES = new HashSet<String>(Arrays.asList(
- "system_server",
- "com.google.process.content",
- "android.process.media",
- "com.google.process.gapps"
+ "system_server",
+ "com.google.process.content",
+ "android.process.media",
+ "com.android.phone",
+ "com.google.android.apps.maps.FriendService",
+ "com.google.android.apps.maps.LocationFriendService",
+ "com.google.android.googleapps",
+ "com.google.process.gapps",
+ "android.tts"
));
/**
@@ -63,24 +69,15 @@
));
/**
- * Returns the path/file name of the preloaded classes file that will be written
- * by WritePreloadedClassFile.
- */
- public static String getPreloadedClassFileName() {
- return PRELOADED_CLASS_FILE;
- }
-
- /**
- * Reports if the given process name is a "long running" process or service
+ * Returns true if the given process name is a "long running" process or
+ * service.
*/
public static boolean isService(String processName) {
return SERVICES.contains(processName);
}
-
- /**
- * Reports if the given class should never be preloaded
- */
- public static boolean isPreloadableClass(String className) {
- return !EXCLUDED_CLASSES.contains(className);
+
+ /**Reports if the given class should be preloaded. */
+ public static boolean isPreloadable(LoadedClass clazz) {
+ return clazz.systemClass && !EXCLUDED_CLASSES.contains(clazz.name);
}
}
diff --git a/tools/preload/PrintCsv.java b/tools/preload/PrintCsv.java
index 62f4271..1820830 100644
--- a/tools/preload/PrintCsv.java
+++ b/tools/preload/PrintCsv.java
@@ -18,9 +18,12 @@
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.BufferedInputStream;
+import java.io.Writer;
+import java.io.PrintStream;
import java.util.Set;
import java.util.HashSet;
import java.util.TreeSet;
+import java.util.Iterator;
/**
* Prints raw information in CSV format.
@@ -36,71 +39,89 @@
Root root = Root.fromFile(args[0]);
- System.out.println("Name"
- + ",Preloaded"
- + ",Median Load Time (us)"
- + ",Median Init Time (us)"
- + ",Process Names"
- + ",Load Count"
- + ",Init Count");
-// + ",Managed Heap (B)"
-// + ",Native Heap (B)"
-// + ",Managed Pages (kB)"
-// + ",Native Pages (kB)"
-// + ",Other Pages (kB)");
+ printHeaders(System.out);
- MemoryUsage baseline = root.baseline;
+ MemoryUsage baseline = MemoryUsage.baseline();
for (LoadedClass loadedClass : root.loadedClasses.values()) {
if (!loadedClass.systemClass) {
continue;
}
- System.out.print(loadedClass.name);
- System.out.print(',');
- System.out.print(loadedClass.preloaded);
- System.out.print(',');
- System.out.print(loadedClass.medianLoadTimeMicros());
- System.out.print(',');
- System.out.print(loadedClass.medianInitTimeMicros());
- System.out.print(',');
- System.out.print('"');
-
- Set<String> procNames = new TreeSet<String>();
- for (Operation op : loadedClass.loads)
- procNames.add(op.process.name);
- for (Operation op : loadedClass.initializations)
- procNames.add(op.process.name);
- for (String name : procNames) {
- System.out.print(name + "\n");
- }
-
- System.out.print('"');
- System.out.print(',');
- System.out.print(loadedClass.loads.size());
- System.out.print(',');
- System.out.print(loadedClass.initializations.size());
-/*
- if (loadedClass.memoryUsage.isAvailable()) {
- MemoryUsage subtracted
- = loadedClass.memoryUsage.subtract(baseline);
-
- System.out.print(',');
- System.out.print(subtracted.javaHeapSize());
- System.out.print(',');
- System.out.print(subtracted.nativeHeapSize);
- System.out.print(',');
- System.out.print(subtracted.javaPagesInK());
- System.out.print(',');
- System.out.print(subtracted.nativePagesInK());
- System.out.print(',');
- System.out.print(subtracted.otherPagesInK());
-
- } else {
- System.out.print(",n/a,n/a,n/a,n/a,n/a");
- }
-*/
- System.out.println();
+ printRow(System.out, baseline, loadedClass);
}
}
+
+ static void printHeaders(PrintStream out) {
+ out.println("Name"
+ + ",Preloaded"
+ + ",Median Load Time (us)"
+ + ",Median Init Time (us)"
+ + ",Process Names"
+ + ",Load Count"
+ + ",Init Count"
+ + ",Managed Heap (B)"
+ + ",Native Heap (B)"
+ + ",Managed Pages (kB)"
+ + ",Native Pages (kB)"
+ + ",Other Pages (kB)");
+ }
+
+ static void printRow(PrintStream out, MemoryUsage baseline,
+ LoadedClass loadedClass) {
+ out.print(loadedClass.name);
+ out.print(',');
+ out.print(loadedClass.preloaded);
+ out.print(',');
+ out.print(loadedClass.medianLoadTimeMicros());
+ out.print(',');
+ out.print(loadedClass.medianInitTimeMicros());
+ out.print(',');
+ out.print('"');
+
+ Set<String> procNames = new TreeSet<String>();
+ for (Operation op : loadedClass.loads)
+ procNames.add(op.process.name);
+ for (Operation op : loadedClass.initializations)
+ procNames.add(op.process.name);
+
+ if (procNames.size() <= 3) {
+ for (String name : procNames) {
+ out.print(name + "\n");
+ }
+ } else {
+ Iterator<String> i = procNames.iterator();
+ out.print(i.next() + "\n");
+ out.print(i.next() + "\n");
+ out.print("...and " + (procNames.size() - 2)
+ + " others.");
+ }
+
+ out.print('"');
+ out.print(',');
+ out.print(loadedClass.loads.size());
+ out.print(',');
+ out.print(loadedClass.initializations.size());
+
+ if (loadedClass.memoryUsage.isAvailable()) {
+ MemoryUsage subtracted
+ = loadedClass.memoryUsage.subtract(baseline);
+
+ out.print(',');
+ out.print(subtracted.javaHeapSize());
+ out.print(',');
+ out.print(subtracted.nativeHeapSize);
+ out.print(',');
+ out.print(subtracted.javaPagesInK());
+ out.print(',');
+ out.print(subtracted.nativePagesInK());
+ out.print(',');
+ out.print(subtracted.otherPagesInK());
+
+ } else {
+ out.print(",n/a,n/a,n/a,n/a,n/a");
+ }
+
+ out.println();
+ }
}
diff --git a/tools/preload/PrintHtmlDiff.java b/tools/preload/PrintHtmlDiff.java
new file mode 100644
index 0000000..b101c85
--- /dev/null
+++ b/tools/preload/PrintHtmlDiff.java
@@ -0,0 +1,142 @@
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.FileReader;
+import java.io.BufferedReader;
+import java.io.PrintStream;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * Prints HTML containing removed and added files.
+ */
+public class PrintHtmlDiff {
+
+ private static final String OLD_PRELOADED_CLASSES
+ = "old-preloaded-classes";
+
+ public static void main(String[] args) throws IOException,
+ ClassNotFoundException {
+ Root root = Root.fromFile(args[0]);
+
+ BufferedReader oldClasses = new BufferedReader(
+ new FileReader(OLD_PRELOADED_CLASSES));
+
+ // Classes loaded implicitly by the zygote.
+ Set<LoadedClass> zygote = new HashSet<LoadedClass>();
+ for (Proc proc : root.processes.values()) {
+ if (proc.name.equals("zygote")) {
+ for (Operation op : proc.operations) {
+ zygote.add(op.loadedClass);
+ }
+ break;
+ }
+ }
+
+ Set<LoadedClass> removed = new TreeSet<LoadedClass>();
+ Set<LoadedClass> added = new TreeSet<LoadedClass>();
+
+ for (LoadedClass loadedClass : root.loadedClasses.values()) {
+ if (loadedClass.preloaded && !zygote.contains(loadedClass)) {
+ added.add(loadedClass);
+ }
+ }
+
+ String line;
+ while ((line = oldClasses.readLine()) != null) {
+ line = line.trim();
+ LoadedClass clazz = root.loadedClasses.get(line);
+ if (clazz != null) {
+ added.remove(clazz);
+ if (!clazz.preloaded) removed.add(clazz);
+ }
+ }
+
+ PrintStream out = System.out;
+
+ out.println("<html><body>");
+ out.println("<style>");
+ out.println("a, th, td, h2 { font-family: arial }");
+ out.println("th, td { font-size: small }");
+ out.println("</style>");
+ out.println("<script src=\"sorttable.js\"></script>");
+ out.println("<p><a href=\"#removed\">Removed</a>");
+ out.println("<a name=\"added\"/><h2>Added</h2>");
+ printTable(out, root.baseline, added);
+ out.println("<a name=\"removed\"/><h2>Removed</h2>");
+ printTable(out, root.baseline, removed);
+ out.println("</body></html>");
+ }
+
+ static void printTable(PrintStream out, MemoryUsage baseline,
+ Iterable<LoadedClass> classes) {
+ out.println("<table border=\"1\" cellpadding=\"5\""
+ + " class=\"sortable\">");
+
+ out.println("<thead><tr>");
+ out.println("<th>Name</th>");
+ out.println("<th>Load Time (us)</th>");
+ out.println("<th>Loaded By</th>");
+ out.println("<th>Heap (B)</th>");
+ out.println("<th>Pages</th>");
+ out.println("</tr></thead>");
+
+ for (LoadedClass clazz : classes) {
+ out.println("<tr>");
+ out.println("<td>" + clazz.name + "</td>");
+ out.println("<td>" + clazz.medianTimeMicros() + "</td>");
+
+ 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>");
+
+ if (clazz.memoryUsage.isAvailable()) {
+ MemoryUsage subtracted
+ = clazz.memoryUsage.subtract(baseline);
+
+ out.println("<td>" + (subtracted.javaHeapSize()
+ + subtracted.nativeHeapSize) + "</td>");
+ out.println("<td>" + subtracted.totalPages() + "</td>");
+ } else {
+ for (int i = 0; i < 2; i++) {
+ out.println("<td>n/a</td>");
+ }
+ }
+
+ out.println("</tr>");
+ }
+
+ out.println("</table>");
+ }
+}
diff --git a/tools/preload/Proc.java b/tools/preload/Proc.java
index 66e04dc..2105021 100644
--- a/tools/preload/Proc.java
+++ b/tools/preload/Proc.java
@@ -14,13 +14,11 @@
* limitations under the License.
*/
-import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Map;
import java.util.HashMap;
-import java.util.Collections;
import java.io.Serializable;
/**
@@ -30,11 +28,6 @@
private static final long serialVersionUID = 0;
- /**
- * Default percentage of time to cut off of app class loading times.
- */
- static final int PERCENTAGE_TO_PRELOAD = 75;
-
/** Parent process. */
final Proc parent;
@@ -80,72 +73,11 @@
}
/**
- * Returns the percentage of time we should cut by preloading for this
- * app.
+ * Returns true if this process comes from the zygote.
*/
- int percentageToPreload() {
- return PERCENTAGE_TO_PRELOAD;
- }
-
- /**
- * Returns a list of classes which should be preloaded.
- */
- List<LoadedClass> highestRankedClasses() {
- if (!isApplication() || Policy.isService(this.name)) {
- return Collections.emptyList();
- }
-
- // Sort by rank.
- Operation[] ranked = new Operation[operations.size()];
- ranked = operations.toArray(ranked);
- Arrays.sort(ranked, new ClassRank());
-
- // The percentage of time to save by preloading.
- int timeToSave = totalTimeMicros() * percentageToPreload() / 100;
- int timeSaved = 0;
-
- int count = 0;
- List<LoadedClass> highest = new ArrayList<LoadedClass>();
- for (Operation operation : ranked) {
- if (timeSaved >= timeToSave || count++ > 100) {
- break;
- }
-
- if (!Policy.isPreloadableClass(operation.loadedClass.name)) {
- continue;
- }
-
- if (!operation.loadedClass.systemClass) {
- continue;
- }
-
- highest.add(operation.loadedClass);
- timeSaved += operation.medianExclusiveTimeMicros();
- }
-
- return highest;
- }
-
- /**
- * Total time spent class loading and initializing.
- */
- int totalTimeMicros() {
- int totalTime = 0;
- for (Operation operation : operations) {
- totalTime += operation.medianExclusiveTimeMicros();
- }
- return totalTime;
- }
-
- /**
- * Returns true if this process is an app.
- */
- public boolean isApplication() {
- if (name.equals("com.android.development")) {
- return false;
- }
-
- return parent != null && parent.name.equals("zygote");
+ public boolean fromZygote() {
+ return parent != null && parent.name.equals("zygote")
+ && !name.equals("com.android.development");
}
/**
diff --git a/tools/preload/Root.java b/tools/preload/Root.java
index 949f9b7..0bc29bf 100644
--- a/tools/preload/Root.java
+++ b/tools/preload/Root.java
@@ -46,7 +46,7 @@
final Map<String, LoadedClass> loadedClasses
= new HashMap<String, LoadedClass>();
- final MemoryUsage baseline = MemoryUsage.baseline();
+ MemoryUsage baseline = MemoryUsage.baseline();
/**
* Records class loads and initializations.
diff --git a/tools/preload/WritePreloadedClassFile.java b/tools/preload/WritePreloadedClassFile.java
index b209af0..96c539b 100644
--- a/tools/preload/WritePreloadedClassFile.java
+++ b/tools/preload/WritePreloadedClassFile.java
@@ -24,12 +24,18 @@
import java.util.TreeSet;
/**
- * Writes /frameworks/base/preloaded-classes. Also updates LoadedClass.preloaded
- * fields and writes over compiled log file.
+ * Writes /frameworks/base/preloaded-classes. Also updates
+ * {@link LoadedClass#preloaded} fields and writes over compiled log file.
*/
public class WritePreloadedClassFile {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
+ /**
+ * Preload any class that take longer to load than MIN_LOAD_TIME_MICROS us.
+ */
+ static final int MIN_LOAD_TIME_MICROS = 1250;
+
+ public static void main(String[] args) throws IOException,
+ ClassNotFoundException {
if (args.length != 1) {
System.err.println("Usage: WritePreloadedClassFile [compiled log]");
System.exit(-1);
@@ -44,48 +50,64 @@
// Open preloaded-classes file for output.
Writer out = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream(Policy.getPreloadedClassFileName()),
+ new FileOutputStream(Policy.PRELOADED_CLASS_FILE),
Charset.forName("US-ASCII")));
- out.write("# Classes which are preloaded by com.android.internal.os.ZygoteInit.\n");
- out.write("# Automatically generated by /frameworks/base/tools/preload.\n");
- out.write("# percent=" + Proc.PERCENTAGE_TO_PRELOAD
- + ", weight=" + ClassRank.SEQUENCE_WEIGHT
- + ", bucket_size=" + ClassRank.BUCKET_SIZE
- + "\n");
+ out.write("# Classes which are preloaded by"
+ + " com.android.internal.os.ZygoteInit.\n");
+ out.write("# Automatically generated by frameworks/base/tools/preload/"
+ + WritePreloadedClassFile.class.getSimpleName() + ".java.\n");
+ out.write("# MIN_LOAD_TIME_MICROS=" + MIN_LOAD_TIME_MICROS + "\n");
+ /*
+ * The set of classes to preload. We preload a class if:
+ *
+ * a) it's loaded in the bootclasspath (i.e., is a system class)
+ * b) it takes > MIN_LOAD_TIME_MICROS us to load, and
+ * c) it's loaded by more than one process, or it's loaded by an
+ * application (i.e., not a long running service)
+ */
Set<LoadedClass> toPreload = new TreeSet<LoadedClass>();
- // Preload all classes that were loaded by at least 2 apps, if both
- // apps run at the same time, they'll share memory.
+ // Preload classes that were loaded by at least 2 processes. Hopefully,
+ // the memory associated with these classes will be shared.
for (LoadedClass loadedClass : root.loadedClasses.values()) {
- if (!loadedClass.isPreloadable()) {
- continue;
- }
-
- Set<String> appNames = loadedClass.applicationNames();
-
- if (appNames.size() > 3) {
+ Set<String> names = loadedClass.processNames();
+ if (shouldPreload(loadedClass) && names.size() > 1) {
toPreload.add(loadedClass);
}
}
- // Try to make individual apps start faster by preloading slowest
- // classes.
+ int initialSize = toPreload.size();
+ System.out.println(initialSize
+ + " classses were loaded by more than one app.");
+
+ // Preload eligable classes from applications (not long-running
+ // services).
for (Proc proc : root.processes.values()) {
- toPreload.addAll(proc.highestRankedClasses());
+ if (proc.fromZygote() && !Policy.isService(proc.name)) {
+ for (Operation operation : proc.operations) {
+ LoadedClass loadedClass = operation.loadedClass;
+ if (shouldPreload(loadedClass)) {
+ toPreload.add(loadedClass);
+ }
+ }
+ }
}
- System.out.println(toPreload.size() + " classes will be preloaded.");
+ System.out.println("Added " + (toPreload.size() - initialSize)
+ + " more to speed up applications.");
- // Make classes that were already loaded by the zygote explicit.
+ System.out.println(toPreload.size()
+ + " total classes will be preloaded.");
+
+ // Make classes that were implicitly loaded by the zygote explicit.
// This adds minimal overhead but avoid confusion about classes not
// appearing in the list.
- addAllClassesFor("zygote", root, toPreload);
+ addAllClassesFrom("zygote", root, toPreload);
for (LoadedClass loadedClass : toPreload) {
- out.write(loadedClass.name);
- out.write('\n');
+ out.write(loadedClass.name + "\n");
}
out.close();
@@ -97,18 +119,26 @@
root.toFile(rootFile);
}
- private static void addAllClassesFor(String packageName, Root root,
- Set<LoadedClass> toPreload) {
+ private static void addAllClassesFrom(String processName, Root root,
+ Set<LoadedClass> toPreload) {
for (Proc proc : root.processes.values()) {
- if (proc.name.equals(packageName)) {
+ if (proc.name.equals(processName)) {
for (Operation operation : proc.operations) {
- // TODO: I'm not sure how the zygote loaded classes that
- // aren't supposed to be preloadable...
- if (operation.loadedClass.isPreloadable()) {
+ boolean preloadable
+ = Policy.isPreloadable(operation.loadedClass);
+ if (preloadable) {
toPreload.add(operation.loadedClass);
}
}
}
}
}
+
+ /**
+ * Returns true if the class should be preloaded.
+ */
+ private static boolean shouldPreload(LoadedClass clazz) {
+ return Policy.isPreloadable(clazz)
+ && clazz.medianTimeMicros() > MIN_LOAD_TIME_MICROS;
+ }
}
diff --git a/tools/preload/loadclass/LoadClass.java b/tools/preload/loadclass/LoadClass.java
index 471cc84..a71b6a8 100644
--- a/tools/preload/loadclass/LoadClass.java
+++ b/tools/preload/loadclass/LoadClass.java
@@ -35,7 +35,11 @@
if (args.length > 0) {
try {
+ long start = System.currentTimeMillis();
Class.forName(args[0]);
+ long elapsed = System.currentTimeMillis() - start;
+ Log.i("LoadClass", "Loaded " + args[0] + " in " + elapsed
+ + "ms.");
} catch (ClassNotFoundException e) {
Log.w("LoadClass", e);
return;
diff --git a/tools/preload/preload.ipr b/tools/preload/preload.ipr
index f78bf76..0c9621c 100644
--- a/tools/preload/preload.ipr
+++ b/tools/preload/preload.ipr
@@ -25,7 +25,28 @@
<option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
</component>
<component name="CodeStyleSettingsManager">
- <option name="PER_PROJECT_SETTINGS" />
+ <option name="PER_PROJECT_SETTINGS">
+ <value>
+ <ADDITIONAL_INDENT_OPTIONS fileType="java">
+ <option name="INDENT_SIZE" value="4" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ <ADDITIONAL_INDENT_OPTIONS fileType="xml">
+ <option name="INDENT_SIZE" value="4" />
+ <option name="CONTINUATION_INDENT_SIZE" value="8" />
+ <option name="TAB_SIZE" value="4" />
+ <option name="USE_TAB_CHARACTER" value="false" />
+ <option name="SMART_TABS" value="false" />
+ <option name="LABEL_INDENT_SIZE" value="0" />
+ <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+ </ADDITIONAL_INDENT_OPTIONS>
+ </value>
+ </option>
<option name="USE_PER_PROJECT_SETTINGS" value="false" />
</component>
<component name="CompilerConfiguration">
@@ -405,6 +426,7 @@
</component>
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Perforce" />
+ <mapping directory="/Volumes/Android/donut/frameworks/base" vcs="Git" />
</component>
<component name="VssConfiguration">
<option name="CLIENT_PATH" value="" />
diff --git a/tools/preload/sorttable.js b/tools/preload/sorttable.js
new file mode 100644
index 0000000..25bccb2
--- /dev/null
+++ b/tools/preload/sorttable.js
@@ -0,0 +1,493 @@
+/*
+ SortTable
+ version 2
+ 7th April 2007
+ Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
+
+ Instructions:
+ Download this file
+ 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
+
+ Thanks to many, many people for contributions and suggestions.
+ Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
+ This basically means: do what you want with it.
+*/
+
+
+var stIsIE = /*@cc_on!@*/false;
+
+sorttable = {
+ init: function() {
+ // quit if this function has already been called
+ if (arguments.callee.done) return;
+ // flag this function so we don't do the same thing twice
+ arguments.callee.done = true;
+ // kill the timer
+ if (_timer) clearInterval(_timer);
+
+ if (!document.createElement || !document.getElementsByTagName) return;
+
+ sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
+
+ forEach(document.getElementsByTagName('table'), function(table) {
+ if (table.className.search(/\bsortable\b/) != -1) {
+ sorttable.makeSortable(table);
+ }
+ });
+
+ },
+
+ makeSortable: function(table) {
+ if (table.getElementsByTagName('thead').length == 0) {
+ // table doesn't have a tHead. Since it should have, create one and
+ // put the first table row in it.
+ the = document.createElement('thead');
+ the.appendChild(table.rows[0]);
+ table.insertBefore(the,table.firstChild);
+ }
+ // Safari doesn't support table.tHead, sigh
+ if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
+
+ if (table.tHead.rows.length != 1) return; // can't cope with two header rows
+
+ // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
+ // "total" rows, for example). This is B&R, since what you're supposed
+ // to do is put them in a tfoot. So, if there are sortbottom rows,
+ // for backwards compatibility, move them to tfoot (creating it if needed).
+ sortbottomrows = [];
+ for (var i=0; i<table.rows.length; i++) {
+ if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
+ sortbottomrows[sortbottomrows.length] = table.rows[i];
+ }
+ }
+ if (sortbottomrows) {
+ if (table.tFoot == null) {
+ // table doesn't have a tfoot. Create one.
+ tfo = document.createElement('tfoot');
+ table.appendChild(tfo);
+ }
+ for (var i=0; i<sortbottomrows.length; i++) {
+ tfo.appendChild(sortbottomrows[i]);
+ }
+ delete sortbottomrows;
+ }
+
+ // work through each column and calculate its type
+ headrow = table.tHead.rows[0].cells;
+ for (var i=0; i<headrow.length; i++) {
+ // manually override the type with a sorttable_type attribute
+ if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
+ mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
+ if (mtch) { override = mtch[1]; }
+ if (mtch && typeof sorttable["sort_"+override] == 'function') {
+ headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
+ } else {
+ headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);
+ }
+ // make it clickable to sort
+ headrow[i].sorttable_columnindex = i;
+ headrow[i].sorttable_tbody = table.tBodies[0];
+ dean_addEvent(headrow[i],"click", function(e) {
+
+ if (this.className.search(/\bsorttable_sorted\b/) != -1) {
+ // if we're already sorted by this column, just
+ // reverse the table, which is quicker
+ sorttable.reverse(this.sorttable_tbody);
+ this.className = this.className.replace('sorttable_sorted',
+ 'sorttable_sorted_reverse');
+ this.removeChild(document.getElementById('sorttable_sortfwdind'));
+ sortrevind = document.createElement('span');
+ sortrevind.id = "sorttable_sortrevind";
+ sortrevind.innerHTML = stIsIE ? ' <font face="webdings">5</font>' : ' ▴';
+ this.appendChild(sortrevind);
+ return;
+ }
+ if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
+ // if we're already sorted by this column in reverse, just
+ // re-reverse the table, which is quicker
+ sorttable.reverse(this.sorttable_tbody);
+ this.className = this.className.replace('sorttable_sorted_reverse',
+ 'sorttable_sorted');
+ this.removeChild(document.getElementById('sorttable_sortrevind'));
+ sortfwdind = document.createElement('span');
+ sortfwdind.id = "sorttable_sortfwdind";
+ sortfwdind.innerHTML = stIsIE ? ' <font face="webdings">6</font>' : ' ▾';
+ this.appendChild(sortfwdind);
+ return;
+ }
+
+ // remove sorttable_sorted classes
+ theadrow = this.parentNode;
+ forEach(theadrow.childNodes, function(cell) {
+ if (cell.nodeType == 1) { // an element
+ cell.className = cell.className.replace('sorttable_sorted_reverse','');
+ cell.className = cell.className.replace('sorttable_sorted','');
+ }
+ });
+ sortfwdind = document.getElementById('sorttable_sortfwdind');
+ if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
+ sortrevind = document.getElementById('sorttable_sortrevind');
+ if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
+
+ this.className += ' sorttable_sorted';
+ sortfwdind = document.createElement('span');
+ sortfwdind.id = "sorttable_sortfwdind";
+ sortfwdind.innerHTML = stIsIE ? ' <font face="webdings">6</font>' : ' ▾';
+ this.appendChild(sortfwdind);
+
+ // build an array to sort. This is a Schwartzian transform thing,
+ // i.e., we "decorate" each row with the actual sort key,
+ // sort based on the sort keys, and then put the rows back in order
+ // which is a lot faster because you only do getInnerText once per row
+ row_array = [];
+ col = this.sorttable_columnindex;
+ rows = this.sorttable_tbody.rows;
+ for (var j=0; j<rows.length; j++) {
+ row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
+ }
+ /* If you want a stable sort, uncomment the following line */
+ //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
+ /* and comment out this one */
+ row_array.sort(this.sorttable_sortfunction);
+
+ tb = this.sorttable_tbody;
+ for (var j=0; j<row_array.length; j++) {
+ tb.appendChild(row_array[j][1]);
+ }
+
+ delete row_array;
+ });
+ }
+ }
+ },
+
+ guessType: function(table, column) {
+ // guess the type of a column based on its first non-blank row
+ sortfn = sorttable.sort_alpha;
+ for (var i=0; i<table.tBodies[0].rows.length; i++) {
+ text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
+ if (text != '') {
+ if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
+ return sorttable.sort_numeric;
+ }
+ // check for a date: dd/mm/yyyy or dd/mm/yy
+ // can have / or . or - as separator
+ // can be mm/dd as well
+ possdate = text.match(sorttable.DATE_RE)
+ if (possdate) {
+ // looks like a date
+ first = parseInt(possdate[1]);
+ second = parseInt(possdate[2]);
+ if (first > 12) {
+ // definitely dd/mm
+ return sorttable.sort_ddmm;
+ } else if (second > 12) {
+ return sorttable.sort_mmdd;
+ } else {
+ // looks like a date, but we can't tell which, so assume
+ // that it's dd/mm (English imperialism!) and keep looking
+ sortfn = sorttable.sort_ddmm;
+ }
+ }
+ }
+ }
+ return sortfn;
+ },
+
+ getInnerText: function(node) {
+ // gets the text we want to use for sorting for a cell.
+ // strips leading and trailing whitespace.
+ // this is *not* a generic getInnerText function; it's special to sorttable.
+ // for example, you can override the cell text with a customkey attribute.
+ // it also gets .value for <input> fields.
+
+ hasInputs = (typeof node.getElementsByTagName == 'function') &&
+ node.getElementsByTagName('input').length;
+
+ if (node.getAttribute("sorttable_customkey") != null) {
+ return node.getAttribute("sorttable_customkey");
+ }
+ else if (typeof node.textContent != 'undefined' && !hasInputs) {
+ return node.textContent.replace(/^\s+|\s+$/g, '');
+ }
+ else if (typeof node.innerText != 'undefined' && !hasInputs) {
+ return node.innerText.replace(/^\s+|\s+$/g, '');
+ }
+ else if (typeof node.text != 'undefined' && !hasInputs) {
+ return node.text.replace(/^\s+|\s+$/g, '');
+ }
+ else {
+ switch (node.nodeType) {
+ case 3:
+ if (node.nodeName.toLowerCase() == 'input') {
+ return node.value.replace(/^\s+|\s+$/g, '');
+ }
+ case 4:
+ return node.nodeValue.replace(/^\s+|\s+$/g, '');
+ break;
+ case 1:
+ case 11:
+ var innerText = '';
+ for (var i = 0; i < node.childNodes.length; i++) {
+ innerText += sorttable.getInnerText(node.childNodes[i]);
+ }
+ return innerText.replace(/^\s+|\s+$/g, '');
+ break;
+ default:
+ return '';
+ }
+ }
+ },
+
+ reverse: function(tbody) {
+ // reverse the rows in a tbody
+ newrows = [];
+ for (var i=0; i<tbody.rows.length; i++) {
+ newrows[newrows.length] = tbody.rows[i];
+ }
+ for (var i=newrows.length-1; i>=0; i--) {
+ tbody.appendChild(newrows[i]);
+ }
+ delete newrows;
+ },
+
+ /* sort functions
+ each sort function takes two parameters, a and b
+ you are comparing a[0] and b[0] */
+ sort_numeric: function(a,b) {
+ aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
+ if (isNaN(aa)) aa = 0;
+ bb = parseFloat(b[0].replace(/[^0-9.-]/g,''));
+ if (isNaN(bb)) bb = 0;
+ return aa-bb;
+ },
+ sort_alpha: function(a,b) {
+ if (a[0]==b[0]) return 0;
+ if (a[0]<b[0]) return -1;
+ return 1;
+ },
+ sort_ddmm: function(a,b) {
+ mtch = a[0].match(sorttable.DATE_RE);
+ y = mtch[3]; m = mtch[2]; d = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt1 = y+m+d;
+ mtch = b[0].match(sorttable.DATE_RE);
+ y = mtch[3]; m = mtch[2]; d = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt2 = y+m+d;
+ if (dt1==dt2) return 0;
+ if (dt1<dt2) return -1;
+ return 1;
+ },
+ sort_mmdd: function(a,b) {
+ mtch = a[0].match(sorttable.DATE_RE);
+ y = mtch[3]; d = mtch[2]; m = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt1 = y+m+d;
+ mtch = b[0].match(sorttable.DATE_RE);
+ y = mtch[3]; d = mtch[2]; m = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt2 = y+m+d;
+ if (dt1==dt2) return 0;
+ if (dt1<dt2) return -1;
+ return 1;
+ },
+
+ shaker_sort: function(list, comp_func) {
+ // A stable sort function to allow multi-level sorting of data
+ // see: http://en.wikipedia.org/wiki/Cocktail_sort
+ // thanks to Joseph Nahmias
+ var b = 0;
+ var t = list.length - 1;
+ var swap = true;
+
+ while(swap) {
+ swap = false;
+ for(var i = b; i < t; ++i) {
+ if ( comp_func(list[i], list[i+1]) > 0 ) {
+ var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
+ swap = true;
+ }
+ } // for
+ t--;
+
+ if (!swap) break;
+
+ for(var i = t; i > b; --i) {
+ if ( comp_func(list[i], list[i-1]) < 0 ) {
+ var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
+ swap = true;
+ }
+ } // for
+ b++;
+
+ } // while(swap)
+ }
+}
+
+/* ******************************************************************
+ Supporting functions: bundled here to avoid depending on a library
+ ****************************************************************** */
+
+// Dean Edwards/Matthias Miller/John Resig
+
+/* for Mozilla/Opera9 */
+if (document.addEventListener) {
+ document.addEventListener("DOMContentLoaded", sorttable.init, false);
+}
+
+/* for Internet Explorer */
+/*@cc_on @*/
+/*@if (@_win32)
+ document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
+ var script = document.getElementById("__ie_onload");
+ script.onreadystatechange = function() {
+ if (this.readyState == "complete") {
+ sorttable.init(); // call the onload handler
+ }
+ };
+/*@end @*/
+
+/* for Safari */
+if (/WebKit/i.test(navigator.userAgent)) { // sniff
+ var _timer = setInterval(function() {
+ if (/loaded|complete/.test(document.readyState)) {
+ sorttable.init(); // call the onload handler
+ }
+ }, 10);
+}
+
+/* for other browsers */
+window.onload = sorttable.init;
+
+// written by Dean Edwards, 2005
+// with input from Tino Zijdel, Matthias Miller, Diego Perini
+
+// http://dean.edwards.name/weblog/2005/10/add-event/
+
+function dean_addEvent(element, type, handler) {
+ if (element.addEventListener) {
+ element.addEventListener(type, handler, false);
+ } else {
+ // assign each event handler a unique ID
+ if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
+ // create a hash table of event types for the element
+ if (!element.events) element.events = {};
+ // create a hash table of event handlers for each element/event pair
+ var handlers = element.events[type];
+ if (!handlers) {
+ handlers = element.events[type] = {};
+ // store the existing event handler (if there is one)
+ if (element["on" + type]) {
+ handlers[0] = element["on" + type];
+ }
+ }
+ // store the event handler in the hash table
+ handlers[handler.$$guid] = handler;
+ // assign a global event handler to do all the work
+ element["on" + type] = handleEvent;
+ }
+};
+// a counter used to create unique IDs
+dean_addEvent.guid = 1;
+
+function removeEvent(element, type, handler) {
+ if (element.removeEventListener) {
+ element.removeEventListener(type, handler, false);
+ } else {
+ // delete the event handler from the hash table
+ if (element.events && element.events[type]) {
+ delete element.events[type][handler.$$guid];
+ }
+ }
+};
+
+function handleEvent(event) {
+ var returnValue = true;
+ // grab the event object (IE uses a global event object)
+ event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
+ // get a reference to the hash table of event handlers
+ var handlers = this.events[event.type];
+ // execute each event handler
+ for (var i in handlers) {
+ this.$$handleEvent = handlers[i];
+ if (this.$$handleEvent(event) === false) {
+ returnValue = false;
+ }
+ }
+ return returnValue;
+};
+
+function fixEvent(event) {
+ // add W3C standard event methods
+ event.preventDefault = fixEvent.preventDefault;
+ event.stopPropagation = fixEvent.stopPropagation;
+ return event;
+};
+fixEvent.preventDefault = function() {
+ this.returnValue = false;
+};
+fixEvent.stopPropagation = function() {
+ this.cancelBubble = true;
+}
+
+// Dean's forEach: http://dean.edwards.name/base/forEach.js
+/*
+ forEach, version 1.0
+ Copyright 2006, Dean Edwards
+ License: http://www.opensource.org/licenses/mit-license.php
+*/
+
+// array-like enumeration
+if (!Array.forEach) { // mozilla already supports this
+ Array.forEach = function(array, block, context) {
+ for (var i = 0; i < array.length; i++) {
+ block.call(context, array[i], i, array);
+ }
+ };
+}
+
+// generic enumeration
+Function.prototype.forEach = function(object, block, context) {
+ for (var key in object) {
+ if (typeof this.prototype[key] == "undefined") {
+ block.call(context, object[key], key, object);
+ }
+ }
+};
+
+// character enumeration
+String.forEach = function(string, block, context) {
+ Array.forEach(string.split(""), function(chr, index) {
+ block.call(context, chr, index, string);
+ });
+};
+
+// globally resolve forEach enumeration
+var forEach = function(object, block, context) {
+ if (object) {
+ var resolve = Object; // default
+ if (object instanceof Function) {
+ // functions have a "length" property
+ resolve = Function;
+ } else if (object.forEach instanceof Function) {
+ // the object implements a custom forEach method so use that
+ object.forEach(block, context);
+ return;
+ } else if (typeof object == "string") {
+ // the object is a string
+ resolve = String;
+ } else if (typeof object.length == "number") {
+ // the object is array-like
+ resolve = Array;
+ }
+ resolve.forEach(object, block, context);
+ }
+};
+