From 72b1f379d5c97c8ff31d2201e78215af777d6bda Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Queru Date: Mon, 31 Aug 2009 09:17:57 -0700 Subject: [PATCH] donut snapshot --- Android.mk | 12 +- api/4.xml | 18626 +++++++++++++++- api/current.xml | 2880 +-- core/java/android/app/Activity.java | 2 +- core/java/android/app/ActivityThread.java | 8 + core/java/android/app/SearchDialog.java | 17 +- core/java/android/app/SearchManager.java | 205 +- core/java/android/app/SuggestionsAdapter.java | 39 + .../android/appwidget/AppWidgetHostView.java | 49 +- .../android/content/res/AssetManager.java | 5 + .../net/SSLCertificateSocketFactory.java | 34 +- .../net/http/CertificateChainValidator.java | 34 +- core/java/android/os/Build.java | 11 +- core/java/android/provider/Settings.java | 12 + .../android/server/search/Searchables.java | 38 +- .../android/speech/RecognitionResult.java | 24 +- .../java/android/speech/tts/TextToSpeech.java | 30 +- core/java/android/util/DisplayMetrics.java | 3 + core/java/android/view/ViewRoot.java | 5 + .../android/widget/AutoCompleteTextView.java | 10 + core/java/android/widget/ProgressBar.java | 6 +- core/java/android/widget/TextView.java | 1 + .../android/widget/ZoomButtonsController.java | 1 - .../com/android/internal/os/ZygoteInit.java | 9 + core/jni/android_os_Debug.cpp | 10 +- core/jni/android_util_AssetManager.cpp | 18 + core/jni/android_util_Process.cpp | 19 +- core/res/AndroidManifest.xml | 1 - core/res/res/drawable/sym_def_app_icon.png | Bin 3180 -> 4499 bytes core/res/res/values-cs/strings.xml | 48 +- .../res/res/values-de/donottranslate-cldr.xml | 66 +- core/res/res/values-de/strings.xml | 6 +- core/res/res/values-es/strings.xml | 6 +- core/res/res/values-fr/strings.xml | 6 +- core/res/res/values-it/strings.xml | 6 +- core/res/res/values-ja/strings.xml | 8 +- core/res/res/values-nl/strings.xml | 6 +- core/res/res/values-pl/strings.xml | 6 +- core/res/res/values-zh-rTW/strings.xml | 10 +- core/res/res/values/attrs.xml | 10 +- core/res/res/values/attrs_manifest.xml | 4 +- core/res/res/values/public.xml | 110 +- docs/html/guide/developing/device.jd | 222 +- docs/html/guide/guide_toc.cs | 21 +- docs/html/guide/samples/images/HomeSample.png | Bin 0 -> 44416 bytes docs/html/guide/samples/images/JetBoy.png | Bin 0 -> 53801 bytes docs/html/guide/samples/images/Snake.png | Bin 0 -> 5445 bytes .../guide/samples/images/SoftKeyboard.png | Bin 0 -> 13426 bytes .../samples/images/sample_lunarlander.png | Bin 0 -> 27514 bytes .../html/guide/samples/images/sample_note.png | Bin 0 -> 6011 bytes .../guide/samples/images/sample_notepad.png | Bin 0 -> 6530 bytes docs/html/guide/samples/index.jd | 19 +- .../guide/topics/manifest/manifest-intro.jd | 11 +- .../manifest/path-permission-element.jd | 104 + .../guide/topics/manifest/provider-element.jd | 4 +- .../manifest/supports-screens-element.jd | 123 + .../manifest/uses-configuration-element.jd | 9 +- .../topics/manifest/uses-feature-element.jd | 52 + .../guide/topics/manifest/uses-sdk-element.jd | 88 +- include/utils/Asset.h | 12 + keystore/MODULE_LICENSE_APACHE2 | 0 keystore/NOTICE | 190 + libs/audioflinger/AudioFlinger.cpp | 5 +- libs/utils/Asset.cpp | 58 +- media/java/android/media/ExifInterface.java | 5 +- media/libdrm/mobile1/Android.mk | 17 +- .../include/objmng/drm_rights_manager.h | 6 +- media/libdrm/mobile1/src/objmng/drm_api.c | 11 +- .../mobile1/src/objmng/drm_rights_manager.c | 14 +- .../performance/MediaPlayerPerformance.java | 39 +- .../TtsService/jni/android_tts_SynthProxy.cpp | 96 +- .../src/android/tts/TtsService.java | 97 +- .../com/android/server/vpn/VpnService.java | 85 +- preloaded-classes | 1371 +- .../com/android/server/AppWidgetService.java | 3 +- .../server/LocationManagerService.java | 31 +- .../java/com/android/server/ProcessStats.java | 74 +- .../java/com/android/server/SystemServer.java | 5 - .../server/am/ActivityManagerService.java | 259 +- .../com/android/server/am/HistoryRecord.java | 3 +- .../com/android/server/am/ProcessRecord.java | 2 + .../com/android/server/am/ServiceRecord.java | 9 +- .../gsm/GsmDataConnectionTracker.java | 44 +- .../telephony/gsm/GsmServiceStateTracker.java | 22 +- .../internal/telephony/gsm/SmsMessage.java | 8 +- .../widget/AutoCompleteTextViewCallbacks.java | 5 +- .../widget/AutoCompleteTextViewPopup.java | 8 +- tools/aapt/Command.cpp | 5 + .../bridge/src/android/graphics/Bitmap.java | 32 +- .../graphics/Canvas.java} | 299 +- .../bridge/src/android/graphics/Matrix.java | 55 +- .../bridge/src/android/os/ServiceManager.java | 72 + .../accessibility/AccessibilityManager.java | 95 + .../com/android/layoutlib/bridge/Bridge.java | 46 +- .../layoutlib/bridge/BridgeConstants.java | 5 +- .../layoutlib/bridge/BridgeContext.java | 228 +- .../layoutlib/bridge/BridgeResources.java | 142 +- .../layoutlib/bridge/NinePatchDrawable.java | 26 +- .../android/tools/layoutlib/create/Main.java | 23 +- tools/preload/20090811.compiled | Bin 0 -> 15943336 bytes tools/preload/Android.mk | 2 +- tools/preload/ClassRank.java | 53 - tools/preload/LoadedClass.java | 65 +- tools/preload/MemoryUsage.java | 37 +- tools/preload/Policy.java | 91 +- tools/preload/PrintCsv.java | 114 +- tools/preload/PrintHtmlDiff.java | 142 + tools/preload/Proc.java | 101 +- tools/preload/Root.java | 2 +- tools/preload/WritePreloadedClassFile.java | 146 +- tools/preload/loadclass/LoadClass.java | 4 + tools/preload/preload.iml | 5 +- tools/preload/preload.ipr | 68 +- tools/preload/sorttable.js | 493 + 114 files changed, 23177 insertions(+), 4707 deletions(-) create mode 100644 docs/html/guide/samples/images/HomeSample.png create mode 100644 docs/html/guide/samples/images/JetBoy.png create mode 100644 docs/html/guide/samples/images/Snake.png create mode 100644 docs/html/guide/samples/images/SoftKeyboard.png create mode 100644 docs/html/guide/samples/images/sample_lunarlander.png create mode 100644 docs/html/guide/samples/images/sample_note.png create mode 100644 docs/html/guide/samples/images/sample_notepad.png create mode 100644 docs/html/guide/topics/manifest/path-permission-element.jd create mode 100644 docs/html/guide/topics/manifest/supports-screens-element.jd create mode 100644 docs/html/guide/topics/manifest/uses-feature-element.jd create mode 100644 keystore/MODULE_LICENSE_APACHE2 create mode 100644 keystore/NOTICE rename tools/layoutlib/bridge/src/{com/android/layoutlib/bridge/BridgeCanvas.java => android/graphics/Canvas.java} (89%) create mode 100644 tools/layoutlib/bridge/src/android/os/ServiceManager.java create mode 100644 tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java create mode 100644 tools/preload/20090811.compiled delete mode 100644 tools/preload/ClassRank.java create mode 100644 tools/preload/PrintHtmlDiff.java create mode 100644 tools/preload/sorttable.js diff --git a/Android.mk b/Android.mk index 5233f7242b2da..fd03c6d897dcf 100644 --- a/Android.mk +++ b/Android.mk @@ -332,7 +332,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \ -since ./frameworks/base/api/1.xml 1 \ -since ./frameworks/base/api/2.xml 2 \ -since ./frameworks/base/api/3.xml 3 \ - -since ./frameworks/base/api/current.xml Donut \ + -since ./frameworks/base/api/4.xml 4 \ -error 1 -error 2 -warning 3 -error 4 -error 6 -error 8 \ -overview $(LOCAL_PATH)/core/java/overview.html @@ -344,10 +344,18 @@ web_docs_sample_code_flags := \ -hdf android.hasSamples 1 \ -samplecode $(sample_dir)/ApiDemos \ guide/samples/ApiDemos "API Demos" \ + -samplecode $(sample_dir)/Home \ + guide/samples/Home "Home" \ + -samplecode $(sample_dir)/JetBoy \ + guide/samples/JetBoy "JetBoy" \ -samplecode $(sample_dir)/LunarLander \ guide/samples/LunarLander "Lunar Lander" \ -samplecode $(sample_dir)/NotePad \ - guide/samples/NotePad "Note Pad" + guide/samples/NotePad "Note Pad" \ + -samplecode $(sample_dir)/Snake \ + guide/samples/Snake "Snake" \ + -samplecode $(sample_dir)/SoftKeyboard \ + guide/samples/SoftKeyboard "Soft Keyboard" ## SDK version identifiers used in the published docs # major[.minor] version for current SDK. (full releases only) diff --git a/api/4.xml b/api/4.xml index c8a2e83fd1368..55d910508cca3 100644 --- a/api/4.xml +++ b/api/4.xml @@ -298,6 +298,17 @@ visibility="public" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20165,7 +21028,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -20262,6 +21125,39 @@ visibility="public" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -26709,6 +27721,17 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -52680,6 +56338,28 @@ deprecated="not deprecated" visibility="public" > + + + + + + + + + + @@ -52845,6 +56525,45 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -54897,6 +58635,36 @@ deprecated="not deprecated" visibility="public" > + + + + + + + + + + + + + + + + + + @@ -54961,6 +58729,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -63208,7 +67111,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -66119,6 +70022,17 @@ visibility="public" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -78173,6 +93476,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -95283,8 +112080,8 @@ native="false" synchronized="false" static="true" - final="false" - deprecated="not deprecated" + final="true" + deprecated="deprecated" visibility="public" > @@ -95294,8 +112091,8 @@ native="false" synchronized="false" static="false" - final="false" - deprecated="not deprecated" + final="true" + deprecated="deprecated" visibility="public" > @@ -95317,8 +112114,8 @@ native="false" synchronized="false" static="false" - final="false" - deprecated="not deprecated" + final="true" + deprecated="deprecated" visibility="public" > @@ -95338,8 +112135,8 @@ native="false" synchronized="false" static="false" - final="false" - deprecated="not deprecated" + final="true" + deprecated="deprecated" visibility="public" > @@ -95360,7 +112157,7 @@ value="1" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95371,7 +112168,7 @@ value="4" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95382,7 +112179,7 @@ value="3" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95393,7 +112190,7 @@ value="2" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95404,7 +112201,7 @@ value="0" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95415,7 +112212,7 @@ value="1" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95426,7 +112223,7 @@ value="5" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95437,7 +112234,7 @@ value="3" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95448,7 +112245,7 @@ value="7" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95458,14 +112255,14 @@ abstract="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95476,7 +112273,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95491,7 +112288,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95506,7 +112303,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95519,7 +112316,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95530,7 +112327,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95541,7 +112338,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95552,7 +112349,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95563,7 +112360,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95574,7 +112371,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95585,7 +112382,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95596,7 +112393,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95607,7 +112404,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95618,7 +112415,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95629,7 +112426,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95640,7 +112437,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95651,7 +112448,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95662,7 +112459,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95673,7 +112470,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95692,7 +112489,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95713,7 +112510,7 @@ synchronized="false" static="true" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95726,7 +112523,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95737,7 +112534,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95748,7 +112545,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95759,7 +112556,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95770,7 +112567,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95781,7 +112578,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95792,7 +112589,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95803,7 +112600,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95814,7 +112611,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95825,7 +112622,7 @@ synchronized="false" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95836,7 +112633,7 @@ value="3" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95847,7 +112644,7 @@ value="1" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95858,7 +112655,7 @@ value="2" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95869,7 +112666,7 @@ value="0" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95880,7 +112677,7 @@ value="140" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95891,7 +112688,7 @@ value="160" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95902,7 +112699,7 @@ value="153" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95912,7 +112709,7 @@ abstract="false" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95963,7 +112760,7 @@ value="null" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -95974,7 +112771,7 @@ value="null" static="false" final="false" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -96299,6 +113096,53 @@ visibility="public" > + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + @@ -111713,6 +128590,8 @@ deprecated="not deprecated" visibility="public" > + + @@ -114493,7 +131372,7 @@ value="true" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -114504,7 +131383,7 @@ value="false" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -114515,7 +131394,7 @@ value="false" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -114525,7 +131404,7 @@ volatile="false" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > @@ -114600,6 +131479,50 @@ visibility="public" > + + + + + + + + + + + + + + + + @@ -123007,6 +139972,17 @@ visibility="public" > + + + + + + + + + + @@ -123639,6 +140632,23 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -156273,6 +174452,17 @@ deprecated="not deprecated" visibility="public" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = getAdapterCount())) { mSearchDialog.cancel(); return true; } @@ -1751,6 +1759,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } return false; } + + private int getAdapterCount() { + final ListAdapter adapter = getAdapter(); + return adapter == null ? 0 : adapter.getCount(); + } } protected boolean handleBackKey(int keyCode, KeyEvent event) { diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index fd559d66cba1f..62faadc83de19 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -40,7 +40,7 @@ import java.util.List; * methods and the the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} * {@link android.content.Intent Intent}. This class does provide a basic * overview of search services and how to integrate them with your activities. - * If you do require direct access to the Search Manager, do not instantiate + * If you do require direct access to the SearchManager, do not instantiate * this class directly; instead, retrieve it through * {@link android.content.Context#getSystemService * context.getSystemService(Context.SEARCH_SERVICE)}. @@ -49,8 +49,7 @@ import java.util.List; *
    *
  1. Developer Guide *
  2. How Search Is Invoked - *
  3. Query-Search Applications - *
  4. Filter-Search Applications + *
  5. Implementing Search for Your App *
  6. Search Suggestions *
  7. Action Keys *
  8. Searchability Metadata @@ -62,37 +61,18 @@ import java.util.List; *

    Developer Guide

    * *

    The ability to search for user, system, or network based data is considered to be - * a core user-level feature of the android platform. At any time, the user should be + * a core user-level feature of the Android platform. At any time, the user should be * able to use a familiar command, button, or keystroke to invoke search, and the user - * should be able to search any data which is available to them. The goal is to make search - * appear to the user as a seamless, system-wide feature. + * should be able to search any data which is available to them. * - *

    In terms of implementation, there are three broad classes of Applications: - *

      - *
    1. Applications that are not inherently searchable
    2. - *
    3. Query-Search Applications
    4. - *
    5. Filter-Search Applications
    6. - *
    - *

    These categories, as well as related topics, are discussed in - * the sections below. + *

    To make search appear to the user as a seamless system-wide feature, the application + * framework centrally controls it, offering APIs to individual applications to control how they + * are searched. Applications can customize how search is invoked, how the search dialog looks, + * and what type of search results are available, including suggestions that are available as the + * user types. * - *

    Even if your application is not searchable, it can still support the invocation of - * search. Please review the section How Search Is Invoked - * for more information on how to support this. - * - *

    Many applications are searchable. These are - * the applications which can convert a query string into a list of results. - * Within this subset, applications can be grouped loosely into two families: - *

    • Query Search applications perform batch-mode searches - each query string is - * converted to a list of results.
    • - *
    • Filter Search applications provide live filter-as-you-type searches.
    - *

    Generally speaking, you would use query search for network-based data, and filter - * search for local data, but this is not a hard requirement and applications - * are free to use the model that fits them best (or invent a new model). - *

    It should be clear that the search implementation decouples "search - * invocation" from "searchable". This satisfies the goal of making search appear - * to be "universal". The user should be able to launch any search from - * almost any context. + *

    Even applications which are not searchable will by default support the invocation of + * search to trigger Quick Search Box, the system's 'global search'. * * *

    How Search Is Invoked

    @@ -100,14 +80,15 @@ import java.util.List; *

    Unless impossible or inapplicable, all applications should support * invoking the search UI. This means that when the user invokes the search command, * a search UI will be presented to them. The search command is currently defined as a menu - * item called "Search" (with an alphabetic shortcut key of "S"), or on some devices, a dedicated + * item called "Search" (with an alphabetic shortcut key of "S"), or on many devices, a dedicated * search button key. - *

    If your application is not inherently searchable, you can also allow the search UI - * to be invoked in a "web search" mode. If the user enters a search term and clicks the - * "Search" button, this will bring the browser to the front and will launch a web-based + *

    If your application is not inherently searchable, the default implementation will cause + * the search UI to be invoked in a "global search" mode known as Quick Search Box. As the user + * types, search suggestions from across the device and the web will be surfaced, and if they + * click the "Search" button, this will bring the browser to the front and will launch a web-based * search. The user will be able to click the "Back" button and return to your application. *

    In general this is implemented by your activity, or the {@link android.app.Activity Activity} - * base class, which captures the search command and invokes the Search Manager to + * base class, which captures the search command and invokes the SearchManager to * display and operate the search UI. You can also cause the search UI to be presented in response * to user keystrokes in your activity (for example, to instantly start filter searching while * viewing a list and typing any key). @@ -124,7 +105,7 @@ import java.util.List; * button or menu item - and invoking the search UI directly.

  9. *
  10. You can provide a type-to-search feature, in which search is invoked automatically * when the user enters any characters.
  11. - *
  12. Even if your application is not inherently searchable, you can allow web search, + *
  13. Even if your application is not inherently searchable, you can allow global search, * via the search key (or even via a search menu item). *
  14. You can disable search entirely. This should only be used in very rare circumstances, * as search is a system-wide feature and users will expect it to be available in all contexts.
  15. @@ -148,21 +129,23 @@ import java.util.List; * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); // search within your activity * setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL); // search using platform global search * - *

    How to enable web-based search. In addition to searching within your activity or - * application, you can also use the Search Manager to invoke a platform-global search, typically - * a web search. There are two ways to do this: + *

    How to enable global search with Quick Search Box. In addition to searching within + * your activity or application, you can also use the Search Manager to invoke a platform-global + * search, which uses Quick Search Box to search across the device and the web. There are two ways + * to do this: *

    • You can simply define "search" within your application or activity to mean global search. * This is described in more detail in the * Searchability Metadata section. Briefly, you will * add a single meta-data entry to your manifest, declaring that the default search * for your application is "*". This indicates to the system that no application-specific * search activity is provided, and that it should launch web-based search instead.
    • - *
    • You can specify this at invocation time via default keys (see above), overriding - * {@link android.app.Activity#onSearchRequested}, or via a direct call to - * {@link android.app.Activity#startSearch}. This is most useful if you wish to provide local - * searchability and access to global search.
    + *
  16. Simply do nothing and the default implementation of + * {@link android.app.Activity#onSearchRequested} will cause global search to be triggered. + * (You can also always trigger search via a direct call to {@link android.app.Activity#startSearch}. + * This is most useful if you wish to provide local searchability and access to global + * search.)
  17. * - *

    How to disable search from your activity. search is a system-wide feature and users + *

    How to disable search from your activity. Search is a system-wide feature and users * will expect it to be available in all contexts. If your UI design absolutely precludes * launching search, override {@link android.app.Activity#onSearchRequested onSearchRequested} * as shown: @@ -172,7 +155,7 @@ import java.util.List; * return false; * } * - *

    Managing focus and knowing if Search is active. The search UI is not a separate + *

    Managing focus and knowing if search is active. The search UI is not a separate * activity, and when the UI is invoked or dismissed, your activity will not typically be paused, * resumed, or otherwise notified by the methods defined in * Application Fundamentals: @@ -194,17 +177,10 @@ import java.util.List; * the search UI. More details on searchable activities and search intents are provided in the * sections below. * - * - *

    Query-Search Applications

    - * - *

    Query-search applications are those that take a single query (e.g. a search - * string) and present a set of results that may fit. Primary examples include - * web queries, map lookups, or email searches (with the common thread being - * network query dispatch). It may also be the case that certain local searches - * are treated this way. It's up to the application to decide. + * + *

    Implementing Search for Your App

    * - *

    What you need to do: The following steps are necessary in order to - * implement query search. + *

    The following steps are necessary in order to implement search. *

      *
    • Implement search invocation as described above. (Strictly speaking, * these are decoupled, but it would make little sense to be "searchable" but not @@ -220,16 +196,16 @@ import java.util.List; * {@link #QUERY getStringExtra(SearchManager.QUERY)}.
    • *
    • To identify and support your searchable activity, you'll need to * provide an XML file providing searchability configuration parameters, a reference to that - * in your searchable activity's manifest - * entry, and an intent-filter declaring that you can - * receive ACTION_SEARCH intents. This is described in more detail in the - * Searchability Metadata section.
    • - *
    • Your manifest also needs a metadata entry - * providing a global reference to the searchable activity. This is the "glue" directing the search - * UI, when invoked from any of your other activities, to use your application as the - * default search context. This is also described in more detail in the + * in your searchable activity's + * manifest entry, and an + * intent-filter declaring that you can receive ACTION_SEARCH intents. This is described in more + * detail in the Searchability Metadata section.
    • + *
    • Your manifest also needs a + * metadata entry providing a global reference to the searchable activity. This is the "glue" + * directing the search UI, when invoked from any of your other activities, to use your + * application as the default search context. This is also described in more detail in the * Searchability Metadata section.
    • - *
    • Finally, you may want to define your search results activity as with the + *
    • Finally, you may want to define your search results activity as single-top with the * {@link android.R.attr#launchMode singleTop} launchMode flag. This allows the system * to launch searches from/to the same activity without creating a pile of them on the * activity stack. If you do this, be sure to also override @@ -255,25 +231,10 @@ import java.util.List; * doSearchWithQuery(queryString); * } * - * - *

      Filter-Search Applications

      - * - *

      Filter-search applications are those that use live text entry (e.g. keystrokes)) to - * display and continuously update a list of results. Primary examples include applications - * that use locally-stored data. - * - *

      Filter search is not directly supported by the Search Manager. Most filter search - * implementations will use variants of {@link android.widget.Filterable}, such as a - * {@link android.widget.ListView} bound to a {@link android.widget.SimpleCursorAdapter}. However, - * you may find it useful to mix them together, by declaring your filtered view searchable. With - * this configuration, you can still present the standard search dialog in all activities - * within your application, but transition to a filtered search when you enter the activity - * and display the results. - * * *

      Search Suggestions

      * - *

      A powerful feature of the Search Manager is the ability of any application to easily provide + *

      A powerful feature of the search system is the ability of any application to easily provide * live "suggestions" in order to prompt the user. Each application implements suggestions in a * different, unique, and appropriate way. Suggestions be drawn from many sources, including but * not limited to: @@ -285,12 +246,6 @@ import java.util.List; *

    • Summaries of possible results
    • *
    * - *

    Another feature of suggestions is that they can expose queries or results before the user - * ever visits the application. This reduces the amount of context switching required, and helps - * the user access their data quickly and with less context shifting. In order to provide this - * capability, suggestions are accessed via a - * {@link android.content.ContentProvider Content Provider}. - * *

    The primary form of suggestions is known as queried suggestions and is based on query * text that the user has already typed. This would generally be based on partial matches in * the available data. In certain situations - for example, when no query text has been typed yet - @@ -299,7 +254,8 @@ import java.util.List; * available, they should be weighted based on other factors - for example, most recent queries * or most recent results. * - *

    Overview of how suggestions are provided. When the search manager identifies a + *

    Overview of how suggestions are provided. Suggestions are accessed via a + * {@link android.content.ContentProvider Content Provider}. When the search manager identifies a * particular activity as searchable, it will check for certain metadata which indicates that * there is also a source of suggestions. If suggestions are provided, the following steps are * taken. @@ -405,7 +361,26 @@ import java.util.List; * forget to decode it. (See {@link android.net.Uri#getPathSegments} and * {@link android.net.Uri#getLastPathSegment} for helpful utilities you can use here.) * - * + * + *

    Providing access to Content Providers that require permissions. If your content + * provider declares an android:readPermission in your application's manifest, you must provide + * access to the search infrastructure to the search suggestion path by including a path-permission + * that grants android:readPermission access to "android.permission.GLOBAL_SEARCH". Granting access + * explicitly to the search infrastructure ensures it will be able to access the search suggestions + * without needing to know ahead of time any other details of the permissions protecting your + * provider. Content providers that require no permissions are already available to the search + * infrastructure. Here is an example of a provider that protects access to it with permissions, + * and provides read access to the search infrastructure to the path that it expects to receive the + * suggestion query on: + *

    + * <provider android:name="MyProvider" android:authorities="myprovider"
    + *        android:readPermission="android.permission.READ_MY_DATA"
    + *        android:writePermission="android.permission.WRITE_MY_DATA">
    + *    <path-permission android:path="/search_suggest_query"
    + *            android:readPermission="android.permission.GLOBAL_SEARCH" />
    + * </provider>
    + * 
    + * *

    Handling empty queries. Your application should handle the "empty query" * (no user text entered) case properly, and generate useful suggestions in this case. There are a * number of ways to do this; Two are outlined here: @@ -413,7 +388,7 @@ import java.util.List; * unfiltered. (example: People) *

  18. For a query search, you could simply present the most recent queries. This allows the user * to quickly repeat a recent search.
  19. - * + * *

    The Format of Individual Suggestions. Your suggestions are communicated back to the * Search Manager by way of a {@link android.database.Cursor Cursor}. The Search Manager will * usually pass a null Projection, which means that your provider can simply return all appropriate @@ -489,13 +464,22 @@ import java.util.List; * No * * + * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} + * If this column exists and this element exists at a given row, this is the + * data that will be used when forming the suggestion's intent. If not provided, + * the Intent's extra data field will be null. This column allows suggestions to + * provide additional arbitrary data which will be included as an extra under the + * key {@link #EXTRA_DATA_KEY}. + * No. + * + * * {@link #SUGGEST_COLUMN_QUERY} * If this column exists and this element exists at the given row, this is the * data that will be used when forming the suggestion's query. * Required if suggestion's action is * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise. * - * + * * Other Columns * Finally, if you have defined any Action Keys and you wish * for them to have suggestion-specific definitions, you'll need to define one @@ -704,7 +688,7 @@ import java.util.List; * entered. * No * - * + * * android:searchButtonText * If provided, this text will replace the default text in the "Search" button. * No @@ -884,7 +868,7 @@ import java.util.List; * * * - * + * *

    Additional metadata for search action keys. For each action key that you would like to * define, you'll need to add an additional element defining that key, and using the attributes * discussed in Action Keys. A simple example is shown here: @@ -1262,12 +1246,16 @@ public class SearchManager * result indicates the shortcut refers to a no longer valid sugggestion. * * @see #SUGGEST_COLUMN_SHORTCUT_ID + * + * @hide pending enabling of global search for third parties */ public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut"; /** * MIME type for shortcut validation. You'll use this in your suggestions content provider * in the getType() function. + * + * @hide pending enabling of global search for third parties */ public final static String SHORTCUT_MIME_TYPE = "vnd.android.cursor.item/vnd.android.search.suggest"; @@ -1280,7 +1268,7 @@ public class SearchManager * In addition to the columns below, the suggestion columns are used to pass along the full * suggestion so it can be shortcutted. * - * @hide + * @hide an implementation detail not part of the public api */ public final static String SEARCH_CLICK_REPORT_AUTHORITY = "com.android.globalsearch.stats"; @@ -1288,21 +1276,21 @@ public class SearchManager /** * The path the write goes to. * - * @hide + * @hide an implementation detail not part of the public api */ public final static String SEARCH_CLICK_REPORT_URI_PATH = "click"; /** * The column storing the query for the click. * - * @hide + * @hide an implementation detail not part of the public api */ public final static String SEARCH_CLICK_REPORT_COLUMN_QUERY = "query"; /** * The column storing the component name of the application that was pivoted into. * - * @hide + * @hide an implementation detail not part of the public api */ public final static String SEARCH_CLICK_REPORT_COLUMN_COMPONENT = "component"; @@ -1387,7 +1375,7 @@ public class SearchManager * {@link #COMPONENT_NAME_KEY}. For use by the global search system only - if other providers * attempt to use this column, the value will be overwritten by global search. * - * @hide + * @hide an implementation detail not part of the public api */ public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component"; /** @@ -1407,11 +1395,13 @@ public class SearchManager /** * Column name for suggestions cursor. Optional. This column is used to indicate whether - * a search suggestion should be stored as a shortcut, and whether it should be validated. If + * a search suggestion should be stored as a shortcut, and whether it should be refreshed. If * missing, the result will be stored as a shortcut and never validated. If set to * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut. - * Otherwise, the shortcut id will be used to check back for validation via + * Otherwise, the shortcut id will be used to check back for an up to date suggestion using * {@link #SUGGEST_URI_PATH_SHORTCUT}. + * + * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id"; @@ -1420,7 +1410,7 @@ public class SearchManager * cursor item's background color if it needs a non-default background color. A non-zero value * indicates a valid background color to override the default. * - * @hide For internal use, not part of the public API. + * @hide an implementation detail not part of the public api */ public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color"; @@ -1428,6 +1418,8 @@ public class SearchManager * Column name for suggestions cursor. Optional. This column is used to specify * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion * is being refreshed. + * + * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing"; @@ -1435,6 +1427,8 @@ public class SearchManager /** * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion * should not be stored as a shortcut in global search. + * + * @hide pending reenabling of global search for third parties */ public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1"; @@ -1481,6 +1475,8 @@ public class SearchManager * Intent action for starting a web search provider's settings activity. * Web search providers should handle this intent if they have provider-specific * settings to implement. + * + * @hide implementation detail only relevent to web search providers */ public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS"; @@ -1495,8 +1491,7 @@ public class SearchManager /** * Intent action broadcasted to inform that the search settings have changed in some way. - * Either searchables have been enabled or disabled, or a different web search provider - * has been chosen. + * Either searchables have been enabled or disabled. */ public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED"; @@ -1505,7 +1500,7 @@ public class SearchManager * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION}, * the search dialog will take no action. * - * @hide + * @hide an implentation detail not part of the public api */ public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH"; @@ -1577,7 +1572,7 @@ public class SearchManager * 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/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java index bd4e66e44ee90..90f8c503607b3 100644 --- a/core/java/android/app/SuggestionsAdapter.java +++ b/core/java/android/app/SuggestionsAdapter.java @@ -65,6 +65,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private WeakHashMap mOutsideDrawablesCache; private SparseArray mBackgroundsCache; private boolean mGlobalSearchMode; + private boolean mClosed = false; // Cached column indexes, updated when the cursor changes. private int mFormatCol; @@ -73,6 +74,14 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private int mIconName1Col; private int mIconName2Col; private int mBackgroundColorCol; + + // The extra used to tell a cursor to close itself. This is a hack, see the description by + // its use later in this file. + private static final String EXTRA_CURSOR_RESPOND_CLOSE_CURSOR = "cursor_respond_close_cursor"; + + // The bundle which contains {EXTRA_CURSOR_RESPOND_CLOSE_CURSOR=true}, just cached once + // so we don't bother recreating it a bunch. + private final Bundle mCursorRespondCloseCursorBundle; // This value is stored in SuggestionsAdapter by the SearchDialog to indicate whether // a particular list item should be selected upon the next call to notifyDataSetChanged. @@ -129,6 +138,10 @@ class SuggestionsAdapter extends ResourceCursorAdapter { mSearchDialog.setWorking(false); } }; + + // Create this once because we'll reuse it a bunch. + mCursorRespondCloseCursorBundle = new Bundle(); + mCursorRespondCloseCursorBundle.putBoolean(EXTRA_CURSOR_RESPOND_CLOSE_CURSOR, true); // delay 500ms when deleting getFilter().setDelayer(new Filter.Delayer() { @@ -187,6 +200,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter { } } + public void close() { + if (DBG) Log.d(LOG_TAG, "close()"); + changeCursor(null); + mClosed = true; + } + /** * Cache columns. */ @@ -194,8 +213,28 @@ class SuggestionsAdapter extends ResourceCursorAdapter { public void changeCursor(Cursor c) { if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")"); + if (mClosed) { + Log.w(LOG_TAG, "Tried to change cursor after adapter was closed."); + if (c != null) c.close(); + return; + } + try { + Cursor oldCursor = getCursor(); super.changeCursor(c); + + // We send a special respond to the cursor to tell it to close itself directly because + // it may not happen correctly for some cursors currently. This was originally + // included as a fix to http://b/2036290, in which the search dialog was holding + // on to references to the web search provider unnecessarily. This is being caused by + // the fact that the cursor is not being correctly closed in + // BulkCursorToCursorAdapter#close, which remains unfixed (see http://b/2015069). + // + // TODO: Remove this hack once http://b/2015069 is fixed. + if (oldCursor != null && oldCursor != c) { + oldCursor.respond(mCursorRespondCloseCursorBundle); + } + if (c != null) { mFormatCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT); mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 62d92674d8648..9799ac44059aa 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -18,11 +18,13 @@ package android.appwidget; import android.content.Context; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.SystemClock; +import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; @@ -31,6 +33,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.RemoteViews; import android.widget.TextView; +import android.widget.FrameLayout.LayoutParams; /** * Provides the glue to show AppWidget views. This class offers automatic animation @@ -58,7 +61,8 @@ public class AppWidgetHostView extends FrameLayout { }; Context mContext; - + Context mRemoteContext; + int mAppWidgetId; AppWidgetProviderInfo mInfo; View mView; @@ -104,6 +108,16 @@ public class AppWidgetHostView extends FrameLayout { return mInfo; } + /** {@inheritDoc} */ + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + // We're being asked to inflate parameters, probably by a LayoutInflater + // in a remote Context. To help resolve any remote references, we + // inflate through our last mRemoteContext when it exists. + final Context context = mRemoteContext != null ? mRemoteContext : mContext; + return new FrameLayout.LayoutParams(context, attrs); + } + /** * Process a set of {@link RemoteViews} coming in as an update from the * AppWidget provider. Will animate into these new views as needed. @@ -143,6 +157,9 @@ public class AppWidgetHostView extends FrameLayout { mLayoutId = -1; mViewMode = VIEW_MODE_DEFAULT; } else { + // Prepare a local reference to the remote Context so we're ready to + // inflate any requested LayoutParams. + mRemoteContext = getRemoteContext(remoteViews); int layoutId = remoteViews.getLayoutId(); // If our stale view has been prepared to match active, and the new @@ -203,6 +220,24 @@ public class AppWidgetHostView extends FrameLayout { } } + /** + * Build a {@link Context} cloned into another package name, usually for the + * purposes of reading remote resources. + */ + private Context getRemoteContext(RemoteViews views) { + // Bail if missing package name + final String packageName = views.getPackage(); + if (packageName == null) return mContext; + + try { + // Return if cloned successfully, otherwise default + return mContext.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); + } catch (NameNotFoundException e) { + Log.e(TAG, "Package name " + packageName + " not found"); + return mContext; + } + } + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (CROSSFADE) { int alpha; @@ -246,17 +281,15 @@ public class AppWidgetHostView extends FrameLayout { * {@link FrameLayout.LayoutParams} before inserting. */ protected void prepareView(View view) { - // Take requested dimensions from parent, but apply default gravity. - ViewGroup.LayoutParams requested = view.getLayoutParams(); + // Take requested dimensions from child, but apply default gravity. + FrameLayout.LayoutParams requested = (FrameLayout.LayoutParams)view.getLayoutParams(); if (requested == null) { requested = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); } - - FrameLayout.LayoutParams params = - new FrameLayout.LayoutParams(requested.width, requested.height); - params.gravity = Gravity.CENTER; - view.setLayoutParams(params); + + requested.gravity = Gravity.CENTER; + view.setLayoutParams(requested); } /** diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index 8ebe0932c2140..0bc8a9d2e4827 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -664,6 +664,11 @@ public final class AssetManager { */ public native static final int getGlobalAssetCount(); + /** + * {@hide} + */ + public native static final String getAssetAllocations(); + /** * {@hide} */ diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java index deaa3c35f99bc..a97b9e58d1143 100644 --- a/core/java/android/net/SSLCertificateSocketFactory.java +++ b/core/java/android/net/SSLCertificateSocketFactory.java @@ -41,6 +41,7 @@ import javax.net.ssl.X509TrustManager; import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache; import org.apache.harmony.xnet.provider.jsse.SSLContextImpl; +import org.apache.harmony.xnet.provider.jsse.SSLParameters; /** * SSLSocketFactory that provides optional (on debug devices, only) skipping of ssl certificfate @@ -54,28 +55,6 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { private static final String LOG_TAG = "SSLCertificateSocketFactory"; - private static X509TrustManager sDefaultTrustManager; - - static { - try { - TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); - tmf.init((KeyStore)null); - TrustManager[] tms = tmf.getTrustManagers(); - if (tms != null) { - for (TrustManager tm : tms) { - if (tm instanceof X509TrustManager) { - sDefaultTrustManager = (X509TrustManager)tm; - break; - } - } - } - } catch (NoSuchAlgorithmException e) { - Log.e(LOG_TAG, "Unable to get X509 Trust Manager ", e); - } catch (KeyStoreException e) { - Log.e(LOG_TAG, "Key Store exception while initializing TrustManagerFactory ", e); - } - } - private static final TrustManager[] TRUST_MANAGER = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { @@ -155,20 +134,13 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory { private boolean hasValidCertificateChain(Certificate[] certs) throws IOException { - if (sDefaultTrustManager == null) { - if (Config.LOGD) { - Log.d(LOG_TAG,"hasValidCertificateChain():" + - " null default trust manager!"); - } - throw new IOException("null default trust manager"); - } - boolean trusted = (certs != null && (certs.length > 0)); if (trusted) { try { // the authtype we pass in doesn't actually matter - sDefaultTrustManager.checkServerTrusted((X509Certificate[]) certs, "RSA"); + SSLParameters.getDefaultTrustManager() + .checkServerTrusted((X509Certificate[]) certs, "RSA"); } catch (GeneralSecurityException e) { String exceptionMessage = e != null ? e.getMessage() : "none"; if (Config.LOGD) { diff --git a/core/java/android/net/http/CertificateChainValidator.java b/core/java/android/net/http/CertificateChainValidator.java index 91fa900799231..ed6b4c2a1d1fa 100644 --- a/core/java/android/net/http/CertificateChainValidator.java +++ b/core/java/android/net/http/CertificateChainValidator.java @@ -16,6 +16,8 @@ package android.net.http; +import org.apache.harmony.xnet.provider.jsse.SSLParameters; + import java.io.IOException; import java.security.cert.Certificate; @@ -46,11 +48,6 @@ class CertificateChainValidator { private static final CertificateChainValidator sInstance = new CertificateChainValidator(); - /** - * Default trust manager (used to perform CA certificate validation) - */ - private X509TrustManager mDefaultTrustManager; - /** * @return The singleton instance of the certificator chain validator */ @@ -62,28 +59,7 @@ class CertificateChainValidator { * Creates a new certificate chain validator. This is a pivate constructor. * If you need a Certificate chain validator, call getInstance(). */ - private CertificateChainValidator() { - try { - TrustManagerFactory trustManagerFactory - = TrustManagerFactory.getInstance("X509"); - trustManagerFactory.init((KeyStore)null); - TrustManager[] trustManagers = - trustManagerFactory.getTrustManagers(); - if (trustManagers != null && trustManagers.length > 0) { - for (TrustManager trustManager : trustManagers) { - if (trustManager instanceof X509TrustManager) { - mDefaultTrustManager = (X509TrustManager)(trustManager); - break; - } - } - } - } catch (Exception exc) { - if (HttpLog.LOGV) { - HttpLog.v("CertificateChainValidator():" + - " failed to initialize the trust manager"); - } - } - } + private CertificateChainValidator() {} /** * Performs the handshake and server certificates validation @@ -156,7 +132,7 @@ class CertificateChainValidator { // report back to the user. // try { - mDefaultTrustManager.checkServerTrusted( + SSLParameters.getDefaultTrustManager().checkServerTrusted( serverCertificates, "RSA"); // no errors!!! @@ -186,7 +162,7 @@ class CertificateChainValidator { // check if the last certificate in the chain (root) is trusted X509Certificate[] rootCertificateChain = { currCertificate }; try { - mDefaultTrustManager.checkServerTrusted( + SSLParameters.getDefaultTrustManager().checkServerTrusted( rootCertificateChain, "RSA"); } catch (CertificateExpiredException e) { String errorMessage = e.getMessage(); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 830b0bd7ceb1a..1775a4b33ca70 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -120,9 +120,18 @@ public class Build { * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} permission to be * able to modify the contents of the SD card. (Apps targeting * earlier versions will always request the permission.) + *

  20. They must explicitly request the + * {@link android.Manifest.permission#READ_PHONE_STATE} permission to be + * able to be able to retrieve phone state info. (Apps targeting + * earlier versions will always request the permission.) + *
  21. They are assumed to support different screen densities and + * sizes. (Apps targeting earlier versions are assumed to only support + * medium density normal size screens unless otherwise indicated). + * They can still explicitly specify screen support either way with the + * supports-screens manifest tag. * */ - public static final int DONUT = CUR_DEVELOPMENT; + public static final int DONUT = 4; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 9a9ddc9f39ae5..4a4d2de92dcc8 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2972,6 +2972,18 @@ public final class Settings { public static final String VENDING_PENDING_DOWNLOAD_RESEND_FREQUENCY_MS = "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/server/search/Searchables.java b/core/java/android/server/search/Searchables.java index c615957367231..a2add73dc3b08 100644 --- a/core/java/android/server/search/Searchables.java +++ b/core/java/android/server/search/Searchables.java @@ -26,6 +26,7 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.util.Log; @@ -230,14 +231,16 @@ public class Searchables { : webSearchInfoList.get(ii - search_count); ActivityInfo ai = info.activityInfo; // Check first to avoid duplicate entries. - if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) { - SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai); - if (searchable != null) { - newSearchablesList.add(searchable); - newSearchablesMap.put(searchable.getSearchActivity(), searchable); - if (searchable.shouldIncludeInGlobalSearch()) { - newSearchablesInGlobalSearchList.add(searchable); - } + if (newSearchablesMap.containsKey(new ComponentName(ai.packageName, ai.name))) { + continue; + } + SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai); + if (searchable != null) { + newSearchablesList.add(searchable); + newSearchablesMap.put(searchable.getSearchActivity(), searchable); + if (searchable.shouldIncludeInGlobalSearch() + && isWhitelistedForGlobalSearch(pm, searchable.getSearchActivity())) { + newSearchablesInGlobalSearchList.add(searchable); } } } @@ -288,6 +291,25 @@ public class Searchables { } } + /** + * Determines whether an activity may be included in quick search box. For now this is + * restricted to system installed apps. + * + * TODO: remove when we are ready to enable global search for third party applications. + * + * @param pm The package manager. + * @param searchActivity The component of the search activity. + * @return True if the search activity may include its search suggestions in quick search box. + */ + private boolean isWhitelistedForGlobalSearch(PackageManager pm, ComponentName searchActivity) { + try { + ActivityInfo ai = pm.getActivityInfo(searchActivity, 0); + return ((ai.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + /** * Checks if the given activity component is present in the system and if so makes it the * preferred activity for handling ACTION_WEB_SEARCH. diff --git a/core/java/android/speech/RecognitionResult.java b/core/java/android/speech/RecognitionResult.java index 8d031fcd32739..978106b1ea74c 100644 --- a/core/java/android/speech/RecognitionResult.java +++ b/core/java/android/speech/RecognitionResult.java @@ -60,9 +60,11 @@ public class RecognitionResult implements Parcelable { * * @param contact the contact name. * @param phoneType the phone type. + * @param callAction whether this result included a command to "call", or just the contact name. */ - public static RecognitionResult newContactResult(String contact, int phoneType) { - return new RecognitionResult(CONTACT_RESULT, contact, phoneType); + public static RecognitionResult newContactResult(String contact, int phoneType, + boolean callAction) { + return new RecognitionResult(CONTACT_RESULT, contact, phoneType, callAction); } /** @@ -112,8 +114,16 @@ public class RecognitionResult implements Parcelable { */ public final String mUrl; - /** Phone number type. This is valid only when mResultType == CONTACT_RESULT */ + /** + * Phone number type. This is valid only when mResultType == CONTACT_RESULT. + */ public final int mPhoneType; + + /** + * Whether a contact recognition result included a command to "call". This is valid only + * when mResultType == CONTACT_RESULT. + */ + public final boolean mCallAction; private RecognitionResult(int type, String query, String html, String url) { mResultType = type; @@ -121,14 +131,16 @@ public class RecognitionResult implements Parcelable { mHtml = html; mUrl = url; mPhoneType = -1; + mCallAction = false; } - private RecognitionResult(int type, String query, int at) { + private RecognitionResult(int type, String query, int phoneType, boolean callAction) { mResultType = type; mText = query; - mPhoneType = at; + mPhoneType = phoneType; mHtml = null; mUrl = null; + mCallAction = callAction; } private RecognitionResult(Parcel in) { @@ -137,6 +149,7 @@ public class RecognitionResult implements Parcelable { mHtml= in.readString(); mUrl= in.readString(); mPhoneType = in.readInt(); + mCallAction = (in.readInt() == 1); } public void writeToParcel(Parcel out, int flags) { @@ -145,6 +158,7 @@ public class RecognitionResult implements Parcelable { out.writeString(mHtml); out.writeString(mUrl); out.writeInt(mPhoneType); + out.writeInt(mCallAction ? 1 : 0); } diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java index b033c6a7cdc23..a6d76d684fe4e 100755 --- a/core/java/android/speech/tts/TextToSpeech.java +++ b/core/java/android/speech/tts/TextToSpeech.java @@ -61,7 +61,7 @@ public class TextToSpeech { /** - * 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 @@ public class TextToSpeech { // 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,12 +184,20 @@ public class TextToSpeech { * 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"; /** - * Broadcast Action: Starts the activity from the platform Text-To-Speech + * 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"; + /** + * 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: @@ -211,7 +219,7 @@ public class TextToSpeech { * and YYY is the 3-letter ISO country code.
  22. * */ - @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"; @@ -233,6 +241,16 @@ public class TextToSpeech { */ public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo"; + // extras for a TTS engine's data installation + /** + * 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"; + // keys for the parameters passed with speak commands. Hidden keys are used internally // to maintain engine state for each TextToSpeech instance. /** @@ -1016,7 +1034,7 @@ public class TextToSpeech { } try { String[] locStrings = mITts.getLanguage(); - if (locStrings.length == 3) { + if ((locStrings != null) && (locStrings.length == 3)) { return new Locale(locStrings[0], locStrings[1], locStrings[2]); } else { return null; diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index dd5a4401c4d51..74f01cc871975 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -24,6 +24,9 @@ import android.os.*; /** * A structure describing general information about a display, such as its * size, density, and font scaling. + *

    To access the DisplayMetrics members, initialize an object like this:

    + *
     DisplayMetrics metrics = new DisplayMetrics();
    + * getWindowManager().getDefaultDisplay().getMetrics(metrics);
    */ public class DisplayMetrics { /** diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index f7cb06b226547..0c5d853ed4ddd 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -1277,6 +1277,11 @@ public final class ViewRoot extends Handler implements ViewParent, // TODO: we should ask the window manager to do something! // for now we just do nothing return; + } catch (IllegalArgumentException e) { + Log.e("ViewRoot", "IllegalArgumentException locking surface", e); + // TODO: we should ask the window manager to do something! + // for now we just do nothing + return; } try { diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index 456f8ed845a42..02d77d1e0b257 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -862,6 +862,16 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe return ListView.INVALID_POSITION; } + + /** + * @hide + * @return {@link android.widget.ListView#getChildCount()} of the drop down if it is showing, + * otherwise 0. + */ + protected int getDropDownChildCount() { + return mDropDownList == null ? 0 : mDropDownList.getChildCount(); + } + /** *

    Starts filtering the content of the drop down list. The filtering * pattern is the content of the edit box. Subclasses should override this diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 2c9e71e02f082..b179a13969413 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -190,10 +190,12 @@ public class ProgressBar extends View { mBehavior = a.getInt(R.styleable.ProgressBar_indeterminateBehavior, mBehavior); - final int resID = a.getResourceId(com.android.internal.R.styleable.ProgressBar_interpolator, -1); + final int resID = a.getResourceId( + com.android.internal.R.styleable.ProgressBar_interpolator, + android.R.anim.linear_interpolator); // default to linear interpolator if (resID > 0) { setInterpolator(context, resID); - } + } setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 3fab6929caa51..260799ef0c1a9 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -7210,6 +7210,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (word != null) { Intent i = new Intent("com.android.settings.USER_DICTIONARY_INSERT"); i.putExtra("word", word); + i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(i); } diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java index bae4dad5c01fc..a41e2e3dfd0dd 100644 --- a/core/java/android/widget/ZoomButtonsController.java +++ b/core/java/android/widget/ZoomButtonsController.java @@ -69,7 +69,6 @@ import android.view.WindowManager.LayoutParams; * {@link #setVisible(boolean) setVisible(false)} from the * {@link View#onDetachedFromWindow}. * - * @hide */ public class ZoomButtonsController implements View.OnTouchListener { diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index f67a235b0736a..94149e168f609 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -291,6 +291,15 @@ public class ZygoteInit { } else { missingClasses += " " + line; } + } catch (Throwable t) { + Log.e(TAG, "Error preloading " + line + ".", t); + if (t instanceof Error) { + throw (Error) t; + } + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new RuntimeException(t); } } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index a6b63d81f2b9a..b4c60f1ff2dcd 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -129,6 +129,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats) isDalvikHeap = 1; } else if (strstr(line, "/dalvik-heap-bitmap/")) { isDalvikHeap = 1; + } else if (strstr(line, "/data/dalvik-cache/")) { + isDalvikHeap = 1; } else if (strstr(line, "/tmp/sqlite-heap")) { isSqliteHeap = 1; } @@ -158,9 +160,9 @@ static void read_mapinfo(FILE *fp, stats_t* stats) private_dirty = temp; } else if (sscanf(line, "Referenced: %d kB", &temp) == 1) { referenced = temp; - } else if (strlen(line) > 40 && line[8] == '-' && line[17] == ' ') { + } else if (strlen(line) > 30 && line[8] == '-' && line[17] == ' ') { // looks like a new mapping - // example: "0000a000-00232000 rwxp 0000a000 00:00 0 [heap]" + // example: "10000000-10001000 ---p 10000000 00:00 0" break; } } @@ -178,8 +180,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats) // ignore } else { stats->otherPss += pss; - stats->otherPrivateDirty += shared_dirty; - stats->otherSharedDirty += private_dirty; + stats->otherPrivateDirty += private_dirty; + stats->otherSharedDirty += shared_dirty; } } } diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 66b250670fee3..562cc8feb4291 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -1536,6 +1536,22 @@ static jint android_content_AssetManager_getGlobalAssetCount(JNIEnv* env, jobjec return Asset::getGlobalCount(); } +static jobject android_content_AssetManager_getAssetAllocations(JNIEnv* env, jobject clazz) +{ + String8 alloc = Asset::getAssetAllocations(); + if (alloc.length() <= 0) { + return NULL; + } + + jstring str = env->NewStringUTF(alloc.string()); + if (str == NULL) { + doThrow(env, "java/lang/OutOfMemoryError"); + return NULL; + } + + return str; +} + static jint android_content_AssetManager_getGlobalAssetManagerCount(JNIEnv* env, jobject clazz) { return AssetManager::getGlobalCount(); @@ -1646,6 +1662,8 @@ static JNINativeMethod gAssetManagerMethods[] = { (void*) android_content_AssetManager_destroy }, { "getGlobalAssetCount", "()I", (void*) android_content_AssetManager_getGlobalAssetCount }, + { "getAssetAllocations", "()Ljava/lang/String;", + (void*) android_content_AssetManager_getAssetAllocations }, { "getGlobalAssetManagerCount", "()I", (void*) android_content_AssetManager_getGlobalAssetCount }, }; diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index aee0ed7f42f88..98fe0e654e14d 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -251,10 +251,27 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin } while ((de = readdir(d))) { + int t_pid; + int t_pri; + if (de->d_name[0] == '.') continue; + t_pid = atoi(de->d_name); - if (add_pid_to_cgroup(atoi(de->d_name), grp)) { + if (!t_pid) { + LOGE("Error getting pid for '%s'\n", de->d_name); + continue; + } + + t_pri = getpriority(PRIO_PROCESS, t_pid); + + if (grp == ANDROID_TGROUP_DEFAULT && + t_pri >= ANDROID_PRIORITY_BACKGROUND) { + // This task wants to stay at background + continue; + } + + if (add_pid_to_cgroup(t_pid, grp)) { // If the thread exited on us, ignore it and keep going if (errno != ESRCH && errno != ENOENT) { signalExceptionForGroupError(env, clazz, errno); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4558660899c83..cf2184ccf07c2 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -49,7 +49,6 @@ - diff --git a/core/res/res/drawable/sym_def_app_icon.png b/core/res/res/drawable/sym_def_app_icon.png index 75024841d327c4fbaefef7c8e9c8d0e892895f93..8be3b54ccbe073c7c2bb3a9d3a897b7fba411299 100644 GIT binary patch delta 4468 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"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." "příjem zpráv MMS" "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." - "odesílat zprávy SMS" + "odesílaní zpráv SMS" "Umožňuje aplikaci odesílat zprávy SMS. Å kodlivé aplikace mohou bez vaÅ¡eho potvrzení odesílat zpoplatnÄ›né zprávy." "Ätení zpráv SMS a MMS" "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." @@ -182,7 +182,7 @@ "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í." "povolit ladÄ›ní aplikací" "Umožňuje aplikaci povolit ladÄ›ní jiné aplikace. Å kodlivé aplikace mohou pomocí tohoto nastavení ukonÄit jiné aplikace." - "zmÄ›ny vaÅ¡eho nastavení uživatelského rozhraní" + "zmÄ›na vaÅ¡eho nastavení uživatelského rozhraní" "Umožňuje aplikaci zmÄ›nit aktuální konfiguraci, napÅ™. národní prostÅ™edí Äi obecnou velikost písma." "restartování ostatních aplikací" "Umožňuje aplikaci vynutit restartování jiných aplikací." @@ -190,9 +190,9 @@ "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." "naÄtení interního stavu systému" "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." - "ČásteÄné vypnutí" + "ÄásteÄné vypnutí" "Uvede správce Äinností do vypnutého stavu. Nedojde vÅ¡ak k úplnému vypnutí." - "Zabránit pÅ™epínání aplikací" + "zabránÄ›ní pÅ™epínání aplikací" "Zabrání uživateli pÅ™epnout na jinou aplikaci." "sledování a řízení spouÅ¡tÄ›ní vÅ¡ech aplikací" "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." @@ -208,13 +208,13 @@ "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í." "zmÄ›na statistických údajů o baterii" "Umožňuje zmÄ›nu shromáždÄ›ných statistických údajů o baterii. Není urÄeno pro běžné aplikace." - "Ovládat zálohování a obnovu systému" + "ovládání zálohování a obnovy systému" "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." "zobrazení nepovolených oken" "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í." "zobrazení upozornÄ›ní systémové úrovnÄ›" "Umožňuje aplikaci zobrazit okna s výstrahami systému. Å kodlivé aplikace mohou pÅ™evzít kontrolu nad celou obrazovkou telefonu." - "globální zmÄ›ny rychlosti animace" + "zmÄ›na globální rychlosti animace" "Umožňuje aplikaci kdykoli globálnÄ› zmÄ›nit rychlost animace (rychlejší Äi pomalejší animace)." "správa tokenů aplikací" "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." @@ -250,11 +250,11 @@ "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í." "nastavení upÅ™ednostňovaných aplikací" "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." - "zmÄ›ny globálních nastavení systému" + "zmÄ›na globálních nastavení systému" "Umožňuje aplikaci upravit data nastavení systému. Å kodlivé aplikace mohou poÅ¡kodit konfiguraci vaÅ¡eho systému." "zmÄ›ny zabezpeÄených nastavení systému" "Umožňuje aplikaci zmÄ›nit data zabezpeÄených nastavení systému. Běžné aplikace toto nastavení nevyužívají." - "zmÄ›ny mapy služeb Google" + "zmÄ›na mapy služeb Google" "Umožňuje aplikaci zmÄ›nit mapu služeb Google. Běžné aplikace toto nastavení nevyužívají." "automatické spuÅ¡tÄ›ní pÅ™i startu" "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." @@ -276,7 +276,7 @@ "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Ä›." "přístup k dalším příkazům poskytovatele polohy" "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." - "OprávnÄ›ní k instalaci poskytovatele polohy" + "oprávnÄ›ní k instalaci poskytovatele polohy" "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." "upÅ™esnÄ›ní polohy (GPS)" "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." @@ -316,12 +316,10 @@ "Umožňuje Ätení i zápis vlastností nahraných službou Checkin. Běžné aplikace toto nastavení obvykle nevyužívají." "zvolit widgety" "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." - "zmÄ›ny stavu telefonu" + "zmÄ›na stavu telefonu" "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í." - - - - + "Ätení stavu a identity telefonu" + "Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Aplikace s tímto oprávnÄ›ním mohou urÄit telefonní a sériové Äíslo tohoto telefonu, zda zrovna probíhá hovor, volané telefonní Äíslo a podobnÄ›." "zabránÄ›ní pÅ™echodu telefonu do režimu spánku" "Umožňuje aplikaci zabránit pÅ™echodu telefonu do režimu spánku." "zapnutí Äi vypnutí telefonu" @@ -342,7 +340,7 @@ "Umožňuje aplikaci zobrazit stav vÅ¡ech sítí." "plný přístup k Internetu" "Umožňuje aplikaci vytvoÅ™it síťové sokety." - "zápis nastavení pro název přístupového bodu (APN)" + "zápis nastavení názvu přístupového bodu (APN)" "Umožňuje aplikaci zmÄ›nit nastavení APN, jako je například proxy Äi port APN." "zmÄ›na pÅ™ipojení k síti" "Umožňuje aplikaci zmÄ›nit stav pÅ™ipojení k síti." @@ -350,9 +348,9 @@ "Umožňuje aplikaci zmÄ›nit nastavení použití dat na pozadí." "zobrazení stavu WiFi" "Umožňuje aplikaci zobrazit informace o stavu pÅ™ipojení WiFi." - "ZmÄ›nit stav WiFi" + "zmÄ›na stavu WiFi" "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." - "Povolit příjem Wi-Fi Multicast" + "povolení příjmu Wi-Fi Multicast" "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)." "správa rozhraní Bluetooth" "Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení." @@ -370,11 +368,11 @@ "Umožňuje aplikaci získat podrobnosti o aktuálnÄ› synchronizovaných zdrojích." "zápis odebíraných zdrojů" "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ů." - "Äíst slovník definovaný uživatelem" + "Älení slovníku definovaného uživatelem" "Umožní aplikaci Äíst soukromá slova, jména a fráze, která uživatel mohl uložit do svého slovníku." - "zapisovat do slovníku definovaného uživatelem" + "zápis do slovníku definovaného uživatelem" "Umožní aplikaci zapisovat nová slova do uživatelského slovníku." - "ZmÄ›nit/smazat obsah karty SD" + "zmÄ›na/smazání obsah karty SD" "Umožní aplikaci zápis na kartu SD." "Domů" @@ -473,10 +471,10 @@ "JavaScript" "Chcete opustit tuto stránku?"\n\n"%s"\n\n"Vyberte OK, chcete-li pokraÄovat, nebo ZruÅ¡it, chcete-li na stránce zůstat." "Potvrdit" - "ÄŒtení historie a záložek prohlížeÄe" - "Umožňuje aplikaci Äíst vÅ¡echny navÅ¡tívené adresy URL a záložky prohlížeÄe." - "Zapisovat historii a záložky prohlížeÄe" - "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." + "Ätení historie a záložek ProhlížeÄe" + "Umožňuje aplikaci Äíst vÅ¡echny navÅ¡tívené adresy URL a záložky ProhlížeÄe." + "zápis do historie a záložek ProhlížeÄe" + "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." "Chcete, aby si prohlížeÄ zapamatoval toto heslo?" "Nyní ne" "Zapamatovat" @@ -630,7 +628,7 @@ "PÅ™ehrávání pomocí rozhraní Bluetooth" "Hlasitost hovoru" "Hlasitost příchozích hovorů pÅ™i pÅ™ipojení Bluetooth" - "Hlasitost upozornÄ›ní a budíku" + "Hlasitost budíku" "Hlasitost oznámení" "Hlasitost" "Výchozí vyzvánÄ›cí tón" diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml index babf1a0581b42..8a9c1a71ed4b7 100644 --- a/core/res/res/values-de/donottranslate-cldr.xml +++ b/core/res/res/values-de/donottranslate-cldr.xml @@ -91,17 +91,17 @@ Heute Morgen - %-k:%M h + %-k:%M %-l:%M %p %-l:%M %^p h:mm a - H:mm \'h\' + H:mm %d.%m.%Y dd.MM.yyyy "%s.%s.%s" %-e. %B %Y - %H:%M:%S h - %d.%m.%Y, %H:%M:%S h + %H:%M:%S + %d.%m.%Y, %H:%M:%S %1$s, %2$s %3$s, %1$s %d.%m.%Y @@ -111,37 +111,37 @@ %-e. %b %-b %b %Y - %1$s bis %2$s - %2$s bis %5$s - %3$s.%2$s. bis %8$s.%7$s. - %1$s, %3$s.%2$s. bis %6$s, %8$s.%7$s. - %3$s.%2$s.%4$s bis %8$s.%7$s.%9$s - %1$s, %3$s.%2$s.%4$s bis %6$s, %8$s.%7$s.%9$s - %1$s, %3$s.%2$s.%4$s, %5$s bis %6$s, %8$s.%7$s.%9$s, %10$s - %3$s.%2$s., %5$s bis %8$s.%7$s., %10$s - %1$s, %3$s.%2$s., %5$s bis %6$s, %8$s.%7$s., %10$s - %3$s.%2$s.%4$s, %5$s bis %8$s.%7$s.%9$s, %10$s - %1$s, %2$s, %3$s bis %4$s, %5$s, %6$s - %1$s, %2$s bis %4$s, %5$s - %2$s, %3$s bis %5$s, %6$s + %1$s - %2$s + %2$s - %5$s + %3$s.%2$s. - %8$s.%7$s. + %1$s, %3$s.%2$s. - %6$s, %8$s.%7$s. + %3$s.%2$s.%4$s - %8$s.%7$s.%9$s + %1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s + %1$s, %3$s.%2$s.%4$s, %5$s - %6$s, %8$s.%7$s.%9$s, %10$s + %3$s.%2$s., %5$s - %8$s.%7$s., %10$s + %1$s, %3$s.%2$s., %5$s - %6$s, %8$s.%7$s., %10$s + %3$s.%2$s.%4$s, %5$s - %8$s.%7$s.%9$s, %10$s + %1$s, %2$s, %3$s - %4$s, %5$s, %6$s + %1$s, %2$s - %4$s, %5$s + %2$s, %3$s - %5$s, %6$s %2$s, %3$s, %1$s %2$s, %3$s %2$s, %1$s - %3$s. %2$s bis %8$s. %7$s - %1$s, %3$s. %2$s bis %6$s, %8$s. %7$s - %3$s. %2$s, %5$s bis %8$s. %7$s, %10$s - %3$s. %2$s, %5$s bis %8$s. %7$s, %10$s - %1$s, %3$s. %2$s, %5$s bis %6$s, %8$s. %7$s, %10$s - %1$s, %3$s. %2$s, %5$s bis %6$s, %8$s. %7$s, %10$s - %3$s. %2$s %4$s, %5$s bis %8$s. %7$s %9$s, %10$s - %3$s. %2$s %4$s, %5$s bis %8$s. %7$s %9$s, %10$s - %1$s, %3$s. %2$s %4$s, %5$s bis %6$s, %8$s. %7$s %9$s, %10$s - %1$s, %3$s. %2$s %4$s, %5$s bis %6$s, %8$s. %7$s %9$s, %10$s - %1$s, %3$s. %2$s %4$s bis %6$s, %8$s. %7$s %9$s - %3$s. bis %8$s. %2$s - %1$s, %3$s. %2$s bis %6$s, %8$s. %7$s - %3$s. %2$s bis %8$s. %7$s %9$s - %3$s. bis %8$s. %2$s %9$s - %1$s, %3$s. %2$s bis %6$s, %8$s. %7$s %9$s + %3$s. %2$s - %8$s. %7$s + %1$s, %3$s. %2$s - %6$s, %8$s. %7$s + %3$s. %2$s, %5$s - %8$s. %7$s, %10$s + %3$s. %2$s, %5$s - %8$s. %7$s, %10$s + %1$s, %3$s. %2$s, %5$s - %6$s, %8$s. %7$s, %10$s + %1$s, %3$s. %2$s, %5$s - %6$s, %8$s. %7$s, %10$s + %3$s. %2$s %4$s, %5$s - %8$s. %7$s %9$s, %10$s + %3$s. %2$s %4$s, %5$s - %8$s. %7$s %9$s, %10$s + %1$s, %3$s. %2$s %4$s, %5$s - %6$s, %8$s. %7$s %9$s, %10$s + %1$s, %3$s. %2$s %4$s, %5$s - %6$s, %8$s. %7$s %9$s, %10$s + %1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s + %3$s. - %8$s. %2$s + %1$s, %3$s. %2$s - %6$s, %8$s. %7$s + %3$s. %2$s - %8$s. %7$s %9$s + %3$s. - %8$s. %2$s %9$s + %1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s %b diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 34e52a52b6a9d..10a736cc5a38a 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -318,10 +318,8 @@ "Ermöglicht der Anwendung, dem System zu melden, welche Widgets von welcher Anwendung verwendet werden können. Mit dieser Berechtigung können Anwendungen anderen Anwendungen Zugriff auf persönliche Daten gewähren. Nicht für normale Anwendungen vorgesehen." "Telefonstatus ändern" "Ermöglicht einer Anwendung, die Telefonfunktionen des Gerätes zu steuern. Eine Anwendung mit dieser Berechtigung kann unter anderem das Netzwerk wechseln oder die Mobilfunkverbindung des Telefons ein- und ausschalten, ohne Sie darüber zu informieren." - - - - + "Telefonstatus lesen und identifizieren" + "Ermöglicht der Anwendung, auf die Telefonfunktionen des Gerätes zuzugreifen. Eine Anwendung mit dieser Berechtigung kann unter anderem bestimmen, welche Telefonnummer dieses Telefon verwendet, ob ein Anruf aktiv ist oder mit welcher Nummer der Anrufer verbunden ist." "Standby-Modus deaktivieren" "Ermöglicht einer Anwendung, den Standby-Modus des Telefons zu deaktivieren." "Gerät ein- oder ausschalten" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index f9fd37643629c..c00a4be3b1486 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -318,10 +318,8 @@ "Permite que una aplicación indique al sistema los widgets que puede utilizar cada aplicación. Se trata de un permiso que no pueden utilizar las aplicaciones normales y que permite que una aplicación conceda acceso a datos personales a otras aplicaciones." "modificar estado del teléfono" "Permite que la aplicación controle las funciones de teléfono del dispositivo. Una aplicación con este permiso puede cambiar redes, activar y desactivar la señal móvil, etc., sin necesidad de notificar al usuario." - - - - + "leer la identidad y el estado del teléfono" + "Permite que la aplicación acceda a las funciones de teléfono del dispositivo. Una aplicación con este permiso puede determinar el número de teléfono y el número de serie de este teléfono, si una llamada está activa, el número al que está vinculada esa llamada, etc." "impedir que el teléfono entre en modo de suspensión" "Permite que una aplicación impida que el teléfono entre en modo de suspensión." "encender o apagar el teléfono" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 865b2d1f38e1a..377d202b5be14 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -318,10 +318,8 @@ "Permet à l\'application de signaler au système quels widgets peuvent être utilisés par quelle application. Grâce à cette autorisation, les applications peuvent accorder l\'accès à des données personnelles à d\'autres applications. Cette option n\'est pas utilisée par les applications standard." "Modification de l\'état du téléphone" "Permet à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer le signal radio du téléphone, etc., sans vous en avertir." - - - - + "Lire l\'état et l\'identité du téléphone" + "Permet à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de téléphone et le numéro de série de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc." "Arrêt du mode veille sur le téléphone" "Permet à une application d\'empêcher votre téléphone de passer en mode veille." "Éteindre ou allumer le téléphone" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 9ccc6f3796e1f..fde4f23952090 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -318,10 +318,8 @@ "Consente all\'applicazione di indicare al sistema quali widget possono essere utilizzati e da quale applicazione. Con questa autorizzazione, le applicazioni possono consentire ad altre applicazioni di accedere a dati personali. Da non usare per normali applicazioni." "modifica stato del telefono" "Consente all\'applicazione di controllare le funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può cambiare rete, attivare e disattivare il segnale cellulare e così via, senza alcuna notifica." - - - - + "lettura stato e identità del telefono" + "Consente l\'accesso dell\'applicazione alle funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può determinare il numero del telefono in uso e il suo numero di serie, se una chiamata è attiva o meno, il numero a cui è collegata la chiamata e simili." "disattivazione stand-by del telefono" "Consente a un\'applicazione di impedire lo stand-by del telefono." "accensione o spegnimento del telefono" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b8bfdf6188024..f6a546fe63b70 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -318,10 +318,8 @@ "ã©ã®ã‚¢ãƒ—リケーションãŒã©ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆã‚’使用ã§ãã‚‹ã‹ã‚·ã‚¹ãƒ†ãƒ ã«æŒ‡å®šã™ã‚‹ã“ã¨ã‚’ã“ã®ã‚¢ãƒ—リケーションã«è¨±å¯ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã‚¢ãƒ—リケーション間ã§å€‹äººãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚通常ã®ã‚¢ãƒ—リケーションã§ã¯ä½¿ç”¨ã—ã¾ã›ã‚“。" "端末ステータスã®å¤‰æ›´" "端末ã®é›»è©±æ©Ÿèƒ½ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’アプリケーションã«è¨±å¯ã—ã¾ã™ã€‚アプリケーションã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®åˆ‡ã‚Šæ›¿ãˆã€æºå¸¯é›»è©±ã®ç„¡ç·šé€šä¿¡ã®ã‚ªãƒ³/オフãªã©ã‚’通知ã›ãšã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" - - - - + "æºå¸¯ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¨IDã®èª­ã¿å–り" + "端末ã®é›»è©±æ©Ÿèƒ½ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’アプリケーションã«è¨±å¯ã—ã¾ã™ã€‚ã“ã®æ¨©é™ãŒè¨±å¯ã•れãŸã‚¢ãƒ—リケーションã§ã¯ã€ã“ã®æºå¸¯ã®é›»è©±ç•ªå·ã‚„シリアル番å·ã€é€šè©±ä¸­ã‹ã©ã†ã‹ã€é€šè©±ç›¸æ‰‹ã®é›»è©±ç•ªå·ãªã©ã‚’特定ã§ãã¾ã™ã€‚" "端末ã®ã‚¹ãƒªãƒ¼ãƒ—を無効ã«ã™ã‚‹" "端末ã®ã‚¹ãƒªãƒ¼ãƒ—を無効ã«ã™ã‚‹ã“ã¨ã‚’アプリケーションã«è¨±å¯ã—ã¾ã™ã€‚" "é›»æºã®ON/OFF" @@ -455,7 +453,7 @@ "ユーザーåã¾ãŸã¯ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚りã¾ã›ã‚“。" "%-l%P" "%-l%p" - "クリア" + "通知を消去" "通知ãªã—" "実行中" "通知" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 00b03d84125c2..709e7cc480ba5 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -318,10 +318,8 @@ "Hiermee kan een toepassing het systeem melden welke widgets door welke toepassing kunnen worden gebruikt. Met deze toestemming kunnen toepassingen andere toepassingen toegang geven tot persoonlijke gegevens. Niet voor gebruik door normale toepassingen." "telefoonstatus wijzigen" "Hiermee kan de toepassing de telefoonfuncties van het apparaat beheren. Een toepassing met deze machtiging kan schakelen tussen netwerken, de radio van de telefoon in- of uitschakelen en dergelijke zonder dat u hiervan op de hoogte wordt gesteld." - - - - + "telefoonstatus en -identiteit lezen" + "Hiermee krijgt de toepassing toegang tot de telefoonfuncties van het apparaat. Een toepassing met de betreffende machtiging kan het telefoonnummer en serienummer van deze telefoon achterhalen, bepalen of een oproep actief is, het gekozen nummer achterhalen en dergelijke." "voorkomen dat telefoon overschakelt naar slaapmodus" "Hiermee kan een toepassing voorkomen dat de telefoon overschakelt naar de slaapmodus." "telefoon in- of uitschakelen" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 45e0795c6638c..a33e94ead668f 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -318,10 +318,8 @@ "Zezwala aplikacjom na wskazywanie systemowi, które widżety mogÄ… być używane przez inne aplikacje. Z użyciem tego pozwolenia aplikacje mogÄ… udzielać dostÄ™pu do danych osobistych innym aplikacjom. Nie jest ono przeznaczone dla zwykÅ‚ych aplikacji." "zmiana stanu telefonu" "Pozwala aplikacji na kontrolowanie funkcji telefonu w urzÄ…dzeniu. Aplikacja z tymi uprawnieniami może zmieniać, włączać i wyłączać sieci bezprzewodowe itp. bez informowania użytkownika." - - - - + "odczytywanie stanu i informacji o telefonie" + "Umożliwia aplikacji dostÄ™p do funkcji telefonu w tym urzÄ…dzeniu. Aplikacja z takim pozwoleniem może okreÅ›lić numer telefonu i numer seryjny tego telefonu, czy aktywne jest połączenie, numer, z którym nawiÄ…zane jest połączenie itp." "zapobieganie przejÅ›ciu telefonu w stan uÅ›pienia" "Pozwala aplikacji na zapobieganie przejÅ›ciu telefonu w stan uÅ›pienia." "włączanie lub wyłączanie telefonu" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index d0126ab2700c5..7b4b962e0a33b 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -318,10 +318,8 @@ "å…許應用程å¼å‘ŠçŸ¥ç³»çµ±å“ªå€‹æ‡‰ç”¨ç¨‹å¼å¯ä»¥ä½¿ç”¨å“ªäº›å°å·¥å…·ã€‚開啟此權é™å¾Œï¼Œæ‡‰ç”¨ç¨‹å¼æœƒè®“其他程å¼ä½¿ç”¨å€‹äººè³‡æ–™ï¼Œä½†ä¸€èˆ¬æ‡‰ç”¨ç¨‹å¼ä¸é©åˆä½¿ç”¨æ­¤åŠŸèƒ½ã€‚" "修改手機狀態" "å…è¨±æ‡‰ç”¨ç¨‹å¼æŽ§åˆ¶é›»è©±åŠŸèƒ½ã€‚æ“æœ‰æ­¤æ¬Šé™çš„程å¼å¯è‡ªè¡Œåˆ‡æ›ç¶²è·¯ã€é–‹é—œç„¡ç·šé€šè¨ŠåŠŸèƒ½ã€‚" - - - - + "è®€å–æ‰‹æ©Ÿç‹€æ…‹å’Œè­˜åˆ¥ç¢¼" + "å…許應用程å¼å­˜å–è£ç½®çš„電話功能資料。ç²å¾—此權é™çš„æ‡‰ç”¨ç¨‹å¼å¯å–得手機的號碼和åºè™Ÿã€æ˜¯å¦åœ¨é€šè©±ä¸­ï¼Œä»¥åŠé€šè©±å¦ä¸€æ–¹çš„電話號碼等資料。" "防止手機進入待命狀態" "å…許應用程å¼é˜²æ­¢æ‰‹æ©Ÿé€²å…¥å¾…命。" "開啟或關閉電æº" @@ -426,7 +424,7 @@ "緊急電話號碼" "(沒有æœå‹™)" "螢幕已鎖定。" - "按下 [é¸å–®] 解鎖或撥打緊急電話。" + "按下 [Menu] 解鎖或撥打緊急電話。" "按下 Menu éµè§£éŽ–ã€‚" "畫出解鎖圖形" "緊急電話" @@ -484,7 +482,7 @@ "您沒有開啟此é çš„æ¬Šé™ã€‚" "文字已複製到剪貼簿。" "更多" - "[é¸å–®] +" + "[Menu] +" "空白éµ" "輸入" "刪除" diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index fd78f83698aa4..d5f8dcb76bcb5 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2866,16 +2866,16 @@ when the user clicks a suggestion. Optional attribute. --> - - + The default value is false. Optional attribute..--> - - diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 48b565f598781..442357e8ec42f 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -577,9 +577,7 @@ backup and restore of the application's settings to external storage. --> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd index 805167826a7d5..5a2a751b4ab59 100644 --- a/docs/html/guide/developing/device.jd +++ b/docs/html/guide/developing/device.jd @@ -7,11 +7,12 @@ page.title=Developing on a Device

    1. Available Devices
        -
      1. T-Mobile G1
      2. +
      3. Consumer devices
      4. Android Dev Phone 1
    2. Setting up a Device for Development
    3. +
    4. Installing the WinUsb Driver
    @@ -23,20 +24,24 @@ developing and debugging.

    Available Devices

    -

    While developers can use regular -consumer devices purchased at retail to test and use their apps, some developers -may choose not to use a retail device, preferring an unlocked or no-contract -device. Here are some options for obtaining devices capable of testing your applications.

    +

    Here are some options for obtaining devices capable of testing your applications.

    -

    T-Mobile G1

    +

    Consumer devices

    -

    The T-Mobile G1 device makes an excellent development device. You can write -applications in the SDK and install them on the G1, then run them as users -would, using the same hardware, system, and network.

    +

    It's likely that one of your local mobile carriers offers an Android-powered device. +Any Android-powered device (even one bought from your mobile carrier) is a perfectly good +device for running and testing your own Android applications. +You can write applications using the Android SDK and then install them +directly onto the device for testing.

    + +

    Check with the service providers in your area to determine which Android-powered +devices are available.

    + +

    Be aware that consumer devices are not designed to allow system image updates by the +user. If you're interested in manually updating the device with custom system images, then +you'll need a developer device such as the Android Dev Phone 1.

    -

    For more information about obtaining a G1, visit the T-Mobile G1 site.

    Android Dev Phone 1

    @@ -60,6 +65,7 @@ href="http://www.t-mobileg1.com">T-Mobile G1 site.

    +

    The Android Dev Phone 1 is a SIM-unlocked and hardware-unlocked device that is designed for advanced developers. The device ships with a system image that is fully compatible with Android 1.0, so you can rely on it when developing your @@ -67,7 +73,7 @@ applications. You can use any SIM in the device and can flash custom Android builds that will work with the unlocked bootloader. Unlike the bootloader on retail devices, the bootloader on the Android Dev Phone 1 does not enforce signed system images. The Android Dev Phone 1 should also appeal to developers -who live outside of T-Mobile geographies.

    +who live in geographies where local mobile carriers do not currently offer Android-powered devices.

    To purchase an Android Dev Phone 1 device, you must first register as an Android developer on the Android Market site, if you haven't done so already. @@ -82,25 +88,30 @@ Singapore, Switzerland, Netherlands, Austria, Sweden, Finland, Poland, and Hungary. We will continue to expand this program into new geographies over time. Check this page for updated information.

    -

    Note that Android Dev Phone 1 devices are not intended for +

    Android Dev Phone 1 devices are not intended for non-developer end-users. Because the device can be configured with system software not provided by or supported by Google or any other company, end-users operate these devices at their own risk.

    +

    Note that your Android Dev Phone 1 will not receive automated +over-the-air (OTA) updates for the system image. System updates must be flashed manually. +See the HTC site for a guide to Flashing +your Android Dev Phone with a Factory System Image.

    +

    For full device specs and more information about obtaining an Android Dev Phone 1 device, see the Android Market site.

    +

    Setting up a Device for Development

    -

    With a T-mobile G1 or Android Dev Phone 1, you can develop and debug your Android applications just as you +

    With an Android-powered device, you can develop and debug your Android applications just as you would on the emulator. There are just a few things to do before you can start.

    1. Declare your application as "debuggable" in your Android Manifest.

      In Eclipse, you can do this from the Application tab when viewing the Manifest (on the right side, set Debuggable to true). Otherwise, in the AndroidManifest.xml - file, add android:debuggable="true" to the <application> element.

    2. Turn on "USB Debugging" on your device. @@ -110,30 +121,8 @@ would on the emulator. There are just a few things to do before you can start.
    3. Setup your system to detect your device.
        -
      • If you're developing on 32-bit Windows, you need to install the 32-bit USB driver for adb. - The USB driver is included in the SDK package. To install it, follow these steps:

        -
          -
        1. Connect your Android device via USB. When the Found New Hardware Wizard appears, - you'll be asked if you'd like Windows Update to search for software. Select No, not this - time and click Next.
        2. - -
        3. Select Install from a list or specified location and click Next.
        4. -
        5. Select Search for the best driver in these locations. Browse to the usb_driver/x86 in the SDK package (<sdk>\usb_driver\x86).
        6. -
        7. Click Finish. The system should install the driver files as necessary. Your machine may require a reboot.
        8. -
        -
      • -
      • If you're developing on 64-bit Windows Vista, you need to install the 64-bit USB driver for adb. - The USB driver is included in the SDK package. To install it, follow these steps:

        -
          -
        1. Connect your Android device via USB. When the Found New Hardware Wizard appears, - you'll be asked if you'd like Windows Update to search for software. Select No, not this - time and click Next.
        2. - -
        3. Select Install from a list or specified location and click Next.
        4. -
        5. Select Search for the best driver in these locations. Browse to the usb_driver/amd64 in the SDK package (<sdk>\usb_driver\amd64).
        6. -
        7. Click Finish. The system should install the driver files as necessary. Your machine may require a reboot.
        8. -
        -
      • +
      • If you're developing on Windows, you need to install a USB driver for adb. + Follow the steps below for Installing the WinUsb Driver.
      • If you're developing on Mac OS X, it just works. Skip this step.
      • If you're developing on Ubuntu Linux, you need to add a rules file:
          @@ -145,7 +134,7 @@ would on the emulator. There are just a few things to do before you can start.SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"

        1. Now execute:
          - chmod a+rx /etc/udev/rules.d/50-android.rules + chmod a+rx /etc/udev/rules.d/51-android.rules
        @@ -161,3 +150,156 @@ Select the device to install and run the application there.

        If using the Android Debug Bridge (adb), you can issue commands with the -d flag to target your connected device.

        + + + + +

        Installing the WinUsb Driver

        + +

        A WinUsb-based driver is needed in order to use your Android-powered device for development on a Windows machine. +The USB installation package can be found in the <sdk>\usb_driver\ +folder of your SDK package.

        + +

        Note: If you are connecting an Android-powered device to your computer +for the first time, folllow the procedure to "Perform a fresh installation." +Android SDKs older than version 1.6 included a non-WinUsb-based driver +for connecting your device. If you installed the older USB driver and it is working properly, +you do not need to upgrade to the new driver. However, if you are having problems with the driver or +would simply like to upgrade to the latest version, follow the procedure to "Upgrade an existing +driver."

        + +

        Before you begin installing or upgrading the USB driver, you must +copy the USB installation package to a secure location on your computer. +For example, you might want to create a directory at C:\Android\Windows\USB\install\ and +move it there. Once you've moved the installation package, select the appropriate procedure below, +based on your operating system and whether you're installing for the first time or upgrading.

        + +
          +
        1. Windows Vista: +
            +
          1. Perform a fresh installation
          2. +
          3. Upgrade an existing driver
          4. +
          +
        2. +
        3. Windows XP: +
            +
          1. Perform a fresh installation
          2. +
          3. Upgrade an existing driver
          4. +
          +
        4. +
        + + +

        Caution: +You may make changes to android_winusb.inf file found inside usb_driver\ +(e.g., to add support for new devices), +however, this will lead to security warnings when you install or upgrade the +driver. Making any other changes to the driver files may break the installation process.

        + +

        Windows Vista: Perform a fresh installation

        + +

        To install the Android USB driver on Windows Vista for the first time:

        + +
          +
        1. Connect your Android-powered device to your computer's USB port. Windows will detect the device + and launch the Found New Hardware wizard.
        2. +
        3. Select "Locate and install driver software."
        4. +
        5. Select "Don't search online."
        6. +
        7. Select "I don't have the disk. Show me other options."
        8. +
        9. Select "Browse my computer for driver software."
        10. +
        11. Click "Browse..." and locate the folder where you copied the + installation package. As long as you specified the exact location of the + installation package, you may leave "Include subfolders" checked or unchecked—it doesn't matter.
        12. +
        13. Click "Next." Vista may prompt you to confirm the privilege elevation required for driver + installation. Confirm it.
        14. +
        15. When Vista asks if you'd like to install the Google ADB Interface device, click "Install" + to install the driver.
        16. +
        + +

        Return to Setting up a Device for Development.

        + + + +

        Windows Vista: Upgrade an existing driver

        + +

        To upgrade an existing Android USB driver on Windows Vista with the new one:

        + +
          +
        1. Connect your Android-powered device to your computer's USB port.
        2. +
        3. Right-click on "Computer" from your desktop or Windows Explorer, + and select "Manage."
        4. +
        5. Select "Device Manager" in the left pane of the Computer Management window.
        6. +
        7. Locate and expand "ADB Interface" in the right pane.
        8. +
        9. Right-click on "HTC Dream Composite ADB Interface", and select "Update Driver Software..."
        10. +
        11. When Vista starts updating the driver, a prompt will ask how you want to search for the driver + software. Select "Browse my computer for driver software."
        12. +
        13. Click "Browse..." and locate the folder where you copied the + installation package. As long as you specified the exact location of the + installation package, you may leave "Include subfolders" checked or unchecked—it doesn't matter.
        14. +
        15. Click "Next." Vista may prompt you to confirm the privilege elevation required for driver + installation. Confirm it.
        16. +
        17. When Vista asks if you'd like to install the Google ADB Interface device, click "Install" + to install the driver.
        18. +
        + +

        Return to Setting up a Device for Development.

        + + + +

        Windows XP: Perform a fresh installation

        + +

        To install the Android USB driver on Windows XP for the first time:

        + +
          +
        1. Connect your Android-powered device to your computer's USB port. Windows + will detect the device and launch the Hardware Update Wizard.
        2. +
        3. Select "Install from a list or specific location" and click + "Next."
        4. +
        5. Select "Search for the best driver in these locations"; uncheck "Search + removable media"; and check "Include this location in the search."
        6. +
        7. Click "Browse..." and locate the folder where you copied the installation + package.
        8. +
        9. Click "Next" to install the driver.
        10. +
        + +

        Return to Setting up a Device for Development.

        + + + +

        Windows XP: Upgrade an existing driver

        + +

        To upgrade an existing Android USB driver on Windows XP with the new one:

        + +
          +
        1. Connect your Android-powered device to your computer's USB port.
        2. +
        3. Right-click on "My Computer" from your desktop or Windows Explorer, + and select "Manage."
        4. +
        5. Select "Device Manager" in the left pane of the Computer Management window.
        6. +
        7. Locate and expand "Android Phone" in the right pane.
        8. +
        9. Right-click "Android Composite ADB Interface" and select "Update Driver..." + This will launch the Hardware Update Wizard.
        10. +
        11. Select "Install from a list or specific location" and click + "Next."
        12. +
        13. Select "Search for the best driver in these locations"; uncheck "Search + removable media"; and check "Include this location in the search."
        14. +
        15. Click "Browse..." and locate the folder where you copied the installation + package.
        16. +
        17. Click "Next" to install the driver.
        18. +
        + +

        Return to Setting up a Device for Development.

        + + + + + + + + + + + + + + + diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 21271872739dd..459ad37f79b6b 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -139,13 +139,16 @@
      • <intent-filter>
      • <manifest>
      • <meta-data>
      • +
      • <path-permission>
      • <permission>
      • <permission-group>
      • <permission-tree>
      • <provider>
      • <receiver>
      • <service>
      • +
      • <supports-screens>
      • <uses-configuration>
      • +
      • <uses-feature>
      • <uses-library>
      • <uses-permission>
      • <uses-sdk>
      • @@ -384,17 +387,30 @@
      • API Demos
      • +
      • + Home +
      • +
      • + JetBoy +
      • Lunar Lander
      • - NotePad + Note Pad +
      • +
      • + Snake +
      • +
      • + Soft Keyboard
    4. +
    5. Appendix @@ -407,6 +423,9 @@ 附錄

        +
      • + Android API Levels +
      • Supported Media Formats
      • diff --git a/docs/html/guide/samples/images/HomeSample.png b/docs/html/guide/samples/images/HomeSample.png new file mode 100644 index 0000000000000000000000000000000000000000..990bebbdb485c34d51fbe7c1202ccbb29ba921a5 GIT binary patch literal 44416 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

        I5AGgI`CducPKScArVr5H6Z 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 b9pE4-v3(=w-v0O#5uhlmDpM_O9`e5c@K~qb literal 0 HcmV?d00001 diff --git a/docs/html/guide/samples/images/sample_lunarlander.png b/docs/html/guide/samples/images/sample_lunarlander.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ff75ab64679d4fdaa2606ec9bf4cb1c229942a GIT binary patch literal 27514 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 M07*qoM6N<$f-Od59smFU literal 0 HcmV?d00001 diff --git a/docs/html/guide/samples/images/sample_note.png b/docs/html/guide/samples/images/sample_note.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc9dcc0e62704286e2262f02f974d2e6f4c04dd GIT binary patch literal 6011 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 can easily add these applications as projects in your development environment, so that you can modify them and watch them execute.

        +
        API Demos
        -
        A variety of small applications that demonstrate simple views and widgets.
        +
        A variety of small applications that demonstrate an extensive collection of framework topics.
        + +
        Home
        +
        An application for saving notes. Similar (but not identical) to the + Notepad tutorial.
        + +
        JetBoy
        +
        JetBoy is a game that demonstrates the SONiVOX JET interactive music technology, with {@link android.media.JetPlayer}.
        +
        Lunar Lander
        A classic Lunar Lander game.
        +
        Note Pad
        An application for saving notes. Similar (but not identical) to the Notepad tutorial.
        + +
        Snake
        +
        An implementation of the classic game "Snake."
        + +
        Soft Keyboard
        +
        An example of writing an input method for a software keyboard.
        +
        diff --git a/docs/html/guide/topics/manifest/manifest-intro.jd b/docs/html/guide/topics/manifest/manifest-intro.jd index 190702451f8da..89171c1d42f1d 100644 --- a/docs/html/guide/topics/manifest/manifest-intro.jd +++ b/docs/html/guide/topics/manifest/manifest-intro.jd @@ -78,10 +78,11 @@ other mention of the element name. <permission /> <permission-tree /> <permission-group /> - <instrumentation /> - <uses-sdk /> + <uses-configuration /> + <uses-feature /> + <supports-screens /> <application> @@ -111,11 +112,11 @@ other mention of the element name. <provider> <grant-uri-permission /> + <path-permission /> <meta-data /> </provider> <uses-library /> - <uses-configuration /> </application> @@ -140,19 +141,23 @@ add your own elements or attributes.
        <intent-filter>
        <manifest>
        <meta-data> +
        <path-permission />
        <permission>
        <permission-group>
        <permission-tree>
        <provider>
        <receiver>
        <service> +
        <supports-screens>
        <uses-configuration> +
        <uses-feature>
        <uses-library>
        <uses-permission>
        <uses-sdk>

        +

        File Conventions

        diff --git a/docs/html/guide/topics/manifest/path-permission-element.jd b/docs/html/guide/topics/manifest/path-permission-element.jd new file mode 100644 index 0000000000000..5c271a73b86fc --- /dev/null +++ b/docs/html/guide/topics/manifest/path-permission-element.jd @@ -0,0 +1,104 @@ +page.title=<path-permission> +@jd:body + +
        +
        syntax:
        +
        +<path-permission android:path="string"
        +                 android:pathPrefix="string"
        +                 android:pathPattern="string"
        +                 android:permission="string"
        +                 android:readPermission="string"
        +                 android:writePermission="string" />
        +
        + +
        contained in:
        +
        <provider>
        + + + +
        description:
        +
        Defines the path and required permissions for a specific subset of data +within a content provider. This element can be +specified multiple times to supply multiple paths. + +
        + +
        attributes:
        + +
        +
        {@code android:path}
        +
        A complete URI path for a subset of content provider data. +Permission can be granted only to the particular data identified by this path. +When used to provide search suggestion content, it must be appended +with "/search_suggest_query". +
        + +
        {@code android:pathPrefix}
        +
        The initial part of a URI path for a subset of content provider data. +Permission can be granted to all data subsets with paths that share this initial part. +
        + +
        {@code android:pathPattern}
        +
        A complete URI path for a subset of content provider data, +but one that can use the following wildcards: + +
          +
        • An asterisk ('*'). This matches a sequence of 0 to many occurrences of +the immediately preceding character.
        • + +
        • A period followed by an asterisk (".*"). This matches any sequence of +0 or more characters.
        • +
        + +

        +Because '\' is used as an escape character when the string is read +from XML (before it is parsed as a pattern), you will need to double-escape. +For example, a literal '*' would be written as "\\*" and a +literal '\' would be written as "\\". This is basically +the same as what you would need to write if constructing the string in Java code. +

        +

        +For more information on these types of patterns, see the descriptions of +PATTERN_LITERAL, +PATTERN_PREFIX, and +PATTERN_SIMPLE_GLOB in the +PatternMatcher class. +

        +
        + +
        {@code android:permission}
        +
        The name of a permission that clients must have in order to read or write the +content provider's data. This attribute is a convenient way of setting a +single permission for both reading and writing. However, the +readPermission and +writePermission attributes take precedence +over this one. +
        + +
        {@code android:readPermission}
        +
        A permission that clients must have in order to query the content provider. +
        + +
        {@code android:writePermission}
        +
        A permission that clients must have in order to make changes to the data controlled by the content provider. +
        + + + +
        + + +
        introduced in:
        +
        API Level 4
        + +
        see also:
        +
        {@link android.app.SearchManager}
        +
        {@link android.Manifest.permission}
        +
        Security and +Permissions
        + +
        diff --git a/docs/html/guide/topics/manifest/provider-element.jd b/docs/html/guide/topics/manifest/provider-element.jd index 2bb4ff40f03b2..3942f95084be3 100644 --- a/docs/html/guide/topics/manifest/provider-element.jd +++ b/docs/html/guide/topics/manifest/provider-element.jd @@ -25,7 +25,9 @@ page.title=<provider>
        can contain:
        <meta-data> -
        <grant-uri-permission>
        +
        <grant-uri-permission> +
        <path-permission /> +
        description:
        Declares a content provider — a subclass of diff --git a/docs/html/guide/topics/manifest/supports-screens-element.jd b/docs/html/guide/topics/manifest/supports-screens-element.jd new file mode 100644 index 0000000000000..00797edd55668 --- /dev/null +++ b/docs/html/guide/topics/manifest/supports-screens-element.jd @@ -0,0 +1,123 @@ +page.title=<supports-screens> +@jd:body + +
        + +
        syntax:
        +
        +
        +<supports-screens android:smallScreens=["true" | "false"] 
        +                  android:normalScreens=["true" | "false"] 
        +                  android:largeScreens=["true" | "false"] 
        +                  android:anyDensity=["true" | "false"] />
        +
        +
        + +
        contained in:
        +
        <manifest>
        + +
        description:
        +
        Lets you specify the screen dimensions the +application supports. By default a modern application (using API Level 4 or higher) supports all +screen sizes and must explicitly disable certain screen sizes here; +older applications are assumed to support only the "normal" +screen size. Note that screen size is a separate axis from +density. Screen size is determined as the available pixels to an application +after density scaling has been applied. + +

        Based on the target device screen density, the Android +framework will scale down assets by a factor of 0.75 (low dpi screens) +or scale them up by a factor of 1.5 (high dpi screens). +The screen density is expressed as dots-per-inch (dpi).

        + +

        Currently supported densities:

        +
          +
        • Low density: 120 dpi
        • +
        • Medium density: 160 dpi
        • +
        • High density: 240 dpi
        • +
        + +

        Table of display types:

        + + + + + + + + + + + + + + + + + + + + + + + +
        Low DensityMedium DensityHigh Density
        Small ScreenQVGAn/aVGA
        Normal ScreenWQVGAHVGAWVGA, FWVGA
        Large Screenn/aVGA, WVGA, FWVGAn/a
        + +
        + + +
        attributes:
        + +
        +
        {@code android:smallScreens}
        +
        Indicates whether the application supports smaller screen form-factors. + A small screen is defined as one with a smaller aspect ratio than + the "normal" (traditional HVGA) screen. An application that does + not support small screens will not be available for + small screen devices, because there is little the platform can do + to make such an application work on a smaller screen. Applications using + API Level 4 or higher default this to "true", others are "false". +
        + +
        {@code android:normalScreens}
        +
        Indicates whether an application supports the "normal" screen + form-factors. Traditionally this is an HVGA medium density + screen, but WQVGA low density and WVGA high density are also + considered to be normal. This attribute is "true" by default, + and applications currently should leave it that way. +
        + +
        {@code android:largeScreens}
        +
        Indicates whether the application supports larger screen form-factors. + A large screen is defined as a screen that is significantly larger + than a "normal" phone screen, and thus may require some special care + on the application's part to make good use of it. An application that + does not support large screens will be placed as a "postage stamp" on + such a screen, so that it retains the dimensions it was originally + designed for. Applications using API Level 4 or higher default + to "true", others are "false". +
        + +
        {@code android:anyDensity}
        +
        Indicates whether the application can accommodate any screen + density. Older applications (pre API Level 4) are assumed unable to + accomodate all densities and this is "false" by default. Applications using + API Level 4 or higher are assumed able to and this is "true" by default. + You can explicitly supply your abilities here. +
        + + +
        + + +
        introduced in:
        +
        API Level 4
        + +
        see also:
        +
        +
          +
        • {@link android.util.DisplayMetrics}
        • +
        +
        + +
        diff --git a/docs/html/guide/topics/manifest/uses-configuration-element.jd b/docs/html/guide/topics/manifest/uses-configuration-element.jd index b26881e1f0846..4578c63fa72fa 100755 --- a/docs/html/guide/topics/manifest/uses-configuration-element.jd +++ b/docs/html/guide/topics/manifest/uses-configuration-element.jd @@ -168,9 +168,14 @@ The value must be one of the following strings:
        API Level 3
        see also:
        -
        configChanges +
        +
        +element +
      • {@link android.content.pm.ConfigurationInfo}
      • +

      + diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd new file mode 100644 index 0000000000000..2626735cae115 --- /dev/null +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -0,0 +1,52 @@ +page.title=<uses-feature> +@jd:body + +
      + +
      syntax:
      +
      +
      +<uses-feature android:glEsVersion=["true" | "false"] />
      +
      +
      + +
      contained in:
      +
      <manifest>
      + +
      description:
      +
      This element specifies specific features used by the application. +Android provides some features that may not be equally supported by all +Android devices. In a manner similar to the <uses-sdk> +element, this element allows an application to specify which potentially variable +features it requires. In this way, the application +will not be installed on devices that do not offer the required feature.

      + +

      For example, an application might specify that it requires a certain version of Open GL. +If a device does not support that version of Open GL, then it will not allow installation of the application.

      +
      + + +
      attributes:
      + +
      +
      {@code android:glEsVersion}
      +
      The GLES version needed by the application. + The higher 16 bits represent the major number and the lower 16 bits + represent the minor number. For example, for GL 1.2 referring to + 0x00000102, the actual value should be set as 0x00010002. +
      +
      +
      + + +
      introduced in:
      +
      API Level 4
      + +
      see also:
      +
      +
        +
      • {@link android.content.pm.ConfigurationInfo}
      • +
      +
      + +
      diff --git a/docs/html/guide/topics/manifest/uses-sdk-element.jd b/docs/html/guide/topics/manifest/uses-sdk-element.jd index b6e73746cfd68..adcdc286cbed5 100644 --- a/docs/html/guide/topics/manifest/uses-sdk-element.jd +++ b/docs/html/guide/topics/manifest/uses-sdk-element.jd @@ -11,50 +11,68 @@ page.title=<uses-sdk>
      description:
      Lets you express an application's compatibility with one or more versions of the Android platform, by means of an API Level integer. The API Level expressed by an application will be compared to the -API Level of a given Android system, which may vary among different Android devices. To declare your -application's minimum API Level compatibility, use the minSdkVersion attribute. +API Level of a given Android system, which may vary among different Android devices.

      -The default level is 1. -

      - -

      -For more information on the API level, see the -Specifying -Minimum System API Version section of -Versioning Your -Applications. -

      - - -
      attributes:
      -
      -
      {@code android:minSdkVersion}
      -
      An integer designating the minimum level of the Android API that's required -for the application to run. - -

      -Despite its name, this attribute specifies the API Level, not the +Despite its name, this element is used to specify the API Level, not the version number of the SDK (software development kit). The API Level is always a single integer; the SDK version may be split into major and minor components (such as 1.5). You cannot derive the API Level from the SDK version number (for example, it is not the same as the major version or the sum of the major -and minor versions). To learn what the API Level is, check the notes that -came with the SDK you're using.

      +and minor versions).

      -

      Prior to installing an application, the Android system checks the value of this -attribute and allows the installation only if the -API Level is less than or equal to the API Level used by the system itself.

      +

      For more information, read about +Android API Levels and +Versioning Your Applications. +

      -

      If you do not declare this attribute, then a value of "1" is assumed, which -indicates that your application is compatible with all versions of Android. If your -application is not universally compatible (for instance if it uses APIs -introduced in Android 1.5) and you have not declared the proper minSdkVersion, -then when installed on a system with a lower API Level, the application -will crash during runtime. For this reason, be certain to declare the appropriate API Level -in the minSdkVersion attribute.

      -
      + +
      attributes:
      + +
      +
      +
      {@code android:minSdkVersion}
      +
      An integer designating the minimum level of the Android API that's required + for the application to run. + +

      Prior to installing an application, the Android system checks the value of this + attribute and allows the installation only if it + is less than or equal to the API Level used by the system itself.

      + +

      If you do not declare this attribute, then a value of "1" is assumed, which + indicates that your application is compatible with all versions of Android. If your + application is not universally compatible (for instance if it uses APIs + introduced in Android 1.5) and you have not declared the proper minSdkVersion, + then when installed on a system with a lower API Level, the application + will crash during runtime. For this reason, be certain to declare the appropriate API Level + in the minSdkVersion attribute.

      +
      + +
      {@code android:maxSdkVersion}
      +
      An integer designating the maximum level of the Android API that the application is + compatible with. You can use this to ensure your application is filtered out + of later versions of the platform when you know you have incompatibility with them.

      + +

      Prior to installing an application, the Android system checks the value of this + attribute and allows the installation only it + is greater than or equal to the API Level used by the system itself.

      + +

      Introduced in: API Level 4

      +
      + +
      {@code android:targetSdkVersion}
      +
      An integer designating the API Level that the application is targetting. + +

      With this attribute set, the application says that is is be able to run on + older versions (down to {@code minSdkVersion}), but was explicitly tested to work + with the version specified here. + Specifying this version allows the platform to disable compatibility + code that is not required or enable newer features that are not + available to older applications.

      + +

      Introduced in: API Level 4

      +
      diff --git a/include/utils/Asset.h b/include/utils/Asset.h index 453a2049ad3c6..5908bccedd64d 100644 --- a/include/utils/Asset.h +++ b/include/utils/Asset.h @@ -45,6 +45,7 @@ public: virtual ~Asset(void); static int32_t getGlobalCount(); + static String8 getAssetAllocations(); /* used when opening an asset */ typedef enum AccessMode { @@ -109,6 +110,12 @@ public: */ virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const = 0; + /* + * Return whether this asset's buffer is allocated in RAM (not mmapped). + * Note: not virtual so it is safe to call even when being destroyed. + */ + virtual bool isAllocated(void) const { return false; } + /* * Get a string identifying the asset's source. This might be a full * path, it might be a colon-separated list of identifiers. @@ -197,6 +204,9 @@ private: AccessMode mAccessMode; // how the asset was opened String8 mAssetSource; // debug string + + Asset* mNext; // linked list. + Asset* mPrev; }; @@ -239,6 +249,7 @@ public: virtual off_t getLength(void) const { return mLength; } virtual off_t getRemainingLength(void) const { return mLength-mOffset; } virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const; + virtual bool isAllocated(void) const { return mBuf != NULL; } private: off_t mStart; // absolute file offset of start of chunk @@ -295,6 +306,7 @@ public: virtual off_t getLength(void) const { return mUncompressedLen; } virtual off_t getRemainingLength(void) const { return mUncompressedLen-mOffset; } virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const { return -1; } + virtual bool isAllocated(void) const { return mBuf != NULL; } private: off_t mStart; // offset to start of compressed data diff --git a/keystore/MODULE_LICENSE_APACHE2 b/keystore/MODULE_LICENSE_APACHE2 new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/keystore/NOTICE b/keystore/NOTICE new file mode 100644 index 0000000000000..64aaa8dbd68e6 --- /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/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp index f5bdedaa1340c..da7cc8a6aa62a 100644 --- a/libs/audioflinger/AudioFlinger.cpp +++ b/libs/audioflinger/AudioFlinger.cpp @@ -202,8 +202,8 @@ void AudioFlinger::setA2dpEnabled_l(bool enable) SortedVector < sp > tracks; SortedVector < wp > activeTracks; - LOGV_IF(enable, "set output to A2DP\n"); - LOGV_IF(!enable, "set output to hardware audio\n"); + LOGD_IF(enable, "set output to A2DP\n"); + LOGD_IF(!enable, "set output to hardware audio\n"); // Transfer tracks playing on MUSIC stream from one mixer to the other if (enable) { @@ -212,6 +212,7 @@ void AudioFlinger::setA2dpEnabled_l(bool enable) } else { mA2dpMixerThread->getTracks_l(tracks, activeTracks); mHardwareMixerThread->putTracks_l(tracks, activeTracks); + mA2dpMixerThread->mOutput->standby(); } mA2dpEnabled = enable; mNotifyA2dpChange = true; diff --git a/libs/utils/Asset.cpp b/libs/utils/Asset.cpp index 23cb72d4efca2..42951237d6274 100644 --- a/libs/utils/Asset.cpp +++ b/libs/utils/Asset.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -40,24 +41,71 @@ using namespace android; # define O_BINARY 0 #endif -static volatile int32_t gCount = 0; +static Mutex gAssetLock; +static int32_t gCount = 0; +static Asset* gHead = NULL; +static Asset* gTail = NULL; int32_t Asset::getGlobalCount() { + AutoMutex _l(gAssetLock); return gCount; } +String8 Asset::getAssetAllocations() +{ + AutoMutex _l(gAssetLock); + String8 res; + Asset* cur = gHead; + while (cur != NULL) { + if (cur->isAllocated()) { + res.append(" "); + res.append(cur->getAssetSource()); + off_t size = (cur->getLength()+512)/1024; + char buf[64]; + sprintf(buf, ": %dK\n", (int)size); + res.append(buf); + } + cur = cur->mNext; + } + + return res; +} + Asset::Asset(void) : mAccessMode(ACCESS_UNKNOWN) { - int count = android_atomic_inc(&gCount)+1; - //LOGI("Creating Asset %p #%d\n", this, count); + AutoMutex _l(gAssetLock); + gCount++; + mNext = mPrev = NULL; + if (gTail == NULL) { + gHead = gTail = this; + } else { + mPrev = gTail; + gTail->mNext = this; + gTail = this; + } + //LOGI("Creating Asset %p #%d\n", this, gCount); } Asset::~Asset(void) { - int count = android_atomic_dec(&gCount); - //LOGI("Destroying Asset in %p #%d\n", this, count); + AutoMutex _l(gAssetLock); + gCount--; + if (gHead == this) { + gHead = mNext; + } + if (gTail == this) { + gTail = mPrev; + } + if (mNext != NULL) { + mNext->mPrev = mPrev; + } + if (mPrev != NULL) { + mPrev->mNext = mNext; + } + mNext = mPrev = NULL; + //LOGI("Destroying Asset in %p #%d\n", this, gCount); } /* diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 645f3f63a6ef9..6d7c0ae2facf7 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -128,7 +128,10 @@ public class ExifInterface { } public void setFilename(String filename) { - mFilename = filename; + if (mFilename == null || !mFilename.equals(filename)) { + mFilename = filename; + mCachedAttributes = null; + } } /** diff --git a/media/libdrm/mobile1/Android.mk b/media/libdrm/mobile1/Android.mk index 2065cd2ed6463..f1057993b6cea 100644 --- a/media/libdrm/mobile1/Android.mk +++ b/media/libdrm/mobile1/Android.mk @@ -36,15 +36,15 @@ LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include/objmng \ $(LOCAL_PATH)/include/parser \ $(LOCAL_PATH)/include/xml \ - external/aes \ + external/openssl/include \ $(call include-path-for, system-core)/cutils LOCAL_CFLAGS := $(LOCAL_DRM_CFLAG) LOCAL_SHARED_LIBRARIES := \ - libaes \ - libutils \ - libcutils + libutils \ + libcutils \ + libcrypto LOCAL_MODULE := libdrm1 @@ -66,15 +66,14 @@ LOCAL_SRC_FILES := \ # Header files path LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ - $(LOCAL_PATH)/include/parser \ + $(LOCAL_PATH)/include/parser \ $(JNI_H_INCLUDE) \ - $(call include-path-for, system-core)/cutils \ - external/aes + $(call include-path-for, system-core)/cutils LOCAL_SHARED_LIBRARIES := libdrm1 \ - libutils \ - libcutils + libutils \ + libcutils LOCAL_MODULE := libdrm1_jni diff --git a/media/libdrm/mobile1/include/objmng/drm_rights_manager.h b/media/libdrm/mobile1/include/objmng/drm_rights_manager.h index dd2116c3e8467..d81e7a18a57f3 100644 --- a/media/libdrm/mobile1/include/objmng/drm_rights_manager.h +++ b/media/libdrm/mobile1/include/objmng/drm_rights_manager.h @@ -21,9 +21,9 @@ extern "C" { #endif +#include #include #include -#include #ifdef DRM_DEVICE_ARCH_ARM #define ANDROID_DRM_CORE_PATH "/data/drm/rights/" @@ -141,12 +141,12 @@ void drm_discardPaddingByte(uint8_t *decryptedBuf, int32_t *decryptedBufLen); * * \param Buffer The buffer to decrypted and also used to save the output data. * \param BufferLen The length of the buffer data and also save the output data length. - * \param ctx The structure of the CEK. + * \param key The structure of the CEK. * * \return * -0 */ -int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx ctx[1]); +int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, AES_KEY *key); /** * Update the DCF data length according the CEK. diff --git a/media/libdrm/mobile1/src/objmng/drm_api.c b/media/libdrm/mobile1/src/objmng/drm_api.c index 0e453de3d1fd7..249cdbeb734f4 100644 --- a/media/libdrm/mobile1/src/objmng/drm_api.c +++ b/media/libdrm/mobile1/src/objmng/drm_api.c @@ -22,7 +22,6 @@ #include #include #include -#include #include "log.h" /** @@ -1578,7 +1577,7 @@ static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t int32_t readBytes = 0; int32_t bufLen, piece, i, copyBytes, leftBytes; int32_t aesStart, mediaStart, mediaBufOff; - aes_decrypt_ctx ctx[1]; + AES_KEY key; if (FALSE == drm_getKey(s->contentID, keyValue)) return DRM_NO_RIGHTS; @@ -1600,7 +1599,7 @@ static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t piece = (offset + readBytes - 1) / DRM_ONE_AES_BLOCK_LEN - offset / DRM_ONE_AES_BLOCK_LEN + 2; mediaStart = offset % DRM_ONE_AES_BLOCK_LEN; - aes_decrypt_key128(keyValue, ctx); + AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key); mediaBufOff = 0; leftBytes = readBytes; @@ -1608,7 +1607,7 @@ static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t memcpy(buf, s->rawContent + aesStart + i * DRM_ONE_AES_BLOCK_LEN, DRM_TWO_AES_BLOCK_LEN); bufLen = DRM_TWO_AES_BLOCK_LEN; - if (drm_aesDecBuffer(buf, &bufLen, ctx) < 0) + if (drm_aesDecBuffer(buf, &bufLen, &key) < 0) return DRM_MEDIA_DATA_INVALID; if (0 != i) @@ -1651,7 +1650,7 @@ static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t piece = (offset + leftBytes - 1) / DRM_ONE_AES_BLOCK_LEN - offset / DRM_ONE_AES_BLOCK_LEN + 2; mediaBufOff = readBytes; - aes_decrypt_key128(keyValue, ctx); + AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key); for (i = 0; i < piece - 1; i++) { if (-1 == (res = drm_readAesData(buf, s, aesStart, DRM_TWO_AES_BLOCK_LEN))) @@ -1663,7 +1662,7 @@ static int32_t drm_readAesContent(T_DRM_Session_Node* s, int32_t offset, uint8_t bufLen = DRM_TWO_AES_BLOCK_LEN; aesStart += DRM_ONE_AES_BLOCK_LEN; - if (drm_aesDecBuffer(buf, &bufLen, ctx) < 0) + if (drm_aesDecBuffer(buf, &bufLen, &key) < 0) return DRM_MEDIA_DATA_INVALID; drm_discardPaddingByte(buf, &bufLen); diff --git a/media/libdrm/mobile1/src/objmng/drm_rights_manager.c b/media/libdrm/mobile1/src/objmng/drm_rights_manager.c index 80901f5753c02..df22327b1d242 100644 --- a/media/libdrm/mobile1/src/objmng/drm_rights_manager.c +++ b/media/libdrm/mobile1/src/objmng/drm_rights_manager.c @@ -573,7 +573,7 @@ void drm_discardPaddingByte(uint8_t *decryptedBuf, int32_t *decryptedBufLen) return; } -int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx ctx[1]) +int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, AES_KEY *key) { uint8_t dbuf[3 * DRM_ONE_AES_BLOCK_LEN], buf[DRM_ONE_AES_BLOCK_LEN]; uint64_t i, len, wlen = DRM_ONE_AES_BLOCK_LEN, curLen, restLen; @@ -596,7 +596,7 @@ int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx if (len < 2 * DRM_ONE_AES_BLOCK_LEN) { /* The original file is less than one block in length */ len -= DRM_ONE_AES_BLOCK_LEN; /* Decrypt from position len to position len + DRM_ONE_AES_BLOCK_LEN */ - aes_decrypt((dbuf + len), (dbuf + len), ctx); + AES_decrypt((dbuf + len), (dbuf + len), key); /* Undo the CBC chaining */ for (i = 0; i < len; ++i) @@ -620,7 +620,7 @@ int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx Buffer += len; /* Decrypt the b2 block */ - aes_decrypt((uint8_t *)b2, buf, ctx); + AES_decrypt((uint8_t *)b2, buf, key); if (len == 0 || len == DRM_ONE_AES_BLOCK_LEN) { /* No ciphertext stealing */ /* Unchain CBC using the previous ciphertext block in b1 */ @@ -639,7 +639,7 @@ int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx b3[i] = buf[i]; /* Decrypt the C[N-1] block in b3 */ - aes_decrypt((uint8_t *)b3, (uint8_t *)b3, ctx); + AES_decrypt((uint8_t *)b3, (uint8_t *)b3, key); /* Produce the last but one plaintext block by xoring with */ /* The last but two ciphertext block */ @@ -669,15 +669,15 @@ int32_t drm_aesDecBuffer(uint8_t * Buffer, int32_t * BufferLen, aes_decrypt_ctx int32_t drm_updateDcfDataLen(uint8_t* pDcfLastData, uint8_t* keyValue, int32_t* moreBytes) { - aes_decrypt_ctx ctx[1]; + AES_KEY key; int32_t len = DRM_TWO_AES_BLOCK_LEN; if (NULL == pDcfLastData || NULL == keyValue) return FALSE; - aes_decrypt_key128(keyValue, ctx); + AES_set_decrypt_key(keyValue, DRM_KEY_LEN * 8, &key); - if (drm_aesDecBuffer(pDcfLastData, &len, ctx) < 0) + if (drm_aesDecBuffer(pDcfLastData, &len, &key) < 0) return FALSE; drm_discardPaddingByte(pDcfLastData, &len); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java index bd4c88e85701d..442c35be1a26d 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java @@ -304,7 +304,8 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase #include #include +#include #include #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 @@ -56,6 +65,79 @@ struct afterSynthData_t { AudioSystem::stream_type streamType; }; +// ---------------------------------------------------------------------------- +// 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 32767.0f) { + buffer[i] = 32767; + } else if (out0 < -32768.0f) { + buffer[i] = -32768; + } else { + buffer[i] = (int16_t) out0; + } + } +} + + // ---------------------------------------------------------------------------- static fields_t javaTTSFields; @@ -198,12 +280,13 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate, 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 @@ static tts_callback_status ttsSynthDoneCB(void *& userdata, uint32_t rate, } } } 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 @@ android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz, env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData, (int)pJniStorage); + initializeEQ(); + env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString); } @@ -479,6 +565,8 @@ android_tts_SynthProxy_synthesizeToFile(JNIEnv *env, jobject thiz, jint jniData, return result; } + initializeFilter(); + Mutex::Autolock l(engineMutex); // Retrieve audio parameters before writing the file header @@ -583,6 +671,8 @@ android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData, return result; } + initializeFilter(); + Mutex::Autolock l(engineMutex); SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData; diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index 1b99d32cc9c08..cd24727e8f7a3 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -172,10 +172,18 @@ public class TtsService extends Service implements OnCompletionListener { @Override public void onDestroy() { super.onDestroy(); + + // TODO replace the call to stopAll() with a method to clear absolutely all upcoming + // uses of the native synth, including synthesis to a file, and delete files for which + // synthesis was not complete. + stopAll(""); + // Don't hog the media player cleanUpPlayer(); - sNativeSynth.shutdown(); + if (sNativeSynth != null) { + sNativeSynth.shutdown(); + } sNativeSynth = null; // Unregister all callbacks. @@ -243,38 +251,70 @@ public class TtsService extends Service implements OnCompletionListener { private int setSpeechRate(String callingApp, int rate) { - if (isDefaultEnforced()) { - return sNativeSynth.setSpeechRate(getDefaultRate()); - } else { - return sNativeSynth.setSpeechRate(rate); + int res = TextToSpeech.ERROR; + try { + if (isDefaultEnforced()) { + res = sNativeSynth.setSpeechRate(getDefaultRate()); + } else { + res = sNativeSynth.setSpeechRate(rate); + } + } catch (NullPointerException e) { + // synth will become null during onDestroy() + res = TextToSpeech.ERROR; } + return res; } private int setPitch(String callingApp, int pitch) { - return sNativeSynth.setPitch(pitch); + int res = TextToSpeech.ERROR; + try { + res = sNativeSynth.setPitch(pitch); + } catch (NullPointerException e) { + // synth will become null during onDestroy() + res = TextToSpeech.ERROR; + } + return res; } private int isLanguageAvailable(String lang, String country, String variant) { //Log.v("TtsService", "TtsService.isLanguageAvailable(" + lang + ", " + country + ", " +variant+")"); - return sNativeSynth.isLanguageAvailable(lang, country, variant); + int res = TextToSpeech.LANG_NOT_SUPPORTED; + try { + res = sNativeSynth.isLanguageAvailable(lang, country, variant); + } catch (NullPointerException e) { + // synth will become null during onDestroy() + res = TextToSpeech.LANG_NOT_SUPPORTED; + } + return res; } private String[] getLanguage() { - return sNativeSynth.getLanguage(); + try { + return sNativeSynth.getLanguage(); + } catch (Exception e) { + return null; + } } private int setLanguage(String callingApp, String lang, String country, String variant) { Log.v("TtsService", "TtsService.setLanguage(" + lang + ", " + country + ", " + variant + ")"); - if (isDefaultEnforced()) { - return sNativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(), - getDefaultLocVariant()); - } else { - return sNativeSynth.setLanguage(lang, country, variant); + int res = TextToSpeech.ERROR; + try { + if (isDefaultEnforced()) { + res = sNativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(), + getDefaultLocVariant()); + } else { + res = sNativeSynth.setLanguage(lang, country, variant); + } + } catch (NullPointerException e) { + // synth will become null during onDestroy() + res = TextToSpeech.ERROR; } + return res; } @@ -402,7 +442,12 @@ public class TtsService extends Service implements OnCompletionListener { } if ((mCurrentSpeechItem != null) && mCurrentSpeechItem.mCallingApp.equals(callingApp)) { - result = sNativeSynth.stop(); + try { + result = sNativeSynth.stop(); + } catch (NullPointerException e1) { + // synth will become null during onDestroy() + result = TextToSpeech.ERROR; + } mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { @@ -434,7 +479,8 @@ public class TtsService extends Service implements OnCompletionListener { /** - * Stops all speech output and removes any utterances still in the queue globally. + * Stops all speech output and removes any utterances still in the queue globally, except + * those intended to be synthesized to file. */ private int stopAll(String callingApp) { int result = TextToSpeech.ERROR; @@ -451,7 +497,12 @@ public class TtsService extends Service implements OnCompletionListener { if ((mCurrentSpeechItem != null) && ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) || mCurrentSpeechItem.mCallingApp.equals(callingApp))) { - result = sNativeSynth.stop(); + try { + result = sNativeSynth.stop(); + } catch (NullPointerException e1) { + // synth will become null during onDestroy() + result = TextToSpeech.ERROR; + } mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { @@ -591,7 +642,12 @@ public class TtsService extends Service implements OnCompletionListener { if (speechRate.length() > 0){ setSpeechRate("", Integer.parseInt(speechRate)); } - sNativeSynth.speak(speechItem.mText, streamType); + try { + sNativeSynth.speak(speechItem.mText, streamType); + } catch (NullPointerException e) { + // synth will become null during onDestroy() + Log.v("TtsService", " null synth, can't speak"); + } } } catch (InterruptedException e) { Log.e("TtsService", "TTS speakInternalOnly(): tryLock interrupted"); @@ -660,7 +716,12 @@ public class TtsService extends Service implements OnCompletionListener { if (speechRate.length() > 0){ setSpeechRate("", Integer.parseInt(speechRate)); } - sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + try { + sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + } catch (NullPointerException e) { + // synth will become null during onDestroy() + Log.v("TtsService", " null synth, can't synthesize to file"); + } } } catch (InterruptedException e) { Log.e("TtsService", "TTS synthToFileInternalOnly(): tryLock interrupted"); diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnService.java b/packages/VpnServices/src/com/android/server/vpn/VpnService.java index f410c7b932a10..e3ac996fc6797 100644 --- a/packages/VpnServices/src/com/android/server/vpn/VpnService.java +++ b/packages/VpnServices/src/com/android/server/vpn/VpnService.java @@ -133,11 +133,7 @@ abstract class VpnService implements Serializable { if (VpnState.CONNECTED.equals(mState)) { Log.i("VpnService", " recovered: " + mProfile.getName()); - new Thread(new Runnable() { - public void run() { - enterConnectivityLoop(); - } - }).start(); + startConnectivityMonitor(); } } @@ -213,16 +209,18 @@ abstract class VpnService implements Serializable { SystemProperties.get(VPN_STATUS))) { onConnected(); return; - } else if (mDaemonHelper.anySocketError()) { - return; + } else { + int err = mDaemonHelper.getSocketError(); + if (err != 0) { + onError(err); + return; + } } sleep(500); // 0.5 second } - synchronized (VpnService.this) { - if (mState == VpnState.CONNECTING) { - onError(new IOException("Connecting timed out")); - } + if (mState == VpnState.CONNECTING) { + onError(new IOException("Connecting timed out")); } } @@ -235,13 +233,15 @@ abstract class VpnService implements Serializable { mStartTime = System.currentTimeMillis(); - // set DNS after saving the states in case the process gets killed - // before states are saved + // Correct order to make sure VpnService doesn't break when killed: + // (1) set state to CONNECTED + // (2) save states + // (3) set DNS + setState(VpnState.CONNECTED); saveSelf(); setVpnDns(); - setState(VpnState.CONNECTED); - enterConnectivityLoop(); + startConnectivityMonitor(); } private void saveSelf() throws IOException { @@ -340,23 +340,28 @@ abstract class VpnService implements Serializable { } } - private void enterConnectivityLoop() { - Log.i(TAG, "VPN connectivity monitor running"); - try { - for (;;) { - synchronized (VpnService.this) { - if (mState != VpnState.CONNECTED || !checkConnectivity()) { - break; + private void startConnectivityMonitor() { + new Thread(new Runnable() { + public void run() { + Log.i(TAG, "VPN connectivity monitor running"); + try { + for (;;) { + synchronized (VpnService.this) { + if ((mState != VpnState.CONNECTED) + || !checkConnectivity()) { + break; + } + mNotification.update(); + checkDns(); + VpnService.this.wait(1000); // 1 second + } } - mNotification.update(); - checkDns(); - VpnService.this.wait(1000); // 1 second + } catch (InterruptedException e) { + onError(e); } + Log.i(TAG, "VPN connectivity monitor stopped"); } - } catch (InterruptedException e) { - onError(e); - } - Log.i(TAG, "VPN connectivity monitor stopped"); + }).start(); } private void saveLocalIpAndInterface(String serverIp) throws IOException { @@ -432,11 +437,7 @@ abstract class VpnService implements Serializable { } synchronized void stopAll() { - if (mDaemonList.isEmpty()) { - onFinalCleanUp(); - } else { - for (DaemonProxy s : mDaemonList) s.stop(); - } + for (DaemonProxy s : mDaemonList) s.stop(); } synchronized void closeSockets() { @@ -461,30 +462,26 @@ abstract class VpnService implements Serializable { } } - synchronized boolean anySocketError() { + synchronized int getSocketError() { for (DaemonProxy s : mDaemonList) { switch (getResultFromSocket(s)) { case 0: continue; case AUTH_ERROR_CODE: - onError(VpnManager.VPN_ERROR_AUTH); - return true; + return VpnManager.VPN_ERROR_AUTH; case CHALLENGE_ERROR_CODE: - onError(VpnManager.VPN_ERROR_CHALLENGE); - return true; + return VpnManager.VPN_ERROR_CHALLENGE; case REMOTE_HUNG_UP_ERROR_CODE: - onError(VpnManager.VPN_ERROR_REMOTE_HUNG_UP); - return true; + return VpnManager.VPN_ERROR_REMOTE_HUNG_UP; default: - onError(VpnManager.VPN_ERROR_CONNECTION_FAILED); - return true; + return VpnManager.VPN_ERROR_CONNECTION_FAILED; } } - return false; + return 0; } } diff --git a/preloaded-classes b/preloaded-classes index 0520e4106082c..69c596c4dc8dc 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -1,194 +1,248 @@ # Classes which are preloaded by com.android.internal.os.ZygoteInit. +# 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.IAccountsService$Stub android.app.Activity android.app.ActivityGroup -android.app.ActivityManager$MemoryInfo$1 +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$ContextCleanupInfo -android.app.ActivityThread$GcIdler android.app.ActivityThread$H -android.app.ActivityThread$Idler -android.app.ActivityThread$PackageInfo -android.app.ActivityThread$PackageInfo$ReceiverDispatcher -android.app.ActivityThread$PackageInfo$ReceiverDispatcher$InnerReceiver -android.app.ActivityThread$PackageInfo$ServiceDispatcher -android.app.ActivityThread$PackageInfo$ServiceDispatcher$InnerConnection -android.app.ActivityThread$ProviderRecord -android.app.ActivityThread$ProviderRefCount android.app.AlertDialog android.app.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.ApplicationLoaders +android.app.ApplicationContext$WallpaperCallback android.app.ApplicationThreadNative +android.app.DatePickerDialog android.app.Dialog android.app.ExpandableListActivity android.app.IActivityManager -android.app.IActivityManager$ContentProviderHolder$1 +android.app.IActivityManager$ContentProviderHolder android.app.IAlarmManager$Stub -android.app.IAlarmManager$Stub$Proxy -android.app.IApplicationThread android.app.INotificationManager$Stub -android.app.INotificationManager$Stub$Proxy -android.app.ISearchManager android.app.ISearchManager$Stub -android.app.ISearchManager$Stub$Proxy +android.app.ISearchManagerCallback$Stub +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.Notification -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.SearchDialog -android.app.SearchDialog$SearchAutoComplete +android.app.SearchManager$SearchManagerCallback 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.BluetoothAudioGateway +android.bluetooth.BluetoothDevice +android.bluetooth.Database +android.bluetooth.HeadsetBase +android.bluetooth.IBluetoothA2dp +android.bluetooth.IBluetoothA2dp$Stub +android.bluetooth.IBluetoothDevice +android.bluetooth.IBluetoothDevice$Stub +android.bluetooth.IBluetoothDevice$Stub$Proxy +android.bluetooth.RfcommSocket +android.bluetooth.ScoSocket android.content.AbstractSyncableContentProvider android.content.AbstractTableMerger -android.content.AsyncQueryHandler$WorkerHandler -android.content.BroadcastReceiver -android.content.ComponentCallbacks android.content.ComponentName -android.content.ComponentName$1 android.content.ContentProvider$Transport -android.content.ContentProviderProxy -android.content.ContentQueryMap -android.content.ContentQueryMap$1 android.content.ContentResolver android.content.ContentResolver$CursorWrapperInner android.content.ContentValues android.content.Context android.content.ContextWrapper -android.content.DialogInterface -android.content.DialogInterface$OnCancelListener -android.content.DialogInterface$OnDismissListener -android.content.IContentProvider -android.content.IContentService +android.content.DialogInterface$OnMultiChoiceClickListener android.content.IContentService$Stub +android.content.ISyncAdapter$Stub android.content.Intent -android.content.Intent$1 +android.content.Intent$ShortcutIconResource android.content.IntentFilter -android.content.SearchRecentSuggestionsProvider -android.content.ServiceConnection -android.content.SharedPreferences +android.content.SyncAdapter$Transport android.content.SyncResult -android.content.SyncResult$1 +android.content.SyncStateContentProviderHelper android.content.SyncStats -android.content.SyncStats$1 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.IPackageManager +android.content.pm.ConfigurationInfo +android.content.pm.IPackageDataObserver$Stub +android.content.pm.IPackageDeleteObserver$Stub 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.PackageItemInfo +android.content.pm.PackageInfo android.content.pm.PackageManager -android.content.pm.PackageManager$NameNotFoundException +android.content.pm.PackageStats +android.content.pm.PathPermission android.content.pm.PermissionInfo -android.content.pm.ProviderInfo -android.content.pm.ProviderInfo$1 -android.content.pm.ResolveInfo$1 -android.content.pm.ServiceInfo$1 +android.content.pm.ResolveInfo +android.content.pm.Signature +android.content.res.AssetFileDescriptor +android.content.res.AssetFileDescriptor$1 android.content.res.AssetManager android.content.res.AssetManager$AssetInputStream android.content.res.ColorStateList android.content.res.ColorStateList$1 +android.content.res.CompatibilityInfo +android.content.res.CompatibilityInfo$1 android.content.res.Configuration +android.content.res.Configuration$1 android.content.res.Resources -android.content.res.Resources$Theme +android.content.res.Resources$1 android.content.res.StringBlock 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.ContentObservable -android.database.ContentObserver$Transport -android.database.Cursor +android.database.CharArrayBuffer +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.IContentObserver$Stub$Proxy +android.database.DatabaseUtils +android.database.MatrixCursor android.database.MergeCursor +android.database.sqlite.SQLiteClosable android.database.sqlite.SQLiteCursor 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.SQLiteProgram android.database.sqlite.SQLiteQuery +android.database.sqlite.SQLiteQueryBuilder android.database.sqlite.SQLiteStatement -android.ddm.DdmHandleAppName -android.ddm.DdmHandleExit android.ddm.DdmHandleHeap android.ddm.DdmHandleHello android.ddm.DdmHandleNativeHeap +android.ddm.DdmHandleProfiling android.ddm.DdmHandleThread android.ddm.DdmRegister +android.debug.JNITest +android.emoji.EmojiFactory +android.graphics.AvoidXfermode android.graphics.Bitmap +android.graphics.Bitmap$1 +android.graphics.Bitmap$CompressFormat +android.graphics.Bitmap$Config +android.graphics.BitmapFactory +android.graphics.BitmapFactory$Options android.graphics.BitmapShader +android.graphics.BlurMaskFilter +android.graphics.Camera android.graphics.Canvas -android.graphics.Canvas$EdgeType android.graphics.Color +android.graphics.ColorFilter +android.graphics.ColorMatrixColorFilter +android.graphics.ComposePathEffect +android.graphics.ComposeShader +android.graphics.CornerPathEffect +android.graphics.DashPathEffect +android.graphics.DiscretePathEffect +android.graphics.DrawFilter +android.graphics.EmbossMaskFilter android.graphics.Interpolator +android.graphics.LayerRasterizer +android.graphics.LightingColorFilter android.graphics.LinearGradient +android.graphics.MaskFilter android.graphics.Matrix -android.graphics.Matrix$ScaleToFit +android.graphics.Movie android.graphics.NinePatch android.graphics.Paint +android.graphics.Paint$Align +android.graphics.Paint$Cap +android.graphics.Paint$FontMetrics +android.graphics.Paint$FontMetricsInt +android.graphics.Paint$Join +android.graphics.Paint$Style android.graphics.PaintFlagsDrawFilter android.graphics.Path -android.graphics.Path$Direction +android.graphics.Path$FillType +android.graphics.PathDashPathEffect +android.graphics.PathEffect +android.graphics.PathMeasure android.graphics.Picture -android.graphics.PorterDuff +android.graphics.PixelFormat +android.graphics.PixelXorXfermode +android.graphics.Point +android.graphics.PointF android.graphics.PorterDuff$Mode +android.graphics.PorterDuffColorFilter android.graphics.PorterDuffXfermode +android.graphics.RadialGradient +android.graphics.Rasterizer android.graphics.Rect +android.graphics.Rect$1 android.graphics.RectF +android.graphics.RectF$1 android.graphics.Region +android.graphics.Region$1 android.graphics.Region$Op +android.graphics.RegionIterator android.graphics.Shader android.graphics.Shader$TileMode +android.graphics.SumPathEffect +android.graphics.SweepGradient android.graphics.Typeface android.graphics.Xfermode +android.graphics.drawable.Animatable +android.graphics.drawable.AnimatedRotateDrawable +android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState android.graphics.drawable.AnimationDrawable +android.graphics.drawable.AnimationDrawable$AnimationState android.graphics.drawable.BitmapDrawable android.graphics.drawable.BitmapDrawable$BitmapState +android.graphics.drawable.ClipDrawable +android.graphics.drawable.ClipDrawable$ClipState android.graphics.drawable.ColorDrawable android.graphics.drawable.ColorDrawable$ColorState android.graphics.drawable.Drawable +android.graphics.drawable.Drawable$Callback +android.graphics.drawable.Drawable$ConstantState android.graphics.drawable.DrawableContainer +android.graphics.drawable.DrawableContainer$DrawableContainerState android.graphics.drawable.GradientDrawable +android.graphics.drawable.GradientDrawable$GradientState +android.graphics.drawable.GradientDrawable$Orientation android.graphics.drawable.LayerDrawable android.graphics.drawable.LayerDrawable$ChildDrawable android.graphics.drawable.LayerDrawable$LayerState @@ -196,379 +250,432 @@ android.graphics.drawable.NinePatchDrawable android.graphics.drawable.NinePatchDrawable$NinePatchState android.graphics.drawable.PaintDrawable android.graphics.drawable.RotateDrawable -android.graphics.drawable.RotateDrawable$RotateState -android.graphics.drawable.ScaleDrawable -android.graphics.drawable.ScaleDrawable$ScaleState android.graphics.drawable.ShapeDrawable -android.graphics.drawable.ShapeDrawable$ShapeState android.graphics.drawable.StateListDrawable android.graphics.drawable.StateListDrawable$StateListState android.graphics.drawable.TransitionDrawable android.graphics.drawable.TransitionDrawable$TransitionState android.graphics.drawable.shapes.RoundRectShape +android.hardware.Camera +android.hardware.ISensorService$Stub android.hardware.SensorManager +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.Criteria android.location.ILocationManager$Stub +android.location.ILocationManager$Stub$Proxy +android.location.ILocationProvider +android.location.ILocationProvider$Stub android.location.Location +android.location.LocationManager +android.location.LocationManager$ListenerTransport +android.location.LocationManager$LpPowerComparator +android.media.AudioFormat android.media.AudioManager +android.media.AudioRecord +android.media.AudioSystem +android.media.AudioTrack +android.media.ExifInterface +android.media.FaceDetector +android.media.FaceDetector$Face android.media.IAudioService$Stub android.media.IAudioService$Stub$Proxy +android.media.JetPlayer +android.media.MediaMetadataRetriever android.media.MediaPlayer +android.media.MediaRecorder +android.media.MediaScanner +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$Stub +android.net.LocalServerSocket android.net.LocalSocket -android.net.LocalSocketAddress android.net.LocalSocketAddress$Namespace android.net.LocalSocketImpl android.net.LocalSocketImpl$SocketInputStream android.net.LocalSocketImpl$SocketOutputStream -android.net.NetworkConnectivityListener$State +android.net.NetworkConnectivityListener android.net.NetworkInfo android.net.NetworkInfo$DetailedState -android.net.SSLCertificateSocketFactory +android.net.NetworkUtils android.net.Uri -android.net.Uri$1 -android.net.Uri$AbstractHierarchicalUri -android.net.Uri$AbstractPart android.net.Uri$HierarchicalUri android.net.Uri$OpaqueUri android.net.Uri$Part -android.net.Uri$Part$EmptyPart -android.net.Uri$PathPart -android.net.Uri$PathSegments android.net.Uri$StringUri android.net.WebAddress android.net.http.AndroidHttpClient -android.net.http.AndroidHttpClient$1 android.net.http.AndroidHttpClient$2 -android.net.http.AndroidHttpClient$CurlLogger -android.net.http.DomainNameChecker android.net.http.CertificateChainValidator +android.net.http.Connection +android.net.http.DomainNameChecker android.net.http.EventHandler +android.net.http.Headers android.net.http.HttpsConnection +android.net.http.Request android.net.http.RequestQueue -android.net.http.SslError +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$Stub -android.net.wifi.SupplicantState -android.net.wifi.WifiConfiguration -android.net.wifi.WifiInfo -android.opengl.Material +android.net.wifi.IWifiManager$Stub$Proxy +android.net.wifi.WifiManager +android.net.wifi.WifiNative +android.opengl.GLES10 +android.opengl.GLES10Ext +android.opengl.GLES11 +android.opengl.GLES11Ext +android.opengl.GLU +android.opengl.GLUtils +android.opengl.Matrix +android.opengl.Visibility +android.os.Base64Utils android.os.Binder android.os.BinderProxy 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 +android.os.Exec +android.os.FileObserver$ObserverThread android.os.FileUtils +android.os.FileUtils$FileStatus android.os.Handler -android.os.HandlerThread +android.os.Hardware android.os.IBinder +android.os.ICheckinService$Stub android.os.IHardwareService$Stub -android.os.IHardwareService$Stub$Proxy +android.os.IInterface +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.Parcelable +android.os.Parcelable$Creator android.os.PatternMatcher -android.os.PatternMatcher$1 -android.os.PowerManager -android.os.PowerManager$WakeLock -android.os.PowerManager$WakeLock$1 +android.os.Power android.os.Process -android.os.ServiceManager -android.os.ServiceManagerNative -android.os.ServiceManagerProxy -android.os.Vibrator +android.os.ResultReceiver +android.os.StatFs +android.os.SystemClock +android.os.SystemProperties +android.os.UEventObserver +android.pim.EventRecurrence android.preference.CheckBoxPreference +android.preference.CheckBoxPreference$SavedState android.preference.DialogPreference android.preference.EditTextPreference android.preference.ListPreference +android.preference.ListPreference$SavedState android.preference.Preference android.preference.PreferenceActivity android.preference.PreferenceGroup android.preference.PreferenceGroupAdapter +android.preference.PreferenceInflater android.preference.PreferenceManager android.preference.PreferenceScreen android.preference.RingtonePreference +android.preference.VolumePreference +android.preference.VolumePreference$SeekBarVolumizer +android.provider.Browser +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$Tag +android.provider.Contacts +android.provider.Contacts$ContactMethods +android.provider.Contacts$People +android.provider.Contacts$Phones +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$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.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$Images$Thumbnails +android.provider.SearchRecentSuggestions +android.provider.Settings$Gservices +android.provider.Settings$Secure +android.provider.Settings$System +android.provider.SubscribedFeeds$Feeds +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.RootElement +android.sax.RootElement$Handler +android.security.Keystore +android.security.Keystore$FileKeystore +android.security.Md5MessageDigest +android.security.MessageDigest +android.security.ServiceCommand +android.security.Sha1MessageDigest +android.server.BluetoothA2dpService +android.server.BluetoothDeviceService +android.server.BluetoothEventLoop +android.server.data.BuildData +android.server.data.CrashData +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.PhoneNumberUtils -android.telephony.PhoneStateListener +android.telephony.PhoneStateListener$1 android.telephony.ServiceState -android.telephony.TelephonyManager -android.telephony.SmsManager +android.telephony.SignalStrength android.telephony.SmsMessage +android.telephony.TelephonyManager +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.InputFilter +android.text.HtmlToSpannedConverter +android.text.IClipboard$Stub 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$TruncateAt -android.text.TextWatcher android.text.format.DateUtils +android.text.format.Formatter android.text.format.Time android.text.method.ArrowKeyMovementMethod android.text.method.BaseKeyListener -android.text.method.KeyListener +android.text.method.DialerKeyListener +android.text.method.DigitsKeyListener +android.text.method.LinkMovementMethod android.text.method.MetaKeyKeyListener -android.text.method.MovementMethod android.text.method.QwertyKeyListener -android.text.method.ReplacementTransformationMethod 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.TransformationMethod -android.text.style.AlignmentSpan -android.text.style.CharacterStyle -android.text.style.ForegroundColorSpan -android.text.style.LeadingMarginSpan -android.text.style.LineBackgroundSpan -android.text.style.LineHeightSpan +android.text.style.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.UpdateAppearance -android.text.style.UpdateLayout -android.text.style.WrapTogetherSpan android.text.util.Linkify android.text.util.Regex -android.util.AndroidRuntimeException +android.text.util.Rfc822Validator android.util.AttributeSet android.util.DisplayMetrics +android.util.EventLog +android.util.EventLog$Event +android.util.EventLog$List android.util.FloatMath +android.util.Log +android.util.LongSparseArray android.util.SparseArray +android.util.StateSet android.util.TypedValue -android.util.Xml$XmlSerializerFactory +android.util.Xml +android.util.Xml$Encoding android.view.AbsSavedState -android.view.ContextMenu -android.view.ContextMenu$ContextMenuInfo android.view.ContextThemeWrapper android.view.Display android.view.FocusFinder -android.view.FocusFinder$1 +android.view.GestureDetector android.view.GestureDetector$SimpleOnGestureListener -android.view.Gravity -android.view.IWindow -android.view.IWindow$Stub -android.view.IWindowManager +android.view.IRotationWatcher$Stub android.view.IWindowManager$Stub android.view.IWindowManager$Stub$Proxy -android.view.IWindowSession android.view.IWindowSession$Stub -android.view.IWindowSession$Stub$Proxy android.view.KeyCharacterMap +android.view.KeyCharacterMap$KeyData android.view.KeyEvent -android.view.KeyEvent$1 -android.view.KeyEvent$Callback android.view.LayoutInflater -android.view.LayoutInflater$Factory -android.view.Menu -android.view.MenuInflater -android.view.MenuItem +android.view.MenuInflater$MenuState android.view.MotionEvent -android.view.MotionEvent$1 android.view.Surface -android.view.SurfaceHolder +android.view.Surface$1 +android.view.SurfaceSession android.view.SurfaceView -android.view.TouchDelegate android.view.VelocityTracker android.view.View -android.view.View$AttachInfo android.view.View$AttachInfo$Callbacks +android.view.View$AttachInfo$InvalidateInfo android.view.View$BaseSavedState -android.view.View$BaseSavedState$1 -android.view.View$MeasureSpec -android.view.View$OnCreateContextMenuListener -android.view.View$ScrollabilityCache -android.view.ViewConfiguration android.view.ViewGroup -android.view.ViewGroup$LayoutParams -android.view.ViewGroup$MarginLayoutParams -android.view.ViewManager +android.view.ViewParent android.view.ViewRoot -android.view.ViewRoot$1 -android.view.ViewRoot$InputMethodCallback -android.view.ViewRoot$RunQueue -android.view.ViewRoot$TrackballAxis -android.view.ViewRoot$W android.view.ViewStub -android.view.ViewTreeObserver -android.view.ViewTreeObserver$InternalInsetsInfo -android.view.ViewTreeObserver$OnPreDrawListener android.view.Window -android.view.Window$Callback -android.view.Window$LocalWindowManager -android.view.WindowLeaked -android.view.WindowManager android.view.WindowManager$LayoutParams -android.view.WindowManager$LayoutParams$1 android.view.WindowManagerImpl -android.view.animation.AccelerateDecelerateInterpolator -android.view.animation.AlphaAnimation +android.view.accessibility.AccessibilityEvent +android.view.accessibility.AccessibilityEvent$1 android.view.animation.Animation android.view.animation.AnimationSet -android.view.animation.LinearInterpolator -android.view.animation.Transformation android.view.inputmethod.BaseInputConnection android.view.inputmethod.CompletionInfo -android.view.inputmethod.CompletionInfo$1 - android.view.inputmethod.EditorInfo -android.view.inputmethod.EditorInfo$1 - android.view.inputmethod.ExtractedText -android.view.inputmethod.ExtractedText$1 - -android.view.inputmethod.ExtractedTextRequest -android.view.inputmethod.ExtractedTextRequest$1 - -android.view.inputmethod.InputBinding -android.view.inputmethod.InputBinding$1 -android.view.inputmethod.InputConnection -android.view.inputmethod.InputMethod -android.view.inputmethod.InputMethod$SessionCallback - android.view.inputmethod.InputMethodInfo -android.view.inputmethod.InputMethodInfo$1 android.view.inputmethod.InputMethodManager android.view.inputmethod.InputMethodManager$1 -android.view.inputmethod.InputMethodManager$2 -android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper -android.view.inputmethod.InputMethodManager$H - -android.view.inputmethod.InputMethodSession -android.view.inputmethod.InputMethodSession$EventCallback android.webkit.BrowserFrame +android.webkit.CacheLoader android.webkit.CacheManager android.webkit.CallbackProxy +android.webkit.CallbackProxy$ResultTransport android.webkit.CookieManager android.webkit.CookieSyncManager +android.webkit.DataLoader +android.webkit.GearsPermissionsManager android.webkit.HttpDateTime android.webkit.JWebCoreJavaBridge android.webkit.LoadListener android.webkit.MimeTypeMap 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$EventHandler$IconResult +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.WebSyncManager -android.webkit.WebSyncManager$SyncHandler android.webkit.WebView -android.webkit.WebView$ExtendedZoomControls -android.webkit.WebView$FocusNode -android.webkit.WebView$PrivateHandler +android.webkit.WebView$HitTestResult android.webkit.WebViewCore -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$CheckForLongPress -android.widget.AbsListView$CheckForTap -android.widget.AbsListView$LayoutParams +android.widget.AbsListView$3 android.widget.AbsListView$PerformClick -android.widget.AbsListView$RecycleBin android.widget.AbsListView$SavedState -android.widget.AbsListView$SavedState$1 android.widget.AbsSeekBar android.widget.AbsSpinner +android.widget.AbsSpinner$SavedState android.widget.AbsoluteLayout -android.widget.AbsoluteLayout$LayoutParams android.widget.AdapterView -android.widget.AdapterView$AdapterDataSetObserver +android.widget.AnalogClock +android.widget.AppSecurityPermissions +android.widget.AppSecurityPermissions$State android.widget.ArrayAdapter android.widget.AutoCompleteTextView -android.widget.AutoCompleteTextView$DropDownItemClickListener android.widget.AutoCompleteTextView$DropDownListView 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$SavedState android.widget.CursorAdapter -android.widget.CursorAdapter$ChangeObserver -android.widget.CursorAdapter$MyDataSetObserver android.widget.CursorTreeAdapter +android.widget.DatePicker android.widget.EditText +android.widget.ExpandableListConnector +android.widget.ExpandableListConnector$GroupMetadata android.widget.ExpandableListView +android.widget.FastScroller android.widget.FrameLayout -android.widget.FrameLayout$LayoutParams android.widget.Gallery +android.widget.GridView android.widget.HeaderViewListAdapter android.widget.ImageView android.widget.ImageView$ScaleType android.widget.LinearLayout -android.widget.LinearLayout$LayoutParams android.widget.ListView -android.widget.ListView$ArrowScrollFocusResult android.widget.ListView$SavedState -android.widget.ListView$SavedState$1 +android.widget.MediaController +android.widget.MultiAutoCompleteTextView android.widget.PopupWindow +android.widget.PopupWindow$PopupViewContainer android.widget.ProgressBar +android.widget.ProgressBar$SavedState +android.widget.RadioButton android.widget.RadioGroup android.widget.RatingBar android.widget.RelativeLayout -android.widget.RelativeLayout$LayoutParams +android.widget.RelativeLayout$DependencyGraph$Node android.widget.RemoteViews +android.widget.ResourceCursorAdapter +android.widget.ResourceCursorTreeAdapter android.widget.ScrollBarDrawable android.widget.ScrollView -android.widget.Scroller android.widget.SeekBar +android.widget.SimpleAdapter android.widget.SimpleCursorAdapter +android.widget.SimpleCursorTreeAdapter android.widget.SlidingDrawer android.widget.Spinner android.widget.Spinner$DropDownAdapter @@ -577,248 +684,335 @@ android.widget.TabWidget android.widget.TableLayout android.widget.TableRow android.widget.TextView -android.widget.TextView$1 -android.widget.TextView$Blink android.widget.TextView$BufferType -android.widget.TextView$ChangeWatcher -android.widget.TextView$CharWrapper -android.widget.TextView$Drawables -android.widget.TextView$InputContentType -android.widget.TextView$InputMethodState -android.widget.TextView$Marquee -android.widget.TextView$MenuHandler +android.widget.TextView$CommitSelectionReceiver android.widget.TextView$SavedState -android.widget.TextView$SavedState$1 -android.widget.ToggleButton +android.widget.TimePicker +android.widget.TimePicker$SavedState +android.widget.Toast +android.widget.Toast$TN android.widget.TwoLineListItem +android.widget.VideoView android.widget.ViewAnimator android.widget.ViewSwitcher android.widget.ZoomButton +android.widget.ZoomButtonsController 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$AlertParams +com.android.internal.app.AlertController$AlertParams$1 +com.android.internal.app.AlertController$RecycleListView +com.android.internal.app.ChooserActivity +com.android.internal.app.ResolverActivity +com.android.internal.app.ResolverActivity$ResolveListAdapter +com.android.internal.app.RingtonePickerActivity +com.android.internal.appwidget.IAppWidgetHost$Stub +com.android.internal.appwidget.IAppWidgetService$Stub com.android.internal.database.ArrayListCursor com.android.internal.database.SortCursor -com.android.internal.appwidget.IAppWidgetService$Stub -com.android.internal.http.multipart.FilePart -com.android.internal.http.multipart.MultipartEntity -com.android.internal.http.multipart.Part -com.android.internal.http.multipart.PartSource -com.android.internal.http.multipart.StringPart -com.android.internal.logging.AndroidConfig +com.android.internal.database.SortCursor$1 +com.android.internal.graphics.NativeUtils +com.android.internal.location.DummyLocationProvider +com.android.internal.location.GpsLocationProvider com.android.internal.logging.AndroidHandler 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.ZygoteInit$MethodAndArgsCaller -com.android.internal.policy.IPolicy +com.android.internal.os.ZygoteConnection +com.android.internal.os.ZygoteConnection$Arguments +com.android.internal.os.ZygoteInit 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$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.Connection$DisconnectCause -com.android.internal.telephony.Connection$PostDialState -com.android.internal.telephony.IPhoneStateListener$Stub -com.android.internal.telephony.ITelephony$Stub -com.android.internal.telephony.Phone -com.android.internal.telephony.Phone$DataActivityState -com.android.internal.telephony.Phone$DataState -com.android.internal.telephony.Phone$State -com.android.internal.telephony.Phone$SuppService -com.android.internal.telephony.PhoneBase -com.android.internal.telephony.PhoneStateIntentReceiver -com.android.internal.telephony.IccCard$State -com.android.internal.telephony.BaseCommands -com.android.internal.telephony.CallForwardInfo -com.android.internal.telephony.CommandsInterface -com.android.internal.telephony.DriverCall -com.android.internal.telephony.DriverCall$State -com.android.internal.telephony.gsm.GsmConnection -com.android.internal.telephony.gsm.GSMPhone com.android.internal.telephony.GsmAlphabet -com.android.internal.telephony.gsm.GsmMmiCode -com.android.internal.telephony.gsm.SimCard -com.android.internal.telephony.ISms$Stub -com.android.internal.telephony.RIL -com.android.internal.telephony.ServiceStateTracker - -com.android.internal.telephony.gsm.stk.ComprehensionTlvTag -com.android.internal.telephony.gsm.stk.ResultCode +com.android.internal.telephony.IPhoneStateListener$Stub +com.android.internal.telephony.IPhoneSubInfo$Stub +com.android.internal.telephony.ITelephony$Stub +com.android.internal.telephony.ITelephony$Stub$Proxy +com.android.internal.telephony.ITelephonyRegistry$Stub +com.android.internal.telephony.IccCard$State +com.android.internal.telephony.Phone$State +com.android.internal.telephony.PhoneStateIntentReceiver +com.android.internal.telephony.SmsMessageBase +com.android.internal.telephony.gsm.GsmSmsAddress +com.android.internal.telephony.gsm.SmsMessage +com.android.internal.telephony.gsm.SmsMessage$SubmitPdu +com.android.internal.util.ArrayUtils com.android.internal.util.FastXmlSerializer com.android.internal.view.IInputConnectionWrapper -com.android.internal.view.IInputConnectionWrapper$MyHandler -com.android.internal.view.IInputConnectionWrapper$SomeArgs - -com.android.internal.view.IInputContext com.android.internal.view.IInputContext$Stub -com.android.internal.view.IInputContext$Stub$Proxy - -com.android.internal.view.IInputContextCallback -com.android.internal.view.IInputContextCallback$Stub -com.android.internal.view.IInputContextCallback$Stub$Proxy - -com.android.internal.view.IInputMethod com.android.internal.view.IInputMethod$Stub -com.android.internal.view.IInputMethod$Stub$Proxy - -com.android.internal.view.IInputMethodCallback -com.android.internal.view.IInputMethodCallback$Stub -com.android.internal.view.IInputMethodCallback$Stub$Proxy - -com.android.internal.view.IInputMethodClient -com.android.internal.view.IInputMethodClient$Stub -com.android.internal.view.IInputMethodClient$Stub$Proxy - -com.android.internal.view.IInputMethodManager com.android.internal.view.IInputMethodManager$Stub -com.android.internal.view.IInputMethodManager$Stub$Proxy - -com.android.internal.view.IInputMethodSession -com.android.internal.view.IInputMethodSession$Stub -com.android.internal.view.IInputMethodSession$Stub$Proxy - -com.android.internal.view.InputBindResult -com.android.internal.view.InputBindResult$1 - -com.android.internal.view.InputConnectionWrapper com.android.internal.view.InputConnectionWrapper$InputContextCallback com.android.internal.view.menu.ExpandedMenuView com.android.internal.view.menu.IconMenuItemView com.android.internal.view.menu.IconMenuView +com.android.internal.view.menu.IconMenuView$SavedState com.android.internal.view.menu.ListMenuItemView com.android.internal.view.menu.MenuBuilder -com.android.internal.view.menu.MenuBuilder$Callback -com.android.internal.view.menu.MenuDialogHelper com.android.internal.view.menu.MenuItemImpl com.android.internal.view.menu.SubMenuBuilder -com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient -com.android.internal.widget.LockPatternView +com.android.internal.widget.LockPatternUtils com.android.internal.widget.NumberPicker com.android.internal.widget.NumberPickerButton +com.android.internal.widget.Smileys com.google.android.gdata.client.AndroidGDataClient -com.google.android.gdata.client.AndroidGDataClient$PostRequestCreator +com.google.android.gdata.client.AndroidXmlParserFactory com.google.android.gles_jni.EGLImpl com.google.android.gles_jni.GLImpl -com.google.android.mms.ContentType -com.google.android.mms.pdu.CharacterSets -com.google.android.mms.pdu.PduPart com.google.android.mms.pdu.PduPersister +com.google.android.mms.util.PduCache com.google.android.net.GoogleHttpClient +com.google.android.net.NetworkStatsEntity com.google.android.net.UrlRules com.google.android.net.UrlRules$Rule -com.google.android.util.SimplePullParser com.google.common.Config +com.google.common.Log +com.google.common.android.AndroidConfig +com.google.common.async.AsyncHttpRequestFactory$AsyncHttpRequestImpl +com.google.common.graphics.android.AndroidGraphics +com.google.common.io.BaseHttpConnectionFactory +com.google.common.io.IoUtil +com.google.common.io.android.AndroidHttpClient +com.google.common.io.android.AndroidHttpConnectionFactory +com.google.common.io.android.AndroidPersistentStore com.google.common.io.protocol.ProtoBuf com.google.common.io.protocol.ProtoBufType com.google.common.util.text.TextUtil +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 -com.ibm.icu4jni.text.CollationAttribute +com.ibm.icu4jni.charset.CharsetProviderICU +com.ibm.icu4jni.charset.NativeConverter +com.ibm.icu4jni.common.ErrorCode +com.ibm.icu4jni.lang.UCharacter +com.ibm.icu4jni.regex.NativeRegEx com.ibm.icu4jni.text.DecimalFormat -com.ibm.icu4jni.text.DecimalFormatSymbols +com.ibm.icu4jni.text.NativeBreakIterator +com.ibm.icu4jni.text.NativeCollation +com.ibm.icu4jni.text.NativeDecimalFormat com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatAttribute com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatSymbol -com.ibm.icu4jni.text.RuleBasedCollator -dalvik.system.DexFile +com.ibm.icu4jni.text.RuleBasedNumberFormat +com.ibm.icu4jni.util.Resources +dalvik.system.NativeStart dalvik.system.PathClassLoader +dalvik.system.TouchDex +dalvik.system.VMDebug +dalvik.system.VMRuntime +dalvik.system.VMStack +dalvik.system.Zygote java.beans.PropertyChangeEvent -java.beans.PropertyChangeListener java.beans.PropertyChangeSupport java.io.BufferedInputStream -java.io.ByteArrayInputStream -java.io.ByteArrayOutputStream +java.io.BufferedReader +java.io.Closeable +java.io.DataInput +java.io.DataOutput +java.io.DataOutputStream +java.io.EmulatedFieldsForDumping +java.io.EmulatedFieldsForLoading java.io.File java.io.FileDescriptor java.io.FileInputStream java.io.FileInputStream$RepositioningLock -java.io.FileNotFoundException -java.io.FilterInputStream -java.io.IOException +java.io.FileOutputStream +java.io.FilterOutputStream +java.io.Flushable +java.io.InputStream +java.io.InputStreamReader +java.io.ObjectInput +java.io.ObjectInputStream +java.io.ObjectOutput +java.io.ObjectOutputStream java.io.ObjectStreamClass +java.io.ObjectStreamConstants +java.io.ObjectStreamField +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.StringWriter -java.io.Writer +java.lang.AbstractStringBuilder +java.lang.Appendable +java.lang.ArrayIndexOutOfBoundsException +java.lang.Boolean +java.lang.BootClassLoader +java.lang.Byte +java.lang.CharSequence +java.lang.Character java.lang.Character$valueOfCache java.lang.Class java.lang.ClassCache -java.lang.ClassNotFoundException +java.lang.ClassCache$EnumComparator +java.lang.ClassLoader +java.lang.ClassLoader$SystemClassLoader +java.lang.Cloneable +java.lang.Comparable +java.lang.Double +java.lang.Enum +java.lang.Error +java.lang.Exception +java.lang.Float java.lang.IllegalArgumentException -java.lang.IllegalStateException java.lang.Integer java.lang.Integer$valueOfCache +java.lang.InternalError +java.lang.InterruptedException +java.lang.Iterable +java.lang.LangAccessImpl java.lang.LinkageError java.lang.Long java.lang.Long$valueOfCache +java.lang.Math java.lang.NoClassDefFoundError +java.lang.Number java.lang.NumberFormatException java.lang.Object +java.lang.OutOfMemoryError +java.lang.Readable +java.lang.Runnable java.lang.Runtime java.lang.RuntimeException +java.lang.RuntimePermission +java.lang.SecurityException +java.lang.Short java.lang.Short$valueOfCache +java.lang.StackOverflowError +java.lang.StackTraceElement +java.lang.StrictMath java.lang.String +java.lang.String$CaseInsensitiveComparator java.lang.StringBuffer java.lang.StringBuilder +java.lang.System +java.lang.SystemProperties java.lang.Thread -java.lang.ThreadLocal -java.lang.ThreadLocal$Values +java.lang.Thread$State +java.lang.Thread$UncaughtExceptionHandler +java.lang.ThreadGroup +java.lang.ThreadGroup$ChildrenGroupsLock +java.lang.ThreadGroup$ChildrenThreadsLock java.lang.Throwable +java.lang.UnsatisfiedLinkError +java.lang.UnsupportedOperationException +java.lang.VMClassLoader java.lang.VMThread +java.lang.VirtualMachineError +java.lang.Void +java.lang.annotation.Annotation +java.lang.ref.Reference java.lang.ref.ReferenceQueue java.lang.ref.SoftReference java.lang.ref.WeakReference +java.lang.reflect.AccessibleObject +java.lang.reflect.AnnotatedElement +java.lang.reflect.Array java.lang.reflect.Constructor +java.lang.reflect.Field +java.lang.reflect.GenericDeclaration +java.lang.reflect.InvocationHandler +java.lang.reflect.Member java.lang.reflect.Method java.lang.reflect.Modifier +java.lang.reflect.Proxy +java.lang.reflect.ReflectionAccessImpl +java.lang.reflect.Type java.math.BigDecimal java.math.BigInt java.math.BigInteger java.math.Multiplication -java.net.ContentHandler +java.net.DatagramPacket +java.net.HttpURLConnection +java.net.Inet4Address java.net.InetAddress -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.ProxySelector java.net.ProxySelectorImpl -java.net.Socket$ConnectLock +java.net.ServerSocket +java.net.Socket +java.net.SocketImpl +java.net.SocketOptions java.net.URI java.net.URL java.net.URLConnection -java.net.URLConnection$DefaultContentHandler -java.net.URLStreamHandler +java.nio.BaseByteBuffer +java.nio.Buffer +java.nio.BufferFactory +java.nio.ByteBuffer java.nio.ByteOrder +java.nio.CharArrayBuffer +java.nio.CharBuffer java.nio.CharSequenceAdapter +java.nio.CharToByteBufferAdapter java.nio.DirectByteBuffer +java.nio.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.ReadWriteShortArrayBuffer -java.nio.ShortBuffer java.nio.ShortToByteBufferAdapter +java.nio.channels.ByteChannel +java.nio.channels.Channel +java.nio.channels.FileChannel +java.nio.channels.GatheringByteChannel +java.nio.channels.InterruptibleChannel +java.nio.channels.ReadableByteChannel +java.nio.channels.ScatteringByteChannel +java.nio.channels.WritableByteChannel +java.nio.channels.spi.AbstractInterruptibleChannel +java.nio.channels.spi.AbstractInterruptibleChannel$1 +java.nio.charset.Charset +java.nio.charset.Charset$1 +java.nio.charset.CharsetDecoder java.nio.charset.CharsetEncoder -java.security.AccessControlContext -java.security.GeneralSecurityException +java.nio.charset.CoderResult +java.nio.charset.CodingErrorAction +java.nio.charset.spi.CharsetProvider +java.security.AccessController +java.security.BasicPermission +java.security.Guard java.security.KeyStore java.security.MessageDigest -java.security.ProtectionDomain +java.security.Permission +java.security.PrivilegedAction +java.security.PrivilegedExceptionAction java.security.Provider java.security.SecureRandom java.security.Security -java.security.cert.CertPathValidator -java.security.cert.CertificateFactory +java.security.cert.CertificateParsingException java.security.cert.PKIXParameters -java.security.cert.TrustAnchor java.security.cert.X509CertSelector java.security.cert.X509Certificate java.text.Collator @@ -826,358 +1020,339 @@ java.text.DateFormat java.text.DateFormat$Field java.text.DecimalFormat java.text.DecimalFormatSymbols -java.text.MessageFormat +java.text.Format java.text.NumberFormat -java.text.RuleBasedCollator java.text.SimpleDateFormat -java.util.AbstractList$FullListIterator -java.util.AbstractList$SimpleListIterator +java.util.AbstractCollection +java.util.AbstractList +java.util.AbstractMap +java.util.AbstractSet java.util.ArrayList java.util.Arrays -java.util.Arrays$ArrayList +java.util.BitSet java.util.Calendar -java.util.Collections$SynchronizedCollection +java.util.Collection +java.util.Collections +java.util.Collections$EmptyList +java.util.Collections$EmptyMap +java.util.Collections$EmptySet +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$1 +java.util.Collections$UnmodifiableRandomAccessList +java.util.Collections$UnmodifiableSet +java.util.Comparator java.util.Date +java.util.Dictionary java.util.EnumMap -java.util.EventListener -java.util.EventObject +java.util.EnumSet +java.util.Enumeration java.util.Formatter java.util.GregorianCalendar java.util.HashMap java.util.HashMap$1 -java.util.HashMap$2 -java.util.HashMap$2$1 +java.util.HashMap$1$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$4 -java.util.Hashtable$4$1 +java.util.Hashtable$1 java.util.Hashtable$Entry -java.util.Hashtable$HashEnumerator -java.util.Hashtable$HashIterator java.util.IdentityHashMap -java.util.LinkedHashMap -java.util.LinkedHashMap$LinkedHashMapEntry +java.util.Iterator java.util.LinkedList -java.util.LinkedList$Link java.util.List java.util.Locale +java.util.Map +java.util.Map$Entry +java.util.MapEntry +java.util.MapEntry$Type +java.util.PriorityQueue java.util.Properties -java.util.Random +java.util.PropertyPermission +java.util.RandomAccess java.util.ResourceBundle +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.TimeZone +java.util.Timer java.util.TreeMap -java.util.TreeMap$Entry java.util.TreeSet java.util.Vector +java.util.Vector$1 java.util.WeakHashMap java.util.WeakHashMap$Entry +java.util.concurrent.AbstractExecutorService +java.util.concurrent.ArrayBlockingQueue java.util.concurrent.ConcurrentHashMap -java.util.concurrent.ConcurrentLinkedQueue +java.util.concurrent.ConcurrentHashMap$Segment +java.util.concurrent.CopyOnWriteArrayList java.util.concurrent.DelayQueue +java.util.concurrent.Executors$DelegatedExecutorService +java.util.concurrent.Executors$DelegatedScheduledExecutorService java.util.concurrent.LinkedBlockingQueue java.util.concurrent.ScheduledThreadPoolExecutor java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue +java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask +java.util.concurrent.Semaphore +java.util.concurrent.SynchronousQueue +java.util.concurrent.SynchronousQueue$Node +java.util.concurrent.ThreadPoolExecutor java.util.concurrent.TimeUnit -java.util.concurrent.atomic.AtomicBoolean java.util.concurrent.atomic.AtomicInteger +java.util.concurrent.atomic.AtomicLong +java.util.concurrent.atomic.AtomicReference java.util.concurrent.atomic.UnsafeAccess java.util.concurrent.locks.AbstractQueuedSynchronizer -java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject -java.util.concurrent.locks.AbstractQueuedSynchronizer$Node -java.util.concurrent.locks.Lock -java.util.concurrent.locks.LockSupport java.util.concurrent.locks.ReentrantLock -java.util.concurrent.locks.ReentrantLock$FairSync -java.util.concurrent.locks.ReentrantLock$NonfairSync java.util.concurrent.locks.ReentrantLock$Sync -java.util.concurrent.locks.ReentrantReadWriteLock -java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync -java.util.concurrent.locks.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.logging.SimpleFormatter +java.util.regex.MatchResult java.util.regex.Matcher java.util.regex.Pattern +java.util.zip.Adler32 +java.util.zip.CRC32 +java.util.zip.Checksum +java.util.zip.Deflater java.util.zip.DeflaterOutputStream java.util.zip.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.ssl.DefaultHostnameVerifier javax.net.ssl.HttpsURLConnection +javax.net.ssl.SSLContext javax.net.ssl.SSLHandshakeException -javax.security.auth.x500.X500Principal +javax.net.ssl.SSLServerSocket +javax.net.ssl.SSLSession +javax.net.ssl.SSLSocket javax.security.cert.X509Certificate -javax.security.cert.X509Certificate$2 junit.framework.Assert org.apache.commons.codec.binary.Base64 org.apache.commons.codec.binary.Hex org.apache.commons.logging.LogFactory org.apache.commons.logging.impl.Jdk14Logger -org.apache.harmony.archive.util.Util -org.apache.harmony.dalvik.ddmc.Chunk +org.apache.harmony.dalvik.NativeTestTarget org.apache.harmony.dalvik.ddmc.ChunkHandler org.apache.harmony.dalvik.ddmc.DdmServer -org.apache.harmony.dalvik.ddmc.DdmVmInternal -org.apache.harmony.luni.internal.net.www.protocol.file.FileURLConnection -org.apache.harmony.luni.internal.net.www.protocol.file.Handler -org.apache.harmony.luni.internal.net.www.protocol.http.Handler +org.apache.harmony.kernel.vm.LangAccess +org.apache.harmony.kernel.vm.ReflectionAccess +org.apache.harmony.lang.annotation.AnnotationFactory +org.apache.harmony.lang.annotation.AnnotationMember +org.apache.harmony.lang.annotation.AnnotationMember$DefaultValues +org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection 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.PlainSocketImpl -org.apache.harmony.luni.net.PlainSocketImpl2 +org.apache.harmony.luni.platform.AdapterManager +org.apache.harmony.luni.platform.Endianness +org.apache.harmony.luni.platform.IAdaptable +org.apache.harmony.luni.platform.IAdapterManager +org.apache.harmony.luni.platform.ICommonDataTypes +org.apache.harmony.luni.platform.IFileSystem +org.apache.harmony.luni.platform.IMemorySystem +org.apache.harmony.luni.platform.INetworkSystem +org.apache.harmony.luni.platform.ISystemComponent +org.apache.harmony.luni.platform.OSComponent +org.apache.harmony.luni.platform.OSComponentFactory +org.apache.harmony.luni.platform.OSFileSystem +org.apache.harmony.luni.platform.OSMemory +org.apache.harmony.luni.platform.OSNetworkSystem +org.apache.harmony.luni.platform.Platform org.apache.harmony.luni.platform.PlatformAddress -org.apache.harmony.luni.util.TwoKeyHashMap +org.apache.harmony.luni.platform.PlatformAddressFactory +org.apache.harmony.luni.util.FloatingPointParser +org.apache.harmony.luni.util.NumberConverter +org.apache.harmony.luni.util.PriviAction +org.apache.harmony.luni.util.Util +org.apache.harmony.nio.AddressUtil +org.apache.harmony.nio.FileChannelFactory +org.apache.harmony.nio.internal.DirectBuffer +org.apache.harmony.nio.internal.FileChannelImpl org.apache.harmony.nio.internal.FileChannelImpl$RepositioningLock org.apache.harmony.nio.internal.LockManager org.apache.harmony.nio.internal.LockManager$1 -org.apache.harmony.nio.internal.ReadOnlyFileChannel -org.apache.harmony.security.asn1.ASN1BitString -org.apache.harmony.security.asn1.ASN1BitString$ASN1NamedBitList -org.apache.harmony.security.asn1.ASN1Boolean -org.apache.harmony.security.asn1.ASN1Explicit +org.apache.harmony.nio.internal.WriteOnlyFileChannel 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.ASN1SetOf +org.apache.harmony.security.asn1.ASN1Oid +org.apache.harmony.security.asn1.ASN1Sequence 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.ASN1UTCTime -org.apache.harmony.security.asn1.BitString -org.apache.harmony.security.fortress.Engine -org.apache.harmony.security.fortress.SecurityUtils +org.apache.harmony.security.asn1.DerInputStream +org.apache.harmony.security.asn1.DerOutputStream org.apache.harmony.security.fortress.Services org.apache.harmony.security.pkcs7.ContentInfo +org.apache.harmony.security.provider.cert.DRLCertFactory org.apache.harmony.security.provider.cert.X509CertFactoryImpl org.apache.harmony.security.provider.cert.X509CertImpl org.apache.harmony.security.provider.cert.X509CertPathImpl org.apache.harmony.security.provider.crypto.RandomBitsSupplier org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl +org.apache.harmony.security.provider.crypto.SHA1_MessageDigestImpl org.apache.harmony.security.utils.AlgNameMapper org.apache.harmony.security.x501.AttributeTypeAndValue -org.apache.harmony.security.x501.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.EDIPartyName org.apache.harmony.security.x509.Extension -org.apache.harmony.security.x509.Extension$1 -org.apache.harmony.security.x509.Extension$2 org.apache.harmony.security.x509.Extensions -org.apache.harmony.security.x509.Extensions$1 org.apache.harmony.security.x509.GeneralName org.apache.harmony.security.x509.GeneralNames org.apache.harmony.security.x509.KeyUsage org.apache.harmony.security.x509.ORAddress +org.apache.harmony.security.x509.OtherName +org.apache.harmony.security.x509.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.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.ExpatPullParser +org.apache.harmony.xml.ExpatPullParser$ByteDocument org.apache.harmony.xml.ExpatReader -org.apache.harmony.xnet.provider.jsse.ClientSessionContext +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.FileClientSessionCache +org.apache.harmony.xnet.provider.jsse.NativeCrypto +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$SSLInputStream -org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream +org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$LoggerHolder +org.apache.harmony.xnet.provider.jsse.ProtocolVersion org.apache.harmony.xnet.provider.jsse.SSLContextImpl org.apache.harmony.xnet.provider.jsse.SSLParameters -org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl -org.apache.harmony.xnet.provider.jsse.TrustManagerImpl -org.apache.http.HttpHost -org.apache.http.HttpRequestInterceptor +org.apache.harmony.xnet.provider.jsse.ServerSessionContext org.apache.http.HttpVersion -org.apache.http.auth.AuthSchemeRegistry +org.apache.http.NoHttpResponseException +org.apache.http.ProtocolException org.apache.http.client.HttpClient -org.apache.http.client.RequestDirector +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.protocol.RequestAddCookies -org.apache.http.client.protocol.RequestDefaultHeaders -org.apache.http.client.protocol.RequestProxyAuthentication -org.apache.http.client.protocol.RequestTargetAuthentication -org.apache.http.client.protocol.ResponseProcessCookies -org.apache.http.conn.params.ConnManagerParams$1 +org.apache.http.conn.BasicManagedEntity +org.apache.http.conn.params.ConnManagerParams org.apache.http.conn.params.ConnRouteParams org.apache.http.conn.routing.HttpRoute -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.PlainSocketFactory -org.apache.http.conn.scheme.Scheme -org.apache.http.conn.scheme.SchemeRegistry -org.apache.http.conn.ssl.AllowAllHostnameVerifier -org.apache.http.conn.ssl.BrowserCompatHostnameVerifier +org.apache.http.conn.ssl.AbstractVerifier org.apache.http.conn.ssl.SSLSocketFactory -org.apache.http.conn.ssl.StrictHostnameVerifier org.apache.http.conn.util.InetAddressUtils -org.apache.http.cookie.CookieSpecRegistry -org.apache.http.impl.DefaultConnectionReuseStrategy -org.apache.http.impl.DefaultHttpResponseFactory +org.apache.http.entity.BasicHttpEntity +org.apache.http.entity.InputStreamEntity +org.apache.http.entity.StringEntity +org.apache.http.impl.AbstractHttpClientConnection 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.BasicCredentialsProvider 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.DefaultTargetAuthenticationHandler -org.apache.http.impl.client.DefaultUserTokenHandler org.apache.http.impl.client.EntityEnclosingRequestWrapper org.apache.http.impl.conn.AbstractClientConnAdapter +org.apache.http.impl.conn.AbstractPooledConnAdapter org.apache.http.impl.conn.DefaultClientConnection -org.apache.http.impl.conn.DefaultClientConnectionOperator -org.apache.http.impl.conn.DefaultHttpRoutePlanner -org.apache.http.impl.conn.DefaultResponseParser -org.apache.http.impl.conn.IdleConnectionHandler -org.apache.http.impl.conn.tsccm.BasicPoolEntry -org.apache.http.impl.conn.tsccm.BasicPoolEntryRef +org.apache.http.impl.conn.SingleClientConnManager org.apache.http.impl.conn.tsccm.ConnPoolByRoute -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.cookie.BasicClientCookie -org.apache.http.impl.cookie.BestMatchSpecFactory -org.apache.http.impl.cookie.BrowserCompatSpecFactory +org.apache.http.impl.cookie.BrowserCompatSpec org.apache.http.impl.cookie.DateUtils -org.apache.http.impl.cookie.NetscapeDraftSpecFactory -org.apache.http.impl.cookie.RFC2109SpecFactory -org.apache.http.impl.cookie.RFC2965SpecFactory -org.apache.http.impl.entity.EntityDeserializer -org.apache.http.impl.entity.EntitySerializer -org.apache.http.impl.entity.LaxContentLengthStrategy -org.apache.http.impl.entity.StrictContentLengthStrategy -org.apache.http.impl.io.HttpRequestWriter -org.apache.http.impl.io.HttpTransportMetricsImpl +org.apache.http.impl.cookie.RFC2109Spec +org.apache.http.impl.cookie.RFC2965Spec +org.apache.http.impl.io.AbstractSessionInputBuffer org.apache.http.impl.io.SocketInputBuffer -org.apache.http.impl.io.SocketOutputBuffer -org.apache.http.message.BasicHeaderValueParser +org.apache.http.message.AbstractHttpMessage +org.apache.http.message.BasicHeaderElement 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.BasicTokenIterator +org.apache.http.params.AbstractHttpParams org.apache.http.params.BasicHttpParams org.apache.http.protocol.BasicHttpProcessor org.apache.http.protocol.HTTP -org.apache.http.protocol.HttpRequestExecutor -org.apache.http.protocol.HttpRequestInterceptorList -org.apache.http.protocol.HttpResponseInterceptorList -org.apache.http.protocol.RequestConnControl -org.apache.http.protocol.RequestContent -org.apache.http.protocol.RequestExpectContinue -org.apache.http.protocol.RequestTargetHost -org.apache.http.protocol.RequestUserAgent -org.apache.http.util.ByteArrayBuffer -org.apache.http.util.CharArrayBuffer -org.apache.http.util.EntityUtils -org.apache.http.util.VersionInfo -org.bouncycastle.asn1.DERBitString -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.DERPrintableString -org.bouncycastle.asn1.DERSequence -org.bouncycastle.asn1.DERSet -org.bouncycastle.asn1.DERTaggedObject -org.bouncycastle.asn1.DERUTCTime -org.bouncycastle.asn1.DERUTF8String -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.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.x9.X9ObjectIdentifiers +org.bouncycastle.crypto.digests.SHA1Digest org.bouncycastle.crypto.engines.AESFastEngine +org.bouncycastle.crypto.generators.PKCS12ParametersGenerator +org.bouncycastle.crypto.macs.HMac +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.RSAUtil +org.bouncycastle.jce.provider.WrapCipherSpi org.bouncycastle.jce.provider.X509CertificateObject +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.JSONStringer org.kxml2.io.KXmlParser org.kxml2.io.KXmlSerializer +org.openssl.NativeBN +org.xml.sax.Attributes org.xml.sax.helpers.DefaultHandler -org.xml.sax.helpers.NewInstance -org.xmlpull.v1.XmlPullParserFactory +org.xmlpull.v1.XmlPullParser +org.xmlpull.v1.XmlPullParserException org.xmlpull.v1.sax2.Driver sun.misc.Unsafe - diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java index 78db6f93727ee..5439f8be72f10 100644 --- a/services/java/com/android/server/AppWidgetService.java +++ b/services/java/com/android/server/AppWidgetService.java @@ -1009,8 +1009,7 @@ class AppWidgetService extends IAppWidgetService.Stub if (success) { // delete any hosts that didn't manage to get connected (should happen) // if it matters, they'll be reconnected. - final int N = mHosts.size(); - for (int i=0; i=0; i--) { pruneHostLocked(mHosts.get(i)); } } else { diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index fab97b1e15740..3f268c933f14f 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -120,6 +120,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run private IGpsStatusProvider mGpsStatusProvider; private LocationWorkerHandler mLocationHandler; + // Cache the real providers for use in addTestProvider() and removeTestProvider() + LocationProviderProxy mNetworkLocationProvider; + LocationProviderProxy mGpsLocationProvider; + // Handler messages private static final int MESSAGE_LOCATION_CHANGED = 1; @@ -539,6 +543,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run mGpsStatusProvider = provider.getGpsStatusProvider(); LocationProviderProxy proxy = new LocationProviderProxy(LocationManager.GPS_PROVIDER, provider); addProvider(proxy); + mGpsLocationProvider = proxy; } updateProvidersLocked(); @@ -616,6 +621,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run LocationProviderProxy proxy = new LocationProviderProxy(name, provider); addProvider(proxy); updateProvidersLocked(); + if (LocationManager.NETWORK_PROVIDER.equals(name)) { + mNetworkLocationProvider = proxy; + } // notify provider of current network state proxy.updateNetworkState(mNetworkState); @@ -1789,16 +1797,22 @@ public class LocationManagerService extends ILocationManager.Stub implements Run requiresNetwork, requiresSatellite, requiresCell, hasMonetaryCost, supportsAltitude, supportsSpeed, supportsBearing, powerRequirement, accuracy); + // remove the real provider if we are replacing GPS or network provider + if (LocationManager.GPS_PROVIDER.equals(name) + || LocationManager.NETWORK_PROVIDER.equals(name)) { + LocationProviderProxy proxy = mProvidersByName.get(name); + if (proxy != null) { + proxy.enableLocationTracking(false); + removeProvider(proxy); + } + } if (mProvidersByName.get(name) != null) { throw new IllegalArgumentException("Provider \"" + name + "\" already exists"); } - - // clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required - long identity = Binder.clearCallingIdentity(); addProvider(new LocationProviderProxy(name, provider)); mMockProviders.put(name, provider); + mLastKnownLocation.put(name, null); updateProvidersLocked(); - Binder.restoreCallingIdentity(identity); } } @@ -1811,6 +1825,15 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } removeProvider(mProvidersByName.get(provider)); mMockProviders.remove(mockProvider); + // reinstall real provider if we were mocking GPS or network provider + if (LocationManager.GPS_PROVIDER.equals(provider) && + mGpsLocationProvider != null) { + addProvider(mGpsLocationProvider); + } else if (LocationManager.NETWORK_PROVIDER.equals(provider) && + mNetworkLocationProvider != null) { + addProvider(mNetworkLocationProvider); + } + mLastKnownLocation.put(provider, null); updateProvidersLocked(); } } diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java index 58f8980c004d1..af80e20cc0e66 100644 --- a/services/java/com/android/server/ProcessStats.java +++ b/services/java/com/android/server/ProcessStats.java @@ -46,18 +46,23 @@ public class ProcessStats { PROC_SPACE_TERM, PROC_SPACE_TERM, PROC_SPACE_TERM, + PROC_SPACE_TERM|PROC_OUT_LONG, // 9: minor faults PROC_SPACE_TERM, - PROC_SPACE_TERM, - PROC_SPACE_TERM, + PROC_SPACE_TERM|PROC_OUT_LONG, // 11: major faults PROC_SPACE_TERM, PROC_SPACE_TERM|PROC_OUT_LONG, // 13: utime PROC_SPACE_TERM|PROC_OUT_LONG // 14: stime }; + static final int PROCESS_STAT_MINOR_FAULTS = 0; + static final int PROCESS_STAT_MAJOR_FAULTS = 1; + static final int PROCESS_STAT_UTIME = 2; + static final int PROCESS_STAT_STIME = 3; + /** Stores user time and system time in 100ths of a second. */ - private final long[] mProcessStatsData = new long[2]; + private final long[] mProcessStatsData = new long[4]; /** Stores user time and system time in 100ths of a second. */ - private final long[] mSinglePidStatsData = new long[2]; + private final long[] mSinglePidStatsData = new long[4]; private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] { PROC_SPACE_TERM, @@ -151,6 +156,11 @@ public class ProcessStats { public int rel_utime; public int rel_stime; + public long base_minfaults; + public long base_majfaults; + public int rel_minfaults; + public int rel_majfaults; + public boolean active; public boolean added; public boolean removed; @@ -313,12 +323,16 @@ public class ProcessStats { continue; } - final long utime = procStats[0]; - final long stime = procStats[1]; + final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS]; + final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS]; + final long utime = procStats[PROCESS_STAT_UTIME]; + final long stime = procStats[PROCESS_STAT_STIME]; if (utime == st.base_utime && stime == st.base_stime) { st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; if (st.active) { st.active = false; } @@ -342,6 +356,10 @@ public class ProcessStats { st.rel_stime = (int)(stime - st.base_stime); st.base_utime = utime; st.base_stime = stime; + st.rel_minfaults = (int)(minfaults - st.base_minfaults); + st.rel_majfaults = (int)(majfaults - st.base_majfaults); + st.base_minfaults = minfaults; + st.base_majfaults = majfaults; //Log.i("Load", "Stats changed " + name + " pid=" + st.pid // + " name=" + st.name + " utime=" + utime // + " stime=" + stime); @@ -364,11 +382,13 @@ public class ProcessStats { procStats, null)) { st.baseName = parentPid < 0 ? procStatsString[0] : Integer.toString(pid); - st.base_utime = procStats[1]; - st.base_stime = procStats[2]; + st.base_utime = 0; //procStats[1]; + st.base_stime = 0; //procStats[2]; + st.base_minfaults = st.base_majfaults = 0; } else { st.baseName = ""; st.base_utime = st.base_stime = 0; + st.base_minfaults = st.base_majfaults = 0; } if (parentPid < 0) { @@ -386,6 +406,8 @@ public class ProcessStats { //Log.i("Load", "New process: " + st.pid + " " + st.name); st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.added = true; if (!first) { workingProcs.add(st); @@ -396,6 +418,8 @@ public class ProcessStats { // This process has gone away! st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.removed = true; workingProcs.add(st); allProcs.remove(curStatsIndex); @@ -412,6 +436,8 @@ public class ProcessStats { final Stats st = allProcs.get(curStatsIndex); st.rel_utime = 0; st.rel_stime = 0; + st.rel_minfaults = 0; + st.rel_majfaults = 0; st.removed = true; workingProcs.add(st); allProcs.remove(curStatsIndex); @@ -427,7 +453,8 @@ public class ProcessStats { final long[] statsData = mSinglePidStatsData; if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT, null, statsData, null)) { - long time = statsData[0] + statsData[1]; + long time = statsData[PROCESS_STAT_UTIME] + + statsData[PROCESS_STAT_STIME]; return time; } return 0; @@ -497,33 +524,35 @@ public class ProcessStats { pw.print(now-mCurrentSampleTime); pw.println("ms ago:"); - final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + mRelIrqTime + - mRelSoftIrqTime + mRelIdleTime; + final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime; int N = mWorkingProcs.size(); for (int i=0; i 0 || majFaults > 0) { + pw.print(" / faults:"); + if (minFaults > 0) { + pw.print(" "); + pw.print(minFaults); + pw.print(" minor"); + } + if (majFaults > 0) { + pw.print(" "); + pw.print(majFaults); + pw.print(" major"); + } + } pw.println(); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index aa1a5cf962495..b2848ac5c3da0 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -19,7 +19,6 @@ package com.android.server; import com.android.server.am.ActivityManagerService; import com.android.server.status.StatusBarService; -import dalvik.system.PathClassLoader; import dalvik.system.VMRuntime; import android.app.ActivityManagerNative; @@ -32,7 +31,6 @@ import android.content.pm.IPackageManager; import android.database.ContentObserver; import android.database.Cursor; import android.media.AudioService; -import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; @@ -46,9 +44,6 @@ import android.server.search.SearchManagerService; import android.util.EventLog; import android.util.Log; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - class ServerThread extends Thread { private static final String TAG = "SystemServer"; private final static boolean INCLUDE_DEMO = false; diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index ae790c9a8057f..5d34d002f76d8 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -237,6 +237,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen // How long to wait after going idle before forcing apps to GC. static final int GC_TIMEOUT = 5*1000; + // The minimum amount of time between successive GC requests for a process. + static final int GC_MIN_INTERVAL = 60*1000; + // How long we wait until giving up on an activity telling us it has // finished destroying itself. static final int DESTROY_TIMEOUT = 10*1000; @@ -251,10 +254,23 @@ public final class ActivityManagerService extends ActivityManagerNative implemen // is no longer considered to be a relaunch of the service. static final int SERVICE_RESTART_DURATION = 5*1000; + // How long a service needs to be running until it will start back at + // SERVICE_RESTART_DURATION after being killed. + static final int SERVICE_RESET_RUN_DURATION = 60*1000; + + // Multiplying factor to increase restart duration time by, for each time + // a service is killed before it has run for SERVICE_RESET_RUN_DURATION. + static final int SERVICE_RESTART_DURATION_FACTOR = 4; + + // The minimum amount of time between restarting services that we allow. + // That is, when multiple services are restarting, we won't allow each + // to restart less than this amount of time from the last one. + static final int SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000; + // Maximum amount of time for there to be no activity on a service before // we consider it non-essential and allow its process to go on the // LRU background list. - static final int MAX_SERVICE_INACTIVITY = 10*60*1000; + static final int MAX_SERVICE_INACTIVITY = 30*60*1000; // How long we wait until we timeout on key dispatching. static final int KEY_DISPATCHING_TIMEOUT = 5*1000; @@ -924,6 +940,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen 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; @@ -1089,8 +1106,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } } } - break; - } + } break; case SHOW_UID_ERROR_MSG: { // XXX This is a temporary dialog, no need to localize. AlertDialog d = new BaseErrorDialog(mContext); @@ -1134,7 +1150,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen synchronized (ActivityManagerService.this) { resumeTopActivityLocked(null); } - } + } break; case PROC_START_TIMEOUT_MSG: { if (mDidDexOpt) { mDidDexOpt = false; @@ -1147,12 +1163,20 @@ public final class ActivityManagerService extends ActivityManagerNative implemen synchronized (ActivityManagerService.this) { processStartTimedOutLocked(app); } - } + } break; case DO_PENDING_ACTIVITY_LAUNCHES_MSG: { synchronized (ActivityManagerService.this) { doPendingActivityLaunchesLocked(true); } - } + } break; + 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; } } }; @@ -4417,17 +4441,26 @@ public final class ActivityManagerService extends ActivityManagerNative implemen if (!haveBg) { Log.i(TAG, "Low Memory: No more background processes."); EventLog.writeEvent(LOG_AM_LOW_MEMORY, mLRUProcesses.size()); + long now = SystemClock.uptimeMillis(); for (i=0; i= 0 ; i--) { + // First, these are the most important processes. + final int[] imppids = new int[3]; + int i=0; + imppids[0] = app.pid; + i++; + if (reportedActivity != null && reportedActivity.app != null + && reportedActivity.app.thread != null + && reportedActivity.app.pid != app.pid) { + imppids[i] = reportedActivity.app.pid; + i++; + } + imppids[i] = Process.myPid(); + for (i=0; i= 0 ; i--) { ProcessRecord r = mLRUProcesses.get(i); - if (r.thread != null) { + boolean done = false; + for (int j=0; j 0) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Processes that are waiting to GC:"); + long now = SystemClock.uptimeMillis(); + for (int i=0; i 0) { if (needSep) pw.println(" "); needSep = true; @@ -9842,6 +9949,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } private final void scheduleServiceRestartLocked(ServiceRecord r) { + final long now = SystemClock.uptimeMillis(); + r.totalRestartCount++; if (r.restartDelay == 0) { r.restartCount++; @@ -9852,19 +9961,41 @@ public final class ActivityManagerService extends ActivityManagerNative implemen // the beginning, so we don't infinitely increase the duration // on a service that just occasionally gets killed (which is // a normal case, due to process being killed to reclaim memory). - long now = SystemClock.uptimeMillis(); - if (now > (r.restartTime+(SERVICE_RESTART_DURATION*2*2*2))) { + if (now > (r.restartTime+SERVICE_RESET_RUN_DURATION)) { r.restartCount = 1; r.restartDelay = SERVICE_RESTART_DURATION; } else { - r.restartDelay *= 2; + r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR; } } + + r.nextRestartTime = now + r.restartDelay; + + // Make sure that we don't end up restarting a bunch of services + // all at the same time. + boolean repeat; + do { + repeat = false; + for (int i=mRestartingServices.size()-1; i>=0; i--) { + ServiceRecord r2 = mRestartingServices.get(i); + if (r2 != r && r.nextRestartTime + >= (r2.nextRestartTime-SERVICE_MIN_RESTART_TIME_BETWEEN) + && r.nextRestartTime + < (r2.nextRestartTime+SERVICE_MIN_RESTART_TIME_BETWEEN)) { + r.nextRestartTime = r2.nextRestartTime + SERVICE_MIN_RESTART_TIME_BETWEEN; + r.restartDelay = r.nextRestartTime - now; + repeat = true; + break; + } + } + } while (repeat); + if (!mRestartingServices.contains(r)) { mRestartingServices.add(r); } + mHandler.removeCallbacks(r.restarter); - mHandler.postDelayed(r.restarter, r.restartDelay); + mHandler.postAtTime(r.restarter, r.nextRestartTime); r.nextRestartTime = SystemClock.uptimeMillis() + r.restartDelay; Log.w(TAG, "Scheduling restart of crashed service " + r.shortName + " in " + r.restartDelay + "ms"); @@ -10597,7 +10728,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } if (timeout != null && mLRUProcesses.contains(proc)) { Log.w(TAG, "Timeout executing service: " + timeout); - appNotRespondingLocked(proc, null, "Executing service " + appNotRespondingLocked(proc, null, null, "Executing service " + timeout.name); } else { Message msg = mHandler.obtainMessage(SERVICE_TIMEOUT_MSG); @@ -11392,7 +11523,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } if (app != null) { - appNotRespondingLocked(app, null, "Broadcast of " + r.intent.toString()); + appNotRespondingLocked(app, null, null, + "Broadcast of " + r.intent.toString()); } if (mPendingBroadcast == r) { @@ -12238,15 +12370,15 @@ public final class ActivityManagerService extends ActivityManagerNative implemen if (app == TOP_APP) { // The last app on the list is the foreground app. adj = FOREGROUND_APP_ADJ; - app.adjType = "top"; + app.adjType = "top-activity"; } else if (app.instrumentationClass != null) { // Don't want to kill running instrumentation. adj = FOREGROUND_APP_ADJ; - app.adjType = "instr"; + app.adjType = "instrumentation"; } else if (app.persistentActivities > 0) { // Special persistent activities... shouldn't be used these days. adj = FOREGROUND_APP_ADJ; - app.adjType = "pers"; + app.adjType = "persistent"; } else if (app.curReceiver != null || (mPendingBroadcast != null && mPendingBroadcast.curApp == app)) { // An app that is currently receiving a broadcast also @@ -12275,6 +12407,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } else if ((N=app.activities.size()) != 0) { // This app is in the background with paused activities. adj = hiddenAdj; + app.adjType = "bg-activities"; for (int j=0; j hiddenAdj) { adj = hiddenAdj; - app.adjType = "services"; + app.adjType = "bg-services"; } final long now = SystemClock.uptimeMillis(); // This process is more important if the top activity is @@ -12456,7 +12589,12 @@ public final class ActivityManagerService extends ActivityManagerNative implemen try { app.lastRequestedGc = SystemClock.uptimeMillis(); if (app.thread != null) { - app.thread.processInBackground(); + if (app.reportLowMemory) { + app.reportLowMemory = false; + app.thread.scheduleLowMemory(); + } else { + app.thread.processInBackground(); + } } } catch (Exception e) { // whatever. @@ -12485,14 +12623,24 @@ public final class ActivityManagerService extends ActivityManagerNative implemen if (canGcNow()) { while (mProcessesToGc.size() > 0) { ProcessRecord proc = mProcessesToGc.remove(0); - if (proc.curRawAdj > VISIBLE_APP_ADJ) { - // To avoid spamming the system, we will GC processes one - // at a time, waiting a few seconds between each. - performAppGcLocked(proc); - scheduleAppGcsLocked(); - return; + if (proc.curRawAdj > VISIBLE_APP_ADJ || proc.reportLowMemory) { + if ((proc.lastRequestedGc+GC_MIN_INTERVAL) + <= SystemClock.uptimeMillis()) { + // To avoid spamming the system, we will GC processes one + // at a time, waiting a few seconds between each. + performAppGcLocked(proc); + scheduleAppGcsLocked(); + return; + } else { + // It hasn't been long enough since we last GCed this + // process... put it in the list to wait for its time. + addProcessToGcListLocked(proc); + break; + } } } + + scheduleAppGcsLocked(); } } @@ -12513,8 +12661,39 @@ public final class ActivityManagerService extends ActivityManagerNative implemen */ final void scheduleAppGcsLocked() { mHandler.removeMessages(GC_BACKGROUND_PROCESSES_MSG); - Message msg = mHandler.obtainMessage(GC_BACKGROUND_PROCESSES_MSG); - mHandler.sendMessageDelayed(msg, GC_TIMEOUT); + + if (mProcessesToGc.size() > 0) { + // Schedule a GC for the time to the next process. + ProcessRecord proc = mProcessesToGc.get(0); + Message msg = mHandler.obtainMessage(GC_BACKGROUND_PROCESSES_MSG); + + long when = mProcessesToGc.get(0).lastRequestedGc + GC_MIN_INTERVAL; + long now = SystemClock.uptimeMillis(); + if (when < (now+GC_TIMEOUT)) { + when = now + GC_TIMEOUT; + } + mHandler.sendMessageAtTime(msg, when); + } + } + + /** + * Add a process to the array of processes waiting to be GCed. Keeps the + * list in sorted order by the last GC time. The process can't already be + * on the list. + */ + final void addProcessToGcListLocked(ProcessRecord proc) { + boolean added = false; + for (int i=mProcessesToGc.size()-1; i>=0; i--) { + if (mProcessesToGc.get(i).lastRequestedGc < + proc.lastRequestedGc) { + added = true; + mProcessesToGc.add(i+1, proc); + break; + } + } + if (!added) { + mProcessesToGc.add(0, proc); + } } /** @@ -12524,11 +12703,11 @@ public final class ActivityManagerService extends ActivityManagerNative implemen */ final void scheduleAppGcLocked(ProcessRecord app) { long now = SystemClock.uptimeMillis(); - if ((app.lastRequestedGc+5000) > now) { + if ((app.lastRequestedGc+GC_MIN_INTERVAL) > now) { return; } if (!mProcessesToGc.contains(app)) { - mProcessesToGc.add(app); + addProcessToGcListLocked(app); scheduleAppGcsLocked(); } } diff --git a/services/java/com/android/server/am/HistoryRecord.java b/services/java/com/android/server/am/HistoryRecord.java index b3fc313f4abfc..84ded22622cf3 100644 --- a/services/java/com/android/server/am/HistoryRecord.java +++ b/services/java/com/android/server/am/HistoryRecord.java @@ -470,7 +470,8 @@ class HistoryRecord extends IApplicationToken.Stub { } if (r.app.instrumentationClass == null) { - service.appNotRespondingLocked(r.app, r, "keyDispatchingTimedOut"); + service.appNotRespondingLocked(r.app, r, this, + "keyDispatchingTimedOut"); } else { Bundle info = new Bundle(); info.putString("shortMsg", "keyDispatchingTimedOut"); diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java index 544d0347e891f..76fdf09baec00 100644 --- a/services/java/com/android/server/am/ProcessRecord.java +++ b/services/java/com/android/server/am/ProcessRecord.java @@ -71,6 +71,8 @@ class ProcessRecord implements Watchdog.PssRequestor { ComponentName instrumentationResultClass;// copy of instrumentationClass BroadcastRecord curReceiver;// receiver currently running in the app long lastRequestedGc; // When we last asked the app to do a gc + long lastLowMemory; // When we last told the app that memory is low + boolean reportLowMemory; // Set to true when waiting to report low mem int lastPss; // Last pss size reported by app. String adjType; // Debugging: primary thing impacting oom_adj. Object adjSource; // Debugging: option dependent object. diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index fc93b697b0448..98df4b314d12d 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -88,22 +88,23 @@ class ServiceRecord extends Binder { if (permission != null) { pw.print(prefix); pw.print("permission="); pw.println(permission); } + long now = SystemClock.uptimeMillis(); pw.print(prefix); pw.print("baseDir="); pw.print(baseDir); if (!resDir.equals(baseDir)) pw.print(" resDir="); pw.print(resDir); pw.print(" dataDir="); pw.println(dataDir); pw.print(prefix); pw.print("app="); pw.println(app); pw.print(prefix); pw.print("isForeground="); pw.print(isForeground); - pw.print(" lastActivity="); pw.println(lastActivity); + pw.print(" lastActivity="); pw.println(lastActivity-now); pw.print(prefix); pw.print("startRequested="); pw.print(startRequested); pw.print(" startId="); pw.print(lastStartId); pw.print(" executeNesting="); pw.print(executeNesting); - pw.print(" executingStart="); pw.print(executingStart); + pw.print(" executingStart="); pw.print(executingStart-now); pw.print(" crashCount="); pw.println(crashCount); pw.print(prefix); pw.print("totalRestartCount="); pw.print(totalRestartCount); pw.print(" restartCount="); pw.print(restartCount); pw.print(" restartDelay="); pw.print(restartDelay); - pw.print(" restartTime="); pw.print(restartTime); - pw.print(" nextRestartTime="); pw.println(nextRestartTime); + pw.print(" restartTime="); pw.print(restartTime-now); + pw.print(" nextRestartTime="); pw.println(nextRestartTime-now); if (bindings.size() > 0) { Iterator it = bindings.values().iterator(); while (it.hasNext()) { diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index c33d4b6f6ed94..d48c9419fb087 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -412,7 +412,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * @return false while no data connection if all above requirements are met. */ public boolean isDataConnectionAsDesired() { - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); if (mGsmPhone.mSIMRecords.getRecordsLoaded() && mGsmPhone.mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE && @@ -424,6 +424,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return true; } + private boolean getDataRoaming() { + return mGsmPhone.mSST.getDataRoaming(); + } + private boolean isApnTypeActive(String type) { // TODO: to support simultaneous, mActiveApn can be a List instead. return mActiveApn != null && mActiveApn.canHandleType(type); @@ -533,7 +537,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } private boolean isDataAllowed() { - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); return getAnyDataEnabled() && (!roaming || getDataOnRoamingEnabled()); } @@ -580,7 +584,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } int gprsState = mGsmPhone.mSST.getCurrentGprsState(); - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState(); if ((state == State.IDLE || state == State.SCANNING) @@ -1245,16 +1249,38 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } } + /** + * Check the data roaming consistency since this can be triggered by + * voice roaming flag of ServiceState in setDataOnRoamingEnabled() + * + * TODO make this triggered by data roaming state only + */ + @Override protected void onRoamingOff() { - trySetupData(Phone.REASON_ROAMING_OFF); + if (!getDataRoaming()) { //data roaming is off + trySetupData(Phone.REASON_ROAMING_OFF); + } else { // Inconsistent! data roaming is on + sendMessage(obtainMessage(EVENT_ROAMING_ON)); + } } + /** + * Check the data roaming consistency since this can be triggered by + * voice roaming flag of ServiceState in setDataOnRoamingEnabled() + * + * TODO make this triggered by data roaming state only + */ + @Override protected void onRoamingOn() { - if (getDataOnRoamingEnabled()) { - trySetupData(Phone.REASON_ROAMING_ON); - } else { - if (DBG) log("Tear down data connection on roaming."); - cleanUpConnection(true, Phone.REASON_ROAMING_ON); + if (getDataRoaming()) { // data roaming is on + if (getDataOnRoamingEnabled()) { + trySetupData(Phone.REASON_ROAMING_ON); + } else { + if (DBG) log("Tear down data connection on roaming."); + cleanUpConnection(true, Phone.REASON_ROAMING_ON); + } + } else { // Inconsistent! data roaming is off + sendMessage(obtainMessage(EVENT_ROAMING_OFF)); } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index b3b4345589457..60d4e8f4bdbbc 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -88,6 +88,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { private int newNetworkType = 0; /* gsm roaming status solely based on TS 27.007 7.2 CREG */ private boolean mGsmRoaming = false; + /* data roaming status solely based on TS 27.007 10.1.19 CGREG */ + private boolean mDataRoaming = false; + private boolean newDataRoaming = false; private RegistrantList gprsAttachedRegistrants = new RegistrantList(); private RegistrantList gprsDetachedRegistrants = new RegistrantList(); @@ -309,6 +312,10 @@ final class GsmServiceStateTracker extends ServiceStateTracker { psRestrictDisabledRegistrants.remove(h); } + /*protected*/ boolean getDataRoaming() { + return mDataRoaming; + } + //***** Called from GSMPhone public void getLacAndCid(Message onComplete) { @@ -666,6 +673,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { } } newGPRSState = regCodeToServiceState(regState); + newDataRoaming = regCodeIsRoaming(regState); newNetworkType = type; break; @@ -693,6 +701,11 @@ final class GsmServiceStateTracker extends ServiceStateTracker { if (pollingContext[0] == 0) { newSS.setRoaming(isRoamingBetweenOperators(mGsmRoaming, newSS)); + // when both roaming indicators are true but not roaming between + // operators, roaming should set to false. + if (newDataRoaming && mGsmRoaming && !newSS.getRoaming()) { + newDataRoaming = false; + } pollStateDone(); } @@ -722,6 +735,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; pollStateDone(); break; @@ -731,6 +745,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; pollStateDone(); break; @@ -745,6 +760,8 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; + mDataRoaming = false; //NOTE: pollStateDone() is not needed in this case break; @@ -829,9 +846,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { boolean hasChanged = !newSS.equals(ss); - boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming(); + boolean hasRoamingOn = !mDataRoaming && newDataRoaming; - boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming(); + boolean hasRoamingOff = mDataRoaming && !newDataRoaming; boolean hasLocationChanged = !newCellLoc.equals(cellLoc); @@ -848,6 +865,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { gprsState = newGPRSState; networkType = newNetworkType; + mDataRoaming = newDataRoaming; newSS.setStateOutOfService(); // clean slate for next time diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index f1207e4ad6001..af591268d99ee 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -277,10 +277,12 @@ public class SmsMessage extends SmsMessageBase{ } if (header != null) { - userData = new byte[header.length + textPart.length]; + // Need 1 byte for UDHL + userData = new byte[header.length + textPart.length + 1]; - System.arraycopy(header, 0, userData, 0, header.length); - System.arraycopy(textPart, 0, userData, header.length, textPart.length); + userData[0] = (byte)header.length; + System.arraycopy(header, 0, userData, 1, header.length); + System.arraycopy(textPart, 0, userData, header.length + 1, textPart.length); } else { userData = textPart; diff --git a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java index 89421e48c4150..29000dd6dd042 100644 --- a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java +++ b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java @@ -19,8 +19,8 @@ package android.widget; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; import android.test.FlakyTest; -import android.test.suitebuilder.annotation.MediumTest; +// TODO: tests fail intermittently. Add back MediumTest annotation when fixed public class AutoCompleteTextViewCallbacks extends ActivityInstrumentationTestCase2 { @@ -32,7 +32,6 @@ public class AutoCompleteTextViewCallbacks /** Test that the initial popup of the suggestions does not select anything. */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupNoSelection() throws Exception { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -57,7 +56,6 @@ public class AutoCompleteTextViewCallbacks } /** Test that arrow-down into the popup calls the onSelected callback. */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupEnterSelection() throws Exception { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -95,7 +93,6 @@ public class AutoCompleteTextViewCallbacks } /** Test that arrow-up out of the popup calls the onNothingSelected callback */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupLeaveSelection() { AutoCompleteTextViewSimple theActivity = getActivity(); diff --git a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java index 1e4cd2017debd..c48c05600e7d6 100644 --- a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java +++ b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java @@ -20,10 +20,11 @@ import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; import android.test.FlakyTest; import android.test.suitebuilder.annotation.MediumTest; -import android.util.Log; /** * A collection of tests on aspects of the AutoCompleteTextView's popup + * + * TODO: tests fail intermittently. Add back MediumTest annotation when fixed */ public class AutoCompleteTextViewPopup extends ActivityInstrumentationTestCase2 { @@ -40,7 +41,6 @@ public class AutoCompleteTextViewPopup } /** Test that we can move the selection and it responds as expected */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupSetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -73,7 +73,6 @@ public class AutoCompleteTextViewPopup } /** Test that we can look at the selection as we move around */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupGetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -101,7 +100,6 @@ public class AutoCompleteTextViewPopup } /** Test that we can clear the selection */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupClearListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -135,7 +133,6 @@ public class AutoCompleteTextViewPopup } /** Make sure we handle an empty adapter properly */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupNavigateNoAdapter() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); @@ -170,7 +167,6 @@ public class AutoCompleteTextViewPopup } /** Test the show/hide behavior of the drop-down. */ - @MediumTest @FlakyTest(tolerance=3) public void testPopupShow() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index e04491d93b863..5f80ade3a77e4 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -321,6 +321,7 @@ enum { 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 @@ int doDump(Bundle* bundle) 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 6bc01b129df5d..7dde63446e08d 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 java.io.IOException; 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 final class Bitmap extends _Original_Bitmap { 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 @@ public final class Bitmap extends _Original_Bitmap { 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 @@ public final class Bitmap extends _Original_Bitmap { 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 @@ public final class Bitmap extends _Original_Bitmap { 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 @@ public final class Bitmap extends _Original_Bitmap { } 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 final class Bitmap extends _Original_Bitmap { 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 @@ public final class Bitmap extends _Original_Bitmap { || (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 47106912e4679..3fa1d1d6cf0c6 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.Composite; 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 @@ import javax.microedition.khronos.opengles.GL; /** * 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 mGraphicsStack = new Stack(); 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. *

      The object must be disposed ({@link Graphics2D#dispose()}) after being used. @@ -91,11 +107,11 @@ public class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { } 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 @@ public class BridgeCanvas extends Canvas { shader.getClass().getCanonicalName())); } } - + return g; } - + private void setModeInGraphics(PorterDuff.Mode mode, Graphics2D g, float falpha) { switch (mode) { case CLEAR: @@ -168,14 +184,43 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { public void translate(float dx, float dy) { getGraphics2d().translate(dx, dy); } - + /* (non-Javadoc) * @see android.graphics.Canvas#save() */ @@ -191,7 +236,7 @@ public class BridgeCanvas extends Canvas { public int save() { Graphics2D g = (Graphics2D)getGraphics2d().create(); mGraphicsStack.push(g); - + return mGraphicsStack.size() - 1; } @@ -203,7 +248,7 @@ public class BridgeCanvas extends Canvas { // For now we ignore saveFlags return save(); } - + /* (non-Javadoc) * @see android.graphics.Canvas#restore() */ @@ -221,7 +266,7 @@ public class BridgeCanvas extends Canvas { mGraphicsStack.pop(); } } - + /* (non-Javadoc) * @see android.graphics.Canvas#getSaveCount() */ @@ -229,8 +274,8 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { } 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 class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { drawColor(0xFF << 24 | r << 16 | g << 8 | b, PorterDuff.Mode.SRC_OVER); } - + /* (non-Javadoc) * @see android.graphics.Canvas#getWidth() */ @@ -385,7 +443,7 @@ public class BridgeCanvas extends Canvas { public int getWidth() { return mBufferedImage.getWidth(); } - + /* (non-Javadoc) * @see android.graphics.Canvas#getHeight() */ @@ -401,7 +459,7 @@ public class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { */ @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 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { x -= m; } } - + g.drawChars(text, index, count, (int)x, (int)y); - + g.dispose(); } @@ -586,7 +672,7 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { // dispose Graphics2D object g.dispose(); } - + /* (non-Javadoc) * @see android.graphics.Canvas#drawLines(float[], int, int, android.graphics.Paint) */ @@ -687,7 +773,7 @@ public class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { // dispose Graphics2D object g.dispose(); } - + /* (non-Javadoc) * @see android.graphics.Canvas#drawPath(android.graphics.Path, android.graphics.Paint) */ @@ -766,11 +852,11 @@ public class BridgeCanvas extends Canvas { 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 @@ public class BridgeCanvas extends Canvas { // dispose Graphics2D object g.dispose(); } - + /* (non-Javadoc) * @see android.graphics.Canvas#setMatrix(android.graphics.Matrix) */ @@ -795,10 +881,10 @@ public class BridgeCanvas extends Canvas { // 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."); } @@ -1058,15 +1144,6 @@ public class BridgeCanvas extends Canvas { return super.saveLayerAlpha(bounds, alpha, saveFlags); } - /* (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) */ diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix.java b/tools/layoutlib/bridge/src/android/graphics/Matrix.java index 18c0e178b3b77..3974e08f18cc0 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 @@ public class Matrix extends _Original_Matrix { * 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 class Matrix extends _Original_Matrix { 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 @@ public class Matrix extends _Original_Matrix { 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/android/os/ServiceManager.java b/tools/layoutlib/bridge/src/android/os/ServiceManager.java new file mode 100644 index 0000000000000..6a68ee29c9cb1 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/os/ServiceManager.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +import java.util.Map; + +public final class ServiceManager { + + /** + * Returns a reference to a service with the given name. + * + * @param name the name of the service to get + * @return a reference to the service, or null if the service doesn't exist + */ + public static IBinder getService(String name) { + return null; + } + + /** + * Place a new @a service called @a name into the service + * manager. + * + * @param name the name of the new service + * @param service the service object + */ + public static void addService(String name, IBinder service) { + // pass + } + + /** + * Retrieve an existing service called @a name from the + * service manager. Non-blocking. + */ + public static IBinder checkService(String name) { + return null; + } + + /** + * Return a list of all currently running services. + */ + public static String[] listServices() throws RemoteException { + // actual implementation returns null sometimes, so it's ok + // to return null instead of an empty list. + return null; + } + + /** + * This is only intended to be called when the process is first being brought + * up and bound by the activity manager. There is only one thread in the process + * at that time, so no locking is done. + * + * @param cache the cache of service references + * @hide + */ + public static void initServiceCache(Map cache) { + // pass + } +} diff --git a/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java b/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java new file mode 100644 index 0000000000000..251c053d19822 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.accessibility; + +import android.content.Context; +import android.content.pm.ServiceInfo; + +import java.util.Collections; +import java.util.List; + +/** + * System level service that serves as an event dispatch for {@link AccessibilityEvent}s. + * Such events are generated when something notable happens in the user interface, + * for example an {@link android.app.Activity} starts, the focus or selection of a + * {@link android.view.View} changes etc. Parties interested in handling accessibility + * events implement and register an accessibility service which extends + * {@link android.accessibilityservice.AccessibilityService}. + * + * @see AccessibilityEvent + * @see android.accessibilityservice.AccessibilityService + * @see android.content.Context#getSystemService + */ +public final class AccessibilityManager { + private static AccessibilityManager sInstance = new AccessibilityManager(); + + /** + * Get an AccessibilityManager instance (create one if necessary). + * + * @hide + */ + public static AccessibilityManager getInstance(Context context) { + return sInstance; + } + + /** + * Create an instance. + * + * @param context A {@link Context}. + */ + private AccessibilityManager() { + } + + /** + * Returns if the {@link AccessibilityManager} is enabled. + * + * @return True if this {@link AccessibilityManager} is enabled, false otherwise. + */ + public boolean isEnabled() { + return false; + } + + /** + * Sends an {@link AccessibilityEvent}. If this {@link AccessibilityManager} is not + * enabled the call is a NOOP. + * + * @param event The {@link AccessibilityEvent}. + * + * @throws IllegalStateException if a client tries to send an {@link AccessibilityEvent} + * while accessibility is not enabled. + */ + public void sendAccessibilityEvent(AccessibilityEvent event) { + } + + /** + * Requests interruption of the accessibility feedback from all accessibility services. + */ + public void interrupt() { + } + + /** + * Returns the {@link ServiceInfo}s of the installed accessibility services. + * + * @return An unmodifiable list with {@link ServiceInfo}s. + */ + public List getAccessibilityServiceList() { + // normal implementation does this in some case, so let's do the same + // (unmodifiableList wrapped around null). + List services = null; + return Collections.unmodifiableList(services); + } +} 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 fd77d5143d9e9..145a045e5165d 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.MethodAdapter; 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 @@ public final class Bridge implements ILayoutBridge { 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 @@ public final class Bridge implements ILayoutBridge { 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 @@ public final class Bridge implements ILayoutBridge { /** * 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> frameworkResources, + IStyleResourceValue currentTheme, BridgeContext context) { int offset = 0; // get the title bar flag from the current theme. @@ -687,22 +691,25 @@ public final class Bridge implements ILayoutBridge { // 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 @@ public final class Bridge implements ILayoutBridge { 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 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 b426247e7a49f..b5b7ceb75e548 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 class BridgeConstants { 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/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java index 69f3d9c9ca99d..f48c8db4773a6 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java @@ -64,7 +64,7 @@ import java.util.Map.Entry; * Custom implementation of Context to handle non compiled resources. */ public final class BridgeContext extends Context { - + private Resources mResources; private Theme mTheme; private HashMap mViewKeyMap = new HashMap(); @@ -73,12 +73,12 @@ public final class BridgeContext extends Context { private Map> mProjectResources; private Map> mFrameworkResources; private Map mStyleInheritanceMap; - + // maps for dynamically generated id representing style objects (IStyleResourceValue) private Map mDynamicIdToStyleMap; private Map mStyleToDynamicIdMap; private int mDynamicIdGenerator = 0x01030000; // Base id for framework R.style - + // cache for TypedArray generated from IStyleResourceValue object private Map> mTypedArrayCache; private BridgeInflater mInflater; @@ -112,7 +112,7 @@ public final class BridgeContext extends Context { mProjectCallback = customViewLoader; mLogger = logger; Configuration config = new Configuration(); - + AssetManager assetManager = BridgeAssetManager.initSystem(); mResources = BridgeResources.initSystem( this, @@ -120,19 +120,19 @@ public final class BridgeContext extends Context { metrics, config, customViewLoader); - + mTheme = mResources.newTheme(); - + mThemeValues = currentTheme; mProjectResources = projectResources; mFrameworkResources = frameworkResources; mStyleInheritanceMap = styleInheritanceMap; } - + public void setBridgeInflater(BridgeInflater inflater) { mInflater = inflater; } - + public void addViewKey(View view, Object viewKey) { mViewKeyMap.put(view, viewKey); } @@ -140,19 +140,19 @@ public final class BridgeContext extends Context { public Object getViewKey(View view) { return mViewKeyMap.get(view); } - + public Object getProjectKey() { return mProjectKey; } - + public IProjectCallback getProjectCallback() { return mProjectCallback; } - + public ILayoutLog getLogger() { return mLogger; } - + // ------------ Context methods @Override @@ -169,14 +169,14 @@ public final class BridgeContext extends Context { public ClassLoader getClassLoader() { return this.getClass().getClassLoader(); } - + @Override public Object getSystemService(String service) { if (LAYOUT_INFLATER_SERVICE.equals(service)) { return mInflater; } - - // AutoCompleteTextView and MultiAutoCompleteTextView want a window + + // AutoCompleteTextView and MultiAutoCompleteTextView want a window // service. We don't have any but it's not worth an exception. if (WINDOW_SERVICE.equals(service)) { return null; @@ -196,38 +196,38 @@ public final class BridgeContext extends Context { throws Resources.NotFoundException { // get the IStyleResourceValue based on the resId; IStyleResourceValue style = getStyleByDynamicId(resid); - + if (style == null) { throw new Resources.NotFoundException(); } if (mTypedArrayCache == null) { mTypedArrayCache = new HashMap>(); - + Map map = new HashMap(); mTypedArrayCache.put(attrs, map); BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs); map.put(resid, ta); - + return ta; } - + // get the 2nd map Map map = mTypedArrayCache.get(attrs); if (map == null) { map = new HashMap(); mTypedArrayCache.put(attrs, map); } - + // get the array from the 2nd map TypedArray ta = map.get(resid); - + if (ta == null) { ta = createStyleBasedTypedArray(style, attrs); map.put(resid, ta); } - + return ta; } @@ -235,11 +235,11 @@ public final class BridgeContext extends Context { public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) { return obtainStyledAttributes(set, attrs, 0, 0); } - + @Override public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { - + // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java BridgeXmlBlockParser parser = null; if (set instanceof BridgeXmlBlockParser) { @@ -252,10 +252,10 @@ public final class BridgeContext extends Context { boolean[] frameworkAttributes = new boolean[1]; TreeMap styleNameMap = searchAttrs(attrs, frameworkAttributes); - + BridgeTypedArray ta = ((BridgeResources) mResources).newTypeArray(attrs.length, parser.isPlatformFile()); - + // resolve the defStyleAttr value into a IStyleResourceValue IStyleResourceValue defStyleValues = null; if (defStyleAttr != 0) { @@ -265,7 +265,7 @@ public final class BridgeContext extends Context { // look for the style in the current theme, and its parent: if (mThemeValues != null) { IResourceValue item = findItemInStyle(mThemeValues, defStyleName); - + if (item != null) { // item is a reference to a style entry. Search for it. item = findResValue(item.getValue()); @@ -279,12 +279,12 @@ public final class BridgeContext extends Context { } } } - + if (defStyleRes != 0) { // FIXME: See what we need to do with this. throw new UnsupportedOperationException(); } - + String namespace = BridgeConstants.NS_RESOURCES; if (frameworkAttributes[0] == false) { // need to use the application namespace @@ -294,32 +294,32 @@ public final class BridgeContext extends Context { if (styleNameMap != null) { for (Entry styleAttribute : styleNameMap.entrySet()) { int index = styleAttribute.getKey().intValue(); - + String name = styleAttribute.getValue(); String value = parser.getAttributeValue(namespace, name); - + // if there's no direct value for this attribute in the XML, we look for default // values in the widget defStyle, and then in the theme. if (value == null) { IResourceValue resValue = null; - + // look for the value in the defStyle first (and its parent if needed) if (defStyleValues != null) { resValue = findItemInStyle(defStyleValues, name); } - + // if the item is not present in the defStyle, we look in the main theme (and // its parent themes) if (resValue == null && mThemeValues != null) { resValue = findItemInStyle(mThemeValues, name); } - + // if we found a value, we make sure this doesn't reference another value. // So we resolve it. if (resValue != null) { resValue = resolveResValue(resValue); } - + ta.bridgeSetValue(index, name, resValue); } else { // there is a value in the XML, but we need to resolve it in case it's @@ -328,15 +328,20 @@ public final class BridgeContext extends Context { } } } - + ta.sealArray(); - + return ta; } - - + + @Override + public Looper getMainLooper() { + return Looper.myLooper(); + } + + // ------------- private new methods - + /** * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the * values found in the given style. @@ -345,30 +350,30 @@ public final class BridgeContext extends Context { private BridgeTypedArray createStyleBasedTypedArray(IStyleResourceValue style, int[] attrs) throws Resources.NotFoundException { TreeMap styleNameMap = searchAttrs(attrs, null); - + BridgeTypedArray ta = ((BridgeResources) mResources).newTypeArray(attrs.length, false /* platformResourceFlag */); - + // loop through all the values in the style map, and init the TypedArray with // the style we got from the dynamic id for (Entry styleAttribute : styleNameMap.entrySet()) { int index = styleAttribute.getKey().intValue(); String name = styleAttribute.getValue(); - + // get the value from the style, or its parent styles. IResourceValue resValue = findItemInStyle(style, name); - + // resolve it to make sure there are no references left. ta.bridgeSetValue(index, name, resolveResValue(resValue)); } - + ta.sealArray(); return ta; } - + /** * Resolves the value of a resource, if the value references a theme or resource value. *

      @@ -391,13 +396,13 @@ public final class BridgeContext extends Context { // get the IResourceValue referenced by this value IResourceValue resValue = findResValue(value); - + // if resValue is null, but value is not null, this means it was not a reference. // we return the name/value wrapper in a IResourceValue if (resValue == null) { return new ResourceValue(type, name, value); } - + // we resolved a first reference, but we need to make sure this isn't a reference also. return resolveResValue(resValue); } @@ -411,7 +416,7 @@ public final class BridgeContext extends Context { *

      * If a value that does not need to be resolved is given, the method will return the input * value. - * + * * @param value the value containing the reference to resolve. * @return a {@link IResourceValue} object or null */ @@ -419,7 +424,7 @@ public final class BridgeContext extends Context { if (value == null) { return null; } - + // if the resource value is a style, we simply return it. if (value instanceof IStyleResourceValue) { return value; @@ -436,7 +441,7 @@ public final class BridgeContext extends Context { // otherwise, we attempt to resolve this new value as well return resolveResValue(resolvedValue); } - + /** * Searches for, and returns a {@link IResourceValue} by its reference. *

      @@ -451,7 +456,7 @@ public final class BridgeContext extends Context { *

      * The actual format of a reference is

      @[namespace:]resType/resName
      but this method * only support the android namespace. - * + * * @param reference the resource reference to search for. * @return a {@link IResourceValue} or null. */ @@ -481,7 +486,7 @@ public final class BridgeContext extends Context { // we look for the referenced item name. String referenceName = null; - + if (segments.length == 2) { // there was a resType in the reference. If it's attr, we ignore it // else, we assert for now. @@ -495,7 +500,7 @@ public final class BridgeContext extends Context { // it's just an item name. referenceName = segments[0]; } - + // now we look for android: in the referenceName in order to support format // such as: ?attr/android:name if (referenceName.startsWith(BridgeConstants.PREFIX_ANDROID)) { @@ -512,9 +517,9 @@ public final class BridgeContext extends Context { return findItemInStyle(mThemeValues, referenceName); } else if (reference.startsWith(BridgeConstants.PREFIX_RESOURCE_REF)) { boolean frameworkOnly = false; - + // check for the specific null reference value. - if (BridgeConstants.REFERENCE_NULL.equals(reference)) { + if (BridgeConstants.REFERENCE_NULL.equals(reference)) { return null; } @@ -526,20 +531,20 @@ public final class BridgeContext extends Context { } else { reference = reference.substring(BridgeConstants.PREFIX_RESOURCE_REF.length()); } - + // at this point, value contains type/[android:]name (drawable/foo for instance) String[] segments = reference.split("\\/"); - + // now we look for android: in the resource name in order to support format // such as: @drawable/android:name if (segments[1].startsWith(BridgeConstants.PREFIX_ANDROID)) { frameworkOnly = true; segments[1] = segments[1].substring(BridgeConstants.PREFIX_ANDROID.length()); } - + return findResValue(segments[0], segments[1], frameworkOnly); } - + // Looks like the value didn't reference anything. Return null. return null; } @@ -565,7 +570,7 @@ public final class BridgeContext extends Context { } } } - + // now search in the framework resources. typeMap = mFrameworkResources.get(resType); if (typeMap != null) { @@ -574,11 +579,11 @@ public final class BridgeContext extends Context { return item; } } - + // didn't find the resource anywhere. return null; } - + /** * Returns a framework resource by type and name. The returned resource is resolved. * @param resourceType the type of the resource @@ -587,7 +592,7 @@ public final class BridgeContext extends Context { public IResourceValue getFrameworkResource(String resourceType, String resourceName) { return getResource(resourceType, resourceName, mFrameworkResources); } - + /** * Returns a project resource by type and name. The returned resource is resolved. * @param resourceType the type of the resource @@ -596,7 +601,7 @@ public final class BridgeContext extends Context { public IResourceValue getProjectResource(String resourceType, String resourceName) { return getResource(resourceType, resourceName, mProjectResources); } - + IResourceValue getResource(String resourceType, String resourceName, Map> resourceRepository) { Map typeMap = resourceRepository.get(resourceType); @@ -607,12 +612,12 @@ public final class BridgeContext extends Context { return item; } } - + // didn't find the resource anywhere. return null; - + } - + /** * Returns the {@link IResourceValue} matching a given name in a given style. If the * item is not directly available in the style, the method looks in its parent style. @@ -622,7 +627,7 @@ public final class BridgeContext extends Context { */ IResourceValue findItemInStyle(IStyleResourceValue style, String itemName) { IResourceValue item = style.findItem(itemName); - + // if we didn't find it, we look in the parent style (if applicable) if (item == null && mStyleInheritanceMap != null) { IStyleResourceValue parentStyle = mStyleInheritanceMap.get(style); @@ -630,7 +635,7 @@ public final class BridgeContext extends Context { return findItemInStyle(parentStyle, itemName); } } - + return item; } @@ -642,7 +647,7 @@ public final class BridgeContext extends Context { * attrs == com.android.internal.R.styleable.View, this returns the list of the "xyz" where * there's a field com.android.internal.R.styleable.View_xyz and the field value is the index * that is used to reference the attribute later in the TypedArray. - * + * * @param attrs An attribute array reference given to obtainStyledAttributes. * @return A sorted map Attribute-Value to Attribute-Name for all attributes declared by the * attribute array. Returns null if nothing is found. @@ -662,14 +667,14 @@ public final class BridgeContext extends Context { attributes.put(i, null); } } - + if (outFrameworkFlag != null) { outFrameworkFlag[0] = true; } - + return attributes; } - + // if the name was not found in the framework resources, look in the project // resources arrayName = mProjectCallback.resolveResourceValue(attrs); @@ -697,7 +702,7 @@ public final class BridgeContext extends Context { /** * Searches for the attribute referenced by its internal id. - * + * * @param attr An attribute reference given to obtainStyledAttributes such as defStyle. * @return The unique name of the attribute, if found, e.g. "buttonStyle". Returns null * if nothing is found. @@ -707,12 +712,12 @@ public final class BridgeContext extends Context { if (info != null) { return info[0]; } - + info = mProjectCallback.resolveResourceValue(attr); if (info != null) { return info[0]; } - + return null; } @@ -722,27 +727,27 @@ public final class BridgeContext extends Context { mDynamicIdToStyleMap = new HashMap(); mStyleToDynamicIdMap = new HashMap(); } - + // look for an existing id Integer id = mStyleToDynamicIdMap.get(resValue); - + if (id == null) { // generate a new id id = Integer.valueOf(++mDynamicIdGenerator); - + // and add it to the maps. mDynamicIdToStyleMap.put(id, resValue); mStyleToDynamicIdMap.put(resValue, id); } - + return id; } - + private IStyleResourceValue getStyleByDynamicId(int i) { if (mDynamicIdToStyleMap != null) { return mDynamicIdToStyleMap.get(i); } - + return null; } @@ -751,10 +756,10 @@ public final class BridgeContext extends Context { if (value != null) { return value.intValue(); } - + return defValue; } - + int getProjectIdValue(String idName, int defValue) { if (mProjectCallback != null) { Integer value = mProjectCallback.getResourceValue(BridgeConstants.RES_ID, idName); @@ -762,7 +767,7 @@ public final class BridgeContext extends Context { return value.intValue(); } } - + return defValue; } @@ -820,7 +825,7 @@ public final class BridgeContext extends Context { @Override public void clearWallpaper() { // TODO Auto-generated method stub - + } @Override @@ -850,46 +855,46 @@ public final class BridgeContext extends Context { @Override public void enforceCallingOrSelfPermission(String arg0, String arg1) { // TODO Auto-generated method stub - + } @Override public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1, String arg2) { // TODO Auto-generated method stub - + } @Override public void enforceCallingPermission(String arg0, String arg1) { // TODO Auto-generated method stub - + } @Override public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) { // TODO Auto-generated method stub - + } @Override public void enforcePermission(String arg0, int arg1, int arg2, String arg3) { // TODO Auto-generated method stub - + } @Override public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3, String arg4) { // TODO Auto-generated method stub - + } @Override public void enforceUriPermission(Uri arg0, String arg1, String arg2, int arg3, int arg4, int arg5, String arg6) { // TODO Auto-generated method stub - + } @Override @@ -965,7 +970,7 @@ public final class BridgeContext extends Context { // TODO Auto-generated method stub return null; } - + @Override public String getPackageResourcePath() { // TODO Auto-generated method stub @@ -1003,7 +1008,7 @@ public final class BridgeContext extends Context { @Override public void grantUriPermission(String arg0, Uri arg1, int arg2) { // TODO Auto-generated method stub - + } @SuppressWarnings("unused") @@ -1051,31 +1056,31 @@ public final class BridgeContext extends Context { @Override public void removeStickyBroadcast(Intent arg0) { // TODO Auto-generated method stub - + } @Override public void revokeUriPermission(Uri arg0, int arg1) { // TODO Auto-generated method stub - + } @Override public void sendBroadcast(Intent arg0) { // TODO Auto-generated method stub - + } @Override public void sendBroadcast(Intent arg0, String arg1) { // TODO Auto-generated method stub - + } @Override public void sendOrderedBroadcast(Intent arg0, String arg1) { // TODO Auto-generated method stub - + } @Override @@ -1083,39 +1088,39 @@ public final class BridgeContext extends Context { BroadcastReceiver arg2, Handler arg3, int arg4, String arg5, Bundle arg6) { // TODO Auto-generated method stub - + } @Override public void sendStickyBroadcast(Intent arg0) { // TODO Auto-generated method stub - + } @Override public void setTheme(int arg0) { // TODO Auto-generated method stub - + } @SuppressWarnings("unused") @Override public void setWallpaper(Bitmap arg0) throws IOException { // TODO Auto-generated method stub - + } @SuppressWarnings("unused") @Override public void setWallpaper(InputStream arg0) throws IOException { // TODO Auto-generated method stub - + } @Override public void startActivity(Intent arg0) { // TODO Auto-generated method stub - + } @Override @@ -1140,20 +1145,15 @@ public final class BridgeContext extends Context { @Override public void unbindService(ServiceConnection arg0) { // TODO Auto-generated method stub - + } @Override public void unregisterReceiver(BroadcastReceiver arg0) { // TODO Auto-generated method stub - + } - @Override - public Looper getMainLooper() { - throw new UnsupportedOperationException(); - } - @Override public Context getApplicationContext() { throw new UnsupportedOperationException(); 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 0bcc7fd680dd2..2b0100b72418f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java @@ -43,14 +43,14 @@ import java.io.FileReader; import java.io.InputStream; /** - * + * */ public final class BridgeResources extends Resources { private BridgeContext mContext; private IProjectCallback mProjectCallback; private boolean[] mPlatformResourceFlag = new boolean[1]; - + /** * This initializes the static field {@link Resources#mSystem} which is used * by methods who get global resources using {@link Resources#getSystem()}. @@ -59,7 +59,7 @@ public final class BridgeResources extends Resources { *

      * {@link Bridge} calls this method after setting up a new bridge. */ - /*package*/ static Resources initSystem(BridgeContext context, + /*package*/ static Resources initSystem(BridgeContext context, AssetManager assets, DisplayMetrics metrics, Configuration config, @@ -73,7 +73,7 @@ public final class BridgeResources extends Resources { } return Resources.mSystem; } - + /** * Clears the static {@link Resources#mSystem} to make sure we don't leave objects * around that would prevent us from unloading the library. @@ -92,15 +92,15 @@ public final class BridgeResources extends Resources { mContext = context; mProjectCallback = projectCallback; } - + public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) { return new BridgeTypedArray(this, mContext, numEntries, platformFile); } - + private IResourceValue getResourceValue(int id, boolean[] platformResFlag_out) { // first get the String related to this id in the framework String[] resourceInfo = Bridge.resolveResourceValue(id); - + if (resourceInfo != null) { platformResFlag_out[0] = true; return mContext.getFrameworkResource(resourceInfo[1], resourceInfo[0]); @@ -109,7 +109,7 @@ public final class BridgeResources extends Resources { // didn't find a match in the framework? look in the project. if (mProjectCallback != null) { resourceInfo = mProjectCallback.resolveResourceValue(id); - + if (resourceInfo != null) { platformResFlag_out[0] = false; return mContext.getProjectResource(resourceInfo[1], resourceInfo[0]); @@ -118,26 +118,26 @@ public final class BridgeResources extends Resources { return null; } - + @Override public Drawable getDrawable(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null) { return ResourceHelper.getDrawable(value.getValue(), mContext, value.isFramework()); } - + // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } - + @Override public int getColor(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null) { try { return ResourceHelper.getColor(value.getValue()); @@ -145,18 +145,18 @@ public final class BridgeResources extends Resources { return 0; } } - + // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return 0; } - + @Override public ColorStateList getColorStateList(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null) { try { int color = ResourceHelper.getColor(value.getValue()); @@ -165,33 +165,33 @@ public final class BridgeResources extends Resources { return null; } } - + // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } - + @Override public CharSequence getText(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null) { return value.getValue(); } - + // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } - + @Override public XmlResourceParser getLayout(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null) { File xml = new File(value.getValue()); if (xml.isFile()) { @@ -201,7 +201,7 @@ public final class BridgeResources extends Resources { KXmlParser parser = new KXmlParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new FileReader(xml)); - + return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); } catch (XmlPullParserException e) { mContext.getLogger().error(e); @@ -215,22 +215,22 @@ public final class BridgeResources extends Resources { // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } - + @Override public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { return mContext.obtainStyledAttributes(set, attrs); } - + @Override public TypedArray obtainTypedArray(int id) throws NotFoundException { throw new UnsupportedOperationException(); } - - + + @Override public float getDimension(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); @@ -244,7 +244,7 @@ public final class BridgeResources extends Resources { } else if (v.equals(BridgeConstants.WRAP_CONTENT)) { return LayoutParams.WRAP_CONTENT; } - + if (ResourceHelper.stringToFloat(v, mTmpValue) && mTmpValue.type == TypedValue.TYPE_DIMENSION) { return mTmpValue.getDimension(mMetrics); @@ -254,7 +254,7 @@ public final class BridgeResources extends Resources { // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return 0; } @@ -276,7 +276,7 @@ public final class BridgeResources extends Resources { // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return 0; } @@ -298,7 +298,7 @@ public final class BridgeResources extends Resources { // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return 0; } @@ -306,7 +306,7 @@ public final class BridgeResources extends Resources { @Override public int getInteger(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null && value.getValue() != null) { String v = value.getValue(); int radix = 10; @@ -320,10 +320,10 @@ public final class BridgeResources extends Resources { // return exception below } } - + // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return 0; } @@ -348,12 +348,12 @@ public final class BridgeResources extends Resources { String s = getString(id); if (s != null) { return String.format(s, formatArgs); - + } // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } @@ -361,14 +361,14 @@ public final class BridgeResources extends Resources { @Override public String getString(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); - + if (value != null && value.getValue() != null) { return value.getValue(); } // id was not found or not resolved. Throw a NotFoundException. throwException(id); - + // this is not used since the method above always throws return null; } @@ -385,6 +385,11 @@ public final class BridgeResources extends Resources { if (ResourceHelper.stringToFloat(v, outValue)) { return; } + + // else it's a string + outValue.type = TypedValue.TYPE_STRING; + outValue.string = v; + return; } } @@ -413,7 +418,7 @@ public final class BridgeResources extends Resources { KXmlParser parser = new KXmlParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new FileReader(f)); - + return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); } catch (XmlPullParserException e) { NotFoundException newE = new NotFoundException(); @@ -435,6 +440,33 @@ public final class BridgeResources extends Resources { return null; } + @Override + public XmlResourceParser loadXmlResourceParser(String file, int id, + int assetCookie, String type) throws NotFoundException { + // even though we know the XML file to load directly, we still need to resolve the + // id so that we can know if it's a platform or project resource. + // (mPlatformResouceFlag will get the result and will be used later). + getResourceValue(id, mPlatformResourceFlag); + + File f = new File(file); + try { + KXmlParser parser = new KXmlParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + parser.setInput(new FileReader(f)); + + return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); + } catch (XmlPullParserException e) { + NotFoundException newE = new NotFoundException(); + newE.initCause(e); + throw newE; + } catch (FileNotFoundException e) { + NotFoundException newE = new NotFoundException(); + newE.initCause(e); + throw newE; + } + } + + @Override public InputStream openRawResource(int id) throws NotFoundException { IResourceValue value = getResourceValue(id, mPlatformResourceFlag); @@ -464,6 +496,24 @@ public final class BridgeResources extends Resources { return null; } + @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(); @@ -482,7 +532,7 @@ public final class BridgeResources extends Resources { if (resourceInfo == null && mProjectCallback != null) { resourceInfo = mProjectCallback.resolveResourceValue(id); } - + String message = null; if (resourceInfo != null) { message = String.format( @@ -492,7 +542,7 @@ public final class BridgeResources extends Resources { message = String.format( "Could not resolve resource value: 0x%1$X.", id); } - + throw new NotFoundException(message); } } 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 5f0852e3bf033..abbf2f0546c10 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 @@ public class NinePatchDrawable extends Drawable { 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 class NinePatchDrawable extends Drawable { 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 @@ public class NinePatchDrawable extends Drawable { 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 76bd8d4a5ca41..47184f10efdc6 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 @@ -40,7 +40,7 @@ public class Main { for (String path : osJarPath) { log.info("Input : %1$s", path); } - + try { AsmGenerator agen = new AsmGenerator(log, osDestJar[0], new Class[] { // classes to inject in the final JAR @@ -54,20 +54,23 @@ public class Main { }, 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", + "android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager", }, new String[] { // methods deleted from their return type. "android.graphics.Paint", // class to delete method from @@ -101,7 +104,7 @@ public class Main { }); aa.analyze(); agen.generate(); - + // Throw an error if any class failed to get renamed by the generator // // IMPORTANT: if you're building the platform and you get this error message, @@ -123,7 +126,7 @@ public class Main { } System.exit(1); } - + System.exit(0); } catch (IOException e) { log.exception(e, "Failed to load jar"); @@ -158,7 +161,7 @@ public class Main { return false; } } - + if (osJarPath.isEmpty()) { log.error("Missing parameter: path to input jar"); return false; diff --git a/tools/preload/20090811.compiled b/tools/preload/20090811.compiled new file mode 100644 index 0000000000000000000000000000000000000000..6dbeca094df5c380c6d962c76c4266b9a27ab0d8 GIT binary patch literal 15943336 zcmb@Pb(|E()5b@3?+)F)!!?IH1b2d4Ah-oR;BYwPaMwTr1P}hh-Gc@T1PMWc1W9lY z5HwhTkhh*{cD9e*+1@|i`+T;!W9Hk{(^6ga%=P9mU7Om}tD5G*f7R;{)ib&+|4(%-akr@0j(wu5 zMn`oQRD}4CxLmmSPl>Fig~!Bpi0&EpJU9QJbXvdebP)!Y%N)qy(88T!Y*pOUvaWokxcEj~K7a#Wkxn4Z)Vu^oCw z_v#SSrES0NpOr;LpK5)>G!4I|uM?|fXcN;lZ&bIoJ!3ky&D$%wXP@Yvd8>7cjqVm( zH@a6$7y1*OUc)<7r~*HR7FJC&yLP1BHoJC-{Su=UEr#?u}UOQ`4(yj$Sk`xa0M{4!V-~ z1jVb>J-R2ijxUa{FSNRrFuGgY`W?GQe-YI!hNg$JW4E@^{b*A3ijC?SYaO8WiVNrK z#Y~s_i!Lqn!#s}FLTc2eDNX+s(yMptnC_m-b;S1XPS@tHVYMQ2efl51GHOcn$p6tS zD9A0Vm18P8Bq6ogfx4vTR@01*ZL4XCV?39_bDq{#MNIXr;xl7X$^w4z=sa*i6=Rup&NO-v$ zdpxu@eZZ$UoR$wKrT-qQX`w5v8obR8m)Ah|4l&(?!@;!~;@VJ8s#q<&6wUEG)@+V$ zTgJMS(3Lnd>?O`j?`@EFa^69zM(0ND{UFCz_V>L&$FRIm->|O{@PiF|bXDeN{ z?0({77l)*=)6JGsEb_mlx0z%Joj;L!XNpf1v05^Z^ZBqy@Mb{K2=PfX{Ts)p`FQdI)xt{aZHM%2mYgpL(m&b2s^ysxe_(kJq(2AE9v$BcC2`obSAq$Ubc=5d=r1=^;7KqT^^lcBViI3s;cN@SI08HoyIGWV%MFjNJF_X0gVjQ^DbUQ^p5eMj|Un{_gcvB*Ld$1}+ngGs!K#%MbKg}Lc5PLo*nAgz11 z?-|`are~~mqU=Rbp?4DN(=j3S1K#d3y5GNoy7_0?H~VltPvY8Eb-t7M^wZ;XzL>;& z9vlb5li166+KNLZywF$z*1oX|Q zPq43%AJTWmw|{<^7%}7B*Oq|cDeJZ7J7x1_DMO5yvZ+5k1BNG_mx%8rbS{yT`o2f?ZBeLa|M)8DEOKPG zOctr0{f7osu*j{;vsk2h_OB>PQ~X0~=MDeeBK>!nJRKI69A%L+-rZx8y9w)N3w6~X z{wwafamnkZYu8@ZDfTPI7=#sLEay{&+mEh1pKOSq@eA3(@QR7Cs`FhjM?*g&K&+T; z{W!Ma72{>%%nh$K?OY-FYq4TZjpqm?04aBoo&c^zteA_x{ERN*6{EDN4@}sUNU>s^ z-_Q3$`mUH3OTHtDN&|*hjF++L6}?KcNFqH>zJP-K zu)utl*|*~+Q7vMb4K2-`!;8hnKCE=}4voGi^$^12(@WDg*Gt7mXyuudMH#~auF_xD z<{&5mle^{`3>x%|gI7O7sPZ>M}>k$DksVEOOs(IW5wE2g{T9exueFdGRg>cVBS_V}0)VG!*|P?r^}NuhS*Cp#`qfd`ro=)&8d??%FIO*P zGo`hAKf%3-g?@XAccJ?y<-Us8J%C8D&>uJ9@!`4bpOm&^ed-Urh!hJw#ihe&?MI~V zLhn~DH8EnLr|VS>3@>!AHQ$9^dfE@fh=rcDMg=gu(7lXJujs8_FD6nf^h!h7S^&~+ zp|46hjA{`JeOB#Pu+Ix!ZGUGiZ0ce^-7t%D+5n_HD(AOhEQNPC{&*g2@*20XiQ`kf zlTZKe^Am(8q?e|@NK}xIP&1sfX^!}bxh3+&+y4>7D?`6Nq$4WcfI{tDF4z3ZA`ecu zXpu_iV&t5S5P)qO$?`6;NTqWz;y*#>iq=xgEmG-R4Aa@yA|Ga4Xpu_iVx+G5#6ud6 z8yv245BVP&X;6()H4wjw>&)7*Iosr}hg&*M!{bdQJu^C1OD=~UQC*^Xc5Or2VQ1!0 zm3{Q#jD}Nk{^K28W6_?ngovN-P83HA*eUI`s`GV9=V#p_KscqJrrrX>PRYx78jC}c zgP=%zGm*k6T}gjhK}tQPC#a6?MmVLrcZz~!*P^tkZ(W{=Na2){6k6+t^mR&e(-tO1 zIHlApLcp+7@>=tCO0_DlAx1c*94SVCVb|hiY@$xQ_!YMUvonArOIi+Lc{-Iig zQ`%K}8ERqIqPBmz=5Qi~Q#$?KMg=L4%0F8WO$w*HA`uf64=V}upd|~^+lfbYq^jh=vg%jswCPw(eST|4GDgeEVU9apa zy@E*L3ulb}9#8<%#uplCa~`2u*cTchd$Xe!_JvCOMxiJyRrZBO7V{?sDUFKJ^d;g4 z_Ju~Riw=-qp-|iG8-v)4eWB4RTN4E-+njoSDv`n$j+px!NcM$lo4dX|NF?U8X3QMQ zo;v`U8#Oiq|s`3SsdYnqp-0(#M$vnvw`=dT$Viw&oWbvJ5PdQl_A zh)oumxBxa-L8`rI`%L{UvU#(l7OD246^k6Q$P#yESftvEmM#HVM_gyY`!N=&_M-Ks zt+UALJ2zXTjTeosaEkb=RbDX zDD+HLbv|BOyE-bC0O7TdEaWT!URz>p{FC+|`vxLK1bZi5Yl7I{+mKR6=_%{IBa*$g z_OwU`knp`Wq`XtiY(0)h;kDDg!}R@_^!3_YXBX2^@p4*=5HY zi&XCvGlwpY3* z4GUwECldA;nr8Y8{wwYt6Dg^;p1brAZ}ax<&d<99lO*Ufu-(MD!PzxG9IN=5@GWm0 zyxp|0n&7+L{4xn{LToo%BlspcZ#Q1X#<6M_!V&6=?dDX{f9T4^cH^Iv`b^hHz*UIt z=JN6dAbGp-Ps-cP(9&gz6x)sSd%nVtNZ;+I?WVfKi0vjp^-QqF+l|+n?{*ejn%h>daUSnVnBE@!-cU?kQ3qaa!H#6SBu?fLsWVei{g*OegeY#UZBzZ9! z)OqojDM)!#4*fldAhF%-&W&{^wi~t0KmHj=q}XnbW@hz)H!A<6Z1Yh#;yT`L^qZ%9 z!zOPU{z+*jAax>=mzDms9?S(IC7VXZ^;?M)+fAyLV?gqDf^5-2KC^(J0!Z=!l{- z3fvFVIq2_!-{2c`^t|2|MSm1Dhll8cQ4B@Fnb1i5HX229b|<16wjO}Skc3{E(W}gT zK0=dEKSHbYrnH6f^Jsb=iCnefG(pLjT+j)5xIUH&DcSN_%Et0`xLeCHwXr1AEsr(r zInAL_(xWmTtf9{FlF12mms$8Xy?@2w2{5VNd++@4t3}=z_s}BMd++|M-&^F~tf3aE z-g|df%W082zU9&2)~fg3ldTR|oeDEOWDtArJ_DMbXzlJF+gYUlwIQ#ng9U%I$o(C7l271?f?b=o zHGMMw6?fPE#Luox4{*kIqepq8V|#bE5c?capX{?~cki`|nj(JYKIA39oAx5BI^RwE zYNE0Ph)w%&O$?LRdcBOz_C&W{;Y!4&eLJ;x)AmnFT}EnR6(Yr^{pdzZ*yOF(KPfps z{hP*{h!mT4^1eCzkUlG2@78}iF=EqBGlOsb^QP^!=DTSZbzzZ;O*?Z8vH`L6dKsHu z(HpIRJ|;HpQp@ToNV`q@e`oJfEn?IDb{vliZ`x}6>sO;+#iqTq3tY9>?){VUs2qO` zDMxJD2mZ%5ZF%eUPs*cmE#=QdicR~}%Fkgl04dx2`_tw`icR~^0pmgPrmeJTBwo3d zNU>?Ziuz1JN;Zugg%%SjHtoo!D?whRLicY|CQF{hY!|y#z8#YRagOMplzPah+8!%Y zY}%it;Egc=Dcfv1^fMyGrd_A(6419KEvDKFr1Y% z0zRwQ*wSJNG2~Op

      R!HwB4_vm!Ze;Vk`E$?(q)yAm$~g}qrh!}4z!ty$=eeHKb} zoNsoY>PW#2Ig#)OK7!?TmKxSNV3@LZUKu(sC6l{OL3q-Cqe2Q(+4S)zQYqgL&*auEQXOsl`5mGv(L=Wz zAbE#^vkh zJ)|LS0rE_+iNxiZaHR=cp6H>A$yupKYi*W+Ox`Vk?L?3_`!(a%^5jLFl9jgOT>Mwu zI3=f_IEB@Pu2Cd0RPNc4?nBn2HzakWw}4TN?2qk37Bd$@7V|BiDqO*!6t}5W;%8y{ zj;Mo&K-`5vV|+uF>lcR8|BI02SeI*HSZDAu@;Z`SqV`vcG(?J!<*qYEg+ms#{T=uI zN2CZ@)~|LbNO@Gw)oDYd2w9Gedk^v}Ds;8Yd)M+1DMFS%61WtkZ1df#eME|o zAUR}F+N3*s>xtwAW@sgfDM-ntk^hr|M2e6l`)&@+IArl}Qzk1^MSvyNTG1sL&^a7< z_$Q^cV$`k+y;g)QRg8EFQnuM{O+_L_$kOZ<)~5(r)HZwkUY$r0vUG|@-v%P3kmWf} zeTm{V3f72ugT)o3nFCkGI3U<6|xwqCBwhon?jX{kmX=Oj>_G?C2y+=um$39#;EWW(NWG}23kuN8)87IDtG+Z^@rPUF844z>RB;%2HriwMX4 zGR-t+9p@uh;?K#iy$Bd4z3y_D&Pxr_c#*R2`}O|EQcrD#Ij4uFp4nNJq9Qyn1+4)L~NPD^D-m*9kOhuD^klM{ZIQiq&~?a)9y{hBu{(t0D5V9)#bn9 z23RTN=eqjDP#i^12y`J8h;T(TrPuWlfW#v<)C&5U+ou8QKs05Pv8wZprml|aM`w#@ z>S$;MFo>okMs^m`4x!!OIG9KgP2G8QN!<|mr^6Ox9Art(zfxD+vw#MtzT9u@ODks_L^ z(hNH;M^iSWT{N{~-8HI3L{l?={|U7qnzE@y8Wnx}+rmVOXlh+0K!HekRL-{khe#1k z9i1}`B%-MxY~D@!kVp|t{hoHIf|PB(S-g!%5luab#$@GaN^R3fTDAm{yqfg)&G|YJ zhuM&lO(WlqX+(->DqAC-4~V9MAj{pr1|y=WB4tJp#L<)uDUFKp#a}at6wy@WB=Z%d z+}hTTJVc6Us?otIAgkH8R<_wSKcYqvO-1kiLqSSmKqb`A)156r&@+%y8|)72;J11x z;9!hKD4L*XilRA+mMEf7v_Zl9X?ylTqVInEW)-zeL{ozYkD+ronv(j_XB8Vi41P)s z`BHK@<7U1BgP=xY;;cw-G$r0LAPk=viAqE?b)ZtipbQ@^H-H!sO&$K~gu<}YjbbAg zhA#~&N|o@gWSm)yO^`EwyVgs6b@MT{6_K}JD||~qN;4-;2xb(@MI;9`b~bUmwAZjX zpm9zzjD%S;V{&EYBOf9-SRAv-BGnPx<_Wbtq`BeDA`clv1UD@DhD8p}gpHnO zg07C>2JSv$k^LO$EK(i8jm)3LB8T?H#1l5v5!{F!k1TS?IL-?h_l8fhi;9*{ z<90#>Gn6*<(fjieDFVLmM%>zuNT01j?~-K=F(Tkg{s=pg2>86#d;`7$SNuxOGfKoD z3=*NDe^R#Du;nv?M8H=g1Hvm2@cAcYn{6AHBvJ%?&AP5ukW!>FmrgYhlo|_Au!moQ z-ajND|4BkPni6$&7Yy#C7IA?N|~eIwWISRnHjO;F?TwePu)hJ z62s50v4in`aG7!5J2GbTC+#h~$==bpmJ2Ycj!uuBJ#3LbPpxf{>gaS)+Z-18zYM(M z*rqx%(v9TD@sW0DsH z;##WI@560L5ZAWu*uH)5y!4@#-Frp#>C>Mf?A`X^t)BS!-iZZio;voQS(0qDRq-xWG2!%4sZ2D^N~Ud zJyUIS+jQLC5#epgvK#%7K3+_pvlQox@V0DAZYS%RUTePLZS$?z2Ss>WZ9`tzVS&fX z*!9YYp-|{Vc-t<;GX-fE-ky#eMzx6WcGqS^Un0C!+rQD}43Q$dJ-^LVkn*Vf_Y-D; z2yb8ZJPneARHaQL+0yewa%yFme?xN#L`pV|?7QKNIJ`B|4`EH5LnXD%ZZqJnIlMJ; z_e}+x0Z7^A__jzu64OgFMt)NgBs$peZ&N1!_v}A{M2I%^Jcng&dr}TH*NjGxBEs9n zh2gG6c&oO#|LS@oMR>b?VKR`cGWsWFnEx?dH%sfyIJ~uKy+l?WWj&E*Ry>MyIS?t$R&(&|*<_Q$ zTeHpk6hw;fR&8_C4A>Om?eO}Q6{KwQYTJoKitzT#k99#}By84}G+WKPhw2e2q|93h zmnlferXyj>6-0`d_}L&1OU}f#=`))gp?41vlb&9h`R<3kI32;BT|2$Asfc%I9I0mQ zAf7{NhpXu);QbrMk>^}TZvIuOqi_-|?F?v$Bjde4`3O00XC(c-OnP6%dA@m>$4i?3 z=*W2xS83+*k*M8dUzUu|kzxml`Edm<8<8VNQyy#aYLLZ&0j)jSKbWA*Ode?66V}R7 zA*B!U@{@+gJoqyftsoa a(%5au#u&uQKD7g}6>-7T_qpGq;Cyq^PvsB9&Qyvn)B04>p~t zKEt9BHkDa`quKH+9@0^?J?1Wx>MX#KV%I$nX+E8>&mxss0QK!Pi@cw@jYTT607udR z-7WIb=Ws}(waP5Ok#7(JMjjQ1>vTg8sm=l%?rM`fq~ev6!LtuLDy?-=kGvEH26YsHbf1l+YC!&+b;Hp{X(T0(j=dfoFe{?TXM(A!~R=>z10`7lELo{v7> z|0e`;;%E9(+=t`@!t{O!gKq-yd!M}ohy-HaHUt5jKuC<-Pm;^mZsq=#NTH8keY;jc zO8ulK9*?b!69{@=4cjb@&hoa?#wI;;f>r9Em!>CKeHS)AB7HUsz2~Z#bh=0&QtkL3 z7$gvqHQxlH*k1_vL;{g%II>SpASA}FgAXXc=Hxr1IN99c72Skbl;z*S-Adx@>am{zfM-s^ignnUZHw7u% ze485Hh!Y6?$)#E#kp`%3(kBQmCXy2f`W(b#3R1F34@68RQX~*rJ7P!U1j5FqOqOr* zgh-J<6e%;5NKON6NNKIm0}(Tbbkj>SD$VVnAZ44a2eu+eBoK{D9Ri62A_$u?qe~Gf z5{UMh5Mcx&rN|e}GdrQ^f&$}dc1OW+Lo9wn3S@H7G625~LNNrzFciFFkHT-5Mdnx( zU$g5IeRtSBjanuWh#@z#&|yv>q-*k7#l}7Z0w`h;&6rSk5f~&85))@dplu?7m?#-O z{~KaPP9Th5ekm7};ol}NBSz@sCq`NcgpFaT8>dKy@BDC*D&YjexZG(03?qTCsYISR z4?o*Yq|nFj$D*SHkS5Db+2+{8 zONbN+#Go|=LGmn7dUkVijt)eM1Y$zWE(Iyu++O)Dks^VZbG0bQGgL^e^_flP=H%!X zkwC1tmjuj(xQxwg62T5nWAo6~zEp|OK~ams{ktv2QI>oicUG{Xhl?;eRdiLgG3WsZN=uYxym5^6noz zq>XctR$0igJn#fOhe8hQIL;(5ZzNmoC+}=tE)dE2m%jYR z{;L?t6zZR{7Y@~Wy(E7a{gu9Es#J#N;b^|qY&wF{zY$|J^+&Q zFQrX0bAdiY^6H}Z_OQ(Wq-?WHKS_n2VdDZjQtiPZ*kz%b?+JVjy`Iox2 zQL7NZbN*#EZgNLK%B_vvx0*=Kzsyc=u(66PN^Nsk^c^BO|1$dxY^)%qQ11$zYF*W|N`%@YgJdz^on|C@<0LF8XvCXS!t01!8D91h9wt%RGX63)NO^H0kLW%yb> zxDL+0%!>uLDGYnN(GeyYe&%>Xm2m!L-pj3_lHaJXnRAlIGv6M=s^t93e6a_fAP_0d z97pGg^NHmA%TcTWVr`K{+4PvVwT}K{ZV}1(m!rqrh6+-$>C`6AAd>Sh$CF*~>>~eC z+H@w4KZNY1~U85ZI)ME>Qq=`)+0RjZsLCOy40XW`|{Tp-YH zJiN0hrMH`$UB`Y)Jm+7|#%U3+s0~MBOho?WY&oeam;i>Q*(AQRk$sPI@p$Z?oPRlo zEy#?9b0q4$;y7!;+vJcekGm7e`ImEb-}Zh;pS{p|xjIrt&cB>nwwhqDa_ss_vX->; zAR;r~i|o}ulSQg?zKPGUc?+BUGT>oT(OPxRxA7_{K~C@6&LY)0-&Qxa{14ZeX0b)8 zbG}1Qc6dnV#?dJ)Ql0bN8T^}vbo{zziiZp$=bIPxk428oW!VfO=bK!4v_%d&Qp>Wb z&iSUS$!U>;%Z{^1bYVT2LlrIZ)`C|S zsm}Sn--UEXw03@N2=LrmyPOZlrKRSq(GNQn&`dLYw~Uc0V2(-u&581 zthg{QBYPGp0MXlrAfFd$Uh5VJ)&h}IN9hYoenq56^I|$gf<&69wrLbg(~wBIZff$1 zb=UonK3lqxJ``K4Nb@$#>JFxSTx&jCn|>$jFk(cSw`()osS=m5=@lci2zn)yUYdTt zQ5#qbKz`WTIE;{b$f#a%7*!zBypqk2qn5V8*%zNK8jom=zHtUhXCP9xDL(Z>qD;ra5jfkJxu0An%8S9k7ocb41&|VAZEhm?nQ~@wPZ|wvr|FJ zHm~kkMw)xxOWm)4U*T z9xvI6NKW(2Bg1zqNXe!nZ*r*pBF)P%ss>1mgxaQ~NWbkwrlptWD6lu7f|PAGpHY(_ zPV*e)@*+CnY)i7~Gn*U@XJeaA&(=P_g}Khzmc-c1rpex+adb}6f-2xN&k#^-_~BByL1xMmGO-b!;gg zlRkT)W7SRUCYhM|_SzjVNY;X|cB1lAqOjyN$J(NJ#yAiuT`U%eW1iIRTMMA$bDHP4 zSo;KOS|3y!T(_PbAd=HO$DJ4P{E$9ro-@;nUc_Xhm*#X9Ujk-xP}ZEet|5|Q?cbSw z-Zu&oyR)N~_cAH*FGV=E3eDLh!54f4olnk#K7TvVO~H`|kvQc7=@>SGg|!t_dk_g? zk1SZ|g6#6VD4N8iIzc?$_oPLh;4EH{>I89Vjj1d3(|kkDKGXF6OsOi)-J6v z!XniP;;~L}qJlhLDHf zEzam6gGdm!epSgLzpsd;!hIV=g1G)0_%hK$YpP-r2vVIOuFEpYB3E@jXOZdz@#4<} zez1AALWGA5B0=2n1PfcVc3qZ{7O6}Sohj>B7Zrv*mVRh zOxh)g-jyAi=J+EI8JaR_Ig9kK%t z6s6M+;;hJj#mz_gU1Oe4L&)1Rx@$~qFrO*vtoU&@YIN_loEk2ECjW>564~glmQ|l@ z^urg%b2h5&9+M9YXQN&w&c5vJVERx5glGnvyR@T_f|R;Rk9TVrQJjrxcj6(u71^lL zrata(WDyQ}(HFy*SZW`WK9PqW(*gUo$VQX*%?_qK6%Ma8pB-2)*bt1!Mx_r$kQkd@ z(d#|J`U<6&rWgAQJDJEvz1C#%!w&p$Hmc9R+n*{3<60(W!i^n~Q~Iw(%6s&6yP!y5 z3)A!^A%_*DJSxW`4iUuJsJ?&ycOW^ZRNK7rJ>rA}Z1ZFV-pc}zvdw4Zo)9G-`ux*u z0Gk`AQ1>%^$rk#UR}$SKMq(6*lx!MVJGLTHWTWX)eF~DZQUBK|lf_>nP~eEr$a85s zks_z`PfDX=ROyc}Lu8|67GU}XB4wLjPQsSY*(lw9#wIGVQMJwJ-RFtqY}9B`eXxR* zVnN8{10urqekarCZ{a!EiR}W#n~Lf>#u0qwgfc$J5uK zN;n%ee*9)>P=*hGb%YqsMvb3Nq*WO9cB50e&1zg4gbk3hQR7T*2P)xg)TZ@PlW+EG zOeD4y&A3(=BM^v`W)6J{*8d0+*{HF)1(6~fRobMFg8Yd{k&UJ+!Z~Fo!fjTiY;(vs zcmd8v&0fuLogy1m+mt^TYGi(dUx7&3=9*mN$tGu`=A=#7heS5&wdpgP=xtW9#Berh z&TSY2h9|t2@jsiKZtu{TKV&*Xm2fs{uD@M8D8pN?Hzy{NUYhy+{JRRn(rij989tY^ zHSyS?H1nqiFf4LPo7Q_tN9IHO2;ywi{G(DuKcvrIX#RcuFfp8snpfLS22+*_o7o_F zJx6M{m5rLO=EN#U>0(pUsZQxOE8R5zhT4E#MswtB&h6%GRC&d&?qfR>B(l*`E+ktb zkM)v1*{GvW#VBI3v9)HOt^~80iXg6dNL~b;*_rJBK9PcyX0c;l6s4RW?u2~xvL4Lk zv9~Fc8=mYXl2cg6%E7D?VhgrwEe@Sv_lRWJiIwKei~?bw6XB8Lgm=ccMx`i1wdcka zxq2_(!AB^%`1=mcy_13NpeA2f{TM-cm`uLXjoNcjAtlHS_?}E-$y)ZNi0$$+lcB{m zk2QQwN#Jzcm9G)TD<6}&lWv4H-rAFK9dg8tHc0*FsetGx5%a0pbd%ZRHozM ztM3%|km1X>G_pu#Iv%m}!VnJ`vF+1#7O70fU60B`OBdsLe_SmOsZPgTtJffg737MJ zQ!P^Yw#LLS-@~CZnfS%5f)=Sv$6cG><@b=T4M)ALRi@*vYBvzmh}Krl-oay2osPQ_ zSE*@{2^?oFQkjmsw%ng%ksEhxx5yXDIn<-i9~RlQ(rXW?PRElT?Y`7QCOy2>ODfZG zcdE&qJfu6>`8^(+>U5k|7BVQ&xAPaVe}hl3@r;sB2!GN43lACobnhaz$(=)krBC;p z$fM#@RtJ9AM(IDbR46j_^BnTc+s*IReM#2%NAFSb4bDfL>1^U*{5&lD$B4=V=z!?K zUF$Bg#KehUxF#2$eRn+ee}jL&(FOB{GkzOV>J=kxPUNb|C`59;cb&qsBOImzX#!l2;V+cIRmCvZ7BXK$mddZr(W$jX`brVYAD` zaNcg-PmRt9WLWCPabCj?qfS+-g!6Xu^*BUZoPFE1ULxbw>_Q~x?T(Q6kU#>F(#&zx zP6n-r^LEPD4id?Edk{7o&dx<7=k1PqjlNfqvdt|SutLOL5 zo{gE+(^zjn-mbP5a%@R0qOvo2BnnfCGkzOVn#CaxT166-gUPec;W9aI4}$!!9mt$a zzIt{DBnHWbly;@ikk%E5!b;FW%}^{37Lc)Nt`9laE~;HpCgfQujkYVAT#ko~T6h3WVp6RY zya;HRZ`JY@LZ-lj#WwSwQ5-t>?WzqvS=;npg(0=KKK)mnG_Rr@?PgU|~0KOf<- z>Ds#~zC|jv0$0eHrxxjWmBu2~TEVfM-cdPXSfgV1C1u{_>1x~6uxv)<{KjK52(2J% z$ZLztSo3p>RBHvleua%v%%P*lds?JgEBHFIw}(bQcYDYnw1T@Auye7^q&LbzB!_XyA#+P@Upg3u7WjNDt&-lg3*^q45jV@MKD0|4LVxV7HeK1OI{6j&?Hk;kLPGmT}G^5r<2S`>Q)HXYW zWB(RU4YbPESV2m$B|E++biNap=zNX>X|MA&iZ>|Up?FV42sD@w0|nX^5`rQO1-9Uj zgeVfDkZ!jcJ8w>*ma+O^(D(h(VIcx|ugPZ>8(R-lB!<-oV^sfDU?xyuH&b{;L4633 zZnql8mLsKR^}(R8G7rkI_`-GZ)WCsV*s22=_I6`PO7DJeTueTb42!1*P95riN`9ll zuJsamBVs3!De0vdS58(^kkZUClm7M%L99L)@6GB&3iZL;%QkDvOmlKQk*q$LDJK?F zkh0C*8!$p?=%tyRMq=QF`k=Ns>@r%KmdU}Hpl$^sWt&U$bs>t?2XlPqB1gh>gFgvq|aVxJ{X35FcUN9jgw%? zQX%!P%{+?p5uuNZZ&Hxb#TKAbLkdal&gX1S_E~*!WUhsUFVqL+6}t*#>_B8zw4UA@ z0jKma>7zb4Vyc#*(^-9>cMM|_6dHoknxpseTtu?^fX@k1kkXhs=o6EOWc9%@blPMh zh5F#%rcAEtjC-9q>7_XqEWyeV>Vtn$ir^fZ8b%R>7Hf`mS%xY|X?)nRmZI}R;6p<& z9YV@`hl^72j#OuERO~9c{VzH!)CXmgk{`@+pCDErT-BR!dXo#dm-JB|T+RMjMGOK% z&DG#vj#)m9%h*g%SDP0n3ChQ0tM3~F3P4Jo?uspsMZ}VYtMj!MAd%uq?Tlj+hwexn z^mXQ!gco4LBeS33BZ%3~QXI58pyJV@<>z!>K_IsYOK)ipRh$gDkS|TdZS2 zsuhpQyEb}AcLmdFk!r=`!uk3h(sef7a*I?d9`1zhh91%#+5tI&XsufDI5)C_hjg7O z3r$UsYQ^LCvDj<5Z^O^+9$=Ab#pA^%B|T)sgFMXP&|JB zVuFWsot<{wBGrmV(qqLeGD*9c7O7S|Ze$y1kymb8Ga(4YV_+G?Z(`o|Nsn-nMR9;e#8@{q3Ms}Si4QmuGoe!ap&Mr0`S)ge!|J((9;Y2PnBt_v{q#drZ1#{I-)xc7PN*>YHgR8pD6Z)k@MqEAhO?zhk%V zy<@vZ$99Nmo3~38eYUm*e28AC&W|6~aE$r*O%`Uu=MZhg&x+ItDp)QF8Dv%GE0;XF zfj~rO==VOXYT{`WiIFc`+HAEqW4C%8?f9P$e zjZJ-JR_fCaa!HPf+}e*wpU_wzH}H32gj|w$T|8KWTq0eePl%}3ypD8Q$R)*k!-=t6 zA~AL?jJeu?NFkThkA9~hKZGD0j>|oCEaD*55=JjgUstIWYJpr5g#CvZ7Z4=mlC!N} zC`idBJ^X^yIzGKL!!=unE|8E*)TEhy&NCueE-@3lokkGLB{rnA zR?IvjmJrEu34P)*g7!e9)LOIb?BYbSTw)eE4JnG{k|1n;e)uyYF{YYXvECg8DFwqL z>C}+XD0uvNn}JLa0*?}cyF4KX=R>BVn2zE*6thswK`{>nbf^%#&n$#}sdVerT<{e_ zp(Nb0W=T*D%O%n^`K)4dc7IZxKRm3_=?%*U+#H+P$y14=`jzbb#Gr{UdSki7T(Z4b zP=?p!noNe1b7NQZxD6(NVW}I}N{08;M<6C1*4W};%>{Cabj3FQ#60jjHZ+z?%>9Ym z!+Zczo;l*XTUahJZ{#~qB+Dggn-1;4ahXzESK1| z(>t4Xdk57q=Uo%3gyj;)#AkzoGCXs~4Pqkcr8%ao$)PYT&8B^l;q7g4wHdgQWhI_d zB`lZNwcblQ6J;(;6w4)!UFnYcA$|5j$L|l26=q^<2VNco!}+nz%9E@ax91R*naL|@ zBNU``v4`o@kRwt}pVVwgwXj^`jHoaIHLb@v$~L%5%5P2W8FK;aX23SuSx#XXU;MKuWXN`BfI|pDdR+d+g{;=2$MVxk8zoU1|Z5 zESET^9H{~lcgk!?X;*SCEQTn9U>AB$8=G_T{sEsNGZuf4`1)e=p<2UxwrX6_Z7Jo0s_ zC7Ksot9nS+)6wlLn`(*XO$JO}wn>lnbE?ZWl@d*oPr?utGMOY*4~|KgR7*5pe2TqY zTxYfatnmy&qIn&^nTK>eKa9!CGeK8NG=?~}m z-@r1vM|F$*E-$+(^iU8IP4n*8EV9XG?>#nczA0Q@q+!P|dq}rqt~H0$pC{qkKe&>I zbnQNy$73@HiKfz@n>}Q*a@*K1<2r+QD5d?eX&%zuW)9*Y?%NqkY;StpL%O%5YUm+t+_g-W zE$Ssp4T)ruU1w5C&3BXQ^t;5(HhfMZGHS2jnA4!(#ChOlZ7gScglXEs^oRmj!3j-a zRp+bV+=;3@tV>^g)&*I@_GgNAu8ewLGGb#)4!z}go3l|bO>sJf)j-OBUMHdiJh4y*y5@R zQnq=&Q4~R};OJKuP6CNRRogTiH@+Z}6&(H1e|#|kNXe#={w4ZYC^+ta5i7F}6NJqY zccv4GC88Oblhs#{vdt!oFyj+5Sz{*j3081yY|3Q!`+pF{L8{SeJ}!}U7#mWGm5mW| zeUe^YFEi}k#R0Lsj(VntIvVvpGZZ=RsdgJp@hAgqop)# zhSuv%=L-eLSlvuvSn9?qlHt^yv95%I6Fvp00_!k#t(V9Q?eh^S6rA*#w<}0#=9rB- zqv1lqDVq^d2rD>2*lf{$7Lh{1X__UYf|P9@+B$$pR&dN8=EMVukqE-(uiwTJ$qJ5n zw8az!DcgL05=jj-4UOKEg+XNnN3!WNo6INKadqN>m)kwDpjg3?7@OJD$U8I+=hPpl z5>{}`*AXj&G3?M{yAl&gFU@>&`M$!iG@F`AhO;ily%S7jjlMCq0ad~Zj$P{|a(Itu zf`o!Y-{k6t^w|p?)nD8rMkqLi=3D`TEI9~keG42VGBdq2`tbOp3R1e*DAX^4AoduJ zDTN+WC0V$pF_XSWP1su1ZE)@RX)aM&nVfMs)DP*S;5g2-D@EtCfNMqWd+B^rbIej{qT5BPLR&f3FsEbilACc zpI%ptpj=EQjYM1260B z3^Xe^uD3OiG_ek&w&_kV3)5IAIH6bjD@fU9>aayb3I!)g!XZSmf)j+z$O)5)6!)0Z z?XRUEWt+uIt|YP$y)<`@%Rhp|aN60#q2%6);I4CTKaqIsKyz1Fot2Noqd(44bQ)}ix?f^ zvB>xZF$D#wR*fn(LL9``=`Npiu0<+UBYGsLu0@75TxOAeQ%d=9`iO|e6+L7`!s_EK zQmq=5uCdlbCMmWA3r1Y0S~Y5S1=CMlXPeBUJ)~MSqQ3ptBIE6a%=dHdCLN#i7bexAw){5@ z#%htOFO0Mpdo{{2>Eq{#jG8x%4nH}Q6&K-U zJk3URQsAIneY=V%p+;S-hx|dPQT|D(&-Ab%*N7Bq)a}%)^>D`OpOkFs6V~h?Qm9dh z=I4gZk4T@)L+>*8GBHkiX?jHE3Sd}`@>=tW!1aR18_?-OjY{(gOo#>NWo&vyuOI!E zNTEg*Z*yKjeu(fmcb0o-*_WrN7NJH>sgGbss8MSB+tOnWV8^Eid7su(kh0D5pZ!7* zvSv*`-Y*&?1Q+#8(C=MC{GEWwKmNhJpFpH+^S}LAJ*-CQe}CEtB%UWy+cZ+O96=;6 zD}z2)P(eyIje_@Mh!kp6uCc2@UbVL=lT{4NA{V_hqr{!51PL`tIVwi|H#G?oYSiZi z5YGi7Wt$xzZ6`9EZMMpW@f2#5+Gg)Gdx#QhRM-6Z6r_}E?4eUb5qO5~M{xkfArwEO z_yxr=6u3_uipRJ^d87Xgznw#I0mUCEE}^)BLVN(9=(|I+T2RXng=xm<4iR)%h(g|L z@>#{kz5(b1p+-%9vmFepQC=p_isTi=YSb-ue!}pD&#`SMW5dVO*9^+=Z>f9G`K(46 zC(r+*Ff4WBpOWFb1u%0`u;D9B5~33BE}Pa%CnV~(BrBtwK z#!tV4NTEh4ZJOEJ)F%jfjYi+d+CxFgHtFk82oh@4fL~jJ#7L;uvnjr0MW|6FK4JOP4JI!;{v_*vzKa-k~w~eTNSI zge%!zMGwmGp8D9pBAMA4fz2q8VQDtKlMG+V2&1eJD&q?uZW0$JW}fhtml}N}W!hw@{fVtbfhb^U?^A zyMnVhqC_Wx@-sPP*lqnm!b1isT93-NbAo_OaYi#m`ncQAxqk@!e{?Z=Hk0mVEPo1~H9MU*Dn>e&pntZpf zqq)#oH5a`_iH}e`oUjV{`i6l%W|-c@bd8|mOfDObp$UU?4MG8X@*VOZK^~s_okgk@ zuziJgdPw)Qc*wtmO|=46zw{A{%u;xnMXD9BugfED=GMBKC*Nz4Y6YxT`aTw!;qM$4 zsaC)m=U?d|BXZ<`8YQk%t$@wgeAPoHY1FEnMXD9BtwW$=iR&D3VxNZ$LIJCD4{DSk zGo6fQk!l5OYH#c{VkWfuzJW!m6|lAu)^)l+ZN1nc)e6|lCA%z}KY!!!kU=P5yYBpK zkrS>gu}HN7*6s@ScF{w{Y8J9c_N2lyU(#l^6U#j0js(Ff<=DvzfUYut$-~!2ep`OM)WF(Jc(_p z6)<;#42ZaxbX{$RAW@KaRo59FxoVwN$|7Sv``bgR6)^fxbUFoDV|6UdyQY2Bv6J(DB0#8PJ6ARalNHVMGV+X*0vYXMy{SZESJ1Tc8L|BZ zBBfr@9S5<0nM~3bBY`X(luiBXPL+rf>R8xIf22<)q_=+#4}k1c(-V)M1#9KwTJy;W z^qkL|)9E41q==phrb=AKrdRYD4$Nwyj^#I?@&_V6M4X(<%RRKgGcRgO^5MZ-nGB5GmVipJ^aL@a>w>^kr|5)$Cg<+w8R!`Lj^R zI@fQmAf?==E$Zheqyv8IgrW-yj@`QBx1K0sQ9ug~!~6}yQ!-(LPz*sa3e!th00knYnL{5Ko|ec|^wLb{!#{{*bxduO6fq=ILLH0j2Te2(Dcc+}4s%?n zV?A%7wXAUkVe_lj@H}X-W{%kLOhL*vS8r}cP&y{3hExK1h6>51&upTvG#WtX3w3N> z#cNw&+3?T#c^8iZL%ZV6zohw9s8pa9LdL|&t7OgZ-PA@v9Ly8X@ty=)v+L~ zrHuxenaS4?kh21j(#1mE30oz#yXciKsTQG*<=$8yHK96n8(h=cOeYcab27c>f z(pMcDbfi9=F4VDB7Y>2h9F#T3s8VZ*%+A(^y(yv~rCID)T4NkhIhdU2h#->HF`Fxt z$=z@MM^sKGx6HfivK7B=_YRk9)2FCd zsAF?lZl}YnaoJpqv}vU{@&FDi4=%>F_4jZ;q^~;mOM8l>KRl}?)D+gZ)Yj{#p$8&moA1A^L8MT}UM_)n z!|IsYraR;*0*HcWt=lY${XGyV*>q=We3l^WfSNlZJyHr*$AYk#v;IE>6=pJ91OkCT zq-?W9PHdE{j=A&yT#rar$AYj~Ze9$LMcHQQn?ET?*=GIHCx|M>WR=y~h~yN{&L)mG z_fB~Ccb`8cv;^bdUYN;85Q9_aDV|BY^Xq&%uOvv<%?a62@mVU=iX07OltunGm=_|G zYDMl?)IJaC{$-;a&F>bB9Lxo=~Qmx3%uZoCUkh3SYwn()i7gYuRO^_}4 zJJ&=HsTH}-)yjCti1y!3v23apxwT`kyRywBE04umq*{?XdVijWbRXWa(?bTK$hH02 zvgvMh(y|%EI~i9tdgHO_S~~v=%cfe9>zlK;hjjPqj!2LDR{dd9?y!a%EYkT6Ck2>& zK`3&kF2bE~-@1+$OzW{3#5)=Lzu4{}-F-?Wut>Ec_gOW>-(n7x{Fb*bv^EGut`&bS z1Cz;{owsZT@l4u<=RGW&XE*-iX>AaST&t5^EVB88mlmm3je8GYh23By6yoKSZ; zK|;$L-617x1|YqeT0A%EM>ZKRDT?GMfXAa}zJ|oZ<{K|Pibxdj81XWrV7CE>94{w| z+$f-0#rqUR0ro+n@9rhOPAwB!-n{v5=rC(}(lz<4V&i5%cpLa(%~-YK92jVM5);Qy z@rr_$7q5t9_|=PP#3$oQ{;GpVSk#99KCp?-7h2xqshHe>3`^Z8jlUUksR~ts6h$-s zO^UlgtjO85-rHm|(S=R~r37ilpZ>RklxB`uExNg6k6W4#xp^liEGnm zHkrpub|oe~w^Mu`8EbiV?exy3>eA3$Z99W15L({Zd03ii!Zo4$|?zmLT3lz}UG@TwH?tjO85-b*^_47fxTYk3a+53KQzNuRyYk@gZ2@=UPi z2<<)%Oj-LTOS9fl`5^X$%uGh6U#lRci>;6P8%phtI-Hkk$-*@?oSg$TLCaHLF}?3{ z7EwaWi;lO{59zDrEop%noQ`<#?j8hq ztjMXYxn2*SKu|s=pVwZkAf--shaJC06l-~Itqb-BK5(0d< z4!q?Ou|gnHw)y4$tppWevR*CRgk&u*2%D{oAjB%lWQ##<6r^l3_FOljgqGL-7|TAn z2oJ*MiZLsREY3FjhhpPm70`y1ZEl%_jY|lCYnNI{unoziTgy~U=f4x-=!eA8`j7MY4?T}mRcMDwo~m5`=2(RbA5DdgpeVTzcb@OMdPsMg z+x;!lzo00S_safYk(cKVwMhShqD+2!0qb2{_^<&;aYSqV3yLzi_gC!Jg52~)VvF=I zD9YrBMuRP~cg+PB>0eNk$cXVLYkA0sp|wg|q<=wCB9mOqzSu)1`FSi>t+-DAf}%va zpDscGC$94*fATn!HiDu|j*b4zA_v^clMHrwDKZ3IP$bp8GNKo9AnM`JD0|08}9>7MiVe;(2; zwbtfMt}@wrt+mSB^*6uw*t8K8B{KP#s;fOVllT3dlPauF8$nSb-EXfW*b{yGum{p) z9u*rwQ6@*6*ldxp=ek&=e?d_qlO$hO!9zy;vX_%VwAMyYlt_2Etk^F^YYS}M?y+g} zCRd3JZ}8(-4;fyiPC^f9BPdFw`_%BX9@72O*xx*)ji4x#wMQW+7OgG+%_WOeK6&om zSLl#MZaTQ};z@!_Q8*Wc3X|MdyMn9(K4n)sQP6iK&G z6?a-2im$48t`MfW&d|Qk{s6=BfS2*?N;o8Ss&=jCRicEdc&XgK3R2omb$aJ3kqA08 z?e-M7E};!7ZR(?|za)k>MQU5ZB7uX~=<5r|fn-(D+fR1ae7WXGf`qDgqTNXaDcgKj?h%pLj_B(P zvknHydxO%Zk>CpMzi`x~zj!-aK}t61>kFq7nHV;W^h3C{ctTK`5At=&WbxPNTcM2Q zxdf*tR7G`bs~AwIg{oM3BWq&r;B0=GY7UV?RjgeXX_n9i)i$GdpCdAYUYgOO`Va*v z<&68#vY${KM1kBm-Vqc>Q6LYB_bZB1D9)fbivo9*;{A>SPpQPajDkBBB3itgUav@B zUpSE(B~-=UQ~svILfrFSlg}!quP-c147p9Zno<3+JqmHp%gCcvf>#u~V{wa14BC;4 zXNgb7mF%5|!)n8aX5r>ya%T2l#q11ZSn9?H(iLC$ybe{6f-5=kHX|zG{mZ8H5_xqG zk``7KjY|%A*+8T;Tj}cyM-$1aB7J>fB_f43sI+OOX#$TaRK=9Z-ziAhX1{?5q0`Vy zGrOEm0um!(v$mwor)1wq*0HFMA!mgoYIvdtyik=zSa@tZVjVe?E}n?AFNz7gUJ zVuY$V{S?-Q5ch2Q#ygwddWXi`oE)8tJVi5Co`>^N8{Tkc5uF~%%-U4QBm)_iX48L? z;a^iClo6`puE*$Qp$*!!-b*?%yd6p;0!__4Q|%K!q|aVRpL~bQ#NMEp=bsh@!>Xd% zT8c{R31U@|KH}hzg7jW&d?%e6KU8XW{w5u$rYvZKgFed+HLU3A#3KxiCRnb-LMpBTws8BmP*Oz%Ql_3b>%NCJL1R`ad9kOCMv8w2b zTDYG`p(?7cQ+!ZVLAKegPzMDm+nhYJHc^F`9D1i2$UmtF;yP!IxIz@NM9nq54mOcM zq-=Bfv!(>Gsz~qIg~Ji5qWU`J4{}?*CQL!fHupatMmAYhbZxo6gh-(cs%<{6y^hG@ z^wM01vqULK+2()G?-9hRBI(FWDFD>8N(z!(pP>=_c?ZG2+f*1b=Xp>IDRoIY~)AjV%=2=KC#I1-(0Xr z|MH_u{#$vcMZWEL%Od^Dk21OPubLLQtN@m`Xsv(wQ6_)yywD=gZhUT${^duRoISCn zMb2nG$RhpAj}jTNc;RFZ8S%fnw=L4Y{3wx0{<#(FA(Ol)g+(f^)4%*Ek>T+VW0CTB zhKJ0+B4yG>ew0Y}g1Lx4#7v;~URtF8=h7w8btBtw59zwn6*FGg^e;b3qFeD)W(O(sa?JB-7VNcy zA`25UzT0hU_Swjf66wBI_OOR^-~KAK$EJ<^D3js~gG3LtnX}a*{mYLsd9f;PW(e~9 zL?qmNoi_5LOulPe-y&bnU+y7oZdu7>g{K28lD>_?BK>cLGI_lrwj|No%UK#T$(swM z?FI>j|G#QyuQK<^n)sP<^#oaCwKIMXHVI|OkJ`C<0R6wt(7tVmU|H>ym^dnechA&r zE#5~IT?GAH{uCipAX4fTQacgOnoQm=Q3+&eD%3XhZyK*9%A(G04H&4MLA0_sw&DV$EnuXeVIudDr zAX2vZA`!xVp?2PHga`s#C^1MQvgrzt5an!a z%4Es2SSKzf^OgUSAXYnVNGXXksx?IV=VtP=iBMz$k+RL^%`khznXH!%6NS~zAZ&K* z3$;tAol(j5DM%@o?MtV|$L;X=15sc+;}1nK9K}c!qfzkefGQpz3ncyo6yKu28jC;m z|5!TZMvtH z-kIw2pD*WZeaW}|)LUIuU3KfeJv%6HT#bR`M2zXamBYUC=law#+?QhSU48-mnv;&g zJ(-?j`{s*R=yF;%i5Yeawi72E1t!8e#ZOc|2+tOT4}Zg=qh&kytT}H<_+WM{b6U1@ z->b3`VWAu63&NMn)uKxDY-bu&f^4V1)(hmVJ?n`4p6v{BNJwGkI6MOf5s6HdV*i{c z29ccYlxsTT{esv~%XWtC|0p3v&2IZv5Saj)jy97Qfy78y&>WzYBuLA4_ANPGLW-IT znqxQ7vYn&0gn`7!3Yw0c>+cTk`QZt#i*f+G{2hyDF?E11HU5}npoOP~q|8BCR=IrxyFhOaV?3oR& z7UxO*^p!A+owKhXy_1f~VGF7e$=OZ|?tq_8W|_i|t+XxYw9 zD|$#sVSN6iOJf{FaTo=xuo%aE)68|EIF6-SwsTMU4)klzcFLO+r|;T#MB;%~TxXsl z)c%n)XFKoLZcmqIX6D+0*INRw~?$(izf~Gt45stE)?Q{n}%Sj|>JLUIDZ@2wIBxgI_aTi9B zkfLUegh<}xpdZDZD(5PY52>)AnSb0if^ssM`>&W1Qq(N-4HRcP-NhW3(46hGpjr7d zdMGz*R@in&LW-KrN8?e*!(`0~uxmNnX+d*pgAqh=w$t5ur&B_Tn)AI_9y#0To*6V3 zyNErke8F z6rHq?VcqSxuaoYr?VA~-Jj43!?E{^3eT-4tAmtg>^9}Clr2AxL7zaEm7CtfFFbK8;E3K@HGLPCPFl#YZoM~NCn@i3JfHIKzV((piO?jR zeiUzs+;Ek-hb&}RyLLLOlkWD-;u_=wUdw_}qwizT;wNI&NqGi)MZkwVM)x?|Es`zDb{s9WuA?l-(Hm@5d%;vw|>ENzqIHRkS;p z717@Fe`~p;e*F+KX#Y%YJrmdCBp6fsSOaE~IZu0~$6osXZ44cVnHWs!h>SSav?ix^HT-dK!E7kEH2LZtGke zD-ce$iY;z6oYXi^EA)!#Y--Dy4GaQm#g=RlPMDl+6&OFgVyjv7B0*7^%vZIfg#3Q? z;m#9#Xu*6u+0nR`iPe$P;XJJc{q^547bpUvmM{IIn}ifK&n_=Z5KT}b4~|9JfwQd^ zH1E&eN|2VP{p-l@5>nLslyNYTu~_rPvj-rNG?8oC<32<@#H*w2%Y7c90HmO4&vE$< zky@TM!^ri}yyah0BulqiNu>6yS23V*lK59vFF$IOBHbD_wC0@==(1yB@1fgDXt7#%T-qreQ0 zSsDdWm@&(vsEDF6imE88qYys1YCkl+Ikig5(+>F+6>^?dXqo9Lw(qlJ)MyE%9vnXf z%Nplt1t!81$xjrwysof7UK|)kJbo1Wv1)Eh!e6=X*d_#jTRG~_epeDy3KaIB}d^poax;!Z} ze|C#15f)}s7eV;mXN+nxuH<}~R8$G)X@xtE@GSU9XWpGS3npjsQHK8_Ax(QBeUQH4LXEJ2NlOi4eAGx`DeF@Z?oW_ix^5!ziQ9>!S9(-vxm<%YAZ z@;i1lI`Evx)ZB*h=MF_en)9?H?;WD+5$7t-pWk974%{jhyQi8B|E6%ZD@Bjmm z!Yp>K>pg*>bWF}1h7gSNw0<;2^1%DUL}_{2-Ldk3gs>k{h~S(j?$jg_lUQ*cO|x7= z3gd%qDCS@kLs1MzG150&t}ZQb6wio?UCrA^phRoLN zN2f$MnVFd(X)l4n6D?PxFS4yhR2C-3-drjng-)lpC6Oh=!=%u6roh?cJgo)IrLP+i z^b?bd@@$llqUQEYSROe~>sovL8Ihc)wV?S&x^N;nPwU#%agu}-H7_^DgO7xR;yT*9 z6Uc{DSkSyxza&99nY@;vg@hC}pH=^jD9+Qm?w_7ZBAo6X!xB8ykfV;>BC-(uDDL4S zTNA{uR{0^t*3N1Ny~0dRN)Q4P$9F#@hkGJ^Hu`-+v7jjKZRhR0K+(yF{*tKT$Q>{@ zyd>LVf{HOY^DR8?n0Qi!+^{L8a4&d?g`_w$b8`*S)%acCre-zNsU=M~M0BrjwA{c~ zR(XkEZ-b;fsho3eh)$|G^0qffX;N9W-#~MK(kW_vhZ=X)OUsN1mkkX{GJ9{RqC|VC?>Bg}ZT5FRgmDT81n&>3GWc=9Be8!WJ z56h9K65ZpP7^Hj5)TBCTA*tN(&1_xMU2lCFgOnzf)u5ls>!fPyInN;9Nn3k1`W>C5 zuWxRvlNOT7&!>&i$=FX$lru@nZ~9np9RZZ5pMMllQrc@Wm=tk8?DVc;Dk<*Z$o5E);yPVpoA1P-wka|R4gVRpF#|zrJy74E#de~uL^G=N=rfiyBT{) zAX3n@|C9u0F+^>OJ=JSin_3Dwa!rve1qbPS3OaA}{X}Xh=*UU2wbh5<^r)qv%kJDF zAw|vBD#B=$eiVCy^T_aODQLN7gs)CIK1o6f35I{^(wLu7d_nPzidc9TAeI9~5Q?ZM zqN9Kz7%Lcs3k5cTSY8xiDB_?%J~37TUV}K=wjb$%6PuUsX;^DqsHLEN_hfpC?fYBf zDb`ZZ6F%(%GnNW}PXs?vIFrQELU>L1O5Q)Ik}wuNzHOZ);fvAk(Dhmh`t&32#sI>; zZj6;exZ?-eFmtpN^vybM2*X$M*Ls0`w&eqnNWdxd#o|130+7PYaU>btfS`CF9nrH^ zAvrCP?CWJeYnUVT7d%^93OYq`409k-)Eqh$=`bw?-K#I+7cG%2*BmpbCXskb6vxQJ z%O#|!xxOq;xQUpYmK$4;mV)+anr4$@b-XWhy_SNW-+dpL%T)Lq58rIc?i(6PJ5Qua zlCbdRzFf)qh?SUycfCNjCS_)O&JGe`VK(I!gl|4;LKP(AN={U;Qzcpo+IPo(M%G!l z$|j<;6!g6z_aY%pd!aMRzfeOaN}<<=%Yfk!NUoNBbuWTaf^^1AUra&@H;ZT>R$<>A zJ1dXrLX~JK=;9A^p(YNOC6c9T z&fkl!Br+|lO&*DrGY~1vV&~SU4~R;~=`%EJ9QUCQq-LEFp#QLD(G&VNEPdhgjHsV^#1Cmup{~rBrD~RP0)J92TUONR~D! z&Y<112+~r}hjP7*gfyq1FE_@+kAO{~FGIrarKO;yYOXu$$`h1@$s6zINl2m7U9UoN z5T&J{AFk>I5_^)r1w`nZPZy^XsimMlBzPtv1x zh(y?z^kdUHg#^r!;uZlZSxws%X1ufUiF=;$OoPu^|y>eGVikc;N?I1E2YZflk zm`E)JE!V721oMtl(C)H5T1rS!v$+S4Jg1=DH76j|q@|$cn$zcgA`$_O;%=LCfrJz_ zmn^?TP(CK-=IRF$rxW=ca<55*nWv?oS2PjLP$f45uGO zbr$8;1|UVv+VvzDw`+~&xbW)wAX4FY} zs$EU9<*D|zN$2ULyXDQa1}RUq7nq4%P#cvzcQAc;JT1Jx{YS~VI_ci+ zz^=rkg;e|0215;U;zH~Y8Yxe;7nq5?OmFQdgOsM)X%(AmkWrHC)=7D)Jx-^=FLW|a z$3&G3Ql4s`^=*t!s?$r{(n)!$oxat6nL#FMjj)+}$in;En;%@!N$-Zt#_Y3@YQI*x zzfQWfzZ}7u7XCuUf8BAU&_?Cs&O>@@Eu`AJy_sl`o%8;qlNM6#PlsR^WKH+OqZ15L zo@(#VVZKhPtsZUANeij=@ju@($T1tU>!gKL`;lchC~B=e*kXl2O8-KJ+P2_6om5*6 zE7|!>} zyILsipJ{1Vi_|N!r84%&?`LKLe|%5eb{dwSeJNk6<)D7vj(tJ6SB3!>=0smZ}}A|p*fh3)55tLX9|WRJH|pGkc^ z>8Dq0RZ@&3GAgU(T!ED;5c&P!`(xN;o3RBaxoBL==sUll77UHhW`FuCU)3gxLNw~3 zc?YUWNO4q-oPhzNCF%D@!|9Qe^cFO)4n}~eCFxIijz~yR^SO$|bu9W(YZb&0N&5H|5V~`c-jAk8<~&@ENbOlmp8_igC+Yo= z!n0y8dX^sc?@9W+A2UlxQM2YHkXn+y{O?G?aFX7FX4AfSRy_2h*z1nR@h=c5q+l?B zv5uiQf#MX3GbqlXK#DjP$JUqeZ&y)VM{yIyZ4@}!#6kuz)_oKYQ9KsbsZ9?$QKPgZ zeV59E>DQd37w*aQ6x-Ka*-8v8n{+n=>NWy{T)DtRcp|iO5H8RHRBh1q-`Yle7+10_ z-2+R)dsAa#$7W{d-6;}bp&PXi2Wi6R3eKYnu<9vfQRGJ@+>g@r#C|330fOQ(d2t|2 zk3gg_a~!VC;Y7t_@?CnYdz@nLcQ#%tuT9Ur~LF{*& zq_?0sxF~k#gsjzBno*t#WA*{kt-K8O|!|dWD1^tElEFZO?{~GZ1yuA z#%v0<3*EG>6t+zqixkJ20kcubc`5=5Z+4ER%aby*zU&Q&ux~a6M-hZC&PI+V8CRmc zY|cq~K{&#*;3J)BqvOnpXhv~dsfow-N7A$xI^MLMN|&c#=H@fx%s5GJK`l|Wc0{FQ z^8M;q5>mKXTpAoAv^)3BI#f$4)a1;#9$8;b(#zZ6D*X%65L%MH!0^tIkme+PkK$N4 z)393orC7~4)h<_a_6r|H6jp4-+54+1A%$7&oYnO=g3>WLA}V%YPSX3)6v?%}Vr;Y| z{jxY%w>e4ghZJ@t`s>9=&tzcDjm1w(NMU?J>C)iXDB_}sk0POOxLoyP;xLjC6}u|T z#3RW`dU=!L#F_AhAS@z^t8sy(k&xyjz4o_xGc(ifHXde9(#zFcy)Q2yDhrc662F&_ zLZ`b%<@%KEoi}I|IkfP?EKW7n?gUPkm;c;=2-h$@Ay?cp5@=c83&73h16d-}ExU&^T4+SDc%~}JC5QI%YahDnK ziAYY;ThMHEViG}GlD=UOj$WKimeJOg5qxXrMrX_TRWr#LiNH-_8OlMB;s`o znq!BKAS#^65zieGQq<+QmbQJgV#t8EKXyP~fxSNEbQA-`cR44;n z%{A6|6W`f}cH0p)8w=q?X!@($M53e0GMTaB6RJMA78SyK|E9P{&E5AEU0;rwtOHJR z?a}GK-qMNlq1lY^-KJWo7tSf=nasDR71XdR32I_|Cf;F{aZ3%dLc;?Fsl92$r`^b3 z^j3EkPhybUTa__Lxr4DHdP{>`Qfa$E${mbDoe{5S_ql)TF9s=hFea_7Wsu|gcQZ)2 zgYkQOY!0mHo!l53uhzFx2O})+Ni5P#hW*qI%aBG&9Sl$Cs>V9$QQKf!VbX$wF*)^g zom9up$AhhratGt$`VTtkKKrqpK`t<6xxYEIEF(e_ZB!P1UT%=jq-5GDSl%@<<+brT zDR(ebn_`TL`%6hwrj1m-F~U5lNKC|(;u<%G8yMo zLd77Z4u&U6fy+ASu@A|hlNKC|G5Npgq&o87kp>xQ0$6-uH*}^Q3q7|sbjsam~t!9~SVmJ%_c1H9f7yP1Q*Y4#w@F*dnx1xqciOJ)ZG$2Scsna2jOw zbIA-+?qEF0x6L3Q4C2Eh)?2xQ;Zd^0GsyqCx7Ri04hDS?;;TXCoQu$e@6*DE1+J*$ z4f4Wm1mjFva4`D5*ldu!az)ok3l7Gusl5&IdUd-&`rZQYx0*C*zTY4lWWTMGLYUx( z^rYQTQztzsKf*N$uFp#lZH{(2QT%T|pfLI17gE#ynUTCSsj>GFto=D(%x1Iq@lX7J z>HoJebaehaFsac@A0ytIaB@~&mcrAF=)Lk@+# z54om2eF|iiIU2NwhUbxxqGn0&93n$lv%sGnK;ELlkETf0Se z4PK05DGH9BR^s1Qqgab#J&KJeHlx^zf}>`ydSyqiA+!tg%)wcgicM^KM>M8yT^ zu;)l8A%&Ua$p0En0`_*rk*rl_BH8<}pjqttN`f@+BYZ|q2`OqWNpyio&HI?~@)Ssn zgaysj6EYKt7AuYw6)~X#k)r0=y8{VI#N@V;UqPOasA-x_j+6P@(DjL#**|PLn9C6v zKeOqEFf_NTBK*OTQ*m6Joyn5$4fhDTJSj6*YQi`SBrMD(?URf=n;ie`Ks=I+D|sBh z8CAj#hP;=Z74tM9Dmh4}ttsSxBu#svGr_aNbUAw;^kD@AmF#_3P%9R*9+4?oElJiw z5>mKX1QWrJd|mBq)D_*FifgJ~G9GH;bx67j(w~d2OjK$nn`Jy632F8|=5E2|X_y%v z5AQRw_hI3Vmu$e@YTn1fj#w`Pk-{u?9xi)~NaPX}=en1Bh-B}>kETdoZQ6(+&HFg_ zA_~Z5RQMr!jD$3KAMQ-kuq|WxP~53!mH?9#&5}=!oH6zhl!eKks=(0+ zL<*hmE`IAKQCXQR&>w*ddmk1w%U8=o6nh`;(#dN`NKvz1-ls%nW6kOX4-?7WhXu_h zd#)0doymr8ewUDLQXI3=5jS=R-;@H{$=-)tQ%ySs zy@TYKq9#6x=!Lxx3uKlF4G1d4WX6jBNJz1@#fKdssxXuJ_A~_v@56#-g^M4E3TKj1 z<`PoW?3K$-R1qedG)Dl--iM%R3MbSqX^~bh%1o=As5y}+jEv%mt>U=%BWVhjJjpX*FM^`tiN6Cq#EC6`YWV#uKC1{*(9^UNL@RJ5 z;3t>qazsgrI$(KIUCrP3 zxS~$2NgRx-)7s$puHlo`HpH*-xLNqX$?G-I4D#jKpA1rN*SxHY)@qv1;vkW%X-e%H zPmK24bE=X|xyze{QX(-jkL(X~C|!`W!R(`+ervWsp+4MonnP^P-XQa#uD;xn1+@H$)j4 z`M7*>gOuAf9sc>tAlof$q>~oxnlhRGHc0w_m_f?znpdUU8RYYzHwG!UYxWGEV~{&e zAb{pMB)4ngM(I{fC*wM&^)pDhT~lsu6rJ>xK7UXrE!Z{Z`0vPQqjI`z3WJo}HLqj8 z&^1G!-4E7D3wF)uzgp;|Ix=QTgOuAfo30x@Q z=2pWVto6_=HMK!X?Hbx!jMc=Gb(XQ3Sg>o#&9&*8p3?P4>6#Yont{_!>ZJP1O{Cp; z_Q~xUPcja{v>r+{th!EGuxtLzY^=BH-tNXsklQt$R1bVBSc(K^bxrvPPSnLssv7sX zAn`Swv|!hCx^-A5J?&>3E0~|%TiCMI+rc|@QoT{MH*4}vN*PN#1!@0Vqo>Emsida; zGjjwYYBqX82C`%@{laYY+)R9){(sCJMLC)tXL7b{1SUf4#x?N{uRJPug&0J|it=H3pAr)Kd^0=Js8iDcCE4I2_Hxd+;$-5riveLSTi)qpri zv5oKf8MVOZv7o;$InKEh781Gm?kou@j><_JvJWws{4+07Vr&t~Hu z#u3sFDQdo*@-I<{6e)~#RD&ijw7wbZr=RU1*?u7ib6T-|JcOq?5GiQd)0RZ`K{I-i zw9gOnmZjF(^WC3JB+q_(=HuA;*y!{33-^yYC^Hd^gl$TpJ;4EroqetjR(^G8UlY0hTPs=9V z&G3|^o*RM0Ff@ECDfu^0Q61HoEJNC0`(igsVAqxGaIIfl`6$xqD3mx?F6uLYG zGqRT5611+_%gaKcT=VOyw#k1xg<0&JmkI4m$KIOz zwrk{St_A0@u4iGjSqB?PNTJhR8c8bgvC-pt zUi6EE6g0`3txsew*8I1VgGjb(t5O#Kj{G)>`z`(f24ba_!` zZh8-a*+zxHMA(qEaKg7=n>j%x=%IPbVNHPnMv?#D=@>T5SW1Xsb)Km@hruB+9|~>X=aI! z6|Xci87}RVXqxYH&~VIIJTHpcu|X*DY}fc}v(Q5erXmC`%jB@FNg^Rl!IC=R+yuIw zjUIJ$BdjBA^jJ`vUg9y46~;d$>&jgpo&M`B zo$*oyG_+Qi!_rxm$>kGsQT47=R0xKaI1vR+^^ayf406wKoK!VZ`Y|H%`f#3RO^>(a z8iSPjQl2DD5d&*v{GwP=G)=iLl{?vKgUt5wnL$c@DRQx57^MAELxYt1QlU|=uhPj- zM~=w`Dfgw;&PL$I_ZhY(Hv%#3KIOjDm@^G^(laXd2A!1qQl97oY8j+0(L{rk`%=aK z`=XO-_=yAtDfOj1u}7uRN%E0P7^K{nn%ZZMPSRHyr_o6ZzEtPDcMP)qhqeYO^`$(C zhG9|AW?#JOc;kjgMgB$B>VrXe8ktn@9!7Y~qy=9pONYHW88<`08wM%&rMi!}p_87@ zr+(5&3%=B6*BPBuKh#WNkWybNEY)G0gS2^@EQv=aE%;I!>&((gbzPj41}XQYZdRaG z?)#`*om^TcE%;K^JUDu2<5}tSE1k69OC6~gRVUShF%dTMct(}`QVk2Y(MeC;VY_tF zf-lvh2f`w)wOw{0WyqQqe5n;5;4f&iZ|UZy1}XhRXr8ip+v=pJ>ZAo-T8hGvDn*9}tsF`|?AhU=tyY=K)RE%;J1j?C6c&$JL@Cdhp$df(x& zK}OjWU)S`r@r(QCn^^;NQhixB8k4+nhtj4^aZe22XN~nOxSQhTulnxLyi3P6%`-Rc z(y?dP7TTA422)+%gD9%$$G_tigCmw;;d?;sgVwYoMEhq>wG4oeByhFmHlRAQ#dRwf zk+qGXV{x(lvQZ^4dQ0&uAseAQ`V&cN1Sw>3O~hgph!ncX7N(9S#=+!^I+*rsamh7p zQ<5T0>;!2`Fcp^JkEAJ%v-L@Y#YD5XQbb4W#}=2MW{Om8g&&?EMzgpw*0q5_K2Tu% z^op%XM=a4;N)%g(_d_M*_ek}};Lo<=*X>jRPKJtYdgV{3rMWfz9hYMfgsn-jtxH}& zLW-kut#J-Qb`ZXizF&4!*6cbQP;x$O?yCW2<>lW9DT?h== zX%gu`Lkk3!Xl^kA#gD+cL{#x%No!Rzc-Am5o zz0U{^ek4tMq2pV~dAc4Cj^cO{?E)AKj|H`qm5}d2(5N`=Rgi@XL<%>%8TD&{H?J7Z zV*j3`N>Xu6d1_!mVT()N23Oxg$c||iSLyWd#eO8s7T4fLmx;kKR&lnv@EFV{w8$4n zMVK8z|Bf!(ilDSi4j;cmLJG6kxjYK8oavaHl%ffdY;pO~6v;i0&__6=Db6ilu`;v8 z<%bk@CFj9^vJ;en$^8qEJq$z&z{6ABsOw2p?8;{Z<1(P)1bj8rT2<9$Q@U zCdG-m>l{Iun4I_pY5yNdv&FSI4IX4X5{he1dTfzwamm$OD|1{TC<~Lz+DwsvF&l^qXL8H?ED}=G z{O4;mqKYtiCIO;dwwnY^Q#j$i^>PMXUzC}@=HU+6ZW5RX8-^B~`nC=CoA=<0G5E5BgB_t&G@rETGCAJu0q#i6Iawkw>n5P&G*?g_D({}FyG|b7vkCC z67Dm?*a$r|vCKZA$}-ubPWDJhQ?R5C`qG}RFUL%u(V<}KQ(-}ERHws4m1lC;R%D$5 zk>>l{+Z|y5o)<-3J~0pRY&QwY=JDK719w=FnRUORp=@ypOoYBMjpvy>(}=Ca{K3J8 zEoq*3pNy`r%*@e^%O#rT`+S-X!5rph<7~ss!q$Vu407v9K zWsrk1h8d*X0<4o1xdg4X)jahKQf>j(TLX&8(3)}nGDx`v_^sf3oecXt6lomoKIInR z{X7UywAS9*I9n$zSb+7OG&RVY)sg68O`F^ToZ1J04Qs07?_u6)q}&2*neLTNdKync zNTiW+3-Eq|);g)){x5+}TCe~Q{{@3fYwiB<3I-{+0DEuStCOBCC0ZDy^rLB>!k%bvbx<KCoBlZe~6w2(lm*7BsIn!syd|6Pc~m_DD!m@MPQj0WnMvGr31Z1yeMlnknSB z)u{e6T_1&+@JqSD@ZkA+(qFIijn$Z_s7%(cj3ad*@_Q)ELAcmM&qv~L6pd@SHGc|f zK|zQpL~#IX&v_WJK_F7pY?S92k=QpCd+h?pKynBb`PhnN zw@irowP&rh`hZCG3N5sDP;R8#G_SDd16TxsNKtdjrZz-kuU71%M_>}LS72m?-l!=HHZM%vJ;pHPo#FN zh446^u)~pjCh?kA_@O`E5tIvmbzq%CD4^Ism6<0I7P?VzM;)H%s3Z<5aYWmW6Bv7i z{#q|IIbKj_g5ok6wjZ%XAX1n)jtUuZ(A2!bT=md!_6jX%*7_Uc6Q4D!<(nZPMa_ei zp_zcm?W-1p#7J1sJW&CwdO{|T4#Igc5GiWDt%IFJ^9rw)z&vNmPS7;XCdbRP$%w&T zqBu0qjJ-mE@iUti`i6$=FXV)ha3vo-ShwWDU#HEb>yt9`xkg$rm#Oe0EX<~*f^gEr z>!Qk=U# z!KMF^G-Y^#)DuXJ%$nA!33b2CDd;;k;(kf2OV{&5x0)Q_aeD^#zwm`&GXdr;K# zj;mn!Tp;ZL^?m|`d0Cje{a;cEDRjEWmS{XtS($uUH!8?oRLJkp6RYeLqJ9GDiJGCb zgcLQCR-Q~yHYVe?j6x(keik&-k3;WdXEIgCI}%dVtXv8YK7tp;lRMc3kcjjxXx0rG zMNm#AtG~!EAw|s&p`(e)#bk>O2Z?0I&w^&JV+i$gGud?|j(CAcQFBZkEG~JN98d|P z!d{^T&4X#z62)GjXS@fmA_gKw%`+#S5SfoPkDfUU5^;?M%}Yl^h|1681y>UZDQbRR zgvXt|LeI06_lRV#P_F5X;ax^#L1=ny>p`+tXn_nqS%aWLOvZePFfkA*wAPy_1M~_r z8G01)CVPbzG?VZ9gQ##OlSK1MNKvy?C<4SWakEdxF@?4pf$_6q&A+1Ep%`NQ@SRF=s!UvZTFku(KMp;;TfpzF&qlm6(> zU|_*nP|FbyXOr?wW-EYIFA!J6&IynYL5nN;J*)IegesVyiGeU=)s;>=g?4 z8DS0z<2iZ@b|i#$O6bTd8zrQ$CWP*}@rj^nOin9<11sBvf~L7|cc#QxVD2fQ^W9Ux z#6#hWO3cibU$9?dwNyfvPQkr#ic(-A+?zHYrcrr1@E59}CfD-Ejx&+8))exF9!-eY z0_hDUl)j0;e{1oZrYtFT(3x@1iNs`3LQgb`$(&|;x^W_;A-CKiiJdL?ai#$4N~rEPQ2-x zL*r&nGf26sS@*wJx~8Yrjy^hR!PQ)N1>q34HtxJ6tqfA`YTg;&Rwq3-{@SgR7F^BN z{XQFH^8=L(QtoPQXpQ3|w>E6en)Nzq!PQI@f@~0zo_N)}7~})ly!Do?IanvXr9xxs zqy<-V|Aj?5>DfEcSQ9L`nz^#KGsvv7a3bT`XTjAxNv5KHpGVL9sgo95&F3=^plUtz za12$WY06zqPiRgYt~Ap98p$1Qt%X0hxov6`gWOyV0Vk6dT+IeYvKwSw{tItRT5vW0 z7&z7-cNYrNHRXSB)01ljl6%^HX1~=yC*`iDH^%6TI_V8+H&Q1pxSE|$;TWiCb_gA( zlNMaf2370^S!Ws!5Zpr+T+Q?6TIgixxt|Z{q@OTF*m>#CJ|pg#_3b z+Iuw*nAB*dj}iATA$6tPX@a8y`czSFWNj@Wgh%6(b#|34;AjvbgZ$JP1A_3$Fr!|@^r`Hf?Z94@zX1| zR#6ZY;@GIzD%`>97>N8H?*ABH+SY%IMHOg%=$uZNH|&R6&_5Ie60st3) zsQi=1O;8Lbum0NuB#S*J@0yoL zesJuG;$bfdM2ec#5_KUG2_?l|()&BeTmCggvegWvgbnLstq5kJ%H+`A^FiVzEeo16>h~nd!{o%y*fRr>-)ADK=AZ|rsEUcNwnxzs z1&&E7))KWlik>Ktq*7suvYV|Az`qSbF$4v&B`VLNQM?9eefO#pqHV-kc!vW?1GXiF zdon%6_9sp6(&d;fihV~Eq>R`P6_^N5BtKF4pgz_o>~MZ-MSK`n@}YlqE5Z)t)G)d} zHZz~s;zgrC!a_Gr5QM$=<5LBi9~xuIV^o6NvcJ{~Wcz>)df7*$=g#S$$qsqR?W+QThH*2`OrBb`BvZ0h3FnVD({F(}Lz7%XSl$kjb5+ zI!Q=T^T~iOL?vSKc*C(E&r>02nr4&ZpDxAedPKmAV6RL#$P~navv|b=*U%|;S zIg`nPkwf^AH0_1XLRWjx^(mN1Gl4xm_@NfmMhr+wR7xg`PEHQB0HkoUD^dSyq21f7 z;vr1MH7&{a5;d*0)CT&nP6MJ+Gx^8C8 zsI(x1;uW4FA%$5SRPn@0g3>XWtvOa}_Cx(>ie$4gw~0#6WW7dsE0O(BKco=B1+^`S z7z{H)32N16zl0RVXCqyzBED2%imEV0Rqd5cUf|v99%7x%h>G0{Y`BnJO?i{zo?2Iw zpiE3|iHctTku>?C?ju=m(Dj*_*_Q)J4faFjYVOmEklxC|V6X~DUs}l$~9G6&pAZmfT+-) zB1C*2h!ix{BqcCKa)4B0R7SAGey9b_v{OLkWHQCGgc4HJ%>4%20Qy%^vkt(Kon1`} znuS|psbW7=Esz3BRUlH-Y+4PE9#VOVTDmZz9d

      Xif?JNDzWiMQs`DqJ$JR=WWM` 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�@Qf*>g%Hb^KW43Zj>7Lp#45t12_ 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%0A#=9|96 zT$8gS2+ry@)VUp&sF=G+Uabe=(`(LDATUX^2jMymDut0Avt!AtS1T;!^*#G{$F*(1 z%-?wi>3FK^IU|ERu??9YUj?rdILCojnT68M55sJ+5tFlTWA1N{6z}TI85fCa%;XlI z1w?Yb0l`y!ZLhY#nA?Pzy>$wKsZC;+xv&o}cA7GC{PA5noUw%UGa9Rfme(znE&GW7xA1OL967}yW*Yl(l(-6 zg7i){88c&hq;OZfvyEL%P%9=wvZKtL9l?NSK1Ua#S~Hoee2fk$dRFR(nRpu}iyv)C zBxgr3;92`Lu1;GftIx&fZ1zae^JJ?zM73jb_cC;~oa4ZN=fx9vPTDhhHa+$h?UADA zlQ#Q_>cHfkRG6D^jspXpuUlXa*OAE=8QSWQqUYBsPl@Wp@)g4d!*DMuj`Pa=g6K|m-S(?&*y ziR#bfzQ1oIL8{gcKBrz{E;N9dLlN)6clJ&73-iChAbpdUS*=3~*VfnX(>#KPFzFVAr;KwP81M{@#YjJt$-sG7 zE!!hS&uss@P1Gv0rMnbB)EJO{ zj-~KwfwLp%d;0lhzvtic?90+TrlIuXg)5e#@1&xv|YWU_D%c-kXH&#IX*W5mCbU#aKVcj4>^20ZI} zhY^H6SMsY>;f@X|dbT@&nbZ^}<5w*qk~0+uo~k*uU#p4Hbo^9inheIC5@#w97;%=W z%8uYS>o7X`OSJY3=AqOF!t+t`#D zT=Dz3yABf0%;;O2G)EA+Wce(mOI2!_st{ce6g`9`*uJ>j9-&F`k=!Bb)+Yl_X67EADLLNh&LY_ljLS94ugS>-$fP8}B(k6U^ z{DAx-Nklag@!Te2piE2-L9I(o<`PX1e@GxC7!nEzheSX! zLLwnqAXy>VAUPnpAbBA9AO#?WAVna>ASEEBAY~xsAQd2$AXOmMAT=PhAax+okXT4O zBmq(%(h$-Z(iGAh(h|}d(iYMl(h<@b(iPGj(i74f@;9U(WB_CkWC&y!WCUasWDH~+ zWCCOoWC~;&WCmmwWDaB=WC3ImM0mMwDl#}dH9JfZBvW3un*$2Ej;Oq#3 zr>grg_4jw9TVqvr1k;3* z&UE}zX2#48(=isSxnlHsqLwi^W#|SXIa7g9WOX%{#Gj($moqcx2^uA5DiD|?s)+_{ z`9#aKqu~i+S1`Xi`aeUSTZ7S8u4HDtJKCo`Pum_ZaSH*7+aNn2yCDAvMLOXaMWOd z`&HPR1gRQq%=7LwrQ_EzGp#?KZO)Ehz-^UlYogFhB=e&5STfloe_wh!D)9*9sP$Tz zpC27eC)vPfIy5tme$3es43y#LT@z6onSA{f_lL71=#v2sM|%*p38cSk);2_Pb_9V` zWk>LD^%M`pW@d7lgTd4w5g64&;os<&A05AinS#CV)8U*QL164Y6#ji?Ve+t*`Hm0K zuX1(-E#7)n{YNb6Nz^tb``5vU#Mu!HkQ0*^A!<95qaVK^lCvWiAZNC8AZiDbQz~pG zlCvWiAQxvx+uh0J+%SCo$k`FJNS?IdV~oVJkn@m>kjs#(kn50})(aBg^ACE^U9bp9 zl?4MhXGhSo5Xkyh_Yt(4$-t6utcR{bAXPU$pjJ6F&3~B5vau?deR@psrMLiln8`KU zQudVi6MfiMSICPXHyJJ>rhKZj45{DU@TYH~hX76ecpqNfCO#q&(lW>=!QTp7A%0Pd zu$9Jz@C$vpR3Vejt{{?AqhBcGsD%LvnRIpqfiyK)fS!^)O);*?6f)`T3Ib`))o6xH znlqe!tB^@&R}e`5fjNC;(!cY+*s8Q#p`^1b2xLIm)ecpYPh-d+wdxFQNb20HM8Dlv4 z25I81Ajv;#f9@o2{4`H5t%t{}*;*&CgE zq_FW(&bBpiR}f_QfE%7p&8~l77s=13iMxUzLmHlR=3pTezUPxGl-9&uL6D(S-#cfp z&=G&X(=|=p6$BaOb@IAi+Q?VUob#=TyMiDi&a}y)ljOeQ9PuXZ3WB8Ut*lOlb-9vP zFRh8Yf*`{)&v>bm;UOvcF-DiMxU%o6UF4L$&!Mx!j*7 z?h1koPk*_Qt{L|6cV{+k;;tabFmInaPSPXg4|-`$+!X{Fx_6Q*zoqjwoiuS*kmQ)P z+jUKxXX~ViyMiFY((n1qNq#JmNheL*6(pH4=9*51*+OhOY2vOR$xiQ`b9`8f_RiVF z#9cv~KH2!qeg1I(eXEUn&DM+mA5OL8YWlPDUq78;6PVOu!Pbl2 zNe{ZzJhq<4M#u5r!IRPI{s| zn0!?Ix`Gsk{yc{7CQ;abW+lAHfbC3M}4|H z1v6PUVvb~s1)*kmQDFQ0)gZb)B{TUw@Es;LN)U`mtJvD!El5-oYO2_0sZ|5jTq3IFYYzR>pN18{*m776spkP6>P;+dK_`&gr>W>H09Vs>2%)(2f zjI7xxluL_dGSQS|?@bkm;wRgqbH-Ezu~C8vDV`ONVf6+Oi5H`qN57Z56r|Lgbr!E} ze3_g$1mC=2qXY|@%YMM79BsDJAnIgzial$c!}gM< zO`13Yn&J%uI~@on(G%H|E?|p=X1iREm1p}m*cS)#O`43_XGyqqOH7bK%*0o0uMif^ zxK9Z8*?W*~5X?8}nhM8zY_VWgdO;3Zf%GSY$pIP;%-oS;J?ogmPfSBdE#6r|K_ zv2_wbI6~08s!l)>!xjrd(=eL6zIl6}E{|fSZY9j`>~tU)lhJh2)iqw7s}!dj-~>YR zYW*7T8q~tyruc;}k7lOrFVz*oVlH~N|~8lQ)Q`w6qUV1mo~d1%KhMO7rILv z-|6}iy!&K}1$7yG17BVtDhrc;&W%ilG<@GI#rJP-()Cz@wG@68uvuZF1hra zgb&SVDSGAlSwV_XoML|C#{}W{LrXDY6b?1nV!=dHlAD|3z!)1)Eyd~|8iVBd*p>Aq z8q2O$O|k2IIf8OBxjlTUf)xF8i!N<;2jLz9a;jzzT{reER16PuF5K8Rd~{R#F&ibA zR7Nb6p%ZT4ondY!i&sX%oRl#;|(F3CLGFdC6i-Hu5 z?%SqYKcez6Nx!llkEy34kpYENIU0#Z-sH zRP&v2aye^Ff*;L=|E3_IIBvNU8ZIrU_9+nS2^NkVv*zP;2_->^GXIVobhoc~(IRO}`>D z-Vud0MDxoRhg~UKELhMiJvEvjvQdHsve%9+M3rW;M~_kpQkHg1LnMi1m>fJ2X(byaSkRoh66X_TnVjJF zlY*3*`*QUp3KOH|w_-m&VZ(L@Ler2=`0beb4_yvL&2K&beg(Ez5KN*e7%7qb6pG(( z{+PZiF#q%Y%$78dp4v>;S7hdJa7r*cD41w|n!H_ewBPIIi-^S=3C-{BJ-h*7iv__O z>-lmy>RE}IzkIua`O#d{@DY0dR8?vdTbcQ{OE8-#HT^y5HGpoh@ZtV=g{GmN{!Iof zAigRz{j1gMK|EV5h{9C?w1EvWD z3u;~e#F)d{p!s*ok3E<>(pb+m(d`NSg86A%juFom3qsk@pZ?2xVsr5&GxM_Hw300r z1e2(3l8#&dJ$GLcTa)=sOB-0y+_|tXU5`Tw&3{|76bemaJug?^MrbYOPdCSVV>U`K zE3@d&yZ+diU<7LZ*Zbn|$Q>!>gn-Pu=MjXq()?dMEJh@o76?s4+Xh6f{ev#A%gjel zY>wHqz%3J!?O(e7YcK&RpRrC9fr3emNqY*Xet##bPo z?GA*paSZi(@tCgvhM8`!4ui=`K`_aT2hmQW%3!^2#{9s)GFZ|a_73ZOJTpUf;XR={ zO=CS5#A3~E&iwSMp~SOMf?1hGX_rSK=WD^_;;UG*-I20a??1XrR7)oJ_AE~%TPz4o zW82;-cbu+o#mukUu7jyd!7X#c=OJC+nwfL^chKc*u^^aa`or*izRtXm?vTKDd9)R) zy}Go|i~G^_7=c>AlYeI?Q(CEP=#{|qIiT4Ve4t0mlEkx7f?3I3y%Ol3s< z1t~OxGOWey_dUpWTOPNW>CP&!31?@(zi`I1t~R4mPQuVgULe2@aaZ2O0b|= zVdGMweqgf9zpoXf)NGIk$5hyPXhF4SG$4|V5-ezbQ*shPy_js=wU&aEnw@;t6V;o^ z)s9e1SE9DNfb0U4kc)c-s(95za@pgFlVp0IvQj-PQr zK?==ak1U0V>d)k?FDDVn77Hetk_`D5qhJ8Y;B-%C63G?|CZssW3a+#GJV67Qj41Xr z8Pc$K2+lREEL}f{ndm#njM*r`g4&lEFau${Yr*-pBae4S8ditk__Z4d9m0J5bC?s@ zV!?uPyZ5(<8p>p=HW&%+NZGc%8sn@68Kf56IWjkqY?NR@bI{(g1Px=dzbDQj-H}pr z;-u9?;ao}!9$wdnNVZt8pgCjQNrFZ&IkiT81t~RuN$@6WB$HcGBYk6w1q+%d%A_W0 z6q84O#5U3$DK-CYGKZ+qO#b-@xh7jISkQdaU_Vh~nEW@Ws)7`nA+3gD_Cn8SAr0E4 zB9bi@)S4k32F@mE9FuKJBOh`{O3j}B<%k;3WS4As*~k_P7BmNVBa55BWS_5*$+;t? z=BSd$OC~ZoWP3j%*(kw+=ES0?BW7zYWbCV81t~S>?VL~0WG1J)C{83>ELhN7wj?)E zQGHYEd|7!Ym}YKDE7ZOlQJ$!IOg7n0NuyixQ`_=>2PezTo*_I(KoZsLCBiENWJb+! zIM(bP!UqcRxO=<@0{S2x2b%Gz5z->ydl2y%5io1V`ym7%1R;bVgds#A;1nW08X*<| zGfI3G1e_Md=RiRD;_-SZJ|98>ghB{~5sD(8 z{s;pR1|tkb7=|zcVHCm`gmDNH5GEl^L70Xx17Q}z9E5oY3lJ6|EJ0X?umWKf!Wx8i z2pbSKA#6d|hOh%+7s4KdeF*yz4j>#vIE-)v;TXaR1o3h`bZ*xW8g`iWw9si!a?p?2 zV!^^AvaFgfK?|5%m;++&NHOJwZe9K#QP?PJp=&D@B9bi@ENJe@b)TR`OzwD$E^|jp z&HI6Sh+53#kt#?m*y%uM8m6Dn+Z~tC_4uQOp1blM4EBzKNoM+?3*yBq^|0_ozY&l9 ziWd6t)`w(-jTQ^fk0Ym8#>|sU7?19RMK#0Hcp!UU&g84hpA*Rz3!=z|YKD0=!g=Hh zW*7PrzmM&k#jQ4Ont?o3F&Uo=R2#CLh za0lTYg5v|9NCLI6Y->;)B%xYZbTzDvY_VWgB~h8expxzU;{q5ZVB&X2%BH`X;w(XH znH=@>43TWHpw4(k!Iwo(;fo4+Du-JsBD!+xU$Hr0%dpG7Tm;n?lsCh3z0*Q@? z7M}K9yn_7H^mJAHbA%VJwhFIR<1O7}Bi|`U-URwFTP#>8L(8X)h}y*D*C{dD*kVCV zMtt+#OQJS2**#kbk!-ObNTbEV>BiVlpuM#4nVyBgVE--{!$T2%w96a1d@C~xujQl5 z*c{2GtOb|!Bxzd|HiELb34+(CM^gUM&b zu|~1Qf(7zzMI2u5Wb)OVN<^~7f|`s-F&OQ%i^&heE)vNW3uYu%RQ|kR{2TgP{5u59 ziOn?x4+JlSl&%Je=+^6Rx;-9CEh6C?REsSZ%p?T4CqoK?F!5^^w5SpGM@}+%vjsugE0(1rBU^fq_Tn~7 z<&JtLZ?+)F=vi-m)Jq#Z?q-0KOx|okkTKs4{#_?y+Eqjb;?PXqY(bJ;^U!kcXrY*d z=LMYPGiOiAc|nlT%`Q;xVhcw-qw7>Gqm#De%@zb{FVvx}u4&KqYc405yxD>vqvm<+ zBa+)TY7##>Tu&3T1wq;i-Jy~9saLYq{GU@Zd9wvUMosTW>)F z4AScvwPWluC+YYlYIsUa+SdMadfM)PD($vk1wZ8VOEOn(6{@K`fd@@5Nyq^~Mp)=O)D zHFK^`nwTvJGNyO`7djc!xz-b%G%;Hcq`lEBI)?r<`o3y>-$^EKwjjv~S?O@X7RB`( zGUXqgG%;I{WV=Ddh;+12!!_YLX=1h@$-Xgku=c66T~bCm$>hxzB>CM>w}|8w$=>R6 z9-TBXTae_l^>jS;N%PL+c{*ugwjjyur5icPh}Bzk(!^{*k~tPrPGc*`Z5uUWq)wWc zEeJAG!e)#{}JCT0tQ zj4RS9Lf4GT_QAO#nV2mI(w^mUEuFN7^Y>A>w3(7OTM%S)pRXDanG?Md-FZ!fURo2g z1wqEPtb}lDxaReoPqvBKf*@ma z*Q}wJHr8H0rLJjWwjfCRyy>ZkbYvJ4$L7>Y6SDu0VCFjo7#B4#5QyTPik|Va1(lt%Y76cjnW#<2gJ^&S1yV7w>DsMYC_G154q6={B3e6fI^ zG83ByNsgGFM{l91zAs+rq=`*~AnoZM;tYdl&8Uwj*65^(O@k!UL}0hf{TcP%hVwHn zt%*&8B>NP^x>6kVr2W!koiwp&5MGkl62|Ia}~9% zx~7RugCOmtc26LZ_qO(eegDx(6PpG}{!=J5k&Y4nC}g@$n%Fc5GA^=F9U^($#`!IA zW>O|L4T7|9Eb^UGbJ=U>>R@8iAjp_;8IJ3kF$3l~S3%)+YO=SFIouj~AJ;Qx*Uvlk zdWr)%6EZ6Q;D3n>L$5@|-PpqaiLH}y57dj&t-7d%dQZDk#!Rve9~@T8c37} zlh=0Q9LgOjdcu~z=xCxmnS5}+C`g|4T;(*;v<>Iigj8=Tvd^t0$&iNQR9hzx$`7>^ z%mjY?ADHqKL=6q^Hf;Hy51{K)GGqTL22AC|j9Ce5kIX_8tv*!3BHq6#$V9J|Ts>)< z`yZZ1db;Q?WA@==1MCVR%50{;_9W&yI^QL7@p$AT?nv1yC;Sc(l$Oa~iX8`u&t+K9 zys4exPfpB;SRz**XZ{6DGQ!`f38!%e)y;oyF!RM8J=Q~T`9NG^*jfA zjPl6_W-RV&GH3LppYdCs=HlDR9w*<%(oJ|v>~Y{GMw(jqc)9Mxa4PBXtIuSGuxQ37 zqQ*BXW6W_@>2dzwO1KF(oJr{gd4JdMM265G&Eu{ulY$f@$1^1813{r6Jv|Dc#n=_X zti@cKo_2pU6R%pH;ipzBNU7Ox);uEl4TERbS1m!JCoE|GnBg^%w5z7l4myr8;f|D= zs}4OSi1H>P$DMBq@@!&F!)Wqc7KtZ0ikVr@F{IfQ!mOOG(ezF<)Arx7+}imj>r!)N zmBL%b()M4AW@ckGJT2~oU8AXmCWOyc#SLQkCI>RMpqsEOgjwlbq*v^tCq$ulHP4G4 zSe=rRhPBZ1c{cQCCT6b9{0dB23KrBtR@Wv9YlG(bcl*f-QdAaOy%woOxeHW2M>pZ@ z)+_5IWH#&yp)P}W#>&-+#G0&m6}AmbhBSOd&a2DXn{;_rX6nt#0)`K7l~1czuVHll z<#2`Y>i+dB1t~_c*NpP3h|JEKgPWZtl3gK8YADIojmi*}gUKcQTY=aW!h{qVoY$6u z*rOm{(7ZNy)Q9E@3MQoJpNw=>3m*h5ye$F{f?VC@9o+?UW-i>=+wU(7Q1*5(xv?lx z(6?*wAm?T>Zv4;5kOo%>?;_>4)Ad;FH1B+Suw1b#gj&tJ)ZwKBQD!^ppDXEEMZwCvSZL_Q= zsvwiC?iE##QnP=WVMG;TvWstNkPj(X(EKsQN}@hva?mdY6r|LgG;B9fg_#^OH?r?H!u)OX^U+_uV8x9eDeO;3*-w57BtI`zC=)2CQJVF zwSttIosR4vsvMJbw|WrCt`I`gkWTot`8uAiFVD<3De{Ba;ijC9biy@X`t&(7mDmc* zcT1Pol4j2dNMEpd*L=DkM9S?>^V8%lH0Q6~Oz7v#PpFCQ9y>I+t>>H$CF%M~%uG9n zgAjIw5KN+NsiB^0wvQ*aGV_buG_$0+vU>4#RF#M??lNl&!fBM!vgVnkw z^VKE~wxn5W{4%=!D`vj@0%P5srm>zq8e+Xh7OnYq>V#Ks?Cl`xnP?1({_J02FF{C2 zHQ(N&d=;da6MTPqQkI}POpe)HoJe+s5Sqre-SHfonYzqOzlDsMT_M~u8~b7me9g@K zW50umq9B+=b#wGb(q8dPJ>fpxp&sAmU}S7Er8T6yzUS-TqU-B3^J}x2mP&hi9x{ps z%p6lKD8H#=&o?Rh?vSAGQg(P^=<=-&l+YYBx z?9d>XWX6N5o&2(uz$UR7^Y#{5EosJezDd`|GZUM;twPgS&r-_{5Zj#j&nmtrp3@Ao zGKC!DPAk&I(fWs^7p;8;EMjWW(qPBH3p_Xd2tL&(xW8eJf^Kbg2%eE(Nzt zkEa9a`qs>J8oiq?XIBWpB-0;;=X1g+^lAd%Wk_lyH0sih3|d9kw_#>j^>)dWRw^5N zWyu6DV%su5>&QIf+1tUaF8@$2kzYLZ~(UJ6y*Y?961F&#->FBc*1aO~_KaF!_C%Z-``92n(8ni!39mE0Y7h z#UZvkQfiJbH;AZiOb%;1f=G6Su%J1$CU!aBF*#|-YXvDa7q(wR)b~uz`eQGV>MEKtW2)d(Uk|^JzcP+yP%X?9|_%&rg?G$X4Zqv^+F=(v>%Qfe01{EDdlOlGc#7GhTj6HQ50D*rQ4 z1DGt?2Z=npLYR=^94nx27dxwDf_~4Vn6(Zov+%>@zreHy>$A+Oq z4raARRrV`L!|D()I`=MOhcG|5?oY(Cw}S=ciJO)a1$8Z8+=B!KDcg2IY-WOfWO91d zoJ6v>g9XjyQ!xs#Dro^r>ZDSTQgdq%_MgZ)wSd)!z;Q~h^}NOpx#YX%0j z!)|a4lm1!oK{$7$)EwOPDp6yZ>`|`+k?ieYL33osk3@}Qa#&8REAB|CIeE=2qR^*W z;MjS0h-7aE3z{=`VIMew$!ULKFX)bxn#&Gi|B3le3!K-YJ(27RVL@~4e(VM(F}W(` zas??hcb7xXIho0g9(What`HV9f64hbQB#=wsas_QDK)SBIiDz;OKE{es+S{@T_J>~ zA*T+!uxl?}K8=}EYg2&1H(v!Kvs8mCMBwA9cs8dqe8 zeriJ5+rf-?W#d70yW<3I4wH8N%~eTB!@3ew;2CCvxy)oM+6ZdR+>}cfu*2D z3j`#@EwGNYXp4a7yT!K%oe;30XwePfdxRbcsBeqj2z?RyBMd|sj4%{o7{UmIQ3zuY zFj8AgK)}wZ#T0~T2s037AJY^>(#9muytvbTc;%|pBL5wwoU8Nut5 zAq|U7@Rk8MAXv}Lnn+Aa>Hv}mi>UdQP!8~IM> zLqh1s>Pn5TwBsBBb+1B%nwI zw2&eV%YdmxK`@4gBBbqBjG(Q|l-cb?m$NH`VB9_wA$=-3bP(xLc<5BMdIQ#neLcdD`f5 z{tb+RNoKIPnxZ%XElY}W51dq(ZuJx2uXV_E$a^O)L!$c$a@v#fMD1sC)Tz__lQi^^ z#uoI^up*kvgyM8k6AIf2KMaA(AZ>@nUP6(u8Bv>1gw;IOjG&Vs!>XJt=_HjV6k*#o zV-MpX*BwpeB$Xx<;Wv+G)yeSlW3YZWN~<)Xh?w}9l9SM zI%CqNG@*zXe7K8FM)Z2x!$~SlD5xh!>SXwdk`0~YA|8hs=x1`=ip4XcTkjB^jA&b; zzmrs&P=x=%zqXL;8Gg+dO9|IgZ9)-|;?3u}X85}TNUa^D(u5-7ZVo(~tQm3fJ?01p zsWhR8xaeKZN&fZ|=Ph{3)Fu?M8^@j2$=DU8u}5J|Po)V(|3KOm~t>6N<=EugB?RWd7@sI;l3H zh*})$EN#@xMvHY)Z9);TW_>YTGh*=tBtkrf(kM+RBF-1U8y-imoM_lrC)Fkt5lg=4 z=_F@=?|ib=CKM3|CZ%(dJ9pyjkV~6RX+jaPsLN_6IVom87pMCSE9rIV3yKQGit zwFyN;kAkj|@a;k%!w)Je4oMMU2n*eW>2(06SI>7?3(B4Wuw>`ooz?C*Q& zq}qgn<^=3*nT)K{Dw9sCO(-IE<*T8S5gTqr=%m_&B4Y2Or%rOK4-R0sZPg|e5nEz$ z;^?U7sx#l}q}qfcqGb1@PO@O!Or2DlP(-F%`&=g@ZTFqIiQ0rBwo{t#buzYfzTUc~ z+Jquvzz|mp^;q?{PO42PA{&2+eSo7sYke4_lWG%+$gg6YYj$L%)8lngZ9)+10HYRd}<+q}qfc^5|;H*gw_tr@QZUQf)$EpEvEJPTHqd zI;E3p6N>0HYsTti^y0IVby96YVb3`!UMKCb<#`u}tVV4@5&Nnab{yQcu}`z(l$BdZ zZ9);5Ywr=AjLg*0IpWnO6p;bm&iR%`zjJj^n@~jkQSOAU8FjUH8@;q@6N<>xcW|2L zc(Ol+m(@wN2}R_+!r0V1M*J0ihrunRHlYZ+5{&nYOopA_`m3&~HlYZA-3x~oOol%X z#=e;~)g~0N6{ln8%w%lQzBP1GZ9-wMcBrXN+RMIwt&?gKiik%=Tj^xPt!C|YQf)#J zd2#WNIvIJgPCcDen@~h_JVT(Po)N7EIiE7M2}Q)owRnrqEfjI6XZICABK+>VAe{`qnkif- z)m9P_tsk`3$%v*I@rIjAtG1Ge=#Ub}W{!Hc$h}u5)m9P_$NIYJ`E#z$I;pmji1@76 z0;guK1vua5(yFZ_V#=JEp_4I%|C^_iYAcC|p^Kf_TSV`x&b&`;B@yxR8jk85E%bPv zb1hR_NyJP|b5|#0M(^CBmsV{h5%I*+)hl;%ID18HB@wl9d0JgFYT@Uf>zZmS344Yw zmg}V5w$eF<)K(JVQ>!{>>hMt!3v^ABvpjKz5k8{KeqA$sK*C`r`QRgfY!SYrW3_9^ z9fR27od5dil%K$)CKR@7IIr_q&X?jny5`~d!aDv+pUk+6l~dy+)pastG@&>h@S3j1 zC*bH*bUNNkvXw+j7bDMS#OJKEt99^s3J)eP#%@rMqE&337qBn#Wb#(Gn;=V3P;1)y z48gHI)tic(x_@${;q=zl`~gmxQZSP-um#l0Css4OO0nfg@jtpgB{RXTCxNM)m@#P; zTeYmsiAu#}-nh~VGSOQsS5Mj|Xou(ysrfDgwqUhoD+voNv}j=*Q8*1C`(S?O?T(ba z@>A-^1mWq@Y+HBigywK-bw0K0IziZ(YqkT`;}xXTynCiALFt*iJoy4h3?vKn{P+tX z^sHuk5P5%8tVO-TTTwQlFd@aW;!$+c zFd}_eGtco@1t~SFRqRWYFOy|oRtJeUM;0`{?mCDlKPJBz_Ci65mwLQCeFYItx$yab zmhTWgP-vwgcp%^nSS#%ITct)wi;x}xZ(&>cAow8!Ac*fMdn}oaJiwnz)~Z1v`Z0S! zh&mabVvqTKu$!f6lX|Vobl>JsTC?NmMvU&zfnrfJ9GN&}_a6BQ=7_ zZ`#aOkWzElG~*UdcMFM;BhH2lc+yjqbZN8Q#~j5 z>p?fL^G!zOu4GAgLUHtGG&5sftAxd9Djq!`6s?H8bo*_r%$^==~Bgu+BqlKsjKB`OD#Jt`uNsCR}_SeSF+#u-1xPoy8S35B{y zL5&}dBPcgWZ$IsMGNjRjB2x)`<|Pj^5!?2I$wxu0=AEMm_Uw6?%<@lT1t}WcyI2$& zJs*?#3u3WMvB#Qb*@;M&@-ta79*ypfl$u}6#^hRn$;#twM6wBmg?iSFUO^O&3N-Jp zZlH18ky5jL@67}iVzNoPA|M}9u%OxH<3gf7W3uDk912ou_8+)~sKQMC@b(aqY$ahq zb7(LQsqjbh9#kENtL{jtIb+JV1mRds^Bz5F0+DP&VL|ioI!sH&n4Ep#u7Z@Br?29n zEzacedL==gr(i+zQaqOR5=@?-f|bi1DK+0OxIk1%CZA73YR4uNYE7T?!$%TT3Z#$c zx^YCZ355mHf5=*bN;BzGuCRg>rS*yX3}dJali{7vLTo}|K{NOC1ft3^nN7Q+Af;x5 zPRofZ$7I=cXdyPC5SoT`!l%|FJelR0sWKBu8XH0gCYf}?HDCI)wtY!#1?HP%t7A#C zMPY24Dl+rU-%}NupC)giIsBQ8SS*g3PtOpHTQ;E(Wj5Ax=;~2)c_n5B1f~M>BL%^@ zujh>7b&0La{J3s^S<;;HFXqcC%uL*xpwKkd^Il9>VyiNLwkakrHlZ*pv#W)Cy~^Js zsv46IS|&#tk|m$N2Q;GVt26WGl;coqLP4$O^XA1?qG~YtZ?V)0(oj#|{GG5GVQZ`T zMtEQbV-pIYZ0Jwl+@&z?@JI8_)crA-GHy!iNP|TSm0$4}p*5K=@^_Ra%`yo+>H4pj zDVZ6om^)2lJ>z?PO>8aZ8w8-9Y(gRGnP?1((zfZ=i>TU6w#w(BAjO>EyL@XyqUtc& zqhU@W*@Qx98rybZKCCDh@0#zRj9BN{gu*Q|b1ybQsGsIL;=fT~(5Qk*R5wR|7<%RD zIDG7|9^YkkXKc`ume!E+`tIJ18rElK-Nt^FO1q=yUAn#jGaLWLYU{4F#-2QK2x~la zHQ%3)Vw=e(6lS#*J$Y*VA%gIvX}%}=WA1WC%AUNj0<&ggCNHjjL?oL~SkU}q3G&1y zOx|g}LqQs9>*sY5SyWTzUlhhd&n6T?**Jzi9PLZjf5Xhb^)i9UN+p$EoWU|7RABbdI2ccjPFM)NZBj<2aX}CJ(HVzV86~*5*9Rn{TnN92PO{|FRCD= z=H;cAiNegQ`JLX4lTtRJu%LNs;d_EmSIzHwGo&@{NTKOpcWNj>ok03m@#sb*TS=%j z{Toj#MNnrZ>tDoL=8lw_9TG76bz!pQ-&jT2O2UF>w-)`0LQbUlcaBC5=Z=(`eY0b} z@5W@0h#W++355mCAz4xq^&OJ~?v7WGQgeJcWDDOjIpXuWM6wBm1!hS%?+{SMj`?yBGo^oT3I>~H3u1lt@oYk2L3vOD_D4gR>^~d37I&m<+X*#L<{z0H_TzLS z*@VJ^=Jfr@ZHF;Ar61nixg(|K(jD`N8qVaLww;J%6ABBOs}CbL9>L^_A-5Ey)I56z zrN!Ba7Vzt~`$V#pgayqj^*<*FJ8muD!d$eFJ5p!{dX)_)Xf%`WEBs3&TS=%j1JfQ# zOBBW->?@8aNU7QVW^RJUGTD9;(p0vRu%OxZDt3e8nCum^L_tc;;h}#LHJ-^q=?fCc zRuUF8$Ie5ZFoDTYOA(BlfENE`|yckiKt+l|79tRYp)I1)9m0>EAJ6jDSk_{n*rXi;e{I$t% zbp14Dey$k^<_`*jky)zIgyK>(o|Wm$pKO4(RcoG0SV`BHXyWM6Zc32BKXg{>qksFfLbj3~^RT2Pk8I2CY5erj9Z z@8qIuTYZV}6+&$UWN)qNAv8c}gn+}bR^K4RBj7=7)d~RzeXZIev`6?B0TXtsE(qNa z@G`Ge4+KcI>W$DBp+CYvguw_y5io#TjX=OwuhkfYaR|t|TTMckf-nsMD`2Zx2y+nT zAuK>xgn${U)iQ(?2&)j*Agn{!fUpT+3&J*p9SFM+_8{y-*pGk*veiL^!w8sfTOC6< zfp8Mx6v7#Va|jm@E+Je&xQ1{8;TFOjgnJ105gsBuMtFko4BVL?gr^WJbt>kPRURLM{aH zay_W67e?KD9(v7RRi+=am4t;s+nL`uFJQ96-ZctROnE_l2Yp7=LMFRsxJo2jNm$Sv zJnk7$iawbwnO@Mc8|+ExbH0h>^W zA{(puOI1(09B(eQpuL+0f>}X9Fv(O?%#{}|o*)!6wH9=258m#oHP24{nl8r*uLb=! ze2zjh>5SL9Gy$#4B9up{h)_us=|N^Y-FY?N{^o{X>Bnp(VOAwUzFeB0s5MMJPMD@3 zMbifl$yAD{wIGAbdE#J$O(@iw!8@}evBxmcf=BG!pA2bOY=T!@EkKvAXJ&y%5ikQN zSWw%zB_~lEm|QajbDBHyQ`6H`t-nI3?P{yw$3r<{iNaj$}j`*o4AD8Q#yv%c)IF zJ}cFXNH(ERlOfLNP>*<=W9(*$SD&Y&AF~OCnS>y#6uU*#9+07_|7cGn zn@|YS(D9)qmKUeX_c9Y)_W>9@k#3n>Rcq7r`bmVnlsM7cY9 zwxfIf#P_S^hXjO8D9r9B$N`Iw5VfDl?>>$}!OI~$<7+bD-|=yFEv-XckgIQD2LBmX zgbvHLjenAcJ_bh1X37FKmwm;Vr1ljVKaZfkvGEF*F?0Iss7!YX!oI?=!ez`6M!OFi zuW%W&Tyoe|kQz?OJoXB+jI$0k+_RUfuv(V9Iq2dSD6E$GC_V_#x;G@1z89vX()U8k z{_wn0Gh4ckPEDong_a{et&4oq&PghLFSOi?20F=HC2<7fsHf8Rf=YYANoJjL%t2SEd!c1}^R1Jlk*Jeu-wTb}(@D~Ja*|5l3#~x4 zSxz!v$AeB%>3c!F66z#Njx4N`YTpa3`h!R(S$SJ=C#m$k&~lZ$?Id%=W6I`UQTtwK zG*+Etmb}@Wq|)~y5gE4~n=aN=`(6-v+^HG2{U0Z(^u5pudm)c;jN3w4aZJFPYTpYQ z@l&0oD6QJ}Ld!O!h?C5+thuh4O6hx{<(YuplcTh`w(#Z=v!>ejB2f#85wG^W(6V>M zKF^_O&`) zWf?Me9`S15i$u?-c(T>L7g*t)nz2td>zZoci$vpAJlSgBi$tZ3+y1w%srJ3lC^vAH zHp?*S`k6Hndu$#e3OdOw%kXlO$xJOddrrCmkl9<#LpU#S zw2&yR+V_I`v%QlPv!>ejf<_;mt3LYTpaWZ?U&_ zXi}YZQtf*|ZTp#%r1e`T)xH;rR^IGg7wDwg_af2rDOO&!?**+$*_@@#d~~?3srJ1v zBh|haiFP`oKh?e$^kg>^rN#Lyk6X3x1wEgEPBQ10-|M8>_rh$BSNmQhZlT(>bxpPJ z1+AYpXKAzK&8d@W-wV>r?j$oGb+(Y&_rh$xRr_Aheg!9tj%OwN!%KQ;)xH-R<+M&R zvnzX3`(Dr(LW=Qe9!hW1HPyZsiDqir|LUaL_abpNUiK%QRQq0-;!Xju{?&sG7(zqt)+SNX_xzjL)%8 zX2*<#tj?^&=$LU~HI98TTWZ>YrFbdMjv0ax1=GYUH|^GAWNaQxUeDKFL5fzfrRi9M zD7+5SwEJmr63vboYE9d~oU4ez(W++4FfUIsq~WO9mM|VGbP8tt3!&fHF+->s-uu|{ z#+9Y(adM^EB8J`ugX4O^n6!$m=H3ScrDC$s?q3vSqE~L*OWsUQS#gX0H#Pr#=-C6f z3!2G-{^IdCxQM}o;UH<~BE&EPL{pM^ zjw3hV9`cA?zmp(#%rGIvv*JO;cFZu*l;o^wIBChj`n}JPrv2j@mWv zvJ)RbEgwqcN_!JM%%YrM`r!aDFO$_y4N;Jy(Y>2?xl2?&CcpNM0=dVUW~+N8h{7YK zc{k62SE=qusoCw?Ac6`o`Rz%(Heufj3-#=E3BwXcmYR2uC=5$?q|}@kgDJTXlY@&R z$!Et53!2lHAtC&X$tf)-D@duiYz#gZg4Z>g_xw-{OZL66pt*L$ErNp7PA}oDc(MhnsRDC6ZfdpGk`^6I+4#k#$yC(j0$j23=o~nK9E;nx7_b z*WBl`{oZt9KWBdVjEbbmju~$2xh2PAy1o)K>!!2;gHK=zCeci5sOO>9D~PSk{I2zv zENT9{`W;TZNJ7{#!>r7%7V^zE;5b3mm<;;XKN-@H zEcwR7+@tHOGZPlK9}GTyXF)CNvNJ>>@gVn#r^pQ5k;Zy9u8&pl3+5|b#<46rW(Z}& zxb>}{1!=>V%zSYkTVZyu5RBXY^!+w$DzP=0Z+`WyCC#>%kamB?OzWx36`IC+j`(jp zv9*{VIQ=;B?3iIzX3?J$?jcvN&E(h|$T8iKVovZq+Xrh|9VQnpN11&BCug}co5eF@m_Rgi3bbSM6u9xqkD6O$4U##;bwjuLRvS%WmeJ{*vD|+%x3`*OG z$yaUg3f~8NF}j=`GX#@Ne;A(6g$IA8J787P z{3hMN*N)VsomC52NgHOSXT&BvX=$ahu~)Vp+fOX+q4}-x#FE608D=FHy|Sm~I)X6v zHNTx1a0KX%l)ZAZWIRE5QZ>IbD|Zsfju{p-@2}rMPzNUO^uMSerRMAAYl!-m$>%>r z63M<77BoL}M!(`HN%MQV1hbJlQfT`38;@+f6G;Cq?`{*xz87ju{~tYW6V#c>fv1sc zx+A6LjESp>>cZssa(K$v_rikag1*ScyD~ZF0A@gUq|{tpAPrI7m|U8<7Ln|jVL@|K zo?JwI$K<*{w<<`fxo$ya-?}Y`;zb~vO>IWwOm#(9N6q@7#5k^!`kO7{ne#|#rqNwzt9f~WyZHi?@+n(TXFLW-lcfcdK)5jBv> z4nwd6Bqa@dhk)MgbJF#LnCX&})d~}6L2Xt5R))b$_FIE>p1n3qNW zG7>ckWMHbn(-frC%-7F@pwUcbA9#aEcFeG#S;Y1iQDc}aRCt|&l$uK(V6QWl$r;B{ zPj<|(pt<_n@eXJJ~9E$kPCreW?23b}%|oymOq$~aYL#|%+sLp_56qYu*c zvzYPu>kb$kHVejmJ&QfAM(k|nV>Y)VlpQn7cvm(a)TQ;WM9pEcRIZ`%J~NNWudiHEke}L?_dB^DFdShd0+#CpNE z{E6@s;V*>$A^eT-55m6){~^3Zc#rUrLK_=`CqfE@R0wGh(jjC(@J8@O@J9$l2u27+ z2uFxSup`7EWI~8T$cm61Atyp^guDp(5eg!FhEN2d7(xkzQV3-b${|!h_#B}!LREz7 z2wx!7M5u*O2jOdk`UnjX8Y47CXok=np(R3V1o3h`XxfzLH0KJFH~KL|Pc z=7!!NY5|ioFSb#TV#*6zcO0qoLM9i_LmI@685T6Rezl*dMNDqWh$eAIO3lkTuM@SH z$^9vj^s!@x&@@gz=Y|}j>z6R|>;KTx?3f{#WTqdws*QN19-OWRb{k9iCfEKLm5i|A z`@})_8r-GpmoalI8%C=;VOh=B7ea_y&g6sHjfiCT3Q=TZHD4|*OxLeq=C6#K!MJ;| zo%Ea~IA#4D#I9uiUC4MVn!%o zcp`3(t-BWNy&TQJjv1mE67`%QGtWLu&>AMgt0Nh7M~bEo-qRk?S|+6K85T5O zR*xhK$3I%|0c~(Hq+ziMzFiPWGL{W3_~N&id)W8Fg4&~~V1hO8ds( z5k|Y(DkNJsq=ZN%v=Gmgm`d3(LtTcDVuewLO-$xmj3aG!%uth|dFEo1xtYmI+i^V1 zjv0b9I%X`)@H1V%g_#cj-Uox3Q!s{yB4lQ!f^_{>X1;H@nl5L@48bHCK}jEqkhR&t zZ)1L0Zg1k*F~f`(t-5D;I8ob~+`JA;3p-|5AP+vgNz@J|e>yseNOsJyK%O{@W3`=3 z9?6MygdH<1kQZj1C2ALwrvm>Vk{vV5NJl%-Rc$6COhuTEFcV=m!d!&;t_BG$p9}l- z-H-?^?6Zr0%#Imm5`r947&+%2CaV;?MC`Sg zUB8c+X6Z81UorgcwGKW4`av-=71P>Q!i?Pqe^ zG|Y?am|=l@G7F0x9uzI~ghv#S?0X?dV_QA&!jAF)GuI9+2h*E^V3MgfUC?H|DDvC1 z<>&^#@J*iA?MgqcQrpc`p3#Wxu?WbADMODAbemQ!Vxb%UUlLw!w!M>HsIY`bkOn0 zYNK;FahGd{!22e}?M2p}COjY1?Y07Vnc^tC%eq70{SEjopRR-lFg~W^UrxL;w_gVO zcYzN~ipP}thq}s!1xt%b`#G-(+;lDz4}lLh;7_K~vACn@VsbHCxO)hEi~+y?=S0GTSbc53lTLM)#fQMh8F1fJ z-3aG?kGk!HnVOqU_-|)CHpM(b0pEFtEC?{Sf%Hq(Hk^NG(eDm&%89}Y0}z4FN{UCP3%X1=5_8Rdc^5u*#D(|zJ-H`tPEtIs$-47| zhXRkwwF93*V_aB)2=#eMaeLPezY*@3F3NsL(+Ot~fiFpl+Yje_NO&|=U9*opJ4II)_8*1irz5XHE5uUU&P8 zw%eWf-^mS|O$OY*Cv7M{O&8bRCmqvPVgjMQ;qBO>r^Npbs; ze`B46pPp&2jteglf$uQjr*6~M#8!ew-K+$>9OA+YLlJ@RN{VN?n>rKW-0zvT)lH}4 z!c|1zdy?X@jXc}vg^$g;!#U3jYY~C(ON!gW_mqu=Kq+NtBhZbaaR z4S3#mc;Xx#_xkBF9T%P>0zYEF<8lnp)$M