summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk3
-rw-r--r--api/current.xml213
-rw-r--r--core/java/android/app/ActivityThread.java79
-rw-r--r--core/java/android/app/ApplicationContext.java17
-rw-r--r--core/java/android/app/ISearchManager.aidl1
-rw-r--r--core/java/android/app/Notification.java18
-rw-r--r--core/java/android/app/PendingIntent.java10
-rw-r--r--core/java/android/app/SearchDialog.java1550
-rw-r--r--core/java/android/app/SearchManager.java251
-rw-r--r--core/java/android/app/SuggestionsAdapter.java347
-rwxr-xr-xcore/java/android/appwidget/AppWidgetProvider.java8
-rw-r--r--core/java/android/appwidget/package.html114
-rw-r--r--core/java/android/backup/BackupManager.java69
-rw-r--r--core/java/android/backup/BackupService.java126
-rw-r--r--core/java/android/backup/IBackupManager.aidl35
-rw-r--r--core/java/android/backup/IBackupService.aidl53
-rw-r--r--core/java/android/content/Context.java19
-rw-r--r--core/java/android/content/ContextWrapper.java8
-rw-r--r--core/java/android/content/Intent.java79
-rw-r--r--core/java/android/content/IntentFilter.java42
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java18
-rw-r--r--core/java/android/content/pm/PackageManager.java6
-rw-r--r--core/java/android/content/pm/PackageParser.java355
-rw-r--r--core/java/android/content/res/Configuration.java28
-rw-r--r--core/java/android/content/res/Resources.java42
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java16
-rw-r--r--core/java/android/hardware/SensorManager.java14
-rw-r--r--core/java/android/os/BatteryStats.java206
-rw-r--r--core/java/android/os/Process.java35
-rw-r--r--core/java/android/provider/Applications.java82
-rw-r--r--core/java/android/provider/Im.java193
-rw-r--r--core/java/android/provider/Settings.java5
-rw-r--r--core/java/android/server/search/SearchManagerService.java42
-rw-r--r--core/java/android/server/search/SearchableInfo.java386
-rw-r--r--core/java/android/server/search/Searchables.java249
-rw-r--r--core/java/android/util/CharsetUtils.java169
-rw-r--r--core/java/android/view/MotionEvent.java29
-rw-r--r--core/java/android/view/SurfaceView.java33
-rw-r--r--core/java/android/view/ViewRoot.java130
-rw-r--r--core/java/android/view/WindowManager.java15
-rw-r--r--core/java/android/view/animation/Transformation.java32
-rw-r--r--core/java/android/webkit/CallbackProxy.java105
-rw-r--r--core/java/android/webkit/DataLoader.java29
-rw-r--r--core/java/android/webkit/LoadListener.java28
-rw-r--r--core/java/android/webkit/StreamLoader.java6
-rw-r--r--core/java/android/webkit/WebChromeClient.java17
-rw-r--r--core/java/android/webkit/WebSettings.java44
-rw-r--r--core/java/android/webkit/WebStorage.java35
-rw-r--r--core/java/android/webkit/WebViewCore.java29
-rw-r--r--core/java/android/widget/AbsListView.java12
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java143
-rw-r--r--core/java/android/widget/CheckedTextView.java2
-rw-r--r--core/java/android/widget/ListView.java20
-rw-r--r--core/java/com/android/internal/backup/IBackupTransport.aidl21
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java43
-rw-r--r--core/java/com/android/internal/util/TypedProperties.java692
-rw-r--r--core/jni/Android.mk1
-rw-r--r--core/jni/AndroidRuntime.cpp8
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp207
-rw-r--r--core/jni/android/graphics/Canvas.cpp9
-rw-r--r--core/jni/android_location_GpsLocationProvider.cpp1
-rw-r--r--core/jni/android_opengl_GLES10.cpp2
-rw-r--r--core/jni/android_opengl_GLES11Ext.cpp1380
-rw-r--r--core/jni/android_util_Process.cpp79
-rw-r--r--core/res/AndroidManifest.xml17
-rw-r--r--core/res/res/drawable/btn_global_search.xml33
-rw-r--r--core/res/res/drawable/btn_global_search_normal.9.pngbin0 -> 676 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog.xml33
-rw-r--r--core/res/res/drawable/btn_search_dialog_default.9.pngbin0 -> 3203 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog_pressed.9.pngbin0 -> 3597 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog_selected.9.pngbin0 -> 3599 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog_voice.xml33
-rw-r--r--core/res/res/drawable/btn_search_dialog_voice_default.9.pngbin0 -> 3371 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog_voice_pressed.9.pngbin0 -> 3723 bytes
-rw-r--r--core/res/res/drawable/btn_search_dialog_voice_selected.9.pngbin0 -> 3691 bytes
-rwxr-xr-xcore/res/res/drawable/search_dropdown_background.9.pngbin0 -> 229 bytes
-rw-r--r--core/res/res/drawable/search_plate_global.9.pngbin0 -> 293 bytes
-rw-r--r--core/res/res/drawable/textfield_search.xml31
-rwxr-xr-xcore/res/res/drawable/textfield_search_default.9.pngbin0 -> 3361 bytes
-rw-r--r--core/res/res/drawable/textfield_search_pressed.9.pngbin0 -> 3586 bytes
-rwxr-xr-xcore/res/res/drawable/textfield_search_selected.9.pngbin0 -> 3354 bytes
-rw-r--r--core/res/res/layout/resolve_list_item.xml6
-rw-r--r--core/res/res/layout/search_bar.xml64
-rw-r--r--core/res/res/layout/search_dropdown_item_1line.xml4
-rw-r--r--core/res/res/layout/search_dropdown_item_2line.xml11
-rw-r--r--core/res/res/layout/search_dropdown_item_icons_1line.xml18
-rw-r--r--core/res/res/layout/search_dropdown_item_icons_2line.xml104
-rw-r--r--core/res/res/values-zh-rTW/strings.xml152
-rw-r--r--core/res/res/values/attrs.xml18
-rw-r--r--core/res/res/values/attrs_manifest.xml9
-rw-r--r--core/res/res/values/public.xml8
-rw-r--r--core/res/res/values/strings.xml10
-rw-r--r--core/res/res/values/styles.xml19
-rw-r--r--core/res/res/values/themes.xml11
-rw-r--r--data/etc/platform.xml4
-rw-r--r--data/fonts/DroidSans.ttfbin190044 -> 190044 bytes
-rw-r--r--docs/html/blog/blog_toc.cs1
-rw-r--r--docs/html/blog/index.jd4
-rw-r--r--docs/html/guide/developing/eclipse-adt.jd4
-rw-r--r--docs/html/guide/developing/other-ide.jd6
-rw-r--r--docs/html/guide/developing/tools/avd.jd14
-rw-r--r--docs/html/guide/developing/tools/emulator.jd6
-rw-r--r--docs/html/guide/developing/tools/index.jd2
-rw-r--r--docs/html/guide/guide_toc.cs14
-rw-r--r--docs/html/guide/practices/ui_guidelines/index.jd28
-rw-r--r--docs/html/guide/practices/ui_guidelines/widget_design.jd185
-rw-r--r--docs/html/guide/publishing/preparing.jd9
-rw-r--r--docs/html/guide/topics/appwidgets/index.jd154
-rw-r--r--docs/html/guide/topics/geo/lbs.jd73
-rw-r--r--docs/html/guide/topics/geo/mapkey.jd28
-rw-r--r--docs/html/guide/topics/graphics/opengl.jd5
-rw-r--r--docs/html/guide/topics/media/index.jd37
-rw-r--r--docs/html/guide/topics/media/jet/jetcreator_manual.jd1152
-rw-r--r--docs/html/guide/topics/ui/dialogs.jd650
-rw-r--r--docs/html/guide/topics/ui/notifiers/index.jd107
-rw-r--r--docs/html/guide/topics/ui/notifiers/notifications.jd432
-rw-r--r--docs/html/guide/topics/ui/notifiers/toasts.jd154
-rw-r--r--docs/html/guide/tutorials/hello-world.jd194
-rw-r--r--docs/html/guide/tutorials/images/hello_world_1.pngbin9635 -> 10031 bytes
-rw-r--r--docs/html/guide/tutorials/images/hello_world_9.pngbin25933 -> 6791 bytes
-rwxr-xr-xdocs/html/images/custom_message.pngbin0 -> 11120 bytes
-rwxr-xr-xdocs/html/images/custom_toast.pngbin0 -> 19966 bytes
-rwxr-xr-xdocs/html/images/dialog_buttons.pngbin0 -> 3701 bytes
-rwxr-xr-xdocs/html/images/dialog_custom.pngbin0 -> 4018 bytes
-rwxr-xr-xdocs/html/images/dialog_list.pngbin0 -> 3830 bytes
-rwxr-xr-xdocs/html/images/dialog_progress_bar.pngbin0 -> 2562 bytes
-rwxr-xr-xdocs/html/images/dialog_progress_spinning.pngbin0 -> 2648 bytes
-rwxr-xr-xdocs/html/images/dialog_singlechoicelist.pngbin0 -> 5071 bytes
-rw-r--r--docs/html/images/jet/clip_marker.pngbin0 -> 16122 bytes
-rw-r--r--docs/html/images/jet/event_marker.pngbin0 -> 5124 bytes
-rwxr-xr-xdocs/html/images/jet/jc_audition_wnd.pngbin0 -> 38252 bytes
-rwxr-xr-xdocs/html/images/jet/jc_event_wnd.pngbin0 -> 54424 bytes
-rwxr-xr-xdocs/html/images/jet/jc_main_wnd.pngbin0 -> 62984 bytes
-rwxr-xr-xdocs/html/images/jet/jc_moveseg_wnd.pngbin0 -> 16350 bytes
-rwxr-xr-xdocs/html/images/jet/jc_open_dlg.pngbin0 -> 17097 bytes
-rwxr-xr-xdocs/html/images/jet/jc_rep_wnd.pngbin0 -> 21566 bytes
-rwxr-xr-xdocs/html/images/jet/jc_repseg_wnd.pngbin0 -> 21236 bytes
-rwxr-xr-xdocs/html/images/jet/jc_seg_wnd.pngbin0 -> 49892 bytes
-rw-r--r--docs/html/images/jet/linear_music.pngbin0 -> 13005 bytes
-rw-r--r--docs/html/images/jet/music_game.pngbin0 -> 6590 bytes
-rw-r--r--docs/html/images/jet/nonlinear_music.pngbin0 -> 15433 bytes
-rw-r--r--docs/html/images/jet/sync_muteunmute.pngbin0 -> 12596 bytes
-rwxr-xr-xdocs/html/images/notifications_window.pngbin0 -> 10511 bytes
-rwxr-xr-xdocs/html/images/status_bar.pngbin0 -> 3719 bytes
-rw-r--r--docs/html/images/toast.pngbin0 -> 6544 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Landscape.pngbin0 -> 3504 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psdbin0 -> 84164 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Portrait.pngbin0 -> 3765 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psdbin0 -> 192054 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Landscape.pngbin0 -> 4851 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psdbin0 -> 356070 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Portrait.pngbin0 -> 4943 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psdbin0 -> 369054 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Landscape.pngbin0 -> 3270 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psdbin0 -> 114336 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Portrait.pngbin0 -> 3403 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psdbin0 -> 73853 bytes
-rw-r--r--docs/html/images/widget_design/Add_Noise.pngbin0 -> 68306 bytes
-rw-r--r--docs/html/images/widget_design/Layer_Style.pngbin0 -> 80200 bytes
-rw-r--r--docs/html/images/widget_design/Music_widget_button_states.psdbin0 -> 948899 bytes
-rw-r--r--docs/html/images/widget_design/alignment.pngbin0 -> 44231 bytes
-rw-r--r--docs/html/images/widget_design/buttons.pngbin0 -> 6358 bytes
-rw-r--r--docs/html/images/widget_design/file_format.pngbin0 -> 128651 bytes
-rw-r--r--docs/html/images/widget_design/landscape_sizes.pngbin0 -> 88782 bytes
-rw-r--r--docs/html/images/widget_design/portrait_sizes.pngbin0 -> 97525 bytes
-rw-r--r--docs/html/images/widget_design/widget_examples.pngbin0 -> 126431 bytes
-rw-r--r--docs/html/images/widget_design/widget_sizes_landscape.pngbin0 -> 113725 bytes
-rw-r--r--docs/html/images/widget_design/widget_sizes_portrait.pngbin0 -> 143836 bytes
-rw-r--r--docs/html/index.jd6
-rw-r--r--docs/html/offline.jd6
-rw-r--r--docs/html/publish/index.jd5
-rw-r--r--docs/html/publish/publish_toc.cs1
-rw-r--r--docs/html/reference/reference_toc.cs1
-rw-r--r--docs/html/robots.txt1
-rw-r--r--docs/html/sdk/1.0_r1/index.jd3
-rw-r--r--docs/html/sdk/1.0_r1/requirements.jd45
-rw-r--r--docs/html/sdk/1.0_r2/index.jd3
-rw-r--r--docs/html/sdk/1.1_r1/index.jd4
-rw-r--r--docs/html/sdk/1.1_r1/installing.jd2
-rw-r--r--docs/html/sdk/1.5_r1/index.jd15
-rw-r--r--docs/html/sdk/1.5_r1/installing.jd10
-rw-r--r--docs/html/sdk/1.5_r1/upgrading.jd73
-rw-r--r--docs/html/sdk/RELEASENOTES.jd34
-rw-r--r--docs/html/sdk/adt_download.jd39
-rw-r--r--docs/html/sdk/android-1.5-highlights.jd32
-rw-r--r--docs/html/sdk/android-1.5.jd98
-rw-r--r--docs/html/sdk/download.jd4
-rw-r--r--docs/html/sdk/preview/features.html202
-rw-r--r--docs/html/sdk/preview/index.jd5
-rw-r--r--docs/html/sitemap.txt7525
-rw-r--r--graphics/java/android/graphics/BitmapFactory.java30
-rw-r--r--graphics/java/android/graphics/Canvas.java12
-rw-r--r--graphics/java/android/graphics/Matrix.java44
-rw-r--r--graphics/java/android/graphics/Rect.java45
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java115
-rw-r--r--include/ui/Camera.h3
-rw-r--r--include/utils/ResourceTypes.h275
-rw-r--r--include/utils/threads.h7
-rw-r--r--libs/surfaceflinger/GPUHardware/GPUHardware.cpp6
-rw-r--r--libs/surfaceflinger/Layer.cpp3
-rw-r--r--libs/surfaceflinger/VRamHeap.cpp2
-rw-r--r--libs/ui/Camera.cpp21
-rw-r--r--libs/utils/ResourceTypes.cpp2
-rw-r--r--location/data/Android.mk53
-rw-r--r--location/data/kml/kml2
-rw-r--r--location/data/kml/properties11
-rw-r--r--location/data/location1
-rw-r--r--location/data/nmea162
-rw-r--r--location/data/properties10
-rw-r--r--location/data/test/class1
-rw-r--r--location/data/track/properties10
-rw-r--r--location/data/track/track1
-rw-r--r--location/java/android/location/ILocationManager.aidl5
-rw-r--r--location/java/android/location/LocationManager.java10
-rw-r--r--location/java/android/location/LocationProvider.java4
-rw-r--r--location/java/com/android/internal/location/DummyLocationProvider.java (renamed from location/java/android/location/DummyLocationProvider.java)8
-rw-r--r--location/java/com/android/internal/location/GpsLocationProvider.java14
-rw-r--r--location/java/com/android/internal/location/GpsXtraDownloader.java10
-rw-r--r--location/java/com/android/internal/location/LocationProviderImpl.java (renamed from location/java/android/location/LocationProviderImpl.java)64
-rw-r--r--location/java/com/android/internal/location/LocationProviderProxy.java1
-rw-r--r--location/java/com/android/internal/location/MockProvider.java1
-rw-r--r--location/java/com/android/internal/location/TrackProvider.java732
-rw-r--r--media/libmediaplayerservice/MidiFile.cpp2
-rw-r--r--media/libmediaplayerservice/VorbisPlayer.cpp2
-rwxr-xr-xmedia/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java1
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java32
-rw-r--r--opengl/java/android/opengl/GLES10.java13
-rw-r--r--opengl/libs/EGL/egl.cpp35
-rw-r--r--opengl/libs/GLES_CM/gl.cpp1
-rw-r--r--opengl/libs/GLES_CM/gl_api.in905
-rw-r--r--opengl/libs/GLES_CM/gl_logger.cpp1060
-rw-r--r--opengl/libs/GLES_CM/glext_api.in270
-rw-r--r--opengl/libs/gl_entries.in327
-rw-r--r--opengl/libs/gl_logger.h26
-rw-r--r--opengl/libs/glext_entries.in90
-rw-r--r--opengl/libs/hooks.h1
-rwxr-xr-xopengl/libs/tools/genfiles20
-rwxr-xr-xopengl/libs/tools/glapigen71
-rwxr-xr-xopengl/libs/tools/glentrygen31
-rw-r--r--opengl/tools/glgen/specs/gles11/checks.spec84
-rw-r--r--opengl/tools/glgen/stubs/gles11/glGetString.java13
-rw-r--r--opengl/tools/glgen/stubs/gles11/glGetString.nativeReg2
-rw-r--r--services/java/com/android/server/AlarmManagerService.java73
-rw-r--r--services/java/com/android/server/AppWidgetService.java53
-rw-r--r--services/java/com/android/server/BackupManagerService.java195
-rw-r--r--services/java/com/android/server/IntentResolver.java46
-rw-r--r--services/java/com/android/server/LocationManagerService.java363
-rw-r--r--services/java/com/android/server/PackageManagerService.java126
-rw-r--r--services/java/com/android/server/SystemServer.java7
-rw-r--r--services/java/com/android/server/WindowManagerService.java434
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java156
-rw-r--r--services/java/com/android/server/am/AppBindRecord.java5
-rw-r--r--services/java/com/android/server/am/BatteryStatsService.java2
-rw-r--r--services/java/com/android/server/am/BroadcastFilter.java25
-rw-r--r--services/java/com/android/server/am/ConnectionRecord.java5
-rw-r--r--services/java/com/android/server/am/ContentProviderRecord.java34
-rw-r--r--services/java/com/android/server/am/HistoryRecord.java10
-rw-r--r--services/java/com/android/server/am/IntentBindRecord.java48
-rw-r--r--services/java/com/android/server/am/PendingIntentRecord.java45
-rw-r--r--services/java/com/android/server/am/ProcessRecord.java1
-rw-r--r--services/java/com/android/server/am/ReceiverList.java25
-rw-r--r--services/java/com/android/server/am/ServiceRecord.java62
-rw-r--r--services/java/com/android/server/am/TaskRecord.java74
-rw-r--r--services/java/com/android/server/am/UriPermission.java33
-rw-r--r--telephony/java/com/android/internal/telephony/IccConstants.java61
-rw-r--r--telephony/java/com/android/internal/telephony/IccFileHandler.java51
-rw-r--r--telephony/java/com/android/internal/telephony/RIL.java51
-rw-r--r--telephony/java/com/android/internal/telephony/ServiceStateTracker.java5
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java52
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java6
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/SmsMessage.java113
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java339
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/UserData.java27
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java75
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/MccTable.java6
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java44
-rw-r--r--test-runner/android/test/InstrumentationCoreTestRunner.java66
-rw-r--r--test-runner/android/test/TestLocationProvider.java3
-rw-r--r--test-runner/android/test/mock/MockContext.java8
-rw-r--r--tests/AndroidTests/res/values-32dpi/configVarying.xml (renamed from tests/AndroidTests/res/values-port/configVarying.xml)4
-rw-r--r--tests/AndroidTests/res/values-640x400/configVarying.xml (renamed from tests/AndroidTests/res/values-320x200/configVarying.xml)4
-rw-r--r--tests/AndroidTests/res/values-fr-rFR/configVarying.xml22
-rw-r--r--tests/AndroidTests/res/values-fr/configVarying.xml22
-rw-r--r--tests/AndroidTests/res/values-mcc110-xx/configVarying.xml (renamed from tests/AndroidTests/res/values-trackball/configVarying.xml)4
-rw-r--r--tests/AndroidTests/res/values-mcc112/configVarying.xml (renamed from tests/AndroidTests/res/values-qwerty/configVarying.xml)4
-rw-r--r--tests/AndroidTests/res/values-mnc220-xx/configVarying.xml22
-rw-r--r--tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml (renamed from tests/AndroidTests/res/values-keyshidden/configVarying.xml)4
-rw-r--r--tests/AndroidTests/res/values-mnc223/configVarying.xml (renamed from tests/AndroidTests/res/values-finger/configVarying.xml)4
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java150
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java374
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java445
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java314
-rw-r--r--tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java52
-rw-r--r--tools/layoutlib/bridge/.gitignore1
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java8
295 files changed, 17016 insertions, 11796 deletions
diff --git a/Android.mk b/Android.mk
index 88f023f..20c93e6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -70,6 +70,8 @@ LOCAL_SRC_FILES += \
core/java/android/app/ITransientNotification.aidl \
core/java/android/app/IWallpaperService.aidl \
core/java/android/app/IWallpaperServiceCallback.aidl \
+ core/java/android/backup/IBackupManager.aidl \
+ core/java/android/backup/IBackupService.aidl \
core/java/android/bluetooth/IBluetoothA2dp.aidl \
core/java/android/bluetooth/IBluetoothDevice.aidl \
core/java/android/bluetooth/IBluetoothDeviceCallback.aidl \
@@ -105,6 +107,7 @@ LOCAL_SRC_FILES += \
core/java/com/android/internal/app/IUsageStats.aidl \
core/java/com/android/internal/appwidget/IAppWidgetService.aidl \
core/java/com/android/internal/appwidget/IAppWidgetHost.aidl \
+ core/java/com/android/internal/backup/IBackupTransport.aidl \
core/java/com/android/internal/os/IResultReceiver.aidl \
core/java/com/android/internal/view/IInputContext.aidl \
core/java/com/android/internal/view/IInputContextCallback.aidl \
diff --git a/api/current.xml b/api/current.xml
index caffcaf..d99e42a 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -848,6 +848,17 @@
visibility="public"
>
</field>
+<field name="SDCARD_WRITE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.permission.SDCARD_WRITE&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="SEND_SMS"
type="java.lang.String"
transient="false"
@@ -1283,6 +1294,17 @@
visibility="public"
>
</field>
+<field name="STORAGE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.permission-group.STORAGE&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="SYSTEM_TOOLS"
type="java.lang.String"
transient="false"
@@ -1553,7 +1575,7 @@
type="int"
transient="false"
volatile="false"
- value="16843372"
+ value="16843373"
static="true"
final="true"
deprecated="not deprecated"
@@ -2605,6 +2627,17 @@
visibility="public"
>
</field>
+<field name="density"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843372"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="dependency"
type="int"
transient="false"
@@ -27084,6 +27117,17 @@
visibility="public"
>
</field>
+<field name="BACKUP_SERVICE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;backup&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="BIND_AUTO_CREATE"
type="int"
transient="false"
@@ -33853,6 +33897,17 @@
visibility="public"
>
</field>
+<field name="supportsDensities"
+ type="int[]"
+ transient="false"
+ volatile="false"
+ value="null"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="taskAffinity"
type="java.lang.String"
transient="false"
@@ -35843,6 +35898,17 @@
visibility="public"
>
</field>
+<field name="GET_SUPPORTS_DENSITIES"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="32768"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="GET_UNINSTALLED_PACKAGES"
type="int"
transient="false"
@@ -47422,7 +47488,7 @@
<method name="freeGlCaches"
return="void"
abstract="false"
- native="true"
+ native="false"
synchronized="false"
static="true"
final="false"
@@ -75477,19 +75543,6 @@
visibility="public"
>
</constructor>
-<method name="_glGetString"
- return="java.lang.String"
- abstract="false"
- native="true"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="name" type="int">
-</parameter>
-</method>
<method name="glActiveTexture"
return="void"
abstract="false"
@@ -76294,9 +76347,9 @@
<method name="glGetString"
return="java.lang.String"
abstract="false"
- native="false"
+ native="true"
synchronized="false"
- static="false"
+ static="true"
final="false"
deprecated="not deprecated"
visibility="public"
@@ -151860,6 +151913,25 @@
<parameter name="contentLength" type="long">
</parameter>
</method>
+<method name="onExceededDatabaseQuota"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="url" type="java.lang.String">
+</parameter>
+<parameter name="databaseIdentifier" type="java.lang.String">
+</parameter>
+<parameter name="currentQuota" type="long">
+</parameter>
+<parameter name="quotaUpdater" type="android.webkit.WebStorage.QuotaUpdater">
+</parameter>
+</method>
<method name="onFormResubmission"
return="void"
abstract="false"
@@ -153501,6 +153573,25 @@
<parameter name="resultMsg" type="android.os.Message">
</parameter>
</method>
+<method name="onExceededDatabaseQuota"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="url" type="java.lang.String">
+</parameter>
+<parameter name="databaseIdentifier" type="java.lang.String">
+</parameter>
+<parameter name="currentQuota" type="long">
+</parameter>
+<parameter name="quotaUpdater" type="android.webkit.WebStorage.QuotaUpdater">
+</parameter>
+</method>
<method name="onJsAlert"
return="boolean"
abstract="false"
@@ -153886,6 +153977,28 @@
visibility="public"
>
</method>
+<method name="getDatabaseEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getDatabasePath"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getDefaultFixedFontSize"
return="int"
abstract="false"
@@ -154226,6 +154339,32 @@
<parameter name="font" type="java.lang.String">
</parameter>
</method>
+<method name="setDatabaseEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="flag" type="boolean">
+</parameter>
+</method>
+<method name="setDatabasePath"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="databasePath" type="java.lang.String">
+</parameter>
+</method>
<method name="setDefaultFixedFontSize"
return="void"
abstract="false"
@@ -154780,6 +154919,44 @@
>
</method>
</class>
+<class name="WebStorage"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="WebStorage"
+ type="android.webkit.WebStorage"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+</class>
+<interface name="WebStorage.QuotaUpdater"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="updateQuota"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="newQuota" type="long">
+</parameter>
+</method>
+</interface>
<class name="WebSyncManager"
extends="java.lang.Object"
abstract="true"
@@ -159749,7 +159926,7 @@
</interface>
<class name="CheckedTextView"
extends="android.widget.TextView"
- abstract="true"
+ abstract="false"
static="false"
final="false"
deprecated="not deprecated"
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 09862d2..dfa3fa8 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -161,7 +161,7 @@ public final class ActivityThread {
return metrics;
}
- Resources getTopLevelResources(String appDir) {
+ Resources getTopLevelResources(String appDir, float applicationScale) {
synchronized (mPackages) {
//Log.w(TAG, "getTopLevelResources: " + appDir);
WeakReference<Resources> wr = mActiveResources.get(appDir);
@@ -181,7 +181,27 @@ public final class ActivityThread {
return null;
}
DisplayMetrics metrics = getDisplayMetricsLocked(false);
- r = new Resources(assets, metrics, getConfiguration());
+ // density used to load resources
+ // scaledDensity is calculated in Resources constructor
+ //
+ boolean usePreloaded = true;
+
+ // TODO: use explicit flag to indicate the compatibility mode.
+ if (applicationScale != 1.0f) {
+ usePreloaded = false;
+ DisplayMetrics newMetrics = new DisplayMetrics();
+ newMetrics.setTo(metrics);
+ float invertedScale = 1.0f / applicationScale;
+ newMetrics.density *= invertedScale;
+ newMetrics.xdpi *= invertedScale;
+ newMetrics.ydpi *= invertedScale;
+ newMetrics.widthPixels *= invertedScale;
+ newMetrics.heightPixels *= invertedScale;
+ metrics = newMetrics;
+ }
+ //Log.i(TAG, "Resource:" + appDir + ", density " + newMetrics.density + ", orig density:" +
+ // metrics.density);
+ r = new Resources(assets, metrics, getConfiguration(), usePreloaded);
//Log.i(TAG, "Created app resources " + r + ": " + r.getConfiguration());
// XXX need to remove entries when weak references go away
mActiveResources.put(appDir, new WeakReference<Resources>(r));
@@ -209,6 +229,8 @@ public final class ActivityThread {
private Resources mResources;
private ClassLoader mClassLoader;
private Application mApplication;
+ private float mApplicationScale;
+
private final HashMap<Context, HashMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers
= new HashMap<Context, HashMap<BroadcastReceiver, ReceiverDispatcher>>();
private final HashMap<Context, HashMap<BroadcastReceiver, ReceiverDispatcher>> mUnregisteredReceivers
@@ -241,8 +263,8 @@ public final class ActivityThread {
mSystemContext =
ApplicationContext.createSystemContext(mainThread);
mSystemContext.getResources().updateConfiguration(
- mainThread.getConfiguration(),
- mainThread.getDisplayMetricsLocked(false));
+ mainThread.getConfiguration(),
+ mainThread.getDisplayMetricsLocked(false));
//Log.i(TAG, "Created system resources "
// + mSystemContext.getResources() + ": "
// + mSystemContext.getResources().getConfiguration());
@@ -250,6 +272,8 @@ public final class ActivityThread {
mClassLoader = mSystemContext.getClassLoader();
mResources = mSystemContext.getResources();
}
+
+ mApplicationScale = -1.0f;
}
public PackageInfo(ActivityThread activityThread, String name,
@@ -268,6 +292,7 @@ public final class ActivityThread {
mIncludeCode = true;
mClassLoader = systemContext.getClassLoader();
mResources = systemContext.getResources();
+ mApplicationScale = systemContext.getApplicationScale();
}
public String getPackageName() {
@@ -278,6 +303,47 @@ public final class ActivityThread {
return mSecurityViolation;
}
+ public float getApplicationScale() {
+ if (mApplicationScale > 0.0f) {
+ return mApplicationScale;
+ }
+ DisplayMetrics metrics = mActivityThread.getDisplayMetricsLocked(false);
+ // Find out the density scale (relative to 160) of the supported density that
+ // is closest to the system's density.
+ try {
+ ApplicationInfo ai = getPackageManager().getApplicationInfo(
+ mPackageName, PackageManager.GET_SUPPORTS_DENSITIES);
+
+ float appScale = -1.0f;
+ if (ai.supportsDensities != null) {
+ // TODO: precompute this in DisplayMetrics
+ float systemDensityDpi = metrics.density * DisplayMetrics.DEFAULT_DENSITY;
+ int minDiff = Integer.MAX_VALUE;
+ for (int density : ai.supportsDensities) {
+ int tmpDiff = (int) Math.abs(systemDensityDpi - density);
+ if (tmpDiff == 0) {
+ appScale = 1.0f;
+ break;
+ }
+ // prefer higher density (appScale>1.0), unless that's only option.
+ if (tmpDiff < minDiff && appScale < 1.0f) {
+ appScale = systemDensityDpi / density;
+ minDiff = tmpDiff;
+ }
+ }
+ }
+ if (appScale < 0.0f) {
+ mApplicationScale = metrics.density;
+ } else {
+ mApplicationScale = appScale;
+ }
+ } catch (RemoteException e) {
+ throw new AssertionError(e);
+ }
+ if (localLOGV) Log.v(TAG, "appScale=" + mApplicationScale + ", pkg=" + mPackageName);
+ return mApplicationScale;
+ }
+
/**
* Gets the array of shared libraries that are listed as
* used by the given package.
@@ -435,7 +501,7 @@ public final class ActivityThread {
public Resources getResources(ActivityThread mainThread) {
if (mResources == null) {
- mResources = mainThread.getTopLevelResources(mResDir);
+ mResources = mainThread.getTopLevelResources(mResDir, getApplicationScale());
}
return mResources;
}
@@ -3496,6 +3562,9 @@ public final class ActivityThread {
int sqliteReleased = SQLiteDatabase.releaseMemory();
EventLog.writeEvent(SQLITE_MEM_RELEASED_EVENT_LOG_TAG, sqliteReleased);
}
+
+ // Ask graphics to free up as much as possible (font/image caches)
+ Canvas.freeCaches();
BinderInternal.forceGc("mem");
}
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index 94f3373..72d9e3d 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -553,6 +553,19 @@ class ApplicationContext extends Context {
}
}
+ /**
+ * @hide
+ */
+ @Override
+ public float getApplicationScale() {
+ if (mPackageInfo != null) {
+ return mPackageInfo.getApplicationScale();
+ } else {
+ // same as system density
+ return 1.0f;
+ }
+ }
+
@Override
public void setWallpaper(Bitmap bitmap) throws IOException {
try {
@@ -2024,9 +2037,11 @@ class ApplicationContext extends Context {
if (app.packageName.equals("system")) {
return mContext.mMainThread.getSystemContext().getResources();
}
+ ActivityThread.PackageInfo pi = mContext.mMainThread.getPackageInfoNoCheck(app);
Resources r = mContext.mMainThread.getTopLevelResources(
app.uid == Process.myUid() ? app.sourceDir
- : app.publicSourceDir);
+ : app.publicSourceDir,
+ pi.getApplicationScale());
if (r != null) {
return r;
}
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index 6c3617a..39eb4f1 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -22,4 +22,5 @@ import android.server.search.SearchableInfo;
/** @hide */
interface ISearchManager {
SearchableInfo getSearchableInfo(in ComponentName launchActivity, boolean globalSearch);
+ List<SearchableInfo> getSearchablesInGlobalSearch();
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 51fddb1..9834c75 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -34,6 +34,9 @@ import android.widget.RemoteViews;
* A class that represents how a persistent notification is to be presented to
* the user using the {@link android.app.NotificationManager}.
*
+ * <p>For a guide to creating notifications, see the
+ * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Creating Status
+ * Bar Notifications</a> document in the Dev Guide.</p>
*/
public class Notification implements Parcelable
{
@@ -52,7 +55,8 @@ public class Notification implements Parcelable
/**
* Use the default notification vibrate. This will ignore any given
- * {@link #vibrate}.
+ * {@link #vibrate}. Using phone vibration requires the
+ * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
*
* @see #defaults
*/
@@ -149,8 +153,7 @@ public class Notification implements Parcelable
/**
- * The pattern with which to vibrate. This pattern will repeat if {@link
- * #FLAG_INSISTENT} bit is set in the {@link #flags} field.
+ * The pattern with which to vibrate.
*
* <p>
* To vibrate the default pattern, see {@link #defaults}.
@@ -228,13 +231,8 @@ public class Notification implements Parcelable
/**
* Bit to be bitwise-ored into the {@link #flags} field that if set,
- * the audio and vibration will be repeated until the notification is
- * cancelled.
- *
- * <p>
- * NOTE: This notion will change when we have decided exactly
- * what the UI will be.
- * </p>
+ * the audio will be repeated until the notification is
+ * cancelled or the notification window is opened.
*/
public static final int FLAG_INSISTENT = 0x00000004;
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 1bed706..cb660c7 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -440,9 +440,13 @@ public final class PendingIntent implements Parcelable {
@Override
public String toString() {
- return "PendingIntent{"
- + Integer.toHexString(System.identityHashCode(this))
- + " target " + (mTarget != null ? mTarget.asBinder() : null) + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("PendingIntent{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(": ");
+ sb.append(mTarget != null ? mTarget.asBinder() : null);
+ sb.append('}');
+ return sb.toString();
}
public int describeContents() {
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index a0cdb63..cd44277 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -16,24 +16,24 @@
package android.app;
+import static android.app.SuggestionsAdapter.getColumnString;
+
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemClock;
import android.server.search.SearchableInfo;
import android.speech.RecognizerIntent;
@@ -45,7 +45,9 @@ import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
+import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
@@ -53,17 +55,15 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
-import android.widget.CursorAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
-import android.widget.WrapperListAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
-import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.WeakHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -75,59 +75,74 @@ import java.util.concurrent.atomic.AtomicLong;
public class SearchDialog extends Dialog implements OnItemClickListener, OnItemSelectedListener {
// Debugging support
- final static String LOG_TAG = "SearchDialog";
- private static final int DBG_LOG_TIMING = 0;
- final static int DBG_JAM_THREADING = 0;
+ private static final boolean DBG = false;
+ private static final String LOG_TAG = "SearchDialog";
+ private static final boolean DBG_LOG_TIMING = false;
- // interaction with runtime
- IntentFilter mCloseDialogsFilter;
- IntentFilter mPackageFilter;
-
private static final String INSTANCE_KEY_COMPONENT = "comp";
private static final String INSTANCE_KEY_APPDATA = "data";
private static final String INSTANCE_KEY_GLOBALSEARCH = "glob";
private static final String INSTANCE_KEY_DISPLAY_QUERY = "dQry";
private static final String INSTANCE_KEY_DISPLAY_SEL_START = "sel1";
private static final String INSTANCE_KEY_DISPLAY_SEL_END = "sel2";
- private static final String INSTANCE_KEY_USER_QUERY = "uQry";
- private static final String INSTANCE_KEY_SUGGESTION_QUERY = "sQry";
private static final String INSTANCE_KEY_SELECTED_ELEMENT = "slEl";
private static final int INSTANCE_SELECTED_BUTTON = -2;
private static final int INSTANCE_SELECTED_QUERY = -1;
-
+
+ private static final int SEARCH_PLATE_LEFT_PADDING_GLOBAL = 12;
+ private static final int SEARCH_PLATE_LEFT_PADDING_NON_GLOBAL = 7;
+
+ // interaction with runtime
+ private IntentFilter mCloseDialogsFilter;
+ private IntentFilter mPackageFilter;
+
// views & widgets
private TextView mBadgeLabel;
- private AutoCompleteTextView mSearchTextField;
+ private ImageView mAppIcon;
+ private SearchAutoComplete mSearchAutoComplete;
private Button mGoButton;
private ImageButton mVoiceButton;
+ private View mSearchPlate;
// interaction with searchable application
+ private SearchableInfo mSearchable;
private ComponentName mLaunchComponent;
private Bundle mAppSearchData;
private boolean mGlobalSearchMode;
private Context mActivityContext;
-
- // interaction with the search manager service
- private SearchableInfo mSearchable;
- // support for suggestions
- private String mUserQuery = null;
- private int mUserQuerySelStart;
- private int mUserQuerySelEnd;
- private boolean mLeaveJammedQueryOnRefocus = false;
- private String mPreviousSuggestionQuery = null;
- private int mPresetSelection = -1;
- private String mSuggestionAction = null;
- private Uri mSuggestionData = null;
- private String mSuggestionQuery = null;
+ // Values we store to allow user to toggle between in-app search and global search.
+ private ComponentName mStoredComponentName;
+ private Bundle mStoredAppSearchData;
+ // stack of previous searchables, to support the BACK key after
+ // SearchManager.INTENT_ACTION_CHANGE_SEARCH_SOURCE.
+ // The top of the stack (= previous searchable) is the last element of the list,
+ // since adding and removing is efficient at the end of an ArrayList.
+ private ArrayList<ComponentName> mPreviousComponents;
+
// For voice searching
private Intent mVoiceWebSearchIntent;
private Intent mVoiceAppSearchIntent;
// support for AutoCompleteTextView suggestions display
private SuggestionsAdapter mSuggestionsAdapter;
-
+
+ // Whether to rewrite queries when selecting suggestions
+ // TODO: This is disabled because of problems with persistent selections
+ // causing non-user-initiated rewrites.
+ private static final boolean REWRITE_QUERIES = false;
+
+ // The query entered by the user. This is not changed when selecting a suggestion
+ // that modifies the contents of the text field. But if the user then edits
+ // the suggestion, the resulting string is saved.
+ private String mUserQuery;
+
+ // A weak map of drawables we've gotten from other packages, so we don't load them
+ // more than once.
+ private final WeakHashMap<String, Drawable> mOutsideDrawablesCache =
+ new WeakHashMap<String, Drawable>();
+
/**
* Constructor - fires it up and makes it look like the search UI.
*
@@ -151,27 +166,35 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
setContentView(com.android.internal.R.layout.search_bar);
theWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
+ // taking up the whole window (even when transparent) is less than ideal,
+ // but necessary to show the popup window until the window manager supports
+ // having windows anchored by their parent but not clipped by them.
+ ViewGroup.LayoutParams.FILL_PARENT);
WindowManager.LayoutParams lp = theWindow.getAttributes();
- lp.setTitle("Search Dialog");
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
theWindow.setAttributes(lp);
// get the view elements for local access
mBadgeLabel = (TextView) findViewById(com.android.internal.R.id.search_badge);
- mSearchTextField = (AutoCompleteTextView)
+ mSearchAutoComplete = (SearchAutoComplete)
findViewById(com.android.internal.R.id.search_src_text);
+ mAppIcon = (ImageView) findViewById(com.android.internal.R.id.search_app_icon);
mGoButton = (Button) findViewById(com.android.internal.R.id.search_go_btn);
mVoiceButton = (ImageButton) findViewById(com.android.internal.R.id.search_voice_btn);
+ mSearchPlate = findViewById(com.android.internal.R.id.search_plate);
// attach listeners
- mSearchTextField.addTextChangedListener(mTextWatcher);
- mSearchTextField.setOnKeyListener(mTextKeyListener);
+ mSearchAutoComplete.addTextChangedListener(mTextWatcher);
+ mSearchAutoComplete.setOnKeyListener(mTextKeyListener);
+ mSearchAutoComplete.setOnItemClickListener(this);
+ mSearchAutoComplete.setOnItemSelectedListener(this);
mGoButton.setOnClickListener(mGoButtonClickListener);
mGoButton.setOnKeyListener(mButtonsKeyListener);
mVoiceButton.setOnClickListener(mVoiceButtonClickListener);
mVoiceButton.setOnKeyListener(mButtonsKeyListener);
+ mSearchAutoComplete.setSearchDialog(this);
+
// pre-hide all the extraneous elements
mBadgeLabel.setVisibility(View.GONE);
@@ -199,7 +222,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
/**
* Set up the search dialog
*
- * @param Returns true if search dialog launched, false if not
+ * @return true if search dialog launched, false if not
*/
public boolean show(String initialQuery, boolean selectInitialQuery,
ComponentName componentName, Bundle appSearchData, boolean globalSearch) {
@@ -208,75 +231,115 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
// in this case, just discard the "show" request
return true;
}
+
+ // Reset any stored values from last time dialog was shown.
+ mStoredComponentName = null;
+ mStoredAppSearchData = null;
+
+ return doShow(initialQuery, selectInitialQuery, componentName, appSearchData, globalSearch);
+ }
+
+
+ /**
+ * Called in response to a press of the hard search button in
+ * {@link #onKeyDown(int, KeyEvent)}, this method toggles between in-app
+ * search and global search when relevant.
+ *
+ * If pressed within an in-app search context, this switches the search dialog out to
+ * global search. If pressed within a global search context that was originally an in-app
+ * search context, this switches back to the in-app search context. If pressed within a
+ * global search context that has no original in-app search context (e.g., global search
+ * from Home), this does nothing.
+ *
+ * @return false if we wanted to toggle context but could not do so successfully, true
+ * in all other cases
+ */
+ private boolean toggleGlobalSearch() {
+ String currentSearchText = mSearchAutoComplete.getText().toString();
+ if (!mGlobalSearchMode) {
+ mStoredComponentName = mLaunchComponent;
+ mStoredAppSearchData = mAppSearchData;
+ return doShow(currentSearchText, false, null, mAppSearchData, true);
+ } else {
+ if (mStoredComponentName != null) {
+ // This means we should toggle *back* to an in-app search context from
+ // global search.
+ return doShow(currentSearchText, false, mStoredComponentName,
+ mStoredAppSearchData, false);
+ } else {
+ return true;
+ }
+ }
+ }
+
+ /**
+ * Does the rest of the work required to show the search dialog. Called by both
+ * {@link #show(String, boolean, ComponentName, Bundle, boolean)} and
+ * {@link #toggleGlobalSearch()}.
+ *
+ * @return true if search dialog showed, false if not
+ */
+ private boolean doShow(String initialQuery, boolean selectInitialQuery,
+ ComponentName componentName, Bundle appSearchData,
+ boolean globalSearch) {
+ // set up the searchable and show the dialog
+ if (!show(componentName, appSearchData, globalSearch)) {
+ return false;
+ }
- // Get searchable info from search manager and use to set up other elements of UI
- // Do this first so we can get out quickly if there's nothing to search
- ISearchManager sms;
- sms = ISearchManager.Stub.asInterface(ServiceManager.getService(Context.SEARCH_SERVICE));
- try {
- mSearchable = sms.getSearchableInfo(componentName, globalSearch);
- } catch (RemoteException e) {
- mSearchable = null;
+ // finally, load the user's initial text (which may trigger suggestions)
+ setUserQuery(initialQuery);
+ if (selectInitialQuery) {
+ mSearchAutoComplete.selectAll();
+ }
+
+ return true;
+ }
+
+ /**
+ * Sets up the search dialog and shows it.
+ *
+ * @return <code>true</code> if search dialog launched
+ */
+ private boolean show(ComponentName componentName, Bundle appSearchData,
+ boolean globalSearch) {
+
+ if (DBG) {
+ Log.d(LOG_TAG, "show(" + componentName + ", "
+ + appSearchData + ", " + globalSearch + ")");
}
+
+ mSearchable = SearchManager.getSearchableInfo(componentName, globalSearch);
if (mSearchable == null) {
// unfortunately, we can't log here. it would be logspam every time the user
// clicks the "search" key on a non-search app
return false;
}
- // OK, we're going to show ourselves
- super.show();
-
- setupSearchableInfo();
-
mLaunchComponent = componentName;
mAppSearchData = appSearchData;
- mGlobalSearchMode = globalSearch;
-
- // receive broadcasts
- getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
- getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
+ // Using globalSearch here is just an optimization, just calling
+ // isDefaultSearchable() should always give the same result.
+ mGlobalSearchMode = globalSearch || SearchManager.isDefaultSearchable(mSearchable);
+ mActivityContext = mSearchable.getActivityContext(getContext());
- // configure the autocomplete aspects of the input box
- mSearchTextField.setOnItemClickListener(this);
- mSearchTextField.setOnItemSelectedListener(this);
-
- // This conversion is necessary to force a preload of the EditText and thus force
- // suggestions to be presented (even for an empty query)
- if (initialQuery == null) {
- initialQuery = ""; // This forces the preload to happen, triggering suggestions
+ // show the dialog. this will call onStart().
+ if (!isShowing()) {
+ show();
}
- // attach the suggestions adapter, if suggestions are available
- // The existence of a suggestions authority is the proxy for "suggestions available here"
- if (mSearchable.getSuggestAuthority() == null) {
- mSuggestionsAdapter = null;
- mSearchTextField.setAdapter(mSuggestionsAdapter);
- mSearchTextField.setText(initialQuery);
- } else {
- mSuggestionsAdapter = new SuggestionsAdapter(getContext(), mSearchable,
- mSearchTextField);
- mSearchTextField.setAdapter(mSuggestionsAdapter);
-
- // finally, load the user's initial text (which may trigger suggestions)
- mSuggestionsAdapter.setNonUserQuery(false);
- mSearchTextField.setText(initialQuery);
- }
+ updateUI();
- if (selectInitialQuery) {
- mSearchTextField.selectAll();
- } else {
- mSearchTextField.setSelection(initialQuery.length());
- }
return true;
}
-
- /**
- * The default show() for this Dialog is not supported.
- */
+
@Override
- public void show() {
- return;
+ protected void onStart() {
+ super.onStart();
+
+ // receive broadcasts
+ getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
+ getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
}
/**
@@ -289,6 +352,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
public void onStop() {
super.onStop();
+ // TODO: Removing the listeners means that they never get called, since
+ // Dialog.dismissDialog() calls onStop() before sendDismissMessage().
setOnCancelListener(null);
setOnDismissListener(null);
@@ -299,26 +364,36 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
// This is OK - it just means we didn't have any registered
}
- // close any leftover cursor
- if (mSuggestionsAdapter != null) {
- mSuggestionsAdapter.changeCursor(null);
- }
+ closeSuggestionsAdapter();
// dump extra memory we're hanging on to
mLaunchComponent = null;
mAppSearchData = null;
mSearchable = null;
- mSuggestionAction = null;
- mSuggestionData = null;
- mSuggestionQuery = null;
mActivityContext = null;
- mPreviousSuggestionQuery = null;
mUserQuery = null;
+ mPreviousComponents = null;
+ }
+
+ /**
+ * Closes and gets rid of the suggestions adapter.
+ */
+ private void closeSuggestionsAdapter() {
+ // remove the adapter from the autocomplete first, to avoid any updates
+ // when we drop the cursor
+ mSearchAutoComplete.setAdapter((SuggestionsAdapter)null);
+ // close any leftover cursor
+ if (mSuggestionsAdapter != null) {
+ mSuggestionsAdapter.changeCursor(null);
+ }
+ mSuggestionsAdapter = null;
}
/**
* Save the minimal set of data necessary to recreate the search
*
+ * TODO: go through this and make sure that it saves everything that is needed
+ *
* @return A bundle with the state of the dialog.
*/
@Override
@@ -331,16 +406,14 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
bundle.putBoolean(INSTANCE_KEY_GLOBALSEARCH, mGlobalSearchMode);
// UI state
- bundle.putString(INSTANCE_KEY_DISPLAY_QUERY, mSearchTextField.getText().toString());
- bundle.putInt(INSTANCE_KEY_DISPLAY_SEL_START, mSearchTextField.getSelectionStart());
- bundle.putInt(INSTANCE_KEY_DISPLAY_SEL_END, mSearchTextField.getSelectionEnd());
- bundle.putString(INSTANCE_KEY_USER_QUERY, mUserQuery);
- bundle.putString(INSTANCE_KEY_SUGGESTION_QUERY, mPreviousSuggestionQuery);
+ bundle.putString(INSTANCE_KEY_DISPLAY_QUERY, mSearchAutoComplete.getText().toString());
+ bundle.putInt(INSTANCE_KEY_DISPLAY_SEL_START, mSearchAutoComplete.getSelectionStart());
+ bundle.putInt(INSTANCE_KEY_DISPLAY_SEL_END, mSearchAutoComplete.getSelectionEnd());
int selectedElement = INSTANCE_SELECTED_QUERY;
if (mGoButton.isFocused()) {
selectedElement = INSTANCE_SELECTED_BUTTON;
- } else if (mSearchTextField.isPopupShowing()) {
+ } else if (mSearchAutoComplete.isPopupShowing()) {
selectedElement = 0; // TODO mSearchTextField.getListSelection() // 0..n
}
bundle.putInt(INSTANCE_KEY_SELECTED_ELEMENT, selectedElement);
@@ -350,6 +423,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
/**
* Restore the state of the dialog from a previously saved bundle.
+ *
+ * TODO: go through this and make sure that it saves everything that is saved
*
* @param savedInstanceState The state of the dialog previously saved by
* {@link #onSaveInstanceState()}.
@@ -365,26 +440,17 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
String displayQuery = savedInstanceState.getString(INSTANCE_KEY_DISPLAY_QUERY);
int querySelStart = savedInstanceState.getInt(INSTANCE_KEY_DISPLAY_SEL_START, -1);
int querySelEnd = savedInstanceState.getInt(INSTANCE_KEY_DISPLAY_SEL_END, -1);
- String userQuery = savedInstanceState.getString(INSTANCE_KEY_USER_QUERY);
int selectedElement = savedInstanceState.getInt(INSTANCE_KEY_SELECTED_ELEMENT);
- String suggestionQuery = savedInstanceState.getString(INSTANCE_KEY_SUGGESTION_QUERY);
// show the dialog. skip any show/hide animation, we want to go fast.
// send the text that actually generates the suggestions here; we'll replace the display
// text as necessary in a moment.
- if (!show(suggestionQuery, false, launchComponent, appSearchData, globalSearch)) {
+ if (!show(displayQuery, false, launchComponent, appSearchData, globalSearch)) {
// for some reason, we couldn't re-instantiate
return;
}
- if (mSuggestionsAdapter != null) {
- mSuggestionsAdapter.setNonUserQuery(true);
- }
- mSearchTextField.setText(displayQuery);
- // TODO because the new query is (not) processed in another thread, we can't just
- // take away this flag (yet). The better solution here is going to require a new API
- // in AutoCompleteTextView which allows us to change the text w/o changing the suggestions.
-// mSuggestionsAdapter.setNonUserQuery(false);
+ mSearchAutoComplete.setText(displayQuery);
// clean up the selection state
switch (selectedElement) {
@@ -395,40 +461,38 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
break;
case INSTANCE_SELECTED_QUERY:
if (querySelStart >= 0 && querySelEnd >= 0) {
- mSearchTextField.requestFocus();
- mSearchTextField.setSelection(querySelStart, querySelEnd);
+ mSearchAutoComplete.requestFocus();
+ mSearchAutoComplete.setSelection(querySelStart, querySelEnd);
}
break;
default:
- // defer selecting a list element until suggestion list appears
- mPresetSelection = selectedElement;
- // TODO mSearchTextField.setListSelection(selectedElement)
+ // TODO: defer selecting a list element until suggestion list appears
+// mSearchAutoComplete.setListSelection(selectedElement)
break;
}
}
/**
- * Hook for updating layout on a rotation
- *
+ * Called after resources have changed, e.g. after screen rotation or locale change.
*/
public void onConfigurationChanged(Configuration newConfig) {
if (isShowing()) {
// Redraw (resources may have changed)
updateSearchButton();
+ updateSearchAppIcon();
updateSearchBadge();
updateQueryHint();
}
}
-
+
/**
- * Use SearchableInfo record (from search manager service) to preconfigure the UI in various
- * ways.
+ * Update the UI according to the info in the current value of {@link #mSearchable}.
*/
- private void setupSearchableInfo() {
+ private void updateUI() {
if (mSearchable != null) {
- mActivityContext = mSearchable.getActivityContext(getContext());
-
+ updateSearchAutoComplete();
updateSearchButton();
+ updateSearchAppIcon();
updateSearchBadge();
updateQueryHint();
updateVoiceButton();
@@ -449,24 +513,38 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
inputType |= InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE;
}
}
- mSearchTextField.setInputType(inputType);
- mSearchTextField.setImeOptions(mSearchable.getImeOptions());
+ mSearchAutoComplete.setInputType(inputType);
+ mSearchAutoComplete.setImeOptions(mSearchable.getImeOptions());
}
}
-
+
/**
- * The list of installed packages has just changed. This means that our current context
- * may no longer be valid. This would only happen if a package is installed/removed exactly
- * when the search bar is open. So for now we're just going to close the search
- * bar.
- *
- * Anything fancier would require some checks to see if the user's context was still valid.
- * Which would be messier.
+ * Updates the auto-complete text view.
*/
- public void onPackageListChange() {
- cancel();
+ private void updateSearchAutoComplete() {
+ // close any existing suggestions adapter
+ closeSuggestionsAdapter();
+
+ mSearchAutoComplete.setDropDownAnimationStyle(0); // no animation
+ mSearchAutoComplete.setThreshold(mSearchable.getSuggestThreshold());
+
+ if (mGlobalSearchMode) {
+ mSearchAutoComplete.setDropDownAlwaysVisible(true); // fill space until results come in
+ mSearchAutoComplete.setDropDownDismissedOnCompletion(false);
+ } else {
+ mSearchAutoComplete.setDropDownAlwaysVisible(false);
+ mSearchAutoComplete.setDropDownDismissedOnCompletion(true);
+ }
+
+ // attach the suggestions adapter, if suggestions are available
+ // The existence of a suggestions authority is the proxy for "suggestions available here"
+ if (mSearchable.getSuggestAuthority() != null) {
+ mSuggestionsAdapter = new SuggestionsAdapter(getContext(), mSearchable,
+ mOutsideDrawablesCache);
+ mSearchAutoComplete.setAdapter(mSuggestionsAdapter);
+ }
}
-
+
/**
* Update the text in the search button. Note: This is deprecated functionality, for
* 1.0 compatibility only.
@@ -481,26 +559,56 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
iconLabel = getContext().getResources().
getDrawable(com.android.internal.R.drawable.ic_btn_search);
}
- mGoButton.setText(textLabel);
+ mGoButton.setText(textLabel);
mGoButton.setCompoundDrawablesWithIntrinsicBounds(iconLabel, null, null, null);
}
+ private void updateSearchAppIcon() {
+ if (mGlobalSearchMode) {
+ mAppIcon.setImageResource(0);
+ mAppIcon.setVisibility(View.GONE);
+ mSearchPlate.setPadding(SEARCH_PLATE_LEFT_PADDING_GLOBAL,
+ mSearchPlate.getPaddingTop(),
+ mSearchPlate.getPaddingRight(),
+ mSearchPlate.getPaddingBottom());
+ } else {
+ PackageManager pm = getContext().getPackageManager();
+ Drawable icon = null;
+ try {
+ ActivityInfo info = pm.getActivityInfo(mLaunchComponent, 0);
+ icon = pm.getApplicationIcon(info.applicationInfo);
+ if (DBG) Log.d(LOG_TAG, "Using app-specific icon");
+ } catch (NameNotFoundException e) {
+ icon = pm.getDefaultActivityIcon();
+ Log.w(LOG_TAG, mLaunchComponent + " not found, using generic app icon");
+ }
+ mAppIcon.setImageDrawable(icon);
+ mAppIcon.setVisibility(View.VISIBLE);
+ mSearchPlate.setPadding(SEARCH_PLATE_LEFT_PADDING_NON_GLOBAL,
+ mSearchPlate.getPaddingTop(),
+ mSearchPlate.getPaddingRight(),
+ mSearchPlate.getPaddingBottom());
+ }
+ }
+
/**
- * Setup the search "Badge" if request by mode flags.
+ * Setup the search "Badge" if requested by mode flags.
*/
private void updateSearchBadge() {
// assume both hidden
int visibility = View.GONE;
Drawable icon = null;
- String text = null;
+ CharSequence text = null;
// optionally show one or the other.
if (mSearchable.mBadgeIcon) {
icon = mActivityContext.getResources().getDrawable(mSearchable.getIconId());
visibility = View.VISIBLE;
+ if (DBG) Log.d(LOG_TAG, "Using badge icon: " + mSearchable.getIconId());
} else if (mSearchable.mBadgeLabel) {
text = mActivityContext.getResources().getText(mSearchable.getLabelId()).toString();
visibility = View.VISIBLE;
+ if (DBG) Log.d(LOG_TAG, "Using badge label: " + mSearchable.getLabelId());
}
mBadgeLabel.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
@@ -520,7 +628,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
hint = mActivityContext.getString(hintId);
}
}
- mSearchTextField.setHint(hint);
+ mSearchAutoComplete.setHint(hint);
}
}
@@ -553,58 +661,83 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
/**
+ * {@link Dialog#onTouchEvent(MotionEvent)} will cancel the dialog only when the
+ * touch is outside the window. But the window includes space for the drop-down,
+ * so we also cancel on taps outside the search bar when the drop-down is not showing.
+ */
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // cancel if the drop-down is not showing and the touch event was outside the search plate
+ if (!mSearchAutoComplete.isPopupShowing() && isOutOfBounds(mSearchPlate, event)) {
+ if (DBG) Log.d(LOG_TAG, "Pop-up not showing and outside of search plate.");
+ cancel();
+ return true;
+ }
+ // Let Dialog handle events outside the window while the pop-up is showing.
+ return super.onTouchEvent(event);
+ }
+
+ private boolean isOutOfBounds(View v, MotionEvent event) {
+ final int x = (int) event.getX();
+ final int y = (int) event.getY();
+ final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
+ return (x < -slop) || (y < -slop)
+ || (x > (v.getWidth()+slop))
+ || (y > (v.getHeight()+slop));
+ }
+
+ /**
* Dialog's OnKeyListener implements various search-specific functionality
*
* @param keyCode This is the keycode of the typed key, and is the same value as
- * found in the KeyEvent parameter.
+ * found in the KeyEvent parameter.
* @param event The complete event record for the typed key
*
* @return Return true if the event was handled here, or false if not.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_BACK:
- cancel();
+ if (DBG) Log.d(LOG_TAG, "onKeyDown(" + keyCode + "," + event + ")");
+
+ // handle back key to go back to previous searchable, etc.
+ if (handleBackKey(keyCode, event)) {
return true;
- case KeyEvent.KEYCODE_SEARCH:
- if (TextUtils.getTrimmedLength(mSearchTextField.getText()) != 0) {
- launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null);
- } else {
- cancel();
- }
+ }
+
+ if (keyCode == KeyEvent.KEYCODE_SEARCH) {
+ // If the search key is pressed, toggle between global and in-app search. If we are
+ // currently doing global search and there is no in-app search context to toggle to,
+ // just don't do anything.
+ return toggleGlobalSearch();
+ }
+
+ // if it's an action specified by the searchable activity, launch the
+ // entered query with the action key
+ SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
+ if ((actionKey != null) && (actionKey.mQueryActionMsg != null)) {
+ launchQuerySearch(keyCode, actionKey.mQueryActionMsg);
return true;
- default:
- SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
- if ((actionKey != null) && (actionKey.mQueryActionMsg != null)) {
- launchQuerySearch(keyCode, actionKey.mQueryActionMsg);
- return true;
- }
- break;
}
+
return false;
}
-
+
/**
* Callback to watch the textedit field for empty/non-empty
*/
private TextWatcher mTextWatcher = new TextWatcher() {
- public void beforeTextChanged(CharSequence s, int start, int
- before, int after) { }
+ public void beforeTextChanged(CharSequence s, int start, int before, int after) { }
public void onTextChanged(CharSequence s, int start,
int before, int after) {
- if (DBG_LOG_TIMING == 1) {
+ if (DBG_LOG_TIMING) {
dbgLogTiming("onTextChanged()");
}
updateWidgetState();
- // Only do suggestions if actually typed by user
- if ((mSuggestionsAdapter != null) && !mSuggestionsAdapter.getNonUserQuery()) {
- mPreviousSuggestionQuery = s.toString();
- mUserQuery = mSearchTextField.getText().toString();
- mUserQuerySelStart = mSearchTextField.getSelectionStart();
- mUserQuerySelEnd = mSearchTextField.getSelectionEnd();
+ if (!mSearchAutoComplete.isPerformingCompletion()) {
+ // The user changed the query, remember it.
+ mUserQuery = s == null ? "" : s.toString();
}
}
@@ -616,64 +749,34 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
private void updateWidgetState() {
// enable the button if we have one or more non-space characters
- boolean enabled =
- TextUtils.getTrimmedLength(mSearchTextField.getText()) != 0;
-
+ boolean enabled = !mSearchAutoComplete.isEmpty();
mGoButton.setEnabled(enabled);
mGoButton.setFocusable(enabled);
}
- private final static String[] ONE_LINE_FROM = {SearchManager.SUGGEST_COLUMN_TEXT_1 };
- private final static String[] ONE_LINE_ICONS_FROM = {SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_ICON_1,
- SearchManager.SUGGEST_COLUMN_ICON_2};
- private final static String[] TWO_LINE_FROM = {SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_TEXT_2 };
- private final static String[] TWO_LINE_ICONS_FROM = {SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_TEXT_2,
- SearchManager.SUGGEST_COLUMN_ICON_1,
- SearchManager.SUGGEST_COLUMN_ICON_2 };
-
- private final static int[] ONE_LINE_TO = {com.android.internal.R.id.text1};
- private final static int[] ONE_LINE_ICONS_TO = {com.android.internal.R.id.text1,
- com.android.internal.R.id.icon1,
- com.android.internal.R.id.icon2};
- private final static int[] TWO_LINE_TO = {com.android.internal.R.id.text1,
- com.android.internal.R.id.text2};
- private final static int[] TWO_LINE_ICONS_TO = {com.android.internal.R.id.text1,
- com.android.internal.R.id.text2,
- com.android.internal.R.id.icon1,
- com.android.internal.R.id.icon2};
-
- /**
- * Safely retrieve the suggestions cursor adapter from the ListView
- *
- * @param adapterView The ListView containing our adapter
- * @result The CursorAdapter that we installed, or null if not set
- */
- private static CursorAdapter getSuggestionsAdapter(AdapterView<?> adapterView) {
- CursorAdapter result = null;
- if (adapterView != null) {
- Object ad = adapterView.getAdapter();
- if (ad instanceof CursorAdapter) {
- result = (CursorAdapter) ad;
- } else if (ad instanceof WrapperListAdapter) {
- result = (CursorAdapter) ((WrapperListAdapter)ad).getWrappedAdapter();
- }
- }
- return result;
- }
-
/**
* React to typing in the GO search button by refocusing to EditText.
* Continue typing the query.
*/
View.OnKeyListener mButtonsKeyListener = new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
- // also guard against possible race conditions (late arrival after dismiss)
- if (mSearchable != null) {
- return refocusingKeyListener(v, keyCode, event);
+ // guard against possible race conditions
+ if (mSearchable == null) {
+ return false;
}
+
+ if (!event.isSystem() &&
+ (keyCode != KeyEvent.KEYCODE_DPAD_UP) &&
+ (keyCode != KeyEvent.KEYCODE_DPAD_DOWN) &&
+ (keyCode != KeyEvent.KEYCODE_DPAD_LEFT) &&
+ (keyCode != KeyEvent.KEYCODE_DPAD_RIGHT) &&
+ (keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) {
+ // restore focus and give key to EditText ...
+ if (mSearchAutoComplete.requestFocus()) {
+ return mSearchAutoComplete.dispatchKeyEvent(event);
+ }
+ }
+
return false;
}
};
@@ -683,10 +786,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
View.OnClickListener mGoButtonClickListener = new View.OnClickListener() {
public void onClick(View v) {
- // also guard against possible race conditions (late arrival after dismiss)
- if (mSearchable != null) {
- launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null);
+ // guard against possible race conditions
+ if (mSearchable == null) {
+ return;
}
+ launchQuerySearch();
}
};
@@ -695,14 +799,16 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
View.OnClickListener mVoiceButtonClickListener = new View.OnClickListener() {
public void onClick(View v) {
+ // guard against possible race conditions
+ if (mSearchable == null) {
+ return;
+ }
try {
if (mSearchable.getVoiceSearchLaunchWebSearch()) {
getContext().startActivity(mVoiceWebSearchIntent);
- dismiss();
} else if (mSearchable.getVoiceSearchLaunchRecognizer()) {
Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent);
getContext().startActivity(appSearchIntent);
- dismiss();
}
} catch (ActivityNotFoundException e) {
// Should not happen, since we check the availability of
@@ -778,136 +884,56 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
View.OnKeyListener mTextKeyListener = new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- cancel();
- return true;
- }
- // also guard against possible race conditions (late arrival after dismiss)
- if (mSearchable != null &&
- TextUtils.getTrimmedLength(mSearchTextField.getText()) > 0) {
- if (DBG_LOG_TIMING == 1) {
- dbgLogTiming("doTextKey()");
- }
- // dispatch "typing in the list" first
- if (mSearchTextField.isPopupShowing() &&
- mSearchTextField.getListSelection() != ListView.INVALID_POSITION) {
- return onSuggestionsKey(v, keyCode, event);
- }
- // otherwise, dispatch an "edit view" key
- switch (keyCode) {
- case KeyEvent.KEYCODE_ENTER:
- if (event.getAction() == KeyEvent.ACTION_UP) {
- v.cancelLongPress();
- launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null);
- return true;
- }
- break;
- case KeyEvent.KEYCODE_DPAD_DOWN:
- // capture the EditText state, so we can restore the user entry later
- mUserQuery = mSearchTextField.getText().toString();
- mUserQuerySelStart = mSearchTextField.getSelectionStart();
- mUserQuerySelEnd = mSearchTextField.getSelectionEnd();
- // pass through - we're just watching here
- break;
- default:
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
- if ((actionKey != null) && (actionKey.mQueryActionMsg != null)) {
- launchQuerySearch(keyCode, actionKey.mQueryActionMsg);
- return true;
- }
- }
- break;
- }
+ // guard against possible race conditions
+ if (mSearchable == null) {
+ return false;
}
- return false;
- }
- };
- /**
- * React to the user typing while the suggestions are focused. First, check for action
- * keys. If not handled, try refocusing regular characters into the EditText. In this case,
- * replace the query text (start typing fresh text).
- */
- private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) {
- boolean handled = false;
- // also guard against possible race conditions (late arrival after dismiss)
- if (mSearchable != null) {
- handled = doSuggestionsKey(v, keyCode, event);
- }
- return handled;
- }
-
- /**
- * Per UI design, we're going to "steer" any typed keystrokes back into the EditText
- * box, even if the user has navigated the focus to the dropdown or to the GO button.
- *
- * @param v The view into which the keystroke was typed
- * @param keyCode keyCode of entered key
- * @param event Full KeyEvent record of entered key
- */
- private boolean refocusingKeyListener(View v, int keyCode, KeyEvent event) {
- boolean handled = false;
-
- if (!event.isSystem() &&
- (keyCode != KeyEvent.KEYCODE_DPAD_UP) &&
- (keyCode != KeyEvent.KEYCODE_DPAD_DOWN) &&
- (keyCode != KeyEvent.KEYCODE_DPAD_LEFT) &&
- (keyCode != KeyEvent.KEYCODE_DPAD_RIGHT) &&
- (keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) {
- // restore focus and give key to EditText ...
- // but don't replace the user's query
- mLeaveJammedQueryOnRefocus = true;
- if (mSearchTextField.requestFocus()) {
- handled = mSearchTextField.dispatchKeyEvent(event);
+ if (DBG_LOG_TIMING) dbgLogTiming("doTextKey()");
+ if (DBG) {
+ Log.d(LOG_TAG, "mTextListener.onKey(" + keyCode + "," + event
+ + "), selection: " + mSearchAutoComplete.getListSelection());
}
- mLeaveJammedQueryOnRefocus = false;
- }
- return handled;
- }
-
- /**
- * Update query text based on transitions in and out of suggestions list.
- */
- /*
- * TODO - figure out if this logic is required for the autocomplete text view version
-
- OnFocusChangeListener mSuggestFocusListener = new OnFocusChangeListener() {
- public void onFocusChange(View v, boolean hasFocus) {
- // also guard against possible race conditions (late arrival after dismiss)
- if (mSearchable == null) {
- return;
+
+ // If a suggestion is selected, handle enter, search key, and action keys
+ // as presses on the selected suggestion
+ if (mSearchAutoComplete.isPopupShowing() &&
+ mSearchAutoComplete.getListSelection() != ListView.INVALID_POSITION) {
+ return onSuggestionsKey(v, keyCode, event);
}
- // Update query text based on navigation in to/out of the suggestions list
- if (hasFocus) {
- // Entering the list view - record selection point from user's query
- mUserQuery = mSearchTextField.getText().toString();
- mUserQuerySelStart = mSearchTextField.getSelectionStart();
- mUserQuerySelEnd = mSearchTextField.getSelectionEnd();
- // then update the query to match the entered selection
- jamSuggestionQuery(true, mSuggestionsList,
- mSuggestionsList.getSelectedItemPosition());
- } else {
- // Exiting the list view
-
- if (mSuggestionsList.getSelectedItemPosition() < 0) {
- // Direct exit - Leave new suggestion in place (do nothing)
- } else {
- // Navigation exit - restore user's query text
- if (!mLeaveJammedQueryOnRefocus) {
- jamSuggestionQuery(false, null, -1);
+
+ // If there is text in the query box, handle enter, and action keys
+ // The search key is handled by the dialog's onKeyDown().
+ if (!mSearchAutoComplete.isEmpty()) {
+ if (keyCode == KeyEvent.KEYCODE_ENTER
+ && event.getAction() == KeyEvent.ACTION_UP) {
+ v.cancelLongPress();
+ launchQuerySearch();
+ return true;
+ }
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
+ if ((actionKey != null) && (actionKey.mQueryActionMsg != null)) {
+ launchQuerySearch(keyCode, actionKey.mQueryActionMsg);
+ return true;
}
}
}
-
+ return false;
}
};
- */
-
+
/**
- * This is the listener for the ACTION_CLOSE_SYSTEM_DIALOGS intent. It's an indication that
- * we should close ourselves immediately, in order to allow a higher-priority UI to take over
+ * When the ACTION_CLOSE_SYSTEM_DIALOGS intent is received, we should close ourselves
+ * immediately, in order to allow a higher-priority UI to take over
* (e.g. phone call received).
+ *
+ * When a package is added, removed or changed, our current context
+ * may no longer be valid. This would only happen if a package is installed/removed exactly
+ * when the search bar is open. So for now we're just going to close the search
+ * bar.
+ * Anything fancier would require some checks to see if the user's context was still valid.
+ * Which would be messier.
*/
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -918,7 +944,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
} else if (Intent.ACTION_PACKAGE_ADDED.equals(action)
|| Intent.ACTION_PACKAGE_REMOVED.equals(action)
|| Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
- onPackageListChange();
+ cancel();
}
}
};
@@ -938,58 +964,45 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
/**
- * Various ways to launch searches
- */
-
- /**
- * React to the user clicking the "GO" button. Hide the UI and launch a search.
- *
- * @param actionKey Pass a keycode if the launch was triggered by an action key. Pass
- * KeyEvent.KEYCODE_UNKNOWN for no actionKey code.
- * @param actionMsg Pass the suggestion-provided message if the launch was triggered by an
- * action key. Pass null for no actionKey message.
+ * React to the user typing while in the suggestions list. First, check for action
+ * keys. If not handled, try refocusing regular characters into the EditText.
*/
- private void launchQuerySearch(int actionKey, final String actionMsg) {
- final String query = mSearchTextField.getText().toString();
- final Bundle appData = mAppSearchData;
- final SearchableInfo si = mSearchable; // cache briefly (dismiss() nulls it)
- dismiss();
- sendLaunchIntent(Intent.ACTION_SEARCH, null, query, appData, actionKey, actionMsg, si);
- }
-
- /**
- * React to the user typing an action key while in the suggestions list
- */
- private boolean doSuggestionsKey(View v, int keyCode, KeyEvent event) {
- // Exit early in case of race condition
+ private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) {
+ // guard against possible race conditions (late arrival after dismiss)
+ if (mSearchable == null) {
+ return false;
+ }
if (mSuggestionsAdapter == null) {
return false;
}
if (event.getAction() == KeyEvent.ACTION_DOWN) {
- if (DBG_LOG_TIMING == 1) {
- dbgLogTiming("doSuggestionsKey()");
+ if (DBG_LOG_TIMING) {
+ dbgLogTiming("onSuggestionsKey()");
}
// First, check for enter or search (both of which we'll treat as a "click")
if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) {
- int position = mSearchTextField.getListSelection();
- return launchSuggestion(mSuggestionsAdapter, position);
+ int position = mSearchAutoComplete.getListSelection();
+ return launchSuggestion(position);
}
// Next, check for left/right moves, which we use to "return" the user to the edit view
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
- // give "focus" to text editor, but don't restore the user's original query
+ // give "focus" to text editor, with cursor at the beginning if
+ // left key, at end if right key
+ // TODO: Reverse left/right for right-to-left languages, e.g. Arabic
int selPoint = (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) ?
- 0 : mSearchTextField.length();
- mSearchTextField.setSelection(selPoint);
- mSearchTextField.setListSelection(0);
- mSearchTextField.clearListSelection();
+ 0 : mSearchAutoComplete.length();
+ mSearchAutoComplete.setSelection(selPoint);
+ mSearchAutoComplete.setListSelection(0);
+ mSearchAutoComplete.clearListSelection();
return true;
}
// Next, check for an "up and out" move
- if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mSearchTextField.getListSelection()) {
- jamSuggestionQuery(false, null, -1);
+ if (keyCode == KeyEvent.KEYCODE_DPAD_UP
+ && 0 == mSearchAutoComplete.getListSelection()) {
+ restoreUserQuery();
// let ACTV complete the move
return false;
}
@@ -999,158 +1012,194 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
if ((actionKey != null) &&
((actionKey.mSuggestActionMsg != null) ||
(actionKey.mSuggestActionMsgColumn != null))) {
- // launch suggestion using action key column
- int position = mSearchTextField.getListSelection();
- if (position >= 0) {
+ // launch suggestion using action key column
+ int position = mSearchAutoComplete.getListSelection();
+ if (position != ListView.INVALID_POSITION) {
Cursor c = mSuggestionsAdapter.getCursor();
if (c.moveToPosition(position)) {
final String actionMsg = getActionKeyMessage(c, actionKey);
if (actionMsg != null && (actionMsg.length() > 0)) {
- // shut down search bar and launch the activity
- // cache everything we need because dismiss releases mems
- setupSuggestionIntent(c, mSearchable);
- final String query = mSearchTextField.getText().toString();
- final Bundle appData = mAppSearchData;
- SearchableInfo si = mSearchable;
- String suggestionAction = mSuggestionAction;
- Uri suggestionData = mSuggestionData;
- String suggestionQuery = mSuggestionQuery;
- dismiss();
- sendLaunchIntent(suggestionAction, suggestionData,
- suggestionQuery, appData,
- keyCode, actionMsg, si);
- return true;
+ return launchSuggestion(position, keyCode, actionMsg);
}
}
}
}
}
return false;
- }
+ }
+
+ /**
+ * Launch a search for the text in the query text field.
+ */
+ protected void launchQuerySearch() {
+ launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null);
+ }
/**
- * Set or reset the user query to follow the selections in the suggestions
+ * Launch a search for the text in the query text field.
+ *
+ * @param actionKey The key code of the action key that was pressed,
+ * or {@link KeyEvent#KEYCODE_UNKNOWN} if none.
+ * @param actionMsg The message for the action key that was pressed,
+ * or <code>null</code> if none.
+ */
+ protected void launchQuerySearch(int actionKey, String actionMsg) {
+ String query = mSearchAutoComplete.getText().toString();
+ Intent intent = createIntent(Intent.ACTION_SEARCH, null, query, null,
+ actionKey, actionMsg);
+ launchIntent(intent);
+ }
+
+ /**
+ * Launches an intent based on a suggestion.
*
- * @param jamQuery True means to set the query, false means to reset it to the user's choice
+ * @param position The index of the suggestion to create the intent from.
+ * @return true if a successful launch, false if could not (e.g. bad position).
*/
- private void jamSuggestionQuery(boolean jamQuery, AdapterView<?> parent, int position) {
- // quick check against race conditions
- if (mSearchable == null) {
+ protected boolean launchSuggestion(int position) {
+ return launchSuggestion(position, KeyEvent.KEYCODE_UNKNOWN, null);
+ }
+
+ /**
+ * Launches an intent based on a suggestion.
+ *
+ * @param position The index of the suggestion to create the intent from.
+ * @param actionKey The key code of the action key that was pressed,
+ * or {@link KeyEvent#KEYCODE_UNKNOWN} if none.
+ * @param actionMsg The message for the action key that was pressed,
+ * or <code>null</code> if none.
+ * @return true if a successful launch, false if could not (e.g. bad position).
+ */
+ protected boolean launchSuggestion(int position, int actionKey, String actionMsg) {
+ Cursor c = mSuggestionsAdapter.getCursor();
+ if ((c != null) && c.moveToPosition(position)) {
+ Intent intent = createIntentFromSuggestion(c, actionKey, actionMsg);
+ launchIntent(intent);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Launches an intent. Also dismisses the search dialog if not in global search mode.
+ */
+ private void launchIntent(Intent intent) {
+ if (intent == null) {
return;
}
-
- mSuggestionsAdapter.setNonUserQuery(true); // disables any suggestions processing
- if (jamQuery) {
- CursorAdapter ca = getSuggestionsAdapter(parent);
- Cursor c = ca.getCursor();
- if (c.moveToPosition(position)) {
- setupSuggestionIntent(c, mSearchable);
- String jamText = null;
-
- // Simple heuristic for selecting text with which to rewrite the query.
- if (mSuggestionQuery != null) {
- jamText = mSuggestionQuery;
- } else if (mSearchable.mQueryRewriteFromData && (mSuggestionData != null)) {
- jamText = mSuggestionData.toString();
- } else if (mSearchable.mQueryRewriteFromText) {
- try {
- int column = c.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1);
- jamText = c.getString(column);
- } catch (RuntimeException e) {
- // no work here, jamText is null
- }
- }
- if (jamText != null) {
- mSearchTextField.setText(jamText);
- /* mSearchTextField.selectAll(); */ // this didn't work anyway in the old UI
- // TODO this is only needed in the model where we have a selection in the ACTV
- // and in the dropdown at the same time.
- mSearchTextField.setSelection(jamText.length());
- }
- }
- } else {
- // reset user query
- mSearchTextField.setText(mUserQuery);
- try {
- mSearchTextField.setSelection(mUserQuerySelStart, mUserQuerySelEnd);
- } catch (IndexOutOfBoundsException e) {
- // In case of error, just select all
- Log.e(LOG_TAG, "Caught IndexOutOfBoundsException while setting selection. " +
- "start=" + mUserQuerySelStart + " end=" + mUserQuerySelEnd +
- " text=\"" + mUserQuery + "\"");
- mSearchTextField.selectAll();
- }
+ if (handleSpecialIntent(intent)){
+ return;
+ }
+ if (!mGlobalSearchMode) {
+ dismiss();
}
- // TODO because the new query is (not) processed in another thread, we can't just
- // take away this flag (yet). The better solution here is going to require a new API
- // in AutoCompleteTextView which allows us to change the text w/o changing the suggestions.
-// mSuggestionsAdapter.setNonUserQuery(false);
+ getContext().startActivity(intent);
}
-
+
/**
- * Assemble a search intent and send it.
- *
- * @param action The intent to send, typically Intent.ACTION_SEARCH
- * @param data The data for the intent
- * @param query The user text entered (so far)
- * @param appData The app data bundle (if supplied)
- * @param actionKey If the intent was triggered by an action key, e.g. KEYCODE_CALL, it will
- * be sent here. Pass KeyEvent.KEYCODE_UNKNOWN for no actionKey code.
- * @param actionMsg If the intent was triggered by an action key, e.g. KEYCODE_CALL, the
- * corresponding tag message will be sent here. Pass null for no actionKey message.
- * @param si Reference to the current SearchableInfo. Passed here so it can be used even after
- * we've called dismiss(), which attempts to null mSearchable.
+ * Handles the special intent actions declared in {@link SearchManager}.
+ *
+ * @return <code>true</code> if the intent was handled.
*/
- private void sendLaunchIntent(final String action, final Uri data, final String query,
- final Bundle appData, int actionKey, final String actionMsg, final SearchableInfo si) {
- Intent launcher = new Intent(action);
-
- if (query != null) {
- launcher.putExtra(SearchManager.QUERY, query);
+ private boolean handleSpecialIntent(Intent intent) {
+ String action = intent.getAction();
+ if (SearchManager.INTENT_ACTION_CHANGE_SEARCH_SOURCE.equals(action)) {
+ handleChangeSourceIntent(intent);
+ return true;
+ } else if (SearchManager.INTENT_ACTION_CURSOR_RESPOND.equals(action)) {
+ handleCursorRespondIntent(intent);
+ return true;
}
-
- if (data != null) {
- launcher.setData(data);
+ return false;
+ }
+
+ /**
+ * Handles SearchManager#INTENT_ACTION_CHANGE_SOURCE.
+ */
+ private void handleChangeSourceIntent(Intent intent) {
+ Uri dataUri = intent.getData();
+ if (dataUri == null) {
+ Log.w(LOG_TAG, "SearchManager.INTENT_ACTION_CHANGE_SOURCE without intent data.");
+ return;
}
-
- if (appData != null) {
- launcher.putExtra(SearchManager.APP_DATA, appData);
+ ComponentName componentName = ComponentName.unflattenFromString(dataUri.toString());
+ if (componentName == null) {
+ Log.w(LOG_TAG, "Invalid ComponentName: " + dataUri);
+ return;
}
-
- // add launch info (action key, etc.)
- if (actionKey != KeyEvent.KEYCODE_UNKNOWN) {
- launcher.putExtra(SearchManager.ACTION_KEY, actionKey);
- launcher.putExtra(SearchManager.ACTION_MSG, actionMsg);
+ if (DBG) Log.d(LOG_TAG, "Switching to " + componentName);
+
+ ComponentName previous = mLaunchComponent;
+ if (!show(componentName, mAppSearchData, false)) {
+ Log.w(LOG_TAG, "Failed to switch to source " + componentName);
+ return;
}
+ pushPreviousComponent(previous);
- // attempt to enforce security requirement (no 3rd-party intents)
- launcher.setComponent(si.mSearchActivity);
-
- getContext().startActivity(launcher);
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ setUserQuery(query);
}
-
+
/**
- * Shared code for launching a query from a suggestion.
- * @param ca The cursor adapter containing the suggestions
- * @param position The suggestion we'll be launching from
- * @return true if a successful launch, false if could not (e.g. bad position)
+ * Handles {@link SearchManager#INTENT_ACTION_CURSOR_RESPOND}.
*/
- private boolean launchSuggestion(CursorAdapter ca, int position) {
- Cursor c = ca.getCursor();
- if ((c != null) && c.moveToPosition(position)) {
- setupSuggestionIntent(c, mSearchable);
-
- final Bundle appData = mAppSearchData;
- SearchableInfo si = mSearchable;
- String suggestionAction = mSuggestionAction;
- Uri suggestionData = mSuggestionData;
- String suggestionQuery = mSuggestionQuery;
- dismiss();
- sendLaunchIntent(suggestionAction, suggestionData, suggestionQuery, appData,
- KeyEvent.KEYCODE_UNKNOWN, null, si);
- return true;
+ private void handleCursorRespondIntent(Intent intent) {
+ Cursor c = mSuggestionsAdapter.getCursor();
+ if (c != null) {
+ c.respond(intent.getExtras());
}
- return false;
+ }
+
+ /**
+ * Saves the previous component that was searched, so that we can go
+ * back to it.
+ */
+ private void pushPreviousComponent(ComponentName componentName) {
+ if (mPreviousComponents == null) {
+ mPreviousComponents = new ArrayList<ComponentName>();
+ }
+ mPreviousComponents.add(componentName);
+ }
+
+ /**
+ * Pops the previous component off the stack and returns it.
+ *
+ * @return The component name, or <code>null</code> if there was
+ * no previous component.
+ */
+ private ComponentName popPreviousComponent() {
+ if (mPreviousComponents == null) {
+ return null;
+ }
+ int size = mPreviousComponents.size();
+ if (size == 0) {
+ return null;
+ }
+ return mPreviousComponents.remove(size - 1);
+ }
+
+ /**
+ * Goes back to the previous component that was searched, if any.
+ *
+ * @return <code>true</code> if there was a previous component that we could go back to.
+ */
+ private boolean backToPreviousComponent() {
+ ComponentName previous = popPreviousComponent();
+ if (previous == null) {
+ return false;
+ }
+ if (!show(previous, mAppSearchData, false)) {
+ Log.w(LOG_TAG, "Failed to switch to source " + previous);
+ return false;
+ }
+
+ // must touch text to trigger suggestions
+ // TODO: should this be the text as it was when the user left
+ // the source that we are now going back to?
+ String query = mSearchAutoComplete.getText().toString();
+ setUserQuery(query);
+
+ return true;
}
/**
@@ -1159,62 +1208,43 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
* and/or falling back to the XML for defaults; It also creates REST style Uri data when
* the suggestion includes a data id.
*
- * NOTE: Return values are in member variables mSuggestionAction & mSuggestionData.
- *
* @param c The suggestions cursor, moved to the row of the user's selection
- * @param si The searchable activity's info record
+ * @param actionKey The key code of the action key that was pressed,
+ * or {@link KeyEvent#KEYCODE_UNKNOWN} if none.
+ * @param actionMsg The message for the action key that was pressed,
+ * or <code>null</code> if none.
+ * @return An intent for the suggestion at the cursor's position.
*/
- void setupSuggestionIntent(Cursor c, SearchableInfo si) {
+ private Intent createIntentFromSuggestion(Cursor c, int actionKey, String actionMsg) {
try {
// use specific action if supplied, or default action if supplied, or fixed default
- mSuggestionAction = null;
- int mColumn = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_ACTION);
- if (mColumn >= 0) {
- final String action = c.getString(mColumn);
- if (action != null) {
- mSuggestionAction = action;
- }
- }
- if (mSuggestionAction == null) {
- mSuggestionAction = si.getSuggestIntentAction();
+ String action = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_ACTION);
+ if (action == null) {
+ action = mSearchable.getSuggestIntentAction();
}
- if (mSuggestionAction == null) {
- mSuggestionAction = Intent.ACTION_SEARCH;
+ if (action == null) {
+ action = Intent.ACTION_SEARCH;
}
// use specific data if supplied, or default data if supplied
- String data = null;
- mColumn = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_DATA);
- if (mColumn >= 0) {
- final String rowData = c.getString(mColumn);
- if (rowData != null) {
- data = rowData;
- }
- }
+ String data = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA);
if (data == null) {
- data = si.getSuggestIntentData();
+ data = mSearchable.getSuggestIntentData();
}
-
// then, if an ID was provided, append it.
if (data != null) {
- mColumn = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
- if (mColumn >= 0) {
- final String id = c.getString(mColumn);
- if (id != null) {
- data = data + "/" + Uri.encode(id);
- }
+ String id = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
+ if (id != null) {
+ data = data + "/" + Uri.encode(id);
}
}
- mSuggestionData = (data == null) ? null : Uri.parse(data);
+ Uri dataUri = (data == null) ? null : Uri.parse(data);
+
+ String extraData = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA);
- mSuggestionQuery = null;
- mColumn = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_QUERY);
- if (mColumn >= 0) {
- final String query = c.getString(mColumn);
- if (query != null) {
- mSuggestionQuery = query;
- }
- }
+ String query = getColumnString(c, SearchManager.SUGGEST_COLUMN_QUERY);
+
+ return createIntent(action, dataUri, query, extraData, actionKey, actionMsg);
} catch (RuntimeException e ) {
int rowNum;
try { // be really paranoid now
@@ -1224,10 +1254,49 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
Log.w(LOG_TAG, "Search Suggestions cursor at row " + rowNum +
" returned exception" + e.toString());
+ return null;
}
}
/**
+ * Constructs an intent from the given information and the search dialog state.
+ *
+ * @param action Intent action.
+ * @param data Intent data, or <code>null</code>.
+ * @param query Intent query, or <code>null</code>.
+ * @param extraData Data for {@link SearchManager#EXTRA_DATA_KEY} or <code>null</code>.
+ * @param actionKey The key code of the action key that was pressed,
+ * or {@link KeyEvent#KEYCODE_UNKNOWN} if none.
+ * @param actionMsg The message for the action key that was pressed,
+ * or <code>null</code> if none.
+ * @return The intent.
+ */
+ private Intent createIntent(String action, Uri data, String query, String extraData,
+ int actionKey, String actionMsg) {
+ // Now build the Intent
+ Intent intent = new Intent(action);
+ if (data != null) {
+ intent.setData(data);
+ }
+ if (query != null) {
+ intent.putExtra(SearchManager.QUERY, query);
+ }
+ if (extraData != null) {
+ intent.putExtra(SearchManager.EXTRA_DATA_KEY, extraData);
+ }
+ if (mAppSearchData != null) {
+ intent.putExtra(SearchManager.APP_DATA, mAppSearchData);
+ }
+ if (actionKey != KeyEvent.KEYCODE_UNKNOWN) {
+ intent.putExtra(SearchManager.ACTION_KEY, actionKey);
+ intent.putExtra(SearchManager.ACTION_MSG, actionMsg);
+ }
+ // attempt to enforce security requirement (no 3rd-party intents)
+ intent.setComponent(mSearchable.mSearchActivity);
+ return intent;
+ }
+
+ /**
* For a given suggestion and a given cursor row, get the action message. If not provided
* by the specific row/column, also check for a single definition (for the action key).
*
@@ -1236,17 +1305,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*
* @return Returns a string, or null if no action key message for this suggestion
*/
- private String getActionKeyMessage(Cursor c, final SearchableInfo.ActionKeyInfo actionKey) {
+ private static String getActionKeyMessage(Cursor c, SearchableInfo.ActionKeyInfo actionKey) {
String result = null;
// check first in the cursor data, for a suggestion-specific message
final String column = actionKey.mSuggestActionMsgColumn;
if (column != null) {
- try {
- int colId = c.getColumnIndexOrThrow(column);
- result = c.getString(colId);
- } catch (RuntimeException e) {
- // OK - result is already null
- }
+ result = SuggestionsAdapter.getColumnString(c, column);
}
// If the cursor didn't give us a message, see if there's a single message defined
// for the actionkey (for all suggestions)
@@ -1257,343 +1321,179 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
/**
- * Local subclass for AutoCompleteTextView
- *
- * This exists entirely to override the threshold method. Otherwise we just use the class
- * as-is.
+ * Local subclass for AutoCompleteTextView.
*/
public static class SearchAutoComplete extends AutoCompleteTextView {
+ private int mThreshold;
+ private SearchDialog mSearchDialog;
+
public SearchAutoComplete(Context context) {
super(null);
+ mThreshold = getThreshold();
}
public SearchAutoComplete(Context context, AttributeSet attrs) {
super(context, attrs);
+ mThreshold = getThreshold();
}
public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ mThreshold = getThreshold();
}
-
- /**
- * We never allow ACTV to automatically replace the text, since we use "jamSuggestionQuery"
- * to do that. There's no point in letting ACTV do this here, because in the search UI,
- * as soon as we click a suggestion, we're going to start shutting things down.
- */
- @Override
- public void replaceText(CharSequence text) {
+
+ private void setSearchDialog(SearchDialog searchDialog) {
+ mSearchDialog = searchDialog;
}
- /**
- * We always return true, so that the effective threshold is "zero". This allows us
- * to provide "null" suggestions such as "just show me some recent entries".
- */
@Override
- public boolean enoughToFilter() {
- return true;
+ public void setThreshold(int threshold) {
+ super.setThreshold(threshold);
+ mThreshold = threshold;
}
- }
-
- /**
- * Support for AutoCompleteTextView-based suggestions
- */
- /**
- * This class provides the filtering-based interface to suggestions providers.
- * It is hardwired in a couple of places to support GoogleSearch - for example, it supports
- * two-line suggestions, but it does not support icons.
- */
- private static class SuggestionsAdapter extends SimpleCursorAdapter {
- private final String TAG = "SuggestionsAdapter";
-
- SearchableInfo mSearchable;
- private Resources mProviderResources;
-
- // These private variables are shared by the filter thread and must be protected
- private WeakReference<Cursor> mRecentCursor = new WeakReference<Cursor>(null);
- private boolean mNonUserQuery = false;
- private AutoCompleteTextView mParentView;
- public SuggestionsAdapter(Context context, SearchableInfo searchable,
- AutoCompleteTextView actv) {
- super(context, -1, null, null, null);
- mSearchable = searchable;
- mParentView = actv;
-
- // set up provider resources (gives us icons, etc.)
- Context activityContext = mSearchable.getActivityContext(mContext);
- Context providerContext = mSearchable.getProviderContext(mContext, activityContext);
- mProviderResources = providerContext.getResources();
- }
-
/**
- * Set this field (temporarily!) to disable suggestions updating. This allows us
- * to change the string in the text view without changing the suggestions list.
+ * Returns true if the text field is empty, or contains only whitespace.
*/
- public void setNonUserQuery(boolean nonUserQuery) {
- synchronized (this) {
- mNonUserQuery = nonUserQuery;
- }
+ private boolean isEmpty() {
+ return TextUtils.getTrimmedLength(getText()) == 0;
}
- public boolean getNonUserQuery() {
- synchronized (this) {
- return mNonUserQuery;
- }
- }
-
/**
- * Use the search suggestions provider to obtain a live cursor. This will be called
- * in a worker thread, so it's OK if the query is slow (e.g. round trip for suggestions).
- * The results will be processed in the UI thread and changeCursor() will be called.
- *
- * In order to provide the Search Mgr functionality of seeing your query change as you
- * scroll through the list, we have to be able to jam new text into the string without
- * retriggering the suggestions. We do that here via the "nonUserQuery" flag. In that
- * case we simply return the existing cursor.
- *
- * TODO: Dianne suggests that this should simply be promoted into an AutoCompleteTextView
- * behavior (perhaps optionally).
- *
- * TODO: The "nonuserquery" logic has a race condition because it happens in another thread.
- * This also needs to be fixed.
+ * Clears the entered text.
*/
- @Override
- public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
- String query = (constraint == null) ? "" : constraint.toString();
- Cursor c = null;
- synchronized (this) {
- if (mNonUserQuery) {
- c = mRecentCursor.get();
- mNonUserQuery = false;
- }
- }
- if (c == null) {
- c = getSuggestions(mSearchable, query);
- synchronized (this) {
- mRecentCursor = new WeakReference<Cursor>(c);
- }
- }
- return c;
+ private void clear() {
+ setText("");
}
/**
- * Overriding changeCursor() allows us to change not only the cursor, but by sampling
- * the cursor's columns, the actual display characteristics of the list.
+ * We override this method to avoid replacing the query box text
+ * when a suggestion is clicked.
*/
@Override
- public void changeCursor(Cursor c) {
-
- // first, check for various conditions that disqualify this cursor
- if ((c == null) || (c.getCount() == 0)) {
- // no cursor, or cursor with no data
- changeCursorAndColumns(null, null, null);
- if (c != null) {
- c.close();
- }
- return;
- }
-
- // check cursor before trying to create list views from it
- int colId = c.getColumnIndex("_id");
- int col1 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
- int col2 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2);
- int colIc1 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1);
- int colIc2 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2);
-
- boolean minimal = (colId >= 0) && (col1 >= 0);
- boolean hasIcons = (colIc1 >= 0) && (colIc2 >= 0);
- boolean has2Lines = col2 >= 0;
-
- if (minimal) {
- int layout;
- String[] from;
- int[] to;
-
- if (hasIcons) {
- if (has2Lines) {
- layout = com.android.internal.R.layout.search_dropdown_item_icons_2line;
- from = TWO_LINE_ICONS_FROM;
- to = TWO_LINE_ICONS_TO;
- } else {
- layout = com.android.internal.R.layout.search_dropdown_item_icons_1line;
- from = ONE_LINE_ICONS_FROM;
- to = ONE_LINE_ICONS_TO;
- }
- } else {
- if (has2Lines) {
- layout = com.android.internal.R.layout.search_dropdown_item_2line;
- from = TWO_LINE_FROM;
- to = TWO_LINE_TO;
- } else {
- layout = com.android.internal.R.layout.search_dropdown_item_1line;
- from = ONE_LINE_FROM;
- to = ONE_LINE_TO;
- }
- }
- // Force the underlying ListView to discard and reload all layouts
- // (Note, this should be optimized for cases where layout/cursor remain same)
- mParentView.resetListAndClearViews();
- // Now actually set up the cursor, columns, and the list view
- changeCursorAndColumns(c, from, to);
- setViewResource(layout);
- } else {
- // Provide some help for developers instead of just silently discarding
- Log.w(LOG_TAG, "Suggestions cursor discarded due to missing required columns.");
- changeCursorAndColumns(null, null, null);
- c.close();
- }
- if ((colIc1 >= 0) != (colIc2 >= 0)) {
- Log.w(LOG_TAG, "Suggestion icon column(s) discarded, must be 0 or 2 columns.");
- }
+ protected void replaceText(CharSequence text) {
}
/**
- * Overriding this allows us to write the selected query back into the box.
- * NOTE: This is a vastly simplified version of SearchDialog.jamQuery() and does
- * not universally support the search API. But it is sufficient for Google Search.
+ * We override this method so that we can allow a threshold of zero, which ACTV does not.
*/
@Override
- public CharSequence convertToString(Cursor cursor) {
- CharSequence result = null;
- if (cursor != null) {
- int column = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_QUERY);
- if (column >= 0) {
- final String query = cursor.getString(column);
- if (query != null) {
- result = query;
- }
- }
- }
- return result;
- }
-
- /**
- * Get the query cursor for the search suggestions.
- *
- * TODO this is functionally identical to the version in SearchDialog.java. Perhaps it
- * could be hoisted into SearchableInfo or some other shared spot.
- *
- * @param query The search text entered (so far)
- * @return Returns a cursor with suggestions, or null if no suggestions
- */
- private Cursor getSuggestions(final SearchableInfo searchable, final String query) {
- Cursor cursor = null;
- if (searchable.getSuggestAuthority() != null) {
- try {
- StringBuilder uriStr = new StringBuilder("content://");
- uriStr.append(searchable.getSuggestAuthority());
-
- // if content path provided, insert it now
- final String contentPath = searchable.getSuggestPath();
- if (contentPath != null) {
- uriStr.append('/');
- uriStr.append(contentPath);
- }
-
- // append standard suggestion query path
- uriStr.append('/' + SearchManager.SUGGEST_URI_PATH_QUERY);
-
- // inject query, either as selection args or inline
- String[] selArgs = null;
- if (searchable.getSuggestSelection() != null) { // use selection if provided
- selArgs = new String[] {query};
- } else {
- uriStr.append('/'); // no sel, use REST pattern
- uriStr.append(Uri.encode(query));
- }
-
- // finally, make the query
- cursor = mContext.getContentResolver().query(
- Uri.parse(uriStr.toString()), null,
- searchable.getSuggestSelection(), selArgs,
- null);
- } catch (RuntimeException e) {
- Log.w(TAG, "Search Suggestions query returned exception " + e.toString());
- cursor = null;
- }
- }
-
- return cursor;
+ public boolean enoughToFilter() {
+ return mThreshold <= 0 || super.enoughToFilter();
}
/**
- * Overriding this allows us to affect the way that an icon is loaded. Specifically,
- * we can be more controlling about the resource path (and allow icons to come from other
- * packages).
- *
- * TODO: This is 100% identical to the version in SearchDialog.java
- *
- * @param v ImageView to receive an image
- * @param value the value retrieved from the cursor
+ * {@link AutoCompleteTextView#onKeyPreIme(int, KeyEvent)}) dismisses the drop-down on BACK,
+ * so we must override this method to modify the BACK behavior.
*/
@Override
- public void setViewImage(ImageView v, String value) {
- int resID;
- Drawable img = null;
-
- try {
- resID = Integer.parseInt(value);
- if (resID != 0) {
- img = mProviderResources.getDrawable(resID);
+ public boolean onKeyPreIme(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (mSearchDialog.backToPreviousComponent()) {
+ return true;
}
- } catch (NumberFormatException nfe) {
- // img = null;
- } catch (NotFoundException e2) {
- // img = null;
+ return false; // will dismiss soft keyboard if necessary
}
-
- // finally, set the image to whatever we've gotten
- v.setImageDrawable(img);
+ return false;
}
-
- /**
- * This method is overridden purely to provide a bit of protection against
- * flaky content providers.
- *
- * TODO: This is 100% identical to the version in SearchDialog.java
- *
- * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
- */
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- try {
- return super.getView(position, convertView, parent);
- } catch (RuntimeException e) {
- Log.w(TAG, "Search Suggestions cursor returned exception " + e.toString());
- // what can I return here?
- View v = newView(mContext, mCursor, parent);
- if (v != null) {
- TextView tv = (TextView) v.findViewById(com.android.internal.R.id.text1);
- tv.setText(e.toString());
- }
- return v;
+ }
+
+ protected boolean handleBackKey(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (backToPreviousComponent()) {
+ return true;
}
+ cancel();
+ return true;
}
-
+ return false;
}
/**
* Implements OnItemClickListener
*/
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- // Log.d(LOG_TAG, "onItemClick() position " + position);
- launchSuggestion(mSuggestionsAdapter, position);
+ if (DBG) Log.d(LOG_TAG, "onItemClick() position " + position);
+ launchSuggestion(position);
}
-
+
/**
* Implements OnItemSelectedListener
*/
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- // Log.d(LOG_TAG, "onItemSelected() position " + position);
- jamSuggestionQuery(true, parent, position);
+ if (DBG) Log.d(LOG_TAG, "onItemSelected() position " + position);
+ // A suggestion has been selected, rewrite the query if possible,
+ // otherwise the restore the original query.
+ if (REWRITE_QUERIES) {
+ rewriteQueryFromSuggestion(position);
+ }
}
/**
* Implements OnItemSelectedListener
*/
public void onNothingSelected(AdapterView<?> parent) {
- // Log.d(LOG_TAG, "onNothingSelected()");
+ if (DBG) Log.d(LOG_TAG, "onNothingSelected()");
+ }
+
+ /**
+ * Query rewriting.
+ */
+
+ private void rewriteQueryFromSuggestion(int position) {
+ Cursor c = mSuggestionsAdapter.getCursor();
+ if (c == null) {
+ return;
+ }
+ if (c.moveToPosition(position)) {
+ // Get the new query from the suggestion.
+ CharSequence newQuery = mSuggestionsAdapter.convertToString(c);
+ if (newQuery != null) {
+ // The suggestion rewrites the query.
+ if (DBG) Log.d(LOG_TAG, "Rewriting query to '" + newQuery + "'");
+ // Update the text field, without getting new suggestions.
+ setQuery(newQuery);
+ } else {
+ // The suggestion does not rewrite the query, restore the user's query.
+ if (DBG) Log.d(LOG_TAG, "Suggestion gives no rewrite, restoring user query.");
+ restoreUserQuery();
+ }
+ } else {
+ // We got a bad position, restore the user's query.
+ Log.w(LOG_TAG, "Bad suggestion position: " + position);
+ restoreUserQuery();
+ }
+ }
+
+ /**
+ * Restores the query entered by the user if needed.
+ */
+ private void restoreUserQuery() {
+ if (DBG) Log.d(LOG_TAG, "Restoring query to '" + mUserQuery + "'");
+ setQuery(mUserQuery);
+ }
+
+ /**
+ * Sets the text in the query box, without updating the suggestions.
+ */
+ private void setQuery(CharSequence query) {
+ mSearchAutoComplete.setText(query, false);
+ if (query != null) {
+ mSearchAutoComplete.setSelection(query.length());
+ }
+ }
+
+ /**
+ * Sets the text in the query box, updating the suggestions.
+ */
+ private void setUserQuery(String query) {
+ if (query == null) {
+ query = "";
+ }
+ mUserQuery = query;
+ mSearchAutoComplete.setText(query);
+ mSearchAutoComplete.setSelection(query.length());
}
/**
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index ecdd3f8..39f3bcd 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -17,14 +17,21 @@
package android.app;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
+import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.os.RemoteException;
import android.os.ServiceManager;
+import android.server.search.SearchableInfo;
import android.view.KeyEvent;
+import java.util.List;
+
/**
* This class provides access to the system search services.
*
@@ -439,20 +446,18 @@ import android.view.KeyEvent;
*
* <tr><th>{@link #SUGGEST_COLUMN_ICON_1}</th>
* <td>If your cursor includes this column, then all suggestions will be provided in an
- * icons+text format. This value should be a reference (resource ID) of the icon to
+ * icons+text format. This value should be a reference to the icon to
* draw on the left side, or it can be null or zero to indicate no icon in this row.
- * You must provide both cursor columns, or neither.
* </td>
- * <td align="center">No, but required if you also have {@link #SUGGEST_COLUMN_ICON_2}</td>
+ * <td align="center">No.</td>
* </tr>
*
* <tr><th>{@link #SUGGEST_COLUMN_ICON_2}</th>
* <td>If your cursor includes this column, then all suggestions will be provided in an
- * icons+text format. This value should be a reference (resource ID) of the icon to
+ * icons+text format. This value should be a reference to the icon to
* draw on the right side, or it can be null or zero to indicate no icon in this row.
- * You must provide both cursor columns, or neither.
* </td>
- * <td align="center">No, but required if you also have {@link #SUGGEST_COLUMN_ICON_1}</td>
+ * <td align="center">No.</td>
* </tr>
*
* <tr><th>{@link #SUGGEST_COLUMN_INTENT_ACTION}</th>
@@ -1155,6 +1160,13 @@ public class SearchManager
public final static String ACTION_KEY = "action_key";
/**
+ * Intent extra data key: This key will be used for the extra populated by the
+ * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column.
+ * {@hide}
+ */
+ public final static String EXTRA_DATA_KEY = "intent_extra_data_key";
+
+ /**
* Intent extra data key: Use this key with Intent.ACTION_SEARCH and
* {@link android.content.Intent#getStringExtra content.Intent.getStringExtra()}
* to obtain the action message that was defined for a particular search action key and/or
@@ -1195,21 +1207,59 @@ public class SearchManager
public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
/**
* Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column,
- * then all suggestions will be provided in format that includes space for two small icons,
+ * then all suggestions will be provided in a format that includes space for two small icons,
* one at the left and one at the right of each suggestion. The data in the column must
- * be a a resource ID for the icon you wish to have displayed. If you include this column,
- * you must also include {@link #SUGGEST_COLUMN_ICON_2}.
+ * be a resource ID of a drawable, or a URI in one of the following formats:
+ *
+ * <ul>
+ * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
+ * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
+ * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
+ * </ul>
+ *
+ * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)}
+ * for more information on these schemes.
*/
public final static String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
/**
* Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column,
- * then all suggestions will be provided in format that includes space for two small icons,
+ * then all suggestions will be provided in a format that includes space for two small icons,
* one at the left and one at the right of each suggestion. The data in the column must
- * be a a resource ID for the icon you wish to have displayed. If you include this column,
- * you must also include {@link #SUGGEST_COLUMN_ICON_1}.
+ * be a resource ID of a drawable, or a URI in one of the following formats:
+ *
+ * <ul>
+ * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
+ * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
+ * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
+ * </ul>
+ *
+ * See {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)}
+ * for more information on these schemes.
*/
public final static String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
/**
+ * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column,
+ * then all suggestions will be provided in a format that includes space for two small icons,
+ * one at the left and one at the right of each suggestion. The data in the column must
+ * be a blob that contains a bitmap.
+ *
+ * This column overrides any icon provided in the {@link #SUGGEST_COLUMN_ICON_1} column.
+ *
+ * @hide
+ */
+ public final static String SUGGEST_COLUMN_ICON_1_BITMAP = "suggest_icon_1_bitmap";
+ /**
+ * Column name for suggestions cursor. <i>Optional.</i> If your cursor includes this column,
+ * then all suggestions will be provided in a format that includes space for two small icons,
+ * one at the left and one at the right of each suggestion. The data in the column must
+ * be a blob that contains a bitmap.
+ *
+ * This column overrides any icon provided in the {@link #SUGGEST_COLUMN_ICON_2} column.
+ *
+ * @hide
+ */
+ public final static String SUGGEST_COLUMN_ICON_2_BITMAP = "suggest_icon_2_bitmap";
+ /**
* Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i>
* this element exists at the given row, this is the action that will be used when
* forming the suggestion's intent. If the element is not provided, the action will be taken
@@ -1230,6 +1280,14 @@ public class SearchManager
*/
public final static String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
/**
+ * Column name for suggestions cursor. <i>Optional.</i> This column allows suggestions
+ * to provide additional arbitrary data which will be included as an extra under the key
+ * {@link #EXTRA_DATA_KEY}.
+ *
+ * @hide pending API council approval
+ */
+ public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
+ /**
* Column name for suggestions cursor. <i>Optional.</i> If this column exists <i>and</i>
* this element exists at the given row, then "/" and this value will be appended to the data
* field in the Intent. This should only be used if the data field has already been set to an
@@ -1244,6 +1302,63 @@ public class SearchManager
*/
public final static String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
+ /**
+ * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
+ * the search dialog will switch to a different suggestion source when the
+ * suggestion is clicked.
+ *
+ * {@link #SUGGEST_COLUMN_INTENT_DATA} must contain
+ * the flattened {@link ComponentName} of the activity which is to be searched.
+ *
+ * TODO: Should {@link #SUGGEST_COLUMN_INTENT_DATA} instead contain a URI in the format
+ * used by {@link android.provider.Applications}?
+ *
+ * TODO: This intent should be protected by the same permission that we use
+ * for replacing the global search provider.
+ *
+ * The query text field will be set to the value of {@link #SUGGEST_COLUMN_QUERY}.
+ *
+ * @hide Pending API council approval.
+ */
+ public final static String INTENT_ACTION_CHANGE_SEARCH_SOURCE
+ = "android.search.action.CHANGE_SEARCH_SOURCE";
+
+ /**
+ * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
+ * the search dialog will call {@link Cursor#respond(Bundle)} when the
+ * suggestion is clicked.
+ *
+ * The {@link Bundle} argument will be constructed
+ * in the same way as the "extra" bundle included in an Intent constructed
+ * from the suggestion.
+ *
+ * @hide Pending API council approval.
+ */
+ public final static String INTENT_ACTION_CURSOR_RESPOND
+ = "android.search.action.CURSOR_RESPOND";
+
+ /**
+ * Intent action for finding the global search activity.
+ * The global search provider should handle this intent.
+ *
+ * @hide Pending API council approval.
+ */
+ public final static String INTENT_ACTION_GLOBAL_SEARCH
+ = "android.search.action.GLOBAL_SEARCH";
+
+ /**
+ * Intent action for starting the global search settings activity.
+ * The global search provider should handle this intent.
+ *
+ * @hide Pending API council approval.
+ */
+ public final static String INTENT_ACTION_SEARCH_SETTINGS
+ = "android.search.action.SEARCH_SETTINGS";
+
+ /**
+ * Reference to the shared system search service.
+ */
+ private static ISearchManager sService = getSearchManagerService();
private final Context mContext;
private final Handler mHandler;
@@ -1257,12 +1372,6 @@ public class SearchManager
mContext = context;
mHandler = handler;
}
- private static ISearchManager mService;
-
- static {
- mService = ISearchManager.Stub.asInterface(
- ServiceManager.getService(Context.SEARCH_SERVICE));
- }
/**
* Launch search UI.
@@ -1459,5 +1568,109 @@ public class SearchManager
mSearchDialog.onConfigurationChanged(newConfig);
}
}
-
+
+ private static ISearchManager getSearchManagerService() {
+ return ISearchManager.Stub.asInterface(
+ ServiceManager.getService(Context.SEARCH_SERVICE));
+ }
+
+ /**
+ * Gets information about a searchable activity. This method is static so that it can
+ * be used from non-Activity contexts.
+ *
+ * @param componentName The activity to get searchable information for.
+ * @param globalSearch If <code>false</code>, return information about the given activity.
+ * If <code>true</code>, return information about the global search activity.
+ * @return Searchable information, or <code>null</code> if the activity is not searchable.
+ *
+ * @hide because SearchableInfo is not part of the API.
+ */
+ public static SearchableInfo getSearchableInfo(ComponentName componentName,
+ boolean globalSearch) {
+ try {
+ return sService.getSearchableInfo(componentName, globalSearch);
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Checks whether the given searchable is the default searchable.
+ *
+ * @hide because SearchableInfo is not part of the API.
+ */
+ public static boolean isDefaultSearchable(SearchableInfo searchable) {
+ SearchableInfo defaultSearchable = SearchManager.getSearchableInfo(null, true);
+ return defaultSearchable != null
+ && defaultSearchable.mSearchActivity.equals(searchable.mSearchActivity);
+ }
+
+ /**
+ * Gets a cursor with search suggestions. This method is static so that it can
+ * be used from non-Activity context.
+ *
+ * @param searchable Information about how to get the suggestions.
+ * @param query The search text entered (so far).
+ * @return a cursor with suggestions, or <code>null</null> the suggestion query failed.
+ *
+ * @hide because SearchableInfo is not part of the API.
+ */
+ public static Cursor getSuggestions(Context context, SearchableInfo searchable, String query) {
+ if (searchable == null) {
+ return null;
+ }
+
+ String authority = searchable.getSuggestAuthority();
+ if (authority == null) {
+ return null;
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(authority);
+
+ // if content path provided, insert it now
+ final String contentPath = searchable.getSuggestPath();
+ if (contentPath != null) {
+ uriBuilder.appendEncodedPath(contentPath);
+ }
+
+ // append standard suggestion query path
+ uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY);
+
+ // get the query selection, may be null
+ String selection = searchable.getSuggestSelection();
+ // inject query, either as selection args or inline
+ String[] selArgs = null;
+ if (selection != null) { // use selection if provided
+ selArgs = new String[] { query };
+ } else { // no selection, use REST pattern
+ uriBuilder.appendPath(query);
+ }
+
+ Uri uri = uriBuilder
+ .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel()
+ .fragment("") // TODO: Remove, workaround for a bug in Uri.writeToParcel()
+ .build();
+
+ // finally, make the query
+ return context.getContentResolver().query(uri, null, selection, selArgs, null);
+ }
+
+ /**
+ * Returns a list of the searchable activities that can be included in global search.
+ *
+ * @return a list containing searchable information for all searchable activities
+ * that have the <code>exported</code> attribute set in their searchable
+ * meta-data.
+ *
+ * @hide because SearchableInfo is not part of the API.
+ */
+ public static List<SearchableInfo> getSearchablesInGlobalSearch() {
+ try {
+ return sService.getSearchablesInGlobalSearch();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
}
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
new file mode 100644
index 0000000..af2a321
--- /dev/null
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources.NotFoundException;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.server.search.SearchableInfo;
+import android.text.Html;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CursorAdapter;
+import android.widget.ImageView;
+import android.widget.ResourceCursorAdapter;
+import android.widget.TextView;
+
+import java.io.FileNotFoundException;
+import java.util.WeakHashMap;
+
+/**
+ * Provides the contents for the suggestion drop-down list.in {@link SearchDialog}.
+ *
+ * @hide
+ */
+class SuggestionsAdapter extends ResourceCursorAdapter {
+ private static final boolean DBG = false;
+ private static final String LOG_TAG = "SuggestionsAdapter";
+
+ private SearchableInfo mSearchable;
+ private Context mProviderContext;
+ private WeakHashMap<String, Drawable> mOutsideDrawablesCache;
+
+ // Cached column indexes, updated when the cursor changes.
+ private int mFormatCol;
+ private int mText1Col;
+ private int mText2Col;
+ private int mIconName1Col;
+ private int mIconName2Col;
+ private int mIconBitmap1Col;
+ private int mIconBitmap2Col;
+
+ public SuggestionsAdapter(Context context, SearchableInfo searchable,
+ WeakHashMap<String, Drawable> outsideDrawablesCache) {
+ super(context,
+ com.android.internal.R.layout.search_dropdown_item_icons_2line,
+ null, // no initial cursor
+ true); // auto-requery
+ mSearchable = searchable;
+
+ // set up provider resources (gives us icons, etc.)
+ Context activityContext = mSearchable.getActivityContext(mContext);
+ mProviderContext = mSearchable.getProviderContext(mContext, activityContext);
+
+ mOutsideDrawablesCache = outsideDrawablesCache;
+ }
+
+ /**
+ * Overridden to always return <code>false</code>, since we cannot be sure that
+ * suggestion sources return stable IDs.
+ */
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+
+ /**
+ * Use the search suggestions provider to obtain a live cursor. This will be called
+ * in a worker thread, so it's OK if the query is slow (e.g. round trip for suggestions).
+ * The results will be processed in the UI thread and changeCursor() will be called.
+ */
+ @Override
+ public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
+ if (DBG) Log.d(LOG_TAG, "runQueryOnBackgroundThread(" + constraint + ")");
+ String query = (constraint == null) ? "" : constraint.toString();
+ try {
+ return SearchManager.getSuggestions(mContext, mSearchable, query);
+ } catch (RuntimeException e) {
+ Log.w(LOG_TAG, "Search suggestions query threw an exception.", e);
+ return null;
+ }
+ }
+
+ /**
+ * Cache columns.
+ */
+ @Override
+ public void changeCursor(Cursor c) {
+ if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")");
+ super.changeCursor(c);
+ if (c != null) {
+ mFormatCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT);
+ mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
+ mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2);
+ mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1);
+ mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2);
+ mIconBitmap1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1_BITMAP);
+ mIconBitmap2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2_BITMAP);
+ }
+ }
+
+ /**
+ * Tags the view with cached child view look-ups.
+ */
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View v = super.newView(context, cursor, parent);
+ v.setTag(new ChildViewCache(v));
+ return v;
+ }
+
+ /**
+ * Cache of the child views of drop-drown list items, to avoid looking up the children
+ * each time the contents of a list item are changed.
+ */
+ private final static class ChildViewCache {
+ public final TextView mText1;
+ public final TextView mText2;
+ public final ImageView mIcon1;
+ public final ImageView mIcon2;
+
+ public ChildViewCache(View v) {
+ mText1 = (TextView) v.findViewById(com.android.internal.R.id.text1);
+ mText2 = (TextView) v.findViewById(com.android.internal.R.id.text2);
+ mIcon1 = (ImageView) v.findViewById(com.android.internal.R.id.icon1);
+ mIcon2 = (ImageView) v.findViewById(com.android.internal.R.id.icon2);
+ }
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ ChildViewCache views = (ChildViewCache) view.getTag();
+ boolean isHtml = false;
+ if (mFormatCol >= 0) {
+ String format = cursor.getString(mFormatCol);
+ isHtml = "html".equals(format);
+ }
+ setViewText(cursor, views.mText1, mText1Col, isHtml);
+ setViewText(cursor, views.mText2, mText2Col, isHtml);
+ setViewIcon(cursor, views.mIcon1, mIconBitmap1Col, mIconName1Col);
+ setViewIcon(cursor, views.mIcon2, mIconBitmap2Col, mIconName2Col);
+ }
+
+ private void setViewText(Cursor cursor, TextView v, int textCol, boolean isHtml) {
+ if (v == null) {
+ return;
+ }
+ CharSequence text = null;
+ if (textCol >= 0) {
+ String str = cursor.getString(textCol);
+ text = (str != null && isHtml) ? Html.fromHtml(str) : str;
+ }
+ // Set the text even if it's null, since we need to clear any previous text.
+ v.setText(text);
+
+ if (TextUtils.isEmpty(text)) {
+ v.setVisibility(View.GONE);
+ } else {
+ v.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void setViewIcon(Cursor cursor, ImageView v, int iconBitmapCol, int iconNameCol) {
+ if (v == null) {
+ return;
+ }
+ Drawable drawable = null;
+ // First try the bitmap column
+ if (iconBitmapCol >= 0) {
+ byte[] data = cursor.getBlob(iconBitmapCol);
+ if (data != null) {
+ Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
+ if (bitmap != null) {
+ drawable = new BitmapDrawable(bitmap);
+ }
+ }
+ }
+ // If there was no bitmap, try the icon resource column.
+ if (drawable == null && iconNameCol >= 0) {
+ String value = cursor.getString(iconNameCol);
+ drawable = getDrawableFromResourceValue(value);
+ }
+ // Set the icon even if the drawable is null, since we need to clear any
+ // previous icon.
+ v.setImageDrawable(drawable);
+
+ if (drawable == null) {
+ v.setVisibility(View.GONE);
+ } else {
+ v.setVisibility(View.VISIBLE);
+ }
+ }
+
+ /**
+ * Gets the text to show in the query field when a suggestion is selected.
+ *
+ * @param cursor The Cursor to read the suggestion data from. The Cursor should already
+ * be moved to the suggestion that is to be read from.
+ * @return The text to show, or <code>null</code> if the query should not be
+ * changed when selecting this suggestion.
+ */
+ @Override
+ public CharSequence convertToString(Cursor cursor) {
+ if (cursor == null) {
+ return null;
+ }
+
+ String query = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_QUERY);
+ if (query != null) {
+ return query;
+ }
+
+ if (mSearchable.mQueryRewriteFromData) {
+ String data = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_INTENT_DATA);
+ if (data != null) {
+ return data;
+ }
+ }
+
+ if (mSearchable.mQueryRewriteFromText) {
+ String text1 = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_TEXT_1);
+ if (text1 != null) {
+ return text1;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is overridden purely to provide a bit of protection against
+ * flaky content providers.
+ *
+ * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
+ */
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ try {
+ return super.getView(position, convertView, parent);
+ } catch (RuntimeException e) {
+ Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e);
+ // Put exception string in item title
+ View v = newView(mContext, mCursor, parent);
+ if (v != null) {
+ ChildViewCache views = (ChildViewCache) v.getTag();
+ TextView tv = views.mText1;
+ tv.setText(e.toString());
+ }
+ return v;
+ }
+ }
+
+ /**
+ * Gets a drawable given a value provided by a suggestion provider.
+ *
+ * This value could be just the string value of a resource id
+ * (e.g., "2130837524"), in which case we will try to retrieve a drawable from
+ * the provider's resources. If the value is not an integer, it is
+ * treated as a Uri and opened with
+ * {@link ContentResolver#openOutputStream(android.net.Uri, String)}.
+ *
+ * All resources and URIs are read using the suggestion provider's context.
+ *
+ * If the string is not formatted as expected, or no drawable can be found for
+ * the provided value, this method returns null.
+ *
+ * @param drawableId a string like "2130837524",
+ * "android.resource://com.android.alarmclock/2130837524",
+ * or "content://contacts/photos/253".
+ * @return a Drawable, or null if none found
+ */
+ private Drawable getDrawableFromResourceValue(String drawableId) {
+ if (drawableId == null || drawableId.length() == 0 || "0".equals(drawableId)) {
+ return null;
+ }
+
+ // First, check the cache.
+ Drawable drawable = mOutsideDrawablesCache.get(drawableId);
+ if (drawable != null) return drawable;
+
+ try {
+ // Not cached, try using it as a plain resource ID in the provider's context.
+ int resourceId = Integer.parseInt(drawableId);
+ drawable = mProviderContext.getResources().getDrawable(resourceId);
+ } catch (NumberFormatException nfe) {
+ // The id was not an integer resource id.
+ // Let the ContentResolver handle content, android.resource and file URIs.
+ try {
+ Uri uri = Uri.parse(drawableId);
+ drawable = Drawable.createFromStream(
+ mProviderContext.getContentResolver().openInputStream(uri),
+ null);
+ } catch (FileNotFoundException fnfe) {
+ // drawable = null;
+ }
+
+ // If we got a drawable for this resource id, then stick it in the
+ // map so we don't do this lookup again.
+ if (drawable != null) {
+ mOutsideDrawablesCache.put(drawableId, drawable);
+ }
+ } catch (NotFoundException nfe) {
+ // Resource could not be found
+ // drawable = null;
+ }
+
+ return drawable;
+ }
+
+ /**
+ * Gets the value of a string column by name.
+ *
+ * @param cursor Cursor to read the value from.
+ * @param columnName The name of the column to read.
+ * @return The value of the given column, or <code>null</null>
+ * if the cursor does not contain the given column.
+ */
+ public static String getColumnString(Cursor cursor, String columnName) {
+ int col = cursor.getColumnIndex(columnName);
+ if (col == -1) {
+ return null;
+ }
+ return cursor.getString(col);
+ }
+
+}
diff --git a/core/java/android/appwidget/AppWidgetProvider.java b/core/java/android/appwidget/AppWidgetProvider.java
index f70de9c..7871fb6 100755
--- a/core/java/android/appwidget/AppWidgetProvider.java
+++ b/core/java/android/appwidget/AppWidgetProvider.java
@@ -30,11 +30,9 @@ import android.os.Bundle;
*
* <p>Extend this class and override one or more of the {@link #onUpdate}, {@link #onDeleted},
* {@link #onEnabled} or {@link #onDisabled} methods to implement your own AppWidget functionality.
- *
- * <h3>Sample Code</h3>
- * For an example of how to write a AppWidget provider, see the
- * <a href="{@toroot}reference/android/appwidget/package-descr.html#providers">android.appwidget
- * package overview</a>.
+ * </p>
+ * <p>For an example of how to write a AppWidget provider, see the
+ * <a href="{@docRoot}guide/topics/appwidgets/index.html#Providers">AppWidgets</a> documentation.</p>
*/
public class AppWidgetProvider extends BroadcastReceiver {
/**
diff --git a/core/java/android/appwidget/package.html b/core/java/android/appwidget/package.html
index b6cd9c7..2b85bd5 100644
--- a/core/java/android/appwidget/package.html
+++ b/core/java/android/appwidget/package.html
@@ -3,127 +3,22 @@
views are called widgets, and are published by "AppWidget providers." The component that can
contain widgets is called a "AppWidget host."
</p>
-<h3><a href="package-descr.html#providers">AppWidget Providers</a></h3>
-<ul>
- <li><a href="package-descr.html#provider_manifest">Declaring a widget in the AndroidManifest</a></li>
- <li><a href="package-descr.html#provider_meta_data">Adding the AppWidgetProviderInfo meta-data</a></li>
- <li><a href="package-descr.html#provider_AppWidgetProvider">Using the AppWidgetProvider class</a></li>
- <li><a href="package-descr.html#provider_configuration">AppWidget Configuration UI</a></li>
- <li><a href="package-descr.html#provider_broadcasts">AppWidget Broadcast Intents</a></li>
-</ul>
-<h3><a href="package-descr.html#">AppWidget Hosts</a></h3>
+<p>For more information, see the
+<a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a>
+documentation in the Dev Guide.</p>
{@more}
<h2><a name="providers"></a>AppWidget Providers</h2>
-<p>
-Any application can publish widgets. All an application needs to do to publish a widget is
+<p>Any application can publish widgets. All an application needs to do to publish a widget is
to have a {@link android.content.BroadcastReceiver} that receives the {@link
android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} intent,
and provide some meta-data about the widget. Android provides the
{@link android.appwidget.AppWidgetProvider} class, which extends BroadcastReceiver, as a convenience
class to aid in handling the broadcasts.
-<h3><a name="provider_manifest"></a>Declaring a widget in the AndroidManifest</h3>
-
-<p>
-First, declare the {@link android.content.BroadcastReceiver} in your application's
-<code>AndroidManifest.xml</code> file.
-
-{@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/AndroidManifest.xml AppWidgetProvider}
-
-<p>
-The <b><code>&lt;receiver&gt;</b> element has the following attributes:
-<ul>
- <li><b><code>android:name</code> -</b> which specifies the
- {@link android.content.BroadcastReceiver} or {@link android.appwidget.AppWidgetProvider}
- class.</li>
- <li><b><code>android:label</code> -</b> which specifies the string resource that
- will be shown by the widget picker as the label.</li>
- <li><b><code>android:icon</code> -</b> which specifies the drawable resource that
- will be shown by the widget picker as the icon.</li>
-</ul>
-
-<p>
-The <b><code>&lt;intent-filter&gt;</b> element tells the {@link android.content.pm.PackageManager}
-that this {@link android.content.BroadcastReceiver} receives the {@link
-android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} broadcast.
-The widget manager will send other broadcasts directly to your widget provider as required.
-It is only necessary to explicitly declare that you accept the {@link
-android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} broadcast.
-
-<p>
-The <b><code>&lt;meta-data&gt;</code></b> element tells the widget manager which xml resource to
-read to find the {@link android.appwidget.AppWidgetProviderInfo} for your widget provider. It has the following
-attributes:
-<ul>
- <li><b><code>android:name="android.appwidget.provider"</code> -</b> identifies this meta-data
- as the {@link android.appwidget.AppWidgetProviderInfo} descriptor.</li>
- <li><b><code>android:resource</code> -</b> is the xml resource to use as that descriptor.</li>
-</ul>
-
-
-<h3><a name="provider_meta_data"></a>Adding the {@link android.appwidget.AppWidgetProviderInfo AppWidgetProviderInfo} meta-data</h3>
-
-<p>
-For a widget, the values in the {@link android.appwidget.AppWidgetProviderInfo} structure are supplied
-in an XML resource. In the example above, the xml resource is referenced with
-<code>android:resource="@xml/appwidget_info"</code>. That XML file would go in your application's
-directory at <code>res/xml/appwidget_info.xml</code>. Here is a simple example.
-
-{@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/res/xml/appwidget_info.xml AppWidgetProviderInfo}
-
-<p>
-The attributes are as documented in the {@link android.appwidget.AppWidgetProviderInfo GagetInfo} class. (86400000 milliseconds means once per day)
-
-
-<h3><a name="provider_AppWidgetProvider"></a>Using the {@link android.appwidget.AppWidgetProvider AppWidgetProvider} class</h3>
-
-<p>The AppWidgetProvider class is the easiest way to handle the widget provider intent broadcasts.
-See the <code>src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java</code>
-sample class in ApiDemos for an example.
-
-<p class="note">Keep in mind that since the the AppWidgetProvider is a BroadcastReceiver,
-your process is not guaranteed to keep running after the callback methods return. See
-<a href="../../../guide/topics/fundamentals.html#broadlife">Application Fundamentals &gt;
-Broadcast Receiver Lifecycle</a> for more information.
-
-
-
-<h3><a name="provider_configuration"></a>AppWidget Configuration UI</h3>
-
-<p>
-Widget hosts have the ability to start a configuration activity when a widget is instantiated.
-The activity should be declared as normal in AndroidManifest.xml, and it should be listed in
-the AppWidgetProviderInfo XML file in the <code>android:configure</code> attribute.
-
-<p>The activity you specified will be launched with the {@link
-android.appwidget.AppWidgetManager#ACTION_APPWIDGET_CONFIGURE} action. See the documentation for that
-action for more info.
-
-<p>See the <code>src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java</code>
-sample class in ApiDemos for an example.
-
-
-
-<h3><a name="providers_broadcasts"></a>AppWidget Broadcast Intents</h3>
-
-<p>{@link android.appwidget.AppWidgetProvider} is just a convenience class. If you would like
-to receive the widget broadcasts directly, you can. The four intents you need to care about are:
-<ul>
- <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE}</li>
- <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_DELETED}</li>
- <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_ENABLED}</li>
- <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_DISABLED}</li>
-</ul>
-
-<p>By way of example, the implementation of
-{@link android.appwidget.AppWidgetProvider#onReceive} is quite simple:</p>
-
-{@sample frameworks/base/core/java/android/appwidget/AppWidgetProvider.java onReceive}
-
<h2>AppWidget Hosts</h3>
<p>Widget hosts are the containers in which widgets can be placed. Most of the look and feel
@@ -132,5 +27,6 @@ widgets, but the lock screen could also contain widgets, and it would have a dif
adding, removing and otherwise managing widgets.</p>
<p>For more information on implementing your own widget host, see the
{@link android.appwidget.AppWidgetHost AppWidgetHost} class.</p>
+
</body>
diff --git a/core/java/android/backup/BackupManager.java b/core/java/android/backup/BackupManager.java
new file mode 100644
index 0000000..6f0b2ee
--- /dev/null
+++ b/core/java/android/backup/BackupManager.java
@@ -0,0 +1,69 @@
+/*
+ * 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.backup;
+
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+/**
+ * BackupManager is the interface to the system's backup service.
+ * Applications simply instantiate one, and then use that instance
+ * to communicate with the backup infrastructure.
+ *
+ * <p>When your application has made changes to data it wishes to have
+ * backed up, call {@link #dataChanged()} to notify the backup service.
+ * The system will then schedule a backup operation to occur in the near
+ * future. Repeated calls to {@link #dataChanged()} have no further effect
+ * until the backup operation actually occurs.
+ *
+ * <p>The backup operation itself begins with the system launching the
+ * {@link BackupService} subclass declared in your manifest. See the documentation
+ * for {@link BackupService} for a detailed description of how the backup then proceeds.
+ *
+ * @hide pending API solidification
+ */
+public class BackupManager {
+ private Context mContext;
+ private IBackupManager mService;
+
+ /**
+ * Constructs a BackupManager object through which the application can
+ * communicate with the Android backup system.
+ *
+ * @param context The {@link android.content.Context} that was provided when
+ * one of your application's {@link android.app.Activity Activities}
+ * was created.
+ */
+ public BackupManager(Context context) {
+ mContext = context;
+ mService = IBackupManager.Stub.asInterface(
+ ServiceManager.getService(Context.BACKUP_SERVICE));
+ }
+
+ /**
+ * Notifies the Android backup system that your application wishes to back up
+ * new changes to its data. A backup operation using your application's
+ * {@link BackupService} subclass will be scheduled when you call this method.
+ */
+ public void dataChanged() {
+ try {
+ mService.dataChanged(mContext.getPackageName());
+ } catch (RemoteException e) {
+ }
+ }
+}
diff --git a/core/java/android/backup/BackupService.java b/core/java/android/backup/BackupService.java
new file mode 100644
index 0000000..d912d8c
--- /dev/null
+++ b/core/java/android/backup/BackupService.java
@@ -0,0 +1,126 @@
+/*
+ * 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.backup;
+
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
+import android.app.Service;
+import android.backup.IBackupService;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+
+/**
+ * This is the central interface between an application and Android's
+ * settings backup mechanism.
+ *
+ * In order to use the backup service, your application must implement a
+ * subclass of BackupService, and declare an intent filter
+ * in the application manifest specifying that your BackupService subclass
+ * handles the {link #SERVICE_ACTION} intent action. For example:
+ *
+ * <pre class="prettyprint">
+ * &lt;!-- Use the class "MyBackupService" to perform backups for my app --&gt;
+ * &lt;service android:name=".MyBackupService"&gt;
+ * &lt;intent-filter&gt;
+ * &lt;action android:name="android.service.action.BACKUP"&gt;
+ * &lt;/intent-filter&gt;
+ * &lt;/service&gt;</pre>
+ *
+ * @hide pending API solidification
+ */
+
+public abstract class BackupService extends Service {
+ /**
+ * Service Action: Participate in the backup infrastructure. Applications
+ * that wish to use the Android backup mechanism must provide an exported
+ * subclass of BackupService and give it an {@link android.content.IntentFilter
+ * IntentFilter} that accepts this action.
+ */
+ @SdkConstant(SdkConstantType.SERVICE_ACTION)
+ public static final String SERVICE_ACTION = "android.backup.BackupService";
+
+ /**
+ * The application is being asked to write any data changed since the
+ * last time it performed a backup operation. The state data recorded
+ * during the last backup pass is provided in the oldStateFd file descriptor.
+ * If oldStateFd is negative, no old state is available and the application
+ * should perform a full backup. In both cases, a representation of the
+ * final backup state after this pass should be written to the file pointed
+ * to by the newStateFd file descriptor.
+ *
+ * @param oldStateFd An open, read-only file descriptor pointing to the last
+ * backup state provided by the application. May be negative,
+ * in which case no prior state is being provided and the
+ * application should perform a full backup.
+ * @param dataFd An open, read/write file descriptor pointing to the backup data
+ * destination. Typically the application will use backup helper
+ * classes to write to this file.
+ * @param newStateFd An open, read/write file descriptor pointing to an empty
+ * file. The application should record the final backup state
+ * here after writing the requested data to dataFd.
+ */
+ public abstract void onBackup(int oldStateFd, int dataFd, int newStateFd);
+
+ /**
+ * The application is being restored from backup, and should replace any
+ * existing data with the contents of the backup. The backup data is
+ * provided in the file pointed to by the dataFd file descriptor. Once
+ * the restore is finished, the application should write a representation
+ * of the final state to the newStateFd file descriptor,
+ *
+ * @param dataFd An open, read-only file descriptor pointing to a full snapshot
+ * of the application's data.
+ * @param newStateFd An open, read/write file descriptor pointing to an empty
+ * file. The application should record the final backup state
+ * here after restoring its data from dataFd.
+ */
+ public abstract void onRestore(int dataFd, int newStateFd);
+
+
+ // ----- Core implementation -----
+
+ /**
+ * Returns the private interface called by the backup system. Applications will
+ * not typically override this.
+ */
+ public IBinder onBind(Intent intent) {
+ if (intent.getAction().equals(SERVICE_ACTION)) {
+ return mBinder;
+ }
+ return null;
+ }
+
+ private final IBinder mBinder = new BackupServiceBinder().asBinder();
+
+ // ----- IBackupService binder interface -----
+ private class BackupServiceBinder extends IBackupService.Stub {
+ public void doBackup(int oldStateFd, int dataFd, int newStateFd)
+ throws RemoteException {
+ // !!! TODO - real implementation; for now just invoke the callbacks directly
+ Log.v("BackupServiceBinder", "doBackup() invoked");
+ BackupService.this.onBackup(oldStateFd, dataFd, newStateFd);
+ }
+
+ public void doRestore(int dataFd, int newStateFd) throws RemoteException {
+ // !!! TODO - real implementation; for now just invoke the callbacks directly
+ Log.v("BackupServiceBinder", "doRestore() invoked");
+ BackupService.this.onRestore(dataFd, newStateFd);
+ }
+ }
+}
diff --git a/core/java/android/backup/IBackupManager.aidl b/core/java/android/backup/IBackupManager.aidl
new file mode 100644
index 0000000..7efaf58
--- /dev/null
+++ b/core/java/android/backup/IBackupManager.aidl
@@ -0,0 +1,35 @@
+/*
+ * 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.backup;
+
+/**
+ * Direct interface to the Backup Manager Service that applications invoke on. The only
+ * operation currently needed is a simple notification that the app has made changes to
+ * data it wishes to back up, so the system should run a backup pass.
+ *
+ * Apps will use the {@link android.backup.BackupManager} class rather than going through
+ * this Binder interface directly.
+ *
+ * {@hide}
+ */
+interface IBackupManager {
+ /**
+ * Tell the system service that the caller has made changes to its
+ * data, and therefore needs to undergo a backup pass.
+ */
+ oneway void dataChanged(String packageName);
+}
diff --git a/core/java/android/backup/IBackupService.aidl b/core/java/android/backup/IBackupService.aidl
new file mode 100644
index 0000000..24544bd
--- /dev/null
+++ b/core/java/android/backup/IBackupService.aidl
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.backup;
+
+/**
+ * Interface presented by applications being asked to participate in the
+ * backup & restore mechanism. End user code does not typically implement
+ * this interface; they subclass BackupService instead.
+ *
+ * {@hide}
+ */
+interface IBackupService {
+ /**
+ * Request that the app perform an incremental backup.
+ *
+ * @param oldStateFd Read-only file containing the description blob of the
+ * app's data state as of the last backup operation's completion.
+ *
+ * @param dataFd Read-write file, empty when onBackup() is called, that
+ * is the data destination for this backup pass's incrementals.
+ *
+ * @param newStateFd Read-write file, empty when onBackup() is called,
+ * where the new state blob is to be recorded.
+ */
+ void doBackup(int oldStateFd, int dataFd, int newStateFd);
+
+ /**
+ * Restore an entire data snapshot to the application.
+ *
+ * @param dataFd Read-only file containing the full data snapshot of the
+ * app's backup. This is to be a <i>replacement</i> of the app's
+ * current data, not to be merged into it.
+ *
+ * @param newStateFd Read-write file, empty when onRestore() is called,
+ * that is to be written with the state description that holds after
+ * the restore has been completed.
+ */
+ void doRestore(int dataFd, int newStateFd);
+}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 3d5ed3a..2aa3695 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -527,6 +527,16 @@ public abstract class Context {
public abstract int getWallpaperDesiredMinimumHeight();
/**
+ * Returns the scale in which the application will be drawn on the
+ * screen. This is usually 1.0f if the application supports the device's
+ * resolution/density. This will be 1.5f, for example, if the application
+ * that supports only 160 density runs on 240 density screen.
+ *
+ * @hide
+ */
+ public abstract float getApplicationScale();
+
+ /**
* Change the current system wallpaper to a bitmap. The given bitmap is
* converted to a PNG and stored as the wallpaper. On success, the intent
* {@link Intent#ACTION_WALLPAPER_CHANGED} is broadcast.
@@ -1269,6 +1279,15 @@ public abstract class Context {
public static final String APPWIDGET_SERVICE = "appwidget";
/**
+ * Use with {@link #getSystemService} to retrieve an
+ * {@blink android.backup.IBackupManager IBackupManager} for communicating
+ * with the backup mechanism.
+ *
+ * @see #getSystemService
+ */
+ public static final String BACKUP_SERVICE = "backup";
+
+ /**
* Determine whether the given permission is allowed for a particular
* process and user ID running in the system.
*
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 36e1c34..25b2cae 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -419,4 +419,12 @@ public class ContextWrapper extends Context {
throws PackageManager.NameNotFoundException {
return mBase.createPackageContext(packageName, flags);
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public float getApplicationScale() {
+ return mBase.getApplicationScale();
+ }
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index f5397c4..ebdd588 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4391,12 +4391,35 @@ public class Intent implements Parcelable {
@Override
public String toString() {
- StringBuilder b = new StringBuilder();
+ StringBuilder b = new StringBuilder(128);
- b.append("Intent {");
- if (mAction != null) b.append(" action=").append(mAction);
+ b.append("Intent { ");
+ toShortString(b, true, true);
+ b.append(" }");
+
+ return b.toString();
+ }
+
+ /** @hide */
+ public String toShortString(boolean comp, boolean extras) {
+ StringBuilder b = new StringBuilder(128);
+ toShortString(b, comp, extras);
+ return b.toString();
+ }
+
+ /** @hide */
+ public void toShortString(StringBuilder b, boolean comp, boolean extras) {
+ boolean first = true;
+ if (mAction != null) {
+ b.append("act=").append(mAction);
+ first = false;
+ }
if (mCategories != null) {
- b.append(" categories={");
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("cat=[");
Iterator<String> i = mCategories.iterator();
boolean didone = false;
while (i.hasNext()) {
@@ -4404,20 +4427,48 @@ public class Intent implements Parcelable {
didone = true;
b.append(i.next());
}
- b.append("}");
+ b.append("]");
+ }
+ if (mData != null) {
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("dat=").append(mData);
+ }
+ if (mType != null) {
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("typ=").append(mType);
+ }
+ if (mFlags != 0) {
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("flg=0x").append(Integer.toHexString(mFlags));
+ }
+ if (comp && mComponent != null) {
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("cmp=").append(mComponent.flattenToShortString());
+ }
+ if (extras && mExtras != null) {
+ if (!first) {
+ b.append(' ');
+ }
+ first = false;
+ b.append("(has extras)");
}
- if (mData != null) b.append(" data=").append(mData);
- if (mType != null) b.append(" type=").append(mType);
- if (mFlags != 0) b.append(" flags=0x").append(Integer.toHexString(mFlags));
- if (mComponent != null) b.append(" comp=").append(mComponent.toShortString());
- if (mExtras != null) b.append(" (has extras)");
- b.append(" }");
-
- return b.toString();
}
public String toURI() {
- StringBuilder uri = new StringBuilder(mData != null ? mData.toString() : "");
+ StringBuilder uri = new StringBuilder(128);
+ if (mData != null) uri.append(mData.toString());
uri.append("#Intent;");
diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java
index 9ba85b2..365f269 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -1255,47 +1255,71 @@ public class IntentFilter implements Parcelable {
}
public void dump(Printer du, String prefix) {
+ StringBuilder sb = new StringBuilder(256);
if (mActions.size() > 0) {
Iterator<String> it = mActions.iterator();
while (it.hasNext()) {
- du.println(prefix + "Action: \"" + it.next() + "\"");
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Action: \"");
+ sb.append(it.next()); sb.append("\"");
+ du.println(sb.toString());
}
}
if (mCategories != null) {
Iterator<String> it = mCategories.iterator();
while (it.hasNext()) {
- du.println(prefix + "Category: \"" + it.next() + "\"");
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Category: \"");
+ sb.append(it.next()); sb.append("\"");
+ du.println(sb.toString());
}
}
if (mDataSchemes != null) {
Iterator<String> it = mDataSchemes.iterator();
while (it.hasNext()) {
- du.println(prefix + "Data Scheme: \"" + it.next() + "\"");
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Scheme: \"");
+ sb.append(it.next()); sb.append("\"");
+ du.println(sb.toString());
}
}
if (mDataAuthorities != null) {
Iterator<AuthorityEntry> it = mDataAuthorities.iterator();
while (it.hasNext()) {
AuthorityEntry ae = it.next();
- du.println(prefix + "Data Authority: \"" + ae.mHost + "\":"
- + ae.mPort + (ae.mWild ? " WILD" : ""));
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Authority: \"");
+ sb.append(ae.mHost); sb.append("\": ");
+ sb.append(ae.mPort);
+ if (ae.mWild) sb.append(" WILD");
+ du.println(sb.toString());
}
}
if (mDataPaths != null) {
Iterator<PatternMatcher> it = mDataPaths.iterator();
while (it.hasNext()) {
PatternMatcher pe = it.next();
- du.println(prefix + "Data Path: \"" + pe + "\"");
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Path: \"");
+ sb.append(pe); sb.append("\"");
+ du.println(sb.toString());
}
}
if (mDataTypes != null) {
Iterator<String> it = mDataTypes.iterator();
while (it.hasNext()) {
- du.println(prefix + "Data Type: \"" + it.next() + "\"");
+ sb.setLength(0);
+ sb.append(prefix); sb.append("Type: \"");
+ sb.append(it.next()); sb.append("\"");
+ du.println(sb.toString());
}
}
- du.println(prefix + "mPriority=" + mPriority
- + ", mHasPartialTypes=" + mHasPartialTypes);
+ if (mPriority != 0 || mHasPartialTypes) {
+ sb.setLength(0);
+ sb.append(prefix); sb.append("mPriority="); sb.append(mPriority);
+ sb.append(", mHasPartialTypes="); sb.append(mHasPartialTypes);
+ du.println(sb.toString());
+ }
}
public static final Parcelable.Creator<IntentFilter> CREATOR
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 8d727ed..173057c 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -161,6 +161,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public int uid;
+
+ /**
+ * The list of densities in DPI that application supprots. This
+ * field is only set if the {@link PackageManager#GET_SUPPORTS_DENSITIES} flag was
+ * used when retrieving the structure.
+ */
+ public int[] supportsDensities;
+
/**
* When false, indicates that all components within this application are
* considered disabled, regardless of their individually set enabled status.
@@ -181,8 +189,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
pw.println(prefix + "dataDir=" + dataDir);
pw.println(prefix + "enabled=" + enabled);
- pw.println(prefix+"manageSpaceActivityName="+manageSpaceActivityName);
- pw.println(prefix+"description=0x"+Integer.toHexString(descriptionRes));
+ pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
+ pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
+ pw.println(prefix + "supportsDensities=" + supportsDensities);
super.dumpBack(pw, prefix);
}
@@ -228,6 +237,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
enabled = orig.enabled;
manageSpaceActivityName = orig.manageSpaceActivityName;
descriptionRes = orig.descriptionRes;
+ supportsDensities = orig.supportsDensities;
}
@@ -257,6 +267,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeInt(enabled ? 1 : 0);
dest.writeString(manageSpaceActivityName);
dest.writeInt(descriptionRes);
+ dest.writeIntArray(supportsDensities);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -285,8 +296,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
enabled = source.readInt() != 0;
manageSpaceActivityName = source.readString();
descriptionRes = source.readInt();
+ supportsDensities = source.createIntArray();
}
-
+
/**
* Retrieve the textual description of the application. This
* will call back on the given PackageManager to load the description from
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 3e94734..9e06666 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -166,6 +166,12 @@ public abstract class PackageManager {
public static final int GET_CONFIGURATIONS = 0x00004000;
/**
+ * {@link ApplicationInfo} flag: return the
+ * {@link ApplicationInfo#supportsDensities} that the package supports.
+ */
+ public static final int GET_SUPPORTS_DENSITIES = 0x00008000;
+
+ /**
* Permission check result: this is returned by {@link #checkPermission}
* if the permission has been granted to the given package.
*/
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 2dcb483..f9c4984 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -45,6 +45,7 @@ import java.security.cert.CertificateEncodingException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
+import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -64,6 +65,48 @@ public class PackageParser {
private static final Object mSync = new Object();
private static WeakReference<byte[]> mReadBuffer;
+ static class ParsePackageItemArgs {
+ final Package owner;
+ final String[] outError;
+ final int nameRes;
+ final int labelRes;
+ final int iconRes;
+
+ String tag;
+ TypedArray sa;
+
+ ParsePackageItemArgs(Package _owner, String[] _outError,
+ int _nameRes, int _labelRes, int _iconRes) {
+ owner = _owner;
+ outError = _outError;
+ nameRes = _nameRes;
+ labelRes = _labelRes;
+ iconRes = _iconRes;
+ }
+ }
+
+ static class ParseComponentArgs extends ParsePackageItemArgs {
+ final String[] sepProcesses;
+ final int processRes;
+ final int enabledRes;
+ int flags;
+
+ ParseComponentArgs(Package _owner, String[] _outError,
+ int _nameRes, int _labelRes, int _iconRes,
+ String[] _sepProcesses, int _processRes,int _enabledRes) {
+ super(_owner, _outError, _nameRes, _labelRes, _iconRes);
+ sepProcesses = _sepProcesses;
+ processRes = _processRes;
+ enabledRes = _enabledRes;
+ }
+ }
+
+ private ParsePackageItemArgs mParseInstrumentationArgs;
+ private ParseComponentArgs mParseActivityArgs;
+ private ParseComponentArgs mParseActivityAliasArgs;
+ private ParseComponentArgs mParseServiceArgs;
+ private ParseComponentArgs mParseProviderArgs;
+
/** If set to true, we will only allow package files that exactly match
* the DTD. Otherwise, we try to get as much from the package as we
* can without failing. This should normally be set to false, to
@@ -557,6 +600,11 @@ public class PackageParser {
throws XmlPullParserException, IOException {
AttributeSet attrs = parser;
+ mParseInstrumentationArgs = null;
+ mParseActivityArgs = null;
+ mParseServiceArgs = null;
+ mParseProviderArgs = null;
+
String pkgName = parsePackageName(parser, attrs, flags, outError);
if (pkgName == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
@@ -593,8 +641,6 @@ public class PackageParser {
}
sa.recycle();
- final int innerDepth = parser.getDepth();
-
int outerDepth = parser.getDepth();
while ((type=parser.next()) != parser.END_DOCUMENT
&& (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
@@ -726,6 +772,14 @@ public class PackageParser {
pkg.usesLibraries.toArray(pkg.usesLibraryFiles);
}
+ int size = pkg.supportsDensityList.size();
+ if (size > 0) {
+ int densities[] = pkg.supportsDensities = new int[size];
+ List<Integer> densityList = pkg.supportsDensityList;
+ for (int i = 0; i < size; i++) {
+ densities[i] = densityList.get(i);
+ }
+ }
return pkg;
}
@@ -950,20 +1004,24 @@ public class PackageParser {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestInstrumentation);
- Instrumentation a = new Instrumentation(owner);
-
- if (!parsePackageItemInfo(owner, a.info, outError, "<instrumentation>", sa,
- com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
- com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
- com.android.internal.R.styleable.AndroidManifestInstrumentation_icon)) {
+ if (mParseInstrumentationArgs == null) {
+ mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
+ com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
+ com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
+ com.android.internal.R.styleable.AndroidManifestInstrumentation_icon);
+ mParseInstrumentationArgs.tag = "<instrumentation>";
+ }
+
+ mParseInstrumentationArgs.sa = sa;
+
+ Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
+ new InstrumentationInfo());
+ if (outError[0] != null) {
sa.recycle();
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return null;
}
- a.component = new ComponentName(owner.applicationInfo.packageName,
- a.info.name);
-
String str;
str = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
@@ -1140,7 +1198,7 @@ public class PackageParser {
owner.providers.add(p);
} else if (tagName.equals("activity-alias")) {
- Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError, false);
+ Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -1173,6 +1231,21 @@ public class PackageParser {
XmlUtils.skipCurrentTag(parser);
+ } else if (tagName.equals("supports-density")) {
+ sa = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.AndroidManifestSupportsDensity);
+
+ int density = sa.getInteger(
+ com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1);
+
+ sa.recycle();
+
+ if (density != -1 && !owner.supportsDensityList.contains(density)) {
+ owner.supportsDensityList.add(density);
+ }
+
+ XmlUtils.skipCurrentTag(parser);
+
} else {
if (!RIGID_PARSER) {
Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
@@ -1239,22 +1312,29 @@ public class PackageParser {
return outError[0] == null;
}
-
+
private Activity parseActivity(Package owner, Resources res,
XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
boolean receiver) throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestActivity);
- Activity a = new Activity(owner);
-
- if (!parseComponentInfo(owner, flags, a.info, outError,
- receiver ? "<receiver>" : "<activity>", sa,
- com.android.internal.R.styleable.AndroidManifestActivity_name,
- com.android.internal.R.styleable.AndroidManifestActivity_label,
- com.android.internal.R.styleable.AndroidManifestActivity_icon,
- com.android.internal.R.styleable.AndroidManifestActivity_process,
- com.android.internal.R.styleable.AndroidManifestActivity_enabled)) {
+ if (mParseActivityArgs == null) {
+ mParseActivityArgs = new ParseComponentArgs(owner, outError,
+ com.android.internal.R.styleable.AndroidManifestActivity_name,
+ com.android.internal.R.styleable.AndroidManifestActivity_label,
+ com.android.internal.R.styleable.AndroidManifestActivity_icon,
+ mSeparateProcesses,
+ com.android.internal.R.styleable.AndroidManifestActivity_process,
+ com.android.internal.R.styleable.AndroidManifestActivity_enabled);
+ }
+
+ mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
+ mParseActivityArgs.sa = sa;
+ mParseActivityArgs.flags = flags;
+
+ Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
+ if (outError[0] != null) {
sa.recycle();
return null;
}
@@ -1266,9 +1346,6 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
}
- a.component = new ComponentName(owner.applicationInfo.packageName,
- a.info.name);
-
a.info.theme = sa.getResourceId(
com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
@@ -1412,8 +1489,8 @@ public class PackageParser {
}
private Activity parseActivityAlias(Package owner, Resources res,
- XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
- boolean receiver) throws XmlPullParserException, IOException {
+ XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
+ throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestActivityAlias);
@@ -1432,7 +1509,20 @@ public class PackageParser {
return null;
}
- Activity a = new Activity(owner);
+ if (mParseActivityAliasArgs == null) {
+ mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
+ com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
+ com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
+ com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
+ mSeparateProcesses,
+ 0,
+ com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
+ mParseActivityAliasArgs.tag = "<activity-alias>";
+ }
+
+ mParseActivityAliasArgs.sa = sa;
+ mParseActivityAliasArgs.flags = flags;
+
Activity target = null;
final int NA = owner.activities.size();
@@ -1451,26 +1541,21 @@ public class PackageParser {
return null;
}
- a.info.targetActivity = targetActivity;
-
- a.info.configChanges = target.info.configChanges;
- a.info.flags = target.info.flags;
- a.info.icon = target.info.icon;
- a.info.labelRes = target.info.labelRes;
- a.info.launchMode = target.info.launchMode;
- a.info.nonLocalizedLabel = target.info.nonLocalizedLabel;
- a.info.processName = target.info.processName;
- a.info.screenOrientation = target.info.screenOrientation;
- a.info.taskAffinity = target.info.taskAffinity;
- a.info.theme = target.info.theme;
-
- if (!parseComponentInfo(owner, flags, a.info, outError,
- receiver ? "<receiver>" : "<activity>", sa,
- com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
- com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
- com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
- 0,
- com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled)) {
+ ActivityInfo info = new ActivityInfo();
+ info.targetActivity = targetActivity;
+ info.configChanges = target.info.configChanges;
+ info.flags = target.info.flags;
+ info.icon = target.info.icon;
+ info.labelRes = target.info.labelRes;
+ info.nonLocalizedLabel = target.info.nonLocalizedLabel;
+ info.launchMode = target.info.launchMode;
+ info.processName = target.info.processName;
+ info.screenOrientation = target.info.screenOrientation;
+ info.taskAffinity = target.info.taskAffinity;
+ info.theme = target.info.theme;
+
+ Activity a = new Activity(mParseActivityAliasArgs, info);
+ if (outError[0] != null) {
sa.recycle();
return null;
}
@@ -1482,9 +1567,6 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
}
- a.component = new ComponentName(owner.applicationInfo.packageName,
- a.info.name);
-
String str;
str = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestActivityAlias_permission);
@@ -1548,14 +1630,22 @@ public class PackageParser {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestProvider);
- Provider p = new Provider(owner);
-
- if (!parseComponentInfo(owner, flags, p.info, outError, "<provider>", sa,
- com.android.internal.R.styleable.AndroidManifestProvider_name,
- com.android.internal.R.styleable.AndroidManifestProvider_label,
- com.android.internal.R.styleable.AndroidManifestProvider_icon,
- com.android.internal.R.styleable.AndroidManifestProvider_process,
- com.android.internal.R.styleable.AndroidManifestProvider_enabled)) {
+ if (mParseProviderArgs == null) {
+ mParseProviderArgs = new ParseComponentArgs(owner, outError,
+ com.android.internal.R.styleable.AndroidManifestProvider_name,
+ com.android.internal.R.styleable.AndroidManifestProvider_label,
+ com.android.internal.R.styleable.AndroidManifestProvider_icon,
+ mSeparateProcesses,
+ com.android.internal.R.styleable.AndroidManifestProvider_process,
+ com.android.internal.R.styleable.AndroidManifestProvider_enabled);
+ mParseProviderArgs.tag = "<provider>";
+ }
+
+ mParseProviderArgs.sa = sa;
+ mParseProviderArgs.flags = flags;
+
+ Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
+ if (outError[0] != null) {
sa.recycle();
return null;
}
@@ -1563,9 +1653,6 @@ public class PackageParser {
p.info.exported = sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
- p.component = new ComponentName(owner.applicationInfo.packageName,
- p.info.name);
-
String cpname = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestProvider_authorities);
@@ -1706,14 +1793,22 @@ public class PackageParser {
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestService);
- Service s = new Service(owner);
-
- if (!parseComponentInfo(owner, flags, s.info, outError, "<service>", sa,
- com.android.internal.R.styleable.AndroidManifestService_name,
- com.android.internal.R.styleable.AndroidManifestService_label,
- com.android.internal.R.styleable.AndroidManifestService_icon,
- com.android.internal.R.styleable.AndroidManifestService_process,
- com.android.internal.R.styleable.AndroidManifestService_enabled)) {
+ if (mParseServiceArgs == null) {
+ mParseServiceArgs = new ParseComponentArgs(owner, outError,
+ com.android.internal.R.styleable.AndroidManifestService_name,
+ com.android.internal.R.styleable.AndroidManifestService_label,
+ com.android.internal.R.styleable.AndroidManifestService_icon,
+ mSeparateProcesses,
+ com.android.internal.R.styleable.AndroidManifestService_process,
+ com.android.internal.R.styleable.AndroidManifestService_enabled);
+ mParseServiceArgs.tag = "<service>";
+ }
+
+ mParseServiceArgs.sa = sa;
+ mParseServiceArgs.flags = flags;
+
+ Service s = new Service(mParseServiceArgs, new ServiceInfo());
+ if (outError[0] != null) {
sa.recycle();
return null;
}
@@ -1725,9 +1820,6 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestService_exported, false);
}
- s.component = new ComponentName(owner.applicationInfo.packageName,
- s.info.name);
-
String str = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestService_permission);
if (str == null) {
@@ -2035,6 +2127,9 @@ public class PackageParser {
// We store the application meta-data independently to avoid multiple unwanted references
public Bundle mAppMetaData = null;
+ public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>();
+ public int[] supportsDensities = null;
+
// If this is a 3rd party app, this is the path of the zip file.
public String mPath;
@@ -2084,16 +2179,75 @@ public class PackageParser {
public static class Component<II extends IntentInfo> {
public final Package owner;
- public final ArrayList<II> intents = new ArrayList<II>(0);
- public ComponentName component;
+ public final ArrayList<II> intents;
+ public final ComponentName component;
+ public final String componentShortName;
public Bundle metaData;
public Component(Package _owner) {
owner = _owner;
+ intents = null;
+ component = null;
+ componentShortName = null;
+ }
+
+ public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
+ owner = args.owner;
+ intents = new ArrayList<II>(0);
+ String name = args.sa.getNonResourceString(args.nameRes);
+ if (name == null) {
+ component = null;
+ componentShortName = null;
+ args.outError[0] = args.tag + " does not specify android:name";
+ return;
+ }
+
+ outInfo.name
+ = buildClassName(owner.applicationInfo.packageName, name, args.outError);
+ if (outInfo.name == null) {
+ component = null;
+ componentShortName = null;
+ args.outError[0] = args.tag + " does not have valid android:name";
+ return;
+ }
+
+ component = new ComponentName(owner.applicationInfo.packageName,
+ outInfo.name);
+ componentShortName = component.flattenToShortString();
+
+ int iconVal = args.sa.getResourceId(args.iconRes, 0);
+ if (iconVal != 0) {
+ outInfo.icon = iconVal;
+ outInfo.nonLocalizedLabel = null;
+ }
+
+ TypedValue v = args.sa.peekValue(args.labelRes);
+ if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
+ outInfo.nonLocalizedLabel = v.coerceToString();
+ }
+
+ outInfo.packageName = owner.packageName;
+ }
+
+ public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
+ this(args, (PackageItemInfo)outInfo);
+ if (args.outError[0] != null) {
+ return;
+ }
+
+ if (args.processRes != 0) {
+ outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
+ owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes),
+ args.flags, args.sepProcesses, args.outError);
+ }
+ outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
}
public Component(Component<II> clone) {
owner = clone.owner;
+ intents = clone.intents;
+ component = clone.component;
+ componentShortName = clone.componentShortName;
metaData = clone.metaData;
}
}
@@ -2149,6 +2303,10 @@ public class PackageParser {
&& p.usesLibraryFiles != null) {
return true;
}
+ if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0
+ && p.supportsDensities != null) {
+ return true;
+ }
return false;
}
@@ -2166,6 +2324,9 @@ public class PackageParser {
if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
ai.sharedLibraryFiles = p.usesLibraryFiles;
}
+ if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
+ ai.supportsDensities = p.supportsDensities;
+ }
return ai;
}
@@ -2192,14 +2353,14 @@ public class PackageParser {
}
public final static class Activity extends Component<ActivityIntentInfo> {
- public final ActivityInfo info =
- new ActivityInfo();
+ public final ActivityInfo info;
- public Activity(Package _owner) {
- super(_owner);
- info.applicationInfo = owner.applicationInfo;
+ public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
+ super(args, _info);
+ info = _info;
+ info.applicationInfo = args.owner.applicationInfo;
}
-
+
public String toString() {
return "Activity{"
+ Integer.toHexString(System.identityHashCode(this))
@@ -2221,14 +2382,14 @@ public class PackageParser {
}
public final static class Service extends Component<ServiceIntentInfo> {
- public final ServiceInfo info =
- new ServiceInfo();
+ public final ServiceInfo info;
- public Service(Package _owner) {
- super(_owner);
- info.applicationInfo = owner.applicationInfo;
+ public Service(final ParseComponentArgs args, final ServiceInfo _info) {
+ super(args, _info);
+ info = _info;
+ info.applicationInfo = args.owner.applicationInfo;
}
-
+
public String toString() {
return "Service{"
+ Integer.toHexString(System.identityHashCode(this))
@@ -2252,13 +2413,13 @@ public class PackageParser {
public final ProviderInfo info;
public boolean syncable;
- public Provider(Package _owner) {
- super(_owner);
- info = new ProviderInfo();
- info.applicationInfo = owner.applicationInfo;
+ public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
+ super(args, _info);
+ info = _info;
+ info.applicationInfo = args.owner.applicationInfo;
syncable = false;
}
-
+
public Provider(Provider existingProvider) {
super(existingProvider);
this.info = existingProvider.info;
@@ -2291,13 +2452,13 @@ public class PackageParser {
}
public final static class Instrumentation extends Component {
- public final InstrumentationInfo info =
- new InstrumentationInfo();
+ public final InstrumentationInfo info;
- public Instrumentation(Package _owner) {
- super(_owner);
+ public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
+ super(args, _info);
+ info = _info;
}
-
+
public String toString() {
return "Instrumentation{"
+ Integer.toHexString(System.identityHashCode(this))
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 956b15a..bb3486c 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -144,11 +144,29 @@ public final class Configuration implements Parcelable, Comparable<Configuration
}
public String toString() {
- return "{ scale=" + fontScale + " imsi=" + mcc + "/" + mnc
- + " locale=" + locale
- + " touch=" + touchscreen + " key=" + keyboard + "/"
- + keyboardHidden + "/" + hardKeyboardHidden
- + " nav=" + navigation + " orien=" + orientation + " }";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("{ scale=");
+ sb.append(fontScale);
+ sb.append(" imsi=");
+ sb.append(mcc);
+ sb.append("/");
+ sb.append(mnc);
+ sb.append(" loc=");
+ sb.append(locale);
+ sb.append(" touch=");
+ sb.append(touchscreen);
+ sb.append(" keys=");
+ sb.append(keyboard);
+ sb.append("/");
+ sb.append(keyboardHidden);
+ sb.append("/");
+ sb.append(hardKeyboardHidden);
+ sb.append(" nav=");
+ sb.append(navigation);
+ sb.append(" orien=");
+ sb.append(orientation);
+ sb.append('}');
+ return sb.toString();
}
/**
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index e020462..665e40c 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -24,6 +24,7 @@ import org.xmlpull.v1.XmlPullParserException;
import android.graphics.Movie;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.SystemProperties;
@@ -56,12 +57,14 @@ public class Resources {
// Information about preloaded resources. Note that they are not
// protected by a lock, because while preloading in zygote we are all
// single-threaded, and after that these are immutable.
- private static final SparseArray<Drawable.ConstantState> mPreloadedDrawables
+ private static final SparseArray<Drawable.ConstantState> sPreloadedDrawables
= new SparseArray<Drawable.ConstantState>();
private static final SparseArray<ColorStateList> mPreloadedColorStateLists
= new SparseArray<ColorStateList>();
private static boolean mPreloaded;
+ private final SparseArray<Drawable.ConstantState> mPreloadedDrawables;
+
/*package*/ final TypedValue mTmpValue = new TypedValue();
// These are protected by the mTmpValue lock.
@@ -82,6 +85,22 @@ public class Resources {
/*package*/ final DisplayMetrics mMetrics = new DisplayMetrics();
PluralRules mPluralRule;
+ private static final SparseArray<Object> EMPTY_ARRAY = new SparseArray<Object>() {
+ @Override
+ public void put(int k, Object o) {
+ throw new UnsupportedOperationException();
+ }
+ @Override
+ public void append(int k, Object o) {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ @SuppressWarnings("unchecked")
+ private static <T> SparseArray<T> emptySparseArray() {
+ return (SparseArray<T>) EMPTY_ARRAY;
+ }
+
/**
* This exception is thrown by the resource APIs when a requested resource
* can not be found.
@@ -107,11 +126,27 @@ public class Resources {
*/
public Resources(AssetManager assets, DisplayMetrics metrics,
Configuration config) {
+ this(assets, metrics, config, true);
+ }
+
+ /**
+ * Create a resource with an additional flag for preloaded
+ * drawable cache. Used by {@link ActivityThread}.
+ *
+ * @hide
+ */
+ public Resources(AssetManager assets, DisplayMetrics metrics,
+ Configuration config, boolean usePreloadedCache) {
mAssets = assets;
mConfiguration.setToDefaults();
mMetrics.setToDefaults();
updateConfiguration(config, metrics);
assets.ensureStringBlocks();
+ if (usePreloadedCache) {
+ mPreloadedDrawables = sPreloadedDrawables;
+ } else {
+ mPreloadedDrawables = emptySparseArray();
+ }
}
/**
@@ -1218,6 +1253,7 @@ public class Resources {
mMetrics.setTo(metrics);
}
mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale;
+
String locale = null;
if (mConfiguration.locale != null) {
locale = mConfiguration.locale.getLanguage();
@@ -1653,7 +1689,7 @@ public class Resources {
cs = dr.getConstantState();
if (cs != null) {
if (mPreloading) {
- mPreloadedDrawables.put(key, cs);
+ sPreloadedDrawables.put(key, cs);
} else {
synchronized (mTmpValue) {
//Log.i(TAG, "Saving cached drawable @ #" +
@@ -1883,6 +1919,6 @@ public class Resources {
mMetrics.setToDefaults();
updateConfiguration(null, null);
mAssets.ensureStringBlocks();
+ mPreloadedDrawables = sPreloadedDrawables;
}
}
-
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 139fcba..5c05ea0 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -489,12 +489,20 @@ public class SQLiteQueryBuilder
String userColumn = projectionIn[i];
String column = mProjectionMap.get(userColumn);
- if (column == null) {
- throw new IllegalArgumentException(
- "Invalid column " + projectionIn[i]);
- } else {
+ if (column != null) {
projection[i] = column;
+ continue;
}
+
+ if (userColumn.contains(" AS ")
+ || userColumn.contains(" as ")) {
+ /* A column alias already exist */
+ projection[i] = userColumn;
+ continue;
+ }
+
+ throw new IllegalArgumentException("Invalid column "
+ + projectionIn[i]);
}
return projection;
} else {
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 0c88a2e..67df23b 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -43,7 +43,7 @@ import java.util.List;
* class by calling {@link android.content.Context#getSystemService(java.lang.String)
* Context.getSystemService()} with an argument of {@link android.content.Context#SENSOR_SERVICE}.
*/
-public class SensorManager extends IRotationWatcher.Stub
+public class SensorManager
{
private static final String TAG = "SensorManager";
private static final float[] mTempMatrix = new float[16];
@@ -475,7 +475,13 @@ public class SensorManager extends IRotationWatcher.Stub
// if it's null we're running in the system process
// which won't get the rotated values
try {
- sRotation = sWindowManager.watchRotation(this);
+ sRotation = sWindowManager.watchRotation(
+ new IRotationWatcher.Stub() {
+ public void onRotationChanged(int rotation) {
+ SensorManager.this.onRotationChanged(rotation);
+ }
+ }
+ );
} catch (RemoteException e) {
}
}
@@ -1386,7 +1392,7 @@ public class SensorManager extends IRotationWatcher.Stub
}
}
}
-
+
class LmsFilter {
private static final int SENSORS_RATE_MS = 20;
private static final int COUNT = 12;
@@ -1454,7 +1460,7 @@ public class SensorManager extends IRotationWatcher.Stub
}
}
-
+
private static native void nativeClassInit();
private static native int sensors_module_init();
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 39d36de..333ba73 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -113,7 +113,7 @@ public abstract class BatteryStats implements Parcelable {
private static final String DATA_CONNECTION_TIME_DATA = "dct";
private static final String DATA_CONNECTION_COUNT_DATA = "dcc";
- private final StringBuilder mFormatBuilder = new StringBuilder(8);
+ private final StringBuilder mFormatBuilder = new StringBuilder(32);
private final Formatter mFormatter = new Formatter(mFormatBuilder);
/**
@@ -522,7 +522,7 @@ public abstract class BatteryStats implements Parcelable {
public abstract Map<String, ? extends Timer> getKernelWakelockStats();
- private final static void formatTime(StringBuilder out, long seconds) {
+ private final static void formatTimeRaw(StringBuilder out, long seconds) {
long days = seconds / (60 * 60 * 24);
if (days != 0) {
out.append(days);
@@ -550,22 +550,18 @@ public abstract class BatteryStats implements Parcelable {
}
}
- private final static String formatTime(long time) {
+ private final static void formatTime(StringBuilder sb, long time) {
long sec = time / 100;
- StringBuilder sb = new StringBuilder();
- formatTime(sb, sec);
+ formatTimeRaw(sb, sec);
sb.append((time - (sec * 100)) * 10);
sb.append("ms ");
- return sb.toString();
}
- private final static String formatTimeMs(long time) {
+ private final static void formatTimeMs(StringBuilder sb, long time) {
long sec = time / 1000;
- StringBuilder sb = new StringBuilder();
- formatTime(sb, sec);
+ formatTimeRaw(sb, sec);
sb.append(time - (sec * 1000));
sb.append("ms ");
- return sb.toString();
}
private final String formatRatioLocked(long num, long den) {
@@ -616,8 +612,8 @@ public abstract class BatteryStats implements Parcelable {
int count = timer.getCountLocked(which);
if (totalTimeMillis != 0) {
sb.append(linePrefix);
- sb.append(formatTimeMs(totalTimeMillis));
- sb.append(name != null ? name : "");
+ formatTimeMs(sb, totalTimeMillis);
+ if (name != null) sb.append(name);
sb.append(' ');
sb.append('(');
sb.append(count);
@@ -916,7 +912,7 @@ public abstract class BatteryStats implements Parcelable {
}
@SuppressWarnings("unused")
- private final void dumpLocked(Printer pw, String prefix, int which) {
+ private final void dumpLocked(PrintWriter pw, String prefix, int which) {
final long rawUptime = SystemClock.uptimeMillis() * 1000;
final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
final long batteryUptime = getBatteryUptime(rawUptime);
@@ -932,33 +928,41 @@ public abstract class BatteryStats implements Parcelable {
SparseArray<? extends Uid> uidStats = getUidStats();
final int NU = uidStats.size();
- pw.println(prefix
- + " Time on battery: "
- + formatTimeMs(whichBatteryRealtime / 1000) + "("
- + formatRatioLocked(whichBatteryRealtime, totalRealtime)
- + ") realtime, "
- + formatTimeMs(whichBatteryUptime / 1000)
- + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime)
- + ") uptime");
- pw.println(prefix
- + " Total run time: "
- + formatTimeMs(totalRealtime / 1000)
- + "realtime, "
- + formatTimeMs(totalUptime / 1000)
- + "uptime, ");
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Time on battery: ");
+ formatTimeMs(sb, whichBatteryRealtime / 1000); sb.append("(");
+ sb.append(formatRatioLocked(whichBatteryRealtime, totalRealtime));
+ sb.append(") realtime, ");
+ formatTimeMs(sb, whichBatteryUptime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(whichBatteryUptime, totalRealtime));
+ sb.append(") uptime");
+ pw.println(sb.toString());
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Total run time: ");
+ formatTimeMs(sb, totalRealtime / 1000);
+ sb.append("realtime, ");
+ formatTimeMs(sb, totalUptime / 1000);
+ sb.append("uptime, ");
+ pw.println(sb.toString());
final long screenOnTime = getScreenOnTime(batteryRealtime, which);
final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
- pw.println(prefix
- + " Screen on: " + formatTimeMs(screenOnTime / 1000)
- + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
- + "), Input events: " + getInputEventCount(which)
- + ", Active phone call: " + formatTimeMs(phoneOnTime / 1000)
- + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime) + ")");
sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Screen on: "); formatTimeMs(sb, screenOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime));
+ sb.append("), Input events: "); sb.append(getInputEventCount(which));
+ sb.append(", Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime));
+ sb.append(")");
+ pw.println(sb.toString());
+ sb.setLength(0);
+ sb.append(prefix);
sb.append(" Screen brightnesses: ");
boolean didOne = false;
for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
@@ -970,7 +974,7 @@ public abstract class BatteryStats implements Parcelable {
didOne = true;
sb.append(SCREEN_BRIGHTNESS_NAMES[i]);
sb.append(" ");
- sb.append(formatTimeMs(time/1000));
+ formatTimeMs(sb, time/1000);
sb.append("(");
sb.append(formatRatioLocked(time, screenOnTime));
sb.append(")");
@@ -1030,16 +1034,19 @@ public abstract class BatteryStats implements Parcelable {
}
}
- pw.println(prefix
- + " Total received: " + formatBytesLocked(rxTotal)
- + ", Total sent: " + formatBytesLocked(txTotal));
- pw.println(prefix
- + " Total full wakelock time: " + formatTimeMs(
- (fullWakeLockTimeTotalMicros + 500) / 1000)
- + ", Total partial waklock time: " + formatTimeMs(
- (partialWakeLockTimeTotalMicros + 500) / 1000));
+ pw.print(prefix);
+ pw.print(" Total received: "); pw.print(formatBytesLocked(rxTotal));
+ pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal));
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Total full wakelock time: "); formatTimeMs(sb,
+ (fullWakeLockTimeTotalMicros + 500) / 1000);
+ sb.append(", Total partial waklock time: "); formatTimeMs(sb,
+ (partialWakeLockTimeTotalMicros + 500) / 1000);
+ pw.println(sb.toString());
sb.setLength(0);
+ sb.append(prefix);
sb.append(" Signal levels: ");
didOne = false;
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
@@ -1051,7 +1058,7 @@ public abstract class BatteryStats implements Parcelable {
didOne = true;
sb.append(SIGNAL_STRENGTH_NAMES[i]);
sb.append(" ");
- sb.append(formatTimeMs(time/1000));
+ formatTimeMs(sb, time/1000);
sb.append("(");
sb.append(formatRatioLocked(time, whichBatteryRealtime));
sb.append(") ");
@@ -1062,6 +1069,7 @@ public abstract class BatteryStats implements Parcelable {
pw.println(sb.toString());
sb.setLength(0);
+ sb.append(prefix);
sb.append(" Radio types: ");
didOne = false;
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
@@ -1073,7 +1081,7 @@ public abstract class BatteryStats implements Parcelable {
didOne = true;
sb.append(DATA_CONNECTION_NAMES[i]);
sb.append(" ");
- sb.append(formatTimeMs(time/1000));
+ formatTimeMs(sb, time/1000);
sb.append("(");
sb.append(formatRatioLocked(time, whichBatteryRealtime));
sb.append(") ");
@@ -1083,29 +1091,32 @@ public abstract class BatteryStats implements Parcelable {
if (!didOne) sb.append("No activity");
pw.println(sb.toString());
- pw.println(prefix
- + " Wifi on: " + formatTimeMs(wifiOnTime / 1000)
- + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
- + "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000)
- + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
- + "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
- + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(wifiOnTime, whichBatteryRealtime));
+ sb.append("), Wifi running: "); formatTimeMs(sb, wifiRunningTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(wifiRunningTime, whichBatteryRealtime));
+ sb.append("), Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime));
+ sb.append(")");
+ pw.println(sb.toString());
pw.println(" ");
if (which == STATS_UNPLUGGED) {
if (getIsOnBattery()) {
- pw.println(prefix + " Device is currently unplugged");
- pw.println(prefix + " Discharge cycle start level: " +
- getDischargeStartLevel());
- pw.println(prefix + " Discharge cycle current level: " +
- getDischargeCurrentLevel());
+ pw.print(prefix); pw.println(" Device is currently unplugged");
+ pw.print(prefix); pw.print(" Discharge cycle start level: ");
+ pw.println(getDischargeStartLevel());
+ pw.print(prefix); pw.print(" Discharge cycle current level: ");
+ pw.println(getDischargeCurrentLevel());
} else {
- pw.println(prefix + " Device is currently plugged into power");
- pw.println(prefix + " Last discharge cycle start level: " +
- getDischargeStartLevel());
- pw.println(prefix + " Last discharge cycle end level: " +
- getDischargeCurrentLevel());
+ pw.print(prefix); pw.println(" Device is currently plugged into power");
+ pw.print(prefix); pw.print(" Last discharge cycle start level: ");
+ pw.println(getDischargeStartLevel());
+ pw.print(prefix); pw.print(" Last discharge cycle end level: ");
+ pw.println(getDischargeCurrentLevel());
}
pw.println(" ");
}
@@ -1124,8 +1135,9 @@ public abstract class BatteryStats implements Parcelable {
long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
if (tcpReceived != 0 || tcpSent != 0) {
- pw.println(prefix + " Network: " + formatBytesLocked(tcpReceived) + " received, "
- + formatBytesLocked(tcpSent) + " sent");
+ pw.print(prefix); pw.print(" Network: ");
+ pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, ");
+ pw.print(formatBytesLocked(tcpSent)); pw.println(" sent");
}
if (u.hasUserActivity()) {
@@ -1152,18 +1164,20 @@ public abstract class BatteryStats implements Parcelable {
if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
|| wifiTurnedOnTime != 0) {
- pw.println(prefix + " Turned Wifi On Time: "
- + formatTimeMs(wifiTurnedOnTime / 1000)
- + "(" + formatRatioLocked(wifiTurnedOnTime,
- whichBatteryRealtime)+ ")");
- pw.println(prefix + " Full Wifi Lock Time: "
- + formatTimeMs(fullWifiLockOnTime / 1000)
- + "(" + formatRatioLocked(fullWifiLockOnTime,
- whichBatteryRealtime)+ ")");
- pw.println(prefix + " Scan Wifi Lock Time: "
- + formatTimeMs(scanWifiLockOnTime / 1000)
- + "(" + formatRatioLocked(scanWifiLockOnTime,
- whichBatteryRealtime)+ ")");
+ sb.setLength(0);
+ sb.append(prefix); sb.append(" Turned Wifi On: ");
+ formatTimeMs(sb, wifiTurnedOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(wifiTurnedOnTime,
+ whichBatteryRealtime)); sb.append(")\n");
+ sb.append(prefix); sb.append(" Full Wifi Lock: ");
+ formatTimeMs(sb, fullWifiLockOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
+ whichBatteryRealtime)); sb.append(")\n");
+ sb.append(prefix); sb.append(" Scan Wifi Lock: ");
+ formatTimeMs(sb, scanWifiLockOnTime / 1000);
+ sb.append("("); sb.append(formatRatioLocked(scanWifiLockOnTime,
+ whichBatteryRealtime)); sb.append(")");
+ pw.println(sb.toString());
}
Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
@@ -1217,7 +1231,7 @@ public abstract class BatteryStats implements Parcelable {
int count = timer.getCountLocked(which);
//timer.logState();
if (totalTime != 0) {
- sb.append(formatTimeMs(totalTime));
+ formatTimeMs(sb, totalTime);
sb.append("realtime (");
sb.append(count);
sb.append(" times)");
@@ -1247,10 +1261,15 @@ public abstract class BatteryStats implements Parcelable {
starts = ps.getStarts(which);
if (userTime != 0 || systemTime != 0 || starts != 0) {
- pw.println(prefix + " Proc " + ent.getKey() + ":");
- pw.println(prefix + " CPU: " + formatTime(userTime) + "user + "
- + formatTime(systemTime) + "kernel");
- pw.println(prefix + " " + starts + " process starts");
+ sb.setLength(0);
+ sb.append(prefix); sb.append(" Proc ");
+ sb.append(ent.getKey()); sb.append(":\n");
+ sb.append(prefix); sb.append(" CPU: ");
+ formatTime(sb, userTime); sb.append("usr + ");
+ formatTime(sb, systemTime); sb.append("krn\n");
+ sb.append(prefix); sb.append(" "); sb.append(starts);
+ sb.append(" proc starts");
+ pw.println(sb.toString());
uidActivity = true;
}
}
@@ -1260,12 +1279,13 @@ public abstract class BatteryStats implements Parcelable {
if (packageStats.size() > 0) {
for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
: packageStats.entrySet()) {
- pw.println(prefix + " Apk " + ent.getKey() + ":");
+ pw.print(prefix); pw.print(" Apk "); pw.print(ent.getKey()); pw.println(":");
boolean apkActivity = false;
Uid.Pkg ps = ent.getValue();
int wakeups = ps.getWakeups(which);
if (wakeups != 0) {
- pw.println(prefix + " " + wakeups + " wakeup alarms");
+ pw.print(prefix); pw.print(" ");
+ pw.print(wakeups); pw.println(" wakeup alarms");
apkActivity = true;
}
Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
@@ -1277,24 +1297,28 @@ public abstract class BatteryStats implements Parcelable {
int starts = ss.getStarts(which);
int launches = ss.getLaunches(which);
if (startTime != 0 || starts != 0 || launches != 0) {
- pw.println(prefix + " Service " + sent.getKey() + ":");
- pw.println(prefix + " Created for: "
- + formatTimeMs(startTime / 1000)
- + " uptime");
- pw.println(prefix + " Starts: " + starts
- + ", launches: " + launches);
+ sb.setLength(0);
+ sb.append(prefix); sb.append(" Service ");
+ sb.append(sent.getKey()); sb.append(":\n");
+ sb.append(prefix); sb.append(" Created for: ");
+ formatTimeMs(sb, startTime / 1000);
+ sb.append(" uptime\n");
+ sb.append(prefix); sb.append(" Starts: ");
+ sb.append(starts);
+ sb.append(", launches: "); sb.append(launches);
+ pw.println(sb.toString());
apkActivity = true;
}
}
}
if (!apkActivity) {
- pw.println(prefix + " (nothing executed)");
+ pw.print(prefix); pw.println(" (nothing executed)");
}
uidActivity = true;
}
}
if (!uidActivity) {
- pw.println(prefix + " (nothing executed)");
+ pw.print(prefix); pw.println(" (nothing executed)");
}
}
}
@@ -1305,7 +1329,7 @@ public abstract class BatteryStats implements Parcelable {
* @param pw a Printer to receive the dump output.
*/
@SuppressWarnings("unused")
- public void dumpLocked(Printer pw) {
+ public void dumpLocked(PrintWriter pw) {
pw.println("Total Statistics (Current and Historic):");
pw.println(" System starts: " + getStartCount()
+ ", currently on battery: " + getIsOnBattery());
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index e4412a3..30acef9 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -176,6 +176,26 @@ public class Process {
*/
public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
+ /**
+ * Default thread group - gets a 'normal' share of the CPU
+ * @hide
+ */
+ public static final int THREAD_GROUP_DEFAULT = 0;
+
+ /**
+ * Background non-interactive thread group - All threads in
+ * this group are scheduled with a reduced share of the CPU.
+ * @hide
+ */
+ public static final int THREAD_GROUP_BG_NONINTERACTIVE = 1;
+
+ /**
+ * Foreground 'boost' thread group - All threads in
+ * this group are scheduled with an increased share of the CPU
+ * @hide
+ **/
+ public static final int THREAD_GROUP_FG_BOOST = 2;
+
public static final int SIGNAL_QUIT = 3;
public static final int SIGNAL_KILL = 9;
public static final int SIGNAL_USR1 = 10;
@@ -569,6 +589,21 @@ public class Process {
*/
public static final native void setThreadPriority(int tid, int priority)
throws IllegalArgumentException, SecurityException;
+
+ /**
+ * Sets the scheduling group for a thread.
+ * @hide
+ * @param tid The indentifier of the thread/process to change.
+ * @param group The target group for this thread/process.
+ *
+ * @throws IllegalArgumentException Throws IllegalArgumentException if
+ * <var>tid</var> does not exist.
+ * @throws SecurityException Throws SecurityException if your process does
+ * not have permission to modify the given thread, or to use the given
+ * priority.
+ */
+ public static final native void setThreadGroup(int tid, int group)
+ throws IllegalArgumentException, SecurityException;
/**
* Set the priority of the calling thread, based on Linux priorities. See
diff --git a/core/java/android/provider/Applications.java b/core/java/android/provider/Applications.java
new file mode 100644
index 0000000..0b0ce58
--- /dev/null
+++ b/core/java/android/provider/Applications.java
@@ -0,0 +1,82 @@
+/*
+ * 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.provider;
+
+import android.app.SearchManager;
+import android.net.Uri;
+import android.widget.SimpleCursorAdapter;
+
+/**
+ * <p>The Applications provider gives information about installed applications.</p>
+ *
+ * <p>This provider provides the following columns:
+ *
+ * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
+ *
+ * <thead>
+ * <tr><th>Column Name</th> <th>Description</th> </tr>
+ * </thead>
+ *
+ * <tbody>
+ * <tr><th>{@link SearchManager#SUGGEST_COLUMN_TEXT_1}</th>
+ * <td>The application name.</td>
+ * </tr>
+ *
+ * <tr><th>{@link SearchManager#SUGGEST_COLUMN_INTENT_COMPONENT}</th>
+ * <td>The component to be used when forming the intent.</td>
+ * </tr>
+ *
+ * <tr><th>{@link SearchManager#SUGGEST_COLUMN_ICON_1}</th>
+ * <td>The application's icon resource id, prepended by its package name and
+ * separated by a colon, e.g., "com.android.alarmclock:2130837524". The
+ * package name is required for an activity interpreting this value to
+ * be able to correctly access the icon drawable, for example, in an override of
+ * {@link SimpleCursorAdapter#setViewImage(android.widget.ImageView, String)}.</td>
+ * </tr>
+ *
+ * <tr><th>{@link SearchManager#SUGGEST_COLUMN_ICON_2}</th>
+ * <td><i>Unused - column provided to conform to the {@link SearchManager} stipulation
+ * that all providers provide either both or neither of
+ * {@link SearchManager#SUGGEST_COLUMN_ICON_1} and
+ * {@link SearchManager#SUGGEST_COLUMN_ICON_2}.</td>
+ * </tr>
+ *
+ * @hide pending API council approval - should be unhidden at the same time as
+ * {@link SearchManager#SUGGEST_COLUMN_INTENT_COMPONENT}
+ */
+public class Applications {
+ private static final String TAG = "Applications";
+
+ /**
+ * The content authority for this provider.
+ *
+ * @hide
+ */
+ public static final String AUTHORITY = "applications";
+
+ /**
+ * The content:// style URL for this provider
+ *
+ * @hide
+ */
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
+
+ /**
+ * no public constructor since this is a utility class
+ */
+ private Applications() {}
+}
diff --git a/core/java/android/provider/Im.java b/core/java/android/provider/Im.java
index 19ad158..898c321 100644
--- a/core/java/android/provider/Im.java
+++ b/core/java/android/provider/Im.java
@@ -871,14 +871,22 @@ public class Im {
}
/**
- * The common columns for both one-to-one chat messages or group chat messages.
+ * The common columns for messages table
*/
- public interface BaseMessageColumns {
+ public interface MessageColumns {
/**
- * The user this message belongs to
- * <P>Type: TEXT</P>
+ * The thread_id column stores the contact id of the contact the message belongs to.
+ * For groupchat messages, the thread_id stores the group id, which is the contact id
+ * of the temporary group contact created for the groupchat. So there should be no
+ * collision between groupchat message thread id and regular message thread id.
*/
- String CONTACT = "contact";
+ String THREAD_ID = "thread_id";
+
+ /**
+ * The nickname. This is used for groupchat messages to indicate the participant's
+ * nickname. For non groupchat messages, this field should be left empty.
+ */
+ String NICKNAME = "nickname";
/**
* The body
@@ -917,64 +925,121 @@ public class Im {
* <P>Type: STRING</P>
*/
String PACKET_ID = "packet_id";
- }
-
- /**
- * Columns from the Messages table.
- */
- public interface MessagesColumns extends BaseMessageColumns{
- /**
- * The provider id
- * <P> Type: INTEGER </P>
- */
- String PROVIDER = "provider";
/**
- * The account id
- * <P> Type: INTEGER </P>
+ * Is groupchat message or not
+ * <P>Type: INTEGER</P>
*/
- String ACCOUNT = "account";
+ String IS_GROUP_CHAT = "is_muc";
}
/**
* This table contains messages.
*/
- public static final class Messages implements BaseColumns, MessagesColumns {
+ public static final class Messages implements BaseColumns, MessageColumns {
/**
* no public constructor since this is a utility class
*/
private Messages() {}
/**
- * Gets the Uri to query messages by contact.
+ * Gets the Uri to query messages by thread id.
+ *
+ * @param threadId the thread id of the message.
+ * @return the Uri
+ */
+ public static final Uri getContentUriByThreadId(long threadId) {
+ Uri.Builder builder = CONTENT_URI_MESSAGES_BY_THREAD_ID.buildUpon();
+ ContentUris.appendId(builder, threadId);
+ return builder.build();
+ }
+
+ /**
+ * @deprecated
+ *
+ * Gets the Uri to query messages by account and contact.
*
- * @param providerId the provider id of the contact.
* @param accountId the account id of the contact.
* @param username the user name of the contact.
* @return the Uri
*/
- public static final Uri getContentUriByContact(long providerId,
- long accountId, String username) {
- Uri.Builder builder = CONTENT_URI_MESSAGES_BY.buildUpon();
- ContentUris.appendId(builder, providerId);
+ public static final Uri getContentUriByContact(long accountId, String username) {
+ Uri.Builder builder = CONTENT_URI_MESSAGES_BY_ACCOUNT_AND_CONTACT.buildUpon();
ContentUris.appendId(builder, accountId);
builder.appendPath(username);
return builder.build();
}
/**
+ * Gets the Uri to query messages by provider.
+ *
+ * @param providerId the server provider id.
+ * @return the Uri
+ */
+ public static final Uri getContentUriByProvider(long providerId) {
+ Uri.Builder builder = CONTENT_URI_MESSAGES_BY_PROVIDER.buildUpon();
+ ContentUris.appendId(builder, providerId);
+ return builder.build();
+ }
+
+ /**
+ * Gets the Uri to query groupchat messages by thread id.
+ *
+ * @param threadId the thread id of the groupchat message.
+ * @return the Uri
+ */
+ public static final Uri getGroupChatContentUriByThreadId(long threadId) {
+ Uri.Builder builder = GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID.buildUpon();
+ ContentUris.appendId(builder, threadId);
+ return builder.build();
+ }
+
+ /**
* The content:// style URL for this table
*/
- public static final Uri CONTENT_URI =
- Uri.parse("content://im/messages");
+ public static final Uri CONTENT_URI = Uri.parse("content://im/messages");
+
+ /**
+ * The content:// style URL for messages by thread id
+ */
+ public static final Uri CONTENT_URI_MESSAGES_BY_THREAD_ID =
+ Uri.parse("content://im/messagesByThreadId");
+
+ /**
+ * The content:// style URL for messages by account and contact
+ */
+ public static final Uri CONTENT_URI_MESSAGES_BY_ACCOUNT_AND_CONTACT =
+ Uri.parse("content://im/messagesByAcctAndContact");
+
+ /**
+ * The content:// style URL for messages by provider
+ */
+ public static final Uri CONTENT_URI_MESSAGES_BY_PROVIDER =
+ Uri.parse("content://im/messagesByProvider");
+
+ /**
+ * The content:// style URL for groupchat messages.
+ */
+ public static final Uri GROUP_CHAT_CONTENT_URI = Uri.parse("content://im/groupMessages");
/**
- * The content:// style URL for messages by provider and account
+ * The content:// style URL for groupchat messages by thread id
*/
- public static final Uri CONTENT_URI_MESSAGES_BY =
- Uri.parse("content://im/messagesBy");
+ public static final Uri GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID =
+ Uri.parse("content://im/groupMessagesByThreadId");
/**
+ * The MIME type of {@link #CONTENT_URI} providing a directory of groupchat messages.
+ */
+ public static final String GROUP_CHAT_CONTENT_TYPE =
+ "vnd.android.cursor.dir/im-groupMessages";
+
+ /**
+ * The MIME type of a {@link #CONTENT_URI} subdirectory of a single groupchat message.
+ */
+ public static final String GROUP_CHAT_CONTENT_ITEM_TYPE =
+ "vnd.android.cursor.item/im-groupMessages";
+ /**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* people.
*/
@@ -992,6 +1057,11 @@ public class Im {
*/
public static final String DEFAULT_SORT_ORDER = "date ASC";
+ /**
+ * The "contact" column. This is not a real column in the messages table, but a
+ * temoprary column created when querying for messages (joined with the contacts table)
+ */
+ public static final String CONTACT = "contact";
}
/**
@@ -1119,67 +1189,6 @@ public class Im {
}
/**
- * Columns from the GroupMessages table
- */
- public interface GroupMessageColumns extends BaseMessageColumns {
- /**
- * The group this message belongs to
- * <p>Type: TEXT</p>
- */
- String GROUP = "groupId";
- }
-
- /**
- * This table contains group messages.
- */
- public final static class GroupMessages implements BaseColumns,
- GroupMessageColumns {
- private GroupMessages() {}
-
- /**
- * Gets the Uri to query group messages by group.
- *
- * @param groupId the group id.
- * @return the Uri
- */
- public static final Uri getContentUriByGroup(long groupId) {
- Uri.Builder builder = CONTENT_URI_GROUP_MESSAGES_BY.buildUpon();
- ContentUris.appendId(builder, groupId);
- return builder.build();
- }
-
- /**
- * The content:// style URL for this table
- */
- public static final Uri CONTENT_URI =
- Uri.parse("content://im/groupMessages");
-
- /**
- * The content:// style URL for group messages by provider and account
- */
- public static final Uri CONTENT_URI_GROUP_MESSAGES_BY =
- Uri.parse("content://im/groupMessagesBy");
-
- /**
- * The MIME type of {@link #CONTENT_URI} providing a directory of
- * group messages.
- */
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/im-groupMessages";
-
- /**
- * The MIME type of a {@link #CONTENT_URI} subdirectory of a single
- * group message.
- */
- public static final String CONTENT_ITEM_TYPE =
- "vnd.android.cursor.item/im-groupMessages";
-
- /**
- * The default sort order for this table
- */
- public static final String DEFAULT_SORT_ORDER = "date ASC";
- }
-
- /**
* Columns from the Avatars table
*/
public interface AvatarsColumns {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0e0e179..db79eb9 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2577,6 +2577,11 @@ public final class Settings {
"gtalk_ssl_handshake_timeout_ms";
/**
+ * Compress the gtalk stream.
+ */
+ public static final String GTALK_COMPRESS = "gtalk_compress";
+
+ /**
* Enable use of ssl session caching.
* 'db' - save each session in a (per process) database
* 'file' - save each session in a (per process) file
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index fe15553..03623d6 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -23,7 +23,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
-import android.util.Config;
+
+import java.util.List;
/**
* This is a simplified version of the Search Manager service. It no longer handles
@@ -36,7 +37,6 @@ public class SearchManagerService extends ISearchManager.Stub
// general debugging support
private static final String TAG = "SearchManagerService";
private static final boolean DEBUG = false;
- private static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV;
// configuration choices
private static final boolean IMMEDIATE_SEARCHABLES_UPDATE = true;
@@ -45,9 +45,10 @@ public class SearchManagerService extends ISearchManager.Stub
private final Context mContext;
private final Handler mHandler;
private boolean mSearchablesDirty;
+ private Searchables mSearchables;
/**
- * Initialize the Search Manager service in the provided system context.
+ * Initializes the Search Manager service in the provided system context.
* Only one instance of this object should be created!
*
* @param context to use for accessing DB, window manager, etc.
@@ -55,6 +56,8 @@ public class SearchManagerService extends ISearchManager.Stub
public SearchManagerService(Context context) {
mContext = context;
mHandler = new Handler();
+ mSearchablesDirty = true;
+ mSearchables = new Searchables(context);
// Setup the infrastructure for updating and maintaining the list
// of searchable activities.
@@ -64,7 +67,6 @@ public class SearchManagerService extends ISearchManager.Stub
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
- mSearchablesDirty = true;
// After startup settles down, preload the searchables list,
// which will reduce the delay when the search UI is invoked.
@@ -109,34 +111,24 @@ public class SearchManagerService extends ISearchManager.Stub
};
/**
- * Update the list of searchables, either at startup or in response to
+ * Updates the list of searchables, either at startup or in response to
* a package add/remove broadcast message.
*/
private void updateSearchables() {
- SearchableInfo.buildSearchableList(mContext);
+ mSearchables.buildSearchableList();
mSearchablesDirty = false;
-
- // TODO This is a hack. This shouldn't be hardcoded here, it's probably
- // a policy.
-// ComponentName defaultSearch = new ComponentName(
-// "com.android.contacts",
-// "com.android.contacts.ContactsListActivity" );
- ComponentName defaultSearch = new ComponentName(
- "com.android.googlesearch",
- "com.android.googlesearch.GoogleSearch" );
- SearchableInfo.setDefaultSearchable(mContext, defaultSearch);
}
/**
- * Return the searchableinfo for a given activity
+ * Returns the SearchableInfo for a given activity
*
* @param launchActivity The activity from which we're launching this search.
- * @return Returns a SearchableInfo record describing the parameters of the search,
- * or null if no searchable metadata was available.
* @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.
* If true, this will always launch a platform-global (e.g. web-based) search instead.
+ * @return Returns a SearchableInfo record describing the parameters of the search,
+ * or null if no searchable metadata was available.
*/
public SearchableInfo getSearchableInfo(ComponentName launchActivity, boolean globalSearch) {
// final check. however we should try to avoid this, because
@@ -146,11 +138,19 @@ public class SearchManagerService extends ISearchManager.Stub
}
SearchableInfo si = null;
if (globalSearch) {
- si = SearchableInfo.getDefaultSearchable();
+ si = mSearchables.getDefaultSearchable();
} else {
- si = SearchableInfo.getSearchableInfo(mContext, launchActivity);
+ si = mSearchables.getSearchableInfo(launchActivity);
}
return si;
}
+
+ /**
+ * Returns a list of the searchable activities that can be included in global search.
+ */
+ public List<SearchableInfo> getSearchablesInGlobalSearch() {
+ return mSearchables.getSearchablesInGlobalSearchList();
+ }
+
}
diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java
index 0c04839..aad7ae2 100644
--- a/core/java/android/server/search/SearchableInfo.java
+++ b/core/java/android/server/search/SearchableInfo.java
@@ -21,14 +21,11 @@ import org.xmlpull.v1.XmlPullParserException;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
-import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.InputType;
@@ -38,9 +35,6 @@ import android.util.Xml;
import android.view.inputmethod.EditorInfo;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
public final class SearchableInfo implements Parcelable {
@@ -50,19 +44,12 @@ public final class SearchableInfo implements Parcelable {
// set this flag to 1 to prevent any apps from providing suggestions
final static int DBG_INHIBIT_SUGGESTIONS = 0;
- // static strings used for XML lookups, etc.
+ // static strings used for XML lookups.
// TODO how should these be documented for the developer, in a more structured way than
// the current long wordy javadoc in SearchManager.java ?
- private static final String MD_LABEL_DEFAULT_SEARCHABLE = "android.app.default_searchable";
private static final String MD_LABEL_SEARCHABLE = "android.app.searchable";
- private static final String MD_SEARCHABLE_SYSTEM_SEARCH = "*";
private static final String MD_XML_ELEMENT_SEARCHABLE = "searchable";
private static final String MD_XML_ELEMENT_SEARCHABLE_ACTION_KEY = "actionkey";
-
- // class maintenance and general shared data
- private static HashMap<ComponentName, SearchableInfo> sSearchablesMap = null;
- private static ArrayList<SearchableInfo> sSearchablesList = null;
- private static SearchableInfo sDefaultSearchable = null;
// true member variables - what we know about the searchability
// TO-DO replace public with getters
@@ -79,14 +66,15 @@ public final class SearchableInfo implements Parcelable {
private int mSearchButtonText = 0;
private int mSearchInputType = 0;
private int mSearchImeOptions = 0;
+ private boolean mIncludeInGlobalSearch = false;
private String mSuggestAuthority = null;
private String mSuggestPath = null;
private String mSuggestSelection = null;
private String mSuggestIntentAction = null;
private String mSuggestIntentData = null;
+ private int mSuggestThreshold = 0;
private ActionKeyInfo mActionKeyList = null;
private String mSuggestProviderPackage = null;
- private Context mCacheActivityContext = null; // use during setup only - don't hold memory!
// Flag values for Searchable_voiceSearchMode
private static int VOICE_SEARCH_SHOW_BUTTON = 1;
@@ -97,37 +85,7 @@ public final class SearchableInfo implements Parcelable {
private int mVoicePromptTextId; // voicePromptText
private int mVoiceLanguageId; // voiceLanguage
private int mVoiceMaxResults; // voiceMaxResults
-
- /**
- * Set the default searchable activity (when none is specified).
- */
- public static void setDefaultSearchable(Context context,
- ComponentName activity) {
- synchronized (SearchableInfo.class) {
- SearchableInfo si = null;
- if (activity != null) {
- si = getSearchableInfo(context, activity);
- if (si != null) {
- // move to front of list
- sSearchablesList.remove(si);
- sSearchablesList.add(0, si);
- }
- }
- sDefaultSearchable = si;
- }
- }
-
- /**
- * Provides the system-default search activity, which you can use
- * whenever getSearchableInfo() returns null;
- *
- * @return Returns the system-default search activity, null if never defined
- */
- public static SearchableInfo getDefaultSearchable() {
- synchronized (SearchableInfo.class) {
- return sDefaultSearchable;
- }
- }
+
/**
* Retrieve the authority for obtaining search suggestions.
@@ -184,6 +142,16 @@ public final class SearchableInfo implements Parcelable {
}
/**
+ * Gets the suggestion threshold for use with these suggestions.
+ *
+ * @return The value of the <code>searchSuggestThreshold</code> attribute,
+ * or 0 if the attribute is not set.
+ */
+ public int getSuggestThreshold() {
+ return mSuggestThreshold;
+ }
+
+ /**
* Get the context for the searchable activity.
*
* This is fairly expensive so do it on the original scan, or when an app is
@@ -193,9 +161,16 @@ public final class SearchableInfo implements Parcelable {
* @return Returns a context related to the searchable activity
*/
public Context getActivityContext(Context context) {
+ return createActivityContext(context, mSearchActivity);
+ }
+
+ /**
+ * Creates a context for another activity.
+ */
+ private static Context createActivityContext(Context context, ComponentName activity) {
Context theirContext = null;
try {
- theirContext = context.createPackageContext(mSearchActivity.getPackageName(), 0);
+ theirContext = context.createPackageContext(activity.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
// unexpected, but we deal with this by null-checking theirContext
} catch (java.lang.SecurityException e) {
@@ -234,242 +209,72 @@ public final class SearchableInfo implements Parcelable {
}
/**
- * Factory. Look up, or construct, based on the activity.
- *
- * The activities fall into three cases, based on meta-data found in
- * the manifest entry:
- * <ol>
- * <li>The activity itself implements search. This is indicated by the
- * presence of a "android.app.searchable" meta-data attribute.
- * The value is a reference to an XML file containing search information.</li>
- * <li>A related activity implements search. This is indicated by the
- * presence of a "android.app.default_searchable" meta-data attribute.
- * The value is a string naming the activity implementing search. In this
- * case the factory will "redirect" and return the searchable data.</li>
- * <li>No searchability data is provided. We return null here and other
- * code will insert the "default" (e.g. contacts) search.
- *
- * TODO: cache the result in the map, and check the map first.
- * TODO: it might make sense to implement the searchable reference as
- * an application meta-data entry. This way we don't have to pepper each
- * and every activity.
- * TODO: can we skip the constructor step if it's a non-searchable?
- * TODO: does it make sense to plug the default into a slot here for
- * automatic return? Probably not, but it's one way to do it.
- *
- * @param activity The name of the current activity, or null if the
- * activity does not define any explicit searchable metadata.
- */
- public static SearchableInfo getSearchableInfo(Context context,
- ComponentName activity) {
- // Step 1. Is the result already hashed? (case 1)
- SearchableInfo result;
- synchronized (SearchableInfo.class) {
- result = sSearchablesMap.get(activity);
- if (result != null) return result;
- }
-
- // Step 2. See if the current activity references a searchable.
- // Note: Conceptually, this could be a while(true) loop, but there's
- // no point in implementing reference chaining here and risking a loop.
- // References must point directly to searchable activities.
-
- ActivityInfo ai = null;
- XmlPullParser xml = null;
- try {
- ai = context.getPackageManager().
- getActivityInfo(activity, PackageManager.GET_META_DATA );
- String refActivityName = null;
-
- // First look for activity-specific reference
- Bundle md = ai.metaData;
- if (md != null) {
- refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
- }
- // If not found, try for app-wide reference
- if (refActivityName == null) {
- md = ai.applicationInfo.metaData;
- if (md != null) {
- refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
- }
- }
-
- // Irrespective of source, if a reference was found, follow it.
- if (refActivityName != null)
- {
- // An app or activity can declare that we should simply launch
- // "system default search" if search is invoked.
- if (refActivityName.equals(MD_SEARCHABLE_SYSTEM_SEARCH)) {
- return getDefaultSearchable();
- }
- String pkg = activity.getPackageName();
- ComponentName referredActivity;
- if (refActivityName.charAt(0) == '.') {
- referredActivity = new ComponentName(pkg, pkg + refActivityName);
- } else {
- referredActivity = new ComponentName(pkg, refActivityName);
- }
-
- // Now try the referred activity, and if found, cache
- // it against the original name so we can skip the check
- synchronized (SearchableInfo.class) {
- result = sSearchablesMap.get(referredActivity);
- if (result != null) {
- sSearchablesMap.put(activity, result);
- return result;
- }
- }
- }
- } catch (PackageManager.NameNotFoundException e) {
- // case 3: no metadata
- }
-
- // Step 3. None found. Return null.
- return null;
-
- }
-
- /**
- * Super-factory. Builds an entire list (suitable for display) of
- * activities that are searchable, by iterating the entire set of
- * ACTION_SEARCH intents.
- *
- * Also clears the hash of all activities -> searches which will
- * refill as the user clicks "search".
- *
- * This should only be done at startup and again if we know that the
- * list has changed.
- *
- * TODO: every activity that provides a ACTION_SEARCH intent should
- * also provide searchability meta-data. There are a bunch of checks here
- * that, if data is not found, silently skip to the next activity. This
- * won't help a developer trying to figure out why their activity isn't
- * showing up in the list, but an exception here is too rough. I would
- * like to find a better notification mechanism.
- *
- * TODO: sort the list somehow? UI choice.
- *
- * @param context a context we can use during this work
- */
- public static void buildSearchableList(Context context) {
-
- // create empty hash & list
- HashMap<ComponentName, SearchableInfo> newSearchablesMap
- = new HashMap<ComponentName, SearchableInfo>();
- ArrayList<SearchableInfo> newSearchablesList
- = new ArrayList<SearchableInfo>();
-
- // use intent resolver to generate list of ACTION_SEARCH receivers
- final PackageManager pm = context.getPackageManager();
- List<ResolveInfo> infoList;
- final Intent intent = new Intent(Intent.ACTION_SEARCH);
- infoList = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
-
- // analyze each one, generate a Searchables record, and record
- if (infoList != null) {
- int count = infoList.size();
- for (int ii = 0; ii < count; ii++) {
- // for each component, try to find metadata
- ResolveInfo info = infoList.get(ii);
- ActivityInfo ai = info.activityInfo;
- XmlResourceParser xml = ai.loadXmlMetaData(context.getPackageManager(),
- MD_LABEL_SEARCHABLE);
- if (xml == null) {
- continue;
- }
- ComponentName cName = new ComponentName(
- info.activityInfo.packageName,
- info.activityInfo.name);
-
- SearchableInfo searchable = getActivityMetaData(context, xml, cName);
- xml.close();
-
- if (searchable != null) {
- // no need to keep the context any longer. setup time is over.
- searchable.mCacheActivityContext = null;
-
- newSearchablesList.add(searchable);
- newSearchablesMap.put(cName, searchable);
- }
- }
- }
-
- // record the final values as a coherent pair
- synchronized (SearchableInfo.class) {
- sSearchablesList = newSearchablesList;
- sSearchablesMap = newSearchablesMap;
- }
- }
-
- /**
* Constructor
*
* Given a ComponentName, get the searchability info
* and build a local copy of it. Use the factory, not this.
*
- * @param context runtime context
+ * @param activityContext runtime context for the activity that the searchable info is about.
* @param attr The attribute set we found in the XML file, contains the values that are used to
* construct the object.
* @param cName The component name of the searchable activity
*/
- private SearchableInfo(Context context, AttributeSet attr, final ComponentName cName) {
+ private SearchableInfo(Context activityContext, AttributeSet attr, final ComponentName cName) {
// initialize as an "unsearchable" object
mSearchable = false;
mSearchActivity = cName;
- // to access another activity's resources, I need its context.
- // BE SURE to release the cache sometime after construction - it's a large object to hold
- mCacheActivityContext = getActivityContext(context);
- if (mCacheActivityContext != null) {
- TypedArray a = mCacheActivityContext.obtainStyledAttributes(attr,
- com.android.internal.R.styleable.Searchable);
- mSearchMode = a.getInt(com.android.internal.R.styleable.Searchable_searchMode, 0);
- mLabelId = a.getResourceId(com.android.internal.R.styleable.Searchable_label, 0);
- mHintId = a.getResourceId(com.android.internal.R.styleable.Searchable_hint, 0);
- mIconId = a.getResourceId(com.android.internal.R.styleable.Searchable_icon, 0);
- mSearchButtonText = a.getResourceId(
- com.android.internal.R.styleable.Searchable_searchButtonText, 0);
- mSearchInputType = a.getInt(com.android.internal.R.styleable.Searchable_inputType,
- InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_NORMAL);
- mSearchImeOptions = a.getInt(com.android.internal.R.styleable.Searchable_imeOptions,
- EditorInfo.IME_ACTION_SEARCH);
+ TypedArray a = activityContext.obtainStyledAttributes(attr,
+ com.android.internal.R.styleable.Searchable);
+ mSearchMode = a.getInt(com.android.internal.R.styleable.Searchable_searchMode, 0);
+ mLabelId = a.getResourceId(com.android.internal.R.styleable.Searchable_label, 0);
+ mHintId = a.getResourceId(com.android.internal.R.styleable.Searchable_hint, 0);
+ mIconId = a.getResourceId(com.android.internal.R.styleable.Searchable_icon, 0);
+ mSearchButtonText = a.getResourceId(
+ com.android.internal.R.styleable.Searchable_searchButtonText, 0);
+ mSearchInputType = a.getInt(com.android.internal.R.styleable.Searchable_inputType,
+ InputType.TYPE_CLASS_TEXT |
+ InputType.TYPE_TEXT_VARIATION_NORMAL);
+ mSearchImeOptions = a.getInt(com.android.internal.R.styleable.Searchable_imeOptions,
+ EditorInfo.IME_ACTION_SEARCH);
+ mIncludeInGlobalSearch = a.getBoolean(
+ com.android.internal.R.styleable.Searchable_includeInGlobalSearch, false);
- setSearchModeFlags();
- if (DBG_INHIBIT_SUGGESTIONS == 0) {
- mSuggestAuthority = a.getString(
- com.android.internal.R.styleable.Searchable_searchSuggestAuthority);
- mSuggestPath = a.getString(
- com.android.internal.R.styleable.Searchable_searchSuggestPath);
- mSuggestSelection = a.getString(
- com.android.internal.R.styleable.Searchable_searchSuggestSelection);
- mSuggestIntentAction = a.getString(
- com.android.internal.R.styleable.Searchable_searchSuggestIntentAction);
- mSuggestIntentData = a.getString(
- com.android.internal.R.styleable.Searchable_searchSuggestIntentData);
- }
- mVoiceSearchMode =
- a.getInt(com.android.internal.R.styleable.Searchable_voiceSearchMode, 0);
- // TODO this didn't work - came back zero from YouTube
- mVoiceLanguageModeId =
- a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguageModel, 0);
- mVoicePromptTextId =
- a.getResourceId(com.android.internal.R.styleable.Searchable_voicePromptText, 0);
- mVoiceLanguageId =
- a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguage, 0);
- mVoiceMaxResults =
- a.getInt(com.android.internal.R.styleable.Searchable_voiceMaxResults, 0);
+ setSearchModeFlags();
+ if (DBG_INHIBIT_SUGGESTIONS == 0) {
+ mSuggestAuthority = a.getString(
+ com.android.internal.R.styleable.Searchable_searchSuggestAuthority);
+ mSuggestPath = a.getString(
+ com.android.internal.R.styleable.Searchable_searchSuggestPath);
+ mSuggestSelection = a.getString(
+ com.android.internal.R.styleable.Searchable_searchSuggestSelection);
+ mSuggestIntentAction = a.getString(
+ com.android.internal.R.styleable.Searchable_searchSuggestIntentAction);
+ mSuggestIntentData = a.getString(
+ com.android.internal.R.styleable.Searchable_searchSuggestIntentData);
+ mSuggestThreshold = a.getInt(
+ com.android.internal.R.styleable.Searchable_searchSuggestThreshold, 0);
+ }
+ mVoiceSearchMode =
+ a.getInt(com.android.internal.R.styleable.Searchable_voiceSearchMode, 0);
+ // TODO this didn't work - came back zero from YouTube
+ mVoiceLanguageModeId =
+ a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguageModel, 0);
+ mVoicePromptTextId =
+ a.getResourceId(com.android.internal.R.styleable.Searchable_voicePromptText, 0);
+ mVoiceLanguageId =
+ a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguage, 0);
+ mVoiceMaxResults =
+ a.getInt(com.android.internal.R.styleable.Searchable_voiceMaxResults, 0);
- a.recycle();
+ a.recycle();
- // get package info for suggestions provider (if any)
- if (mSuggestAuthority != null) {
- ProviderInfo pi =
- context.getPackageManager().resolveContentProvider(mSuggestAuthority,
- 0);
- if (pi != null) {
- mSuggestProviderPackage = pi.packageName;
- }
+ // get package info for suggestions provider (if any)
+ if (mSuggestAuthority != null) {
+ PackageManager pm = activityContext.getPackageManager();
+ ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, 0);
+ if (pi != null) {
+ mSuggestProviderPackage = pi.packageName;
}
}
@@ -496,7 +301,7 @@ public final class SearchableInfo implements Parcelable {
/**
* Private class used to hold the "action key" configuration
*/
- public class ActionKeyInfo implements Parcelable {
+ public static class ActionKeyInfo implements Parcelable {
public int mKeyCode = 0;
public String mQueryActionMsg;
@@ -506,14 +311,15 @@ public final class SearchableInfo implements Parcelable {
/**
* Create one object using attributeset as input data.
- * @param context runtime context
+ * @param activityContext runtime context of the activity that the action key information
+ * is about.
* @param attr The attribute set we found in the XML file, contains the values that are used to
* construct the object.
* @param next We'll build these up using a simple linked list (since there are usually
* just zero or one).
*/
- public ActionKeyInfo(Context context, AttributeSet attr, ActionKeyInfo next) {
- TypedArray a = mCacheActivityContext.obtainStyledAttributes(attr,
+ public ActionKeyInfo(Context activityContext, AttributeSet attr, ActionKeyInfo next) {
+ TypedArray a = activityContext.obtainStyledAttributes(attr,
com.android.internal.R.styleable.SearchableActionKey);
mKeyCode = a.getInt(
@@ -584,6 +390,20 @@ public final class SearchableInfo implements Parcelable {
return null;
}
+ public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo) {
+ // for each component, try to find metadata
+ XmlResourceParser xml =
+ activityInfo.loadXmlMetaData(context.getPackageManager(), MD_LABEL_SEARCHABLE);
+ if (xml == null) {
+ return null;
+ }
+ ComponentName cName = new ComponentName(activityInfo.packageName, activityInfo.name);
+
+ SearchableInfo searchable = getActivityMetaData(context, xml, cName);
+ xml.close();
+ return searchable;
+ }
+
/**
* Get the metadata for a given activity
*
@@ -598,6 +418,7 @@ public final class SearchableInfo implements Parcelable {
private static SearchableInfo getActivityMetaData(Context context, XmlPullParser xml,
final ComponentName cName) {
SearchableInfo result = null;
+ Context activityContext = createActivityContext(context, cName);
// in order to use the attributes mechanism, we have to walk the parser
// forward through the file until it's reading the tag of interest.
@@ -608,7 +429,7 @@ public final class SearchableInfo implements Parcelable {
if (xml.getName().equals(MD_XML_ELEMENT_SEARCHABLE)) {
AttributeSet attr = Xml.asAttributeSet(xml);
if (attr != null) {
- result = new SearchableInfo(context, attr, cName);
+ result = new SearchableInfo(activityContext, attr, cName);
// if the constructor returned a bad object, exit now.
if (! result.mSearchable) {
return null;
@@ -621,7 +442,7 @@ public final class SearchableInfo implements Parcelable {
}
AttributeSet attr = Xml.asAttributeSet(xml);
if (attr != null) {
- ActionKeyInfo keyInfo = result.new ActionKeyInfo(context, attr,
+ ActionKeyInfo keyInfo = new ActionKeyInfo(activityContext, attr,
result.mActionKeyList);
// only add to list if it is was useable
if (keyInfo.mKeyCode != 0) {
@@ -637,6 +458,7 @@ public final class SearchableInfo implements Parcelable {
} catch (IOException e) {
throw new RuntimeException(e);
}
+
return result;
}
@@ -757,15 +579,15 @@ public final class SearchableInfo implements Parcelable {
}
/**
- * Return the list of searchable activities, for use in the drop-down.
+ * Checks whether the searchable is exported.
+ *
+ * @return The value of the <code>exported</code> attribute,
+ * or <code>false</code> if the attribute is not set.
*/
- public static ArrayList<SearchableInfo> getSearchablesList() {
- synchronized (SearchableInfo.class) {
- ArrayList<SearchableInfo> result = new ArrayList<SearchableInfo>(sSearchablesList);
- return result;
- }
+ public boolean shouldIncludeInGlobalSearch() {
+ return mIncludeInGlobalSearch;
}
-
+
/**
* Support for parcelable and aidl operations.
*/
@@ -797,6 +619,7 @@ public final class SearchableInfo implements Parcelable {
mSearchButtonText = in.readInt();
mSearchInputType = in.readInt();
mSearchImeOptions = in.readInt();
+ mIncludeInGlobalSearch = in.readInt() != 0;
setSearchModeFlags();
mSuggestAuthority = in.readString();
@@ -804,6 +627,7 @@ public final class SearchableInfo implements Parcelable {
mSuggestSelection = in.readString();
mSuggestIntentAction = in.readString();
mSuggestIntentData = in.readString();
+ mSuggestThreshold = in.readInt();
mActionKeyList = null;
int count = in.readInt();
@@ -834,12 +658,14 @@ public final class SearchableInfo implements Parcelable {
dest.writeInt(mSearchButtonText);
dest.writeInt(mSearchInputType);
dest.writeInt(mSearchImeOptions);
+ dest.writeInt(mIncludeInGlobalSearch ? 1 : 0);
dest.writeString(mSuggestAuthority);
dest.writeString(mSuggestPath);
dest.writeString(mSuggestSelection);
dest.writeString(mSuggestIntentAction);
dest.writeString(mSuggestIntentData);
+ dest.writeInt(mSuggestThreshold);
// This is usually a very short linked list so we'll just pre-count it
ActionKeyInfo nextKeyInfo = mActionKeyList;
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
new file mode 100644
index 0000000..40d7449
--- /dev/null
+++ b/core/java/android/server/search/Searchables.java
@@ -0,0 +1,249 @@
+/*
+ * 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.server.search;
+
+import android.app.SearchManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * This class maintains the information about all searchable activities.
+ */
+public class Searchables {
+
+ // static strings used for XML lookups, etc.
+ // TODO how should these be documented for the developer, in a more structured way than
+ // the current long wordy javadoc in SearchManager.java ?
+ private static final String MD_LABEL_DEFAULT_SEARCHABLE = "android.app.default_searchable";
+ private static final String MD_SEARCHABLE_SYSTEM_SEARCH = "*";
+
+ private Context mContext;
+
+ private HashMap<ComponentName, SearchableInfo> mSearchablesMap = null;
+ private ArrayList<SearchableInfo> mSearchablesList = null;
+ private ArrayList<SearchableInfo> mSearchablesInGlobalSearchList = null;
+ private SearchableInfo mDefaultSearchable = null;
+
+ /**
+ *
+ * @param context Context to use for looking up activities etc.
+ */
+ public Searchables (Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Look up, or construct, based on the activity.
+ *
+ * The activities fall into three cases, based on meta-data found in
+ * the manifest entry:
+ * <ol>
+ * <li>The activity itself implements search. This is indicated by the
+ * presence of a "android.app.searchable" meta-data attribute.
+ * The value is a reference to an XML file containing search information.</li>
+ * <li>A related activity implements search. This is indicated by the
+ * presence of a "android.app.default_searchable" meta-data attribute.
+ * The value is a string naming the activity implementing search. In this
+ * case the factory will "redirect" and return the searchable data.</li>
+ * <li>No searchability data is provided. We return null here and other
+ * code will insert the "default" (e.g. contacts) search.
+ *
+ * TODO: cache the result in the map, and check the map first.
+ * TODO: it might make sense to implement the searchable reference as
+ * an application meta-data entry. This way we don't have to pepper each
+ * and every activity.
+ * TODO: can we skip the constructor step if it's a non-searchable?
+ * TODO: does it make sense to plug the default into a slot here for
+ * automatic return? Probably not, but it's one way to do it.
+ *
+ * @param activity The name of the current activity, or null if the
+ * activity does not define any explicit searchable metadata.
+ */
+ public SearchableInfo getSearchableInfo(ComponentName activity) {
+ // Step 1. Is the result already hashed? (case 1)
+ SearchableInfo result;
+ synchronized (this) {
+ result = mSearchablesMap.get(activity);
+ if (result != null) return result;
+ }
+
+ // Step 2. See if the current activity references a searchable.
+ // Note: Conceptually, this could be a while(true) loop, but there's
+ // no point in implementing reference chaining here and risking a loop.
+ // References must point directly to searchable activities.
+
+ ActivityInfo ai = null;
+ try {
+ ai = mContext.getPackageManager().
+ getActivityInfo(activity, PackageManager.GET_META_DATA );
+ String refActivityName = null;
+
+ // First look for activity-specific reference
+ Bundle md = ai.metaData;
+ if (md != null) {
+ refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
+ }
+ // If not found, try for app-wide reference
+ if (refActivityName == null) {
+ md = ai.applicationInfo.metaData;
+ if (md != null) {
+ refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
+ }
+ }
+
+ // Irrespective of source, if a reference was found, follow it.
+ if (refActivityName != null)
+ {
+ // An app or activity can declare that we should simply launch
+ // "system default search" if search is invoked.
+ if (refActivityName.equals(MD_SEARCHABLE_SYSTEM_SEARCH)) {
+ return getDefaultSearchable();
+ }
+ String pkg = activity.getPackageName();
+ ComponentName referredActivity;
+ if (refActivityName.charAt(0) == '.') {
+ referredActivity = new ComponentName(pkg, pkg + refActivityName);
+ } else {
+ referredActivity = new ComponentName(pkg, refActivityName);
+ }
+
+ // Now try the referred activity, and if found, cache
+ // it against the original name so we can skip the check
+ synchronized (this) {
+ result = mSearchablesMap.get(referredActivity);
+ if (result != null) {
+ mSearchablesMap.put(activity, result);
+ return result;
+ }
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ // case 3: no metadata
+ }
+
+ // Step 3. None found. Return null.
+ return null;
+
+ }
+
+ /**
+ * Provides the system-default search activity, which you can use
+ * whenever getSearchableInfo() returns null;
+ *
+ * @return Returns the system-default search activity, null if never defined
+ */
+ public synchronized SearchableInfo getDefaultSearchable() {
+ return mDefaultSearchable;
+ }
+
+ public synchronized boolean isDefaultSearchable(SearchableInfo searchable) {
+ return searchable == mDefaultSearchable;
+ }
+
+ /**
+ * Builds an entire list (suitable for display) of
+ * activities that are searchable, by iterating the entire set of
+ * ACTION_SEARCH intents.
+ *
+ * Also clears the hash of all activities -> searches which will
+ * refill as the user clicks "search".
+ *
+ * This should only be done at startup and again if we know that the
+ * list has changed.
+ *
+ * TODO: every activity that provides a ACTION_SEARCH intent should
+ * also provide searchability meta-data. There are a bunch of checks here
+ * that, if data is not found, silently skip to the next activity. This
+ * won't help a developer trying to figure out why their activity isn't
+ * showing up in the list, but an exception here is too rough. I would
+ * like to find a better notification mechanism.
+ *
+ * TODO: sort the list somehow? UI choice.
+ */
+ public void buildSearchableList() {
+
+ // These will become the new values at the end of the method
+ HashMap<ComponentName, SearchableInfo> newSearchablesMap
+ = new HashMap<ComponentName, SearchableInfo>();
+ ArrayList<SearchableInfo> newSearchablesList
+ = new ArrayList<SearchableInfo>();
+ ArrayList<SearchableInfo> newSearchablesInGlobalSearchList
+ = new ArrayList<SearchableInfo>();
+
+ final PackageManager pm = mContext.getPackageManager();
+
+ // use intent resolver to generate list of ACTION_SEARCH receivers
+ List<ResolveInfo> infoList;
+ final Intent intent = new Intent(Intent.ACTION_SEARCH);
+ infoList = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
+
+ // analyze each one, generate a Searchables record, and record
+ if (infoList != null) {
+ int count = infoList.size();
+ for (int ii = 0; ii < count; ii++) {
+ // for each component, try to find metadata
+ ResolveInfo info = infoList.get(ii);
+ ActivityInfo ai = info.activityInfo;
+ SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai);
+ if (searchable != null) {
+ newSearchablesList.add(searchable);
+ newSearchablesMap.put(searchable.mSearchActivity, searchable);
+ if (searchable.shouldIncludeInGlobalSearch()) {
+ newSearchablesInGlobalSearchList.add(searchable);
+ }
+ }
+ }
+ }
+
+ // Find the global search provider
+ Intent globalSearchIntent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
+ ComponentName globalSearchActivity = globalSearchIntent.resolveActivity(pm);
+ SearchableInfo newDefaultSearchable = newSearchablesMap.get(globalSearchActivity);
+
+ // Store a consistent set of new values
+ synchronized (this) {
+ mSearchablesMap = newSearchablesMap;
+ mSearchablesList = newSearchablesList;
+ mSearchablesInGlobalSearchList = newSearchablesInGlobalSearchList;
+ mDefaultSearchable = newDefaultSearchable;
+ }
+ }
+
+ /**
+ * Returns the list of searchable activities.
+ */
+ public synchronized ArrayList<SearchableInfo> getSearchablesList() {
+ ArrayList<SearchableInfo> result = new ArrayList<SearchableInfo>(mSearchablesList);
+ return result;
+ }
+
+ /**
+ * Returns a list of the searchable activities that can be included in global search.
+ */
+ public synchronized ArrayList<SearchableInfo> getSearchablesInGlobalSearchList() {
+ return new ArrayList<SearchableInfo>(mSearchablesInGlobalSearchList);
+ }
+}
diff --git a/core/java/android/util/CharsetUtils.java b/core/java/android/util/CharsetUtils.java
new file mode 100644
index 0000000..7553029
--- /dev/null
+++ b/core/java/android/util/CharsetUtils.java
@@ -0,0 +1,169 @@
+/*
+ * 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.util;
+
+import android.os.Build;
+
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
+
+/**
+ * A class containing utility methods related to character sets. This
+ * class is primarily useful for code that wishes to be vendor-aware
+ * in its interpretation of Japanese encoding names.
+ *
+ * <p>As of this writing, the only vendor that is recognized by this
+ * class is Docomo (identified case-insensitively as {@code "docomo"}).</p>
+ *
+ * <b>Note:</b> This class is hidden in Cupcake, with a plan to
+ * un-hide in Donut. This was done because the first deployment to use
+ * this code is based on Cupcake, but the API had to be introduced
+ * after the public API freeze for that release. The upshot is that
+ * only system applications can safely use this class until Donut is
+ * available.
+ *
+ * @hide
+ */
+public final class CharsetUtils {
+ /**
+ * name of the vendor "Docomo". <b>Note:</b> This isn't a public
+ * constant, in order to keep this class from becoming a de facto
+ * reference list of vendor names.
+ */
+ private static final String VENDOR_DOCOMO = "docomo";
+
+ /**
+ * This class is uninstantiable.
+ */
+ private CharsetUtils() {
+ // This space intentionally left blank.
+ }
+
+ /**
+ * Returns the name of the vendor-specific character set
+ * corresponding to the given original character set name and
+ * vendor. If there is no vendor-specific character set for the
+ * given name/vendor pair, this returns the original character set
+ * name. The vendor name is matched case-insensitively.
+ *
+ * @param charsetName the base character set name
+ * @param vendor the vendor to specialize for
+ * @return the specialized character set name, or {@code charsetName} if
+ * there is no specialized name
+ */
+ public static String nameForVendor(String charsetName, String vendor) {
+ // TODO: Eventually, this may want to be table-driven.
+
+ if (vendor.equalsIgnoreCase(VENDOR_DOCOMO)
+ && isShiftJis(charsetName)) {
+ return "docomo-shift_jis-2007";
+ }
+
+ return charsetName;
+ }
+
+ /**
+ * Returns the name of the vendor-specific character set
+ * corresponding to the given original character set name and the
+ * default vendor (that is, the targeted vendor of the device this
+ * code is running on). This method merely calls through to
+ * {@link #nameForVendor(String,String)}, passing the default vendor
+ * as the second argument.
+ *
+ * @param charsetName the base character set name
+ * @return the specialized character set name, or {@code charsetName} if
+ * there is no specialized name
+ */
+ public static String nameForDefaultVendor(String charsetName) {
+ return nameForVendor(charsetName, getDefaultVendor());
+ }
+
+ /**
+ * Returns the vendor-specific character set corresponding to the
+ * given original character set name and vendor. If there is no
+ * vendor-specific character set for the given name/vendor pair,
+ * this returns the character set corresponding to the original
+ * name. The vendor name is matched case-insensitively. This
+ * method merely calls {@code Charset.forName()} on a name
+ * transformed by a call to {@link #nameForVendor(String,String)}.
+ *
+ * @param charsetName the base character set name
+ * @param vendor the vendor to specialize for
+ * @return the specialized character set, or the one corresponding
+ * directly to {@code charsetName} if there is no specialized
+ * variant
+ * @throws UnsupportedCharsetException thrown if the named character
+ * set is not supported by the system
+ * @throws IllegalCharsetNameException thrown if {@code charsetName}
+ * has invalid syntax
+ */
+ public static Charset charsetForVendor(String charsetName, String vendor)
+ throws UnsupportedCharsetException, IllegalCharsetNameException {
+ charsetName = nameForVendor(charsetName, vendor);
+ return Charset.forName(charsetName);
+ }
+
+ /**
+ * Returns the vendor-specific character set corresponding to the
+ * given original character set name and default vendor (that is,
+ * the targeted vendor of the device this code is running on).
+ * This method merely calls through to {@link
+ * #charsetForVendor(String,String)}, passing the default vendor
+ * as the second argument.
+ *
+ * @param charsetName the base character set name
+ * @return the specialized character set, or the one corresponding
+ * directly to {@code charsetName} if there is no specialized
+ * variant
+ * @throws UnsupportedCharsetException thrown if the named character
+ * set is not supported by the system
+ * @throws IllegalCharsetNameException thrown if {@code charsetName}
+ * has invalid syntax
+ */
+ public static Charset charsetForVendor(String charsetName)
+ throws UnsupportedCharsetException, IllegalCharsetNameException {
+ return charsetForVendor(charsetName, getDefaultVendor());
+ }
+
+ /**
+ * Returns whether the given character set name indicates the Shift-JIS
+ * encoding.
+ *
+ * @param charsetName the character set name
+ * @return {@code true} if the name corresponds to Shift-JIS or
+ * {@code false} if not
+ */
+ private static boolean isShiftJis(String charsetName) {
+ if (charsetName.length() != 9) {
+ // Bail quickly if the length doesn't match.
+ return false;
+ }
+
+ return charsetName.equalsIgnoreCase("shift_jis")
+ || charsetName.equalsIgnoreCase("shift-jis");
+ }
+
+ /**
+ * Gets the default vendor for this build.
+ *
+ * @return the default vendor name
+ */
+ private static String getDefaultVendor() {
+ return Build.BRAND;
+ }
+}
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 882a079..0d55679 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -102,7 +102,7 @@ public final class MotionEvent implements Parcelable {
private float mYPrecision;
private int mDeviceId;
private int mEdgeFlags;
-
+
private MotionEvent mNext;
private RuntimeException mRecycledLocation;
private boolean mRecycled;
@@ -210,7 +210,31 @@ public final class MotionEvent implements Parcelable {
return ev;
}
-
+
+ /**
+ * Scales down the cood of this event by the given scale.
+ *
+ * @hide
+ */
+ public void scale(float scale) {
+ if (scale != 1.0f) {
+ mX *= scale;
+ mY *= scale;
+ mRawX *= scale;
+ mRawY *= scale;
+ mSize *= scale;
+ mXPrecision *= scale;
+ mYPrecision *= scale;
+ if (mHistory != null) {
+ float[] history = mHistory;
+ int length = history.length;
+ for (int i = 0; i < length; i++) {
+ history[i] *= scale;
+ }
+ }
+ }
+ }
+
/**
* Create a new MotionEvent, copying from an existing one.
*/
@@ -682,4 +706,3 @@ public final class MotionEvent implements Parcelable {
}
}
-
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 03ae6dc..71da9cf 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -136,20 +136,28 @@ public class SurfaceView extends View {
int mFormat = -1;
int mType = -1;
final Rect mSurfaceFrame = new Rect();
+ private final float mAppScale;
+ private final float mAppScaleInverted;
public SurfaceView(Context context) {
super(context);
setWillNotDraw(true);
+ mAppScale = context.getApplicationScale();
+ mAppScaleInverted = 1.0f / mAppScale;
}
public SurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(true);
+ mAppScale = context.getApplicationScale();
+ mAppScaleInverted = 1.0f / mAppScale;
}
public SurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setWillNotDraw(true);
+ mAppScale = context.getApplicationScale();
+ mAppScaleInverted = 1.0f / mAppScale;
}
/**
@@ -298,8 +306,8 @@ public class SurfaceView extends View {
mLayout.x = mLeft;
mLayout.y = mTop;
- mLayout.width = getWidth();
- mLayout.height = getHeight();
+ mLayout.width = (int) (getWidth() * mAppScale);
+ mLayout.height = (int) (getHeight() * mAppScale);
mLayout.format = mRequestedFormat;
mLayout.flags |=WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_SCALED
@@ -326,9 +334,14 @@ public class SurfaceView extends View {
mSurfaceLock.lock();
mDrawingStopped = !visible;
final int relayoutResult = mSession.relayout(
- mWindow, mLayout, mWidth, mHeight,
+ mWindow, mLayout, (int) (mWidth * mAppScale), (int) (mHeight * mAppScale),
visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets,
mVisibleInsets, mSurface);
+
+ mContentInsets.scale(mAppScaleInverted);
+ mVisibleInsets.scale(mAppScaleInverted);
+ mWinFrame.scale(mAppScaleInverted);
+
if (localLOGV) Log.i(TAG, "New surface: " + mSurface
+ ", vis=" + visible + ", frame=" + mWinFrame);
mSurfaceFrame.left = 0;
@@ -396,15 +409,25 @@ public class SurfaceView extends View {
}
private static class MyWindow extends IWindow.Stub {
- private WeakReference<SurfaceView> mSurfaceView;
+ private final WeakReference<SurfaceView> mSurfaceView;
+ private final float mAppScale;
+ private final float mAppScaleInverted;
public MyWindow(SurfaceView surfaceView) {
mSurfaceView = new WeakReference<SurfaceView>(surfaceView);
+ mAppScale = surfaceView.getContext().getApplicationScale();
+ mAppScaleInverted = 1.0f / mAppScale;
}
public void resized(int w, int h, Rect coveredInsets,
Rect visibleInsets, boolean reportDraw) {
SurfaceView surfaceView = mSurfaceView.get();
+ float scale = mAppScaleInverted;
+ w *= scale;
+ h *= scale;
+ coveredInsets.scale(scale);
+ visibleInsets.scale(scale);
+
if (surfaceView != null) {
if (localLOGV) Log.v(
"SurfaceView", surfaceView + " got resized: w=" +
@@ -567,6 +590,7 @@ public class SurfaceView extends View {
Canvas c = null;
if (!mDrawingStopped && mWindow != null) {
Rect frame = dirty != null ? dirty : mSurfaceFrame;
+ frame.scale(mAppScale);
try {
c = mSurface.lockCanvas(frame);
} catch (Exception e) {
@@ -612,4 +636,3 @@ public class SurfaceView extends View {
}
};
}
-
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 18ee9ae..0b03626 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -128,6 +128,9 @@ public final class ViewRoot extends Handler implements ViewParent,
int mHeight;
Rect mDirty; // will be a graphics.Region soon
boolean mIsAnimating;
+ // TODO: change these to scaler class.
+ float mAppScale;
+ float mAppScaleInverted; // = 1.0f / mAppScale
final View.AttachInfo mAttachInfo;
@@ -384,10 +387,12 @@ public final class ViewRoot extends Handler implements ViewParent,
View panelParentView) {
synchronized (this) {
if (mView == null) {
+ mView = view;
+ mAppScale = mView.getContext().getApplicationScale();
+ mAppScaleInverted = 1.0f / mAppScale;
mWindowAttributes.copyFrom(attrs);
mSoftInputMode = attrs.softInputMode;
mWindowAttributesChanged = true;
- mView = view;
mAttachInfo.mRootView = view;
if (panelParentView != null) {
mAttachInfo.mPanelParentWindowToken
@@ -400,7 +405,7 @@ public final class ViewRoot extends Handler implements ViewParent,
// manager, to make sure we do the relayout before receiving
// any other events from the system.
requestLayout();
-
+
try {
res = sWindowSession.add(mWindow, attrs,
getHostVisibility(), mAttachInfo.mContentInsets);
@@ -411,6 +416,7 @@ public final class ViewRoot extends Handler implements ViewParent,
unscheduleTraversals();
throw new RuntimeException("Adding window failed", e);
}
+ mAttachInfo.mContentInsets.scale(mAppScaleInverted);
mPendingContentInsets.set(mAttachInfo.mContentInsets);
mPendingVisibleInsets.set(0, 0, 0, 0);
if (Config.LOGV) Log.v("ViewRoot", "Added window " + mWindow);
@@ -472,6 +478,8 @@ public final class ViewRoot extends Handler implements ViewParent,
synchronized (this) {
int oldSoftInputMode = mWindowAttributes.softInputMode;
mWindowAttributes.copyFrom(attrs);
+ mWindowAttributes.scale(mAppScale);
+
if (newView) {
mSoftInputMode = attrs.softInputMode;
requestLayout();
@@ -521,9 +529,14 @@ public final class ViewRoot extends Handler implements ViewParent,
public void invalidateChild(View child, Rect dirty) {
checkThread();
if (LOCAL_LOGV) Log.v(TAG, "Invalidate child: " + dirty);
- if (mCurScrollY != 0) {
+ if (mCurScrollY != 0 || mAppScale != 1.0f) {
mTempRect.set(dirty);
- mTempRect.offset(0, -mCurScrollY);
+ if (mCurScrollY != 0) {
+ mTempRect.offset(0, -mCurScrollY);
+ }
+ if (mAppScale != 1.0f) {
+ mTempRect.scale(mAppScale);
+ }
dirty = mTempRect;
}
mDirty.union(dirty);
@@ -613,8 +626,8 @@ public final class ViewRoot extends Handler implements ViewParent,
mLayoutRequested = true;
Display d = new Display(0);
- desiredWindowWidth = d.getWidth();
- desiredWindowHeight = d.getHeight();
+ desiredWindowWidth = (int) (d.getWidth() * mAppScaleInverted);
+ desiredWindowHeight = (int) (d.getHeight() * mAppScaleInverted);
// For the very first time, tell the view hierarchy that it
// is attached to the window. Note that at this point the surface
@@ -683,8 +696,8 @@ public final class ViewRoot extends Handler implements ViewParent,
windowResizesToFitContent = true;
Display d = new Display(0);
- desiredWindowWidth = d.getWidth();
- desiredWindowHeight = d.getHeight();
+ desiredWindowWidth = (int) (d.getWidth() * mAppScaleInverted);
+ desiredWindowHeight = (int) (d.getHeight() * mAppScaleInverted);
}
}
@@ -792,10 +805,12 @@ public final class ViewRoot extends Handler implements ViewParent,
params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
}
}
- relayoutResult = sWindowSession.relayout(
- mWindow, params, host.mMeasuredWidth, host.mMeasuredHeight,
- viewVisibility, insetsPending, frame,
- mPendingContentInsets, mPendingVisibleInsets, mSurface);
+ if (DEBUG_LAYOUT) {
+ Log.i(TAG, "host=w:" + host.mMeasuredWidth + ", h:" +
+ host.mMeasuredHeight + ", params=" + params);
+ }
+ relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
+
if (params != null) {
params.flags = fl;
}
@@ -862,7 +877,7 @@ public final class ViewRoot extends Handler implements ViewParent,
mHeight = frame.height();
if (initialized) {
- mGlCanvas.setViewport(mWidth, mHeight);
+ mGlCanvas.setViewport((int) (mWidth * mAppScale), (int) (mHeight * mAppScale));
}
boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
@@ -944,6 +959,11 @@ public final class ViewRoot extends Handler implements ViewParent,
mTmpLocation[1] + host.mBottom - host.mTop);
host.gatherTransparentRegion(mTransparentRegion);
+
+ // TODO: scale the region, like:
+ // Region uses native methods. We probabl should have ScalableRegion class.
+
+ // Region does not have equals method ?
if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
mPreviousTransparentRegion.set(mTransparentRegion);
// reconfigure window manager
@@ -974,6 +994,9 @@ public final class ViewRoot extends Handler implements ViewParent,
givenContent.left = givenContent.top = givenContent.right
= givenContent.bottom = givenVisible.left = givenVisible.top
= givenVisible.right = givenVisible.bottom = 0;
+ insets.contentInsets.scale(mAppScale);
+ insets.visibleInsets.scale(mAppScale);
+
attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets);
if (insetsPending || !mLastGivenInsets.equals(insets)) {
mLastGivenInsets.set(insets);
@@ -1113,7 +1136,7 @@ public final class ViewRoot extends Handler implements ViewParent,
int yoff;
final boolean scrolling = mScroller != null
- && mScroller.computeScrollOffset();
+ && mScroller.computeScrollOffset();
if (scrolling) {
yoff = mScroller.getCurrY();
} else {
@@ -1135,10 +1158,19 @@ public final class ViewRoot extends Handler implements ViewParent,
mGL.glEnable(GL_SCISSOR_TEST);
mAttachInfo.mDrawingTime = SystemClock.uptimeMillis();
- canvas.translate(0, -yoff);
mView.mPrivateFlags |= View.DRAWN;
- mView.draw(canvas);
- canvas.translate(0, yoff);
+
+ float scale = mAppScale;
+ int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ try {
+ canvas.translate(0, -yoff);
+ if (scale != 1.0f) {
+ canvas.scale(scale, scale);
+ }
+ mView.draw(canvas);
+ } finally {
+ canvas.restoreToCount(saveCount);
+ }
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
checkEglErrors();
@@ -1160,7 +1192,7 @@ public final class ViewRoot extends Handler implements ViewParent,
}
if (fullRedrawNeeded)
- dirty.union(0, 0, mWidth, mHeight);
+ dirty.union(0, 0, (int) (mWidth * mAppScale), (int) (mHeight * mAppScale));
if (DEBUG_ORIENTATION || DEBUG_DRAW) {
Log.v("ViewRoot", "Draw " + mView + "/"
@@ -1212,10 +1244,24 @@ public final class ViewRoot extends Handler implements ViewParent,
dirty.setEmpty();
mIsAnimating = false;
mAttachInfo.mDrawingTime = SystemClock.uptimeMillis();
- canvas.translate(0, -yoff);
- mView.mPrivateFlags |= View.DRAWN;
- mView.draw(canvas);
- canvas.translate(0, yoff);
+ mView.mPrivateFlags |= View.DRAWN;
+
+ float scale = mAppScale;
+ Context cxt = mView.getContext();
+ if (DEBUG_DRAW) {
+ Log.i(TAG, "Drawing: package:" + cxt.getPackageName() + ", appScale=" + mAppScale);
+ }
+ int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ try {
+ canvas.translate(0, -yoff);
+ if (scale != 1.0f) {
+ // re-scale this
+ canvas.scale(scale, scale);
+ }
+ mView.draw(canvas);
+ } finally {
+ canvas.restoreToCount(saveCount);
+ }
if (SHOW_FPS) {
int now = (int)SystemClock.elapsedRealtime();
@@ -1508,6 +1554,9 @@ public final class ViewRoot extends Handler implements ViewParent,
} else {
didFinish = event.getAction() == MotionEvent.ACTION_OUTSIDE;
}
+ if (event != null) {
+ event.scale(mAppScaleInverted);
+ }
try {
boolean handled;
@@ -1628,7 +1677,8 @@ public final class ViewRoot extends Handler implements ViewParent,
if (mGlWanted && !mUseGL) {
initializeGL();
if (mGlCanvas != null) {
- mGlCanvas.setViewport(mWidth, mHeight);
+ mGlCanvas.setViewport((int) (mWidth * mAppScale),
+ (int) (mHeight * mAppScale));
}
}
}
@@ -1828,6 +1878,9 @@ public final class ViewRoot extends Handler implements ViewParent,
} else {
didFinish = false;
}
+ if (event != null) {
+ event.scale(mAppScaleInverted);
+ }
if (DEBUG_TRACKBALL) Log.v(TAG, "Motion event:" + event);
@@ -2254,6 +2307,20 @@ public final class ViewRoot extends Handler implements ViewParent,
return mAudioManager;
}
+ private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
+ boolean insetsPending) throws RemoteException {
+ int relayoutResult = sWindowSession.relayout(
+ mWindow, params,
+ (int) (mView.mMeasuredWidth * mAppScale),
+ (int) (mView.mMeasuredHeight * mAppScale),
+ viewVisibility, insetsPending, mWinFrame,
+ mPendingContentInsets, mPendingVisibleInsets, mSurface);
+ mPendingContentInsets.scale(mAppScaleInverted);
+ mPendingVisibleInsets.scale(mAppScaleInverted);
+ mWinFrame.scale(mAppScaleInverted);
+ return relayoutResult;
+ }
+
/**
* {@inheritDoc}
*/
@@ -2322,12 +2389,8 @@ public final class ViewRoot extends Handler implements ViewParent,
// to the window manager to make sure it has the correct
// animation info.
try {
- if ((sWindowSession.relayout(
- mWindow, mWindowAttributes,
- mView.mMeasuredWidth, mView.mMeasuredHeight,
- viewVisibility, false, mWinFrame, mPendingContentInsets,
- mPendingVisibleInsets, mSurface)
- &WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
+ if ((relayoutWindow(mWindowAttributes, viewVisibility, false)
+ & WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
sWindowSession.finishDrawing(mWindow);
}
} catch (RemoteException e) {
@@ -2361,8 +2424,11 @@ public final class ViewRoot extends Handler implements ViewParent,
+ " visibleInsets=" + visibleInsets.toShortString()
+ " reportDraw=" + reportDraw);
Message msg = obtainMessage(reportDraw ? RESIZED_REPORT :RESIZED);
- msg.arg1 = w;
- msg.arg2 = h;
+
+ coveredInsets.scale(mAppScaleInverted);
+ visibleInsets.scale(mAppScaleInverted);
+ msg.arg1 = (int) (w * mAppScaleInverted);
+ msg.arg2 = (int) (h * mAppScaleInverted);
msg.obj = new Rect[] { new Rect(coveredInsets), new Rect(visibleInsets) };
sendMessage(msg);
}
@@ -2493,7 +2559,7 @@ public final class ViewRoot extends Handler implements ViewParent,
sWindowSession.finishKey(mWindow);
} catch (RemoteException e) {
}
- } else if (mIsPointer) {
+ } else if (mIsPointer) {
boolean didFinish;
MotionEvent event = mMotionEvent;
if (event == null) {
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index b87cc42..f6a171d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -953,7 +953,20 @@ public interface WindowManager extends ViewManager {
sb.append('}');
return sb.toString();
}
-
+
+ void scale(float scale) {
+ if (scale != 1.0f) {
+ x *= scale;
+ y *= scale;
+ if (width > 0) {
+ width *= scale;
+ }
+ if (height > 0) {
+ height *= scale;
+ }
+ }
+ }
+
private CharSequence mTitle = "";
}
}
diff --git a/core/java/android/view/animation/Transformation.java b/core/java/android/view/animation/Transformation.java
index f9e85bf..cf210c8 100644
--- a/core/java/android/view/animation/Transformation.java
+++ b/core/java/android/view/animation/Transformation.java
@@ -18,6 +18,8 @@ package android.view.animation;
import android.graphics.Matrix;
+import java.io.PrintWriter;
+
/**
* Defines the transformation to be applied at
* one point in time of an Animation.
@@ -134,14 +136,38 @@ public class Transformation {
@Override
public String toString() {
- return "Transformation{alpha=" + mAlpha + " matrix="
- + mMatrix.toShortString() + "}";
+ StringBuilder sb = new StringBuilder(64);
+ sb.append("Transformation");
+ toShortString(sb);
+ return sb.toString();
}
/**
* Return a string representation of the transformation in a compact form.
*/
public String toShortString() {
- return "{alpha=" + mAlpha + " matrix=" + mMatrix.toShortString() + "}";
+ StringBuilder sb = new StringBuilder(64);
+ toShortString(sb);
+ return sb.toString();
+ }
+
+ /**
+ * @hide
+ */
+ public void toShortString(StringBuilder sb) {
+ sb.append("{alpha="); sb.append(mAlpha);
+ sb.append(" matrix="); mMatrix.toShortString(sb);
+ sb.append('}');
+ }
+
+ /**
+ * Print short string, to optimize dumping.
+ * @hide
+ */
+ public void printShortString(PrintWriter pw) {
+ pw.print("{alpha="); pw.print(mAlpha);
+ pw.print(" matrix=");
+ mMatrix.printShortString(pw);
+ pw.print('}');
}
}
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 5f8acc8..be15ef8 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -72,35 +72,36 @@ class CallbackProxy extends Handler {
private final Context mContext;
// Message Ids
- private static final int PAGE_STARTED = 100;
- private static final int RECEIVED_ICON = 101;
- private static final int RECEIVED_TITLE = 102;
- private static final int OVERRIDE_URL = 103;
- private static final int AUTH_REQUEST = 104;
- private static final int SSL_ERROR = 105;
- private static final int PROGRESS = 106;
- private static final int UPDATE_VISITED = 107;
- private static final int LOAD_RESOURCE = 108;
- private static final int CREATE_WINDOW = 109;
- private static final int CLOSE_WINDOW = 110;
- private static final int SAVE_PASSWORD = 111;
- private static final int JS_ALERT = 112;
- private static final int JS_CONFIRM = 113;
- private static final int JS_PROMPT = 114;
- private static final int JS_UNLOAD = 115;
- private static final int ASYNC_KEYEVENTS = 116;
- private static final int TOO_MANY_REDIRECTS = 117;
- private static final int DOWNLOAD_FILE = 118;
- private static final int REPORT_ERROR = 119;
- private static final int RESEND_POST_DATA = 120;
- private static final int PAGE_FINISHED = 121;
- private static final int REQUEST_FOCUS = 122;
- private static final int SCALE_CHANGED = 123;
- private static final int RECEIVED_CERTIFICATE = 124;
- private static final int SWITCH_OUT_HISTORY = 125;
+ private static final int PAGE_STARTED = 100;
+ private static final int RECEIVED_ICON = 101;
+ private static final int RECEIVED_TITLE = 102;
+ private static final int OVERRIDE_URL = 103;
+ private static final int AUTH_REQUEST = 104;
+ private static final int SSL_ERROR = 105;
+ private static final int PROGRESS = 106;
+ private static final int UPDATE_VISITED = 107;
+ private static final int LOAD_RESOURCE = 108;
+ private static final int CREATE_WINDOW = 109;
+ private static final int CLOSE_WINDOW = 110;
+ private static final int SAVE_PASSWORD = 111;
+ private static final int JS_ALERT = 112;
+ private static final int JS_CONFIRM = 113;
+ private static final int JS_PROMPT = 114;
+ private static final int JS_UNLOAD = 115;
+ private static final int ASYNC_KEYEVENTS = 116;
+ private static final int TOO_MANY_REDIRECTS = 117;
+ private static final int DOWNLOAD_FILE = 118;
+ private static final int REPORT_ERROR = 119;
+ private static final int RESEND_POST_DATA = 120;
+ private static final int PAGE_FINISHED = 121;
+ private static final int REQUEST_FOCUS = 122;
+ private static final int SCALE_CHANGED = 123;
+ private static final int RECEIVED_CERTIFICATE = 124;
+ private static final int SWITCH_OUT_HISTORY = 125;
+ private static final int EXCEEDED_DATABASE_QUOTA = 126;
// Message triggered by the client to resume execution
- private static final int NOTIFY = 200;
+ private static final int NOTIFY = 200;
// Result transportation object for returning results across thread
// boundaries.
@@ -388,6 +389,23 @@ class CallbackProxy extends Handler {
}
break;
+ case EXCEEDED_DATABASE_QUOTA:
+ if (mWebChromeClient != null) {
+ HashMap<String, Object> map =
+ (HashMap<String, Object>) msg.obj;
+ String databaseIdentifier =
+ (String) map.get("databaseIdentifier");
+ String url = (String) map.get("url");
+ long currentQuota =
+ ((Long) map.get("currentQuota")).longValue();
+ WebStorage.QuotaUpdater quotaUpdater =
+ (WebStorage.QuotaUpdater) map.get("quotaUpdater");
+
+ mWebChromeClient.onExceededDatabaseQuota(url,
+ databaseIdentifier, currentQuota, quotaUpdater);
+ }
+ break;
+
case JS_ALERT:
if (mWebChromeClient != null) {
final JsResult res = (JsResult) msg.obj;
@@ -1022,4 +1040,37 @@ class CallbackProxy extends Handler {
}
return result.getResult();
}
+
+ /**
+ * Called by WebViewCore to inform the Java side that the current origin
+ * has overflowed it's database quota. Called in the WebCore thread so
+ * posts a message to the UI thread that will prompt the WebChromeClient
+ * for what to do. On return back to C++ side, the WebCore thread will
+ * sleep pending a new quota value.
+ * @param url The URL that caused the quota overflow.
+ * @param databaseIdentifier The identifier of the database that the
+ * transaction that caused the overflow was running on.
+ * @param currentQuota The current quota the origin is allowed.
+ * @param quotaUpdater An instance of a class encapsulating a callback
+ * to WebViewCore to run when the decision to allow or deny more
+ * quota has been made.
+ */
+ public void onExceededDatabaseQuota(
+ String url, String databaseIdentifier, long currentQuota,
+ WebStorage.QuotaUpdater quotaUpdater) {
+ if (mWebChromeClient == null) {
+ quotaUpdater.updateQuota(currentQuota);
+ return;
+ }
+
+ Message exceededQuota = obtainMessage(EXCEEDED_DATABASE_QUOTA);
+ HashMap<String, Object> map = new HashMap();
+ map.put("databaseIdentifier", databaseIdentifier);
+ map.put("url", url);
+ map.put("currentQuota", currentQuota);
+ map.put("quotaUpdater", quotaUpdater);
+ exceededQuota.obj = map;
+ sendMessage(exceededQuota);
+ }
+
}
diff --git a/core/java/android/webkit/DataLoader.java b/core/java/android/webkit/DataLoader.java
index dcdc949..c1d1280 100644
--- a/core/java/android/webkit/DataLoader.java
+++ b/core/java/android/webkit/DataLoader.java
@@ -16,12 +16,10 @@
package android.webkit;
-import org.apache.http.protocol.HTTP;
-
-import android.net.http.Headers;
-
import java.io.ByteArrayInputStream;
+import org.apache.harmony.luni.util.Base64;
+
/**
* This class is a concrete implementation of StreamLoader that uses the
* content supplied as a URL as the source for the stream. The mimetype
@@ -30,8 +28,6 @@ import java.io.ByteArrayInputStream;
*/
class DataLoader extends StreamLoader {
- private String mContentType; // Content mimetype, if supplied in URL
-
/**
* Constructor uses the dataURL as the source for an InputStream
* @param dataUrl data: URL string optionally containing a mimetype
@@ -41,16 +37,20 @@ class DataLoader extends StreamLoader {
super(loadListener);
String url = dataUrl.substring("data:".length());
- String content;
+ byte[] data = null;
int commaIndex = url.indexOf(',');
if (commaIndex != -1) {
- mContentType = url.substring(0, commaIndex);
- content = url.substring(commaIndex + 1);
+ String contentType = url.substring(0, commaIndex);
+ data = url.substring(commaIndex + 1).getBytes();
+ loadListener.parseContentTypeHeader(contentType);
+ if (loadListener.transferEncoding().equals("base64")) {
+ data = Base64.decode(data);
+ }
} else {
- content = url;
+ data = url.getBytes();
}
- mDataStream = new ByteArrayInputStream(content.getBytes());
- mContentLength = content.length();
+ mDataStream = new ByteArrayInputStream(data);
+ mContentLength = data.length;
}
@Override
@@ -60,10 +60,7 @@ class DataLoader extends StreamLoader {
}
@Override
- protected void buildHeaders(Headers headers) {
- if (mContentType != null) {
- headers.setContentType(mContentType);
- }
+ protected void buildHeaders(android.net.http.Headers h) {
}
/**
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index 36aa14b..d3e26bd 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -43,8 +43,6 @@ import java.util.Vector;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
-import org.apache.commons.codec.binary.Base64;
-
class LoadListener extends Handler implements EventHandler {
private static final String LOGTAG = "webkit";
@@ -140,8 +138,6 @@ class LoadListener extends Handler implements EventHandler {
mBrowserFrame = frame;
setUrl(url);
mNativeLoader = nativeLoader;
- mMimeType = "";
- mEncoding = "";
mSynchronous = synchronous;
if (synchronous) {
mMessageQueue = new Vector<Message>();
@@ -292,8 +288,6 @@ class LoadListener extends Handler implements EventHandler {
private void handleHeaders(Headers headers) {
if (mCancelled) return;
mHeaders = headers;
- mMimeType = "";
- mEncoding = "";
ArrayList<String> cookies = headers.getSetCookie();
for (int i = 0; i < cookies.size(); ++i) {
@@ -442,6 +436,9 @@ class LoadListener extends Handler implements EventHandler {
status.put("reason", reasonPhrase);
// New status means new data. Clear the old.
mDataBuilder.clear();
+ mMimeType = "";
+ mEncoding = "";
+ mTransferEncoding = "";
sendMessageInternal(obtainMessage(MSG_STATUS, status));
}
@@ -517,19 +514,6 @@ class LoadListener extends Handler implements EventHandler {
Log.v(LOGTAG, "LoadListener.data(): url: " + url());
}
- // Decode base64 data
- // Note: It's fine that we only decode base64 here and not in the other
- // data call because the only caller of the stream version is not
- // base64 encoded.
- if ("base64".equals(mTransferEncoding)) {
- if (length < data.length) {
- byte[] trimmedData = new byte[length];
- System.arraycopy(data, 0, trimmedData, 0, length);
- data = trimmedData;
- }
- data = Base64.decodeBase64(data);
- length = data.length;
- }
// Synchronize on mData because commitLoad may write mData to WebCore
// and we don't want to replace mData or mDataLength at the same time
// as a write.
@@ -904,6 +888,10 @@ class LoadListener extends Handler implements EventHandler {
return mMimeType;
}
+ String transferEncoding() {
+ return mTransferEncoding;
+ }
+
/*
* Return the size of the content being downloaded. This represents the
* full content size, even under the situation where the download has been
@@ -1198,7 +1186,7 @@ class LoadListener extends Handler implements EventHandler {
private static final Pattern CONTENT_TYPE_PATTERN =
Pattern.compile("^((?:[xX]-)?[a-zA-Z\\*]+/[\\w\\+\\*-]+[\\.[\\w\\+-]+]*)$");
- private void parseContentTypeHeader(String contentType) {
+ /* package */ void parseContentTypeHeader(String contentType) {
if (WebView.LOGV_ENABLED) {
Log.v(LOGTAG, "LoadListener.parseContentTypeHeader: " +
"contentType: " + contentType);
diff --git a/core/java/android/webkit/StreamLoader.java b/core/java/android/webkit/StreamLoader.java
index 705157c..7d6d7cc 100644
--- a/core/java/android/webkit/StreamLoader.java
+++ b/core/java/android/webkit/StreamLoader.java
@@ -102,7 +102,7 @@ abstract class StreamLoader extends Handler {
// to pass data to the loader
mData = new byte[8192];
sendHeaders();
- while (!sendData());
+ while (!sendData() && !mHandler.cancelled());
closeStreamAndSendEndData();
mHandler.loadSynchronousMessages();
}
@@ -116,6 +116,10 @@ abstract class StreamLoader extends Handler {
if (WebView.DEBUG && mHandler.isSynchronous()) {
throw new AssertionError();
}
+ if (mHandler.cancelled()) {
+ closeStreamAndSendEndData();
+ return;
+ }
switch(msg.what) {
case MSG_STATUS:
if (setupStreamAndSendStatus()) {
diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java
index f940006..0b874fa 100644
--- a/core/java/android/webkit/WebChromeClient.java
+++ b/core/java/android/webkit/WebChromeClient.java
@@ -157,4 +157,21 @@ public class WebChromeClient {
JsResult result) {
return false;
}
+
+ /**
+ * Tell the client that the database quota for the origin has been exceeded.
+ * @param url The URL that triggered the notification
+ * @param databaseIdentifier The identifier of the database that caused the
+ * quota overflow.
+ * @param currentQuota The current quota for the origin.
+ * @param quotaUpdater A callback to inform the WebCore thread that a new
+ * quota is available. This callback must always be executed at some
+ * point to ensure that the sleeping WebCore thread is woken up.
+ */
+ public void onExceededDatabaseQuota(String url, String databaseIdentifier,
+ long currentQuota, WebStorage.QuotaUpdater quotaUpdater) {
+ // This default implementation passes the current quota back to WebCore.
+ // WebCore will interpret this that new quota was declined.
+ quotaUpdater.updateQuota(currentQuota);
+ }
}
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 98e66b6..5a2cd26 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -159,6 +159,8 @@ public class WebSettings {
private boolean mSupportZoom = true;
private boolean mBuiltInZoomControls = false;
private boolean mAllowFileAccess = true;
+ private String mDatabasePath = "";
+ private boolean mDatabaseEnabled = false;
private String mAppCachePath = "";
private boolean mAppCacheEnabled = false;
@@ -901,6 +903,19 @@ public class WebSettings {
}
/**
+ * Set the path to where database storage API databases should be saved.
+ * This will update WebCore when the Sync runs in the C++ side.
+ * @param databasePath String path to the directory where databases should
+ * be saved. May be the empty string but should never be null.
+ */
+ public synchronized void setDatabasePath(String databasePath) {
+ if (databasePath != null && !databasePath.equals(mDatabasePath)) {
+ mDatabasePath = databasePath;
+ postSync();
+ }
+ }
+
+ /**
* Tell the WebView to enable Application Caches API.
* @param flag True if the WebView should enable Application Caches.
* @hide pending api council approval
@@ -928,6 +943,35 @@ public class WebSettings {
}
/**
+ * Set whether the database storage API is enabled.
+ * @param flag boolean True if the WebView should use the database storage
+ * API.
+ */
+ public synchronized void setDatabaseEnabled(boolean flag) {
+ if (mDatabaseEnabled != flag) {
+ mDatabaseEnabled = flag;
+ postSync();
+ }
+ }
+
+ /**
+ * Return the path to where database storage API databases are saved for
+ * the current WebView.
+ * @return the String path to the database storage API databases.
+ */
+ public synchronized String getDatabasePath() {
+ return mDatabasePath;
+ }
+
+ /**
+ * Returns true if database storage API is enabled.
+ * @return True if the database storage API is enabled.
+ */
+ public synchronized boolean getDatabaseEnabled() {
+ return mDatabaseEnabled;
+ }
+
+ /**
* Return true if javascript is enabled. <b>Note: The default is false.</b>
* @return True if javascript is enabled.
*/
diff --git a/core/java/android/webkit/WebStorage.java b/core/java/android/webkit/WebStorage.java
new file mode 100644
index 0000000..a0faf76
--- /dev/null
+++ b/core/java/android/webkit/WebStorage.java
@@ -0,0 +1,35 @@
+/*
+ * 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.webkit;
+
+/**
+ * Functionality for manipulating the webstorage databases.
+ */
+public final class WebStorage {
+
+ /**
+ * Encapsulates a callback function to be executed when a new quota is made
+ * available. We primarily want this to allow us to call back the sleeping
+ * WebCore thread from outside the WebViewCore class (as the native call
+ * is private). It is imperative that this the setDatabaseQuota method is
+ * executed once a decision to either allow or deny new quota is made,
+ * otherwise the WebCore thread will remain asleep.
+ */
+ public interface QuotaUpdater {
+ public void updateQuota(long newQuota);
+ };
+}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 1415597..b364952 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -233,6 +233,27 @@ final class WebViewCore {
}
/**
+ * Notify the user that the origin has exceeded it's database quota.
+ * @param url The URL that caused the overflow.
+ * @param databaseIdentifier The identifier of the database.
+ * @param currentQuota The current quota for the origin.
+ */
+ protected void exceededDatabaseQuota(String url,
+ String databaseIdentifier,
+ long currentQuota) {
+ // Inform the callback proxy of the quota overflow. Send an object
+ // that encapsulates a call to the nativeSetDatabaseQuota method to
+ // awaken the sleeping webcore thread when a decision from the
+ // client to allow or deny quota is available.
+ mCallbackProxy.onExceededDatabaseQuota(url, databaseIdentifier,
+ currentQuota, new WebStorage.QuotaUpdater() {
+ public void updateQuota(long quota) {
+ nativeSetDatabaseQuota(quota);
+ }
+ });
+ }
+
+ /**
* Invoke a javascript confirm dialog.
* @param message The message displayed in the dialog.
* @return True if the user confirmed or false if the user cancelled.
@@ -396,6 +417,14 @@ final class WebViewCore {
// local asset files for resources
private native void nativeRegisterURLSchemeAsLocal(String scheme);
+ /*
+ * Inform webcore that the user has decided whether to allow or deny new
+ * quota for the current origin and that the main thread should wake up
+ * now.
+ * @param quota The new quota.
+ */
+ private native void nativeSetDatabaseQuota(long quota);
+
// EventHub for processing messages
private final EventHub mEventHub;
// WebCore thread handler
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 772ad89..b408f27 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -983,18 +983,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mSelectorRect.setEmpty();
invalidate();
}
-
- /**
- * The list is empty and we need to change the layout, so *really* clear everything out.
- * @hide - for AutoCompleteTextView & SearchDialog only
- */
- /* package */ void resetListAndClearViews() {
- rememberSyncState();
- removeAllViewsInLayout();
- mRecycler.clear();
- mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());
- requestLayout();
- }
@Override
protected int computeVerticalScrollExtent() {
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index a17c78d..e11303d 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -110,6 +110,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
private final DropDownItemClickListener mDropDownItemClickListener =
new DropDownItemClickListener();
+ private boolean mDropDownAlwaysVisible = false;
+
+ private boolean mDropDownDismissedOnCompletion = true;
+
private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN;
private boolean mOpenBefore;
@@ -324,7 +328,82 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public int getDropDownHorizontalOffset() {
return mDropDownHorizontalOffset;
}
-
+
+ /**
+ * <p>Sets the animation style of the auto-complete drop-down list.</p>
+ *
+ * <p>If the drop-down is showing, calling this method will take effect only
+ * the next time the drop-down is shown.</p>
+ *
+ * @param animationStyle animation style to use when the drop-down appears
+ * and disappears. Set to -1 for the default animation, 0 for no
+ * animation, or a resource identifier for an explicit animation.
+ *
+ * @hide Pending API council approval
+ */
+ public void setDropDownAnimationStyle(int animationStyle) {
+ mPopup.setAnimationStyle(animationStyle);
+ }
+
+ /**
+ * <p>Returns the animation style that is used when the drop-down list appears and disappears
+ * </p>
+ *
+ * @return the animation style that is used when the drop-down list appears and disappears
+ *
+ * @hide Pending API council approval
+ */
+ public int getDropDownAnimationStyle() {
+ return mPopup.getAnimationStyle();
+ }
+
+ /**
+ * @return Whether the drop-down is visible as long as there is {@link #enoughToFilter()}
+ *
+ * @hide Pending API council approval
+ */
+ public boolean isDropDownAlwaysVisible() {
+ return mDropDownAlwaysVisible;
+ }
+
+ /**
+ * Sets whether the drop-down should remain visible as long as there is there is
+ * {@link #enoughToFilter()}. This is useful if an unknown number of results are expected
+ * to show up in the adapter sometime in the future.
+ *
+ * The drop-down will occupy the entire screen below {@link #getDropDownAnchor} regardless
+ * of the size or content of the list. {@link #getDropDownBackground()} will fill any space
+ * that is not used by the list.
+ *
+ * @param dropDownAlwaysVisible Whether to keep the drop-down visible.
+ *
+ * @hide Pending API council approval
+ */
+ public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) {
+ mDropDownAlwaysVisible = dropDownAlwaysVisible;
+ }
+
+ /**
+ * Checks whether the drop-down is dismissed when a suggestion is clicked.
+ *
+ * @hide Pending API council approval
+ */
+ public boolean isDropDownDismissedOnCompletion() {
+ return mDropDownDismissedOnCompletion;
+ }
+
+ /**
+ * Sets whether the drop-down is dismissed when a suggestion is clicked. This is
+ * true by default.
+ *
+ * @param dropDownDismissedOnCompletion Whether to dismiss the drop-down.
+ *
+ * @hide Pending API council approval
+ */
+ public void setDropDownDismissedOnCompletion(boolean dropDownDismissedOnCompletion) {
+ mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion;
+ }
+
/**
* <p>Returns the number of characters the user must type before the drop
* down list is shown.</p>
@@ -705,16 +784,6 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
return ListView.INVALID_POSITION;
}
-
- /**
- * We're changing the adapter and its views so really, really clear everything out
- * @hide - for SearchDialog only
- */
- public void resetListAndClearViews() {
- if (mDropDownList != null) {
- mDropDownList.resetListAndClearViews();
- }
- }
/**
* <p>Starts filtering the content of the drop down list. The filtering
@@ -786,7 +855,9 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
}
- dismissDropDown();
+ if (mDropDownDismissedOnCompletion) {
+ dismissDropDown();
+ }
}
/**
@@ -798,6 +869,42 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
/**
+ * Like {@link #setText(CharSequence)}, except that it can disable filtering.
+ *
+ * @param filter If <code>false</code>, no filtering will be performed
+ * as a result of this call.
+ *
+ * @hide Pending API council approval.
+ */
+ public void setText(CharSequence text, boolean filter) {
+ if (filter) {
+ setText(text);
+ } else {
+ mBlockCompletion = true;
+ setText(text);
+ mBlockCompletion = false;
+ }
+ }
+
+ /**
+ * Like {@link #setTextKeepState(CharSequence)}, except that it can disable filtering.
+ *
+ * @param filter If <code>false</code>, no filtering will be performed
+ * as a result of this call.
+ *
+ * @hide Pending API council approval.
+ */
+ public void setTextKeepState(CharSequence text, boolean filter) {
+ if (filter) {
+ setTextKeepState(text);
+ } else {
+ mBlockCompletion = true;
+ setTextKeepState(text);
+ mBlockCompletion = false;
+ }
+ }
+
+ /**
* <p>Performs the text completion by replacing the current text by the
* selected item. Subclasses should override this method to avoid replacing
* the whole content of the edit box.</p>
@@ -811,6 +918,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
Selection.setSelection(spannable, spannable.length());
}
+ /** {@inheritDoc} */
public void onFilterComplete(int count) {
if (mAttachCount <= 0) return;
@@ -821,7 +929,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
* to filter.
*/
- if (count > 0 && enoughToFilter()) {
+ if ((count > 0 || mDropDownAlwaysVisible) && enoughToFilter()) {
if (hasFocus() && hasWindowFocus()) {
showDropDown();
}
@@ -917,10 +1025,9 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
mDropDownVerticalOffset, widthSpec, height);
} else {
if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) {
- mPopup.setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
+ mPopup.setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT, 0);
} else {
- mPopup.setWindowLayoutMode(0, ViewGroup.LayoutParams.WRAP_CONTENT);
+ mPopup.setWindowLayoutMode(0, 0);
if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
mPopup.setWidth(getDropDownAnchorView().getWidth());
} else {
@@ -1027,8 +1134,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
final int maxHeight = mPopup.getMaxAvailableHeight(this, mDropDownVerticalOffset);
//otherHeights += dropDownView.getPaddingTop() + dropDownView.getPaddingBottom();
- return mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED,
+ final int measuredHeight = mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED,
0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights;
+
+ return mDropDownAlwaysVisible ? maxHeight : measuredHeight;
}
private View getHintView(Context context) {
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index f5a0b1c..abcc715 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -33,7 +33,7 @@ import com.android.internal.R;
* something other than {@link android.widget.ListView#CHOICE_MODE_NONE CHOICE_MODE_NONE}.
*
*/
-public abstract class CheckedTextView extends TextView implements Checkable {
+public class CheckedTextView extends TextView implements Checkable {
private boolean mChecked;
private int mCheckMarkResource;
private Drawable mCheckMarkDrawable;
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 1daee4e..66c162e 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -460,10 +460,30 @@ public class ListView extends AbsListView {
*/
@Override
void resetList() {
+ // The parent's resetList() will remove all views from the layout so we need to
+ // cleanup the state of our footers and headers
+ clearRecycledState(mHeaderViewInfos);
+ clearRecycledState(mFooterViewInfos);
+
super.resetList();
+
mLayoutMode = LAYOUT_NORMAL;
}
+ private void clearRecycledState(ArrayList<FixedViewInfo> infos) {
+ if (infos != null) {
+ final int count = infos.size();
+
+ for (int i = 0; i < count; i++) {
+ final View child = infos.get(i).view;
+ final LayoutParams p = (LayoutParams) child.getLayoutParams();
+ if (p != null) {
+ p.recycledHeaderFooter = false;
+ }
+ }
+ }
+ }
+
/**
* @return Whether the list needs to show the top fading edge
*/
diff --git a/core/java/com/android/internal/backup/IBackupTransport.aidl b/core/java/com/android/internal/backup/IBackupTransport.aidl
new file mode 100644
index 0000000..d64a303
--- /dev/null
+++ b/core/java/com/android/internal/backup/IBackupTransport.aidl
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.backup;
+
+/** {@hide} */
+interface IBackupTransport {
+}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 58a9be85..77649f0 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -25,6 +25,7 @@ import android.os.Process;
import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.util.Log;
+import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.SparseArray;
@@ -32,6 +33,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -3096,32 +3098,33 @@ public final class BatteryStatsImpl extends BatteryStats {
}
};
- public void dumpLocked(Printer pw) {
+ public void dumpLocked(PrintWriter pw) {
if (DEBUG) {
- pw.println("*** Screen timer:");
- mScreenOnTimer.logState(pw, " ");
+ Printer pr = new PrintWriterPrinter(pw);
+ pr.println("*** Screen timer:");
+ mScreenOnTimer.logState(pr, " ");
for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
- pw.println("*** Screen brightness #" + i + ":");
- mScreenBrightnessTimer[i].logState(pw, " ");
+ pr.println("*** Screen brightness #" + i + ":");
+ mScreenBrightnessTimer[i].logState(pr, " ");
}
- pw.println("*** Input event counter:");
- mInputEventCounter.logState(pw, " ");
- pw.println("*** Phone timer:");
- mPhoneOnTimer.logState(pw, " ");
+ pr.println("*** Input event counter:");
+ mInputEventCounter.logState(pr, " ");
+ pr.println("*** Phone timer:");
+ mPhoneOnTimer.logState(pr, " ");
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
- pw.println("*** Signal strength #" + i + ":");
- mPhoneSignalStrengthsTimer[i].logState(pw, " ");
+ pr.println("*** Signal strength #" + i + ":");
+ mPhoneSignalStrengthsTimer[i].logState(pr, " ");
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
- pw.println("*** Data connection type #" + i + ":");
- mPhoneDataConnectionsTimer[i].logState(pw, " ");
- }
- pw.println("*** Wifi timer:");
- mWifiOnTimer.logState(pw, " ");
- pw.println("*** WifiRunning timer:");
- mWifiRunningTimer.logState(pw, " ");
- pw.println("*** Bluetooth timer:");
- mBluetoothOnTimer.logState(pw, " ");
+ pr.println("*** Data connection type #" + i + ":");
+ mPhoneDataConnectionsTimer[i].logState(pr, " ");
+ }
+ pr.println("*** Wifi timer:");
+ mWifiOnTimer.logState(pr, " ");
+ pr.println("*** WifiRunning timer:");
+ mWifiRunningTimer.logState(pr, " ");
+ pr.println("*** Bluetooth timer:");
+ mBluetoothOnTimer.logState(pr, " ");
}
super.dumpLocked(pw);
}
diff --git a/core/java/com/android/internal/util/TypedProperties.java b/core/java/com/android/internal/util/TypedProperties.java
new file mode 100644
index 0000000..48479e3
--- /dev/null
+++ b/core/java/com/android/internal/util/TypedProperties.java
@@ -0,0 +1,692 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StreamTokenizer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * A {@code Map} that publishes a set of typed properties, defined by
+ * zero or more {@code Reader}s containing textual definitions and assignments.
+ */
+public class TypedProperties extends HashMap<String, Object> {
+ /**
+ * Instantiates a {@link java.io.StreamTokenizer} and sets its syntax tables
+ * appropriately for the {@code TypedProperties} file format.
+ *
+ * @param r The {@code Reader} that the {@code StreamTokenizer} will read from
+ * @return a newly-created and initialized {@code StreamTokenizer}
+ */
+ static StreamTokenizer initTokenizer(Reader r) {
+ StreamTokenizer st = new StreamTokenizer(r);
+
+ // Treat everything we don't specify as "ordinary".
+ st.resetSyntax();
+
+ /* The only non-quoted-string words we'll be reading are:
+ * - property names: [._$a-zA-Z0-9]
+ * - type names (case insensitive): [a-zA-Z]
+ * - number literals: [-0-9.eExXA-Za-z] ('x' for 0xNNN hex literals. "NaN", "Infinity")
+ * - "true" or "false" (case insensitive): [a-zA-Z]
+ */
+ st.wordChars('0', '9');
+ st.wordChars('A', 'Z');
+ st.wordChars('a', 'z');
+ st.wordChars('_', '_');
+ st.wordChars('$', '$');
+ st.wordChars('.', '.');
+ st.wordChars('-', '-');
+ st.wordChars('+', '+');
+
+ // Single-character tokens
+ st.ordinaryChar('=');
+
+ // Other special characters
+ st.whitespaceChars(' ', ' ');
+ st.whitespaceChars('\t', '\t');
+
+ st.quoteChar('"');
+
+ st.commentChar('#');
+
+ st.eolIsSignificant(true);
+
+ return st;
+ }
+
+
+ /**
+ * An unchecked exception that is thrown when encountering a syntax
+ * or semantic error in the input.
+ */
+ public static class ParseException extends IllegalArgumentException {
+ ParseException(StreamTokenizer state, String expected) {
+ super("expected " + expected + ", saw " + state.toString());
+ }
+ }
+
+ // A sentinel instance used to indicate a null string.
+ static final String NULL_STRING = new String("<TypedProperties:NULL_STRING>");
+
+ // Constants used to represent the supported types.
+ static final int TYPE_UNSET = 'x';
+ static final int TYPE_BOOLEAN = 'Z';
+ static final int TYPE_BYTE = 'I' | 1 << 8;
+ // TYPE_CHAR: character literal syntax not supported; use short.
+ static final int TYPE_SHORT = 'I' | 2 << 8;
+ static final int TYPE_INT = 'I' | 4 << 8;
+ static final int TYPE_LONG = 'I' | 8 << 8;
+ static final int TYPE_FLOAT = 'F' | 4 << 8;
+ static final int TYPE_DOUBLE = 'F' | 8 << 8;
+ static final int TYPE_STRING = 'L' | 's' << 8;
+ static final int TYPE_ERROR = -1;
+
+ /**
+ * Converts a case-insensitive string to an internal type constant.
+ *
+ * @param typeName the type name to convert
+ * @return the type constant that corresponds to {@code typeName},
+ * or {@code TYPE_ERROR} if the type is unknown
+ */
+ static int interpretType(String typeName) {
+ if ("unset".equalsIgnoreCase(typeName)) {
+ return TYPE_UNSET;
+ } else if ("boolean".equalsIgnoreCase(typeName)) {
+ return TYPE_BOOLEAN;
+ } else if ("byte".equalsIgnoreCase(typeName)) {
+ return TYPE_BYTE;
+ } else if ("short".equalsIgnoreCase(typeName)) {
+ return TYPE_SHORT;
+ } else if ("int".equalsIgnoreCase(typeName)) {
+ return TYPE_INT;
+ } else if ("long".equalsIgnoreCase(typeName)) {
+ return TYPE_LONG;
+ } else if ("float".equalsIgnoreCase(typeName)) {
+ return TYPE_FLOAT;
+ } else if ("double".equalsIgnoreCase(typeName)) {
+ return TYPE_DOUBLE;
+ } else if ("string".equalsIgnoreCase(typeName)) {
+ return TYPE_STRING;
+ }
+ return TYPE_ERROR;
+ }
+
+ /**
+ * Consumes EOL tokens.
+ * Returns when a non-EOL token is found.
+ *
+ * @param st The {@code StreamTokenizer} to read tokens from
+ * @return &gt; 0 if an EOL token was seen, &lt; 0 if EOF was seen,
+ * 0 if no tokens were consumed
+ */
+ static int eatEols(StreamTokenizer st) throws IOException {
+ int token;
+ boolean eolSeen = false;
+ do {
+ token = st.nextToken();
+ if (token == StreamTokenizer.TT_EOF) {
+ return -1;
+ } else if (token == StreamTokenizer.TT_EOL) {
+ eolSeen = true;
+ }
+ } while (token == StreamTokenizer.TT_EOL);
+ st.pushBack();
+ return eolSeen ? 1 : 0;
+ }
+
+ /**
+ * Parses the data in the reader.
+ *
+ * @param r The {@code Reader} containing input data to parse
+ * @param map The {@code Map} to insert parameter values into
+ * @throws ParseException if the input data is malformed
+ * @throws IOException if there is a problem reading from the {@code Reader}
+ */
+ static void parse(Reader r, Map<String, Object> map) throws ParseException, IOException {
+ final StreamTokenizer st = initTokenizer(r);
+
+ /* A property name must be a valid fully-qualified class + package name.
+ * We don't support Unicode, though.
+ */
+ final String identifierPattern = "[a-zA-Z_$][0-9a-zA-Z_$]*";
+ final Pattern propertyNamePattern =
+ Pattern.compile("(" + identifierPattern + "\\.)*" + identifierPattern);
+
+
+ boolean eolNeeded = false;
+ while (true) {
+ int token;
+
+ // Eat one or more EOL, or quit on EOF.
+ int eolStatus = eatEols(st);
+ if (eolStatus < 0) {
+ // EOF occurred.
+ break;
+ } else if (eolNeeded && eolStatus == 0) {
+ throw new ParseException(st, "end of line or end of file");
+ }
+
+ // Read the property name.
+ token = st.nextToken();
+ if (token != StreamTokenizer.TT_WORD) {
+ throw new ParseException(st, "property name");
+ }
+ final String propertyName = st.sval;
+ if (!propertyNamePattern.matcher(propertyName).matches()) {
+ throw new ParseException(st, "valid property name");
+ }
+ st.sval = null;
+
+ // Read the type.
+ token = st.nextToken();
+ if (token != StreamTokenizer.TT_WORD) {
+ throw new ParseException(st, "type name");
+ }
+ final int type = interpretType(st.sval);
+ if (type == TYPE_ERROR) {
+ throw new ParseException(st, "valid type name");
+ }
+ st.sval = null;
+
+ if (type == TYPE_UNSET) {
+ map.remove(propertyName);
+ } else {
+ // Expect '='.
+ token = st.nextToken();
+ if (token != '=') {
+ throw new ParseException(st, "'='");
+ }
+
+ // Read a value of the appropriate type, and insert into the map.
+ final Object value = parseValue(st, type);
+ final Object oldValue = map.remove(propertyName);
+ if (oldValue != null) {
+ // TODO: catch the case where a string is set to null and then
+ // the same property is defined with a different type.
+ if (value.getClass() != oldValue.getClass()) {
+ throw new ParseException(st,
+ "(property previously declared as a different type)");
+ }
+ }
+ map.put(propertyName, value);
+ }
+
+ // Require that we see at least one EOL before the next token.
+ eolNeeded = true;
+ }
+ }
+
+ /**
+ * Parses the next token in the StreamTokenizer as the specified type.
+ *
+ * @param st The token source
+ * @param type The type to interpret next token as
+ * @return a Boolean, Number subclass, or String representing the value.
+ * Null strings are represented by the String instance NULL_STRING
+ * @throws IOException if there is a problem reading from the {@code StreamTokenizer}
+ */
+ static Object parseValue(StreamTokenizer st, final int type) throws IOException {
+ final int token = st.nextToken();
+
+ if (type == TYPE_BOOLEAN) {
+ if (token != StreamTokenizer.TT_WORD) {
+ throw new ParseException(st, "boolean constant");
+ }
+
+ if ("true".equalsIgnoreCase(st.sval)) {
+ return Boolean.TRUE;
+ } else if ("false".equalsIgnoreCase(st.sval)) {
+ return Boolean.FALSE;
+ }
+
+ throw new ParseException(st, "boolean constant");
+ } else if ((type & 0xff) == 'I') {
+ if (token != StreamTokenizer.TT_WORD) {
+ throw new ParseException(st, "integer constant");
+ }
+
+ /* Parse the string. Long.decode() handles C-style integer constants
+ * ("0x" -> hex, "0" -> octal). It also treats numbers with a prefix of "#" as
+ * hex, but our syntax intentionally does not list '#' as a word character.
+ */
+ long value;
+ try {
+ value = Long.decode(st.sval);
+ } catch (NumberFormatException ex) {
+ throw new ParseException(st, "integer constant");
+ }
+
+ // Ensure that the type can hold this value, and return.
+ int width = (type >> 8) & 0xff;
+ switch (width) {
+ case 1:
+ if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
+ throw new ParseException(st, "8-bit integer constant");
+ }
+ return new Byte((byte)value);
+ case 2:
+ if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
+ throw new ParseException(st, "16-bit integer constant");
+ }
+ return new Short((short)value);
+ case 4:
+ if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
+ throw new ParseException(st, "32-bit integer constant");
+ }
+ return new Integer((int)value);
+ case 8:
+ if (value < Long.MIN_VALUE || value > Long.MAX_VALUE) {
+ throw new ParseException(st, "64-bit integer constant");
+ }
+ return new Long(value);
+ default:
+ throw new IllegalStateException(
+ "Internal error; unexpected integer type width " + width);
+ }
+ } else if ((type & 0xff) == 'F') {
+ if (token != StreamTokenizer.TT_WORD) {
+ throw new ParseException(st, "float constant");
+ }
+
+ // Parse the string.
+ /* TODO: Maybe just parse as float or double, losing precision if necessary.
+ * Parsing as double and converting to float can change the value
+ * compared to just parsing as float.
+ */
+ double value;
+ try {
+ /* TODO: detect if the string representation loses precision
+ * when being converted to a double.
+ */
+ value = Double.parseDouble(st.sval);
+ } catch (NumberFormatException ex) {
+ throw new ParseException(st, "float constant");
+ }
+
+ // Ensure that the type can hold this value, and return.
+ if (((type >> 8) & 0xff) == 4) {
+ // This property is a float; make sure the value fits.
+ double absValue = Math.abs(value);
+ if (absValue != 0.0 && !Double.isInfinite(value) && !Double.isNaN(value)) {
+ if (absValue < Float.MIN_VALUE || absValue > Float.MAX_VALUE) {
+ throw new ParseException(st, "32-bit float constant");
+ }
+ }
+ return new Float((float)value);
+ } else {
+ // This property is a double; no need to truncate.
+ return new Double(value);
+ }
+ } else if (type == TYPE_STRING) {
+ // Expect a quoted string or the word "null".
+ if (token == '"') {
+ return st.sval;
+ } else if (token == StreamTokenizer.TT_WORD && "null".equalsIgnoreCase(st.sval)) {
+ return NULL_STRING;
+ }
+ throw new ParseException(st, "double-quoted string or 'null'");
+ }
+
+ throw new IllegalStateException("Internal error; unknown type " + type);
+ }
+
+
+ /**
+ * Creates an empty TypedProperties instance.
+ */
+ public TypedProperties() {
+ super();
+ }
+
+ /**
+ * Loads zero or more properties from the specified Reader.
+ * Properties that have already been loaded are preserved unless
+ * the new Reader overrides or unsets earlier values for the
+ * same properties.
+ *
+ * File syntax:
+ *
+ * &lt;property-name&gt; &lt;type&gt; = &lt;value&gt;
+ * &lt;property-name&gt; unset
+ *
+ * '#' is a comment character; it and anything appearing after it
+ * on the line is ignored.
+ *
+ * Blank lines are ignored.
+ *
+ * The only required whitespace is between the property name
+ * and the type.
+ *
+ * Property assignments may not be split across multiple lines.
+ *
+ * &lt;property-name&gt; is a valid fully-qualified class name
+ * (one or more valid identifiers separated by dot characters).
+ *
+ * &lt;type&gt; is one of {boolean, byte, short, int, long,
+ * float, double, string}, and is case-insensitive.
+ *
+ * &lt;value&gt; depends on the type:
+ * - boolean: one of {true, false} (case-insensitive)
+ * - byte, short, int, long: a valid Java integer constant
+ * (including non-base-10 constants like 0xabc and 074)
+ * whose value does not overflow the type. NOTE: these are
+ * interpreted as Java integer values, so they are all signed.
+ * - float, double: a valid Java floating-point constant.
+ * If the type is float, the value must fit in 32 bits.
+ * - string: a double-quoted string value, or the word {@code null}.
+ * NOTE: the contents of the string must be 7-bit clean ASCII;
+ * C-style octal escapes are recognized, but Unicode escapes are not.
+ *
+ *
+ * @param r The Reader to load properties from
+ * @throws IOException if an error occurs when reading the data
+ * @throws IllegalArgumentException if the data is malformed
+ */
+ public void load(Reader r) throws IOException {
+ parse(r, this);
+ }
+
+ @Override
+ public Object get(Object key) {
+ Object value = super.get(key);
+ if (value == NULL_STRING) {
+ return null;
+ }
+ return value;
+ }
+
+ /*
+ * Getters with explicit defaults
+ */
+
+ /**
+ * An unchecked exception that is thrown if a {@code get&lt;TYPE&gt;()} method
+ * is used to retrieve a parameter whose type does not match the method name.
+ */
+ public static class TypeException extends IllegalArgumentException {
+ TypeException(String property, Object value, String requestedType) {
+ super(property + " has type " + value.getClass().getName() +
+ ", not " + requestedType);
+ }
+ }
+
+ /**
+ * Returns the value of a boolean property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a boolean
+ */
+ public boolean getBoolean(String property, boolean def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Boolean) {
+ return ((Boolean)value).booleanValue();
+ }
+ throw new TypeException(property, value, "boolean");
+ }
+
+ /**
+ * Returns the value of a byte property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a byte
+ */
+ public byte getByte(String property, byte def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Byte) {
+ return ((Byte)value).byteValue();
+ }
+ throw new TypeException(property, value, "byte");
+ }
+
+ /**
+ * Returns the value of a short property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a short
+ */
+ public short getShort(String property, short def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Short) {
+ return ((Short)value).shortValue();
+ }
+ throw new TypeException(property, value, "short");
+ }
+
+ /**
+ * Returns the value of an integer property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not an integer
+ */
+ public int getInt(String property, int def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Integer) {
+ return ((Integer)value).intValue();
+ }
+ throw new TypeException(property, value, "int");
+ }
+
+ /**
+ * Returns the value of a long property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a long
+ */
+ public long getLong(String property, long def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Long) {
+ return ((Long)value).longValue();
+ }
+ throw new TypeException(property, value, "long");
+ }
+
+ /**
+ * Returns the value of a float property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a float
+ */
+ public float getFloat(String property, float def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Float) {
+ return ((Float)value).floatValue();
+ }
+ throw new TypeException(property, value, "float");
+ }
+
+ /**
+ * Returns the value of a double property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a double
+ */
+ public double getDouble(String property, double def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value instanceof Double) {
+ return ((Double)value).doubleValue();
+ }
+ throw new TypeException(property, value, "double");
+ }
+
+ /**
+ * Returns the value of a string property, or the default if the property
+ * has not been defined.
+ *
+ * @param property The name of the property to return
+ * @param def The default value to return if the property is not set
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a string
+ */
+ public String getString(String property, String def) {
+ Object value = super.get(property);
+ if (value == null) {
+ return def;
+ }
+ if (value == NULL_STRING) {
+ return null;
+ } else if (value instanceof String) {
+ return (String)value;
+ }
+ throw new TypeException(property, value, "string");
+ }
+
+ /*
+ * Getters with implicit defaults
+ */
+
+ /**
+ * Returns the value of a boolean property, or false
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a boolean
+ */
+ public boolean getBoolean(String property) {
+ return getBoolean(property, false);
+ }
+
+ /**
+ * Returns the value of a byte property, or 0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a byte
+ */
+ public byte getByte(String property) {
+ return getByte(property, (byte)0);
+ }
+
+ /**
+ * Returns the value of a short property, or 0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a short
+ */
+ public short getShort(String property) {
+ return getShort(property, (short)0);
+ }
+
+ /**
+ * Returns the value of an integer property, or 0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not an integer
+ */
+ public int getInt(String property) {
+ return getInt(property, 0);
+ }
+
+ /**
+ * Returns the value of a long property, or 0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a long
+ */
+ public long getLong(String property) {
+ return getLong(property, 0L);
+ }
+
+ /**
+ * Returns the value of a float property, or 0.0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a float
+ */
+ public float getFloat(String property) {
+ return getFloat(property, 0.0f);
+ }
+
+ /**
+ * Returns the value of a double property, or 0.0
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a double
+ */
+ public double getDouble(String property) {
+ return getDouble(property, 0.0);
+ }
+
+ /**
+ * Returns the value of a String property, or ""
+ * if the property has not been defined.
+ *
+ * @param property The name of the property to return
+ * @return the value of the property
+ * @throws TypeException if the property is set and is not a string
+ */
+ public String getString(String property) {
+ return getString(property, "");
+ }
+}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index c31acea..48675a1 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -130,6 +130,7 @@ LOCAL_C_INCLUDES += \
external/skia/include/core \
external/skia/include/effects \
external/skia/include/images \
+ external/skia/src/ports \
external/skia/include/utils \
external/sqlite/dist \
external/sqlite/android \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 1c45b35..422020e 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -30,6 +30,7 @@
#include <SkGraphics.h>
#include <SkImageDecoder.h>
+#include <SkImageRef_GlobalPool.h>
#include "jni.h"
#include "JNIHelp.h"
@@ -227,6 +228,13 @@ AndroidRuntime::AndroidRuntime()
// this sets our preference for 16bit images during decode
// in case the src is opaque and 24bit
SkImageDecoder::SetDeviceConfig(SkBitmap::kRGB_565_Config);
+ // This cache is shared between browser native images, and java "purgeable"
+ // bitmaps. This globalpool is for images that do not either use the java
+ // heap, or are not backed by ashmem. See BitmapFactory.cpp for the key
+ // java call site.
+ SkImageRef_GlobalPool::SetRAMBudget(512 * 1024);
+ // There is also a global font cache, but its budget is specified in code
+ // see SkFontHost_android.cpp
// Pre-allocate enough space to hold a fair number of options.
mOptions.setCapacity(20);
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 4ad2eb0..1fd15d6 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -1,6 +1,8 @@
#define LOG_TAG "BitmapFactory"
#include "SkImageDecoder.h"
+#include "SkImageRef_ashmem.h"
+#include "SkImageRef_GlobalPool.h"
#include "SkPixelRef.h"
#include "SkStream.h"
#include "GraphicsJNI.h"
@@ -19,6 +21,8 @@ static jfieldID gOptions_justBoundsFieldID;
static jfieldID gOptions_sampleSizeFieldID;
static jfieldID gOptions_configFieldID;
static jfieldID gOptions_ditherFieldID;
+static jfieldID gOptions_purgeableFieldID;
+static jfieldID gOptions_shareableFieldID;
static jfieldID gOptions_widthFieldID;
static jfieldID gOptions_heightFieldID;
static jfieldID gOptions_mimeFieldID;
@@ -33,8 +37,6 @@ static jfieldID gFileDescriptor_descriptor;
#define TRACE_BITMAP(code)
#endif
-//#define MIN_SIZE_TO_USE_MMAP (4*1024)
-
///////////////////////////////////////////////////////////////////////////////
class AutoDecoderCancel {
@@ -207,7 +209,11 @@ public:
virtual bool rewind() {
off_t pos = fAsset->seek(0, SEEK_SET);
- return pos != (off_t)-1;
+ if (pos == (off_t)-1) {
+ SkDebugf("----- fAsset->seek(rewind) failed\n");
+ return false;
+ }
+ return true;
}
virtual size_t read(void* buffer, size_t size) {
@@ -222,15 +228,20 @@ public:
off_t oldOffset = fAsset->seek(0, SEEK_CUR);
if (-1 == oldOffset) {
+ SkDebugf("---- fAsset->seek(oldOffset) failed\n");
return 0;
}
off_t newOffset = fAsset->seek(size, SEEK_CUR);
if (-1 == newOffset) {
+ SkDebugf("---- fAsset->seek(%d) failed\n", size);
return 0;
}
amount = newOffset - oldOffset;
} else {
amount = fAsset->read(buffer, size);
+ if (amount <= 0) {
+ SkDebugf("---- fAsset->read(%d) returned %d\n", size, amount);
+ }
}
if (amount < 0) {
@@ -279,13 +290,46 @@ static jstring getMimeTypeString(JNIEnv* env, SkImageDecoder::Format format) {
return jstr;
}
-static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
- jobject options) {
+static bool optionsPurgeable(JNIEnv* env, jobject options) {
+ return options != NULL &&
+ env->GetBooleanField(options, gOptions_purgeableFieldID);
+}
+
+static bool optionsShareable(JNIEnv* env, jobject options) {
+ return options != NULL &&
+ env->GetBooleanField(options, gOptions_shareableFieldID);
+}
+
+static jobject nullObjectReturn(const char msg[]) {
+ if (msg) {
+ SkDebugf("--- %s\n", msg);
+ }
+ return NULL;
+}
+
+static SkPixelRef* installPixelRef(SkBitmap* bitmap, SkStream* stream,
+ int sampleSize) {
+ SkPixelRef* pr;
+ // only use ashmem for large images, since mmaps come at a price
+ if (bitmap->getSize() >= 32 * 65536) {
+ pr = new SkImageRef_ashmem(stream, bitmap->config(), sampleSize);
+ } else {
+ pr = new SkImageRef_GlobalPool(stream, bitmap->config(), sampleSize);
+ }
+ bitmap->setPixelRef(pr)->unref();
+ return pr;
+}
+// since we "may" create a purgeable imageref, we require the stream be ref'able
+// i.e. dynamically allocated, since its lifetime may exceed the current stack
+// frame.
+static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
+ jobject options, bool allowPurgeable) {
int sampleSize = 1;
SkImageDecoder::Mode mode = SkImageDecoder::kDecodePixels_Mode;
SkBitmap::Config prefConfig = SkBitmap::kNo_Config;
bool doDither = true;
+ bool isPurgeable = allowPurgeable && optionsPurgeable(env, options);
if (NULL != options) {
sampleSize = env->GetIntField(options, gOptions_sampleSizeFieldID);
@@ -304,14 +348,14 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
SkImageDecoder* decoder = SkImageDecoder::Factory(stream);
if (NULL == decoder) {
- return NULL;
+ return nullObjectReturn("SkImageDecoder::Factory returned null");
}
decoder->setSampleSize(sampleSize);
decoder->setDitherImage(doDither);
NinePatchPeeker peeker;
- JavaPixelAllocator allocator(env);
+ JavaPixelAllocator javaAllocator(env);
SkBitmap* bitmap = new SkBitmap;
Res_png_9patch dummy9Patch;
@@ -319,23 +363,27 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
SkAutoTDelete<SkBitmap> adb(bitmap);
decoder->setPeeker(&peeker);
- decoder->setAllocator(&allocator);
-
+ if (!isPurgeable) {
+ decoder->setAllocator(&javaAllocator);
+ }
+
AutoDecoderCancel adc(options, decoder);
// To fix the race condition in case "requestCancelDecode"
// happens earlier than AutoDecoderCancel object is added
// to the gAutoDecoderCancelMutex linked list.
- if (NULL != options) {
- if (env->GetBooleanField(options, gOptions_mCancelID)) {
- return NULL;
- }
+ if (NULL != options && env->GetBooleanField(options, gOptions_mCancelID)) {
+ return nullObjectReturn("gOptions_mCancelID");;
}
- if (!decoder->decode(stream, bitmap, prefConfig, mode)) {
- return NULL;
+ SkImageDecoder::Mode decodeMode = mode;
+ if (isPurgeable) {
+ decodeMode = SkImageDecoder::kDecodeBounds_Mode;
}
-
+ if (!decoder->decode(stream, bitmap, prefConfig, decodeMode)) {
+ return nullObjectReturn("decoder->decode returned false");
+ }
+
// update options (if any)
if (NULL != options) {
env->SetIntField(options, gOptions_widthFieldID, bitmap->width());
@@ -346,7 +394,7 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
env->SetObjectField(options, gOptions_mimeFieldID,
getMimeTypeString(env, decoder->getFormat()));
}
-
+
// if we're in justBounds mode, return now (skip the java bitmap)
if (SkImageDecoder::kDecodeBounds_Mode == mode) {
return NULL;
@@ -357,12 +405,12 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
size_t ninePatchArraySize = peeker.fPatch->serializedSize();
ninePatchChunk = env->NewByteArray(ninePatchArraySize);
if (NULL == ninePatchChunk) {
- return NULL;
+ return nullObjectReturn("ninePatchChunk == null");
}
jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(ninePatchChunk,
NULL);
if (NULL == array) {
- return NULL;
+ return nullObjectReturn("primitive array == null");
}
peeker.fPatch->serialize(array);
env->ReleasePrimitiveArrayCritical(ninePatchChunk, array, 0);
@@ -382,12 +430,18 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
GraphicsJNI::set_jrect(env, padding, -1, -1, -1, -1);
}
}
-
- // promise we will never change our pixels (great for sharing and pictures)
- SkPixelRef* ref = bitmap->pixelRef();
- SkASSERT(ref);
- ref->setImmutable();
+ SkPixelRef* pr;
+ if (isPurgeable) {
+ pr = installPixelRef(bitmap, stream, sampleSize);
+ } else {
+ // if we get here, we're in kDecodePixels_Mode and will therefore
+ // already have a pixelref installed.
+ pr = bitmap->pixelRef();
+ }
+ // promise we will never change our pixels (great for sharing and pictures)
+ pr->setImmutable();
+ // now create the java bitmap
return GraphicsJNI::createBitmap(env, bitmap, false, ninePatchChunk);
}
@@ -400,7 +454,8 @@ static jobject nativeDecodeStream(JNIEnv* env, jobject clazz,
SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage);
if (stream) {
- bitmap = doDecode(env, stream, padding, options);
+ // for now we don't allow purgeable with java inputstreams
+ bitmap = doDecode(env, stream, padding, options, false);
stream->unref();
}
return bitmap;
@@ -441,52 +496,96 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz,
jint descriptor = env->GetIntField(fileDescriptor,
gFileDescriptor_descriptor);
-
-#ifdef MIN_SIZE_TO_USE_MMAP
- // First try to use mmap
- size_t size = getFDSize(descriptor);
- if (size >= MIN_SIZE_TO_USE_MMAP) {
- void* addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, descriptor, 0);
-// SkDebugf("-------- mmap returned %p %d\n", addr, size);
- if (MAP_FAILED != addr) {
- SkMemoryStream strm(addr, size);
- jobject obj = doDecode(env, &strm, padding, bitmapFactoryOptions);
- munmap(addr, size);
- return obj;
+
+ bool isPurgeable = optionsPurgeable(env, bitmapFactoryOptions);
+ bool isShareable = optionsShareable(env, bitmapFactoryOptions);
+ bool weOwnTheFD = false;
+ if (isPurgeable && isShareable) {
+ int newFD = ::dup(descriptor);
+ if (-1 != newFD) {
+ weOwnTheFD = true;
+ descriptor = newFD;
}
}
-#endif
- // we pass false for closeWhenDone, since the caller owns the descriptor
- SkFDStream file(descriptor, false);
- if (!file.isValid()) {
+ SkFDStream* stream = new SkFDStream(descriptor, weOwnTheFD);
+ SkAutoUnref aur(stream);
+ if (!stream->isValid()) {
return NULL;
}
-
- /* Restore our offset when we leave, so the caller doesn't have to.
- This is a real feature, so we can be called more than once with the
- same descriptor.
+
+ /* Restore our offset when we leave, so we can be called more than once
+ with the same descriptor. This is only required if we didn't dup the
+ file descriptor, but it is OK to do it all the time.
*/
AutoFDSeek as(descriptor);
- return doDecode(env, &file, padding, bitmapFactoryOptions);
+ return doDecode(env, stream, padding, bitmapFactoryOptions, true);
+}
+
+/* make a deep copy of the asset, and return it as a stream, or NULL if there
+ was an error.
+ */
+static SkStream* copyAssetToStream(Asset* asset) {
+ // if we could "ref/reopen" the asset, we may not need to copy it here
+ off_t size = asset->seek(0, SEEK_SET);
+ if ((off_t)-1 == size) {
+ SkDebugf("---- copyAsset: asset rewind failed\n");
+ return NULL;
+ }
+
+ size = asset->getLength();
+ if (size <= 0) {
+ SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size);
+ return NULL;
+ }
+
+ SkStream* stream = new SkMemoryStream(size);
+ void* data = const_cast<void*>(stream->getMemoryBase());
+ off_t len = asset->read(data, size);
+ if (len != size) {
+ SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len);
+ delete stream;
+ stream = NULL;
+ }
+ return stream;
}
static jobject nativeDecodeAsset(JNIEnv* env, jobject clazz,
jint native_asset, // Asset
jobject padding, // Rect
jobject options) { // BitmapFactory$Options
- AssetStreamAdaptor mystream((Asset*)native_asset);
-
- return doDecode(env, &mystream, padding, options);
+ SkStream* stream;
+ Asset* asset = reinterpret_cast<Asset*>(native_asset);
+
+ if (optionsPurgeable(env, options)) {
+ // if we could "ref/reopen" the asset, we may not need to copy it here
+ // and we could assume optionsShareable, since assets are always RO
+ stream = copyAssetToStream(asset);
+ if (NULL == stream) {
+ return NULL;
+ }
+ } else {
+ // since we know we'll be done with the asset when we return, we can
+ // just use a simple wrapper
+ stream = new AssetStreamAdaptor(asset);
+ }
+ SkAutoUnref aur(stream);
+ return doDecode(env, stream, padding, options, true);
}
static jobject nativeDecodeByteArray(JNIEnv* env, jobject, jbyteArray byteArray,
int offset, int length, jobject options) {
- AutoJavaByteArray ar(env, byteArray);
- SkMemoryStream stream(ar.ptr() + offset, length);
-
- return doDecode(env, &stream, NULL, options);
+ /* If optionsShareable() we could decide to just wrap the java array and
+ share it, but that means adding a globalref to the java array object
+ and managing its lifetime. For now we just always copy the array's data
+ if optionsPurgeable().
+ */
+ AutoJavaByteArray ar(env, byteArray);
+ SkStream* stream = new SkMemoryStream(ar.ptr() + offset, length,
+ optionsPurgeable(env, options));
+ SkAutoUnref aur(stream);
+ return doDecode(env, stream, NULL, options, true);
}
static void nativeRequestCancel(JNIEnv*, jobject joptions) {
@@ -595,6 +694,8 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) {
gOptions_configFieldID = getFieldIDCheck(env, gOptions_class, "inPreferredConfig",
"Landroid/graphics/Bitmap$Config;");
gOptions_ditherFieldID = getFieldIDCheck(env, gOptions_class, "inDither", "Z");
+ gOptions_purgeableFieldID = getFieldIDCheck(env, gOptions_class, "inPurgeable", "Z");
+ gOptions_shareableFieldID = getFieldIDCheck(env, gOptions_class, "inInputShareable", "Z");
gOptions_widthFieldID = getFieldIDCheck(env, gOptions_class, "outWidth", "I");
gOptions_heightFieldID = getFieldIDCheck(env, gOptions_class, "outHeight", "I");
gOptions_mimeFieldID = getFieldIDCheck(env, gOptions_class, "outMimeType", "Ljava/lang/String;");
diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp
index 605e4b8..bd6fea8 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -21,6 +21,8 @@
#include "SkCanvas.h"
#include "SkDevice.h"
#include "SkGLCanvas.h"
+#include "SkGraphics.h"
+#include "SkImageRef_GlobalPool.h"
#include "SkShader.h"
#include "SkTemplates.h"
@@ -58,8 +60,11 @@ public:
return new SkGLCanvas;
}
- static void freeGlCaches(JNIEnv* env, jobject) {
+ static void freeCaches(JNIEnv* env, jobject) {
+ // these are called in no particular order
SkGLCanvas::DeleteAllTextures();
+ SkImageRef_GlobalPool::SetRAMUsed(0);
+ SkGraphics::SetFontCacheUsed(0);
}
static jboolean isOpaque(JNIEnv* env, jobject jcanvas) {
@@ -933,7 +938,7 @@ static JNINativeMethod gCanvasMethods[] = {
(void*) SkCanvasGlue::drawTextOnPath__StringPathFFPaint},
{"native_drawPicture", "(II)V", (void*) SkCanvasGlue::drawPicture},
- {"freeGlCaches", "()V", (void*) SkCanvasGlue::freeGlCaches}
+ {"freeCaches", "()V", (void*) SkCanvasGlue::freeCaches}
};
#include <android_runtime/AndroidRuntime.h>
diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp
index bbde8d5..9c63fd2 100644
--- a/core/jni/android_location_GpsLocationProvider.cpp
+++ b/core/jni/android_location_GpsLocationProvider.cpp
@@ -155,6 +155,7 @@ static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject o
sGpsSuplInterface = (const GpsSuplInterface*)sGpsInterface->get_extension(GPS_SUPL_INTERFACE);
if (sGpsSuplInterface)
sGpsSuplInterface->init(&sGpsSuplCallbacks);
+ return true;
}
static void android_location_GpsLocationProvider_disable(JNIEnv* env, jobject obj)
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 117ff35..bc644d2 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -3434,7 +3434,7 @@ static JNINativeMethod methods[] = {
{"glGetError", "()I", (void *) android_glGetError__ },
{"glGetIntegerv", "(I[II)V", (void *) android_glGetIntegerv__I_3II },
{"glGetIntegerv", "(ILjava/nio/IntBuffer;)V", (void *) android_glGetIntegerv__ILjava_nio_IntBuffer_2 },
-{"_glGetString", "(I)Ljava/lang/String;", (void *) android_glGetString },
+{"glGetString", "(I)Ljava/lang/String;", (void *) android_glGetString },
{"glHint", "(II)V", (void *) android_glHint__II },
{"glLightModelf", "(IF)V", (void *) android_glLightModelf__IF },
{"glLightModelfv", "(I[FI)V", (void *) android_glLightModelfv__I_3FI },
diff --git a/core/jni/android_opengl_GLES11Ext.cpp b/core/jni/android_opengl_GLES11Ext.cpp
index 2576d8a..069cec1 100644
--- a/core/jni/android_opengl_GLES11Ext.cpp
+++ b/core/jni/android_opengl_GLES11Ext.cpp
@@ -132,24 +132,31 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
static void
android_glBlendEquationSeparateOES__II
(JNIEnv *_env, jobject _this, jint modeRGB, jint modeAlpha) {
- _env->ThrowNew(UOEClass,
- "glBlendEquationSeparateOES");
+ glBlendEquationSeparateOES(
+ (GLenum)modeRGB,
+ (GLenum)modeAlpha
+ );
}
/* void glBlendFuncSeparateOES ( GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha ) */
static void
android_glBlendFuncSeparateOES__IIII
(JNIEnv *_env, jobject _this, jint srcRGB, jint dstRGB, jint srcAlpha, jint dstAlpha) {
- _env->ThrowNew(UOEClass,
- "glBlendFuncSeparateOES");
+ glBlendFuncSeparateOES(
+ (GLenum)srcRGB,
+ (GLenum)dstRGB,
+ (GLenum)srcAlpha,
+ (GLenum)dstAlpha
+ );
}
/* void glBlendEquationOES ( GLenum mode ) */
static void
android_glBlendEquationOES__I
(JNIEnv *_env, jobject _this, jint mode) {
- _env->ThrowNew(UOEClass,
- "glBlendEquationOES");
+ glBlendEquationOES(
+ (GLenum)mode
+ );
}
/* void glDrawTexsOES ( GLshort x, GLshort y, GLshort z, GLshort width, GLshort height ) */
@@ -444,456 +451,1153 @@ exit:
static void
android_glEGLImageTargetTexture2DOES__ILjava_nio_Buffer_2
(JNIEnv *_env, jobject _this, jint target, jobject image_buf) {
- _env->ThrowNew(UOEClass,
- "glEGLImageTargetTexture2DOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLeglImageOES image = (GLeglImageOES) 0;
+
+ image = (GLeglImageOES)getPointer(_env, image_buf, &_array, &_remaining);
+ glEGLImageTargetTexture2DOES(
+ (GLenum)target,
+ (GLeglImageOES)image
+ );
+ if (_array) {
+ releasePointer(_env, _array, image, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glEGLImageTargetRenderbufferStorageOES ( GLenum target, GLeglImageOES image ) */
static void
android_glEGLImageTargetRenderbufferStorageOES__ILjava_nio_Buffer_2
(JNIEnv *_env, jobject _this, jint target, jobject image_buf) {
- _env->ThrowNew(UOEClass,
- "glEGLImageTargetRenderbufferStorageOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLeglImageOES image = (GLeglImageOES) 0;
+
+ image = (GLeglImageOES)getPointer(_env, image_buf, &_array, &_remaining);
+ glEGLImageTargetRenderbufferStorageOES(
+ (GLenum)target,
+ (GLeglImageOES)image
+ );
+ if (_array) {
+ releasePointer(_env, _array, image, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glAlphaFuncxOES ( GLenum func, GLclampx ref ) */
static void
android_glAlphaFuncxOES__II
(JNIEnv *_env, jobject _this, jint func, jint ref) {
- _env->ThrowNew(UOEClass,
- "glAlphaFuncxOES");
+ glAlphaFuncxOES(
+ (GLenum)func,
+ (GLclampx)ref
+ );
}
/* void glClearColorxOES ( GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha ) */
static void
android_glClearColorxOES__IIII
(JNIEnv *_env, jobject _this, jint red, jint green, jint blue, jint alpha) {
- _env->ThrowNew(UOEClass,
- "glClearColorxOES");
+ glClearColorxOES(
+ (GLclampx)red,
+ (GLclampx)green,
+ (GLclampx)blue,
+ (GLclampx)alpha
+ );
}
/* void glClearDepthxOES ( GLclampx depth ) */
static void
android_glClearDepthxOES__I
(JNIEnv *_env, jobject _this, jint depth) {
- _env->ThrowNew(UOEClass,
- "glClearDepthxOES");
+ glClearDepthxOES(
+ (GLclampx)depth
+ );
}
/* void glClipPlanexOES ( GLenum plane, const GLfixed *equation ) */
static void
android_glClipPlanexOES__I_3II
(JNIEnv *_env, jobject _this, jint plane, jintArray equation_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glClipPlanexOES");
+ GLfixed *equation_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *equation = (GLfixed *) 0;
+
+ if (!equation_ref) {
+ _env->ThrowNew(IAEClass, "equation == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(equation_ref) - offset;
+ equation_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(equation_ref, (jboolean *)0);
+ equation = equation_base + offset;
+
+ glClipPlanexOES(
+ (GLenum)plane,
+ (GLfixed *)equation
+ );
+
+exit:
+ if (equation_base) {
+ _env->ReleasePrimitiveArrayCritical(equation_ref, equation_base,
+ JNI_ABORT);
+ }
}
/* void glClipPlanexOES ( GLenum plane, const GLfixed *equation ) */
static void
android_glClipPlanexOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint plane, jobject equation_buf) {
- _env->ThrowNew(UOEClass,
- "glClipPlanexOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *equation = (GLfixed *) 0;
+
+ equation = (GLfixed *)getPointer(_env, equation_buf, &_array, &_remaining);
+ glClipPlanexOES(
+ (GLenum)plane,
+ (GLfixed *)equation
+ );
+ if (_array) {
+ releasePointer(_env, _array, equation, JNI_FALSE);
+ }
}
/* void glColor4xOES ( GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha ) */
static void
android_glColor4xOES__IIII
(JNIEnv *_env, jobject _this, jint red, jint green, jint blue, jint alpha) {
- _env->ThrowNew(UOEClass,
- "glColor4xOES");
+ glColor4xOES(
+ (GLfixed)red,
+ (GLfixed)green,
+ (GLfixed)blue,
+ (GLfixed)alpha
+ );
}
/* void glDepthRangexOES ( GLclampx zNear, GLclampx zFar ) */
static void
android_glDepthRangexOES__II
(JNIEnv *_env, jobject _this, jint zNear, jint zFar) {
- _env->ThrowNew(UOEClass,
- "glDepthRangexOES");
+ glDepthRangexOES(
+ (GLclampx)zNear,
+ (GLclampx)zFar
+ );
}
/* void glFogxOES ( GLenum pname, GLfixed param ) */
static void
android_glFogxOES__II
(JNIEnv *_env, jobject _this, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glFogxOES");
+ glFogxOES(
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glFogxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glFogxvOES__I_3II
(JNIEnv *_env, jobject _this, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glFogxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glFogxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glFogxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glFogxvOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glFogxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glFogxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glFrustumxOES ( GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar ) */
static void
android_glFrustumxOES__IIIIII
(JNIEnv *_env, jobject _this, jint left, jint right, jint bottom, jint top, jint zNear, jint zFar) {
- _env->ThrowNew(UOEClass,
- "glFrustumxOES");
+ glFrustumxOES(
+ (GLfixed)left,
+ (GLfixed)right,
+ (GLfixed)bottom,
+ (GLfixed)top,
+ (GLfixed)zNear,
+ (GLfixed)zFar
+ );
}
/* void glGetClipPlanexOES ( GLenum pname, GLfixed *eqn ) */
static void
android_glGetClipPlanexOES__I_3II
(JNIEnv *_env, jobject _this, jint pname, jintArray eqn_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetClipPlanexOES");
+ jint _exception = 0;
+ GLfixed *eqn_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *eqn = (GLfixed *) 0;
+
+ if (!eqn_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "eqn == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(eqn_ref) - offset;
+ if (_remaining < 4) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "length - offset < 4");
+ goto exit;
+ }
+ eqn_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(eqn_ref, (jboolean *)0);
+ eqn = eqn_base + offset;
+
+ glGetClipPlanexOES(
+ (GLenum)pname,
+ (GLfixed *)eqn
+ );
+
+exit:
+ if (eqn_base) {
+ _env->ReleasePrimitiveArrayCritical(eqn_ref, eqn_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetClipPlanexOES ( GLenum pname, GLfixed *eqn ) */
static void
android_glGetClipPlanexOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject eqn_buf) {
- _env->ThrowNew(UOEClass,
- "glGetClipPlanexOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *eqn = (GLfixed *) 0;
+
+ eqn = (GLfixed *)getPointer(_env, eqn_buf, &_array, &_remaining);
+ if (_remaining < 4) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "remaining() < 4");
+ goto exit;
+ }
+ glGetClipPlanexOES(
+ (GLenum)pname,
+ (GLfixed *)eqn
+ );
+
+exit:
+ if (_array) {
+ releasePointer(_env, _array, eqn, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetFixedvOES ( GLenum pname, GLfixed *params ) */
static void
android_glGetFixedvOES__I_3II
(JNIEnv *_env, jobject _this, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetFixedvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetFixedvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetFixedvOES ( GLenum pname, GLfixed *params ) */
static void
android_glGetFixedvOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetFixedvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetFixedvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetLightxvOES ( GLenum light, GLenum pname, GLfixed *params ) */
static void
android_glGetLightxvOES__II_3II
(JNIEnv *_env, jobject _this, jint light, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetLightxvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetLightxvOES(
+ (GLenum)light,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetLightxvOES ( GLenum light, GLenum pname, GLfixed *params ) */
static void
android_glGetLightxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint light, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetLightxvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetLightxvOES(
+ (GLenum)light,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetMaterialxvOES ( GLenum face, GLenum pname, GLfixed *params ) */
static void
android_glGetMaterialxvOES__II_3II
(JNIEnv *_env, jobject _this, jint face, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetMaterialxvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetMaterialxvOES(
+ (GLenum)face,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetMaterialxvOES ( GLenum face, GLenum pname, GLfixed *params ) */
static void
android_glGetMaterialxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint face, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetMaterialxvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetMaterialxvOES(
+ (GLenum)face,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetTexEnvxvOES ( GLenum env, GLenum pname, GLfixed *params ) */
static void
android_glGetTexEnvxvOES__II_3II
(JNIEnv *_env, jobject _this, jint env, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetTexEnvxvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetTexEnvxvOES(
+ (GLenum)env,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetTexEnvxvOES ( GLenum env, GLenum pname, GLfixed *params ) */
static void
android_glGetTexEnvxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint env, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetTexEnvxvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetTexEnvxvOES(
+ (GLenum)env,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetTexParameterxvOES ( GLenum target, GLenum pname, GLfixed *params ) */
static void
android_glGetTexParameterxvOES__II_3II
(JNIEnv *_env, jobject _this, jint target, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetTexParameterxvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetTexParameterxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetTexParameterxvOES ( GLenum target, GLenum pname, GLfixed *params ) */
static void
android_glGetTexParameterxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint target, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetTexParameterxvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetTexParameterxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glLightModelxOES ( GLenum pname, GLfixed param ) */
static void
android_glLightModelxOES__II
(JNIEnv *_env, jobject _this, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glLightModelxOES");
+ glLightModelxOES(
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glLightModelxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glLightModelxvOES__I_3II
(JNIEnv *_env, jobject _this, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glLightModelxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glLightModelxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glLightModelxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glLightModelxvOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glLightModelxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glLightModelxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glLightxOES ( GLenum light, GLenum pname, GLfixed param ) */
static void
android_glLightxOES__III
(JNIEnv *_env, jobject _this, jint light, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glLightxOES");
+ glLightxOES(
+ (GLenum)light,
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glLightxvOES ( GLenum light, GLenum pname, const GLfixed *params ) */
static void
android_glLightxvOES__II_3II
(JNIEnv *_env, jobject _this, jint light, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glLightxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glLightxvOES(
+ (GLenum)light,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glLightxvOES ( GLenum light, GLenum pname, const GLfixed *params ) */
static void
android_glLightxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint light, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glLightxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glLightxvOES(
+ (GLenum)light,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glLineWidthxOES ( GLfixed width ) */
static void
android_glLineWidthxOES__I
(JNIEnv *_env, jobject _this, jint width) {
- _env->ThrowNew(UOEClass,
- "glLineWidthxOES");
+ glLineWidthxOES(
+ (GLfixed)width
+ );
}
/* void glLoadMatrixxOES ( const GLfixed *m ) */
static void
android_glLoadMatrixxOES___3II
(JNIEnv *_env, jobject _this, jintArray m_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glLoadMatrixxOES");
+ GLfixed *m_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *m = (GLfixed *) 0;
+
+ if (!m_ref) {
+ _env->ThrowNew(IAEClass, "m == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(m_ref) - offset;
+ m_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(m_ref, (jboolean *)0);
+ m = m_base + offset;
+
+ glLoadMatrixxOES(
+ (GLfixed *)m
+ );
+
+exit:
+ if (m_base) {
+ _env->ReleasePrimitiveArrayCritical(m_ref, m_base,
+ JNI_ABORT);
+ }
}
/* void glLoadMatrixxOES ( const GLfixed *m ) */
static void
android_glLoadMatrixxOES__Ljava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jobject m_buf) {
- _env->ThrowNew(UOEClass,
- "glLoadMatrixxOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *m = (GLfixed *) 0;
+
+ m = (GLfixed *)getPointer(_env, m_buf, &_array, &_remaining);
+ glLoadMatrixxOES(
+ (GLfixed *)m
+ );
+ if (_array) {
+ releasePointer(_env, _array, m, JNI_FALSE);
+ }
}
/* void glMaterialxOES ( GLenum face, GLenum pname, GLfixed param ) */
static void
android_glMaterialxOES__III
(JNIEnv *_env, jobject _this, jint face, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glMaterialxOES");
+ glMaterialxOES(
+ (GLenum)face,
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glMaterialxvOES ( GLenum face, GLenum pname, const GLfixed *params ) */
static void
android_glMaterialxvOES__II_3II
(JNIEnv *_env, jobject _this, jint face, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glMaterialxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glMaterialxvOES(
+ (GLenum)face,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glMaterialxvOES ( GLenum face, GLenum pname, const GLfixed *params ) */
static void
android_glMaterialxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint face, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glMaterialxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glMaterialxvOES(
+ (GLenum)face,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glMultMatrixxOES ( const GLfixed *m ) */
static void
android_glMultMatrixxOES___3II
(JNIEnv *_env, jobject _this, jintArray m_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glMultMatrixxOES");
+ GLfixed *m_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *m = (GLfixed *) 0;
+
+ if (!m_ref) {
+ _env->ThrowNew(IAEClass, "m == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(m_ref) - offset;
+ m_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(m_ref, (jboolean *)0);
+ m = m_base + offset;
+
+ glMultMatrixxOES(
+ (GLfixed *)m
+ );
+
+exit:
+ if (m_base) {
+ _env->ReleasePrimitiveArrayCritical(m_ref, m_base,
+ JNI_ABORT);
+ }
}
/* void glMultMatrixxOES ( const GLfixed *m ) */
static void
android_glMultMatrixxOES__Ljava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jobject m_buf) {
- _env->ThrowNew(UOEClass,
- "glMultMatrixxOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *m = (GLfixed *) 0;
+
+ m = (GLfixed *)getPointer(_env, m_buf, &_array, &_remaining);
+ glMultMatrixxOES(
+ (GLfixed *)m
+ );
+ if (_array) {
+ releasePointer(_env, _array, m, JNI_FALSE);
+ }
}
/* void glMultiTexCoord4xOES ( GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q ) */
static void
android_glMultiTexCoord4xOES__IIIII
(JNIEnv *_env, jobject _this, jint target, jint s, jint t, jint r, jint q) {
- _env->ThrowNew(UOEClass,
- "glMultiTexCoord4xOES");
+ glMultiTexCoord4xOES(
+ (GLenum)target,
+ (GLfixed)s,
+ (GLfixed)t,
+ (GLfixed)r,
+ (GLfixed)q
+ );
}
/* void glNormal3xOES ( GLfixed nx, GLfixed ny, GLfixed nz ) */
static void
android_glNormal3xOES__III
(JNIEnv *_env, jobject _this, jint nx, jint ny, jint nz) {
- _env->ThrowNew(UOEClass,
- "glNormal3xOES");
+ glNormal3xOES(
+ (GLfixed)nx,
+ (GLfixed)ny,
+ (GLfixed)nz
+ );
}
/* void glOrthoxOES ( GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar ) */
static void
android_glOrthoxOES__IIIIII
(JNIEnv *_env, jobject _this, jint left, jint right, jint bottom, jint top, jint zNear, jint zFar) {
- _env->ThrowNew(UOEClass,
- "glOrthoxOES");
+ glOrthoxOES(
+ (GLfixed)left,
+ (GLfixed)right,
+ (GLfixed)bottom,
+ (GLfixed)top,
+ (GLfixed)zNear,
+ (GLfixed)zFar
+ );
}
/* void glPointParameterxOES ( GLenum pname, GLfixed param ) */
static void
android_glPointParameterxOES__II
(JNIEnv *_env, jobject _this, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glPointParameterxOES");
+ glPointParameterxOES(
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glPointParameterxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glPointParameterxvOES__I_3II
(JNIEnv *_env, jobject _this, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glPointParameterxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glPointParameterxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glPointParameterxvOES ( GLenum pname, const GLfixed *params ) */
static void
android_glPointParameterxvOES__ILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glPointParameterxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glPointParameterxvOES(
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glPointSizexOES ( GLfixed size ) */
static void
android_glPointSizexOES__I
(JNIEnv *_env, jobject _this, jint size) {
- _env->ThrowNew(UOEClass,
- "glPointSizexOES");
+ glPointSizexOES(
+ (GLfixed)size
+ );
}
/* void glPolygonOffsetxOES ( GLfixed factor, GLfixed units ) */
static void
android_glPolygonOffsetxOES__II
(JNIEnv *_env, jobject _this, jint factor, jint units) {
- _env->ThrowNew(UOEClass,
- "glPolygonOffsetxOES");
+ glPolygonOffsetxOES(
+ (GLfixed)factor,
+ (GLfixed)units
+ );
}
/* void glRotatexOES ( GLfixed angle, GLfixed x, GLfixed y, GLfixed z ) */
static void
android_glRotatexOES__IIII
(JNIEnv *_env, jobject _this, jint angle, jint x, jint y, jint z) {
- _env->ThrowNew(UOEClass,
- "glRotatexOES");
+ glRotatexOES(
+ (GLfixed)angle,
+ (GLfixed)x,
+ (GLfixed)y,
+ (GLfixed)z
+ );
}
/* void glSampleCoveragexOES ( GLclampx value, GLboolean invert ) */
static void
android_glSampleCoveragexOES__IZ
(JNIEnv *_env, jobject _this, jint value, jboolean invert) {
- _env->ThrowNew(UOEClass,
- "glSampleCoveragexOES");
+ glSampleCoveragexOES(
+ (GLclampx)value,
+ (GLboolean)invert
+ );
}
/* void glScalexOES ( GLfixed x, GLfixed y, GLfixed z ) */
static void
android_glScalexOES__III
(JNIEnv *_env, jobject _this, jint x, jint y, jint z) {
- _env->ThrowNew(UOEClass,
- "glScalexOES");
+ glScalexOES(
+ (GLfixed)x,
+ (GLfixed)y,
+ (GLfixed)z
+ );
}
/* void glTexEnvxOES ( GLenum target, GLenum pname, GLfixed param ) */
static void
android_glTexEnvxOES__III
(JNIEnv *_env, jobject _this, jint target, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glTexEnvxOES");
+ glTexEnvxOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glTexEnvxvOES ( GLenum target, GLenum pname, const GLfixed *params ) */
static void
android_glTexEnvxvOES__II_3II
(JNIEnv *_env, jobject _this, jint target, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glTexEnvxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glTexEnvxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glTexEnvxvOES ( GLenum target, GLenum pname, const GLfixed *params ) */
static void
android_glTexEnvxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint target, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glTexEnvxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glTexEnvxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glTexParameterxOES ( GLenum target, GLenum pname, GLfixed param ) */
static void
android_glTexParameterxOES__III
(JNIEnv *_env, jobject _this, jint target, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glTexParameterxOES");
+ glTexParameterxOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glTexParameterxvOES ( GLenum target, GLenum pname, const GLfixed *params ) */
static void
android_glTexParameterxvOES__II_3II
(JNIEnv *_env, jobject _this, jint target, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glTexParameterxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glTexParameterxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glTexParameterxvOES ( GLenum target, GLenum pname, const GLfixed *params ) */
static void
android_glTexParameterxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint target, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glTexParameterxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glTexParameterxvOES(
+ (GLenum)target,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glTranslatexOES ( GLfixed x, GLfixed y, GLfixed z ) */
static void
android_glTranslatexOES__III
(JNIEnv *_env, jobject _this, jint x, jint y, jint z) {
- _env->ThrowNew(UOEClass,
- "glTranslatexOES");
+ glTranslatexOES(
+ (GLfixed)x,
+ (GLfixed)y,
+ (GLfixed)z
+ );
}
/* GLboolean glIsRenderbufferOES ( GLuint renderbuffer ) */
@@ -1103,184 +1807,528 @@ android_glWeightPointerOES__IIILjava_nio_Buffer_2
static void
android_glDepthRangefOES__FF
(JNIEnv *_env, jobject _this, jfloat zNear, jfloat zFar) {
- _env->ThrowNew(UOEClass,
- "glDepthRangefOES");
+ glDepthRangefOES(
+ (GLclampf)zNear,
+ (GLclampf)zFar
+ );
}
/* void glFrustumfOES ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar ) */
static void
android_glFrustumfOES__FFFFFF
(JNIEnv *_env, jobject _this, jfloat left, jfloat right, jfloat bottom, jfloat top, jfloat zNear, jfloat zFar) {
- _env->ThrowNew(UOEClass,
- "glFrustumfOES");
+ glFrustumfOES(
+ (GLfloat)left,
+ (GLfloat)right,
+ (GLfloat)bottom,
+ (GLfloat)top,
+ (GLfloat)zNear,
+ (GLfloat)zFar
+ );
}
/* void glOrthofOES ( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar ) */
static void
android_glOrthofOES__FFFFFF
(JNIEnv *_env, jobject _this, jfloat left, jfloat right, jfloat bottom, jfloat top, jfloat zNear, jfloat zFar) {
- _env->ThrowNew(UOEClass,
- "glOrthofOES");
+ glOrthofOES(
+ (GLfloat)left,
+ (GLfloat)right,
+ (GLfloat)bottom,
+ (GLfloat)top,
+ (GLfloat)zNear,
+ (GLfloat)zFar
+ );
}
/* void glClipPlanefOES ( GLenum plane, const GLfloat *equation ) */
static void
android_glClipPlanefOES__I_3FI
(JNIEnv *_env, jobject _this, jint plane, jfloatArray equation_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glClipPlanefOES");
+ GLfloat *equation_base = (GLfloat *) 0;
+ jint _remaining;
+ GLfloat *equation = (GLfloat *) 0;
+
+ if (!equation_ref) {
+ _env->ThrowNew(IAEClass, "equation == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(equation_ref) - offset;
+ equation_base = (GLfloat *)
+ _env->GetPrimitiveArrayCritical(equation_ref, (jboolean *)0);
+ equation = equation_base + offset;
+
+ glClipPlanefOES(
+ (GLenum)plane,
+ (GLfloat *)equation
+ );
+
+exit:
+ if (equation_base) {
+ _env->ReleasePrimitiveArrayCritical(equation_ref, equation_base,
+ JNI_ABORT);
+ }
}
/* void glClipPlanefOES ( GLenum plane, const GLfloat *equation ) */
static void
android_glClipPlanefOES__ILjava_nio_FloatBuffer_2
(JNIEnv *_env, jobject _this, jint plane, jobject equation_buf) {
- _env->ThrowNew(UOEClass,
- "glClipPlanefOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfloat *equation = (GLfloat *) 0;
+
+ equation = (GLfloat *)getPointer(_env, equation_buf, &_array, &_remaining);
+ glClipPlanefOES(
+ (GLenum)plane,
+ (GLfloat *)equation
+ );
+ if (_array) {
+ releasePointer(_env, _array, equation, JNI_FALSE);
+ }
}
/* void glGetClipPlanefOES ( GLenum pname, GLfloat *eqn ) */
static void
android_glGetClipPlanefOES__I_3FI
(JNIEnv *_env, jobject _this, jint pname, jfloatArray eqn_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetClipPlanefOES");
+ jint _exception = 0;
+ GLfloat *eqn_base = (GLfloat *) 0;
+ jint _remaining;
+ GLfloat *eqn = (GLfloat *) 0;
+
+ if (!eqn_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "eqn == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(eqn_ref) - offset;
+ if (_remaining < 4) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "length - offset < 4");
+ goto exit;
+ }
+ eqn_base = (GLfloat *)
+ _env->GetPrimitiveArrayCritical(eqn_ref, (jboolean *)0);
+ eqn = eqn_base + offset;
+
+ glGetClipPlanefOES(
+ (GLenum)pname,
+ (GLfloat *)eqn
+ );
+
+exit:
+ if (eqn_base) {
+ _env->ReleasePrimitiveArrayCritical(eqn_ref, eqn_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetClipPlanefOES ( GLenum pname, GLfloat *eqn ) */
static void
android_glGetClipPlanefOES__ILjava_nio_FloatBuffer_2
(JNIEnv *_env, jobject _this, jint pname, jobject eqn_buf) {
- _env->ThrowNew(UOEClass,
- "glGetClipPlanefOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfloat *eqn = (GLfloat *) 0;
+
+ eqn = (GLfloat *)getPointer(_env, eqn_buf, &_array, &_remaining);
+ if (_remaining < 4) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "remaining() < 4");
+ goto exit;
+ }
+ glGetClipPlanefOES(
+ (GLenum)pname,
+ (GLfloat *)eqn
+ );
+
+exit:
+ if (_array) {
+ releasePointer(_env, _array, eqn, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glClearDepthfOES ( GLclampf depth ) */
static void
android_glClearDepthfOES__F
(JNIEnv *_env, jobject _this, jfloat depth) {
- _env->ThrowNew(UOEClass,
- "glClearDepthfOES");
+ glClearDepthfOES(
+ (GLclampf)depth
+ );
}
/* void glTexGenfOES ( GLenum coord, GLenum pname, GLfloat param ) */
static void
android_glTexGenfOES__IIF
(JNIEnv *_env, jobject _this, jint coord, jint pname, jfloat param) {
- _env->ThrowNew(UOEClass,
- "glTexGenfOES");
+ glTexGenfOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfloat)param
+ );
}
/* void glTexGenfvOES ( GLenum coord, GLenum pname, const GLfloat *params ) */
static void
android_glTexGenfvOES__II_3FI
(JNIEnv *_env, jobject _this, jint coord, jint pname, jfloatArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glTexGenfvOES");
+ GLfloat *params_base = (GLfloat *) 0;
+ jint _remaining;
+ GLfloat *params = (GLfloat *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfloat *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glTexGenfvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfloat *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glTexGenfvOES ( GLenum coord, GLenum pname, const GLfloat *params ) */
static void
android_glTexGenfvOES__IILjava_nio_FloatBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glTexGenfvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfloat *params = (GLfloat *) 0;
+
+ params = (GLfloat *)getPointer(_env, params_buf, &_array, &_remaining);
+ glTexGenfvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfloat *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glTexGeniOES ( GLenum coord, GLenum pname, GLint param ) */
static void
android_glTexGeniOES__III
(JNIEnv *_env, jobject _this, jint coord, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glTexGeniOES");
+ glTexGeniOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLint)param
+ );
}
/* void glTexGenivOES ( GLenum coord, GLenum pname, const GLint *params ) */
static void
android_glTexGenivOES__II_3II
(JNIEnv *_env, jobject _this, jint coord, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glTexGenivOES");
+ GLint *params_base = (GLint *) 0;
+ jint _remaining;
+ GLint *params = (GLint *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLint *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glTexGenivOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLint *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glTexGenivOES ( GLenum coord, GLenum pname, const GLint *params ) */
static void
android_glTexGenivOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glTexGenivOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLint *params = (GLint *) 0;
+
+ params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining);
+ glTexGenivOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLint *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glTexGenxOES ( GLenum coord, GLenum pname, GLfixed param ) */
static void
android_glTexGenxOES__III
(JNIEnv *_env, jobject _this, jint coord, jint pname, jint param) {
- _env->ThrowNew(UOEClass,
- "glTexGenxOES");
+ glTexGenxOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfixed)param
+ );
}
/* void glTexGenxvOES ( GLenum coord, GLenum pname, const GLfixed *params ) */
static void
android_glTexGenxvOES__II_3II
(JNIEnv *_env, jobject _this, jint coord, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glTexGenxvOES");
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glTexGenxvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ JNI_ABORT);
+ }
}
/* void glTexGenxvOES ( GLenum coord, GLenum pname, const GLfixed *params ) */
static void
android_glTexGenxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glTexGenxvOES");
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glTexGenxvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, JNI_FALSE);
+ }
}
/* void glGetTexGenfvOES ( GLenum coord, GLenum pname, GLfloat *params ) */
static void
android_glGetTexGenfvOES__II_3FI
(JNIEnv *_env, jobject _this, jint coord, jint pname, jfloatArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenfvOES");
+ jint _exception = 0;
+ GLfloat *params_base = (GLfloat *) 0;
+ jint _remaining;
+ GLfloat *params = (GLfloat *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfloat *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetTexGenfvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfloat *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetTexGenfvOES ( GLenum coord, GLenum pname, GLfloat *params ) */
static void
android_glGetTexGenfvOES__IILjava_nio_FloatBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenfvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfloat *params = (GLfloat *) 0;
+
+ params = (GLfloat *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetTexGenfvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfloat *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetTexGenivOES ( GLenum coord, GLenum pname, GLint *params ) */
static void
android_glGetTexGenivOES__II_3II
(JNIEnv *_env, jobject _this, jint coord, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenivOES");
+ jint _exception = 0;
+ GLint *params_base = (GLint *) 0;
+ jint _remaining;
+ GLint *params = (GLint *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLint *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetTexGenivOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLint *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetTexGenivOES ( GLenum coord, GLenum pname, GLint *params ) */
static void
android_glGetTexGenivOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenivOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLint *params = (GLint *) 0;
+
+ params = (GLint *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetTexGenivOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLint *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
/* void glGetTexGenxvOES ( GLenum coord, GLenum pname, GLfixed *params ) */
static void
android_glGetTexGenxvOES__II_3II
(JNIEnv *_env, jobject _this, jint coord, jint pname, jintArray params_ref, jint offset) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenxvOES");
+ jint _exception = 0;
+ GLfixed *params_base = (GLfixed *) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ if (!params_ref) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "params == null");
+ goto exit;
+ }
+ if (offset < 0) {
+ _exception = 1;
+ _env->ThrowNew(IAEClass, "offset < 0");
+ goto exit;
+ }
+ _remaining = _env->GetArrayLength(params_ref) - offset;
+ params_base = (GLfixed *)
+ _env->GetPrimitiveArrayCritical(params_ref, (jboolean *)0);
+ params = params_base + offset;
+
+ glGetTexGenxvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+
+exit:
+ if (params_base) {
+ _env->ReleasePrimitiveArrayCritical(params_ref, params_base,
+ _exception ? JNI_ABORT: 0);
+ }
}
/* void glGetTexGenxvOES ( GLenum coord, GLenum pname, GLfixed *params ) */
static void
android_glGetTexGenxvOES__IILjava_nio_IntBuffer_2
(JNIEnv *_env, jobject _this, jint coord, jint pname, jobject params_buf) {
- _env->ThrowNew(UOEClass,
- "glGetTexGenxvOES");
+ jint _exception = 0;
+ jarray _array = (jarray) 0;
+ jint _remaining;
+ GLfixed *params = (GLfixed *) 0;
+
+ params = (GLfixed *)getPointer(_env, params_buf, &_array, &_remaining);
+ glGetTexGenxvOES(
+ (GLenum)coord,
+ (GLenum)pname,
+ (GLfixed *)params
+ );
+ if (_array) {
+ releasePointer(_env, _array, params, _exception ? JNI_FALSE : JNI_TRUE);
+ }
}
static const char *classPathName = "android/opengl/GLES11Ext";
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index bd56605..d760feb 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -50,6 +50,16 @@ pid_t gettid() { return syscall(__NR_gettid);}
#undef __KERNEL__
#endif
+#define ENABLE_CGROUP_ERR_LOGGING 0
+
+/*
+ * List of cgroup names which map to ANDROID_TGROUP_ values in Thread.h
+ * and Process.java
+ * These names are used to construct the path to the cgroup control dir
+ */
+
+static const char *cgroup_names[] = { NULL, "bg_non_interactive", "fg_boost" };
+
using namespace android;
static void signalExceptionForPriorityError(JNIEnv* env, jobject obj, int err)
@@ -73,6 +83,28 @@ static void signalExceptionForPriorityError(JNIEnv* env, jobject obj, int err)
}
}
+static void signalExceptionForGroupError(JNIEnv* env, jobject obj, int err)
+{
+ switch (err) {
+ case EINVAL:
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ break;
+ case ESRCH:
+ jniThrowException(env, "java/lang/IllegalArgumentException", "Given thread does not exist");
+ break;
+ case EPERM:
+ jniThrowException(env, "java/lang/SecurityException", "No permission to modify given thread");
+ break;
+ case EACCES:
+ jniThrowException(env, "java/lang/SecurityException", "No permission to set to given group");
+ break;
+ default:
+ jniThrowException(env, "java/lang/RuntimeException", "Unknown error");
+ break;
+ }
+}
+
+
static void fakeProcessEntry(void* arg)
{
String8* cls = (String8*)arg;
@@ -164,9 +196,55 @@ jint android_os_Process_getGidForName(JNIEnv* env, jobject clazz, jstring name)
return -1;
}
+static int add_pid_to_cgroup(int pid, int grp)
+{
+ FILE *fp;
+ char path[255];
+ int rc;
+
+ sprintf(path, "/dev/cpuctl/%s/tasks", (cgroup_names[grp] ? cgroup_names[grp] : ""));
+
+ if (!(fp = fopen(path, "w"))) {
+#if ENABLE_CGROUP_ERR_LOGGING
+ LOGW("Unable to open %s (%s)\n", path, strerror(errno));
+#endif
+ return -errno;
+ }
+
+ rc = fprintf(fp, "%d", pid);
+ fclose(fp);
+
+ if (rc < 0) {
+#if ENABLE_CGROUP_ERR_LOGGING
+ LOGW("Unable to move pid %d to cgroup %s (%s)\n", pid,
+ (cgroup_names[grp] ? cgroup_names[grp] : "<default>"),
+ strerror(errno));
+#endif
+ }
+
+ return (rc < 0) ? errno : 0;
+}
+
+void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint grp)
+{
+ if (grp > ANDROID_TGROUP_MAX || grp < 0) {
+ signalExceptionForGroupError(env, clazz, EINVAL);
+ return;
+ }
+
+ if (add_pid_to_cgroup(pid, grp))
+ signalExceptionForGroupError(env, clazz, errno);
+}
+
void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz,
jint pid, jint pri)
{
+ if (pri == ANDROID_PRIORITY_BACKGROUND) {
+ add_pid_to_cgroup(pid, ANDROID_TGROUP_BG_NONINTERACT);
+ } else if (getpriority(PRIO_PROCESS, pid) == ANDROID_PRIORITY_BACKGROUND) {
+ add_pid_to_cgroup(pid, ANDROID_TGROUP_DEFAULT);
+ }
+
if (setpriority(PRIO_PROCESS, pid, pri) < 0) {
signalExceptionForPriorityError(env, clazz, errno);
}
@@ -741,6 +819,7 @@ static const JNINativeMethod methods[] = {
{"setThreadPriority", "(II)V", (void*)android_os_Process_setThreadPriority},
{"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority},
{"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority},
+ {"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},
{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
{"setUid", "(I)I", (void*)android_os_Process_setUid},
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c653c78..df599da 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -366,6 +366,23 @@
android:label="@string/permlab_readPhoneState"
android:description="@string/permdesc_readPhoneState" />
+ <!-- ================================== -->
+ <!-- Permissions for sdcard interaction -->
+ <!-- ================================== -->
+ <eat-comment />
+
+ <!-- Group of permissions that are related to SD card access. -->
+ <permission-group android:name="android.permission-group.STORAGE"
+ android:label="@string/permgrouplab_storage"
+ android:description="@string/permgroupdesc_storage" />
+
+ <!-- Allows an application to write to the SD card -->
+ <permission android:name="android.permission.SDCARD_WRITE"
+ android:permissionGroup="android.permission-group.STORAGE"
+ android:label="@string/permlab_sdcardWrite"
+ android:description="@string/permdesc_sdcardWrite"
+ android:protectionLevel="normal" />
+
<!-- ============================================ -->
<!-- Permissions for low-level system interaction -->
<!-- ============================================ -->
diff --git a/core/res/res/drawable/btn_global_search.xml b/core/res/res/drawable/btn_global_search.xml
new file mode 100644
index 0000000..531f07e
--- /dev/null
+++ b/core/res/res/drawable/btn_global_search.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- TODO Need different assets for some of these button states. -->
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/btn_global_search_normal" />
+ <item android:state_window_focused="false" android:state_enabled="false"
+ android:drawable="@drawable/btn_global_search_normal" />
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_default_pressed" />
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/btn_default_selected" />
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_global_search_normal" />
+ <item android:state_focused="true"
+ android:drawable="@drawable/btn_global_search_normal" />
+ <item
+ android:drawable="@drawable/btn_global_search_normal" />
+</selector>
diff --git a/core/res/res/drawable/btn_global_search_normal.9.png b/core/res/res/drawable/btn_global_search_normal.9.png
new file mode 100644
index 0000000..9b7d3e5
--- /dev/null
+++ b/core/res/res/drawable/btn_global_search_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog.xml b/core/res/res/drawable/btn_search_dialog.xml
new file mode 100644
index 0000000..b7f5187
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_default" />
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_search_dialog_pressed" />
+
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_selected" />
+
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_default" />
+
+ <item
+ android:drawable="@drawable/btn_search_dialog_default" />
+</selector>
diff --git a/core/res/res/drawable/btn_search_dialog_default.9.png b/core/res/res/drawable/btn_search_dialog_default.9.png
new file mode 100644
index 0000000..ec39178
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_default.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog_pressed.9.png b/core/res/res/drawable/btn_search_dialog_pressed.9.png
new file mode 100644
index 0000000..5f52fef
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog_selected.9.png b/core/res/res/drawable/btn_search_dialog_selected.9.png
new file mode 100644
index 0000000..9fc2fde
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog_voice.xml b/core/res/res/drawable/btn_search_dialog_voice.xml
new file mode 100644
index 0000000..748aaf5
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_voice.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_voice_default" />
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_search_dialog_voice_pressed" />
+
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_voice_selected" />
+
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_search_dialog_voice_default" />
+
+ <item
+ android:drawable="@drawable/btn_search_dialog_voice_default" />
+</selector>
diff --git a/core/res/res/drawable/btn_search_dialog_voice_default.9.png b/core/res/res/drawable/btn_search_dialog_voice_default.9.png
new file mode 100644
index 0000000..2a3366c
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_voice_default.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog_voice_pressed.9.png b/core/res/res/drawable/btn_search_dialog_voice_pressed.9.png
new file mode 100644
index 0000000..57d7a74
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_voice_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable/btn_search_dialog_voice_selected.9.png b/core/res/res/drawable/btn_search_dialog_voice_selected.9.png
new file mode 100644
index 0000000..db3187e
--- /dev/null
+++ b/core/res/res/drawable/btn_search_dialog_voice_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable/search_dropdown_background.9.png b/core/res/res/drawable/search_dropdown_background.9.png
new file mode 100755
index 0000000..a6923b7
--- /dev/null
+++ b/core/res/res/drawable/search_dropdown_background.9.png
Binary files differ
diff --git a/core/res/res/drawable/search_plate_global.9.png b/core/res/res/drawable/search_plate_global.9.png
new file mode 100644
index 0000000..1cad902
--- /dev/null
+++ b/core/res/res/drawable/search_plate_global.9.png
Binary files differ
diff --git a/core/res/res/drawable/textfield_search.xml b/core/res/res/drawable/textfield_search.xml
new file mode 100644
index 0000000..2923368
--- /dev/null
+++ b/core/res/res/drawable/textfield_search.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/textfield_search_default" />
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/textfield_search_pressed" />
+
+ <item android:state_enabled="true" android:state_focused="true"
+ android:drawable="@drawable/textfield_search_selected" />
+
+ <item android:drawable="@drawable/textfield_search_default" />
+
+</selector>
+
diff --git a/core/res/res/drawable/textfield_search_default.9.png b/core/res/res/drawable/textfield_search_default.9.png
new file mode 100755
index 0000000..7dc5b27
--- /dev/null
+++ b/core/res/res/drawable/textfield_search_default.9.png
Binary files differ
diff --git a/core/res/res/drawable/textfield_search_pressed.9.png b/core/res/res/drawable/textfield_search_pressed.9.png
new file mode 100644
index 0000000..da00c25
--- /dev/null
+++ b/core/res/res/drawable/textfield_search_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable/textfield_search_selected.9.png b/core/res/res/drawable/textfield_search_selected.9.png
new file mode 100755
index 0000000..a9fd3b2
--- /dev/null
+++ b/core/res/res/drawable/textfield_search_selected.9.png
Binary files differ
diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml
index 5e296c5..4c5c456 100644
--- a/core/res/res/layout/resolve_list_item.xml
+++ b/core/res/res/layout/resolve_list_item.xml
@@ -23,7 +23,7 @@
android:minHeight="?android:attr/listPreferredItemHeight"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
- android:paddingLeft="14dip"
+ android:paddingLeft="10dip"
android:paddingRight="15dip">
<!-- Activity icon when presenting dialog -->
@@ -42,13 +42,13 @@
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="6dip" />
+ android:paddingLeft="10dip" />
<!-- Extended activity info to distinguish between duplicate activity names -->
<TextView android:id="@android:id/text2"
android:textAppearance="?android:attr/textAppearanceMediumInverse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="6dip" />
+ android:paddingLeft="10dip" />
</LinearLayout>
</LinearLayout>
diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml
index ef347da..5db0737 100644
--- a/core/res/res/layout/search_bar.xml
+++ b/core/res/res/layout/search_bar.xml
@@ -22,83 +22,77 @@
android:id="@+id/search_bar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:paddingBottom="200dip"
- android:orientation="vertical"
+ android:orientation="vertical"
android:focusable="true"
android:descendantFocusability="afterDescendants">
- <!-- android:paddingBottom="14dip" TODO MUST FIX - it's a hack to get the popup to show -->
<!-- Outer layout defines the entire search bar at the top of the screen -->
- <!-- Bottom padding of 16 is due to the graphic, with 9 extra pixels of drop
- shadow, plus the desired padding of "8" against the user-visible (grey)
- pixels, minus "1" to correct for positioning of the edittext & button. -->
<LinearLayout
android:id="@+id/search_plate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
- android:paddingTop="6dip"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:paddingTop="7dip"
android:paddingBottom="16dip"
- android:baselineAligned="false"
- android:background="@android:drawable/search_plate"
- android:addStatesFromChildren="true" >
+ android:background="@drawable/search_plate_global" >
<!-- This is actually used for the badge icon *or* the badge label (or neither) -->
<TextView
android:id="@+id/search_badge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="2dip"
+ android:layout_marginBottom="2dip"
android:drawablePadding="0dip"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary" />
+ android:textColor="?android:attr/textColorPrimaryInverse" />
- <!-- Inner layout contains the button(s) and EditText -->
- <!-- The layout_marginTop of "1" corrects for the extra 1 pixel of padding at the top of
- textfield_selected.9.png. The "real" margin as displayed is "2". -->
- <!-- The layout_marginBottom of "-5" corrects for the spacing we see at the
- bottom of the edittext and button images. The "real" margin as displayed is "8" -->
+ <!-- Inner layout contains the app icon, button(s) and EditText -->
<LinearLayout
android:id="@+id/search_edit_frame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="1dip"
- android:layout_marginBottom="-5dip"
- android:orientation="horizontal"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical"
- android:baselineAligned="false" >
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/search_app_icon"
+ android:layout_height="36dip"
+ android:layout_width="36dip"
+ android:layout_marginRight="7dip"
+ android:layout_gravity="center_vertical"
+ />
<view class="android.app.SearchDialog$SearchAutoComplete"
android:id="@+id/search_src_text"
+ android:background="@drawable/textfield_search"
android:layout_height="wrap_content"
android:layout_width="0dip"
android:layout_weight="1.0"
android:paddingLeft="8dip"
android:paddingRight="6dip"
+ android:singleLine="true"
android:inputType="text|textAutoComplete"
android:dropDownWidth="fill_parent"
android:dropDownAnchor="@id/search_plate"
- android:dropDownVerticalOffset="-15dip"
- />
- <!-- android:focusableInTouchMode="false" -->
- <!-- android:singleLine="true" -->
- <!-- android:selectAllOnFocus="true" -->
+ android:dropDownVerticalOffset="-9dip"
+ android:popupBackground="@android:drawable/search_dropdown_background"
+ />
<!-- This button can switch between text and icon "modes" -->
<Button
android:id="@+id/search_go_btn"
- android:layout_marginLeft="1dip"
+ android:background="@drawable/btn_search_dialog"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawableLeft="@android:drawable/ic_btn_search"
+ android:layout_height="fill_parent"
/>
- <ImageButton android:id="@+id/search_voice_btn"
+ <ImageButton
+ android:id="@+id/search_voice_btn"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/btn_search_dialog_voice"
android:src="@android:drawable/ic_btn_speak_now"
/>
</LinearLayout>
diff --git a/core/res/res/layout/search_dropdown_item_1line.xml b/core/res/res/layout/search_dropdown_item_1line.xml
index 3827206..bf3dd48 100644
--- a/core/res/res/layout/search_dropdown_item_1line.xml
+++ b/core/res/res/layout/search_dropdown_item_1line.xml
@@ -20,7 +20,7 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceMediumInverse"
+ android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
android:singleLine="true"
android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight" />
+ android:layout_height="?android:attr/searchResultListItemHeight" /> \ No newline at end of file
diff --git a/core/res/res/layout/search_dropdown_item_2line.xml b/core/res/res/layout/search_dropdown_item_2line.xml
index 96d6005..5546b6636 100644
--- a/core/res/res/layout/search_dropdown_item_2line.xml
+++ b/core/res/res/layout/search_dropdown_item_2line.xml
@@ -20,15 +20,16 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
+ android:layout_height="?android:attr/searchResultListItemHeight"
android:orientation="horizontal"
android:gravity="center_vertical"
android:baselineAligned="false"
>
<TwoLineListItem
- android:paddingTop="2dip"
- android:paddingBottom="2dip"
+ android:paddingTop="1dip"
+ android:paddingBottom="1dip"
+ android:gravity="center_vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
@@ -37,7 +38,7 @@
<TextView
android:id="@android:id/text1"
style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceMediumInverse"
+ android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
@@ -45,7 +46,7 @@
<TextView
android:id="@android:id/text2"
style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
+ android:textAppearance="?android:attr/textAppearanceSearchResultSubtitle"
android:textColor="?android:attr/textColorSecondaryInverse"
android:singleLine="true"
android:layout_width="fill_parent"
diff --git a/core/res/res/layout/search_dropdown_item_icons_1line.xml b/core/res/res/layout/search_dropdown_item_icons_1line.xml
index c0713d5..4f65d74 100644
--- a/core/res/res/layout/search_dropdown_item_icons_1line.xml
+++ b/core/res/res/layout/search_dropdown_item_icons_1line.xml
@@ -22,31 +22,33 @@
<!-- of the text element in apps/common/res/layout/simple_dropdown_item_1line.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingLeft="4dip"
+ android:paddingRight="2dip"
android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
+ android:layout_height="?android:attr/searchResultListItemHeight"
android:orientation="horizontal"
android:gravity="center_vertical"
android:baselineAligned="false"
>
<ImageView android:id="@android:id/icon1"
- android:layout_width="32dip"
- android:layout_height="32dip"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
android:layout_gravity="center_vertical"
- android:scaleType="fitCenter" />
+ android:scaleType="centerInside" />
<TextView android:id="@android:id/text1"
style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceMediumInverse"
+ android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
android:singleLine="true"
android:layout_height="wrap_content"
android:layout_width="0dip"
android:layout_weight="1" />
<ImageView android:id="@android:id/icon2"
- android:layout_width="32dip"
- android:layout_height="32dip"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
android:layout_gravity="center_vertical"
- android:scaleType="fitCenter" />
+ android:scaleType="centerInside" />
</LinearLayout>
diff --git a/core/res/res/layout/search_dropdown_item_icons_2line.xml b/core/res/res/layout/search_dropdown_item_icons_2line.xml
index ad1c905..0d07490 100644
--- a/core/res/res/layout/search_dropdown_item_icons_2line.xml
+++ b/core/res/res/layout/search_dropdown_item_icons_2line.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
+/*
**
** Copyright 2008, The Android Open Source Project
**
@@ -18,56 +18,62 @@
*/
-->
- <!-- NOTE: The appearance of the inner text element must match the appearance -->
- <!-- of the text element in apps/common/res/layout/simple_dropdown_item_2line.xml -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingLeft="4dip"
+ android:paddingRight="2dip"
android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:baselineAligned="false"
- >
-
- <ImageView android:id="@android:id/icon1"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_gravity="center_vertical"
- android:scaleType="fitCenter" />
+ android:layout_height="?android:attr/searchResultListItemHeight" >
- <TwoLineListItem
- android:paddingTop="2dip"
- android:paddingBottom="2dip"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:mode="twoLine" >
-
- <TextView
- android:id="@android:id/text1"
- style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceMediumInverse"
- android:singleLine="true"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
-
- <TextView
- android:id="@android:id/text2"
- style="?android:attr/dropDownItemStyle"
- android:textAppearance="?android:attr/textAppearanceSmallInverse"
- android:textColor="?android:attr/textColorSecondaryInverse"
- android:singleLine="true"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_below="@android:id/text1"
- android:layout_alignLeft="@android:id/text1" />
-
- </TwoLineListItem>
+ <!-- Icons come first in the layout, since their placement doesn't depend on
+ the placement of the text views. -->
+ <ImageView android:id="@android:id/icon1"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:scaleType="centerInside"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="gone" />
<ImageView android:id="@android:id/icon2"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_gravity="center_vertical"
- android:scaleType="fitCenter" />
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:scaleType="centerInside"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="gone" />
-</LinearLayout>
+ <!-- The subtitle comes before the title, since the height of the title depends on whether the
+ subtitle is visible or gone. -->
+ <TextView android:id="@android:id/text2"
+ style="?android:attr/dropDownItemStyle"
+ android:textAppearance="?android:attr/textAppearanceSearchResultSubtitle"
+ android:singleLine="true"
+ android:layout_width="fill_parent"
+ android:layout_height="29dip"
+ android:paddingBottom="4dip"
+ android:gravity="top"
+ android:layout_toRightOf="@android:id/icon1"
+ android:layout_toLeftOf="@android:id/icon2"
+ android:layout_alignWithParentIfMissing="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="gone" />
+
+ <!-- The title is placed above the subtitle, if there is one. If there is no
+ subtitle, it fills the parent. -->
+ <TextView android:id="@android:id/text1"
+ style="?android:attr/dropDownItemStyle"
+ android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
+ android:singleLine="true"
+ android:layout_width="fill_parent"
+ android:layout_height="29dip"
+ android:paddingTop="4dip"
+ android:gravity="center_vertical"
+ android:layout_alignParentTop="true"
+ android:layout_toRightOf="@android:id/icon1"
+ android:layout_toLeftOf="@android:id/icon2"
+ android:layout_above="@android:id/text2"
+ android:layout_alignWithParentIfMissing="true" />
+
+</RelativeLayout>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d02f4b1..8ab6f430 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -54,16 +54,11 @@
<string name="CLIRDefaultOffNextCallOff">"預設顯示本機號碼,下一通也顯示。"</string>
<string name="serviceNotProvisioned">"服務未設定完成。"</string>
<string name="CLIRPermanent">"本機號碼設定無法變更。"</string>
- <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
- <skip />
- <!-- no translation found for RestrictedOnData (8653794784690065540) -->
- <skip />
- <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
- <skip />
- <!-- no translation found for RestrictedOnNormal (2045364908281990708) -->
- <skip />
- <!-- no translation found for RestrictedOnAll (4923139582141626159) -->
- <skip />
+ <string name="RestrictedChangedTitle">"受限存取已變更"</string>
+ <string name="RestrictedOnData">"已封鎖資料服務。"</string>
+ <string name="RestrictedOnEmergency">"已封鎖緊急服務。"</string>
+ <string name="RestrictedOnNormal">"已封鎖語音/SMS 服務。"</string>
+ <string name="RestrictedOnAll">"已封鎖所有語音/SMS 服務。"</string>
<string name="serviceClassVoice">"語音"</string>
<string name="serviceClassData">"資料"</string>
<string name="serviceClassFAX">"傳真"</string>
@@ -269,7 +264,7 @@
<string name="permlab_recordAudio">"錄製音訊"</string>
<string name="permdesc_recordAudio">"允許應用程式存取音訊錄製路徑。"</string>
<string name="permlab_camera">"照相"</string>
- <string name="permdesc_camera">"允許應用程式使用相機照相。此功能可讓應用程式隨時透過相機拍攝照片。"</string>
+ <string name="permdesc_camera">"允許應用程式使用相機拍照。此功能可讓應用程式隨時透過相機拍攝照片。"</string>
<string name="permlab_brick">"永久停用電話"</string>
<string name="permdesc_brick">"允許應用程式永久停用手機。此項操作非常危險。"</string>
<string name="permlab_reboot">"強制重開機"</string>
@@ -278,8 +273,8 @@
<string name="permdesc_mount_unmount_filesystems">"允許應用程式掛載/卸載抽取式儲存設備的檔案系統。"</string>
<string name="permlab_mount_format_filesystems">"將外接式儲存裝置格式化"</string>
<string name="permdesc_mount_format_filesystems">"允許應用程式將可移除式儲存裝置格式化。"</string>
- <string name="permlab_vibrate">"控制震動器"</string>
- <string name="permdesc_vibrate">"允許應用程式控制震動器。"</string>
+ <string name="permlab_vibrate">"控制振動器"</string>
+ <string name="permdesc_vibrate">"允許應用程式控制振動器。"</string>
<string name="permlab_flashlight">"控制閃光燈"</string>
<string name="permdesc_flashlight">"允許應用程式控制閃光燈。"</string>
<string name="permlab_hardware_test">"測試硬體"</string>
@@ -299,7 +294,7 @@
<string name="permlab_readPhoneState">"讀取手機狀態"</string>
<string name="permdesc_readPhoneState">"允許應用程式存取裝置的電話功能。通話時,有此權限的應用程式可設定手機是否通話、撥出的號碼等等。"</string>
<string name="permlab_wakeLock">"防止手機進入待命狀態"</string>
- <string name="permdesc_wakeLock">"允許應用程式阻止手機進入待命。"</string>
+ <string name="permdesc_wakeLock">"允許應用程式防止手機進入待命。"</string>
<string name="permlab_devicePower">"開啟或關閉電源"</string>
<string name="permdesc_devicePower">"允許應用程式開啟或關閉電話。"</string>
<string name="permlab_factoryTest">"在出廠測試模式下執行"</string>
@@ -308,7 +303,7 @@
<string name="permdesc_setWallpaper">"允許應用程式設定系統桌布。"</string>
<string name="permlab_setWallpaperHints">"設定桌布大小提示"</string>
<string name="permdesc_setWallpaperHints">"允許應用程式設定系統桌布大小提示。"</string>
- <string name="permlab_masterClear">"將系統回復出廠預設值"</string>
+ <string name="permlab_masterClear">"將系統還原至出廠預設值"</string>
<string name="permdesc_masterClear">"允許應用程式將手機完全重設至出廠設定,清除所有資料、設定與已安裝程式。"</string>
<string name="permlab_setTimeZone">"設定時區"</string>
<string name="permdesc_setTimeZone">"允許應用程式變更時區。"</string>
@@ -349,29 +344,29 @@
<string name="permlab_writeDictionary">"寫入使用者定義的字典"</string>
<string name="permdesc_writeDictionary">"允許應用程式將新字詞寫入使用者的字典。"</string>
<string-array name="phoneTypes">
- <item>"首頁"</item>
- <item>"行動"</item>
- <item>"工作"</item>
- <item>"辦公傳真"</item>
- <item>"家用傳真"</item>
+ <item>"住家電話"</item>
+ <item>"行動電話"</item>
+ <item>"公司電話"</item>
+ <item>"公司傳真"</item>
+ <item>"住家傳真"</item>
<item>"呼叫器"</item>
<item>"其他"</item>
<item>"自訂"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item>"首頁"</item>
- <item>"工作"</item>
- <item>"其他"</item>
+ <item>"主要信箱"</item>
+ <item>"公司信箱"</item>
+ <item>"其他信箱"</item>
<item>"自訂"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item>"首頁"</item>
- <item>"工作"</item>
+ <item>"住家"</item>
+ <item>"公司"</item>
<item>"其他"</item>
<item>"自訂"</item>
</string-array>
<string-array name="imAddressTypes">
- <item>"首頁"</item>
+ <item>"自用 or 主要"</item>
<item>"工作"</item>
<item>"其他"</item>
<item>"自訂"</item>
@@ -402,7 +397,7 @@
<string name="lockscreen_pattern_instructions">"畫出解鎖圖形"</string>
<string name="lockscreen_emergency_call">"緊急電話"</string>
<string name="lockscreen_pattern_correct">"正確!"</string>
- <string name="lockscreen_pattern_wrong">"抱歉,請再試一次"</string>
+ <string name="lockscreen_pattern_wrong">"很抱歉,請再試一次"</string>
<string name="lockscreen_plugged_in">"正在充電 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
<string name="lockscreen_low_battery">"請連接充電器。"</string>
<string name="lockscreen_missing_sim_message_short">"沒有 SIM 卡。"</string>
@@ -410,8 +405,7 @@
<string name="lockscreen_missing_sim_instructions">"請插入 SIM 卡。"</string>
<string name="lockscreen_network_locked_message">"網路已鎖定"</string>
<string name="lockscreen_sim_puk_locked_message">"SIM 的 PUK 已鎖定。"</string>
- <!-- no translation found for lockscreen_sim_puk_locked_instructions (635967534992394321) -->
- <skip />
+ <string name="lockscreen_sim_puk_locked_instructions">"請參閱《使用者指南》或聯絡客戶服務中心。"</string>
<string name="lockscreen_sim_locked_message">"SIM 卡已鎖定。"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message">"解鎖 SIM 卡中..."</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message">"畫出解鎖圖形已錯誤 <xliff:g id="NUMBER_0">%d</xliff:g> 次。"\n\n" 請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再嘗試。"</string>
@@ -451,7 +445,7 @@
<string name="save_password_remember">"記住"</string>
<string name="save_password_never">"從不"</string>
<string name="open_permission_deny">"您沒有開啟此頁的權限。"</string>
- <string name="text_copied">"已複製到剪貼簿的文字。"</string>
+ <string name="text_copied">"文字已複製到剪貼簿。"</string>
<string name="more_item_label">"更多"</string>
<string name="prepend_shortcut_label">"[選單]+"</string>
<string name="menu_space_shortcut_label">"空白鍵"</string>
@@ -556,66 +550,66 @@
<string name="yearly">"每年"</string>
<string name="VideoView_error_title">"無法播放影片"</string>
<string name="VideoView_error_text_invalid_progressive_playback">"很抱歉,影片格式無效,裝置無法進行串流處理。"</string>
- <string name="VideoView_error_text_unknown">"抱歉,無法撥放此影片。"</string>
+ <string name="VideoView_error_text_unknown">"很抱歉,此影片無法播放。"</string>
<string name="VideoView_error_button">"確定"</string>
<string name="am">"上午"</string>
<string name="pm">"下午"</string>
<string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
- <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="DATE2">%5$s</xliff:g>"</string>
+ <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
+ <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
- <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
- <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
- <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
+ <string name="time_wday_date">"<xliff:g id="DATE">%3$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
+ <string name="wday_date">"<xliff:g id="DATE">%3$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+ <string name="time_date">"<xliff:g id="DATE">%3$s</xliff:g>,<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string>
- <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+ <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
<string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+ <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
<string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+ <string name="medium_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
<string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
<string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"中午"</string>
<string name="Noon">"中午"</string>
<string name="midnight">"午夜"</string>
<string name="Midnight">"午夜"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g><xliff:g id="DAY">%-d</xliff:g>"</string>
+ <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g><xliff:g id="YEAR">%Y</xliff:g>"</string>
+ <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
+ <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年<xliff:g id="MONTH">%B</xliff:g>"</string>
<string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
+ <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日,<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
- <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
- <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR">%9$s</xliff:g>"</string>
- <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR">%9$s</xliff:g>"</string>
- <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
+ <string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
+ <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
+ <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
- <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
- <string name="numeric_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
- <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+ <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
+ <string name="numeric_mdy1_mdy2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
+ <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
<string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>"</string>
- <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
- <string name="same_month_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
- <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
- <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g><xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g><xliff:g id="DAY">%-d</xliff:g>"</string>
+ <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 – <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
+ <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
+ <string name="same_month_mdy1_mdy2">"<xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 – <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
+ <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
+ <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+ <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
+ <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g>"</string>
+ <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
<string name="day_of_week_long_sunday">"星期日"</string>
@@ -717,14 +711,14 @@
<string name="clearDefaultHintMsg">"清除首頁設定 (應用程式) 管理應用程式的預設值。"</string>
<string name="chooseActivity">"選取一項操作"</string>
<string name="noApplications">"沒有應用程式可進行此操作。"</string>
- <string name="aerr_title">"抱歉!"</string>
- <string name="aerr_application">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 未正常終止。請再試一次。"</string>
- <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 未正常終止。請再試一次。"</string>
- <string name="anr_title">"抱歉!"</string>
- <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (應用程式:<xliff:g id="APPLICATION">%2$s</xliff:g>) 無回應。"</string>
- <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 無回應。"</string>
- <string name="anr_application_process">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 無回應。"</string>
- <string name="anr_process">"程序 <xliff:g id="PROCESS">%1$s</xliff:g> 沒有回應。"</string>
+ <string name="aerr_title">"很抱歉!"</string>
+ <string name="aerr_application">"<xliff:g id="APPLICATION">%1$s</xliff:g> 應用程式 (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 異常終止。請再試一次。"</string>
+ <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 異常終止。請再試一次。"</string>
+ <string name="anr_title">"很抱歉!"</string>
+ <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (應用程式:<xliff:g id="APPLICATION">%2$s</xliff:g>) 沒有回應。"</string>
+ <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 沒有回應。"</string>
+ <string name="anr_application_process">"<xliff:g id="APPLICATION">%1$s</xliff:g> 應用程式 (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 沒有回應。"</string>
+ <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 程序沒有回應。"</string>
<string name="force_close">"強制關閉"</string>
<string name="wait">"等待"</string>
<string name="debug">"除錯"</string>
@@ -789,7 +783,7 @@
<string name="ext_media_nofs_notification_message">"SD 卡為空白或使用不支援的檔案系統。"</string>
<string name="ext_media_unmountable_notification_title">"SD 卡已損壞"</string>
<string name="ext_media_unmountable_notification_message">"SD 卡已損壞。您可能需要將 SD 卡重新格式化。"</string>
- <string name="ext_media_badremoval_notification_title">"SD 卡未預期移除"</string>
+ <string name="ext_media_badremoval_notification_title">"SD 卡未正常移除"</string>
<string name="ext_media_badremoval_notification_message">"請先卸載 SD 卡,再將其移除,以免資料遺失。"</string>
<string name="ext_media_safe_unmount_notification_title">"可安全移除 SD 卡"</string>
<string name="ext_media_safe_unmount_notification_message">"現在可以安全移除 SD 卡。"</string>
@@ -806,8 +800,6 @@
<string name="ime_action_next">"下一步"</string>
<string name="ime_action_done">"完成"</string>
<string name="ime_action_default">"執行"</string>
- <!-- no translation found for dial_number_using (5789176425167573586) -->
- <skip />
- <!-- no translation found for create_contact_using (4947405226788104538) -->
- <skip />
+ <string name="dial_number_using">"使用 <xliff:g id="NUMBER">%s</xliff:g>"\n"撥號"</string>
+ <string name="create_contact_using">"建立手機號碼為 <xliff:g id="NUMBER">%s</xliff:g>"\n"的聯絡人"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 8dbe7a8..fbbd254 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -94,6 +94,11 @@
<!-- Text color, typeface, size, and style for "small" inverse text. Defaults to secondary inverse text color. -->
<attr name="textAppearanceSmallInverse" format="reference" />
+ <!-- Text color, typeface, size, and style for system search result title. Defaults to primary inverse text color. @hide -->
+ <attr name="textAppearanceSearchResultTitle" format="reference" />
+ <!-- Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. @hide -->
+ <attr name="textAppearanceSearchResultSubtitle" format="reference" />
+
<!-- Text color, typeface, size, and style for the text inside of a button. -->
<attr name="textAppearanceButton" format="reference" />
@@ -147,6 +152,8 @@
<!-- The preferred list item height -->
<attr name="listPreferredItemHeight" format="dimension" />
<!-- The drawable for the list divider -->
+ <!-- The list item height for search results. @hide -->
+ <attr name="searchResultListItemHeight" format="dimension" />
<attr name="listDivider" format="reference" />
<!-- TextView style for list separators. -->
<attr name="listSeparatorTextViewStyle" format="reference" />
@@ -2773,7 +2780,16 @@
string will be placed in the data field of the {@link android.content.Intent Intent}
when the user clicks a suggestion. <i>Optional attribute.</i> -->
<attr name="searchSuggestIntentData" format="string" />
-
+
+ <!-- If provided, this is the minimum number of characters needed to trigger
+ search suggestions. The default value is 0. <i>Optional attribute.</i> -->
+ <attr name="searchSuggestThreshold" format="integer" />
+
+ <!-- If provided and <code>true</code>, this searchable activity will be
+ included in any global lists of search targets.
+ The default value is <code>false</code>. <i>Optional attribute.</i>. -->
+ <attr name="includeInGlobalSearch" format="boolean" />
+
</declare-styleable>
<!-- In order to process special action keys during search, you must define them using
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 093ddd3..54da326 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -769,6 +769,15 @@
<attr name="name" />
</declare-styleable>
+ <!-- The <code>supports-density</code> specifies a screen density that this
+ package supports. Application can specify multiple densities it supports.
+ <p>This appears as a child tag of the
+ {@link #AndroidManifestApplication application} tag. -->
+ <declare-styleable name="AndroidManifestSupportsDensity" parent="AndroidManifestApplication">
+ <!-- Required value of the density in dip (device independent pixel). -->
+ <attr name="density" format="integer" />
+ </declare-styleable>
+
<!-- The <code>provider</code> tag declares a
{@link android.content.ContentProvider} class that is available
as part of the package's application components, supplying structured
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index e469d63..477ca3f 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1093,6 +1093,7 @@
<public type="attr" name="tension" id="0x0101026a" />
<public type="attr" name="extraTension" id="0x0101026b" />
+ <public type="attr" name="density" id="0x0101026c" />
<public type="anim" name="anticipate_interpolator" id="0x010a0007" />
<public type="anim" name="overshoot_interpolator" id="0x010a0008" />
@@ -1107,10 +1108,5 @@
=============================================================== -->
<eat-comment />
- <public type="attr" name="accountType" id="0x0101026c" />
+ <public type="attr" name="accountType" id="0x0101026d" />
</resources>
-
-
-
-
-
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 1bb8d3e..21e9d97 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -342,6 +342,11 @@
<string name="permgroupdesc_developmentTools">Features only needed for
application developers.</string>
+ <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgrouplab_storage">Storage</string>
+ <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgroupdesc_storage">Access the SD card.</string>
+
<!-- Permissions -->
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1052,6 +1057,11 @@
<string name="permdesc_writeDictionary">Allows an application to write new words into the
user dictionary.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_sdcardWrite">write to SD card</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_sdcardWrite">Allows an application to write to the SD card.</string>
+
<!-- The order of these is important, don't reorder without changing Contacts.java --> <skip />
<!-- Phone number types from android.provider.Contacts. This could be used when adding a new phone number for a contact, for example. -->
<string-array name="phoneTypes">
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index d7b654e..a436f61 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -138,6 +138,7 @@
</style>
<!-- Window animations that are applied to the search bar overlay window.
+ Previously used, but currently unused.
{@hide Pending API council approval} -->
<style name="Animation.SearchBar">
<item name="windowEnterAnimation">@anim/search_bar_enter</item>
@@ -574,6 +575,24 @@
<item name="android:textColor">@android:color/primary_text_light_disable_only</item>
</style>
+ <!-- @hide -->
+ <style name="TextAppearance.SearchResult">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">?textColorPrimaryInverse</item>
+ <item name="android:textColorHint">?textColorHintInverse</item>
+ </style>
+
+ <!-- @hide -->
+ <style name="TextAppearance.SearchResult.Title">
+ <item name="android:textSize">16sp</item>
+ </style>
+
+ <!-- @hide -->
+ <style name="TextAppearance.SearchResult.Subtitle">
+ <item name="android:textSize">13sp</item>
+ <item name="android:textColor">?textColorSecondaryInverse</item>
+ </style>
+
<style name="TextAppearance.WindowTitle">
<item name="android:textColor">#fff</item>
<item name="android:textSize">14sp</item>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 6b3d740..9567523 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -57,6 +57,12 @@
<item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item>
<item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item>
+
+ <!-- @hide -->
+ <item name="textAppearanceSearchResultTitle">@android:style/TextAppearance.SearchResult.Title</item>
+
+ <!-- @hide -->
+ <item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.SearchResult.Subtitle</item>
<item name="textAppearanceButton">@android:style/TextAppearance.Widget.Button</item>
@@ -75,6 +81,8 @@
<!-- List attributes -->
<item name="listPreferredItemHeight">64dip</item>
+ <!-- @hide -->
+ <item name="searchResultListItemHeight">58dip</item>
<item name="listDivider">@drawable/divider_horizontal_dark</item>
<item name="listSeparatorTextViewStyle">@android:style/Widget.TextView.ListSeparator</item>
@@ -236,7 +244,7 @@
<!-- Special variation on the default theme that ensures the background is
completely black. This is useful for things like image viewers and
media players. If you want the normal (dark background) theme
- do <em>not<em> use this, use {@link #Theme}. -->
+ do <em>not</em> use this, use {@link #Theme}. -->
<style name="Theme.Black">
<item name="android:windowBackground">@android:color/black</item>
<item name="android:colorBackground">@android:color/black</item>
@@ -355,7 +363,6 @@
<!-- Theme for the search input bar. -->
<style name="Theme.SearchBar" parent="Theme.Panel">
<item name="android:backgroundDimEnabled">true</item>
- <item name="android:windowAnimationStyle">@android:style/Animation.SearchBar</item>
<item name="windowContentOverlay">@null</item>
</style>
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index b13a292..f80bd6b 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -54,6 +54,10 @@
<group gid="log" />
</permission>
+ <permission name="android.permission.SDCARD_WRITE" >
+ <group gid="sdcard_rw" />
+ </permission>
+
<!-- The group that /cache belongs to, linked to the permission
set on the applications that can access /cache -->
<permission name="android.permission.ACCESS_CACHE_FILESYSTEM" >
diff --git a/data/fonts/DroidSans.ttf b/data/fonts/DroidSans.ttf
index 2537cc3..767c63a 100644
--- a/data/fonts/DroidSans.ttf
+++ b/data/fonts/DroidSans.ttf
Binary files differ
diff --git a/docs/html/blog/blog_toc.cs b/docs/html/blog/blog_toc.cs
deleted file mode 100644
index b2a73f5..0000000
--- a/docs/html/blog/blog_toc.cs
+++ /dev/null
@@ -1 +0,0 @@
-<ul> <li>Android Developer Blog <ul> <li><a href="">Blog</a></li> <li><a href="">Blog</a></li> </ul> </li> </ul> FIXME
diff --git a/docs/html/blog/index.jd b/docs/html/blog/index.jd
deleted file mode 100644
index 835c55d..0000000
--- a/docs/html/blog/index.jd
+++ /dev/null
@@ -1,4 +0,0 @@
-page.title=Android Developer Blog
-@jd:body
-
-FIXME
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index 4f332b1..75f3d78 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -188,8 +188,8 @@ id:2
when launching your application on an emulator.</p>
<p>To learn more about creating and managing AVDs, please read the
-<a href="{@docRoot}guide/developing/index.html#avd">Developing Overview</a>
-and <a href="{@docRoot}guide/tools/android.html">android Tool</a> documentation.</p>
+<a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>
+documentation.</p>
<h3 id="RunningYourApplication">Running your application</h3>
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index 5db4f8d..8cdf0b9 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -19,7 +19,7 @@ page.title=Developing In Other IDEs
<h2>See also</h2>
<ol>
- <li><a href="{@docRoot}guide/developing/tools/android.html">android Tool</a></li>
+ <li><a href="{@docRoot}guide/developing/tools/othertools.html#android">android Tool</a></li>
<li><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></li>
<li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a></li>
</ol>
@@ -43,7 +43,7 @@ package it for distribution. This document is your guide to using these tools.</
familiarity with the following Android SDK tools:</p>
<dl>
- <dt><a href="{@docRoot}guide/developing/tools/android.html">android</a></dt>
+ <dt><a href="{@docRoot}guide/developing/tools/othertools.html#android">android</a></dt>
<dd>To create/update Android projects and to create/move/delete AVDs.</dd>
<dt><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></dt>
<dd>To run your Android applications on an emulated Android platform.</dd>
@@ -377,7 +377,7 @@ multiple emulators.</p>
<p>For more information on the tools used above, please see the following documents:</p>
<ul>
- <li><a href="{@docRoot}guide/developing/tools/android.html">android Tool</a></li>
+ <li><a href="{@docRoot}guide/developing/tools/othertools.html#android">android Tool</a></li>
<li><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></li>
<li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (ADB)</li>
</ul>
diff --git a/docs/html/guide/developing/tools/avd.jd b/docs/html/guide/developing/tools/avd.jd
index 1e13ace..b8f205e 100644
--- a/docs/html/guide/developing/tools/avd.jd
+++ b/docs/html/guide/developing/tools/avd.jd
@@ -69,7 +69,7 @@ your application on. </p>
specify emulator command-line options at launch or by using the emulator
console to change behaviors or characteristics at run time. For a complete
reference of emulator options, please see the <a
-href="{@docRoot}/guide/developing/tools/emulator.html">Emulator</a>
+href="{@docRoot}guide/developing/tools/emulator.html">Emulator</a>
documentation. </p>
<p>To create and manage AVDs, you use the android tool provided in the Android
@@ -81,9 +81,13 @@ Other IDEs</a>, as appropriate for your environment.</p>
<h2 id="creating">Creating an AVD</h2>
-<div class="sidebox">The Android SDK does not include any preconfigured AVDs, so
+<div class="sidebox-wrapper">
+<div class="sidebox-inner">
+<p>The Android SDK does not include any preconfigured AVDs, so
you need to create an AVD before you can run any application in the emulator
-(even the Hello World application). </div>
+(even the Hello World application).</p>
+</div>
+</div>
<p>To create an AVD, you use the android tool, a command-line utility
available in the <code>&lt;sdk&gt;/tools/</code> directory. Managing AVDs is one
@@ -91,7 +95,7 @@ of the two main function of the android tool (the other is creating and updating
Android projects). Open a terminal window and change to the
<code>&lt;sdk&gt;/tools/</code> directory, if needed</p>
-<p>To create each AVD, you issue the command <code>android avd create</code>,
+<p>To create each AVD, you issue the command <code>android create avd</code>,
with options that specify a name for the new AVD and the system image you want
to run on the emulator when the AVD is invoked. You can specify other options on
the command line also, such as to create an emulated SD card for the new AVD, set
@@ -99,7 +103,7 @@ the emulator skin to use, or set a custom location for the AVD's files.</p>
<p>Here's the command-line usage for creating an AVD: </p>
-<pre>android -n &lt;name&gt; -t &lt;targetID&gt; [-&lt;option&gt; &lt;value&gt;] ... </pre>
+<pre>android create avd -n &lt;name&gt; -t &lt;targetID&gt; [-&lt;option&gt; &lt;value&gt;] ... </pre>
<p>You can use any name you want for the AVD, but since you are likely to be
creating multiple AVDs, you should choose a name that lets you recognize the
diff --git a/docs/html/guide/developing/tools/emulator.jd b/docs/html/guide/developing/tools/emulator.jd
index 11c0da5..82d3c8d 100644
--- a/docs/html/guide/developing/tools/emulator.jd
+++ b/docs/html/guide/developing/tools/emulator.jd
@@ -491,8 +491,8 @@ on disk images, use <code>-help-disk-images</code>.</p>
<td><code>-shell-serial&nbsp;&lt;device&gt;</code></td>
<td>Enable the root shell (as in <code>-shell</code> and specify the QEMU character
device to use for communication with the shell.</td>
- <td>&lt;device&gt; must be a QEMU device type. See the documentation for 'serial -dev' at
- <a href="http://www.bellard.org/qemu/qemu-doc.html#SEC10">http://www.bellard.org/qemu/qemu-doc.html#SEC10</a>
+ <td>&lt;device&gt; must be a QEMU device type. See the documentation for '-serial <em>dev</em>' at
+ <a href="http://www.nongnu.org/qemu/qemu-doc.html#SEC10">http://www.bellard.org/qemu/qemu-doc.html#SEC10</a>
for a list of device types.</p>
<p>Here are some examples: </p>
@@ -755,7 +755,7 @@ default versions stored in the SDK. </p>
AVDs is in <code>~/.android/avd</code> on OS X and Linux, <code>C:\Documents and
Settings\&lt;user&gt;\.android\</code> on Windows XP, and
<code>C:\Users\&lt;user&gt;\.android\</code>
-on Windows Vista<code>.</p>
+on Windows Vista.</p>
<p>To let you use alternate or custom versions of the image files, the emulator
provides startup options that override the default locations and filenames of
diff --git a/docs/html/guide/developing/tools/index.jd b/docs/html/guide/developing/tools/index.jd
index e53d595..2c9e45d 100644
--- a/docs/html/guide/developing/tools/index.jd
+++ b/docs/html/guide/developing/tools/index.jd
@@ -19,7 +19,7 @@ applications on the emulator. </p>
<dd>A QEMU-based device-emulation tool that you can use to design,
debug, and test your applications in an actual Android run-time environment. </dd>
- <dt><a href="emulator.html">Android Virtual Devices (AVDs)</a></dt>
+ <dt><a href="avd.html">Android Virtual Devices (AVDs)</a></dt>
<dd>Virtual device configurations that you create, to model device
characteristics in the Android Emulator. In each configuration, you can
specify the Android platform to run, the hardware options, and the
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 3c9b7c2..5367cb2 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -19,11 +19,13 @@
<ul>
<li><a href="<?cs var:toroot ?>guide/topics/ui/declaring-layout.html">Declaring Layout</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/ui/menus.html">Creating Menus</a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/ui/layout-objects.html">Common Layout Objects</a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/ui/binding.html">Binding to Data with AdapterView</a></li>
+ <li><a href="<?cs var:toroot ?>guide/topics/ui/dialogs.html">Creating Dialogs</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/ui/ui-events.html">Handling UI Events</a></li>
+ <li><a href="<?cs var:toroot ?>guide/topics/ui/notifiers/index.html">Notifying the User</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/ui/themes.html">Applying Styles and Themes</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/ui/custom-components.html">Building Custom Components</a></li>
+ <li><a href="<?cs var:toroot ?>guide/topics/ui/binding.html">Binding to Data with AdapterView</a></li>
+ <li><a href="<?cs var:toroot ?>guide/topics/ui/layout-objects.html">Common Layout Objects</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/ui/how-android-draws.html">How Android Draws Views</a></li>
</ul>
</li>
@@ -37,7 +39,6 @@
<li><a href="<?cs var:toroot ?>guide/topics/intents/intents-filters.html">Intents and Intent Filters</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/data/data-storage.html">Data Storage</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html">Content Providers</a></li>
-<!-- <li><a style="color:gray;">Notifications</a></li> -->
<li><a href="<?cs var:toroot ?>guide/topics/security/security.html">Security and Permissions</a></li>
<!-- <li><a style="color:gray;">Processes and Threads</a></li> -->
<!-- <li><a style="color:gray;">Interprocess Communication</a></li> -->
@@ -94,6 +95,7 @@
</ul>
</li> -->
<!-- <li><a style="color:gray;">Localization</a></li> -->
+ <li><a href="<?cs var:toroot ?>guide/topics/appwidgets/index.html">AppWidgets</a></li>
</ul>
</li>
@@ -141,6 +143,12 @@
<li><h2>Best Practices</h2>
<ul>
+ <li class="toggle-list">
+ <div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html">UI Guidelines</a></div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html">Widget Design</a></li>
+ </ul>
+ </li>
<li><a href="<?cs var:toroot ?>guide/practices/design/performance.html">Designing for Performance</a></li>
<li><a href="<?cs var:toroot ?>guide/practices/design/responsiveness.html">Designing for Responsiveness</a></li>
<li><a href="<?cs var:toroot ?>guide/practices/design/seamlessness.html">Designing for Seamlessness</a></li>
diff --git a/docs/html/guide/practices/ui_guidelines/index.jd b/docs/html/guide/practices/ui_guidelines/index.jd
new file mode 100644
index 0000000..e19d5b4
--- /dev/null
+++ b/docs/html/guide/practices/ui_guidelines/index.jd
@@ -0,0 +1,28 @@
+page.title=User Interface Guidelines
+@jd:body
+
+
+<img src="{@docRoot}assets/images/uiguidelines1.png" alt="" align="right">
+
+
+<p>The Android UI team has begun developing guidelines for the interaction and
+design of Android applications. Look here for articles that describe these
+visual guidelines as we release them.</p>
+
+
+ <dl>
+ <dt><a href="widget_design.html">Widget Design Guidelines</a> </dt>
+ <dd>Widgets are a new feature introduced in Cupcake. A widget displays
+an application's most important or timely information at a glance, on a user's
+Home screen. These design guidelines describe how to design widgets that fit
+with others on the Home screen. They include links to graphics files and
+templates that will make your designer's life easier.</dd>
+
+</dl>
+
+
+
+
+
+
+
diff --git a/docs/html/guide/practices/ui_guidelines/widget_design.jd b/docs/html/guide/practices/ui_guidelines/widget_design.jd
new file mode 100644
index 0000000..58727af
--- /dev/null
+++ b/docs/html/guide/practices/ui_guidelines/widget_design.jd
@@ -0,0 +1,185 @@
+page.title=Widget Design Guidelines
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Widget design quickview</h2>
+
+<ul>
+<li>Widgets have six standard sizes on the Home screen</li>
+<li>Widgets have standards for size, frames, shadows, and file format, which you can copy</li>
+<li>A few tricks make it easier to design widgets that fit graphically on the Home screeen</li>
+</ul>
+
+<h2>In this document</h2>
+
+<ol>
+<li><a href="#anatomy">Standard widget anatomy</a></li>
+<li><a href="#design">Designing a widget</a></li>
+<li><a href="#sizes">Standard widget sizes</a></li>
+<li><a href="#frames">Standard widget frames</a></li>
+<li><a href="#shadows">Standard widget shadows</a></li>
+<li><a href="#tricks">Widget graphics tips and tricks</a></li>
+<li><a href="#file">Windows graphics file format</a></li>
+</ol>
+
+<h2>See also</h2>
+
+<ol>
+<li>The <a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a> section of the <em>Developer's Guide</em></li>
+<li>Jeff Sharkey's <a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AddWidgets</a> blog post</li>
+</ol>
+
+</div>
+</div>
+
+
+<p>Widgets are a new feature introduced in Android&trade; mobile technology platform 1.5 ("Cupcake"). A widget displays an application's most important or timely information at a glance, on a user's Home screen. The Android open source code includes several examples of widgets, including widgets for Calendar, Music, and other applications.</p>
+
+<!-- could we include a link to that open source code? -->
+
+<p>Users pick the widgets they want to display on their Home screens by touching &amp; holding an empty area of the Home screen, selecting Widgets from the menu, and then selecting the widget they want.</p>
+
+<p><img src="{@docRoot}images/widget_design/widget_examples.png" alt="Example Widgets"></p>
+
+<p>This document describes how to design a widget so it fits graphically with other widgets and with the other elements of the Android Home screen. It also describes some standards for widget artwork and some widget graphics tips and tricks from the Android team.<p>
+
+<p>For information about developing widgets, see the <a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a> section of the <em>Developer's Guide</em> and the <a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AddWidgets</a> blog post.</p>
+
+
+<h2 id="anatomy">Standard widget anatomy</h2>
+
+<p>Typical Android widgets have three main components: A bounding box, a frame, and the widget's graphical controls and other elements. Well-designed widgets leave some padding between the edges of the bounding box and the frame, and between the inner edges of the frame and the widget's controls. Widgets designed to fit visually with other widgets on the Home screen take cues from the other elements on the Home screen for alignment; they also use standard shading effects. All of these details are described in this document.
+
+<p><strong>Standard Widget Sizes in Portrait Orientation</strong><br/>
+<img src="{@docRoot}images/widget_design/widget_sizes_portrait.png" alt="Standard Widget Sizes in Portrait Orientation"></p>
+
+<p>&nbsp;</p>
+
+<p><strong>Standard Widget Sizes in Landscape Orientation</strong><br/>
+<img src="{@docRoot}images/widget_design/widget_sizes_landscape.png" alt="Standard Widget Sizes in Landscape Orientation"></p>
+
+
+<h2 id="design">Designing a widget</h2>
+
+<ol>
+<li><strong>Select a bounding box size for your widget.</strong></li>
+
+<p>The most effective widgets display your application's most useful or timely data in the smallest widget size. Users will weigh the usefulness or your widget against the portion of the Home screen it covers, so the smaller the better.</p>
+
+<p>All widgets must fit within the bounding box of one of the six supported widget sizes, or better yet, within a pair of portrait and landscape orientation sizes, so your widget looks good when the user switches screen orientations.</p>
+
+<p><a href="#sizes">Standard widget sizes</a> illustrates the bounding dimensions of the six widget sizes (three in portrait and three in landscape orientation).</p>
+
+
+<li><strong>Select a matching frame.</strong></li>
+
+<p><a href="#frames">Standard widget frames</a> illustrates the standard frames for the six widget sizes, with links so you can download copies for your own use. You don't have to use these frames for your widget, but if you do, your widgets are more likely to fit visually with other widgets.</p>
+
+<li><strong>Apply standard shadow effect to your graphics.</strong></li>
+
+<p>Again, you don't have to use this effect, but <a href="#shadows">Standard widget shadows</a> shows the Photoshop settings used for standard widgets.</p>
+
+<li><strong>If your widget includes buttons, draw them in three states (default, pressed, and selected).</strong></li>
+
+<p>You can <a href="{@docRoot}images/widget_design/Music_widget_button_states.psd">download a Photoshop file that contains the three states of the Play button</a>, taken from the Music widget, to analyze the Photoshop settings used for the three standard button effects.</p>
+
+<p><a href="{@docRoot}images/widget_design/Music_widget_button_states.psd"> <img src="{@docRoot}images/widget_design/buttons.png" alt="Click to download Photoshop template"></a></p>
+
+<li><strong>Finish drawing your artwork and then scale and align it to fit.</strong></li>
+
+<p><a href="#tricks">Widget alignment tips and tricks</a> describes some techniques for aligning your widget's graphics inside the standard frames, along with a few other widget graphics tricks.</p>
+
+<li><strong>Save your widget with the correct graphics file settings.</strong></li>
+
+<p><a href="#file">Windows graphics file format</a> describes the correct settings for your widget graphics files.</p>
+
+</ol>
+
+
+<h2 id="sizes">Standard widget sizes</h2>
+
+<p>There are six standard widget sizes, based on a Home screen grid of 4 x 4 (portrait) or 4 x 4 (landscape) cells. These dimensions are the bounding boxes for the six standard widget sizes. The contents of typical widgets don't draw to the edge of these dimensions, but fit inside a frame withing the bounding box, as described in <a href="#design">Designing a widget</a>.</p>
+
+<p>In portrait orientation, each cell is 80 pixels wide by 100 pixels tall (the diagram shows a cell in portrait orientation). The three supported widget sizes in portrait orientation are:<p>
+
+<table>
+<tr><th>Cells</th><th>Pixels</th></tr>
+<tr><td>4 x 1</td><td>320 x 100</td></tr>
+<tr><td>3 x 3</td><td>240 x 300</td></tr>
+<tr><td>2 x 2</td><td>160 x 200</td></tr>
+</table>
+
+<p><img src="{@docRoot}images/widget_design/portrait_sizes.png" alt="Widget dimensions in portrait orientation"></p>
+
+<p>In landscape orientation, each cell is 106 pixels wide by 74 pixels tall. The three supported widget sizes in landscape orientation are:</p>
+
+<table>
+<tr><th>Cells</th><th>Pixels</th></tr>
+<tr><td>4 x 1</td><td>424 x 74</td></tr>
+<tr><td>3 x 3</td><td>318 x 222</td></tr>
+<tr><td>2 x 2</td><td>212 x 148</td></tr>
+</table>
+
+<p><img src="{@docRoot}images/widget_design/landscape_sizes.png" alt="Widget dimensions in landscape orientation"></p>
+
+
+<h2 id="frames">Standard widget frames</h2>
+
+<p>For each of the six standard widget sizes there is a standard frame. You can click the images of the frames in this section to download a Photoshop file for that frame, which you can use for your own widgets.<p>
+
+<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.psd"> <img src="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.png" alt="Click to download"></a><br>4x1_Widget_Frame_Portrait.psd</p>
+
+<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.psd"> <img src="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.png" alt="Click to download"></a><br>3x3_Widget_Frame_Portrait.psd</p>
+
+<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.psd"> <img src="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.png" alt="Click to download"></a><br>2x2_Widget_Frame_Portrait.psd</p>
+
+<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.psd"> <img src="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.png" alt="Click to download"></a><br>4x1_Widget_Frame_Landscape.psd</p>
+
+<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.psd"> <img src="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.png" alt="Click to download"></a><br>3x3_Widget_Frame_Landscape.psd</p>
+
+<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.psd"> <img src="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.png" alt="Click to download"></a><br>2x2_Widget_Frame_Landscape.psd</p>
+
+
+<h2 id="shadows">Standard widget shadows</h2>
+
+<p>You can apply a shadow effect to your widget's artwork, so it matches other standard Android widgets, using the following settings in the Photoshop Layer Style dialog box.</p>
+
+<p><img src="{@docRoot}images/widget_design/Layer_Style.png" alt="Layer Style settings for standard shadows"></p>
+
+
+<h2 id="tricks">Widget graphics tips and tricks</h2>
+
+<p>The Android team has developed a few tricks for aligning widget artwork within standard widget bounding boxes and frames, so the widget aligns visually with other widgets and the other elements of the Home screen, as well as other techniques for creating widgets.
+
+<ul>
+
+<li>Use a screen shot from the Android SDK emulator to align both the shapes and shadows of your widget controls with the Search widget and with other elements on the Home screen.</li>
+
+<p>Cut the widget artwork asset" based on the full size of a cell, including any padding you want. (That is, for a 4 x 1 widget, cut the asset at 320 by 100 pixels.)</p>
+
+<p><img src="{@docRoot}images/widget_design/alignment.png" alt="Aligning widget graphics" ></p>
+
+<li>To reduce banding when exporting a widget, apply the following Photoshop Add Noise setting to your graphic.</li>
+
+<p><img src="{@docRoot}images/widget_design/Add_Noise.png" alt="Add Noise settings for widget graphics" ></p>
+
+<li>Apply 9-patch techniques to shrink the graphic and set the padding of the content area. (<a href="{@docRoot}guide/developing/tools/draw9patch.html">See the detailed guide here.</a>)</li>
+
+<p><strong>Note:</strong> The current Android widget templates were designed using a custom gradient angle, which means the 9-patch techniques can't be used to optimize the size of the asset. However, 9-patch techniques were used to set the content area padding.</p>
+
+<li>In some cases, devices have low pixel depths that can cause visual banding and dithering issues. To solve this, application developers should pass assets through a "proxy" drawable defined as <code>XML:<nine-patch android:src="@drawable/background" android:dither="true" /></code>. This technique references the original artwork, in this case <code>"background.9.png"</code>, and instructs the device to dither it as needed.</li>
+
+</ul>
+
+<h2 id="file">Widget graphics file format</h2>
+
+<p>Save your widget artwork using the appropriate bounding box size in PNG-24 format on a transparent background and in 8-bit color.</p>
+
+<p><img src="{@docRoot}images/widget_design/file_format.png" alt="Widget graphics file format" ></p>
+
+
+
+
+
diff --git a/docs/html/guide/publishing/preparing.jd b/docs/html/guide/publishing/preparing.jd
index d355265..b4eaea3 100644
--- a/docs/html/guide/publishing/preparing.jd
+++ b/docs/html/guide/publishing/preparing.jd
@@ -178,8 +178,8 @@ MapView elements</h3>
<div class="sidebox" style="margin-bottom:.5em;padding:1em;"><p>
For complete information about getting a Maps API Key, see <a
-href="{@docRoot}guide/topics/location/geo/mapkey.html">Obtaining a Maps API
-Key</a>.<br></p></div>
+href="http://code.google.com/android/add-ons/google-apis/mapkey.html">
+Obtaining a Maps API Key</a>.</p></div>
<p>If your application uses one or more Mapview elements, you will need to
register your application with the Google
@@ -221,7 +221,7 @@ to download Maps data. </li>
</ol>
<p>For more information about signing and your private key, see <a
-href="#signing">Signing Your Applications</a>.</p>
+href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
<h2 id="compile">Compile your application</h2>
@@ -234,7 +234,8 @@ you can compile your application for release. </p>
<h3 id="signapp">8. Sign your application</h3>
<p>Sign your application using your private key. Signing your application
-correctly is critically important. Please see <a href="#signing">Signing Your
+correctly is critically important. Please see
+<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your
Applications</a> for complete information. </p>
<h3 id="testapp">9. Test your compiled and signed application</h3>
diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd
new file mode 100644
index 0000000..f9db356
--- /dev/null
+++ b/docs/html/guide/topics/appwidgets/index.jd
@@ -0,0 +1,154 @@
+page.title=AppWidgets
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.appwidget.AppWidgetProvider}</li>
+ <li>{@link android.appwidget.AppWidgetHost}</li>
+ </ol>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Providers">AppWidget Providers</a>
+ <ol>
+ <li><a href="#provider_manifest">Declaring a widget in the AndroidManifest</a></li>
+ <li><a href="#provider_meta_data">Adding the AppWidgetProviderInfo meta-data</a></li>
+ <li><a href="#provider_AppWidgetProvider">Using the AppWidgetProvider class</a></li>
+ <li><a href="#provider_configuration">AppWidget Configuration UI</a></li>
+ <li><a href="#provider_broadcasts">AppWidget Broadcast Intents</a></li>
+ </ol>
+ </li>
+ <li><a href="#Hosts">AppWidget Hosts</a></li>
+ </ol>
+
+ <h2>See also</h2>
+ <ol>
+ <li><a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">Introducing
+ home screen widgets and the AppWidget framework &raquo;</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>AppWidgets are miniature application views that can be embedded in other applications
+(e.g., the Home). These views are called "widgets" and you can publish one with
+an "AppWidget provider." An application component that is able to hold other widgets is
+called an "AppWidget host."</p>
+
+
+
+
+<h2 id="Providers">AppWidget Providers</h2>
+<p>Any application can publish widgets. All an application needs to do to publish a widget is
+to have a {@link android.content.BroadcastReceiver} that receives the {@link
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} intent,
+and provide some meta-data about the widget. Android provides the
+{@link android.appwidget.AppWidgetProvider} class, which extends BroadcastReceiver, as a convenience
+class to aid in handling the broadcasts.
+
+
+<h3 id="provider_manifest">Declaring a widget in the AndroidManifest</h3>
+
+<p>First, declare the {@link android.content.BroadcastReceiver} in your application's
+<code>AndroidManifest.xml</code> file.
+
+{@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/AndroidManifest.xml AppWidgetProvider}
+
+<p>
+The <code>&lt;receiver&gt;</code> element has the following attributes:
+<ul>
+ <li><code>android:name</code> - specifies the
+ {@link android.content.BroadcastReceiver} or {@link android.appwidget.AppWidgetProvider}
+ class.</li>
+ <li><code>android:label</code> - specifies the string resource that
+ will be shown by the widget picker as the label.</li>
+ <li><code>android:icon</code> - specifies the drawable resource that
+ will be shown by the widget picker as the icon.</li>
+</ul>
+
+<p>
+The <code>&lt;intent-filter&gt;</code> element tells the {@link android.content.pm.PackageManager}
+that this {@link android.content.BroadcastReceiver} receives the {@link
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} broadcast.
+The widget manager will send other broadcasts directly to your widget provider as required.
+It is only necessary to explicitly declare that you accept the {@link
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} broadcast.
+
+<p>
+The <code>&lt;meta-data&gt;</code> element tells the widget manager which xml resource to
+read to find the {@link android.appwidget.AppWidgetProviderInfo} for your widget provider. It has the following
+attributes:
+<ul>
+ <li><code>android:name="android.appwidget.provider"</code> - identifies this meta-data
+ as the {@link android.appwidget.AppWidgetProviderInfo} descriptor.</li>
+ <li><code>android:resource</code> - is the xml resource to use as that descriptor.</li>
+</ul>
+
+
+<h3 id="provider_meta_data">Adding the AppWidgetProviderInfo meta-data</h3>
+
+<p>For a widget, the values in the {@link android.appwidget.AppWidgetProviderInfo} structure are supplied
+in an XML resource. In the example above, the xml resource is referenced with
+<code>android:resource="@xml/appwidget_info"</code>. That XML file would go in your application's
+directory at <code>res/xml/appwidget_info.xml</code>. Here is a simple example.
+
+{@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/res/xml/appwidget_info.xml AppWidgetProviderInfo}
+
+<p>The attributes are as documented in the
+{@link android.appwidget.AppWidgetProviderInfo} class.
+
+
+<h3 id="provider_AppWidgetProvider">Using the AppWidgetProvider class</h3>
+
+<p>The AppWidgetProvider class is the easiest way to handle the widget provider intent broadcasts.
+See the <code>src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java</code>
+sample class in ApiDemos for an example.
+
+<p class="note">Keep in mind that since the the AppWidgetProvider is a BroadcastReceiver,
+your process is not guaranteed to keep running after the callback methods return. See
+<a href="../../../guide/topics/fundamentals.html#broadlife">Application Fundamentals &gt;
+Broadcast Receiver Lifecycle</a> for more information.
+
+
+
+<h3 id="provider_configuration">AppWidget Configuration UI</h3>
+
+<p>
+Widget hosts have the ability to start a configuration activity when a widget is instantiated.
+The activity should be declared as normal in AndroidManifest.xml, and it should be listed in
+the AppWidgetProviderInfo XML file in the <code>android:configure</code> attribute.
+
+<p>The activity you specified will be launched with the {@link
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_CONFIGURE} action. See the documentation for that
+action for more info.
+
+<p>See the <code>src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java</code>
+sample class in ApiDemos for an example.
+
+
+
+<h3 id="provider_broadcasts">AppWidget Broadcast Intents</h3>
+
+<p>{@link android.appwidget.AppWidgetProvider} is just a convenience class. If you would like
+to receive the widget broadcasts directly, you can. The four intents you need to care about are:
+<ul>
+ <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE}</li>
+ <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_DELETED}</li>
+ <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_ENABLED}</li>
+ <li>{@link android.appwidget.AppWidgetManager#ACTION_APPWIDGET_DISABLED}</li>
+</ul>
+
+<p>By way of example, the implementation of
+{@link android.appwidget.AppWidgetProvider#onReceive} is quite simple:</p>
+
+{@sample frameworks/base/core/java/android/appwidget/AppWidgetProvider.java onReceive}
+
+
+<h2 id="Hosts">AppWidget Hosts</h2>
+
+<p>Widget hosts are the containers in which widgets can be placed. Most of the look and feel
+details are left up to the widget hosts. For example, the home screen has one way of viewing
+widgets, but the lock screen could also contain widgets, and it would have a different way of
+adding, removing and otherwise managing widgets.</p>
+<p>For more information on implementing your own widget host, see the
+{@link android.appwidget.AppWidgetHost AppWidgetHost} class.</p>
diff --git a/docs/html/guide/topics/geo/lbs.jd b/docs/html/guide/topics/geo/lbs.jd
deleted file mode 100644
index 981f6fe..0000000
--- a/docs/html/guide/topics/geo/lbs.jd
+++ /dev/null
@@ -1,73 +0,0 @@
-page.title=Location-based Service APIs
-@jd:body
-
-<p>The Android SDK includes two packages that provide Android's primary support
-for building location-based services:
-{@link android.location} and com.google.android.maps.
-Please read on below for a brief introduction to each package.</p>
-
-<h2>android.location</h2>
-
-<p>This package contains several classes related to
-location services in the Android platform. Most importantly, it introduces the
-{@link android.location.LocationManager}
-service, which provides an API to determine location and bearing if the
-underlying device (if it supports the service). The LocationManager
-should <strong>not</strong> be
-instantiated directly; rather, a handle to it should be retrieved via
-{@link android.content.Context#getSystemService(String)
-getSystemService(Context.LOCATION_SERVICE)}.</p>
-
-<p>Once your application has a handle to the LocationManager, your application
-will be able to do three things:</p>
-
-<ul>
- <li>Query for the list of all LocationProviders known to the
- LocationManager for its last known location.</li>
- <li>Register/unregister for periodic updates of current location from a
- LocationProvider (specified either by Criteria or name).</li>
- <li>Register/unregister for a given Intent to be fired if the device comes
- within a given proximity (specified by radius in meters) of a given
- lat/long.</li>
-</ul>
-
-<p>However, during initial development, you may not have access to real
-data from a real location provider (Network or GPS). So it may be necessary to
-spoof some data for your application, with some mock location data.</p>
-
-<p class="note"><strong>Note:</strong> If you've used mock LocationProviders in
-previous versions of the SDK (m3/m5), you can no longer provide canned LocationProviders
-in the /system/etc/location directory. These directories will be wiped during boot-up.
-Please follow the new procedures below.</p>
-
-
-<h3>Providing Mock Location Data</h3>
-
-<p>When testing your application on the Android emulator, there are a couple different
-ways to send it some spoof location data: with the DDMS tool or the "geo" command.</p>
-
-<h4 id="ddms">Using DDMS</h4>
-<p>With the DDMS tool, you can simulate location data a few different ways:</p>
-<ul>
- <li>Manually send individual longitude/latitude coordinates to the device.</li>
- <li>Use a GPX file describing a route for playback to the device.</li>
- <li>Use a KML file describing individual placemarks for sequenced playback to the device.</li>
-</ul>
-<p>For more information on using DDMS to spoof location data, see the
-<a href="{@docRoot}reference/ddms.html#emulator-control">Using DDMS guide</a>.
-
-<h4 id="geo">Using the "geo" command</h4>
-<p>Launch your application in the Android emulator and open a terminal/console in
-your SDK's <code>/tools</code> directory. Now you can use:</p>
-<ul><li><code>geo fix</code> to send a fixed geo-location.
- <p>This command accepts a longitude and latitude in decimal degrees, and
- an optional altitude in meters. For example:</p>
- <pre>geo fix -121.45356 46.51119 4392</pre>
- </li>
- <li><code>geo nmea</code> to send an NMEA 0183 sentence.
- <p>This command accepts a single NMEA sentence of type '$GPGGA' (fix data) or '$GPRMC' (transit data).
- For example:</p>
- <pre>geo nmea $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62</pre>
- </li>
-</ul>
-
diff --git a/docs/html/guide/topics/geo/mapkey.jd b/docs/html/guide/topics/geo/mapkey.jd
deleted file mode 100644
index 6442940..0000000
--- a/docs/html/guide/topics/geo/mapkey.jd
+++ /dev/null
@@ -1,28 +0,0 @@
-page.title=Obtaining a MapView API Key
-@jd:body
-
-<p>MapView is a very useful class that lets you easily integrate Google Maps into your application. It provides built-in map downloading, rendering, and caching, as well as a variety of display options and controls. It provides a wrapper around the Google Maps API that lets your application request and manipulate Google Maps data through class methods, and it lets you work with Maps data as you would other types of Views. </p>
-
-<p>Because MapView gives you access to Google Maps data, you need to register your application with the Google Maps service and agree to the applicable Terms of Service, before your MapView will be able to obtain data from Google Maps. This will apply whether you are developing your application on the emulator or preparing your application for deployment to mobile devices. </p>
-
-<p>Registering your application is simple, and has two parts: </p>
-
-<ol>
-<li>Registering a public key fingerprint from the certificate that you will use to sign the .apk. The registration service then provides you a Maps API Key that is associated with your application's signer certificate. </li>
-<li>Adding the Maps API Key to a special attribute of the MapView element &mdash; <code>android:apiKey</code>. You can use the same Maps API Key for any MapView in any application, provided that the application's .apk is signed with the certificate whose fingerprint you registered with the service. </li>
-</ol>
-
-<p>Once you have registered your application as described above, your MapView will be able to retrieve data from the Google Maps servers. </p>
-
-<div class="special">
-<p>The MapView registration service is not yet active and Google Maps is not yet enforcing the Maps API Key requirement. The registration service will be activated soon, so that MapViews in any application deployed to a mobile device will require registration and a valid Maps API Key.</p>
-
-<p>As soon as the registration service becomes available, this page (<a href="http://code.google.com/android/toolbox/apis/mapkey.html">http://code.google.com/android/toolbox/apis/mapkey.html</a>) will be updated with details about how and where to register and how to add your Maps API Key to your application. </p>
-
-<p>In the meantime, you can continue developing your MapView without registration, provided that you:</p>
-<ol type="a">
-<li>Add the attribute "android:apiKey" to the MapView element in your layout XML, with any value. Or</li>
-<li>Include an arbitrary string in the <code>apikey</code> parameter of the MapView constructor, if creating the MapView programmatically. </li>
-</ol>
-
-<p>When the Maps API Key checking is activated in the service, any MapViews that do not have a properly registered apiKey will stop working. The map data (tile images) of the MapView will never load (even if the device is on the network). In this case, go to the page linked above and read about how to register your certificate fingerprint and obtain a Maps API Key. </p>
diff --git a/docs/html/guide/topics/graphics/opengl.jd b/docs/html/guide/topics/graphics/opengl.jd
index eb2932d..901980d 100644
--- a/docs/html/guide/topics/graphics/opengl.jd
+++ b/docs/html/guide/topics/graphics/opengl.jd
@@ -26,10 +26,7 @@ ES API. However, it may not be identical, so watch out for deviations.</p>
<li>In your View's onDraw() method, get a handle to a GL object, and use its methods to perform GL operations.</li>
</ol>
-<p>For an example of this usage model (based on the classic GL ColorCube),
-see
-<a href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceView.html">com.android.samples.graphics.GLSurfaceView.java</a>
-in the ApiDemos sample code project. A slightly more sophisticated version showing how to use
+<p>For an example of this usage model (based on the classic GL ColorCube), showing how to use
it with threads can be found in
<a href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html">com.android.samples.graphics.GLSurfaceViewActivity.java</a>.
</p>
diff --git a/docs/html/guide/topics/media/index.jd b/docs/html/guide/topics/media/index.jd
index fd7d2da..96c500c 100644
--- a/docs/html/guide/topics/media/index.jd
+++ b/docs/html/guide/topics/media/index.jd
@@ -14,19 +14,28 @@ page.title=Audio and Video
<h2>Key classes</h2>
<ol>
-<li><a href="{@docRoot}reference/android/media/MediaPlayer.html">MediaPlayer</a> (all audio and video formats)</li>
-<li><a href="{@docRoot}reference/android/media/MediaRecorder.html">MediaRecorder</a> (record, all audio formats)</li>
+<li>{@link android.media.MediaPlayer MediaPlayer} (all available formats)</li>
+<li>{@link android.media.MediaRecorder MediaRecorder} (all available formats)</li>
+<li>{@link android.media.JetPlayer JetPlayer} (playback, JET content)</li>
+<li>{@link android.media.SoundPool SoundPool} (sound management)</li>
</ol>
<h2>In this document</h2>
<ol>
-<li><a href="#playback.html">Audio and Video Playback</a></li>
+<li><a href="#playback.html">Audio and Video Playback</a>
+ <ol>
+ <li><a href="#playraw">Playing from a Raw Resource</li>
+ <li><a href="#playfile">Playing from a File or Stream</li>
+ <li><a href="#jet">Playing JET Content</li>
+ </ol>
+</li>
<li><a href="#capture">Audio Capture</a></li>
</ol>
<h2>See also</h2>
<ol>
<li><a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a></li>
+<li><a href="{@docRoot}guide/topics/media/jet/jetcreator_manual.html">JetCreator User Manual</a></li>
</ol>
</div>
@@ -115,6 +124,28 @@ above.</p>
If you're passing a URL to an online media file, the file must be capable of
progressive download.</p>
+<h3 id="jet">Playing JET content</h3>
+<p>The Android platform includes a JET engine that lets you add interactive playback of JET audio content in your applications. You can create JET content for interactive playback using the JetCreator authoring application that ships with the SDK. To play and manage JET content from your application, use the {@link android.media.JetPlayer JetPlayer} class.</p>
+
+<p>For a description of JET concepts and instructions on how to use the JetCreator authoring tool, see the <a href="{@docRoot}guide/topics/media/jet/jetcreator_manual.html">JetCreator User Manual</a>. The tool is available fully-featured on the OS X and Windows platforms and the Linux version supports all the content creation features, but not the auditioning of the imported assets. </p>
+
+<p>Here's an example of how to set up JET playback from a .jet file stored on the SD card:</p>
+
+<pre>
+JetPlayer myJet = JetPlayer.getJetPlayer();
+myJet.loadJetFile("/sdcard/level1.jet");
+byte segmentId = 0;
+
+// queue segment 5, repeat once, use General MIDI, transpose by -1 octave
+myJet.queueJetSegment(5, -1, 1, -1, 0, segmentId++);
+// queue segment 2
+myJet.queueJetSegment(2, -1, 0, 0, 0, segmentId++);
+
+myJet.play();
+</pre>
+
+<p>The SDK includes an example application &mdash; JetBoy &mdash; that shows how to use {@link android.media.JetPlayer JetPlayer} to create an interactive music soundtrack in your game. It also illustrates how to use JET events to synchronize music and game logic. The application is located at <code>&lt;sdk&gt;/platforms/android-1.5/samples/JetBoy</code>.
+
<h2 id="capture">Audio Capture</h2>
<p>Audio capture from the device is a bit more complicated than audio/video playback, but still fairly simple:</p>
<ol>
diff --git a/docs/html/guide/topics/media/jet/jetcreator_manual.jd b/docs/html/guide/topics/media/jet/jetcreator_manual.jd
new file mode 100644
index 0000000..9692d97
--- /dev/null
+++ b/docs/html/guide/topics/media/jet/jetcreator_manual.jd
@@ -0,0 +1,1152 @@
+page.title=SONiVOX JETCreator User Manual
+@jd:body
+
+
+
+<p>Content Authoring Application for the JET Interactive Music Engine</p>
+
+
+<h1>1 Introduction</h1>
+
+<h2>1.1 Overview</h2>
+
+<p>This document contains the user guidelines
+for the SONiVOX JET Creator, an authoring application for creating and
+auditioning JET files. JET is an interactive music player for small embedded
+devices, including the those running the Android platform. It allows applications to
+include interactive music soundtracks, in MIDI
+format, that respond in real-time to game play events and user interaction.</p>
+
+
+<p>JET works in conjunction with SONiVOX's
+Embedded Audio Synthesizer (EAS) which is the MIDI
+playback device for Android. Both the
+JET and EAS engines are integrated into the Android embedded platform through the
+{@link android.media.JetPlayer} class, as well
+as inherent in the JET Creator application. As such, the JET content author can
+be sure that the playback will sound exactly the same in both the JET Creator
+and the final Android application playing back on Android mobile devices.</p>
+
+
+<p>In addition to the graphical user
+interface, there are two main functionalities taking place in JET Creator. The
+first involves gathering all the source data (MIDI
+files and DLS file), adding JET's real-time attributes and building a JET
+(.jet) file that the Android application will use. The second functionality
+involves auditioning the interactive playback elements as they will take place
+in the Android application.</p>
+
+
+<p>The JET Creator application is written in
+the Python programming language, therefore you need to have the current version
+of Python and WXWidgets installed. There is both a Mac and Windows version.</p>
+
+
+<h2>1.2 Abbreviations and Common Terms</h2>
+
+<p>It is important to use a common set of
+terms to minimize confusion. Since JET uses MIDI
+in a unique way, normal industry terms may not always suffice. Here is the
+definition of terms as they are used in this document and in the JET Creator
+application:</p>
+
+
+<p><i>Channel</i>: MIDI data associated with a specific MIDI
+channel. Standard MIDI allows for 16 channels of MIDI
+data each of which are typically associated with a specific instrument. </p>
+
+
+
+<p><i>Controller</i>: A MIDI event consisting of a
+channel number, controller number, and a controller value. The MIDI
+ spec associates many controller numbers with
+specific functions, such as volume, expression, sustain pedal, etc. JET also
+uses controller events as a means of embedding special control information in a
+MIDI sequence to provide for audio synchronization.</p>
+
+
+
+<p><i>DAW</i>: Digital Audio Workstation. A common term for MIDI
+and audio sequencing applications such as Logic, SONAR, Cubase and others. </p>
+
+
+
+<p><i>EAS:</i> Embedded MIDI Synthesizer. The
+name of the SONiVOX MIDI synthesizer engine.</p>
+
+
+
+<p><i>JET</i>: Jet Interactive Engine. The name of the SONiVOX JET interactive
+music engine.</p>
+
+
+
+<p><i>M/B/T</i>: Measures, Beats and Ticks</p>
+
+
+
+<p><i>Segment</i>: A musical section such as a chorus or verse that is a component of
+the overall composition. In JET, a segment can be an entire MIDI file or a
+derived from a portion of a MIDI file.</p>
+
+
+
+<p><i>SMF-0</i>: Standard MIDI File Type 0, a MIDI file that contains a single
+track, but may be made up of multiple channels of MIDI
+data.</p>
+
+
+
+<p><i>SMF-1</i>: Standard MIDI File Type 1, a MIDI file that contains a one more
+tracks, and each track may in turn be made up of one or more channels of MIDI
+ data. By convention, each channel is stored on a
+separate track in an SMF-1 file. However, it is possible to have multiple MIDI
+channels on a single track, or multiple tracks that contain data for the same MIDI
+channel.</p>
+
+
+
+<p><i>Track</i>: A single track in a DAW containing a timed sequence of events. Be careful not to confuse Tracks with
+Channels. A MIDI file may contain many tracks with several tracks utilizing the
+same MIDI channel. </p>
+
+
+
+
+
+<h1>2 The JET Interactive Music Concept</h1>
+
+<p>Interactive music can be defined as music
+that changes in real-time according to non-predictable events such as user
+interaction or game play events. In this way, interactive music is much more
+engaging as it has the ability to match the energy and mood of a game much
+closer than a pre-composed composition that never changes. In some applications
+and games, interactive music is central to the game play. Guitar Hero is one
+such popular game. When the end user successfully captures the musical notes
+coming down the fret board, the music adapts itself and simultaneously keeps
+score of successes and failures. JET allows for these types of music driven
+games as well.</p>
+
+
+
+<p>There are several methods for making and
+controlling interactive music and JET is one such method. This section
+describes the features of JET and how they might be used in a game or software
+application. It also describes how JET can be used to save memory in small
+footprint devices such as Android enabled mobile handsets.</p>
+
+<h3>2.1.1 Data Compression</h3>
+
+<p>JET supports a flexible music format that
+can be used to create extended musical sequences with a minimal amount of data.
+A musical composition is broken up into segments that can be sequenced to
+create a longer piece. The sequencing can be fixed at the time the music file
+is authored, or it can be created dynamically under program control.</p>
+
+<h3>2.1.2 Linear Music Example</h3>
+
+<p>
+<img border=0 width=575 height=393 src="{@docRoot}images/jet/linear_music.png">
+<br>Figure 1: Linear Music Piece</p>
+
+<p>This diagram shows how musical segments are
+stored. Each segment is authored as a separate MIDI
+file. A post-processing tool combines the files into a single container file.
+Each segment can contain alternate music tracks that can be muted or un-muted
+to create additional interest. An example might be a brass accent in the chorus
+that is played only the last time through. Also, segments can be transposed up
+or down.</p>
+
+
+<p>The bottom part of the diagram shows how
+the musical segments can be recombined to create a linear music piece. In this
+example, the bridge might end with a half-step key modulation and the remaining
+segments could be transposed up a half-step to match.</p>
+
+<h3>2.1.3 Non-linear Music Example</h3>
+
+<p>
+<img border=0 width=576 height=389
+src="{@docRoot}images/jet/nonlinear_music.png">
+<br>Figure 2: Non-linear music piece</p>
+
+
+<p>In this diagram, we see a non-linear music
+piece. The scenario is a first-person-shooter (FPS) and JET is providing the
+background music. The intro plays as the level is loading and then transitions
+under program control to the Searching segment. This segment is repeated indefinitely,
+perhaps with small variations (using the mute/un-mute feature) until activity
+in the game dictates a change.</p>
+
+
+
+<p>As the player nears a monster lair, the
+program starts a synchronized transition to the Danger segment, increasing the
+tension level in the audio. As the player draws closer to the lair, additional
+tracks are un-muted to increase the tension.</p>
+
+
+
+<p>As the player enters into combat with the
+monster, the program starts a synchronized transition to the Combat segment.
+The segment repeats indefinitely as the combat continues. A Bonus Hit
+temporarily un-mutes a decorative track that notifies the player of a
+successful attack, and similarly, another track is temporarily un-muted to
+signify when the player receives Special Damage.</p>
+
+
+
+<p>At the end of combat, the music transitions
+to a victory or defeat segment based on the outcome of battle.</p>
+
+<h3>2.1.4 Mute/Un-mute Synchronization</h3>
+
+<p>JET can also synchronize the muting and
+un-muting of tracks to events in the music. For example, in the FPS game, it would
+probably be desirable to place the musical events relating to bonuses and
+damage as close to the actual game event as possible. However, simply un-muting
+a track at the moment the game event occurs might result in a music clip
+starting in the middle. Alternatively, a clip could be started from the
+beginning, but then it wouldn't be synchronized with the other music tracks.</p>
+
+
+<p>However, with the JET sync engine, a clip
+can be started at the next opportune moment and maintain synchronization. This
+can be accomplished by placing a number of short music clips on a decorative
+track. A MIDI event in the stream signifies
+the start of a clip and a second event signifies the end of a clip. When the
+application calls the JET clip function, the next clip in the track is allowed
+to play fully synchronized to the music. Optionally, the track can be
+automatically muted by a second MIDI event.</p>
+
+
+<p>
+<img border=0 width=576 height=155
+src="{@docRoot}images/jet/sync_muteunmute.png">
+<br>Figure 3: Synchronized Mute/Unmute</p>
+
+
+<h2>2.2 Audio Synchronization</h2>
+
+<p>JET provides an audio synchronization API
+that allows game play to be synchronized to events in the audio. The mechanism
+relies on data embedded in the MIDI file at
+the time the content is authored. When the JET engine senses an event during
+playback it generates a callback into the application program. The timing of
+the callback can be adjusted to compensate for any latency in the audio
+playback system so that audio and video can be synchronized. The diagram below
+shows an example of a simple music game that involves pressing the left and
+right arrows in time with the music.</p>
+
+<p><img border=0 width=576 height=134
+src="{@docRoot}images/jet/music_game.png">
+<br>Figure 4: Music Game</p>
+
+
+
+<p>The arrows represent events in the music sequence
+where game events need to be synchronized. In this case, the blue arrow
+represents a time where the player is supposed to press the left button, and
+the red arrow is for the right button. The yellow arrow tells the game engine
+that the sequence is complete. The player is allowed a certain time window
+before and after the event to press the appropriate key.</p>
+
+
+
+<p>If an event is received and the player has
+not pressed a button, a timer is set to half the length of the window. If the
+player presses the button before the timer expires, the game registers a
+success, and if not, the game registers a failure. </p>
+
+
+
+<p>If the player presses the button before the
+event is received, a timer is set to half the length of the window. If an event
+is received before the timer expires, the game registers a success, and if not,
+the game registers a failure. Game play might also include bonuses for getting
+close to the timing of the actual event. </p>
+
+
+
+<h1>3 JET Content Authoring Overview</h1>
+
+<p>To author JET files and hear them playback
+interactively, the content author will work in two applications which are
+designed to work together smoothly. The first is application is any
+off-the-shelf MIDI sequencing application that
+supports VST (for PC) or AU (for Mac) plugins. Here the author will compose
+their MIDI music files using the plugin as the
+synthesizer device. The second application is the JET Creator application. Here
+the author will import their MIDI music files
+(and optionally a DLS2 soundset) and setup the conditions for interactive
+playback within the JET enabled game. Optionally the content author may create
+a custom set of DLS instruments using an instrument editor that supports the
+DLS Level 2 format. One such application is Awave from MJSoft. </p>
+
+<p>Please see the JET Content Authoring Guidelines</i> documentation for additional
+details on content authoring.</p>
+
+
+
+<h1>4 Installing and Launching JET Creator</h1>
+
+<p>JET Creator is a python language
+application, therefore, you must have Python and wxPython installed on your
+machine. </p>
+
+
+<p>JetCreator was created and tested with:</p>
+
+<p>Python Version 2.5.4</p>
+
+<p>wxPython Version 2.8.7.1</p>
+
+
+<p>These can be downloaded here:</p>
+
+
+
+<p>PC:</p>
+<ul>
+<li>http://www.python.org/download/releases/2.5.4/</li>
+
+<li>http://www.wxpython.org/download.php</li>
+</ul>
+
+
+<p>MAC:</p>
+<ul>
+<li>http://wiki.python.org/moin/MacPython/Leopard</li>
+
+<li>http://www.wxpython.org/download.php</li>
+</ul>
+
+
+<p>After installing Python and wxPython,
+simply unzip or copy all the files in the JET Creator application directory to
+a folder on your hard drive.</p>
+
+
+<p>To launch JET Creator go to a command
+prompt and set the directory to where you've installed Python. Next run python
+with the command:</p>
+
+<p><pre>python jetcreator.py</pre></p>
+
+
+
+
+
+<h1>5 Using JET Creator</h1>
+
+
+
+<h2>5.1 File Types</h2>
+
+<p>There are a few different file types
+associated with JET Creator.</p>
+
+
+
+<p>.jtc JET
+Creator project file. This file contains all the information associated with a
+JET Creator project. When you Save or Save-as out of JET Creator, this file
+type is saved.</p>
+
+
+
+<p>.jet JET
+File. This output file is automatically generated from JET Creator whenever you
+save your JET Creator project. This is the file that bundles all JET assets
+together into a single file that the Android application will use. Give this
+file to the Android application developer.</p>
+
+
+
+<p>.mid File. This is the standard MIDI
+type 1 file that JET Creator will use to make segments.</p>
+
+
+
+<p>.seg Segment
+File. This is a JET Segment file. It has the same name as the MIDI
+file which it references but contains additional Segment information.</p>
+
+
+
+<p>.zip Zip
+Archive file. When you Export a JET Archive, a zip file is created that
+contains all the assets (files) necessary for JET Creator. Use this to transfer
+JET Creator projects to other people.</p>
+
+
+
+<h2>5.2 Open Dialog</h2>
+
+<p>When
+you first launch JET Creator you are presented with an open dialog like the
+following.</p>
+
+
+
+<p><img border=0 width=450 height=285
+src="{@docRoot}images/jet/jc_open_dlg.png"
+</p>
+
+
+
+
+
+<p> <b>Open</b> will open an existing .jtc (JET Creator file) file. Use the browser
+button to browse to the directory where you have saved your .jtc file.</p>
+
+
+
+<p> <b>New</b> will create a new .jtc file.</p>
+
+
+
+<p> <b>Import</b> will import a JET Archive (.zip) file.</p>
+
+
+
+<p> <b>Cancel</b> will cancel the dialog and exit the application.</p>
+
+
+
+
+
+<h1>5 Main Window </h1>
+
+<p>The main window of the JET Creator
+application looks like the picture below. There are three main sections from
+top to bottom: segment view, event view, and timeline. </p>
+
+
+
+<p>The segment view section displays a list of
+the current segments, which MIDI file and
+(optionally) DLS2 file each segment is derived from. It also shows each
+segments start and stop time and each segments quantize, transpose, repeat and
+mute flag settings.</p>
+
+
+
+<p>Just below the Segment view is the event
+view. The event view section displays all events associated with a given
+segment. Events only display when the segment they are assigned to is
+highlighted. Each event displays its type, start and end points, track and midi
+channel assignment, and its event ID.</p>
+
+
+
+<p>Just below the Event view is the timeline
+display. The timeline shows how many measures a given segment is as well as any
+events associated with that segment. The timeline changes to display the
+currently selected or playing segment. You can trigger an event in this window
+while the segment is play by simply clicking on the event in the timeline
+display.</p>
+
+
+<p><img border=0 width=554 height=378
+src="{@docRoot}images/jet/jc_main_wnd.png">
+<br><i>JET
+Creator Main Window<o:p></o:p></i></p>
+
+
+<p>The buttons along the left side of main
+window do the following:</p>
+
+<p>Add:
+Displays the segment or event window for adding a new segment or event</p>
+
+<p>Revise:
+Displays the segment or event window for updating an existing segment or event</p>
+
+<p>Delete:
+Deletes the selected segment or event (will ask for confirmation)</p>
+
+<p>Move:
+Displays the move window which allows you to move selected segments or events
+in time</p>
+
+<p>Queue All: Queue's
+(selects) all segments for playback</p>
+
+<p>Dequeue All: Dequeues
+(deselects) all segments</p>
+
+<p>Play:
+Starts playback of all queued segments. This button changes to Stop if any
+segments are playing</p>
+
+<p>Audition:
+Displays the Audition window (see below)</p>
+
+
+
+<h2>5.1 Segment Window</h2>
+
+<p>The segment window is where a given
+segment's attributes are assigned and auditioned, as shown in the picture
+below. The left side of the window displays the segments attributes that are
+stored in the JET file. The right side of the window allows the author to set
+mute flags, repeat and transpose settings and audition the segment as it will
+play in the JET game.</p>
+
+
+
+<p><b>Note</b>: the audition attributes (mute flags, repeat and transpose) are <i
+>not</i> stored in the JET content file
+(.jet) but rather are defined by the game or application itself. In programming
+language, these settings correspond directly with the API calls to the JET
+engine. By including them here, the JET content author can simulate how the
+segment will respond to the applications API commands during game play.</p>
+
+
+
+<p><img border=0 width=553 height=295
+src="{@docRoot}images/jet/jc_seg_wnd.png" >
+</p>
+
+<p>The segment parameters do the following:</p>
+
+<ul>
+<li>Segment Name - Sets
+the name of the segment</li>
+
+<li>MIDI File -
+The name and location of the MIDI file from which
+the segment is derived. The button to the immediate right will bring up a
+browser for locating a midi file on the hard drive.</li>
+
+<li>DLS File -
+The name and location of the DLS2 file, if any, that the MIDI
+file uses for that segment.</li>
+
+<li>Starting M/B/T -
+Starting measure, beat and tick of the segment</li>
+
+<li>Ending M/B/T -
+Ending measure, beat and tick of the segment</li>
+
+<li>Quantize -
+Quantize value for quantizing the current segment during playback</li>
+
+</ul>
+
+<p>The audition fields are as follows:</p>
+
+<ul>
+<li>Track Mutes -
+Shows the MIDI <b>tracks</b> (not channels)
+in the MIDI file. Clicking on a track's
+checkbox will mute that track. </li>
+
+<li>Channel -
+Displays the MIDI channel assigned to each
+track</li>
+
+<li>Name -
+Displays the track name meta event (if present) for each track</li>
+
+<li>Repeat -
+Indicates the number of times a segment should repeat during playback</li>
+
+<li>Transpose -
+Indicates the transposition in semi-tones or half-steps a segment should
+transpose during playback</li>
+
+<li>To the right of the Audition window are a few additional buttons.
+These do as follows:</li>
+
+<li>OK -
+Selecting OK confirms all segment settings and closes the segment window</li>
+
+<li>Cancel -
+Selecting Cancel cancels any changes and closes the segment window</li>
+
+<li>Replicate -
+Displays the Replicate Segment window for entering multiple segments at once.
+See below.</li>
+
+<li>Play/Stop Segment - Starts
+or Stops playback of the segment using the segment attributes assigned. </li>
+
+<li>Play/Stop MIDI File -
+Starts or Stops playback of the MIDI file
+which the segment is assigned to. </li>
+
+<li>Pause/Resume -
+Pauses or Resumes playback.</li>
+
+</ul>
+
+
+
+<h2>5.2 Event Window</a></h2>
+
+<p>The event window is where a given segment's
+event attributes are assigned and auditioned, as shown in the picture below. To
+add an event to a segment, the author must first select the segment which will
+contain the event, then select the Add button. This will bring up the Event
+window.</p>
+
+
+
+<p>
+<img border=0 width=554 height=294
+src="{@docRoot}images/jet/jc_event_wnd.png"></p>
+
+
+
+
+
+<p>There are two main sections to the event
+window. The segment section on the left side of the event window is for display
+only. It shows what the segment attributes are for the given segment. The Event
+section, on the right side, is where events can be assigned. The following
+parameters are available:</p>
+
+
+
+<p>Event Name -
+Assigns a name to an event</p>
+
+<p>Event Type -
+Selects which type of event to assign.</p>
+
+<p>Starting M/B/T -
+Sets the starting measure, beat, and tick for the event</p>
+
+<p>Ending M/B/T -
+Sets the ending measure, beat, and tick for the event, if applicable</p>
+
+<p>Track -
+Sets which track in the given segment the event will apply to</p>
+
+<p>Channel -
+Sets which MIDI channel the event will apply
+to. The MIDI channel should match the MIDI
+channel of the track</p>
+
+<p>Event ID -
+Sets the event ID for the event. Multiple events can be assigned to the same
+segment and therefore the Event ID is used to identify them</p>
+
+
+
+<p>To the right of the Audition window are a few additional buttons.
+These do as follows:</p>
+
+<p>
+
+<p>OK -
+Selecting OK confirms all event settings and closes the event window</p>
+
+<p>Cancel -
+Selecting Cancel cancels any changes and closes the event window</p>
+
+<p>Replicate -
+Displays the Replicate Event window for entering multiple events at once. See
+below.</p>
+
+<p>Play/Stop -
+Starts or Stops playback of the segment using the segment attributes assigned.
+While the segment is playing, events can be triggered and auditioned.</p>
+
+<p>Trigger -
+Triggers the event assigned. This replicates the API command that the JET game
+will use to trigger the event, therefore giving the content author a method for
+auditioning the behaviour of the event.</p>
+
+<p>Mute/UnMute -
+Mute/UnMute will mute or unmute the track that the event is assigned to</p>
+
+<p>Pause/Resume -
+Pauses or Resumes playback.</p>
+
+
+
+<p>To audition the behaviour of an event, you
+can select the Play button. This will initiate playback. The trigger button
+will send the trigger event when pressed. This is equivalent to selecting the
+green trigger event in the timeline. </p>
+
+
+
+<p>Note: Trigger events are meant to unmute a
+single track of a segment when triggered, then mute that track at the end of
+the trigger segment. Therefore you should make sure the mute flag is set to
+mute the track that a trigger event will be unmuting when receiving a trigger event.
+</p>
+
+
+
+<p>Please read Section <i>6 Under The Hood</i>
+below for details on how trigger events work and behave. </p>
+
+
+
+<h2>5.3 Replicate Windows</h2>
+
+<p>Often in creating JET files, you'll need to
+create tens or even hundreds of events. You may also need to move events. The
+Replicate and Move windows allow for this. There are two Replicate windows for
+creating multiple segments or events. They look like the following:</p>
+
+
+
+<p><img border=0 width=395 height=419
+src="{@docRoot}images/jet/jc_rep_wnd.png" ></p>
+
+<p>Replicate Segment Window</p>
+
+
+<p><img border=0 width=398 height=425
+src="{@docRoot}images/jet/jc_repseg_wnd.png"></p>
+
+
+
+<p>Replicate Event Window</p>
+
+
+
+<p>Both Replicate windows function the same.
+After creating an initial segment or event, you can select the Replicate
+button. The parameters are as follows:</p>
+
+
+
+<p>Name Prefix -
+Sets the prefix for the name of each segment or event created</p>
+
+<p>Starting M/B/T -
+Sets the starting time for the first segment or event</p>
+
+<p>Increment M/B/T -
+Sets the time between segments or events created. </p>
+
+<p>Number -
+Sets the number of segments or events you wish to create. If the number
+overflows the length of the MIDI file (for
+segments) or segment (for events), those objects will not be created.</p>
+
+<p>Preview -
+Preview allows you to examine the objects created before saying OK to insert
+them.</p>
+
+
+
+
+
+<h2>5.4 Move Windows</h2>
+
+<p>The Move function acts similarly to the
+Replicate function in that it allows you to edit multiple segments or events at
+one time, in this case move them in time. Like Replicate, there are two Move
+windows, one for Segments and one for Events. The windows look like the
+following:</p>
+
+
+
+<p><img border=0 width=400 height=424
+src="{@docRoot}images/jet/jc_moveseg_wnd.png"></p>
+
+
+
+<p>Move Event Window</p>
+
+
+
+<p>To use Move, first select the segments or
+events you wish to move in time, then click the Move button. The parameters are
+as follows:</p>
+
+
+
+<p>Starting M/B/T -
+Sets the starting time for the first segment or event</p>
+
+<p>Increment M/B/T -
+Sets the time in M/B/T you wish to move the objects by. </p>
+
+<p>Preview -
+Preview allows you to examine the objects created before saying OK to move
+them.</p>
+
+
+
+
+
+<h2>5.5 Audition Window</a></h2>
+
+<p>Clicking the Audition button in the main
+window of the JET Creator application will open the Audition window. This is
+where the content author or application programmer can simulate the interactive
+playback as it may occur in the mobile application or game itself.</p>
+
+
+
+<p><img border=0 width=554 height=370
+src="{@docRoot}images/jet/jc_audition_wnd.png"></p>
+
+
+
+<p>JET Audition Window</p>
+
+
+
+
+
+<p>There are four main sections to the
+audition window. The left most section displays the available segments and
+their length in seconds. The middle section displays a running list of what
+segments are queued for playback and what their playback status is. The far
+right section displays the mute flags for the currently playing segment. The
+timeline section at the bottom is the same as in the main window. It displays
+the currently playing segment as well as a visual display of any event triggers
+associated with that segment. </p>
+
+
+
+<p>The Audition window allows you to queue up
+any segment in any order for playback. To do this simply select the segment you
+wish to cue and hit Queue. That segment will appear in the queue window and
+start playing (if it is the first segment). Subsequently you can select any
+other segment or segments and cue them up for playback. As the segments
+complete playback, the next segment in the queue will begin playing. As is the
+other windows of JET Creator, you can mute, unmute, trigger event clips, etc.
+in realtime as each segment is playing back.</p>
+
+
+
+<p>Specifically the buttons behave as follows:</p>
+
+
+
+<p>Queue -
+loads the selected segment into the queue and starts playback</p>
+
+<p>Cancel and Queue -
+cancels the currently playing segment before queueing the selected segment for
+playback</p>
+
+<p>Cancel Current -
+cancels the currently playing segment in the queue and begins playback of the
+next segment</p>
+
+<p>Stop -
+stops playback of all queued segments</p>
+
+<p>Mute All -
+mutes all tracks in the current segment</p>
+
+<p>Mute None -
+unmutes all tracks in the current segment</p>
+
+<p>Original Mutes -
+sets the original mute flags for the current segment</p>
+
+
+
+<p>The combination of these playback options
+allows an author or application programmer to audition any behaviour an
+interactive music application may encounter. </p>
+
+
+
+
+
+<h2>5.6 JET Creator Menus </h2>
+
+<p>The JET Creator menus provide access to
+many of the parameters in the main window plus a few additional parameters.</p>
+
+<h3>5.6.1 File Menu</h3>
+
+<p>The File Menu contains the following
+elements:</p>
+
+
+
+<p>New -
+Creates a new JET Creator file (.jtc)</p>
+
+<p>Open -
+Opens an existing JET Creator file</p>
+
+<p>Save -
+Saves the currently opened JET Creator file</p>
+
+<p>Save As -
+Saves the currently opened JET Creator file to a new file</p>
+
+<p>Import Project - Imports a JET Creator archive (.zip)</p>
+
+<p>Export Project - Exports a JET Creator archive (.zip)</p>
+
+<p>Exit -
+Exits the application</p>
+
+
+
+<h3>5.6.2 Edit Menu</h3>
+
+<p>The Edit Menu contains the following
+elements:</p>
+
+
+
+<p>Undo -
+Undo will undo the last edit made</p>
+
+<p>Redo -
+Redo will redo the last undo</p>
+
+<p>Cut -
+Copy selected parameter into clipboard and Delete selection</p>
+
+<p>Copy -
+Copy selected parameter into clipboard and keep selection</p>
+
+<p>Paste -
+Paste selected parameter</p>
+
+
+
+<h3>5.6.3 JET</h3>
+
+<p>The Edit Menu contains the following
+elements:</p>
+
+
+
+<p>Properties -
+Brings up the JET Creator priorities window. This window allows you to set the
+following conditions for a given JET file:</p>
+
+<p>Copyright Info - Contains copyright info to be inserted into JET file</p>
+
+<p>Chase Controllers - Option to chase controllers (on/off). This should usually
+be ON.</p>
+
+<p>Delete Empty Tracks - Deletes any empty MIDI tracks</p>
+
+
+
+<h3>5.6.4 Segments</h3>
+
+<p>The Segments Menu contains the following
+elements:</p>
+
+
+
+<p>Add Segment -
+Brings up the Segment window</p>
+
+<p>Update Segment - Updates segment attributes</p>
+
+<p>Delete Segment - Deletes the current segment from the
+Segment List</p>
+
+
+
+<h3>5.6.5 Help</h3>
+
+<p>The Help Menu will contain at least the
+following elements:</p>
+
+
+
+<p>JET Creator Help - will launch PDF help document or go to on-line help</p>
+
+<p>About -
+JET Creator version number, SONiVOX info</p>
+
+
+
+
+
+<h1>6 Trigger Events Explained</h1>
+
+<p>Breaking a MIDI
+file into individual (non-linear) segments and queueing up those segments for
+playback in a game based on events within the game is one way JET music files are
+interactive. Trigger events are an additional method for interactive playback.
+Both would be used together in an interactive game or application.</p>
+
+
+
+<p>Trigger events allow for the following:</p>
+
+
+<ol>
+ <li><span
+ lang=EN-IE>Tracks <i>within</i> a MIDI segment can be turned on or off based on game
+ events. For example the composer could author two drum tracks, one fast
+ and one slow. If the action in a game is fast, the fast drum track could
+ play. If the action in the game is slow, the slow drum track can play.</li>
+ <li><span
+ lang=EN-IE>User actions can be compared to trigger events which are
+ pre-inserted into a music file at musically correct places. Based on the
+ results, scoring or other game actions can take place. </li>
+ <li><span
+ lang=EN-IE>Musical transitions between levels or action sequences can be
+ synchronized to be musically seemless.</li>
+</ol>
+
+
+
+<p>Under the hood, JET uses standard MIDI CC
+events to accomplish these actions and to synchronize audio. The controllers
+used by JET are among those not defined for specific use by the specification. The specific controller definitions
+are as follows:</p>
+
+
+
+<p> Controllers
+80-83 Reserved for use by
+application</p>
+
+<p> Controller
+102 JET event marker</p>
+
+<p> Controller
+103 JET clip marker</p>
+
+<p> Controllers
+104-119 Reserved for future use</p>
+
+
+
+<h2>6.1 JET Clip Marker (CC103)</h2>
+
+<p>Controller 103 is reserved for marking
+clips in a MIDI track that can be triggered by
+the JET_TriggerClip API call. The clip ID is encoded in the low 6 bits of the
+controller value. Bit 6 is set to one to indicate the start of a clip, and set
+to zero to indicate the end of a clip.</p>
+
+
+
+<p>For example, to identify a clip with a clip
+ID of 1, the author inserts a MIDI controller
+event with controller=103 and value=65 at the start of the clip and another
+event with controller=103 and value=1 at the end of the clip. When the
+JET_TriggerClip() function is called with a clip ID of 1, the track will be
+un-muted when the controller value 65 is encountered and muted again when the
+controller value 1 is encountered.</p>
+
+
+
+<p><img border=0 width=492 height=367
+src="{@docRoot}images/jet/clip_marker.png"></p>
+
+<p>Figure 5: Synchronized Clip</p>
+
+
+
+<p>In the figure above, if the
+JET_TriggerClip() function is called prior to the first controller event, Track
+3 will be un-muted when the first controller event occurs, the first clip will
+play, and the track will be muted when the second controller event occurs. If
+the JET_TriggerClip() function is called after the first controller event has
+occurred, Track 3 will be un-muted when the third controller event occurs, the
+second clip will play, and the track will be muted again when the fourth
+controller event occurs.</p>
+
+
+
+<p><b>Note:</b> Normally, the track containing the clip is muted by the application
+when the segment is initially queued by the call to JET_QueueSegment(). If it
+is not muted, the clip will always play until Jet_TriggerClip() has been called
+with the clip ID.</p>
+
+
+
+<h2>6.2 JET Event Marker (CC102)</h2>
+
+<p>Controller 102 is reserved for marking
+events in the MIDI streams that are specific
+to JET functionality. Currently, the only defined value is 0, which marks the
+end of a segment for timing purposes. </p>
+
+
+
+<p>Normally, JET starts playback of the next
+segment (or repeats the current segment) when the MIDI
+end-of-track meta-event is encountered. Some MIDI
+authoring tools make it difficult to place the end-of-track marker accurately,
+resulting in synchronization problems when segments are joined together.</p>
+
+
+
+<p>To avoid this problem, the author can place
+a JET end-of-segment marker (controller=102, value=0) at the point where the
+segment is to be looped. When the end-of-segment marker is encountered, the
+next segment will be triggered, or if the current segment is looped, playback
+will resume at the start of the segment.</p>
+
+
+
+<p>The end-of-segment marker can also be used
+to allow for completion of a musical figure beyond the end of measure that
+marks the start of the next segment. For example, the content author might
+create a 4-bar segment with a drum fill that ends on beat 1 of the 5<sup>th</sup>
+bar, a bar beyond the natural end of the segment. By placing an end-of-segment
+marker at the end of the 4<sup>th</sup> bar, the next segment will be
+triggered, but the drum fill will continue in parallel with the next segment
+providing musical continuity.</p>
+
+
+
+<p><img border=0 width=467 height=185
+src="{@docRoot}images/jet/event_marker.png"></p>
+
+<p>Figure 6: End-of-segment Marker</p>
+
+<h2>6.3 Application Controllers (CC80-83)</h2>
+
+<p>The application may use controllers in this
+range for its own purposes. When a controller in this range is encountered, the
+event is entered into an event queue that can be queried by the application.
+Some possible uses include synchronizing video events with audio and marking a
+point in a MIDI segment to queue up the next
+segment. The range of controllers monitored by the application can be modified
+by the application during initialization.</p>
+
+<h1>7 JET Creator Guidelines</h1>
+
+<p></p>
+
+<h2>7.1 Order of Tasks</h2>
+
+<p>As with all projects, its best to discuss and design the interactive music scheme with the game designer and programmer before beginning your composition. An outline and/or specification can go a long way in saving you from having to redo things after the game is in place.</p>
+
+<p>In general you’ll want to first write your music in your DAW of choice the way you’re used to composing, then break up the final MIDI file as needed for the application. Next, move to JET Creator and create all of your music segments in the order easiest to preview them when played in order. Finally, add the JET Events to control the segments via the Android game and Audition them as needed in JET Creator. Finally, save the project in JET Creator and hand off the .jet file to the programmer to integrate it in the game. After previewing there will likely be changes to the MIDI file(s) and JET Creator attributes. </p>
+
+<h2>7.2 Conserving Memory</h2>
+
+<p>If you’re trying to conserve memory, compose as few MIDI files as possible, and create several segments from that MIDI file. For example a 12 bar MIDI file with three sections of 4 bars, A, B, C, can create a much longer song. Simply create multiple segments that reference the one MIDI file, then order them however you like. For example, A, A, B, A, C, A, B, A, A would create a 36 bar song. Use JET to add repeats, transpose segments, and interactively mute and unmute tracks to keep it even more interesting.</p>
+
+<h2>7.3 Replicate</h2>
+
+<p>To make adding segments or events faster, use the Replicate command. Replicate can add multiple segments or events at one time and uses an offset parameter and prefix naming convention to keep things easy to read. The MOVE command is also useful for moving multiple events by a set number of measures, beats or ticks.</p>
+
+<h2>7.4 Interactive Options</h2>
+
+<p>There are several interactive audio concepts possible in JET. Below are a few examples although we hope developers will come up with others we haven’t thought of! These are:</p>
+
+<h3>7.4.1 Multiple Segment Triggering</h3>
+
+<p>In this method the application is triggering specific segments based on events in the game. For example a hallway with lots of fighting might trigger segment 1 and a hallway with no fighting might trigger segment 2. Using JET TriggerClips in conjunction with this method creates even more diversity.</p>
+
+<h3>7.4.2 Mute Arrays</h3>
+
+<p>In this method the application is triggering mute and unmute events to specific tracks in a single MIDI sequence. For example a hallway with lots of fighting might play MIDI tracks 1-16 and a hallway with no fighting might play the same midi file but mute tracks 9-16. Using JET TriggerClips in conjunction with this method creates even more diversity.</p>
+
+<h3>7.4.3 Music Driven Gameplay</h3>
+
+<p>Music driven gaming is similar to what Guitar Hero and JETBOY have done in that the music content determines how graphic events are displayed. The application then queries the user response to the graphic events and interactively modifies the music in response. In this method the game is utilizing JET Application Events, MIDI controllers that are embedded in the MIDI file and read by the game in real-time. Based on the user response, multiple segment triggering and/or mute arrays can be set.</p>
+
diff --git a/docs/html/guide/topics/ui/dialogs.jd b/docs/html/guide/topics/ui/dialogs.jd
new file mode 100644
index 0000000..c0c0b1b
--- /dev/null
+++ b/docs/html/guide/topics/ui/dialogs.jd
@@ -0,0 +1,650 @@
+page.title=Creating Dialogs
+parent.title=User Interface
+parent.link=index.html
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.app.Dialog}</li>
+ </ol>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#ShowingADialog">Showing a Dialog</a></li>
+ <li><a href="#DismissingADialog">Dismissing a Dialog</a></li>
+ <li><a href="#AlertDialog">Creating an AlertDialog</a>
+ <ol>
+ <li><a href="#AddingButtons">Adding buttons</a></li>
+ <li><a href="#AddingAList">Adding a list</a></li>
+ </ol>
+ </li>
+ <li><a href="#ProgressDialog">Creating a ProgressDialog</a>
+ <ol>
+ <li><a href="#ShowingAProgressBar">Showing a progress bar</a></li>
+ </ol>
+ </li>
+ <li><a href="#CustomDialog">Creating a Custom Dialog</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>A dialog is usually a small window that appears in front of the current Activity.
+The underlying Activity loses focus and the dialog accepts all user interaction.
+Dialogs are normally used
+for notifications and short activities that directly relate to the application in progress.</p>
+
+<p>The Android API supports the following types of {@link android.app.Dialog} objects:</p>
+<dl>
+ <dt>{@link android.app.AlertDialog}</dt>
+ <dd>A dialog that can manage zero, one, two, or three buttons, and/or a list of
+ selectable items that can include checkboxes or radio buttons. The AlertDialog
+ is capable of constructing most dialog user interfaces and is the suggested dialog type.
+ See <a href="#AlertDialog">Creating an AlertDialog</a> below.</dd>
+ <dt>{@link android.app.ProgressDialog}</dt>
+ <dd>A dialog that displays a progress wheel or progress bar. Because it's an extension of
+ the AlertDialog, it also supports buttons.
+ See <a href="#ProgressDialog">Creating a ProgressDialog</a> below.</dd>
+ <dt>{@link android.app.DatePickerDialog}</dt>
+ <dd>A dialog that allows the user to select a date. See the
+ <a href="{@docRoot}guide/tutorials/views/hello-datepicker.html">Hello DatePicker</a> tutorial.</dd>
+ <dt>{@link android.app.TimePickerDialog}</dt>
+ <dd>A dialog that allows the user to select a time. See the
+ <a href="{@docRoot}guide/tutorials/views/hello-timepicker.html">Hello TimePicker</a> tutorial.</dd>
+</dl>
+
+<p>If you would like to customize your own dialog, you can extend the
+base {@link android.app.Dialog} object or any of the subclasses listed above and define a new layout.
+See the section on <a href="#CustomDialog">Creating a Custom Dialog</a> below.</p>
+
+
+<h2 id="ShowingADialog">Showing a Dialog</h2>
+
+<p>A dialog is always created and displayed as a part of an {@link android.app.Activity}.
+You should normally create dialogs from within your Activity's
+{@link android.app.Activity#onCreateDialog(int)} callback method.
+When you use this callback, the Android system automatically manages the state of
+each dialog and hooks them to the Activity, effectively making it the "owner" of each dialog.
+As such, each dialog inherits certain properties from the Activity. For example, when a dialog
+is open, the Menu key reveals the options menu defined for the Activity and the volume
+keys modify the audio stream used by the Activity.</p>
+
+<p class="note"><strong>Note:</strong> If you decide to create a dialog outside of the
+<code>onCreateDialog()</code> method, it will not be attached to an Activity. You can, however,
+attach it to an Activity with {@link android.app.Dialog#setOwnerActivity(Activity)}.</p>
+
+<p>When you want to show a dialog, call
+{@link android.app.Activity#showDialog(int)} and pass it an integer that uniquely identifies the
+dialog that you want to display.</p>
+
+<p>When a dialog is requested for the first time, Android calls
+{@link android.app.Activity#onCreateDialog(int)} from your Activity, which is
+where you should instantiate the {@link android.app.Dialog}. This callback method
+is passed the same ID that you passed to {@link android.app.Activity#showDialog(int)}.
+After you create the Dialog, return the object at the end of the method.</p>
+
+<p>Before the dialog is displayed, Android also calls the optional callback method
+{@link android.app.Activity#onPrepareDialog(int,Dialog)}. Define this method if you want to change
+any properties of the dialog each time it is opened. This method is called
+every time a dialog is opened, whereas {@link android.app.Activity#onCreateDialog(int)} is only
+called the very first time a dialog is opened. If you don't define
+{@link android.app.Activity#onPrepareDialog(int,Dialog) onPrepareDialog()}, then the dialog will
+remain the same as it was the previous time it was opened. This method is also passed the dialog's
+ID, along with the Dialog object you created in {@link android.app.Activity#onCreateDialog(int)
+onCreateDialog()}.</p>
+
+<p>The best way to define the {@link android.app.Activity#onCreateDialog(int)} and
+{@link android.app.Activity#onPrepareDialog(int,Dialog)} callback methods is with a
+<em>switch</em> statement that checks the <var>id</var> parameter that's passed into the method.
+Each <em>case</em> should check for a unique dialog ID and then create and define the respective Dialog.
+For example, imagine a game that uses two different dialogs: one to indicate that the game
+has paused and another to indicate that the game is over. First, define an integer ID for
+each dialog:</p>
+<pre>
+static final int DIALOG_PAUSED_ID = 0;
+static final int DIALOG_GAMEOVER_ID = 1;
+</pre>
+
+<p>Then, define the {@link android.app.Activity#onCreateDialog(int)} callback with a
+switch case for each ID:</p>
+<pre>
+protected Dialog onCreateDialog(int id) {
+ Dialog dialog;
+ switch(id) {
+ case DIALOG_PAUSED_ID:
+ // do the work to define the pause Dialog
+ break;
+ case DIALOG_GAMEOVER_ID:
+ // do the work to define the game over Dialog
+ break;
+ default:
+ dialog = null;
+ }
+ return dialog;
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> In this example, there's no code inside
+the case statements because the procedure for defining your Dialog is outside the scope
+of this section. See the section below about <a href="#AlertDialog">Creating an AlertDialog</a>,
+offers code suitable for this example.</p>
+
+<p>When it's time to show one of the dialogs, call {@link android.app.Activity#showDialog(int)}
+with the ID of a dialog:</p>
+<pre>
+showDialog(DIALOG_PAUSED_ID);
+</pre>
+
+
+<h2 id="DismissingADialog">Dismissing a Dialog</h2>
+
+<p>When you're ready to close your dialog, you can dismiss it by calling
+{@link android.app.Dialog#dismiss()} on the Dialog object.
+If necessary, you can also call {@link android.app.Activity#dismissDialog(int)} from the
+Activity, which effectively calls {@link android.app.Dialog#dismiss()} on the
+Dialog for you.</p>
+
+<p>If you are using {@link android.app.Activity#onCreateDialog(int)} to manage the state
+of your dialogs (as discussed in the previous section), then every time your dialog is
+dismissed, the state of the Dialog
+object is retained by the Activity. If you decide that you will no longer need this object or
+it's important that the state is cleared, then you should call
+{@link android.app.Activity#removeDialog(int)}. This will remove any internal references
+to the object and if the dialog is showing, it will dismiss it.</p>
+
+<h3>Using dismiss listeners</h3>
+
+<p>If you'd like your applcation to perform some procedures the moment that a dialog is dismissed,
+then you should attach an on-dismiss listener to your Dialog.</p>
+
+<p>First define the {@link android.content.DialogInterface.OnDismissListener} interface.
+This interface has just one method,
+{@link android.content.DialogInterface.OnDismissListener#onDismiss(DialogInterface)}, which
+will be called when the dialog is dismissed.
+Then simply pass your OnDismissListener implementation to
+{@link android.app.Dialog#setOnDismissListener(DialogInterface.OnDismissListener)
+setOnDismissListener()}.</p>
+
+<p>However, note that dialogs can also be "cancelled." This is a special case that indicates
+the dialog was explicitly cancelled by the user. This will occur if the user presses the
+"back" button to close the dialog, or if the dialog explicitly calls {@link android.app.Dialog#cancel()}
+(perhaps from a "Cancel" button in the dialog). When a dialog is cancelled,
+the OnDismissListener will still be notified, but if you'd like to be informed that the dialog
+was explicitly cancelled (and not dismissed normally), then you should register
+an {@link android.content.DialogInterface.OnCancelListener} with
+{@link android.app.Dialog#setOnCancelListener(DialogInterface.OnCancelListener)
+setOnCancelListener()}.</p>
+
+
+<h2 id="AlertDialog">Creating an AlertDialog</h2>
+
+<p>An {@link android.app.AlertDialog} is an extension of the {@link android.app.Dialog}
+class. It is capable of constructing most dialog user interfaces and is the suggested dialog type.
+You should use it for dialogs that use any of the following features:</p>
+<ul>
+ <li>A title</li>
+ <li>A text message</li>
+ <li>One, two, or three buttons</li>
+ <li>A list of selectable items (with optional checkboxes or radio buttons)</li>
+</ul>
+
+<p>To create an AlertDialog, use the {@link android.app.AlertDialog.Builder} subclass.
+Get a Builder with {@link android.app.AlertDialog.Builder#AlertDialog.Builder(Context)} and
+then use the class's public methods to define all of the
+AlertDialog properties. After you're done with the Builder, retrieve the
+AlertDialog object with {@link android.app.AlertDialog.Builder#create()}.</p>
+
+<p>The following topics show how to define various properties of the AlertDialog using the
+AlertDialog.Builder class. If you use any of the following sample code inside your
+{@link android.app.Activity#onCreateDialog(int) onCreateDialog()} callback method,
+you can return the resulting Dialog object to display the dialog.</p>
+
+
+<h3 id="AddingButtons">Adding buttons</h3>
+
+<img src="{@docRoot}images/dialog_buttons.png" alt="" style="float:right" />
+
+<p>To create an AlertDialog with side-by-side buttons like the one shown in the screenshot to the right,
+use the <code>set...Button()</code> methods:</p>
+
+<pre>
+AlertDialog.Builder builder = new AlertDialog.Builder(this);
+builder.setMessage("Are you sure you want to exit?")
+ .setCancelable(false)
+ .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ MyActivity.this.finish();
+ }
+ })
+ .setNegativeButton("No", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+AlertDialog alert = builder.create();
+</pre>
+
+<p>First, add a message for the dialog with
+{@link android.app.AlertDialog.Builder#setMessage(CharSequence)}. Then, begin
+method-chaining and set the dialog
+to be <em>not cancelable</em> (so the user cannot close the dialog with the back button)
+with {@link android.app.AlertDialog.Builder#setCancelable(boolean)}. For each button,
+use one of the <code>set...Button()</code> methods, such as
+{@link android.app.AlertDialog.Builder#setPositiveButton(CharSequence,DialogInterface.OnClickListener)
+setPositiveButton()}, that accepts the name for the button and a
+{@link android.content.DialogInterface.OnClickListener} that defines the action to take
+when the user selects the button.</p>
+
+<p class="note"><strong>Note:</strong> You can only add one of each button type to the
+AlertDialog. That is, you cannot have more than one "positive" button. This limits the number
+of possible buttons to three: positive, neutral, and negative. These names are technically irrelevant to the
+actual functionality of your buttons, but should help you keep track of which one does what.</p>
+
+
+<h3 id="AddingAList">Adding a list</h3>
+
+<img src="{@docRoot}images/dialog_list.png" alt="" style="float:right" />
+
+<p>To create an AlertDialog with a list of selectable items like the one shown to the right,
+use the <code>setItems()</code> method:</p>
+
+<pre>
+final CharSequence[] items = {"Red", "Green", "Blue"};
+
+AlertDialog.Builder builder = new AlertDialog.Builder(this);
+builder.setTitle("Pick a color");
+builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
+ }
+});
+AlertDialog alert = builder.create();
+</pre>
+
+<p>First, add a title to the dialog with
+{@link android.app.AlertDialog.Builder#setTitle(CharSequence)}.
+Then, add a list of selectable items with
+{@link android.app.AlertDialog.Builder#setItems(CharSequence[],DialogInterface.OnClickListener)
+setItems()}, which accepts the array of items to display and a
+{@link android.content.DialogInterface.OnClickListener} that defines the action to take
+when the user selects an item.</p>
+
+
+<h4>Adding checkboxes and radio buttons</h4>
+
+<img src="{@docRoot}images/dialog_singlechoicelist.png" alt="" style="float:right" />
+
+<p>To create a list of multiple-choice items (checkboxes) or
+single-choice items (radio buttons) inside the dialog, use the
+{@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String,
+DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()} and
+{@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener)
+setSingleChoiceItems()} methods, respectively.
+If you create one of these selectable lists in the
+{@link android.app.Activity#onCreateDialog(int) onCreateDialog()} callback method,
+Android manages the state of the list for you. As long as the Activity is active,
+the dialog remembers the items that were previously selected, but when the user exits the
+Activity, the selection is lost.
+
+<p class="note"><strong>Note:</strong> To save the selection when the user leaves or
+pauses the Activity, you must properly save and restore the setting throughout
+the <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">Activity Lifecycle</a>.
+To permanently save the selections, even when the Activity process is completely shutdown,
+you need to save the settings
+with one of the <a href="{@docRoot}guide/topics/data/data-storage.html">Data
+Storage</a> techniques.</p>
+
+<p>To create an AlertDialog with a list of single-choice items like the one shown to the right,
+use the same code from the previous example, but replace the <code>setItems()</code> method with
+{@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener)
+setSingleChoiceItems()}:</p>
+
+<pre>
+final CharSequence[] items = {"Red", "Green", "Blue"};
+
+AlertDialog.Builder builder = new AlertDialog.Builder(this);
+builder.setTitle("Pick a color");
+builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
+ }
+});
+AlertDialog alert = builder.create();
+</pre>
+
+<p>The second parameter in the
+{@link android.app.AlertDialog.Builder#setSingleChoiceItems(CharSequence[],int,DialogInterface.OnClickListener)
+setSingleChoiceItems()} method is an integer value for the <var>checkedItem</var>, which indicates the
+zero-based list position of the default selected item. Use "-1" to indicate that no item should be
+selected by default.</p>
+
+
+<h2 id="ProgressDialog">Creating a ProgressDialog</h2>
+
+<img src="{@docRoot}images/dialog_progress_spinning.png" alt="" style="float:right" />
+
+<p>A {@link android.app.ProgressDialog} is an extension of the {@link android.app.AlertDialog}
+class that can display a progress animation in the form of a spinning wheel, for a task with
+progress that's undefined, or a progress bar, for a task that has a defined progression.
+The dialog can also provide buttons, such as one to cancel a download.</p>
+
+<p>Opening a progress dialog can be as simple as calling
+{@link android.app.ProgressDialog#show(Context,CharSequence,CharSequence)
+ProgressDialog.show()}. For example, the progress dialog shown to the right can be
+easily achieved without managing the dialog through the
+{@link android.app.Activity#onCreateDialog(int)} callback,
+as shown here:</p>
+
+<pre>
+ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
+ "Loading. Please wait...", true);
+</pre>
+
+<p>The first parameter is the application {@link android.content.Context},
+the second is a title for the dialog (left empty), the third is the message,
+and the last parameter is whether the progress
+is indeterminate (this is only relevant when creating a progress bar, which is
+discussed in the next section).
+</p>
+
+<p>The default style of a progress dialog is the spinning wheel.
+If you want to create a progress bar that shows the loading progress with granularity,
+some more code is required, as discussed in the next section.</p>
+
+
+<h3 id="ShowingAProgressBar">Showing a progress bar</h3>
+
+<img src="/images/dialog_progress_bar.png" alt="" style="float:right" />
+
+<p>To show the progression with an animated progress bar:</p>
+
+<ol>
+ <li>Initialize the
+ ProgressDialog with the class constructor,
+ {@link android.app.ProgressDialog#ProgressDialog(Context)}.</li>
+ <li>Set the progress style to "STYLE_HORIZONTAL" with
+ {@link android.app.ProgressDialog#setProgressStyle(int)} and
+ set any other properties, such as the message.</li>
+ <li>When you're ready to show the dialog, call
+ {@link android.app.Dialog#show()} or return the ProgressDialog from the
+ {@link android.app.Activity#onCreateDialog(int)} callback.</li>
+ <li>You can increment the amount of progress displayed
+ in the bar by calling either {@link android.app.ProgressDialog#setProgress(int)} with a value for
+ the total percentage completed so far or {@link android.app.ProgressDialog#incrementProgressBy(int)}
+ with an incremental value to add to the total percentage completed so far.</li>
+</ol>
+
+<p>For example, your setup might look like this:</p>
+<pre>
+ProgressDialog progressDialog;
+progressDialog = new ProgressDialog(mContext);
+progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+progressDialog.setMessage("Loading...");
+progressDialog.setCancelable(false);
+</pre>
+
+<p>The setup is simple. Most of the code needed to create a progress dialog is actually
+involved in the process that updates it. You might find that it's
+necessary to create a second thread in your application for this work and then report the progress
+back to the Activity's UI thread with a {@link android.os.Handler} object.
+If you're not familiar with using additional
+threads with a Handler, see the example Activity below that uses a second thread to
+increment a progress dialog managed by the Activity.</p>
+
+<script type="text/javascript">
+function toggleDiv(link) {
+ var toggleable = $(link).parent();
+ if (toggleable.hasClass("closed")) {
+ $(".toggleme", toggleable).slideDown("fast");
+ toggleable.removeClass("closed");
+ toggleable.addClass("open");
+ $(".toggle-img", toggleable).attr("title", "hide").attr("src", "/assets/images/triangle-opened.png");
+ } else {
+ $(".toggleme", toggleable).slideUp("fast");
+ toggleable.removeClass("open");
+ toggleable.addClass("closed");
+ $(".toggle-img", toggleable).attr("title", "show").attr("src", "/assets/images/triangle-closed.png");
+ }
+ return false;
+}
+</script>
+<style>
+.toggleme {
+ padding:0 0 1px 0;
+}
+.toggleable a {
+ text-decoration:none;
+}
+.toggleable.closed .toggleme {
+ display:none;
+}
+#jd-content .toggle-img {
+ margin:0;
+}
+</style>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="/assets/images/triangle-closed.png" class="toggle-img" />
+ <strong>Example ProgressDialog with a second thread</strong></a>
+ <div class="toggleme">
+ <p>This example uses a second thread to track the progress of a process (which actually just
+counts up to 100). The thread sends a {@link android.os.Message} back to the main
+Activity through a {@link android.os.Handler} each time progress is made. The main Activity then updates the
+ProgressDialog.</p>
+
+<pre>
+package com.example.progressdialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+public class NotificationTest extends Activity {
+ static final int PROGRESS_DIALOG = 0;
+ Button button;
+ ProgressThread progressThread;
+ ProgressDialog progressDialog;
+
+ /** Called when the activity is first created. */
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ // Setup the button that starts the progress dialog
+ button = (Button) findViewById(R.id.progressDialog);
+ button.setOnClickListener(new OnClickListener(){
+ public void onClick(View v) {
+ showDialog(PROGRESS_DIALOG);
+ }
+ });
+ }
+
+ protected Dialog onCreateDialog(int id) {
+ switch(id) {
+ case PROGRESS_DIALOG:
+ progressDialog = new ProgressDialog(NotificationTest.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ progressDialog.setMessage("Loading...");
+ progressThread = new ProgressThread(handler);
+ progressThread.start();
+ return progressDialog;
+ default:
+ return null;
+ }
+ }
+
+ // Define the Handler that receives messages from the thread and update the progress
+ final Handler handler = new Handler() {
+ public void handleMessage(Message msg) {
+ int total = msg.getData().getInt("total");
+ progressDialog.setProgress(total);
+ if (total >= 100){
+ dismissDialog(PROGRESS_DIALOG);
+ progressThread.setState(ProgressThread.STATE_DONE);
+ }
+ }
+ };
+
+ /** Nested class that performs progress calculations (counting) */
+ private class ProgressThread extends Thread {
+ Handler mHandler;
+ final static int STATE_DONE = 0;
+ final static int STATE_RUNNING = 1;
+ int mState;
+ int total;
+
+ ProgressThread(Handler h) {
+ mHandler = h;
+ }
+
+ public void run() {
+ mState = STATE_RUNNING;
+ total = 0;
+ while (mState == STATE_RUNNING) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ Log.e("ERROR", "Thread Interrupted");
+ }
+ Message msg = mHandler.obtainMessage();
+ Bundle b = new Bundle();
+ b.putInt("total", total);
+ msg.setData(b);
+ mHandler.sendMessage(msg);
+ total++;
+ }
+ }
+
+ /* sets the current state for the thread,
+ * used to stop the thread */
+ public void setState(int state) {
+ mState = state;
+ }
+ }
+}
+</pre>
+ </div> <!-- end toggleme -->
+</div> <!-- end toggleable -->
+
+
+
+<h2 id="CustomDialog">Creating a Custom Dialog</h2>
+
+<img src="{@docRoot}images/dialog_custom.png" alt="" style="float:right" />
+
+<p>If you want a customized design for a dialog, you can create your own layout
+for the dialog window with layout and widget elements.
+After you've defined your layout, pass the root View object or
+layout resource ID to {@link android.app.Dialog#setContentView(View)}.</p>
+
+<p>For example, to create the dialog shown to the right:</p>
+
+<ol>
+ <li>Create an XML layout saved as <code>custom_dialog.xml</code>:
+<pre>
+&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout_root"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="10dp"
+ >
+ &lt;ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="10dp"
+ />
+ &lt;TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:textColor="#FFF"
+ />
+&lt;/LinearLayout>
+</pre>
+
+ <p>This XML defines an {@link android.widget.ImageView} and a {@link android.widget.TextView}
+ inside a {@link android.widget.LinearLayout}.</p>
+ <li>Set the above layout as the dialog's content view and define the content
+ for the ImageView and TextView elements:</p>
+<pre>
+Context mContext = getApplicationContext();
+Dialog dialog = new Dialog(mContext);
+
+dialog.setContentView(R.layout.custom_dialog);
+dialog.setTitle("Custom Dialog");
+
+TextView text = (TextView) dialog.findViewById(R.id.text);
+text.setText("Hello, this is a custom dialog!");
+ImageView image = (ImageView) dialog.findViewById(R.id.image);
+image.setImageResource(R.drawable.android);
+</pre>
+
+ <p>After you instantiate the Dialog, set your custom layout as the dialog's content view with
+ {@link android.app.Dialog#setContentView(int)}, passing it the layout resource ID.
+ Now that the Dialog has a defined layout, you can capture View objects from the layout with
+ {@link android.app.Dialog#findViewById(int)} and modify their content.</p>
+ </li>
+
+ <li>That's it. You can now show the dialog as described in
+ <a href="#ShowingADialog">Showing A Dialog</a>.</li>
+</ol>
+
+<p>A dialog made with the base Dialog class must have a title. If you don't call
+{@link android.app.Dialog#setTitle(CharSequence) setTitle()}, then the space used for the title
+remains empty, but still visible. If you don't want
+a title at all, then you should create your custom dialog using the
+{@link android.app.AlertDialog} class. However, because an AlertDialog is created easiest with
+the {@link android.app.AlertDialog.Builder} class, you do not have access to the
+{@link android.app.Dialog#setContentView(int)} method used above. Instead, you must use
+{@link android.app.AlertDialog.Builder#setView(View)}. This method accepts a {@link android.view.View} object,
+so you need to inflate the layout's root View object from
+XML.</p>
+
+<p>To inflate the XML layout, retrieve the {@link android.view.LayoutInflater} with
+{@link android.app.Activity#getLayoutInflater()}
+(or {@link android.content.Context#getSystemService(String) getSystemService()}),
+and then call
+{@link android.view.LayoutInflater#inflate(int, ViewGroup)}, where the first parameter
+is the layout resource ID and the second is the ID of the root View. At this point, you can use
+the inflated layout to find View objects in the layout and define the content for the
+ImageView and TextView elements. Then instantiate the AlertDialog.Builder and set the
+inflated layout for the dialog with {@link android.app.AlertDialog.Builder#setView(View)}.</p>
+
+<p>Here's an example, creating a custom layout in an AlertDialog:</p>
+
+<pre>
+AlertDialog.Builder builder;
+AlertDialog alertDialog;
+
+Context mContext = getApplicationContext();
+LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER);
+View layout = inflater.inflate(R.layout.custom_dialog,
+ (ViewGroup) findViewById(R.id.layout_root));
+
+TextView text = (TextView) layout.findViewById(R.id.text);
+text.setText("Hello, this is a custom dialog!");
+ImageView image = (ImageView) layout.findViewById(R.id.image);
+image.setImageResource(R.drawable.android);
+
+builder = new AlertDialog.Builder(mContext);
+builder.setView(layout);
+alertDialog = builder.create();
+</pre>
+
+<p>Using an AlertDialog for your custom layout lets you
+take advantage of built-in AlertDialog features like managed buttons,
+selectable lists, a title, an icon and so on.</p>
+
+<p>For more information, refer to the reference documentation for the
+{@link android.app.Dialog} and {@link android.app.AlertDialog.Builder}
+classes.</p>
+
+
+
diff --git a/docs/html/guide/topics/ui/notifiers/index.jd b/docs/html/guide/topics/ui/notifiers/index.jd
new file mode 100644
index 0000000..5b37f5b6
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/index.jd
@@ -0,0 +1,107 @@
+page.title=Notifying the User
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Toast">Toast Notification</a></li>
+ <li><a href="#StatusBarNotification">Status Bar Notification</a></li>
+ <li><a href="#Dialog">Dialog Notification</a></li>
+ </ol>
+ <h2>More about</h2>
+ <ol>
+ <li><a href="toasts.html">Creating Toast Notifications</a></li>
+ <li><a href="notifications.html">Creating Status Bar Notifications</a></li>
+ <li><a href="{@docRoot}guide/topics/ui/dialogs.html">Creating Dialogs</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>Several types of situations may arise that require you to notify the user
+about an event that occurs in your application. Some events require the user to respond
+and others do not. For example:</p>
+<ul>
+ <li>When an event such as saving a file is complete, a small message
+should appear to confirm that the save was successful.</li>
+ <li>If the application is running in the background and needs the user's attention,
+the application should create a notificaiton that allows the user to respond at
+his or her convenience.</li>
+ <li>If the application is
+performing work that the user must wait for (such as loading a file),
+the application should show a hovering progress wheel or bar.</li>
+</ul>
+
+<p>Each of these notification tasks can be achieved using a different technique:</p>
+<ul>
+ <li>A <a href="#Toast">Toast Notification</a>, for brief messages that come
+ from the background.</li>
+ <li>A <a href="#StatusBar">Status Bar Notification</a>, for persistent reminders
+ that come from the background and request the user's response.</li>
+ <li>A <a href="#Dialog">Dialog Notification</a>, for Activity-related notifications.</li>
+</ul>
+
+<p>This document summarizes each of these techniques for notifying the user and includes
+links to full documentation.</p>
+
+
+<h2 id="Toast">Toast Notification</h2>
+
+<img src="{@docRoot}images/toast.png" alt="" style="float:right" />
+
+<p>A toast notificaiton is a message that pops up on the surface of the window.
+It only fills the amount of space required for the message and the user's current
+activity remains visible and interactive. The notification automatically fades in and
+out, and does not accept interaction events. Because a toast can be created from a background
+{@link android.app.Service}, it appears even if the application isn't visible.</p>
+
+<p>A toast is best for short text messages, such as "File saved,"
+when you're fairly certain the user is paying attention
+to the screen. A toast can not accept user interaction events; if you'd like
+the user to respond and take action, consider using a
+<a href="#StatusBar">Status Bar Notification</a> instead.</p>
+
+<p>For more information, refer to <a href="toasts.html">Creating Toast Notifications</a>.</p>
+
+
+<h2 id="StatusBar">Status Bar Notification</h2>
+
+<img src="{@docRoot}images/notifications_window.png" alt="" style="float:right; clear:right;" />
+
+<p>A status bar notification adds an icon to the system's status bar
+(with an optional ticker-text message) and an expanded message in the "Notifications" window.
+When the user selects the expanded message, Android fires an
+{@link android.content.Intent} that is defined by the notification (usually to launch an
+{@link android.app.Activity}).
+You can also configure the notification to alert the user with a sound, a vibration, and flashing
+lights on the device.</p>
+
+<p>This kind of notification is ideal when your application is working in
+a background {@link android.app.Service} and needs to
+notify the user about an event. If you need to alert the user about an event that occurs
+while your Activity is still in focus, consider using a
+<a href="#Dialog">Dialog Notification</a> instead.</p>
+
+<p>For more information, refer to
+<a href="notifications.html">Creating Status Bar Notifications</a>.</p>
+
+
+<h2 id="Dialog">Dialog Notification</h2>
+
+<img src="{@docRoot}images/dialog_progress_spinning.png" alt="" style="float:right" />
+
+<p>A dialog is usually a small window that appears in front of the current Activity.
+The underlying Activity loses focus and the dialog accepts all user interaction.
+Dialogs are normally used
+for notifications and short activities that directly relate to the application in progress.</p>
+
+<p>You should use a dialog when you need to show a progress bar or a short
+message that requires confirmation from the user (such as an alert with "OK" and "Cancel" buttons).
+You can use also use dialogs as integral componenents
+in your application's UI and for other purposes besides notifications.
+For a complete discussion on all the available types of dialogs,
+including its uses for notifications, refer to
+<a href="{@docRoot}guide/topics/ui/dialogs.html">Creating Dialogs</a>.</p>
+
+
+
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
new file mode 100644
index 0000000..e6fa48f
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -0,0 +1,432 @@
+page.title=Creating Status Bar Notifications
+parent.title=Notifying the User
+parent.link=index.html
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.app.Notification}</li>
+ <li>{@link android.app.NotificationManager}</li>
+ </ol>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Basics">The Basics</a></li>
+ <li><a href="#ManageYourNotifications">Managing your Notifications</a></li>
+ <li><a href="#CreateANotification">Creating a Notification</a>
+ <ol>
+ <li><a href="#Update">Updating the notification</a></li>
+ <li><a href="#Sound">Adding a sound</a></li>
+ <li><a href="#Vibration">Adding vibration</a></li>
+ <li><a href="#Lights">Adding flashing lights</a></li>
+ <li><a href="#More">More features</a></li>
+ </ol>
+ </li>
+ <li><a href="#CustomExpandedView">Creating a Custom Expanded View</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>A status bar notification adds an icon to the system's status bar
+(with an optional ticker-text message) and an expanded message in the "Notifications" window.
+When the user selects the expanded message, Android fires an
+{@link android.content.Intent} that is defined by the notification (usually to launch an
+{@link android.app.Activity}).
+You can also configure the notification to alert the user with a sound, a vibration, and flashing
+lights on the device.</p>
+
+<p>A status bar notification should be used for any case in
+which a background Service needs to alert the user about an event that requires a response. A background Service
+<strong>should never</strong> launch an Activity on its own in order to receive user interaction.
+The Service should instead create a status bar notification that will launch the Activity
+when selected by the user.</p>
+
+<p>The screenshot below shows the status bar with a notification icon on the left side.</p>
+<img src="{@docRoot}images/status_bar.png" alt="" />
+
+<p>The next screenshot shows the notification's expanded message in the "Notifications" window.
+The user can reveal the Notifications window by pulling down the status bar
+(or selecting <em>Notifications</em> from the Home options menu).</p>
+<img src="{@docRoot}images/notifications_window.png" alt="" />
+
+
+<h2 id="Basics">The Basics</h2>
+
+<p>An {@link android.app.Activity} or {@link android.app.Service} can initiate a status bar
+notification. Because an Activity can perform actions only while it is
+active and in focus, you should create your status bar notifications from a
+Service. This way, the notification can be created from the background,
+while the user is using another application or
+while the device is asleep. To create a notification, you must use two
+classes: {@link android.app.Notification} and {@link android.app.NotificationManager}.</p>
+
+<p>Use an instance of the {@link android.app.Notification} class to define the properties of your
+status bar notification, such as the status bar icon, the expanded message, and extra settings such
+as a sound to play. The {@link android.app.NotificationManager} is an Android system service that
+executes and manages all Notifications. You do not instantiate the NotificationManager. In order
+to give it your Notification, you must retrieve a reference to the NotificationManager with
+{@link android.app.Activity#getSystemService(String) getSystemService()} and
+then, when you want to notify the user, pass it your Notification object with
+{@link android.app.NotificationManager#notify(int,Notification) notify()}. </p>
+
+<p>To create a status bar notification:</p>
+<ol>
+ <li>Get a reference to the NotificationManager:
+<pre>
+String ns = Context.NOTIFICATION_SERVICE;
+NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
+</pre>
+ </li>
+ <li>Instantiate the Notification:
+<pre>
+int icon = R.drawable.notification_icon;
+CharSequence tickerText = "Hello";
+long when = System.currentTimeMillis();
+
+Notification notification = new Notification(icon, tickerText, when);
+</pre>
+ </li>
+ <li>Define the Notification's expanded message and Intent:
+<pre>
+Context context = getApplicationContext();
+CharSequence contentTitle = "My notification";
+CharSequence contentText = "Hello World!";
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+
+notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+</pre>
+ </li>
+ <li>Pass the Notification to the NotificationManager:
+<pre>
+private static final int HELLO_ID = 1;
+
+mNotificationManager.notify(HELLO_ID, notification);
+</pre>
+ <p>That's it. Your user has now been notified.</p>
+ </li>
+</ol>
+
+
+<h2 id="ManageYourNotifications">Managing your Notifications</h2>
+
+<p>The {@link android.app.NotificationManager} is a system service that manages all
+notifications. You must retrieve a reference to it with the
+{@link android.app.Activity#getSystemService(String) getSystemService()} method.
+For example:</p>
+<pre>
+String ns = Context.NOTIFICATION_SERVICE;
+NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
+</pre>
+
+<p>When you want to send your status bar notification, pass the Notification object
+to the NotificationManager with {@link android.app.NotificationManager#notify(int,Notification)}.
+The first parameter is the unique ID for the Notification and the second is the Notification object.
+The ID uniquely identifies the Notification from within your
+application. This is necessary if you need to update the Notification or (if
+your application manages different kinds of Notifications) select the appropriate action
+when the user returns to your application via the Intent defined in the Notification.</p>
+
+<p>To clear the status bar notification when the user selects it from the Notifications
+window, add the "FLAG_AUTO_CANCEL" flag to your Notification object. You can also clear it
+manually with {@link android.app.NotificationManager#cancel(int)}, passing it the notification ID,
+or clear all your Notifications with {@link android.app.NotificationManager#cancelAll()}.</p>
+
+
+<h2 id="CreateANotification">Creating a Notification</h2>
+
+<p>A {@link android.app.Notification} object defines the details of the notification
+message that is displayed in the status bar and "Notifications" window, and any other
+alert settings, such as sounds and blinking lights.</p>
+
+<p>A status bar notification <em>requires</em> all of the following:</p>
+<ul>
+ <li>An icon for the status bar</li>
+ <li>A title and expanded message for the expanded view (unless you define a
+ <a href="#CustomExpandedView">custom expanded view</a>)</li>
+ <li>A {@link android.app.PendingIntent}, to be fired when the notification is selected</li>
+</ul>
+<p>Optional settings for the status bar notification include:</p>
+<ul>
+ <li>A ticker-text message for the status bar</li>
+ <li>An alert sound</li>
+ <li>A vibrate setting</li>
+ <li>A flashing LED setting</li>
+</ul>
+
+<p>The starter-kit for a new Notification includes the
+{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)}
+method. These define all the required settings for a Notification.
+The following snippet demonstrates a basic Notification setup:</p>
+<pre>
+int icon = R.drawable.notification_icon; // icon from resources
+CharSequence tickerText = "Hello"; // ticker-text
+long when = System.currentTimeMillis(); // notification time
+Context context = getApplicationContext(); // application Context
+CharSequence contentTitle = "My notification"; // expanded message title
+CharSequence contentText = "Hello World!"; // expanded message text
+
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+
+// the next two lines initialize the Notification, using the configurations above
+Notification notification = new Notification(icon, tickerText, when);
+notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+</pre>
+
+
+<h3 id="Updating">Updating the notification</h3>
+
+<p>You can update the information in your status bar notification as events
+continue to occur in your application. For example, when a new SMS text message arrives
+before previous messages have been read, the Messaging application updates the existing
+notification to display the total number of new messages received.
+This practice of updating an existing Notification is much better than adding new Notifications
+to the NotificationManager because it avoids clutter in the Notifications window.</p>
+
+<p>Because each notification is uniquely identified
+by the NotificationManager with an integer ID, you can revise the notification by calling
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} with new values, change some field values of the Notification, and then call
+{@link android.app.NotificationManager#notify(int,Notification) notify()} again.</p>
+
+<p>You can revise each property with the object member fields
+(except for the Context and the expanded message title and text). You should always
+revise the text message when you update the notification by calling
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} with new values for <var>contentTitle</var> and <var>contentText</var>.
+Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the
+notification. (Of course, if you've created a <a href="#CustomExpandedView">custom expanded
+view</a>, then updating these title and text values has no effect.)</p>
+
+
+<h3 id="Sound">Adding a sound</h3>
+
+<p>You can alert the user with the default notification sound
+(which is defined by the user) or with a sound specified by your application.</p>
+
+<p>To use the user's default sound, add "DEFAULT_SOUND" to the <var>defaults</var> field:</p>
+<pre>
+notification.defaults |= Notification.DEFAULT_SOUND;
+</pre>
+
+<p>To use a different sound with your notifications, pass a Uri reference to the
+<var>sound</var> field.
+The following example uses a known audio file saved to the device SD card:</p>
+<pre>
+notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
+</pre>
+
+<p>In the next example, the audio file is chosen from the internal
+{@link android.provider.MediaStore.Audio.Media MediaStore}'s {@link android.content.ContentProvider}:</p>
+<pre>
+notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
+</pre>
+
+<p>In this case, the exact ID of the media file ("6") is known and appended to the content
+{@link android.net.Uri}. If you don't know the exact ID, you must query all the
+media available in the MediaStore with a {@link android.content.ContentResolver}.
+See the <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>
+documentation for more information on using a ContentResolver.</p>
+
+<p>If you want the sound to continuously repeat until the user responds to the notification
+or the notification is cancelled, add "FLAG_INSISTENT" to the <var>flags</var> field.</p>
+
+<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
+"DEFAULT_SOUND", then the default sound overrides any sound defined by the <var>sound</var> field.</p>
+
+
+<h3 id="Vibration">Adding vibration</h3>
+
+<p>You can alert the user with the the default
+vibration pattern or with a vibration pattern defined by your application.</p>
+
+<p>To use the default pattern, add "DEFAULT_VIBRATE" to the <var>defaults</var> field:</p>
+<pre>
+notification.defaults |= Notification.DEFAULT_VIBRATE;
+</pre>
+
+<p>To define your own vibration pattern, pass an array of <em>long</em> values to the
+<var>vibrate</var> field:</p>
+<pre>
+long[] vibrate = {0,100,200,300};
+notification.vibrate = vibrate;
+</pre>
+
+<p>The long array defines the alternating pattern for the length of vibration off and on
+(in milliseconds). The first value is how long to wait (off) before beginning, the second
+value is the length of the first vibration, the third is the next length off, and so on.
+The pattern can be as long as you like, but it can't be set to repeat.
+</p>
+
+<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
+"DEFAULT_VIBRATE", then the default vibration overrides any vibration defined by the
+<var>vibrate</var> field.</p>
+
+
+<h3 id="Lights">Adding flashing lights</h3>
+
+<p>To alert the user by flashing LED lights, you can implement the default
+light pattern (if available), or define your own color and pattern for the lights.</p>
+
+<p>To use the default light setting, add "DEFAULT_LIGHTS" to the <var>defaults</var> field:</p>
+<pre>
+notification.defaults |= Notification.DEFAULT_LIGHTS;
+</pre>
+
+<p>To define your own color and pattern, define a value for the <var>ledARGB</var> field
+(for the color), the <var>ledOffMS</var> field (length of time, in milliseconds, to
+keep the light off), the <var>ledOnMS</var> (length of time, in milliseconds, to keep the light on),
+and also add "FLAG_SHOW_LIGHTS" to the <var>flags</var> field:</p>
+<pre>
+notification.ledARGB = 0xff00ff00;
+notification.ledOnMS = 300;
+notification.ledOffMS = 1000;
+notification.flags |= Notification.FLAG_SHOW_LIGHTS;
+</pre>
+
+<p>In this example, the green light repeatedly flashes on for 300 milliseconds and
+turns off for one second. Not every color in the spectrum is supported by the
+device LEDs, and not every device supports the same colors, so the hardware
+estimates to the best of its ability. Green is the most common notification color.</p>
+
+
+<h3 id="More">More features</h3>
+
+<p>You can add several more features to your notifications
+using Notification fields and flags. Some useful features include the following:</p>
+
+<dl>
+ <dt>"FLAG_AUTO_CANCEL" flag</dt>
+ <dd>Add this to the <var>flags</var> field to automatically cancel the notification
+ after it is selected from the Notifications window.</dd>
+ <dt>"FLAG_INSISTENT" flag</dt>
+ <dd>Add this to the <var>flags</var> field to repeat the audio until the
+ user responds.</dd>
+ <dt>"FLAG_ONGOING_EVENT" flag</dt>
+ <dd>Add this to the <var>flags</var> field to group the notification under the "Ongoing"
+ title in the Notifications window. This indicates that the application is on-going &mdash;
+ its processes is still running in the background, even when the application is not
+ visible (such as with music or a phone call).</dd>
+ <dt>"FLAG_NO_CLEAR" flag</dt>
+ <dd>Add this to the <var>flags</var> field to indicate that the notification should
+ <em>not</em> be cleared by the "Clear notifications" button. This is particularly useful if
+ your notification is on-going.</dd>
+ <dt><var>number</var> field</dt>
+ <dd>This value indicates the current number of events represented by the notification.
+ The appropriate number is overlayed on top of the status bar icon.
+ If you intend to use this field, then you must start with "1" when the Notification is first
+ created. (If you change the value from zero to anything greater during an update, the number
+ is not shown.)</dd>
+ <dt><var>iconLevel</var> field</dt>
+ <dd>This value indicates the current level of a
+ {@link android.graphics.drawable.LevelListDrawable} that is used for the notification icon.
+ You can animate the icon in the status bar by changing this value to correlate with the
+ drawable's defined in a LevelListDrawable. See the {@link android.graphics.drawable.LevelListDrawable}
+ reference for more information.</dd>
+</dl>
+
+<p>See the {@link android.app.Notification} class reference for more information about additional
+features that you can customize for your application.</p>
+
+
+<h2 id="CustomExpandedView">Creating a Custom Expanded View</h2>
+
+<img src="{@docRoot}images/custom_message.png" alt="" style="float:right;" />
+
+<p>By default, the expanded view used in the "Notifications" window includes a basic title and text
+message. These are defined by the <var>contentTitle</var> and <var>contentText</var>
+parameters of the {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} method. However, you can also define a custom layout for the expanded view using
+{@link android.widget.RemoteViews}. The screenshot to the right shows an example of a
+custom expanded view that uses an ImageView and TextView in a LinearLayout.</p>
+
+<p>To define your own layout for the expanded message,
+instantiate a {@link android.widget.RemoteViews} object and
+pass it to the <var>contentView</var> field of your Notification. Pass the
+{@link android.app.PendingIntent} to the <var>contentIntent</var> field.</p>
+
+<p>Creating a custom expanded view is best understood with an example:</p>
+
+<ol>
+ <li>Create the XML layout for the expanded view.
+ For example, create a layout file called <code>custom_notification_layout.xml</code> and
+ build it like so:
+<pre>
+&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="3dp"
+ >
+ &lt;ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="10dp"
+ />
+ &lt;TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:textColor="#000"
+ />
+&lt;/LinearLayout>
+</pre>
+
+ <p>This layout is used for the expanded view,
+ but the content of the ImageView and TextView still needs to be defined by the applicaiton.
+ RemoteViews offers some convenient methods that allow you to define this content...</p>
+ </li>
+
+ <li>In the application code, use the RemoveViews
+ methods to define the image and text. Then pass the RemoteViews object to the <var>contentView</var>
+ field of the Notification, as shown in this example:
+<pre>
+RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
+contentView.setImageViewResource(R.id.image, R.drawable.notification_image);
+contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");
+notification.contentView = contentView;
+</pre>
+
+ <p>As shown here, pass the applicaiton's package name and the layout
+ resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView,
+ using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()}
+ and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}.
+ In each case, pass the reference ID of the appropriate View object that you want to set, along with
+ the value for that View. Finally, the RemoteViews object is passed to the Notification in the
+ <var>contentView</var> field.</p>
+ </li>
+
+ <li>Because you don't need the
+ {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+ setLatestEventInfo()} method when using a custom view, you must define the Intent for the Notification
+ with the <var>contentIntent</var> field, as in this example:
+<pre>
+Intent notificationIntent = new Intent(this, MyClass.class);
+PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+notification.contentIntent = contentIntent;
+</pre>
+ </li>
+
+ <li>The notification can now be sent as usual:
+ <pre>mNotificationManager.notify(CUSTOM_VIEW_ID, notification);</pre>
+ </li>
+</ol>
+
+
+<p>The RemoteViews class also includes methods that you can use to easily add a
+{@link android.widget.Chronometer} or {@link android.widget.ProgressBar}
+in your notification's expanded view. For more information about creating custom layouts with
+RemoteViews, refer to the {@link android.widget.RemoteViews} class reference.</p>
+
+<p class="warning"><strong>Note:</strong>
+When creating a custom expanded view, you must take special care to ensure that your
+custom layout functions properly in different device orientations and resolutions. While this
+advice applies to all View layouts created on Android, it is especially important in this case
+because your layout real estate is very restricted. So don't make your custom layout too
+complex and be sure to test it in various configurations.</p>
+
+
+
+
diff --git a/docs/html/guide/topics/ui/notifiers/toasts.jd b/docs/html/guide/topics/ui/notifiers/toasts.jd
new file mode 100644
index 0000000..a800c3c
--- /dev/null
+++ b/docs/html/guide/topics/ui/notifiers/toasts.jd
@@ -0,0 +1,154 @@
+page.title=Creating Toast Notifications
+parent.title=Notifying the User
+parent.link=index.html
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.widget.Toast}</li>
+ </ol>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Basics">The Basics</a></li>
+ <li><a href="#Position">Positioning your Toast</a></li>
+ <li><a href="#CustomToastView">Creating a Custom Toast View</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>A toast notificaiton is a message that pops up on the surface of the window.
+It only fills the amount of space required for the message and the user's current
+activity remains visible and interactive. The notification automatically fades in and
+out, and does not accept interaction events.</p>
+
+<p>The screenshot below shows an example toast notification from the Alarm application.
+Once an alarm is turned on, a toast is displayed to assure you that the
+alarm was set.</p>
+<img src="{@docRoot}images/toast.png" alt="" />
+
+<p>A toast can be created and displayed from an {@link android.app.Activity} or
+{@link android.app.Service}. If you create a toast notification from a Service, it
+appears in front of the Activity currently in focus.</p>
+
+<p>If user response to the notification is required, consider using a
+<a href="notifications.html">Status Bar Notification</a>.</p>
+
+
+<h2 id="Basics">The Basics</h2>
+
+<p>First, instantiate a {@link android.widget.Toast}
+object with one of the {@link android.widget.Toast#makeText(Context,int,int) makeText()} methods.
+This method takes three parameters: the application {@link android.content.Context},
+the text message, and the duration for the toast. It returns a properly initialized Toast
+object. You can display the toast notification with {@link android.widget.Toast#show()},
+as shown in the following example:</p>
+
+<pre>
+Context context = getApplicationContext();
+CharSequence text = "Hello toast!";
+int duration = Toast.LENGTH_SHORT;
+
+Toast toast = Toast.makeText(context, text, duration);
+toast.show();
+</pre>
+
+<p>This example demonstrates everything you need for most toast notifications.
+You should rarely need anything else. You may, however, want to position the
+toast differently or even use your own layout instead of a simple text message.
+The following sections describe how you can do these things.</p>
+
+<p>You can also chain your methods and avoid holding on to the Toast object, like this:</p>
+<pre>Toast.makeText(context, text, duration).show();</pre>
+
+
+<h2 id="Positioning">Positioning your Toast</h2>
+
+<p>A standard toast notification appears near the bottom of the screen, centered horizontally.
+You can change this position with the {@link android.widget.Toast#setGravity(int,int,int)}
+method. This accepts three parameters: a {@link android.view.Gravity} constant,
+an x-position offset, and a y-position offset.</p>
+
+<p>For example, if you decide that the toast should appear in the top-left corner, you can set the
+gravity like this:</p>
+<pre>
+toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
+</pre>
+
+<p>If you want to nudge the position to the right, increase the value of the second parameter.
+To nudge it down, increase the value of the last parameter.
+
+
+<h2 id="CustomToastView">Creating a Custom Toast View</h2>
+
+<img src="{@docRoot}images/custom_toast.png" alt="" style="float:right" />
+
+<p>If a simple text message isn't enough, you can create a customized layout for your
+toast notification. To create a custom layout, define a View layout,
+in XML or in your application code, and pass the root {@link android.view.View} object
+to the {@link android.widget.Toast#setView(View)} method.</p>
+
+<p>For example, you can create the layout for the toast visible in the screenshot to the right
+with the following XML (saved as <em>toast_layout.xml</em>):</p>
+<pre>
+&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/toast_layout_root"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="10dp"
+ android:background="#DAAA"
+ >
+ &lt;ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="10dp"
+ />
+ &lt;TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:textColor="#FFF"
+ />
+&lt;/LinearLayout>
+</pre>
+
+<p>Notice that the ID of the LinearLayout element is "toast_layout". You must use this
+ID to inflate the layout from the XML, as shown here:</p>
+
+<pre>
+LayoutInflater inflater = getLayoutInflater();
+View layout = inflater.inflate(R.layout.toast_layout,
+ (ViewGroup) findViewById(R.id.toast_layout_root));
+
+ImageView image = (ImageView) layout.findViewById(R.id.image);
+image.setImageResource(R.drawable.android);
+TextView text = (TextView) layout.findViewById(R.id.text);
+text.setText("Hello! This is a custom toast!");
+
+Toast toast = new Toast(getApplicationContext());
+toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
+toast.setDuration(Toast.LENGTH_LONG);
+toast.setView(layout);
+toast.show();
+</pre>
+
+<p>First, retrieve the {@link android.view.LayoutInflater} with
+{@link android.app.Activity#getLayoutInflater()}
+(or {@link android.content.Context#getSystemService(String) getSystemService()}),
+and then inflate the layout from XML using
+{@link android.view.LayoutInflater#inflate(int, ViewGroup)}. The first parameter
+is the layout resource ID and the second is the root View. You can use
+this inflated layout to find more View objects in the layout, so now capture and
+define the content for the ImageView and TextView elements. Finally, create
+a new Toast with {@link android.widget.Toast#Toast(Context)} and set some properties
+of the toast, such as the gravity and duration. Then call
+{@link android.widget.Toast#setView(View)} and pass it the inflated layout.
+You can now display the toast with your custom layout by calling
+{@link android.widget.Toast#show()}.</p>
+
+<p class="note"><strong>Note:</strong> Do not use the public constructor for a Toast
+unless you are going to define the layout with {@link android.widget.Toast#setView(View)}.
+If you do not have a custom layout to use, you must use
+{@link android.widget.Toast#makeText(Context,int,int)} to create the Toast.</p>
+
diff --git a/docs/html/guide/tutorials/hello-world.jd b/docs/html/guide/tutorials/hello-world.jd
index f277b10..4d1e9cd 100644
--- a/docs/html/guide/tutorials/hello-world.jd
+++ b/docs/html/guide/tutorials/hello-world.jd
@@ -1,6 +1,21 @@
page.title=Hello, World
@jd:body
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#avd">Create an AVD</a></li>
+ <li><a href="#create">Create the Project</a></li>
+ <li><a href="#ui">Construct the UI</a></li>
+ <li><a href="#run">Run the Code</a></li>
+ <li><a href="#upgrading">Upgrade the UI to an XML Layout</a></li>
+ <li><a href="#debugging">Debug Your Project</a></li>
+ <li><a href="#noeclipse">Creating the Project Without Eclipse</a></li>
+ </ol>
+ </div>
+</div>
+
<p>As a developer, you know that the first impression
of a development framework is how easy it is to write "Hello,
World." Well, on Android, it's pretty easy.
@@ -19,56 +34,63 @@ here when you've completed the installation.</p>
<h2 id="avd">Create an AVD</h2>
-<p class="note"><strong>Note:</strong> If you're developing with an Android SDK older
-than the one provided for Android 1.5, you can skip this step and continue with
-<a href="#create">Create the Project</a>.</p>
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>To learn more about how to use AVDs and the options
+ available to you, refer to the
+ <a href="{@docRoot}guide/developing/tools/avd.html">Android
+ Virtual Devices</a> document.</p>
+ </div>
+</div>
-<p>In this tutorial, you will run your applicion in the Android Emulator.
+<p>In this tutorial, you will run your application in the Android Emulator.
Before you can launch the emulator, you must create an
Android Virtual Device (AVD). An AVD defines the system image and
device settings used by the emulator.</p>
-<p>To create an AVD, use the <code>android</code> tool provided in the Android SDK.
+<p>To create an AVD, use the "android" tool provided in the Android SDK.
Open a command prompt or terminal, navigate to the
-<code>/tools</code> directory in the SDK package and execute:
+<code>tools/</code> directory in the SDK package and execute:
<pre>
-android create avd --target 1 --name myavd
+android create avd --target 2 --name my_avd
</pre>
-<p>The tool now asks if you would like to create a custom hardware profile, say
-<code>no</code>. That's it. You now have an AVD and can use it to run the Emulator.</p>
+<p>The tool now asks if you would like to create a custom hardware profile.
+For the time being, press Return to skip it ("no" is the default response).
+That's it. This configures an AVD named "my_avd" that uses the Android 1.5
+platform. The AVD is now ready for use in the emulator.</p>
+
+<p>In the above command, the <code>--target</code> option is required
+and specifies the deployment target to run on the emulator.
+The <code>--name</code> option is also required and defines the
+name for the new AVD.</p>
-<p>In the above command, the <code>target</code> option is required
-and specifies the target platform for the emulator. (A target defines the system image,
-API level and supported skins. To view all available targets, execute:
-<code>android list target</code>.) The <code>name</code> option is also required
-and defines the name for the new AVD. For more information about <code>android</code>,
-see the <a href="{@docRoot}guide/developing/tools/android.html">Android Tool</a>
-documentation.</p>
-<h2 id="create">Create the Project</h2>
+<h2 id="create">Create a New Android Project</h2>
+
+<p>After you've created an AVD, the next step is to start a new
+Android project in Eclipse.</p>
<ol>
- <li><strong>Open a new Android Project.</strong>
- <p>From Eclipse, select the <strong>File &gt; New &gt; Project</strong> menu item. If the Android
- Plugin for Eclipse has been successfully installed, the resulting dialog
- should have a folder labeled "Android" which should contain a single entry:
- "Android Project". (After you create one or more Android projects, an entry for
- "Android XML File" will also be available.)</p>
- <p>Selected "Android Project" and click <strong>Next</strong>.</p>
-
- <a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a>
+ <li>From Eclipse, select <strong>File &gt; New &gt; Project</strong>.
+ <p>If the ADT
+ Plugin for Eclipse has been successfully installed, the resulting dialog
+ should have a folder labeled "Android" which should contain
+ "Android Project". (After you create one or more Android projects, an entry for
+ "Android XML File" will also be available.)</p>
+ </li>
+ <li>Selected "Android Project" and click <strong>Next</strong>.
+ <a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a>
</li>
- <li><strong>Fill out the project details.</strong>
- <p>The next screen allows you to enter the relevant details for your project:</p>
+ <li>Fill in the project details with the following values:
<ul>
<li><em>Project name:</em> HelloAndroid</li>
<li><em>Application name:</em> Hello, Android</li>
<li><em>Package name:</em> com.example.helloandroid (or your own private namespace)</li>
<li><em>Create Activity:</em> HelloAndroid</li>
- <li><em>Min SDK Version:</em> 3</li>
+ <li><em>Min SDK Version:</em> 2</li>
</ul>
<p>Click <strong>Finish</strong>.</p>
@@ -102,25 +124,34 @@ documentation.</p>
chooses, but it doesn't need to. As the checkbox suggests, this is optional, but an
Activity is almost always used as the basis for an application.</dd>
<dt><em>Min SDK Version</em></dt>
- <dd>This value specifies the API Level required by your application. With each new
+ <dd>This value specifies the minimum API Level required by your application. If the API Level
+ entered here matches the API Level provided by one of the available targets,
+ then that Build Target will be automatically selected (in this case, entering
+ "2" as the API Level will select the Android 1.1 target). With each new
version of the Android system image and Android SDK, there have likely been
additions or changes made to the APIs. When this occurs, a new API Level is assigned
to the system image to regulate which applications are allowed to be run. If an
- application requires an API Level that is higher than the level supported by the device,
- then the application is not allowed to be installed. Because the "Hello World"
- application uses APIs that have not changed since the first release, you can safely
- declare API Level "1" for the Min SDK Version, which is supported by all Android
- devices.</dd>
+ application requires an API Level that is <em>higher</em> than the level supported
+ by the device, then the application will not be installed.</dd>
</dl>
<p><em>Other fields</em>: The checkbox for "Use default location" allows you to change
- the location on disk where the project's files will be generated and stored. "Target"
- is the platform target for your application.</p>
-
+ the location on disk where the project's files will be generated and stored. "Build Target"
+ is the platform target that your application will be compiled against
+ (this should be selected automatically, based on your Min SDK Version).</p>
+
+ <p class="note">Notice that the "Build Target" you've selected uses the Android 1.1
+ platform. This means that your application will be compiled against the Android 1.1
+ platform library. If you recall, the AVD created above runs on the Android 1.5 platform.
+ These don't have to match; Android applications are forward-compatible, so an application
+ built against the 1.1 platform library will run normally on the 1.5 platform. The reverse
+ is not true.</p>
</li>
+</ul>
-<li><strong>View the generated Activity.</strong>
-<p>Open the HelloAndroid.java file, located inside <em>HelloAndroid > src >
+<p>Your Android project is now ready. It should be visible in the Package
+Explorer on the left.
+Open the <code>HelloAndroid.java</code> file, located inside <em>HelloAndroid > src >
com.example.helloandroid</em>). It should look like this:</p>
<pre>
@@ -147,8 +178,6 @@ it is where you should perform all initialization and UI setup. An activity is n
have a user interface, but usually will.</p>
<p>Now let's modify some code! </p>
-</li>
-</ol>
<h2 id="ui">Construct the UI</h2>
@@ -191,10 +220,10 @@ on. The Activity class inherits from Context, and because your
HelloAndroid class is a subclass of Activity, it is also a Context. So, you can
pass <code>this</code> as your Context reference to the TextView.</p>
-<p>Next, define the text content with
+<p>Next, you define the text content with
{@link android.widget.TextView setText(CharSequence) setText()}.</p>
-<p>Finally, pass the TextView to
+<p>Finally, you pass the TextView to
{@link android.app.Activity#setContentView(View) setContentView()} in order to
display it as the content for the Activity UI. If your Activity doesn't
call this method, then no UI is present and the system will display a blank
@@ -204,42 +233,39 @@ screen.</p>
to see it running.</p>
-<h2 id="run">Run the Code</h2>
+<h2 id="run">Run the Application</h2>
-<p>The Eclipse plugin makes it very easy to run your applications.
-Select <strong>Run > Run Configurations</strong> (in Eclipse 3.3,
-<strong>Run &gt; Open Run Dialog</strong>).</p>
+<p>The Eclipse plugin makes it very easy to run your applications:</p>
-<p>Select the "Android Application" entry, and click the icon in the
-top left corner (the one depicting a sheet of paper with a plus symbol)
-or double-click on "Android Application." You should
-have a new launcher entry named "New_configuration".</p>
-
- <a href="images/hello_world_3.png"><img src="images/hello_world_3.png" style="height:230px" alt="" /></a>
+<ol>
+ <li>Select <strong>Run > Run</strong>.</li>
+ <li>Select "Android Application".</li>
+</ol>
-<p>Change the name to something meaningful like "Android Activity." Then pick
-click the <strong>Browse</strong> button and select your HelloAndroid project. The
-plugin will automatically scan your project for Activity subclasses and add
-each one it finds to the drop-down list under "Launch Action." Because the
-HelloAndroid project only has one Activity, it will be the default Activity.
-Leave "Launch Default Activity" selected.</p>
+<div class="sidebox-wrapper">
+ <div class="sidebox-inner">
+ <p>To learn more about creating and editing run configurations in Eclipse, refer to
+ <a href="{@docRoot}guide/developing/eclipse-adt.html#RunConfig">Developing In Eclipse,
+ with ADT</a>.</p>
+ </div>
+</div>
-<p>Click the <strong>Apply</strong>, then <strong>Run</strong>. The Android Emulator
-will start and once it's booted up your application will appear. You should now
-see something like this:</p>
+<p>The Eclipse ADT will automatically create a new run configuration for your project
+and the Android Emulator will automatically launch. Once the emulator is booted up,
+your application will appear after a moment. You should now see something like this:</p>
<a href="images/hello_world_5.png"><img src="images/hello_world_5.png" style="height:230px" alt="" /></a>
<p>The "Hello, Android" you see in the grey bar is actually the application title. The Eclipse plugin
-creates this automatically (the string is defined in the /res/values/strings.xml file and referenced
-by your AndroidManifest.xml file). The text below the title is the actual text that you have
+creates this automatically (the string is defined in the <code>res/values/strings.xml</code> file and referenced
+by your <code>AndroidManifest.xml</code> file). The text below the title is the actual text that you have
created in the TextView object.</p>
-<p>That covers the basic "Hello World" tutorial, but you should continue reading for some more
+<p>That concludes the basic "Hello World" tutorial, but you should continue reading for some more
valuable information about developing Android applications.</p>
-<h2 id="upgrading">Upgrading the UI to an XML Layout</h2>
+<h2 id="upgrading">Upgrade the UI to an XML Layout</h2>
<p>The "Hello, World" example you just completed uses what is called a "programmatic"
UI layout. This means that you constructed and built your application's UI
@@ -326,7 +352,7 @@ In this case, it's the only View so you want it to take up the entire screen, wh
</table>
-<p>These XML layout files belong in the <em>res/layout/</em> directory of your project. The "res" is
+<p>These XML layout files belong in the <code>res/layout/</code> directory of your project. The "res" is
short for "resources" and the directory contains all the non-code assets that
your application requires. In addition to layout files, resources also include assets
such as images, sounds, and localized strings.</p>
@@ -348,7 +374,7 @@ existing application to use an XML layout.</p>
<ol>
<li>In the Eclipse Package Explorer, expand the
-<em>/res/layout/</em> folder and open <em>main.xml</em> (once opened, you might need to click
+<code>/res/layout/</code> folder and open <code>main.xml</code> (once opened, you might need to click
the "main.xml" tab at the bottom of the window to see the XML source). Replace the contents with
the following XML:
@@ -360,7 +386,7 @@ the following XML:
<p>Save the file.</p>
</li>
-<li>Inside the <em>/res/values</em> folder, open <em>strings.xml</em>.
+<li>Inside the <code>res/values/</code> folder, open <code>strings.xml</code>.
This is where you should save all default text strings for your user interface. If you're using Eclipse, then
ADT will have started you with two strings, <em>hello</em> and <em>app_name</em>.
Revise <em>hello</em> to something else. Perhaps "Hello, Android! I am a string resource!"
@@ -398,7 +424,7 @@ suggestions. You'll find that it helps in a lot of situations.</p>
<p>Instead of passing <code>setContentView()</code> a View object, you give it a reference
to the layout resource.
The resource is identified as <code>R.layout.main</code>, which is actually a compiled object representation of
-the layout defined in <em>/res/layout/main.xml</em>. The Eclipse plugin automatically creates this reference for
+the layout defined in <code>/res/layout/main.xml</code>. The Eclipse plugin automatically creates this reference for
you inside the project's R.java class. If you're not using Eclipse, then the R.java class will be generated for you
when you run Ant to build the application. (More about the R class in a moment.)</p>
</li>
@@ -423,7 +449,7 @@ introduction page for an overview of the <em>Dev Guide</em> documentation.</p>
<div class="special">
<h3>R class</h3>
-<p>In Eclipse, open the file named R.java (in the /gen [Generated Java Files] folder).
+<p>In Eclipse, open the file named <code>R.java</code> (in the <code>gen/</code> [Generated Java Files] folder).
It should look something like this:</p>
<pre>
@@ -445,7 +471,7 @@ public final class R {
}
</pre>
-<p>A project's R.java file is an index into all the resources defined in the
+<p>A project's <code>R.java</code> file is an index into all the resources defined in the
file. You use this class in your source code as a sort of short-hand
way to refer to resources you've included in your project. This is
particularly powerful with the code-completion features of IDEs like Eclipse
@@ -456,13 +482,13 @@ you're looking for.</p>
For now, notice the inner class named "layout", and its
member field "main". The Eclipse plugin noticed the XML
layout file named main.xml and generated a class for it here. As you add other
-resources to your project (such as strings in the <em>res/values/string.xml</em> file or drawables inside
-the <em>res/drawable/</em> direcory) you'll see R.java change to keep up.</p>
+resources to your project (such as strings in the <code>res/values/string.xml</code> file or drawables inside
+the <code>res/drawable/</code> direcory) you'll see <code>R.java</code> change to keep up.</p>
<p>When not using Eclipse, this class file will be generated for you at build time (with the Ant tool).</p>
<p><em>You should never edit this file by hand.</em></p>
</div>
-<h2 id="debugging">Debugging Your Project</h2>
+<h2 id="debugging">Debug Your Project</h2>
<p>The Android Plugin for Eclipse also has excellent integration with the Eclipse
debugger. To demonstrate this, introduce a bug into
@@ -515,9 +541,9 @@ just as you would for any other application.</p>
Thus, it's possible to
wrap those tools with another tool, such as an 'ant' build file.</p>
- <p>The Android SDK includes a toolk named "android" that can be
+ <p>The Android SDK includes a tool named "android" that can be
used to create all the source code and directory stubs for your project, as well
- as an ant-compatible build.xml file. This allows you to build your project
+ as an ant-compatible <code>build.xml</code> file. This allows you to build your project
from the command line, or integrate it with the IDE of your choice.</p>
<p>For example, to create a HelloAndroid project similar to the one created
@@ -527,18 +553,12 @@ just as you would for any other application.</p>
android create project \
--package com.android.helloandroid \
--activity HelloAndroid \
- --target 1 \
- --path <em>&lt;path-for-your-project></em>/HelloAndroid \
- --mode activity
+ --target 2 \
+ --path <em>&lt;path-to-your-project></em>/HelloAndroid
</pre>
<p>This creates the required folders and files for the project at the location
defined by the <em>path</em>.</p>
- <p>To build the project, you'd then run the command <code>ant</code>. When that command
- successfully completes, you'll be left with a file named HelloAndroid.apk under
- the "bi"' directory. That .apk file is an Android Package, and can be
- installed and run in your emulator using the 'adb' tool.</p>
-
- <p>For more information on how to use these tools, please read
+ <p>For more information on how to use the SDK tools to create and build projects, please read
<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>.</p>
diff --git a/docs/html/guide/tutorials/images/hello_world_1.png b/docs/html/guide/tutorials/images/hello_world_1.png
index 02682f4..1e5f7b0 100644
--- a/docs/html/guide/tutorials/images/hello_world_1.png
+++ b/docs/html/guide/tutorials/images/hello_world_1.png
Binary files differ
diff --git a/docs/html/guide/tutorials/images/hello_world_9.png b/docs/html/guide/tutorials/images/hello_world_9.png
index e172e63..a66526a 100644
--- a/docs/html/guide/tutorials/images/hello_world_9.png
+++ b/docs/html/guide/tutorials/images/hello_world_9.png
Binary files differ
diff --git a/docs/html/images/custom_message.png b/docs/html/images/custom_message.png
new file mode 100755
index 0000000..ea7c716
--- /dev/null
+++ b/docs/html/images/custom_message.png
Binary files differ
diff --git a/docs/html/images/custom_toast.png b/docs/html/images/custom_toast.png
new file mode 100755
index 0000000..230625a
--- /dev/null
+++ b/docs/html/images/custom_toast.png
Binary files differ
diff --git a/docs/html/images/dialog_buttons.png b/docs/html/images/dialog_buttons.png
new file mode 100755
index 0000000..81aaec4
--- /dev/null
+++ b/docs/html/images/dialog_buttons.png
Binary files differ
diff --git a/docs/html/images/dialog_custom.png b/docs/html/images/dialog_custom.png
new file mode 100755
index 0000000..b2523fd
--- /dev/null
+++ b/docs/html/images/dialog_custom.png
Binary files differ
diff --git a/docs/html/images/dialog_list.png b/docs/html/images/dialog_list.png
new file mode 100755
index 0000000..f2736bf
--- /dev/null
+++ b/docs/html/images/dialog_list.png
Binary files differ
diff --git a/docs/html/images/dialog_progress_bar.png b/docs/html/images/dialog_progress_bar.png
new file mode 100755
index 0000000..3e74419
--- /dev/null
+++ b/docs/html/images/dialog_progress_bar.png
Binary files differ
diff --git a/docs/html/images/dialog_progress_spinning.png b/docs/html/images/dialog_progress_spinning.png
new file mode 100755
index 0000000..501f4802
--- /dev/null
+++ b/docs/html/images/dialog_progress_spinning.png
Binary files differ
diff --git a/docs/html/images/dialog_singlechoicelist.png b/docs/html/images/dialog_singlechoicelist.png
new file mode 100755
index 0000000..90629f0
--- /dev/null
+++ b/docs/html/images/dialog_singlechoicelist.png
Binary files differ
diff --git a/docs/html/images/jet/clip_marker.png b/docs/html/images/jet/clip_marker.png
new file mode 100644
index 0000000..70760c0
--- /dev/null
+++ b/docs/html/images/jet/clip_marker.png
Binary files differ
diff --git a/docs/html/images/jet/event_marker.png b/docs/html/images/jet/event_marker.png
new file mode 100644
index 0000000..9cd72d2
--- /dev/null
+++ b/docs/html/images/jet/event_marker.png
Binary files differ
diff --git a/docs/html/images/jet/jc_audition_wnd.png b/docs/html/images/jet/jc_audition_wnd.png
new file mode 100755
index 0000000..43f0fb1
--- /dev/null
+++ b/docs/html/images/jet/jc_audition_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_event_wnd.png b/docs/html/images/jet/jc_event_wnd.png
new file mode 100755
index 0000000..807797e
--- /dev/null
+++ b/docs/html/images/jet/jc_event_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_main_wnd.png b/docs/html/images/jet/jc_main_wnd.png
new file mode 100755
index 0000000..29c47ec
--- /dev/null
+++ b/docs/html/images/jet/jc_main_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_moveseg_wnd.png b/docs/html/images/jet/jc_moveseg_wnd.png
new file mode 100755
index 0000000..690dcad
--- /dev/null
+++ b/docs/html/images/jet/jc_moveseg_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_open_dlg.png b/docs/html/images/jet/jc_open_dlg.png
new file mode 100755
index 0000000..0d5a14d
--- /dev/null
+++ b/docs/html/images/jet/jc_open_dlg.png
Binary files differ
diff --git a/docs/html/images/jet/jc_rep_wnd.png b/docs/html/images/jet/jc_rep_wnd.png
new file mode 100755
index 0000000..ca200d1
--- /dev/null
+++ b/docs/html/images/jet/jc_rep_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_repseg_wnd.png b/docs/html/images/jet/jc_repseg_wnd.png
new file mode 100755
index 0000000..7867902
--- /dev/null
+++ b/docs/html/images/jet/jc_repseg_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/jc_seg_wnd.png b/docs/html/images/jet/jc_seg_wnd.png
new file mode 100755
index 0000000..b0434d7
--- /dev/null
+++ b/docs/html/images/jet/jc_seg_wnd.png
Binary files differ
diff --git a/docs/html/images/jet/linear_music.png b/docs/html/images/jet/linear_music.png
new file mode 100644
index 0000000..d51fc23
--- /dev/null
+++ b/docs/html/images/jet/linear_music.png
Binary files differ
diff --git a/docs/html/images/jet/music_game.png b/docs/html/images/jet/music_game.png
new file mode 100644
index 0000000..4225794
--- /dev/null
+++ b/docs/html/images/jet/music_game.png
Binary files differ
diff --git a/docs/html/images/jet/nonlinear_music.png b/docs/html/images/jet/nonlinear_music.png
new file mode 100644
index 0000000..99d7775
--- /dev/null
+++ b/docs/html/images/jet/nonlinear_music.png
Binary files differ
diff --git a/docs/html/images/jet/sync_muteunmute.png b/docs/html/images/jet/sync_muteunmute.png
new file mode 100644
index 0000000..1238c4e
--- /dev/null
+++ b/docs/html/images/jet/sync_muteunmute.png
Binary files differ
diff --git a/docs/html/images/notifications_window.png b/docs/html/images/notifications_window.png
new file mode 100755
index 0000000..78e0c8a
--- /dev/null
+++ b/docs/html/images/notifications_window.png
Binary files differ
diff --git a/docs/html/images/status_bar.png b/docs/html/images/status_bar.png
new file mode 100755
index 0000000..420bb03
--- /dev/null
+++ b/docs/html/images/status_bar.png
Binary files differ
diff --git a/docs/html/images/toast.png b/docs/html/images/toast.png
new file mode 100644
index 0000000..223048a
--- /dev/null
+++ b/docs/html/images/toast.png
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
new file mode 100644
index 0000000..a73a09a
--- /dev/null
+++ b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
new file mode 100644
index 0000000..cd869b5
--- /dev/null
+++ b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
new file mode 100644
index 0000000..95ac031
--- /dev/null
+++ b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
new file mode 100644
index 0000000..9f0a7b0
--- /dev/null
+++ b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
new file mode 100644
index 0000000..14013dc
--- /dev/null
+++ b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
new file mode 100644
index 0000000..50a2b8c
--- /dev/null
+++ b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
new file mode 100644
index 0000000..22f99f8
--- /dev/null
+++ b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
new file mode 100644
index 0000000..591e963
--- /dev/null
+++ b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
new file mode 100644
index 0000000..c6a3f7a
--- /dev/null
+++ b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
new file mode 100644
index 0000000..ec81179
--- /dev/null
+++ b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
new file mode 100644
index 0000000..5cc8665
--- /dev/null
+++ b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
new file mode 100644
index 0000000..bad7ad1
--- /dev/null
+++ b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
Binary files differ
diff --git a/docs/html/images/widget_design/Add_Noise.png b/docs/html/images/widget_design/Add_Noise.png
new file mode 100644
index 0000000..c323bb4
--- /dev/null
+++ b/docs/html/images/widget_design/Add_Noise.png
Binary files differ
diff --git a/docs/html/images/widget_design/Layer_Style.png b/docs/html/images/widget_design/Layer_Style.png
new file mode 100644
index 0000000..7577803
--- /dev/null
+++ b/docs/html/images/widget_design/Layer_Style.png
Binary files differ
diff --git a/docs/html/images/widget_design/Music_widget_button_states.psd b/docs/html/images/widget_design/Music_widget_button_states.psd
new file mode 100644
index 0000000..17f3573
--- /dev/null
+++ b/docs/html/images/widget_design/Music_widget_button_states.psd
Binary files differ
diff --git a/docs/html/images/widget_design/alignment.png b/docs/html/images/widget_design/alignment.png
new file mode 100644
index 0000000..2e794dd
--- /dev/null
+++ b/docs/html/images/widget_design/alignment.png
Binary files differ
diff --git a/docs/html/images/widget_design/buttons.png b/docs/html/images/widget_design/buttons.png
new file mode 100644
index 0000000..a6d1df2
--- /dev/null
+++ b/docs/html/images/widget_design/buttons.png
Binary files differ
diff --git a/docs/html/images/widget_design/file_format.png b/docs/html/images/widget_design/file_format.png
new file mode 100644
index 0000000..26f0e56
--- /dev/null
+++ b/docs/html/images/widget_design/file_format.png
Binary files differ
diff --git a/docs/html/images/widget_design/landscape_sizes.png b/docs/html/images/widget_design/landscape_sizes.png
new file mode 100644
index 0000000..798bb15
--- /dev/null
+++ b/docs/html/images/widget_design/landscape_sizes.png
Binary files differ
diff --git a/docs/html/images/widget_design/portrait_sizes.png b/docs/html/images/widget_design/portrait_sizes.png
new file mode 100644
index 0000000..9da252a
--- /dev/null
+++ b/docs/html/images/widget_design/portrait_sizes.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_examples.png b/docs/html/images/widget_design/widget_examples.png
new file mode 100644
index 0000000..e27ffbb
--- /dev/null
+++ b/docs/html/images/widget_design/widget_examples.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_landscape.png b/docs/html/images/widget_design/widget_sizes_landscape.png
new file mode 100644
index 0000000..052e28e
--- /dev/null
+++ b/docs/html/images/widget_design/widget_sizes_landscape.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_portrait.png b/docs/html/images/widget_design/widget_sizes_portrait.png
new file mode 100644
index 0000000..31a240c
--- /dev/null
+++ b/docs/html/images/widget_design/widget_sizes_portrait.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index cc609a3..883170a 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -43,7 +43,7 @@ home=true
<td>
<h2 class="green">Download</h2>
<p>The Android SDK has the tools, sample code, and docs you need to create great apps. </p>
- <p><a href="{@docRoot}sdk/1.1_r1/index.html">Learn more &raquo;</a></p>
+ <p><a href="{@docRoot}sdk/{@sdkCurrent}/index.html">Learn more &raquo;</a></p>
</td>
</tr>
<tr>
@@ -119,7 +119,7 @@ home=true
'name':"SDK 1.5 r1",
'img':"sdk-large.png",
'title':"Android 1.5 SDK r1",
- 'desc': "<p>The final version of the Android 1.5 SDK is now available. It includes new APIs for Android 1.5, updated developer tools, multiple platform versions, and a Google APIs Add-on.</p><p><a href='{@docRoot}sdk/1.5_r1/index.html'>Download Android 1.5 SDK</a></p>"
+ 'desc': "<p>The final version of the Android 1.5 SDK is now available. It includes new APIs for Android 1.5, updated developer tools, multiple platform versions, and a Google APIs add-on.</p><p><a href='{@docRoot}sdk/1.5_r1/index.html'>Download Android 1.5 SDK</a></p>"
},
'mapskey': {
@@ -128,7 +128,7 @@ home=true
'name':"Maps API Key",
'img':"maps-large.png",
'title':"Maps API Key",
- 'desc':"<p>If you're writing an Android application that uses Google Maps (with MapView), you must register your application to obtain a Maps API Key. Without the key, your maps application will not work on Android devices. Obtaining a key requires just a couple of steps.</p><p><a href='{@docRoot}guide/topics/location/index.html'>Learn more...</a></p>"
+ 'desc':"<p>If you're writing an Android application that uses Google Maps (with MapView), you must register your application to obtain a Maps API Key. Without the key, your maps application will not work on Android devices. Obtaining a key requires just a couple of steps.</p><p><a href='http://code.google.com/android/add-ons/google-apis/maps-overview.html'>Learn more &raquo;</a></p>"
},
'market': {
diff --git a/docs/html/offline.jd b/docs/html/offline.jd
index 57c55c7..a42e346 100644
--- a/docs/html/offline.jd
+++ b/docs/html/offline.jd
@@ -17,8 +17,10 @@ page.title=Welcome
<p>Once you've completed the SDK installation, you can start learning about
development on the Android framework by reading the <a
href="{@docRoot}guide/index.html">Developer's Guide</a>. The SDK package
-also includes a wide variety of very helpful <a
-href="{@docRoot}samples/index.html">code samples</a>.</p>
+also includes a wide variety of code samples specific to each Android
+platform. You can find the samples at this location: </p>
+
+<p style="margin-left:2em"><code>&lt;sdk&gt;/platforms/android-&lt;version&gt;/samples/</code></p>
<p>Please note that you are currently viewing a local, offline version of the
Android developer documentation. The offline documentation offers the same
diff --git a/docs/html/publish/index.jd b/docs/html/publish/index.jd
deleted file mode 100644
index 63f2e68..0000000
--- a/docs/html/publish/index.jd
+++ /dev/null
@@ -1,5 +0,0 @@
-publish=true
-page.title=Publish Your Application
-@jd:body
-
-FIXME
diff --git a/docs/html/publish/publish_toc.cs b/docs/html/publish/publish_toc.cs
deleted file mode 100644
index c6f5c65..0000000
--- a/docs/html/publish/publish_toc.cs
+++ /dev/null
@@ -1 +0,0 @@
-<ul> <li>Publish <ul> <li><a href="">Publish</a></li> <li><a href="">Publish</a></li> </ul> </li> </ul> FIXME
diff --git a/docs/html/reference/reference_toc.cs b/docs/html/reference/reference_toc.cs
deleted file mode 100644
index 60e9d5f..0000000
--- a/docs/html/reference/reference_toc.cs
+++ /dev/null
@@ -1 +0,0 @@
-<ul> <li>API Ref <ul> <li><a href="">API Ref</a></li> <li><a href="">API Ref</a></li> </ul> </li> </ul> FIXME
diff --git a/docs/html/robots.txt b/docs/html/robots.txt
index a872944..085b79d 100644
--- a/docs/html/robots.txt
+++ b/docs/html/robots.txt
@@ -3,4 +3,5 @@ Allow: /
Disallow: /gae_shell/
Disallow: /assets/
Disallow: /images/
+Disallow: /sdk/preview/
Sitemap: http://developer.android.com/sitemap.txt
diff --git a/docs/html/sdk/1.0_r1/index.jd b/docs/html/sdk/1.0_r1/index.jd
index b6e0e9f..6ef860f 100644
--- a/docs/html/sdk/1.0_r1/index.jd
+++ b/docs/html/sdk/1.0_r1/index.jd
@@ -20,6 +20,9 @@ sdk.linux_checksum=2660b4029039b7d714e59827e9a9a11d
@jd:body
+<p>For more information on this SDK release, read the
+<a href="{@docRoot}sdk/RELEASENOTES.html#1.0_r1">Release Notes</a>.</p>
+
<h2>Included in this SDK</h2>
<h4>Development tools</h4>
diff --git a/docs/html/sdk/1.0_r1/requirements.jd b/docs/html/sdk/1.0_r1/requirements.jd
new file mode 100644
index 0000000..af06675
--- /dev/null
+++ b/docs/html/sdk/1.0_r1/requirements.jd
@@ -0,0 +1,45 @@
+page.title=System Requirements
+sdk.version=1.0_r1
+
+
+@jd:body
+
+<p>The sections below describe the system and software requirements for
+developing Android applications using the Android SDK tools included in Android 1.0 SDK, Release 1. </p>
+
+<h2>System and Software Requirements</h2>
+<p>The following systems and development environments are supported by this SDK.</p>
+
+<h4>Supported Operating Systems:</h4>
+<ul>
+ <li>Windows XP or Vista</li>
+ <li>Mac OS X 10.4.8 or later (x86 only)</li>
+ <li>Linux (tested on Linux Ubuntu Dapper Drake)</li>
+</ul>
+
+<h4>Supported Development Environments:</h4>
+<ul>
+ <li>Eclipse IDE
+ <ul>
+ <li><a href="http://www.eclipse.org/downloads/">Eclipse</a> 3.3 (Europa), 3.4 (Ganymede)
+ <ul>
+ <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included in most Eclipse IDE packages) </li>
+ <li><a href="http://www.eclipse.org/webtools">WST</a> (optional, but needed for the Android Editors feature; included in <a href="http://www.eclipse.org/downloads/moreinfo/compare.php">most Eclipse IDE packages</a>)</li>
+ </ul>
+ </li>
+ <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
+ <li><a href="installing.html#installingplugin">Android Development Tools plugin</a> (optional)</li>
+ <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
+ </ul>
+ </li>
+ <li>Other development environments or IDEs
+ <ul>
+ <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
+ <li><a href="http://ant.apache.org/">Apache Ant</a> 1.6.5 or later for Linux and Mac, 1.7 or later for Windows</li>
+ <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
+ </ul>
+ </li>
+</ul>
+
+<p class="note"><strong>Note:</strong> If JDK is already installed on your development computer, please take a moment to make sure that it meets the version requirements listed above. In
+particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development. </p> \ No newline at end of file
diff --git a/docs/html/sdk/1.0_r2/index.jd b/docs/html/sdk/1.0_r2/index.jd
index 2446c09..a1989ba 100644
--- a/docs/html/sdk/1.0_r2/index.jd
+++ b/docs/html/sdk/1.0_r2/index.jd
@@ -20,6 +20,9 @@ sdk.linux_checksum=a1f3b6d854596f850f5008856d0f380e
@jd:body
+<p>For more information on this SDK release, read the
+<a href="{@docRoot}sdk/RELEASENOTES.html#1.0_r2">Release Notes</a>.</p>
+
<h2>Included in this SDK</h2>
<h4>Development tools</h4>
diff --git a/docs/html/sdk/1.1_r1/index.jd b/docs/html/sdk/1.1_r1/index.jd
index c4a9bf0..f658216 100644
--- a/docs/html/sdk/1.1_r1/index.jd
+++ b/docs/html/sdk/1.1_r1/index.jd
@@ -1,5 +1,6 @@
page.title=Android 1.1 SDK, Release 1
+sdk.not_latest_version=true
sdk.version=1.1_r1
sdk.date=February 2009
@@ -18,6 +19,9 @@ sdk.linux_checksum=ebcb16b0cd4aef198b4dd9a1418efbf1
@jd:body
+<p>For more information on this SDK release, read the
+<a href="{@docRoot}sdk/RELEASENOTES.html#1.1_r1">Release Notes</a>.</p>
+
<h2>SDK Contents</h2>
<h4>Development tools</h4>
diff --git a/docs/html/sdk/1.1_r1/installing.jd b/docs/html/sdk/1.1_r1/installing.jd
index d5a7106..2da2479 100644
--- a/docs/html/sdk/1.1_r1/installing.jd
+++ b/docs/html/sdk/1.1_r1/installing.jd
@@ -242,7 +242,7 @@ href="{@docRoot}reference/index.html">Reference</a> tab</li>
<p><strong>Explore the SDK</strong></p>
<ul>
<li>Get an overview of the <a
-href="{@docRoot}guide/development/tools/index.html">development
+href="{@docRoot}guide/developing/tools/index.html">development
tools</a> that are available to you</li>
<li>Read the overviews of how to develop <a
href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or
diff --git a/docs/html/sdk/1.5_r1/index.jd b/docs/html/sdk/1.5_r1/index.jd
index 834ab79..89892e9 100644
--- a/docs/html/sdk/1.5_r1/index.jd
+++ b/docs/html/sdk/1.5_r1/index.jd
@@ -3,20 +3,23 @@ sdk.rel.id=1
sdk.date=April 2009
sdk.win_download=android-sdk-windows-1.5_r1.zip
-sdk.win_bytes=
-sdk.win_checksum=
+sdk.win_bytes=176263368
+sdk.win_checksum=42be980eb2d3efaced01ea6c32c0045f
sdk.mac_download=android-sdk-mac_x86-1.5_r1.zip
-sdk.mac_bytes=
-sdk.mac_checksum=
+sdk.mac_bytes=167848675
+sdk.mac_checksum=5b2a8d9f096032db4a75bfa0d689a51b
sdk.linux_download=android-sdk-linux_x86-1.5_r1.zip
-sdk.linux_bytes=
-sdk.linux_checksum=
+sdk.linux_bytes=162938845
+sdk.linux_checksum=2addfd315da0ad8b5bde6b09d5ff3b06
page.title=Android 1.5 SDK, Release 1
@jd:body
+<p>For more information on this SDK release, read the
+<a href="{@docRoot}sdk/RELEASENOTES.html#1.5_r1">Release Notes</a>.</p>
+
<h2>SDK Contents</h2>
<h4>Development tools</h4>
diff --git a/docs/html/sdk/1.5_r1/installing.jd b/docs/html/sdk/1.5_r1/installing.jd
index bd366ff..ac6af61 100644
--- a/docs/html/sdk/1.5_r1/installing.jd
+++ b/docs/html/sdk/1.5_r1/installing.jd
@@ -131,8 +131,8 @@ and click <strong>Next</strong>. </li>
<li>You should now see the new site added to the search list (and checked).
Click <strong>Finish</strong>. </li>
<li>In the subsequent Search Results dialog box, select the checkbox for the
- <strong>Android Plugin</strong>.
- This will select the nested tools: "Android DDMS" and "Android Developer Tools".
+ "Android Plugin".
+ This will select the nested tools: "Android DDMS" and "Android Development Tools".
Click <strong>Next</strong>.</li>
<li>Read and accept the license agreement, then click <strong>Next</strong>. </li>
<li>On the following Installation window, click <strong>Finish</strong>. </li>
@@ -157,7 +157,7 @@ and click <strong>Next</strong>. </li>
<li>Back in the Available Software view, you should see the plugin listed by the URL,
with "Developer Tools" nested within it. Select the checkbox next to
Developer Tools and click <strong>Install...</strong></li>
- <li>On the subsequent Install window, "Android DDMS" and "Android Developer Tools"
+ <li>On the subsequent Install window, "Android DDMS" and "Android Development Tools"
should both be checked. Click <strong>Next</strong>. </li>
<li>Read and accept the license agreement, then click <strong>Finish</strong>.</li>
<li>Restart Eclipse. </li>
@@ -250,13 +250,13 @@ begin developing applications. Here are a few ways you can get started: </p>
<a href="{@docRoot}guide/topics/fundamentals.html">Application
Fundamentals</a></li>
<li>Take a look at the Android framework API specification in the <a
- href="{@docRoot}reference/index.html">Reference</a> tab</li>
+ href="{@docRoot}reference/packages.html">Reference</a> tab</li>
</ul>
<p><strong>Explore the SDK</strong></p>
<ul>
<li>Get an overview of the <a
- href="{@docRoot}guide/developming/tools/index.html">development
+ href="{@docRoot}guide/developing/tools/index.html">development
tools</a> that are available to you</li>
<li>Read how to develop <a
href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or
diff --git a/docs/html/sdk/1.5_r1/upgrading.jd b/docs/html/sdk/1.5_r1/upgrading.jd
index 0b7312b..0a12d62 100644
--- a/docs/html/sdk/1.5_r1/upgrading.jd
+++ b/docs/html/sdk/1.5_r1/upgrading.jd
@@ -25,13 +25,17 @@ sdk.version=1.5_r1
<li><a href="#AntUsers">Ant Users</a></li>
</ol>
</li>
- <li><a href="#MigrateYourApplications">Migrate Your Applications</a></li>
+ <li><a href="#MigrateYourApplications">Migrate Your Applications</a>
+ <ol><li><a href="#FutureProofYourApps">Future-proof your apps</a></li></ol>
+ </li>
</ol>
<h2>Migrating references</h2>
<ol>
<li><a href="{@docRoot}sdk/api_diff/3/changes.html">Android 1.5 API Differences</a></li>
- <!-- <li><a href="">TODO: LINK TO DAN'S POST &raquo;</a></li> -->
+ <li><a
+href="http://android-developers.blogspot.com/2009/04/future-proofing-your-apps.html">Future-Proofing
+Your Apps &raquo;</a></li>
<li><a
href="http://android-developers.blogspot.com/2009/04/ui-framework-changes-in-android-15.html">UI
framework changes in Android 1.5 &raquo;</a></li>
@@ -151,9 +155,11 @@ uninstall procedure and continue to <a href="#installAdt">Install the 0.9 ADT pl
<li>Select the Android plugin entry by checking the box next to it,
then click <strong>Finish</strong>.
<p>(Your original entry for the plugin should still be here. If not, see the guide
- to <a href="{docRoot}sdk/1.5_r1/installing.html#installingplugin">Installing the ADT Plugin</a>.)
+ to <a href="{@docRoot}sdk/1.5_r1/installing.html#installingplugin">Installing the ADT Plugin</a>.)
</p></li>
- <li>In the results, be sure that "Developer Tools" is checked, then click <strong>Next</strong>.</li>
+ <li>In the results, expand the entry for the Android plugin and
+ be sure that "Developer Tools" is checked, then click <strong>Next</strong>.
+ (This will install "Android DDMS" and "Android Development Tools".)</li>
<li>Read and accept the license agreement, then click <strong>Next</strong>.
<li>In the next window, click <strong>Finish</strong> to start installation.</li>
<li>The ADT plugin is not digitally signed. Accept the installation anyway by clicking
@@ -167,10 +173,10 @@ uninstall procedure and continue to <a href="#installAdt">Install the 0.9 ADT pl
<li>Select <strong>Help</strong> &gt; <strong>Software Updates</strong>.</li>
<li>Select the <strong>Available Software</strong> tab.</li>
<li>Expand the entry for the Andriod plugin (may be listed as the location URL)
- and select "Developer Tools" by checking the box next to it, then click <strong>Install</strong>.
- </li>On the next window, "Android DDMS" and "Android Developer Tools"
- should both be checked. Click <strong>Next</strong>.</li>
- <li>Read and accept the license agreement, then click <strong>Finish</strong>.</li>
+ and select "Developer Tools" by checking the box next to it, then click
+ <strong>Install</strong>.</li>
+ <li>On the next window, "Android DDMS" and "Android Development Tools"
+ should both be checked. Click <strong>Finish</strong>.</li>
<li>Restart Eclipse.</li>
</ol>
</td>
@@ -330,18 +336,55 @@ your project and make any necessary changes to your code.</p>
in Eclipse, changing the "build target" to one using the Android 1.5 platform,
and see where the ADT identifies errors in your code.</p>
+
+<h3 id="FutureProofYourApps">Future-proof your apps</h3>
+
<p>There have been several API additions made for this release, but there have been
very few actual API <em>changes</em>. Only a couple (relatively unused) elements
have been removed and a few have been deprecated, so your applications written with the
-Android 1.1 system library should work just fine.
-Your application will be at highest risk of breakage if it uses Android APIs
-that are not available in the public API documentation
-or if it explicitly depends on system bugs. For information
-about changes made to Android 1.5, refer to the following documents:</p>
+Android 1.1 system library should work just fine. However,
+your application is more likely to encounter problems on Android 1.5
+if it performs any of the following:</p>
+
+<ul>
+ <li>Uses internal APIs. That is, APIs that are not officially supported
+ and not available in the reference documentation. Any un-official APIs are always subject
+ to change (which is why they're un-official) and some have indeed changed.
+ </li>
+ <li>Directly manipulates system settings. There are some settings (such as
+ GPS, data roaming, bluetooth and others) that used to be writable by
+ applications but have been changed so that they can only be explicitly modified by the user
+ through the system settings. Refer to {@link android.provider.Settings.Secure}
+ to see which settings are now secured and cannot be directly changed by your application.
+ </li>
+ <li>Uses View hierarchies that are unreasonably deep (more than 10 or so levels) or
+ broad (more than 30 total). View hierarchies this big have always been troublesome, but
+ Android 1.5 is much more efficient at exposing this and your application may crash.
+ </li>
+ <li>Makes assumptions about the available hardware. With new support for soft keyboards,
+ not all devices will have full QWERTY keyboards on the hardware. So if your application
+ listens for special keypress events that only occur on a keypad, then your application
+ should degrade gracefully when there is no keyboard available.
+ </li>
+ <li>Performs its own layout orientation changes based on the acceletometer (or via other
+ sensors). Some devices running Android 1.5 will automatically rotate the orientation
+ (and all devices have the option to turn on auto-rotation), so if your application also
+ attempts to rotate the orientation, it can result in strange behavior. In addition, if your
+ application uses the accelerometer to detect shaking and you do not want to rotate the
+ orientation, then you should lock the current orientation with
+ <a href="{@docRoot}guide/topics/manifest/activity-element.html#screen">android:screenOrientation</a>.
+ </li>
+</ul>
+
+<p>Please read our blog post on <a
+href="http://android-developers.blogspot.com/2009/04/future-proofing-your-apps.html">Future-Proofing
+Your Apps</a> for more information on the issues mentioned above.</p>
+
+<p>For information
+about other changes made to Android 1.5, refer to the following documents:</p>
<ul>
<li><a href="{@docRoot}sdk/api_diff/3/changes.html">Android 1.5 API Differences</a></li>
- <li><a href="{@docRoot}sdk/android-1.5.html#api-changes">Android 1.5 Version Notes</a></li>
- <!-- <li><a href="">TODO: LINK TO DAN'S POST ON FORWARD COMPATIBILITY &raquo;</a></li> -->
+ <li><a href="{@docRoot}sdk/android-1.5.html#api-changes">Android 1.5 Version Notes</a></li>
<li><a
href="http://android-developers.blogspot.com/2009/04/ui-framework-changes-in-android-15.html">UI
framework changes in Android 1.5 &raquo;</a></li>
diff --git a/docs/html/sdk/RELEASENOTES.jd b/docs/html/sdk/RELEASENOTES.jd
index c6a887a..ed82b6b 100644
--- a/docs/html/sdk/RELEASENOTES.jd
+++ b/docs/html/sdk/RELEASENOTES.jd
@@ -355,12 +355,12 @@ added.</p>
Development Tools (ADT) Plugin for Eclipse is <strong>0.8.0</strong>. If you are
using a previous version of ADT, you should update to the latest version for use
with this SDK. For information about how to update your ADT plugin, see <a
-href="/android/intro/upgrading.html">Upgrading the SDK</a>.</p>
+href="{@docRoot}sdk/1.0_r2/upgrading.html">Upgrading the SDK</a>.</p>
<h3>Installation and Upgrade Notes</h3>
<p>If you're installing the Android SDK for the first time, please see the
-instructions in <a href="/android/intro/installing.html">Installing the
+instructions in <a href="{@docRoot}sdk/1.0_r2/installing.html">Installing the
SDK</a>.
<h3>Other Notes</h3>
@@ -381,8 +381,8 @@ MapView for authentication to the server.</p>
<p>Developers should note that the registration service for MapView is now
active and Google Maps is actively enforcing the Maps API Key requirement. For
information about how to register for a Maps API Key, see <a
-href="http://code.google.com/android/toolbox/apis/mapkey.html">http://code.
-google.com/android/toolbox/apis/mapkey.html</a>.</p>
+href="http://code.google.com/android/add-ons/google-apis/mapkey.html">http://code.google.com/android/add-ons/google-apis/mapkey.html</a>.
+</p>
<p><strong>USB Driver for Windows</strong></p>
<p>If you using Windows and want to develop or test your application on an
@@ -407,7 +407,7 @@ do so, declare a custom resource element using a
file, then declare the attribute inside. For examples, see
&lt;sdk&gt;/samples/ApiDemos/res/values/attrs.xml. For more information about
custom resources, see <a
-href="/android/reference/available-resources.html#customresources">Custom
+href="{@docRoot}guide/topics/resources/available-resources.html#customresources">Custom
Layout Resources</a>. Note that the android.R.styleable documentation is still
provided in the SDK, but only as a reference of the platform's styleable
attributes for the various elements.</li>
@@ -437,27 +437,27 @@ to this release.</p>
<p>This SDK release is the first to include the Android 1.0 platform and application API. Applications developed on this SDK will be compatible with mobile devices running the Android 1.0 platform, when such devices are available.</p>
-<p>This release includes mainly bug fixes, although some smaller features were added. The Android 1.0 also includes several API changes from the 0.9 version. For more information on API changes, see the <a href="/android/migrating/0.9-1.0/changes-overview.html">Overview of Changes</a> and the <a href="/android/migrating/0.9-1.0/changes.html">API Differences Report</a>. For those porting from the M5 release, the SDK also includes the legacy changes overview and API Differences Reports. See the current Overview of Changes for more information. </p>
+<p>This release includes mainly bug fixes, although some smaller features were added. The Android 1.0 also includes several API changes from the 0.9 version. For those porting from the M5 release, the SDK also includes the legacy changes overview and API Differences Reports. See the current Overview of Changes for more information. </p>
<h3>ADT Plugin Compatibility</h3>
-<p>For this version of the SDK &mdash; Android 1.0 SDK, Release 1 &mdash; the compatible version of the Android Development Tools (ADT) Plugin for Eclipse is <strong>0.8.0</strong>. If you are using a previous version of ADT, you should update to the latest version for use with this SDK. For information about how to update your ADT plugin, see <a href="/android/intro/upgrading.html">Upgrading the SDK</a>.</p>
+<p>For this version of the SDK &mdash; Android 1.0 SDK, Release 1 &mdash; the compatible version of the Android Development Tools (ADT) Plugin for Eclipse is <strong>0.8.0</strong>. If you are using a previous version of ADT, you should update to the latest version for use with this SDK. For information about how to update your ADT plugin, see <a href="{@docRoot}sdk/1.0_r1/upgrading.html">Upgrading the SDK</a>.</p>
<h3>Installation and Upgrade Notes</h3>
-<p>If you've been developing an application using a previous SDK version and you want the application to run on Android-powered mobile devices, you must port the application to the Android 1.0 SDK. Please see <a href="/android/intro/upgrading.html">Upgrading the SDK</a> for detailed instructions on how to make the transition to this release. Be sure to wipe application user data (emulator option <code>-wipe-data</code>) when running your application on the Android 1.0 SDK emulator.</p>
+<p>If you've been developing an application using a previous SDK version and you want the application to run on Android-powered mobile devices, you must port the application to the Android 1.0 SDK. Please see <a href="{@docRoot}sdk/1.0_r1/upgrading.html">Upgrading the SDK</a> for detailed instructions on how to make the transition to this release. Be sure to wipe application user data (emulator option <code>-wipe-data</code>) when running your application on the Android 1.0 SDK emulator.</p>
-<p>If you're installing the Android SDK for the first time, please see the instructions in <a href="/android/intro/installing.html">Installing the SDK</a>.
+<p>If you're installing the Android SDK for the first time, please see the instructions in <a href="{@docRoot}sdk/1.0_r1/installing.html">Installing the SDK</a>.
<h3>Other Notes</h3>
<p><strong>MapView API Key</strong></p>
-<p><a href="/android/reference/com/google/android/maps/MapView.html">MapView</a> is a class that lets you easily integrate Google Maps into your application. Before you can access the maps data, you will need to register with the Google Maps service and receive a Maps API Key, which you then add to your MapView for authentication to the server.</p>
+<p>MapView is a class that lets you easily integrate Google Maps into your application. Before you can access the maps data, you will need to register with the Google Maps service and receive a Maps API Key, which you then add to your MapView for authentication to the server.</p>
<p>Currently, the registration service for MapView is not yet active and Google Maps is not yet enforcing the Maps API Key requirement. However, note that the registration service will be activated soon, so that MapViews in any application deployed to a mobile device will require registration and a valid Maps API Key. </p>
-<p>As soon as the registration service becomes available, we will update the page at <a href="http://code.google.com/android/toolbox/apis/mapkey.html">http://code.google.com/android/toolbox/apis/mapkey.html</a> with details about how and where to register. Please check that page periodically for registration information, if you are using a MapView.</p>
+<p>As soon as the registration service becomes available, we will update the page at <a href="http://code.google.com/android/add-ons/google-apis/mapkey.html">http://code.google.com/android/add-ons/google-apis/mapkey.html</a> with details about how and where to register. Please check that page periodically for registration information, if you are using a MapView.</p>
<h3>Resolved Issues, Changes</h3>
@@ -485,18 +485,6 @@ to this release.</p>
<li>SQLite is now included in the SDK package on all platforms. </li>
</ul>
-<h3>Known Issues</h3>
-
-<p><strong>JUnit and Eclipse/ADT</strong></p>
-<ul>
-<li>If you are developing in Eclipse/ADT and want to add JUnit test
-classes, you can do so. However, you need to set up a custom JUnit configuration
-before your tests will run properly. For detailed information about how to set
-up the JUnit configuration, see the troubleshooting topic <a
-href="/android/kb/troubleshooting.html#addjunit">Running a Junit test class
-in Eclipse</a>.</li>
-</ul>
-
<p><strong>Other</strong></p>
<ul>
diff --git a/docs/html/sdk/adt_download.jd b/docs/html/sdk/adt_download.jd
index 6d46297..6996906 100644
--- a/docs/html/sdk/adt_download.jd
+++ b/docs/html/sdk/adt_download.jd
@@ -18,55 +18,50 @@ page</a>.
<p>
<table>
<tr>
- <th>Version</th>
- <th>File</th>
- <th>Date</th>
- <th>Compatible SDK Versions</th>
+ <th><nobr>ADT Version</nobr></th>
+ <th>Package</th>
+ <th>Size</th>
+ <th>Md5 Checksum</th>
<th>Notes</th>
</tr>
<tr>
<td style="background-color:#ffcccc;">0.9.0</td>
<td style="background-color:#ffcccc;"><a href="http://dl-ssl.google.com/android/ADT-0.9.0.zip">ADT-0.9.0.zip</a></td>
- <td style="background-color:#ffcccc;"><nobr>27 April 2009</nobr></td>
- <td style="background-color:#ffcccc;"><nobr>Android 1.5 SDK</td>
- <td style="background-color:#ffcccc;"><nobr>Required for users of Android 1.5 SDK (and later releases)<br /> </td>
+ <td style="background-color:#ffcccc;"><nobr>2889330 bytes</nobr></td>
+ <td style="background-color:#ffcccc;"><nobr>4f4c4ece3071cf65bbd4e5da7bbde8af</nobr></td>
+ <td style="background-color:#ffcccc;"><nobr>Required for users of Android 1.5 SDK (and later releases). <em><nobr>27 Apr 2009</nobr></em></td>
</tr>
<tr>
<td>0.8.0</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.8.0.zip">ADT-0.8.0.zip</a></td>
- <td style="background-color:#ffcccc;"><nobr>23 September 2008</nobr></td>
- <td style="background-color:#ffcccc;"><nobr>Android 1.1 SDK<br/>Android 1.0 SDK<br/></td>
- <td style="background-color:#ffcccc;"><nobr>Required for users of Android 1.1 SDK and Android 1.0 SDK<br /> </td>
+ <td colspan="2"><nobr>&nbsp;</nobr></td>
+ <td><nobr>Required for users of Android 1.1 SDK and Android 1.0 SDK. <em><nobr>23 Sep 2008</nobr></em></td>
</tr>
<tr>
<td>0.7.1</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.7.1.zip">ADT-0.7.1.zip</a></td>
- <td>18 Aug 2008</td>
- <td>Android 0.9 SDK beta</td>
+ <td colspan="2"><nobr>&nbsp;</nobr></td>
<td>Required for users of Android 0.9 SDK beta. As of this version, <b>Eclipse 3.2 is no longer supported.</b>
- Please upgrade to Eclipse Ganymede (3.4) or Europa (3.3) if you are still using 3.2. </td>
+ Please upgrade to Eclipse Ganymede (3.4) or Europa (3.3) if you are still using 3.2. <em><nobr>18 Aug 2008</nobr></em></td>
</tr>
<tr>
<td>0.4.0</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.4.0.zip">ADT-0.4.0.zip</a></td>
- <td>12 Feb 2008</td>
- <td>m5-rc14</td>
- <td>Required if you are using the M5 SDK. See the SDK Release Notes for details on changes and enhancements in this version.</td>
+ <td colspan="2"><nobr>&nbsp;</nobr></td>
+ <td>Required if you are using the M5 SDK. See the SDK Release Notes for details on changes and enhancements in this version. <em><nobr>12 Feb 2008</nobr></em></td>
</tr>
<tr>
<td>0.3.3</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.3.3.zip">ADT-0.3.3.zip</a></td>
- <td>14 Dec 2007</td>
- <td>m3-rc37</td>
- <td>Some significant enhancements (see SDK Release Notes).</td>
+ <td colspan="2"><nobr>&nbsp;</nobr></td>
+ <td>Some significant enhancements (see m3-rc37 SDK Release Notes). <em><nobr>14 Dec 2007</nobr></em></td>
</tr>
<tr>
<td>0.3.1</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.3.1.zip">ADT-0.3.1.zip</a></td>
- <td>21 Nov 2007</td>
- <td>m3-rc20, m3-rc22</td>
- <td>Initial Release.</td>
+ <td colspan="2"><nobr>&nbsp;</nobr></td>
+ <td>Initial Release. Required for Android m3-rc20 SDK and Android m3-rc22 SDK.<em><nobr>21 Nov 2007</nobr></em></td>
</tr>
</table>
</p>
diff --git a/docs/html/sdk/android-1.5-highlights.jd b/docs/html/sdk/android-1.5-highlights.jd
index 46022d1..e6c4f88 100644
--- a/docs/html/sdk/android-1.5-highlights.jd
+++ b/docs/html/sdk/android-1.5-highlights.jd
@@ -11,13 +11,13 @@ sdk.version=1.5_r1
The list below provides an overview of the changes. </p>
<ul>
-<li><a href="#ui">UI Localizations</a>
-<li><a href="#perf">Resolved Issues</a>
-<li><a href="#features">Android 1.5 Platform Highlights</a>
-<li><a href="#apis">New APIs and manifest elements</a>
+<li><a href="#ui">User Interface Refinements</a>
+<li><a href="#perf">Performance Improvements</a>
+<li><a href="#features">New Features</a>
+<li><a href="#apis">New APIs and Manifest Elements</a>
</ul>
-<h2 id="ui">User interface refinements</h4>
+<h2 id="ui">User Interface Refinements</h2>
<ul>
<li>System-wide:
<ul>
@@ -41,7 +41,7 @@ The list below provides an overview of the changes. </p>
</li>
</ul>
-<h2 id="perf">Performance improvements</h2>
+<h2 id="perf">Performance Improvements</h2>
<ul>
<li>Faster Camera start-up and image capture</li>
@@ -50,7 +50,7 @@ The list below provides an overview of the changes. </p>
<li>Speedier GMail conversation list scrolling</li>
</ul>
-<h4 id="features">New features</h4>
+<h2 id="features">New Features</h2>
<ul>
<li>On-screen soft keyboard
@@ -130,7 +130,7 @@ included in the Android SDK)
</li>
</ul>
-<h4 id="apis">New APIs and manifest elements</h4>
+<h2 id="apis">New APIs and Manifest Elements</h2>
<ul>
<li>UI framework
@@ -143,11 +143,15 @@ included in the Android SDK)
<li>AppWidget framework
<ul>
- <li>APIs for creating secure home screen {@link android.appwidget app
- widgets}. Also see the <a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">Introducing home screen widgets and the AppWidget
- framework.</li>
+ <li>APIs for creating secure home screen {@link android.appwidget
+AppWidgets}. For information about how to use AppWidgets, see the Developer's
+Guide <a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a>
+documentation. Also see <a
+href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">
+Introducing home screen widgets and the AppWidget
+framework</a> on the Android Developer's Blog.</li>
<li>APIs for populating {@link android.provider.LiveFolders Live Folders}
-with custom content.</li>
+ with custom content.</li>
</ul>
</li>
@@ -185,11 +189,11 @@ continue only if the required hardware is present.</p>
<li>Speech recognition framework
<ul>
<li>Support for using speech recognition libraries via Intent. See {@link
-android.speech.RecognizerIntent Speech Recognition}.</li>
+android.speech.RecognizerIntent RecognizerIntent}.</li>
</ul>
</li>
-<li>Misc API additions
+<li>Miscellaneous API additions
<ul>
<li>LocationManager - Applications can get location change updates via
Intent</li>
diff --git a/docs/html/sdk/android-1.5.jd b/docs/html/sdk/android-1.5.jd
index c9ab42e..df52b62 100644
--- a/docs/html/sdk/android-1.5.jd
+++ b/docs/html/sdk/android-1.5.jd
@@ -16,8 +16,7 @@ sys.date=April 2009
<li><a href="#comp">Device Compatibility</a>
<li><a href="#apps">Built-in Applications</a>
<li><a href="#locs">UI Localizations</a>
-<!-- <li><a href="#resolved-issues">Resolved Issues</a> -->
-<li><a href="#features">Android 1.5 Platform Highlights</a>
+<li><a href="#features">New Features</a>
<li><a href="#api-changes">API Changes</a>
</ul>
@@ -140,7 +139,9 @@ a default version of the language is used. The languages that will be
available in the Android 1.5 system image are listed below (with
<em>language</em>_<em>country/region</em> locale descriptor).</p>
-<div class="g-unit g-first" style="whitespace:nowrap;width:35%;">
+<table style="border:0;">
+<tr>
+<td style="border:0">
<ul>
<li>Chinese, PRC (zh_CN)</li>
<li>Chinese, Taiwan (zh_TW)</li>
@@ -154,9 +155,10 @@ available in the Android 1.5 system image are listed below (with
<li>English, New Zealand (en_NZ)</li>
<li>English, Singapore(en_SG)</li>
<li>French, France (fr_FR)</li>
-</div>
-<div class="g-unit" style="whitespace:nowrap;">
<li>French, Belgium (fr_BE)</li>
+</ul>
+</td>
+<td style="border:0;padding-left:5em;">
<li>French, Canada (fr_CA)</li>
<li>French, Switzerland (fr_CH)</li>
<li>German, Germany (de_DE)</li>
@@ -170,19 +172,13 @@ available in the Android 1.5 system image are listed below (with
<li>Polish (pl_PL)</li>
<li>Russian (ru_RU)</li>
<li>Spanish (es_ES)</li>
-</ul>
-</div>
+</td>
+</tr>
+</table>
<p>Localized UI strings match the locales that are displayable in
the emulator, accessible through the device Settings application.</p>
-<!--
-<h2 id="resolved-issues">Resolved Issues</h2>
-<ul>
-<li><font color="red"><strong></strong></font></li>
-</ul>
--->
-
<h2 id="features">New Features</h2>
<p>For a list of new system features, see the <a
@@ -194,20 +190,29 @@ Highlights</a> document.</p>
<h3>Overview</strong></h3>
<ul>
- <li>UI framework</li>
+<li>UI framework</li>
<ul>
<li>Framework for easier background/UI thread interaction</li>
- <li>New SlidingDrawer widget</li>
- <li>Horizontal ScrollView widget</li>
+ <li>New {@link android.widget.SlidingDrawer SlidingDrawer} widget</li>
+ <li>New {@link android.widget.HorizontalScrollView HorizontalScrollview} widget</li>
</ul>
+</li>
- <li>Home Screen framework</li>
+<li>AppWidget framework
<ul>
- <li>APIs for creating secure home screen widgets</li>
- <li>APIs for populating live folders with custom content</li>
+ <li>APIs for creating secure home screen {@link android.appwidget
+AppWidgets}. For information about how to use AppWidgets, see the Developer's
+Guide <a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a>
+documentation. Also see <a
+href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">
+Introducing home screen widgets and the AppWidget
+framework</a> on the Android Developer's Blog.</li>
+ <li>APIs for populating {@link android.provider.LiveFolders Live Folders}
+ with custom content.</li>
</ul>
+</li>
- <li>Media framework</li>
+<li>Media framework</li>
<ul>
<li>Raw audio recording and playback APIs</li>
<li>Interactive MIDI playback engine</li>
@@ -215,40 +220,53 @@ Highlights</a> document.</p>
<li>Video and photo sharing Intents</li>
<li>Media search Intent</li>
</ul>
- <li>Input Method framework </li>
+</li>
+
+<li>Input Method framework
<ul>
- <li>Text prediction engine</li>
+ <li>{@link android.inputmethodservice.InputMethodService Input Method
+ Service} framework</li>
+ <li>Text-prediction engine</li>
<li>Ability to provide downloadable IMEs to users</li>
</ul>
+</li>
+
<li>Application-defined hardware requirements
-<p>Applications can now use a new element in their manifest files, <a
-href="{@docRoot}guide/topics/manifest/uses-configuration-element.html">
-&lt;uses-configuration&gt;</a> to indicate to the Android system what hardware
-features they require in order to function properly. For example, an application
-might use the element to specify that it requires a physical keyboard or a
-particular navigation device, such as a trackball. Prior to installing the
-application, the Android system checks the attributes defined for the
+ <p>Applications can now use a new element in their manifest files, <a
+href="{@docRoot}guide/topics/manifest/uses-configuration-element.html">&lt;uses-
+configuration&gt;</a> to indicate to the Android system what hardware features
+they require in order to function properly. For example, an application might
+use the element to specify that it requires a physical keyboard or a particular
+navigation device, such as a trackball. Prior to installing the application, the
+Android system checks the attributes defined for the
<code>&lt;uses-configuration&gt;</code> element and allows the installation to
-continue only if the required hardware is present.</p></li>
- <li>Speech recognition framework</li>
+continue only if the required hardware is present.</p>
+</li>
+
+<li>Speech recognition framework
<ul>
- <li>Support for using speech recognition libraries via Intent</li>
+ <li>Support for using speech recognition libraries via Intent. See {@link
+android.speech.RecognizerIntent RecognizerIntent}.</li>
</ul>
- <li>Misc API additions</li>
+</li>
+
+<li>Miscellaneous API additions
<ul>
- <li> LocationManager - Applications can get location change updates via
-Intent</li>
+ <li>LocationManager - Applications can get location change updates via
+ Intent</li>
<li>WebView - Touch start/end/move/cancel DOM event support</li>
- <li>SensorManager - redesigned sensor APIs</li>
+ <li>Redesigned {@link android.hardware.SensorManager Sensor Manager
+ APIs}</li>
<li>GLSurfaceView - convenience framework for creating OpenGL
-applications</li>
+ applications</li>
<li>Broadcast Intent for app update install succeeded - for smoother app
-upgrade experience</li>
+ upgrade experience</li>
</ul>
+</li>
</ul>
-<h3>API Change Details</h3>
+<h3 id="api-diff">API Change Details</h3>
<p>For a detailed view of API changes in this platform (API Level 3), see the <a
href="{@docRoot}sdk/api_diff/3/changes.html">API Differences Report</a>.</p>
diff --git a/docs/html/sdk/download.jd b/docs/html/sdk/download.jd
index 3c4f06b..1712ae6 100644
--- a/docs/html/sdk/download.jd
+++ b/docs/html/sdk/download.jd
@@ -3,7 +3,7 @@ hide_license_footer=true
@jd:body
-<script language="javascript">
+<script type="text/javascript">
function verify() {
document.getElementById('download-button').disabled = !document.getElementById('checkbox').checked;
}
@@ -68,7 +68,7 @@ The License Agreement constitutes a contract between you and Google with respect
<p>If you want to re-read the license agreement, it's available to you in the <em>SDK</em> tab.</p>
</div>
-<script language="javascript">
+<script type="text/javascript">
var loc = window.location.href;
var filename = loc.substring(loc.indexOf('=')+1,loc.length);
version = filename.substring(filename.indexOf('.')-1,filename.lastIndexOf('.'));
diff --git a/docs/html/sdk/preview/features.html b/docs/html/sdk/preview/features.html
new file mode 100644
index 0000000..392c089
--- /dev/null
+++ b/docs/html/sdk/preview/features.html
@@ -0,0 +1,202 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<html>
+
+ <head>
+ <title>Redirecting...</title>
+ <meta http-equiv="refresh" content="0;url=/sdk/android-1.5-highlights.html">
+ <link href="/assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body class="gc-documentation">
+<a name="top"></a>
+
+ <div id="header">
+ <div id="headerLeft">
+ <a href="/index.html" tabindex="-1"><img
+ src="/assets/images/bg_logo.png" alt="Android Developers" /></a>
+ <ul class="sdk">
+ <li id="home-link"><a href="/index.html">
+ <span>Home</span></a></li>
+ <li id="sdk-link"><a href="/sdk/1.5_r1/index.html"><span>SDK</span></a></li>
+ <li id="guide-link"><a href="/guide/index.html"
+ onClick="return loadLast('guide')"><span>Dev Guide</span></a></li>
+ <li id="reference-link"><a href="/reference/packages.html"
+ onClick="return loadLast('reference')"><span>Reference</span></a></li>
+ <li><a href="http://android-developers.blogspot.com"><span>Blog</span></a></li>
+ <li id="community-link"><a href="/community/index.html"><span>Community</span></a></li>
+ </ul>
+ </div>
+ <div id="headerRight">
+ <div id="headerLinks">
+ <!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+ <span class="text">
+ <!-- &nbsp;<a href="#">English</a> | -->
+ <a href="http://www.android.com">Android.com</a>
+ </span>
+ </div>
+ <div id="search" >
+ <div id="searchForm">
+ <form accept-charset="utf-8" class="gsc-search-box"
+ onsubmit="return submit_search()">
+ <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody>
+ <tr>
+ <td class="gsc-input">
+ <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off"
+ title="search developer docs" name="q"
+ value="search developer docs"
+ onFocus="search_focus_changed(this, true)"
+ onBlur="search_focus_changed(this, false)"
+ onkeydown="return search_changed(event, true, '/')"
+ onkeyup="return search_changed(event, false, '/')" />
+ <div id="search_filtered_div" class="no-display">
+ <table id="search_filtered" cellspacing=0>
+ </table>
+ </div>
+ </td>
+ <td class="gsc-search-button">
+ <input type="submit" value="Search" title="search" id="search-button" class="gsc-search-button" />
+ </td>
+ <td class="gsc-clear-button">
+ <div title="clear results" class="gsc-clear-button">&nbsp;</div>
+ </td>
+ </tr></tbody>
+ </table>
+ </form>
+ </div><!-- searchForm -->
+ </div><!-- search -->
+ </div><!-- headerRight -->
+ </div><!-- header -->
+
+
+ <div class="g-section g-tpl-240" id="body-content">
+ <div class="g-unit g-first not-resizable" id="side-nav">
+ <div id="devdoc-nav">
+<ul>
+ <li>
+ <h2>Current SDK Release</h2>
+ <ul>
+ <li><a href="/sdk/1.5_r1/index.html">Download</a></li>
+ <li><a href="/sdk/1.5_r1/installing.html">Installing</a></li>
+ <li><a href="/sdk/1.5_r1/upgrading.html">Upgrading</a></li>
+ <li><a href="/sdk/1.5_r1/requirements.html">System Requirements</a></li>
+ </ul>
+ <ul>
+ <li><a href="/sdk/terms.html">SDK Terms and Conditions</a></li>
+ <li><a href="/sdk/RELEASENOTES.html">SDK Release Notes</a></li>
+ </ul>
+ <li>
+ <h2>System Image Version Notes</h2>
+ <ul>
+ <li><a href="/sdk/android-1.5.html">Android 1.5 Version Notes</a></li>
+ <li><a href="/sdk/android-1.1.html">Android 1.1 Version Notes</a></li>
+ </ul>
+ </li>
+ <li>
+ <h2>Previous SDK Releases</h2>
+ <ul>
+ <li><a href="/sdk/1.1_r1/index.html">Android 1.1 SDK, r1</a></li>
+ <li><a href="/sdk/1.0_r2/index.html">Android 1.0 SDK, r2</a></li>
+ <li><a href="/sdk/1.0_r1/index.html">Android 1.0 SDK, r1</a></li>
+ <li><a href="/sdk/older_releases.html">Older Releases</a></li>
+ </ul>
+ </li>
+</ul>
+
+<script type="text/javascript">
+<!--
+ buildToggleLists();
+//-->
+</script>
+ </div>
+ </div> <!-- end side-nav -->
+
+
+
+<div class="g-unit">
+ <div id="jd-content">
+ <p>Redirecting to
+ <a href="/sdk/1.5_r1/index.html">
+ /sdk/android-1.5-highlights.html
+ </a></p>
+
+</div><!-- end jd-content -->
+
+
+
+</div><!-- end doc-content -->
+
+</div> <!-- end body-content -->
+
+<script type="text/javascript">
+init(); /* initialize android-developer-docs.js */
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+var pageTracker = _gat._getTracker("UA-5831155-1");
+pageTracker._trackPageview();
+</script>
+
+</body>
+</html>
+
+
+
diff --git a/docs/html/sdk/preview/index.jd b/docs/html/sdk/preview/index.jd
new file mode 100644
index 0000000..cb699e9
--- /dev/null
+++ b/docs/html/sdk/preview/index.jd
@@ -0,0 +1,5 @@
+sdk.redirect=true
+@jd:body
+
+
+
diff --git a/docs/html/sitemap.txt b/docs/html/sitemap.txt
index a8221bf..5bb8cae 100644
--- a/docs/html/sitemap.txt
+++ b/docs/html/sitemap.txt
@@ -1,16 +1,114 @@
http://developer.android.com/index.html
-http://developer.android.com/sdk/1.1_r1/index.html
-http://developer.android.com/guide/index.html
+http://developer.android.com/favicon.ico
+http://developer.android.com/sdk/1.5_r1/index.html
+http://developer.android.com/guide/index.html
http://developer.android.com/reference/packages.html
http://developer.android.com/community/index.html
http://developer.android.com/sdk/index.html
http://developer.android.com/license.html
-http://developer.android.com/sdk/terms.html
+http://developer.android.com/guide/basics/what-is-android.html
+http://developer.android.com/guide/topics/fundamentals.html
+http://developer.android.com/guide/topics/ui/index.html
+http://developer.android.com/guide/topics/ui/declaring-layout.html
+http://developer.android.com/guide/topics/ui/menus.html
+http://developer.android.com/guide/topics/ui/dialogs.html
+http://developer.android.com/guide/topics/ui/ui-events.html
+http://developer.android.com/guide/topics/ui/notifiers/index.html
+http://developer.android.com/guide/topics/ui/themes.html
+http://developer.android.com/guide/topics/ui/custom-components.html
+http://developer.android.com/guide/topics/ui/binding.html
+http://developer.android.com/guide/topics/ui/layout-objects.html
+http://developer.android.com/guide/topics/ui/how-android-draws.html
+http://developer.android.com/guide/topics/resources/index.html
+http://developer.android.com/guide/topics/resources/resources-i18n.html
+http://developer.android.com/guide/topics/resources/available-resources.html
+http://developer.android.com/guide/topics/intents/intents-filters.html
+http://developer.android.com/guide/topics/data/data-storage.html
+http://developer.android.com/guide/topics/providers/content-providers.html
+http://developer.android.com/guide/topics/security/security.html
+http://developer.android.com/guide/topics/manifest/manifest-intro.html
+http://developer.android.com/guide/topics/manifest/action-element.html
+http://developer.android.com/guide/topics/manifest/activity-element.html
+http://developer.android.com/guide/topics/manifest/activity-alias-element.html
+http://developer.android.com/guide/topics/manifest/application-element.html
+http://developer.android.com/guide/topics/manifest/category-element.html
+http://developer.android.com/guide/topics/manifest/data-element.html
+http://developer.android.com/guide/topics/manifest/grant-uri-permission-element.html
+http://developer.android.com/guide/topics/manifest/instrumentation-element.html
+http://developer.android.com/guide/topics/manifest/intent-filter-element.html
+http://developer.android.com/guide/topics/manifest/manifest-element.html
+http://developer.android.com/guide/topics/manifest/meta-data-element.html
+http://developer.android.com/guide/topics/manifest/permission-element.html
+http://developer.android.com/guide/topics/manifest/permission-group-element.html
+http://developer.android.com/guide/topics/manifest/permission-tree-element.html
+http://developer.android.com/guide/topics/manifest/provider-element.html
+http://developer.android.com/guide/topics/manifest/receiver-element.html
+http://developer.android.com/guide/topics/manifest/service-element.html
+http://developer.android.com/guide/topics/manifest/uses-configuration-element.html
+http://developer.android.com/guide/topics/manifest/uses-library-element.html
+http://developer.android.com/guide/topics/manifest/uses-permission-element.html
+http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
+http://developer.android.com/guide/topics/graphics/index.html
+http://developer.android.com/guide/topics/graphics/2d-graphics.html
+http://developer.android.com/guide/topics/graphics/opengl.html
+http://developer.android.com/guide/topics/media/index.html
+http://developer.android.com/guide/topics/location/index.html
+http://developer.android.com/guide/topics/appwidgets/index.html
+http://developer.android.com/guide/developing/eclipse-adt.html
+http://developer.android.com/guide/developing/other-ide.html
+http://developer.android.com/guide/developing/device.html
+http://developer.android.com/guide/developing/debug-tasks.html
http://developer.android.com/guide/developing/tools/index.html
-http://developer.android.com/reference/com/google/android/maps/package-summary.html
+http://developer.android.com/guide/developing/tools/aapt.html
+http://developer.android.com/guide/developing/tools/adb.html
+http://developer.android.com/guide/developing/tools/othertools.html
+http://developer.android.com/guide/developing/tools/aidl.html
+http://developer.android.com/guide/developing/tools/avd.html
+http://developer.android.com/guide/developing/tools/ddms.html
+http://developer.android.com/guide/developing/tools/draw9patch.html
+http://developer.android.com/guide/developing/tools/emulator.html
+http://developer.android.com/guide/developing/tools/hierarchy-viewer.html
+http://developer.android.com/guide/developing/tools/monkey.html
+http://developer.android.com/guide/developing/tools/traceview.html
+http://developer.android.com/guide/publishing/app-signing.html
+http://developer.android.com/guide/publishing/versioning.html
+http://developer.android.com/guide/publishing/preparing.html
+http://developer.android.com/guide/publishing/publishing.html
+http://developer.android.com/guide/practices/ui_guidelines/index.html
+http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
+http://developer.android.com/guide/practices/design/performance.html
+http://developer.android.com/guide/practices/design/responsiveness.html
+http://developer.android.com/guide/practices/design/seamlessness.html
+http://developer.android.com/guide/tutorials/hello-world.html
+http://developer.android.com/guide/tutorials/views/index.html
+http://developer.android.com/guide/tutorials/notepad/index.html
+http://developer.android.com/guide/samples/index.html
+http://developer.android.com/guide/samples/ApiDemos/index.html
+http://developer.android.com/guide/samples/LunarLander/index.html
+http://developer.android.com/guide/samples/NotePad/index.html
+http://developer.android.com/guide/appendix/media-formats.html
+http://developer.android.com/guide/appendix/g-app-intents.html
+http://developer.android.com/guide/appendix/glossary.html
+http://developer.android.com/guide/appendix/faq/index.html
+http://developer.android.com/sdk/terms.html
+http://developer.android.com/sdk/1.5_r1/installing.html
+http://developer.android.com/sdk/1.5_r1/upgrading.html
+http://developer.android.com/sdk/1.5_r1/requirements.html
+http://developer.android.com/sdk/RELEASENOTES.html
+http://developer.android.com/sdk/android-1.5.html
+http://developer.android.com/sdk/android-1.1.html
+http://developer.android.com/sdk/1.1_r1/index.html
+http://developer.android.com/sdk/1.0_r2/index.html
+http://developer.android.com/sdk/1.0_r1/index.html
+http://developer.android.com/sdk/older_releases.html
+http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.5_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.5_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.5_r1.zip
+http://developer.android.com/reference/android/location/Geocoder.html
http://developer.android.com/reference/classes.html
http://developer.android.com/reference/android/package-summary.html
http://developer.android.com/reference/android/app/package-summary.html
+http://developer.android.com/reference/android/appwidget/package-summary.html
http://developer.android.com/reference/android/content/package-summary.html
http://developer.android.com/reference/android/content/pm/package-summary.html
http://developer.android.com/reference/android/content/res/package-summary.html
@@ -20,5425 +118,3790 @@ http://developer.android.com/reference/android/graphics/package-summary.html
http://developer.android.com/reference/android/graphics/drawable/package-summary.html
http://developer.android.com/reference/android/graphics/drawable/shapes/package-summary.html
http://developer.android.com/reference/android/hardware/package-summary.html
+http://developer.android.com/reference/android/inputmethodservice/package-summary.html
http://developer.android.com/reference/android/location/package-summary.html
http://developer.android.com/reference/android/media/package-summary.html
http://developer.android.com/reference/android/net/package-summary.html
-
http://developer.android.com/reference/android/net/http/package-summary.html
http://developer.android.com/reference/android/net/wifi/package-summary.html
-
http://developer.android.com/reference/android/opengl/package-summary.html
http://developer.android.com/reference/android/os/package-summary.html
-
http://developer.android.com/reference/android/preference/package-summary.html
http://developer.android.com/reference/android/provider/package-summary.html
-
http://developer.android.com/reference/android/sax/package-summary.html
+http://developer.android.com/reference/android/speech/package-summary.html
http://developer.android.com/reference/android/telephony/package-summary.html
-
http://developer.android.com/reference/android/telephony/gsm/package-summary.html
http://developer.android.com/reference/android/test/package-summary.html
-
http://developer.android.com/reference/android/test/mock/package-summary.html
http://developer.android.com/reference/android/test/suitebuilder/package-summary.html
-
http://developer.android.com/reference/android/text/package-summary.html
+http://developer.android.com/reference/android/text/format/package-summary.html
http://developer.android.com/reference/android/text/method/package-summary.html
-
http://developer.android.com/reference/android/text/style/package-summary.html
http://developer.android.com/reference/android/text/util/package-summary.html
-
http://developer.android.com/reference/android/util/package-summary.html
http://developer.android.com/reference/android/view/package-summary.html
-
http://developer.android.com/reference/android/view/animation/package-summary.html
+http://developer.android.com/reference/android/view/inputmethod/package-summary.html
http://developer.android.com/reference/android/webkit/package-summary.html
-
http://developer.android.com/reference/android/widget/package-summary.html
+http://developer.android.com/reference/com/android/internal/os/package-summary.html
http://developer.android.com/reference/dalvik/bytecode/package-summary.html
-
http://developer.android.com/reference/dalvik/system/package-summary.html
http://developer.android.com/reference/java/awt/font/package-summary.html
-
+http://developer.android.com/reference/java/beans/package-summary.html
http://developer.android.com/reference/java/io/package-summary.html
http://developer.android.com/reference/java/lang/package-summary.html
-
http://developer.android.com/reference/java/lang/annotation/package-summary.html
http://developer.android.com/reference/java/lang/ref/package-summary.html
-
http://developer.android.com/reference/java/lang/reflect/package-summary.html
http://developer.android.com/reference/java/math/package-summary.html
-
http://developer.android.com/reference/java/net/package-summary.html
http://developer.android.com/reference/java/nio/package-summary.html
-
http://developer.android.com/reference/java/nio/channels/package-summary.html
http://developer.android.com/reference/java/nio/channels/spi/package-summary.html
-
http://developer.android.com/reference/java/nio/charset/package-summary.html
http://developer.android.com/reference/java/nio/charset/spi/package-summary.html
-
http://developer.android.com/reference/java/security/package-summary.html
http://developer.android.com/reference/java/security/acl/package-summary.html
-
http://developer.android.com/reference/java/security/cert/package-summary.html
http://developer.android.com/reference/java/security/interfaces/package-summary.html
-
http://developer.android.com/reference/java/security/spec/package-summary.html
http://developer.android.com/reference/java/sql/package-summary.html
-
http://developer.android.com/reference/java/text/package-summary.html
http://developer.android.com/reference/java/util/package-summary.html
-
http://developer.android.com/reference/java/util/concurrent/package-summary.html
http://developer.android.com/reference/java/util/concurrent/atomic/package-summary.html
-
http://developer.android.com/reference/java/util/concurrent/locks/package-summary.html
http://developer.android.com/reference/java/util/jar/package-summary.html
-
http://developer.android.com/reference/java/util/logging/package-summary.html
http://developer.android.com/reference/java/util/prefs/package-summary.html
-
http://developer.android.com/reference/java/util/regex/package-summary.html
http://developer.android.com/reference/java/util/zip/package-summary.html
-
http://developer.android.com/reference/javax/crypto/package-summary.html
http://developer.android.com/reference/javax/crypto/interfaces/package-summary.html
-
http://developer.android.com/reference/javax/crypto/spec/package-summary.html
http://developer.android.com/reference/javax/microedition/khronos/egl/package-summary.html
-
http://developer.android.com/reference/javax/microedition/khronos/opengles/package-summary.html
-
http://developer.android.com/reference/javax/net/package-summary.html
http://developer.android.com/reference/javax/net/ssl/package-summary.html
-
http://developer.android.com/reference/javax/security/auth/package-summary.html
http://developer.android.com/reference/javax/security/auth/callback/package-summary.html
-
http://developer.android.com/reference/javax/security/auth/login/package-summary.html
http://developer.android.com/reference/javax/security/auth/x500/package-summary.html
-
http://developer.android.com/reference/javax/security/cert/package-summary.html
http://developer.android.com/reference/javax/sql/package-summary.html
-
http://developer.android.com/reference/javax/xml/package-summary.html
http://developer.android.com/reference/javax/xml/parsers/package-summary.html
-
http://developer.android.com/reference/junit/framework/package-summary.html
http://developer.android.com/reference/junit/runner/package-summary.html
-
http://developer.android.com/reference/org/apache/http/package-summary.html
http://developer.android.com/reference/org/apache/http/auth/package-summary.html
-
http://developer.android.com/reference/org/apache/http/auth/params/package-summary.html
http://developer.android.com/reference/org/apache/http/client/package-summary.html
-
http://developer.android.com/reference/org/apache/http/client/entity/package-summary.html
http://developer.android.com/reference/org/apache/http/client/methods/package-summary.html
-
http://developer.android.com/reference/org/apache/http/client/params/package-summary.html
http://developer.android.com/reference/org/apache/http/client/protocol/package-summary.html
-
http://developer.android.com/reference/org/apache/http/client/utils/package-summary.html
http://developer.android.com/reference/org/apache/http/conn/package-summary.html
-
http://developer.android.com/reference/org/apache/http/conn/params/package-summary.html
http://developer.android.com/reference/org/apache/http/conn/routing/package-summary.html
-
http://developer.android.com/reference/org/apache/http/conn/scheme/package-summary.html
http://developer.android.com/reference/org/apache/http/conn/ssl/package-summary.html
-
http://developer.android.com/reference/org/apache/http/conn/util/package-summary.html
http://developer.android.com/reference/org/apache/http/cookie/package-summary.html
-
http://developer.android.com/reference/org/apache/http/cookie/params/package-summary.html
http://developer.android.com/reference/org/apache/http/entity/package-summary.html
-
http://developer.android.com/reference/org/apache/http/impl/package-summary.html
http://developer.android.com/reference/org/apache/http/impl/auth/package-summary.html
-
http://developer.android.com/reference/org/apache/http/impl/client/package-summary.html
http://developer.android.com/reference/org/apache/http/impl/conn/package-summary.html
-
http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/package-summary.html
http://developer.android.com/reference/org/apache/http/impl/cookie/package-summary.html
-
http://developer.android.com/reference/org/apache/http/impl/entity/package-summary.html
http://developer.android.com/reference/org/apache/http/impl/io/package-summary.html
-
http://developer.android.com/reference/org/apache/http/io/package-summary.html
http://developer.android.com/reference/org/apache/http/message/package-summary.html
-
http://developer.android.com/reference/org/apache/http/params/package-summary.html
http://developer.android.com/reference/org/apache/http/protocol/package-summary.html
-
http://developer.android.com/reference/org/apache/http/util/package-summary.html
http://developer.android.com/reference/org/json/package-summary.html
-
http://developer.android.com/reference/org/w3c/dom/package-summary.html
http://developer.android.com/reference/org/xml/sax/package-summary.html
-
http://developer.android.com/reference/org/xml/sax/ext/package-summary.html
http://developer.android.com/reference/org/xml/sax/helpers/package-summary.html
-
http://developer.android.com/reference/org/xmlpull/v1/package-summary.html
http://developer.android.com/reference/org/xmlpull/v1/sax2/package-summary.html
-
http://developer.android.com/reference/org/apache/http/message/AbstractHttpMessage.html
-http://developer.android.com/guide/basics/what-is-android.html
-
-http://developer.android.com/guide/topics/fundamentals.html
-http://developer.android.com/guide/topics/ui/index.html
-
-http://developer.android.com/guide/topics/ui/declaring-layout.html
-http://developer.android.com/guide/topics/ui/menus.html
-
-http://developer.android.com/guide/topics/ui/layout-objects.html
-http://developer.android.com/guide/topics/ui/binding.html
-
-http://developer.android.com/guide/topics/ui/ui-events.html
-http://developer.android.com/guide/topics/ui/themes.html
-
-http://developer.android.com/guide/topics/ui/custom-components.html
-http://developer.android.com/guide/topics/ui/how-android-draws.html
-
-http://developer.android.com/guide/topics/resources/index.html
-http://developer.android.com/guide/topics/resources/resources-i18n.html
-
-http://developer.android.com/guide/topics/resources/available-resources.html
-http://developer.android.com/guide/topics/intents/intents-filters.html
-
-http://developer.android.com/guide/topics/data/data-storage.html
-http://developer.android.com/guide/topics/providers/content-providers.html
-
-http://developer.android.com/guide/topics/security/security.html
-http://developer.android.com/guide/topics/manifest/manifest-intro.html
-
-http://developer.android.com/guide/topics/manifest/action-element.html
-http://developer.android.com/guide/topics/manifest/activity-element.html
-
-http://developer.android.com/guide/topics/manifest/activity-alias-element.html
-http://developer.android.com/guide/topics/manifest/application-element.html
-
-http://developer.android.com/guide/topics/manifest/category-element.html
-http://developer.android.com/guide/topics/manifest/data-element.html
-
-http://developer.android.com/guide/topics/manifest/grant-uri-permission-element.html
-http://developer.android.com/guide/topics/manifest/instrumentation-element.html
-
-http://developer.android.com/guide/topics/manifest/intent-filter-element.html
-http://developer.android.com/guide/topics/manifest/manifest-element.html
-
-http://developer.android.com/guide/topics/manifest/meta-data-element.html
-http://developer.android.com/guide/topics/manifest/permission-element.html
-
-http://developer.android.com/guide/topics/manifest/permission-group-element.html
-http://developer.android.com/guide/topics/manifest/permission-tree-element.html
-
-http://developer.android.com/guide/topics/manifest/provider-element.html
-http://developer.android.com/guide/topics/manifest/receiver-element.html
-
-http://developer.android.com/guide/topics/manifest/service-element.html
-http://developer.android.com/guide/topics/manifest/uses-library-element.html
-
-http://developer.android.com/guide/topics/manifest/uses-permission-element.html
-http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
-
-http://developer.android.com/guide/topics/graphics/index.html
-http://developer.android.com/guide/topics/graphics/2d-graphics.html
-
-http://developer.android.com/guide/topics/graphics/opengl.html
-http://developer.android.com/guide/topics/media/index.html
-
-http://developer.android.com/guide/topics/location/index.html
-http://developer.android.com/guide/developing/eclipse-adt.html
-
-http://developer.android.com/guide/developing/other-ide.html
-http://developer.android.com/guide/developing/device.html
-
-http://developer.android.com/guide/developing/debug-tasks.html
-http://developer.android.com/guide/developing/tools/aapt.html
-
-http://developer.android.com/guide/developing/tools/adb.html
-http://developer.android.com/guide/developing/tools/othertools.html
-
-http://developer.android.com/guide/developing/tools/aidl.html
-http://developer.android.com/guide/developing/tools/ddms.html
-
-http://developer.android.com/guide/developing/tools/draw9patch.html
-http://developer.android.com/guide/developing/tools/emulator.html
-
-http://developer.android.com/guide/developing/tools/hierarchy-viewer.html
-http://developer.android.com/guide/developing/tools/monkey.html
-
-http://developer.android.com/guide/developing/tools/traceview.html
-http://developer.android.com/guide/publishing/app-signing.html
-
-http://developer.android.com/guide/publishing/versioning.html
-http://developer.android.com/guide/publishing/preparing.html
-
-http://developer.android.com/guide/publishing/publishing.html
-http://developer.android.com/guide/practices/design/performance.html
-
-http://developer.android.com/guide/practices/design/responsiveness.html
-http://developer.android.com/guide/practices/design/seamlessness.html
-
-http://developer.android.com/guide/tutorials/hello-world.html
-http://developer.android.com/guide/tutorials/views/index.html
-
-http://developer.android.com/guide/tutorials/notepad/index.html
-http://developer.android.com/guide/samples/ApiDemos/index.html
-
-http://developer.android.com/guide/samples/LunarLander/index.html
-http://developer.android.com/guide/samples/NotePad/index.html
-
-http://developer.android.com/guide/appendix/media-formats.html
-http://developer.android.com/guide/appendix/g-app-intents.html
-
-http://developer.android.com/guide/appendix/glossary.html
-http://developer.android.com/guide/appendix/faq/commontasks.html
-
-http://developer.android.com/guide/appendix/faq/framework.html
-http://developer.android.com/guide/appendix/faq/troubleshooting.html
-
-http://developer.android.com/guide/appendix/faq/licensingandoss.html
-http://developer.android.com/guide/appendix/faq/security.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/AbstractAuthenticationHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/AbstractHttpClient.html
-http://developer.android.com/reference/org/apache/http/impl/client/BasicCookieStore.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/BasicCredentialsProvider.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/BasicResponseHandler.html
-http://developer.android.com/reference/org/apache/http/impl/client/ClientParamsStack.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultProxyAuthenticationHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultRedirectHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultRequestDirector.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultTargetAuthenticationHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/DefaultUserTokenHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/EntityEnclosingRequestWrapper.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/RedirectLocations.html
-http://developer.android.com/reference/org/apache/http/impl/client/RequestWrapper.html
-
-http://developer.android.com/reference/org/apache/http/impl/client/RoutedRequest.html
-http://developer.android.com/reference/org/apache/http/impl/client/TunnelRefusedException.html
-
-http://developer.android.com/reference/org/apache/http/client/CookieStore.html
-http://developer.android.com/reference/org/apache/http/client/CredentialsProvider.html
-
-http://developer.android.com/reference/org/apache/http/client/ResponseHandler.html
-http://developer.android.com/reference/org/apache/http/client/HttpRequestRetryHandler.html
-
-http://developer.android.com/reference/org/apache/http/client/RedirectHandler.html
-http://developer.android.com/reference/org/apache/http/client/RequestDirector.html
-
-http://developer.android.com/reference/org/apache/http/HttpEntityEnclosingRequest.html
-http://developer.android.com/reference/org/apache/http/HttpRequest.html
-
-http://developer.android.com/reference/android/Manifest.html
-http://developer.android.com/reference/android/Manifest.permission.html
-
-http://developer.android.com/reference/android/Manifest.permission_group.html
-http://developer.android.com/reference/android/R.html
-
-http://developer.android.com/reference/android/R.anim.html
-http://developer.android.com/reference/android/R.array.html
-
+http://developer.android.com/reference/android/view/ViewGroup.html
+http://developer.android.com/reference/android/widget/FrameLayout.html
+http://developer.android.com/reference/android/widget/LinearLayout.html
+http://developer.android.com/guide/tutorials/views/hello-linearlayout.html
+http://developer.android.com/reference/android/widget/TableLayout.html
+http://developer.android.com/reference/android/widget/TableRow.html
+http://developer.android.com/guide/tutorials/views/hello-tablelayout.html
+http://developer.android.com/reference/android/widget/AbsoluteLayout.html
+http://developer.android.com/reference/android/widget/RelativeLayout.html
+http://developer.android.com/guide/tutorials/views/hello-relativelayout.html
+http://developer.android.com/reference/android/widget/Gallery.html
+http://developer.android.com/reference/android/widget/GridView.html
+http://developer.android.com/reference/android/widget/ListView.html
+http://developer.android.com/reference/android/widget/ScrollView.html
+http://developer.android.com/reference/android/widget/Spinner.html
+http://developer.android.com/reference/android/view/SurfaceView.html
+http://developer.android.com/reference/android/widget/TabHost.html
+http://developer.android.com/reference/android/widget/ViewFlipper.html
+http://developer.android.com/reference/android/widget/ViewSwitcher.html
http://developer.android.com/reference/android/R.attr.html
-http://developer.android.com/reference/android/R.color.html
-
-http://developer.android.com/reference/android/R.dimen.html
-http://developer.android.com/reference/android/R.drawable.html
-
-http://developer.android.com/reference/android/R.id.html
-http://developer.android.com/reference/android/R.layout.html
-
-http://developer.android.com/reference/android/R.plurals.html
-http://developer.android.com/reference/android/R.raw.html
-
-http://developer.android.com/reference/android/R.string.html
-http://developer.android.com/reference/android/R.style.html
-
http://developer.android.com/reference/android/R.styleable.html
-http://developer.android.com/reference/android/R.xml.html
-
-http://developer.android.com/reference/android/package-descr.html
-http://developer.android.com/reference/android/os/Debug.html
-
-http://developer.android.com/reference/java/security/acl/Acl.html
-http://developer.android.com/reference/java/security/acl/AclEntry.html
-
-http://developer.android.com/reference/java/security/acl/Group.html
-http://developer.android.com/reference/java/security/acl/Owner.html
-
-http://developer.android.com/reference/java/security/acl/Permission.html
-http://developer.android.com/reference/java/security/acl/AclNotFoundException.html
-
-http://developer.android.com/reference/java/security/acl/LastOwnerException.html
-http://developer.android.com/reference/java/security/acl/NotOwnerException.html
-
-http://developer.android.com/reference/java/security/acl/package-descr.html
-http://developer.android.com/reference/java/text/AttributedCharacterIterator.html
-
-http://developer.android.com/reference/java/text/CharacterIterator.html
-http://developer.android.com/reference/java/text/Annotation.html
-
-http://developer.android.com/reference/java/text/AttributedCharacterIterator.Attribute.html
-http://developer.android.com/reference/java/text/AttributedString.html
-
-http://developer.android.com/reference/java/text/Bidi.html
-http://developer.android.com/reference/java/text/BreakIterator.html
-
-http://developer.android.com/reference/java/text/ChoiceFormat.html
-http://developer.android.com/reference/java/text/CollationElementIterator.html
-
-http://developer.android.com/reference/java/text/CollationKey.html
-http://developer.android.com/reference/java/text/Collator.html
-
-http://developer.android.com/reference/java/text/DateFormat.html
-http://developer.android.com/reference/java/text/DateFormat.Field.html
-
-http://developer.android.com/reference/java/text/DateFormatSymbols.html
-http://developer.android.com/reference/java/text/DecimalFormat.html
-
-http://developer.android.com/reference/java/text/DecimalFormatSymbols.html
-http://developer.android.com/reference/java/text/FieldPosition.html
-
-http://developer.android.com/reference/java/text/Format.html
-http://developer.android.com/reference/java/text/Format.Field.html
-
-http://developer.android.com/reference/java/text/MessageFormat.html
-http://developer.android.com/reference/java/text/MessageFormat.Field.html
-
-http://developer.android.com/reference/java/text/NumberFormat.html
-http://developer.android.com/reference/java/text/NumberFormat.Field.html
-
-http://developer.android.com/reference/java/text/ParsePosition.html
-http://developer.android.com/reference/java/text/RuleBasedCollator.html
-
-http://developer.android.com/reference/java/text/SimpleDateFormat.html
-http://developer.android.com/reference/java/text/StringCharacterIterator.html
-
-http://developer.android.com/reference/java/text/ParseException.html
-http://developer.android.com/reference/java/text/package-descr.html
-
-http://developer.android.com/reference/android/view/Menu.html
-http://developer.android.com/reference/android/view/ContextMenu.html
-
-http://developer.android.com/reference/android/view/SubMenu.html
+http://developer.android.com/reference/android/content/Context.html
+http://developer.android.com/reference/java/lang/SecurityException.html
+http://developer.android.com/reference/android/Manifest.permission.html
+http://developer.android.com/reference/android/Manifest.permission_group.html
http://developer.android.com/reference/android/app/Activity.html
-
-http://developer.android.com/reference/android/view/MenuItem.html
-http://developer.android.com/reference/android/widget/ListView.html
-
-http://developer.android.com/reference/android/view/View.html
-http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html
-
-http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
-
-http://developer.android.com/reference/android/app/ListActivity.html
-http://developer.android.com/reference/android/view/MenuInflater.html
-
-http://developer.android.com/reference/android/preference/PreferenceActivity.html
-http://developer.android.com/reference/android/media/MediaPlayer.html
-
-http://developer.android.com/reference/android/media/MediaRecorder.html
-http://developer.android.com/reference/android/content/ContentValues.html
-
-http://developer.android.com/reference/android/content/ContentResolver.html
-http://developer.android.com/reference/android/test/PerformanceTestCase.html
-
-http://developer.android.com/reference/android/test/PerformanceTestCase.Intermediates.html
-http://developer.android.com/reference/android/test/TestSuiteProvider.html
-
-http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase.html
-http://developer.android.com/reference/android/test/ActivityTestCase.html
-
-http://developer.android.com/reference/android/test/ActivityUnitTestCase.html
-http://developer.android.com/reference/android/test/AndroidTestCase.html
-
-http://developer.android.com/reference/android/test/AndroidTestRunner.html
-http://developer.android.com/reference/android/test/ApplicationTestCase.html
-
-http://developer.android.com/reference/android/app/Application.html
-http://developer.android.com/reference/android/test/InstrumentationTestCase.html
-
-http://developer.android.com/reference/android/test/InstrumentationTestRunner.html
-http://developer.android.com/reference/android/test/InstrumentationTestSuite.html
-
-http://developer.android.com/reference/android/test/IsolatedContext.html
-http://developer.android.com/reference/android/test/MoreAsserts.html
-
-http://developer.android.com/reference/android/test/ProviderTestCase.html
-http://developer.android.com/reference/android/content/ContentProvider.html
-
-http://developer.android.com/reference/android/test/RenamingDelegatingContext.html
-http://developer.android.com/reference/android/test/ServiceTestCase.html
-
http://developer.android.com/reference/android/app/Service.html
-http://developer.android.com/reference/android/test/SingleLaunchActivityTestCase.html
-
-http://developer.android.com/reference/android/test/SyncBaseInstrumentation.html
-http://developer.android.com/reference/android/test/TouchUtils.html
-
-http://developer.android.com/reference/android/test/ViewAsserts.html
-http://developer.android.com/reference/android/test/AssertionFailedError.html
-
-http://developer.android.com/reference/android/test/ComparisonFailure.html
-http://developer.android.com/reference/android/app/Instrumentation.html
-
-http://developer.android.com/reference/junit/framework/TestCase.html
-http://developer.android.com/reference/junit/framework/TestSuite.html
-
+http://developer.android.com/reference/android/content/BroadcastReceiver.html
+http://developer.android.com/reference/android/content/ContentProvider.html
+http://developer.android.com/reference/android/content/ContentResolver.html
+http://developer.android.com/reference/android/content/pm/PackageManager.html
http://developer.android.com/reference/android/content/Intent.html
-http://developer.android.com/reference/android/content/Context.html
-
-http://developer.android.com/reference/android/os/Bundle.html
-http://developer.android.com/reference/android/view/ViewGroup.html
-
-http://developer.android.com/reference/android/widget/Button.html
-http://developer.android.com/reference/android/widget/TextView.html
-
-http://developer.android.com/reference/android/widget/EditText.html
-http://developer.android.com/reference/android/widget/CheckBox.html
-
-http://developer.android.com/reference/android/widget/RadioButton.html
-http://developer.android.com/reference/android/widget/Gallery.html
-
-http://developer.android.com/reference/android/widget/Spinner.html
-http://developer.android.com/reference/android/widget/AutoCompleteTextView.html
-
-http://developer.android.com/reference/android/widget/ImageSwitcher.html
-http://developer.android.com/reference/android/widget/TextSwitcher.html
-
-http://developer.android.com/reference/android/widget/LinearLayout.html
-http://developer.android.com/reference/android/widget/FrameLayout.html
-
-http://developer.android.com/reference/android/widget/AbsoluteLayout.html
+http://developer.android.com/reference/android/os/Debug.html
http://developer.android.com/reference/android/graphics/Canvas.html
-
-http://developer.android.com/reference/android/view/SurfaceView.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_view_1.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.html
-
-http://developer.android.com/reference/java/net/ContentHandlerFactory.html
-http://developer.android.com/reference/java/net/DatagramSocketImplFactory.html
-
-http://developer.android.com/reference/java/net/FileNameMap.html
-http://developer.android.com/reference/java/net/SocketImplFactory.html
-
-http://developer.android.com/reference/java/net/SocketOptions.html
-http://developer.android.com/reference/java/net/URLStreamHandlerFactory.html
-
-http://developer.android.com/reference/java/net/Authenticator.html
-http://developer.android.com/reference/java/net/CacheRequest.html
-
-http://developer.android.com/reference/java/net/CacheResponse.html
-http://developer.android.com/reference/java/net/ContentHandler.html
-
-http://developer.android.com/reference/java/net/CookieHandler.html
-http://developer.android.com/reference/java/net/DatagramPacket.html
-
-http://developer.android.com/reference/java/net/DatagramSocket.html
-http://developer.android.com/reference/java/net/DatagramSocketImpl.html
-
-http://developer.android.com/reference/java/net/HttpURLConnection.html
-http://developer.android.com/reference/java/net/Inet4Address.html
-
-http://developer.android.com/reference/java/net/Inet6Address.html
-http://developer.android.com/reference/java/net/InetAddress.html
-
-http://developer.android.com/reference/java/net/InetSocketAddress.html
-http://developer.android.com/reference/java/net/JarURLConnection.html
-
-http://developer.android.com/reference/java/net/MulticastSocket.html
-http://developer.android.com/reference/java/net/NetPermission.html
-
-http://developer.android.com/reference/java/net/NetworkInterface.html
-http://developer.android.com/reference/java/net/PasswordAuthentication.html
-
-http://developer.android.com/reference/java/net/Proxy.html
-http://developer.android.com/reference/java/net/ProxySelector.html
-
-http://developer.android.com/reference/java/net/ResponseCache.html
-http://developer.android.com/reference/java/net/SecureCacheResponse.html
-
-http://developer.android.com/reference/java/net/ServerSocket.html
-http://developer.android.com/reference/java/net/Socket.html
-
-http://developer.android.com/reference/java/net/SocketAddress.html
-http://developer.android.com/reference/java/net/SocketImpl.html
-
-http://developer.android.com/reference/java/net/SocketPermission.html
-http://developer.android.com/reference/java/net/URI.html
-
-http://developer.android.com/reference/java/net/URL.html
-http://developer.android.com/reference/java/net/URLClassLoader.html
-
-http://developer.android.com/reference/java/net/URLConnection.html
-http://developer.android.com/reference/java/net/URLDecoder.html
-
-http://developer.android.com/reference/java/net/URLEncoder.html
-http://developer.android.com/reference/java/net/URLStreamHandler.html
-
-http://developer.android.com/reference/java/net/Authenticator.RequestorType.html
-http://developer.android.com/reference/java/net/Proxy.Type.html
-
-http://developer.android.com/reference/java/net/BindException.html
-http://developer.android.com/reference/java/net/ConnectException.html
-
-http://developer.android.com/reference/java/net/HttpRetryException.html
-http://developer.android.com/reference/java/net/MalformedURLException.html
-
-http://developer.android.com/reference/java/net/NoRouteToHostException.html
-http://developer.android.com/reference/java/net/PortUnreachableException.html
-
-http://developer.android.com/reference/java/net/ProtocolException.html
-http://developer.android.com/reference/java/net/SocketException.html
-
-http://developer.android.com/reference/java/net/SocketTimeoutException.html
-http://developer.android.com/reference/java/net/UnknownHostException.html
-
-http://developer.android.com/reference/java/net/UnknownServiceException.html
-http://developer.android.com/reference/java/net/URISyntaxException.html
-
-http://developer.android.com/reference/java/net/package-descr.html
+http://developer.android.com/reference/android/app/Dialog.html
+http://developer.android.com/reference/android/view/Surface.html
+http://developer.android.com/reference/android/R.style.html
+http://developer.android.com/reference/android/view/View.html
+http://developer.android.com/reference/android/view/Window.html
+http://developer.android.com/reference/android/os/PatternMatcher.html
+http://developer.android.com/reference/android/view/ContextThemeWrapper.html
+http://developer.android.com/reference/android/app/Instrumentation.html
+http://developer.android.com/reference/android/util/Log.html
http://developer.android.com/reference/android/graphics/drawable/Drawable.html
-
http://developer.android.com/reference/android/graphics/drawable/BitmapDrawable.html
http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html
-
http://developer.android.com/reference/android/graphics/drawable/PictureDrawable.html
http://developer.android.com/reference/android/graphics/drawable/LayerDrawable.html
-
http://developer.android.com/reference/android/widget/ImageView.html
http://developer.android.com/reference/android/content/res/Resources.html
-
http://developer.android.com/reference/android/graphics/drawable/shapes/OvalShape.html
http://developer.android.com/reference/android/graphics/drawable/NinePatchDrawable.html
-
http://developer.android.com/reference/android/view/animation/AnimationSet.html
http://developer.android.com/reference/android/view/animation/Animation.html
-
http://developer.android.com/reference/android/view/animation/Interpolator.html
http://developer.android.com/reference/android/view/animation/AccelerateInterpolator.html
-
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
-http://developer.android.com/reference/java/util/logging/Filter.html
-
-http://developer.android.com/reference/java/util/logging/LoggingMXBean.html
-http://developer.android.com/reference/java/util/logging/ConsoleHandler.html
-
-http://developer.android.com/reference/java/util/logging/ErrorManager.html
-http://developer.android.com/reference/java/util/logging/FileHandler.html
-
-http://developer.android.com/reference/java/util/logging/Formatter.html
-http://developer.android.com/reference/java/util/logging/Handler.html
-
-http://developer.android.com/reference/java/util/logging/Level.html
-http://developer.android.com/reference/java/util/logging/Logger.html
-
-http://developer.android.com/reference/java/util/logging/LoggingPermission.html
-http://developer.android.com/reference/java/util/logging/LogManager.html
-
-http://developer.android.com/reference/java/util/logging/LogRecord.html
-http://developer.android.com/reference/java/util/logging/MemoryHandler.html
-
-http://developer.android.com/reference/java/util/logging/SimpleFormatter.html
-http://developer.android.com/reference/java/util/logging/SocketHandler.html
-
-http://developer.android.com/reference/java/util/logging/StreamHandler.html
-http://developer.android.com/reference/java/util/logging/XMLFormatter.html
-
-http://developer.android.com/reference/java/util/logging/package-descr.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/LargeTest.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/MediumTest.html
-
-http://developer.android.com/reference/android/test/suitebuilder/annotation/SmallTest.html
-http://developer.android.com/reference/android/os/Process.html
-
+http://developer.android.com/guide/appendix/faq/troubleshooting.html
+http://developer.android.com/reference/android/database/Cursor.html
+http://developer.android.com/reference/android/net/Uri.html
+http://developer.android.com/reference/android/content/ContentUris.html
+http://developer.android.com/reference/android/provider/Contacts.Phones.html
+http://developer.android.com/reference/android/provider/BaseColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PeopleColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PhonesColumns.html
+http://developer.android.com/reference/android/provider/Contacts.People.html
+http://developer.android.com/reference/java/io/InputStream.html
+http://developer.android.com/reference/android/content/ContentValues.html
+http://developer.android.com/reference/android/provider/MediaStore.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteCursor.html
+http://developer.android.com/reference/android/database/MatrixCursor.html
+http://developer.android.com/guide/tutorials/views/hello-spinner.html
+http://developer.android.com/guide/tutorials/views/hello-listview.html
+http://developer.android.com/guide/tutorials/views/hello-gridview.html
+http://developer.android.com/reference/android/widget/AdapterView.html
+http://developer.android.com/reference/android/widget/Adapter.html
+http://developer.android.com/reference/android/widget/ArrayAdapter.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html
+http://developer.android.com/reference/android/app/NotificationManager.html
+http://developer.android.com/sdk/api_diff/3/changes.html
+http://developer.android.com/reference/android/provider/Settings.Secure.html
+http://developer.android.com/reference/android/media/MediaPlayer.html
+http://developer.android.com/reference/android/media/MediaRecorder.html
+http://developer.android.com/reference/android/media/JetPlayer.html
+http://developer.android.com/reference/android/media/SoundPool.html
+http://developer.android.com/guide/topics/media/jet/jetcreator_manual.html
+http://developer.android.com/reference/android/graphics/NinePatch.html
+http://developer.android.com/guide/developing/tools/adt.html
http://developer.android.com/reference/android/graphics/AvoidXfermode.html
http://developer.android.com/reference/android/graphics/Bitmap.html
-
http://developer.android.com/reference/android/graphics/BitmapFactory.html
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
-
http://developer.android.com/reference/android/graphics/BitmapShader.html
http://developer.android.com/reference/android/graphics/BlurMaskFilter.html
-
http://developer.android.com/reference/android/graphics/Camera.html
http://developer.android.com/reference/android/graphics/Color.html
-
http://developer.android.com/reference/android/graphics/ColorFilter.html
http://developer.android.com/reference/android/graphics/ColorMatrix.html
-
http://developer.android.com/reference/android/graphics/ColorMatrixColorFilter.html
http://developer.android.com/reference/android/graphics/ComposePathEffect.html
-
http://developer.android.com/reference/android/graphics/ComposeShader.html
http://developer.android.com/reference/android/graphics/CornerPathEffect.html
-
http://developer.android.com/reference/android/graphics/DashPathEffect.html
http://developer.android.com/reference/android/graphics/DiscretePathEffect.html
-
http://developer.android.com/reference/android/graphics/DrawFilter.html
http://developer.android.com/reference/android/graphics/EmbossMaskFilter.html
-
http://developer.android.com/reference/android/graphics/Interpolator.html
http://developer.android.com/reference/android/graphics/LayerRasterizer.html
-
http://developer.android.com/reference/android/graphics/LightingColorFilter.html
http://developer.android.com/reference/android/graphics/LinearGradient.html
-
http://developer.android.com/reference/android/graphics/MaskFilter.html
http://developer.android.com/reference/android/graphics/Matrix.html
-
http://developer.android.com/reference/android/graphics/Movie.html
-http://developer.android.com/reference/android/graphics/NinePatch.html
-
http://developer.android.com/reference/android/graphics/Paint.html
http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html
-
http://developer.android.com/reference/android/graphics/Paint.FontMetricsInt.html
http://developer.android.com/reference/android/graphics/PaintFlagsDrawFilter.html
-
http://developer.android.com/reference/android/graphics/Path.html
http://developer.android.com/reference/android/graphics/PathDashPathEffect.html
-
http://developer.android.com/reference/android/graphics/PathEffect.html
http://developer.android.com/reference/android/graphics/PathMeasure.html
-
http://developer.android.com/reference/android/graphics/Picture.html
http://developer.android.com/reference/android/graphics/PixelFormat.html
-
http://developer.android.com/reference/android/graphics/PixelXorXfermode.html
http://developer.android.com/reference/android/graphics/Point.html
-
http://developer.android.com/reference/android/graphics/PointF.html
http://developer.android.com/reference/android/graphics/PorterDuff.html
-
http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html
http://developer.android.com/reference/android/graphics/PorterDuffXfermode.html
-
http://developer.android.com/reference/android/graphics/RadialGradient.html
http://developer.android.com/reference/android/graphics/Rasterizer.html
-
http://developer.android.com/reference/android/graphics/Rect.html
http://developer.android.com/reference/android/graphics/RectF.html
-
http://developer.android.com/reference/android/graphics/Region.html
http://developer.android.com/reference/android/graphics/RegionIterator.html
-
http://developer.android.com/reference/android/graphics/Shader.html
http://developer.android.com/reference/android/graphics/SumPathEffect.html
-
http://developer.android.com/reference/android/graphics/SweepGradient.html
http://developer.android.com/reference/android/graphics/Typeface.html
-
http://developer.android.com/reference/android/graphics/Xfermode.html
http://developer.android.com/reference/android/graphics/AvoidXfermode.Mode.html
-
http://developer.android.com/reference/android/graphics/Bitmap.CompressFormat.html
http://developer.android.com/reference/android/graphics/Bitmap.Config.html
-
http://developer.android.com/reference/android/graphics/BlurMaskFilter.Blur.html
http://developer.android.com/reference/android/graphics/Canvas.EdgeType.html
-
http://developer.android.com/reference/android/graphics/Canvas.VertexMode.html
http://developer.android.com/reference/android/graphics/Interpolator.Result.html
-
http://developer.android.com/reference/android/graphics/Matrix.ScaleToFit.html
http://developer.android.com/reference/android/graphics/Paint.Align.html
-
http://developer.android.com/reference/android/graphics/Paint.Cap.html
http://developer.android.com/reference/android/graphics/Paint.Join.html
-
http://developer.android.com/reference/android/graphics/Paint.Style.html
http://developer.android.com/reference/android/graphics/Path.Direction.html
-
http://developer.android.com/reference/android/graphics/Path.FillType.html
http://developer.android.com/reference/android/graphics/PathDashPathEffect.Style.html
-
http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
http://developer.android.com/reference/android/graphics/Region.Op.html
-
http://developer.android.com/reference/android/graphics/Shader.TileMode.html
-http://developer.android.com/reference/android/graphics/package-descr.html
-
-http://developer.android.com/reference/android/content/BroadcastReceiver.html
-http://developer.android.com/reference/org/apache/http/cookie/ClientCookie.html
-
-http://developer.android.com/reference/org/apache/http/cookie/Cookie.html
-http://developer.android.com/reference/org/apache/http/cookie/CookieAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/cookie/CookieSpec.html
-http://developer.android.com/reference/org/apache/http/cookie/CookieSpecFactory.html
-
-http://developer.android.com/reference/org/apache/http/cookie/SetCookie.html
-http://developer.android.com/reference/org/apache/http/cookie/SetCookie2.html
-
-http://developer.android.com/reference/org/apache/http/cookie/SM.html
-http://developer.android.com/reference/org/apache/http/cookie/CookieIdentityComparator.html
-
-http://developer.android.com/reference/org/apache/http/cookie/CookieOrigin.html
-http://developer.android.com/reference/org/apache/http/cookie/CookiePathComparator.html
-
-http://developer.android.com/reference/org/apache/http/cookie/CookieSpecRegistry.html
-http://developer.android.com/reference/org/apache/http/cookie/MalformedCookieException.html
-
-http://developer.android.com/reference/org/apache/http/cookie/package-descr.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractInterruptibleChannel.html
-
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectableChannel.html
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectionKey.html
-
-http://developer.android.com/reference/java/nio/channels/spi/AbstractSelector.html
-http://developer.android.com/reference/java/nio/channels/spi/SelectorProvider.html
-
-http://developer.android.com/reference/java/nio/channels/spi/package-descr.html
-http://developer.android.com/reference/org/apache/http/client/AuthenticationHandler.html
-
-http://developer.android.com/reference/org/apache/http/client/HttpClient.html
-http://developer.android.com/reference/org/apache/http/client/UserTokenHandler.html
-
-http://developer.android.com/reference/org/apache/http/client/CircularRedirectException.html
-http://developer.android.com/reference/org/apache/http/client/ClientProtocolException.html
-
-http://developer.android.com/reference/org/apache/http/client/HttpResponseException.html
-http://developer.android.com/reference/org/apache/http/client/NonRepeatableRequestException.html
-
-http://developer.android.com/reference/org/apache/http/client/RedirectException.html
-http://developer.android.com/reference/org/apache/http/client/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/HttpResponse.html
-http://developer.android.com/reference/java/util/prefs/NodeChangeListener.html
-
-http://developer.android.com/reference/java/util/prefs/PreferenceChangeListener.html
-http://developer.android.com/reference/java/util/prefs/PreferencesFactory.html
-
-http://developer.android.com/reference/java/util/prefs/AbstractPreferences.html
-http://developer.android.com/reference/java/util/prefs/NodeChangeEvent.html
-
-http://developer.android.com/reference/java/util/prefs/PreferenceChangeEvent.html
-http://developer.android.com/reference/java/util/prefs/Preferences.html
-
-http://developer.android.com/reference/java/util/prefs/BackingStoreException.html
-http://developer.android.com/reference/java/util/prefs/InvalidPreferencesFormatException.html
-
-http://developer.android.com/reference/java/util/prefs/package-descr.html
-http://developer.android.com/sdk/adt_download.html
-http://developer.android.com/reference/android/provider/BaseColumns.html
-
-http://developer.android.com/reference/android/provider/Contacts.ContactMethodsColumns.html
-http://developer.android.com/reference/android/provider/Contacts.ExtensionsColumns.html
-
-http://developer.android.com/reference/android/provider/Contacts.GroupsColumns.html
-http://developer.android.com/reference/android/provider/Contacts.OrganizationColumns.html
-
-http://developer.android.com/reference/android/provider/Contacts.PeopleColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PhonesColumns.html
-
-http://developer.android.com/reference/android/provider/Contacts.PhotosColumns.html
-http://developer.android.com/reference/android/provider/Contacts.PresenceColumns.html
-
-http://developer.android.com/reference/android/provider/Contacts.SettingsColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.AlbumColumns.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.ArtistColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.GenresColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.PlaylistsColumns.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html
-http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Video.VideoColumns.html
-http://developer.android.com/reference/android/provider/OpenableColumns.html
-
-http://developer.android.com/reference/android/provider/Browser.html
-http://developer.android.com/reference/android/provider/Browser.BookmarkColumns.html
-
-http://developer.android.com/reference/android/provider/Browser.SearchColumns.html
-http://developer.android.com/reference/android/provider/CallLog.html
-
-http://developer.android.com/reference/android/provider/CallLog.Calls.html
-http://developer.android.com/reference/android/provider/Contacts.html
-
-http://developer.android.com/reference/android/provider/Contacts.ContactMethods.html
-http://developer.android.com/reference/android/provider/Contacts.Extensions.html
-
-http://developer.android.com/reference/android/provider/Contacts.GroupMembership.html
-http://developer.android.com/reference/android/provider/Contacts.Groups.html
-
-http://developer.android.com/reference/android/provider/Contacts.Intents.html
-http://developer.android.com/reference/android/provider/Contacts.Intents.Insert.html
-
-http://developer.android.com/reference/android/provider/Contacts.Intents.UI.html
-http://developer.android.com/reference/android/provider/Contacts.Organizations.html
-
-http://developer.android.com/reference/android/provider/Contacts.People.html
-http://developer.android.com/reference/android/provider/Contacts.People.ContactMethods.html
-
-http://developer.android.com/reference/android/provider/Contacts.People.Extensions.html
-http://developer.android.com/reference/android/provider/Contacts.People.Phones.html
-
-http://developer.android.com/reference/android/provider/Contacts.Phones.html
-http://developer.android.com/reference/android/provider/Contacts.Photos.html
-
-http://developer.android.com/reference/android/provider/Contacts.Settings.html
-http://developer.android.com/reference/android/provider/MediaStore.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Albums.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Artists.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Artists.Albums.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Genres.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Genres.Members.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Media.html
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Playlists.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Audio.Playlists.Members.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Images.html
-http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html
-http://developer.android.com/reference/android/provider/MediaStore.Video.html
-
-http://developer.android.com/reference/android/provider/MediaStore.Video.Media.html
-http://developer.android.com/reference/android/provider/SearchRecentSuggestions.html
-
-http://developer.android.com/reference/android/provider/Settings.html
-http://developer.android.com/reference/android/provider/Settings.NameValueTable.html
-
-http://developer.android.com/reference/android/provider/Settings.System.html
-http://developer.android.com/reference/android/provider/Settings.SettingNotFoundException.html
-
-http://developer.android.com/reference/android/provider/package-descr.html
-http://developer.android.com/reference/android/content/SearchRecentSuggestionsProvider.html
-
-http://developer.android.com/reference/android/net/UrlQuerySanitizer.ValueSanitizer.html
-http://developer.android.com/reference/android/net/ConnectivityManager.html
-
-http://developer.android.com/reference/android/net/Credentials.html
-http://developer.android.com/reference/android/net/DhcpInfo.html
-
-http://developer.android.com/reference/android/net/LocalServerSocket.html
-http://developer.android.com/reference/android/net/LocalSocket.html
-
-http://developer.android.com/reference/android/net/LocalSocketAddress.html
-http://developer.android.com/reference/android/net/MailTo.html
-
-http://developer.android.com/reference/android/net/NetworkInfo.html
-http://developer.android.com/reference/android/net/Proxy.html
-
-http://developer.android.com/reference/android/net/SSLCertificateSocketFactory.html
-http://developer.android.com/reference/android/net/Uri.html
-
-http://developer.android.com/reference/android/net/Uri.Builder.html
-http://developer.android.com/reference/android/net/UrlQuerySanitizer.html
-
-http://developer.android.com/reference/android/net/UrlQuerySanitizer.IllegalCharacterValueSanitizer.html
-
-http://developer.android.com/reference/android/net/UrlQuerySanitizer.ParameterValuePair.html
-http://developer.android.com/reference/android/net/LocalSocketAddress.Namespace.html
-
-http://developer.android.com/reference/android/net/NetworkInfo.DetailedState.html
-http://developer.android.com/reference/android/net/NetworkInfo.State.html
-
-http://developer.android.com/reference/android/net/package-descr.html
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGL.html
-
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGL10.html
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGL11.html
-
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGLConfig.html
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGLContext.html
-
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGLDisplay.html
-http://developer.android.com/reference/javax/microedition/khronos/egl/EGLSurface.html
-
-http://developer.android.com/reference/android/content/pm/PackageItemInfo.html
-http://developer.android.com/reference/org/apache/http/auth/params/AuthPNames.html
-
-http://developer.android.com/reference/org/apache/http/auth/params/AuthParamBean.html
-http://developer.android.com/reference/org/apache/http/auth/params/AuthParams.html
-
-http://developer.android.com/reference/org/apache/http/auth/params/package-descr.html
-http://developer.android.com/reference/org/apache/http/params/HttpParams.html
-
http://developer.android.com/reference/java/lang/Object.html
-http://developer.android.com/reference/org/apache/http/conn/ConnectionKeepAliveStrategy.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpContext.html
-http://developer.android.com/reference/java/lang/Class.html
-
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL.html
http://developer.android.com/reference/java/lang/String.html
-http://developer.android.com/reference/org/apache/http/ConnectionReuseStrategy.html
-
-http://developer.android.com/reference/org/xml/sax/ext/Attributes2.html
-http://developer.android.com/reference/org/xml/sax/ext/DeclHandler.html
-
-http://developer.android.com/reference/org/xml/sax/ext/EntityResolver2.html
-http://developer.android.com/reference/org/xml/sax/ext/LexicalHandler.html
-
-http://developer.android.com/reference/org/xml/sax/ext/Locator2.html
-http://developer.android.com/reference/org/xml/sax/ext/Attributes2Impl.html
-
-http://developer.android.com/reference/org/xml/sax/ext/DefaultHandler2.html
-http://developer.android.com/reference/org/xml/sax/ext/Locator2Impl.html
-
-http://developer.android.com/reference/org/xml/sax/ext/package-descr.html
-http://developer.android.com/reference/org/xml/sax/Attributes.html
-
-http://developer.android.com/reference/org/xml/sax/Locator.html
-http://developer.android.com/reference/android/content/pm/PackageManager.html
-
-http://developer.android.com/reference/org/apache/http/HttpHost.html
-
-http://developer.android.com/reference/org/apache/http/HttpException.html
-http://developer.android.com/reference/java/io/IOException.html
-
-http://developer.android.com/reference/javax/security/auth/x500/X500Principal.html
-http://developer.android.com/reference/javax/security/auth/x500/package-descr.html
-
-http://developer.android.com/reference/java/util/Date.html
-http://developer.android.com/reference/java/util/List.html
-
-http://developer.android.com/reference/android/sax/ElementListener.html
-http://developer.android.com/reference/android/sax/EndElementListener.html
-
-http://developer.android.com/reference/android/sax/EndTextElementListener.html
-http://developer.android.com/reference/android/sax/StartElementListener.html
-
-http://developer.android.com/reference/android/sax/TextElementListener.html
-http://developer.android.com/reference/android/sax/Element.html
-
-http://developer.android.com/reference/android/sax/RootElement.html
-http://developer.android.com/reference/android/sax/package-descr.html
-
-http://developer.android.com/reference/junit/runner/BaseTestRunner.html
-http://developer.android.com/reference/junit/framework/TestListener.html
-
-http://developer.android.com/reference/junit/framework/TestResult.html
-http://developer.android.com/reference/junit/framework/Test.html
-
+http://developer.android.com/reference/java/lang/CharSequence.html
+http://developer.android.com/reference/java/lang/Class.html
+http://developer.android.com/reference/java/lang/ref/ReferenceQueue.html
http://developer.android.com/reference/java/lang/Throwable.html
-http://developer.android.com/reference/junit/framework/AssertionFailedError.html
-
+http://developer.android.com/reference/android/test/PerformanceTestCase.html
+http://developer.android.com/reference/android/test/PerformanceTestCase.Intermediates.html
+http://developer.android.com/reference/android/test/TestSuiteProvider.html
+http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase.html
+http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html
+http://developer.android.com/reference/android/test/ActivityTestCase.html
+http://developer.android.com/reference/android/test/ActivityUnitTestCase.html
+http://developer.android.com/reference/android/test/AndroidTestCase.html
+http://developer.android.com/reference/android/test/AndroidTestRunner.html
+http://developer.android.com/reference/android/test/ApplicationTestCase.html
+http://developer.android.com/reference/android/app/Application.html
+http://developer.android.com/reference/android/test/InstrumentationTestCase.html
+http://developer.android.com/reference/android/test/InstrumentationTestRunner.html
+http://developer.android.com/reference/android/test/InstrumentationTestSuite.html
+http://developer.android.com/reference/android/test/IsolatedContext.html
+http://developer.android.com/reference/android/test/MoreAsserts.html
+http://developer.android.com/reference/android/test/ProviderTestCase.html
+http://developer.android.com/reference/android/test/ProviderTestCase2.html
+http://developer.android.com/reference/android/test/RenamingDelegatingContext.html
+http://developer.android.com/reference/android/test/ServiceTestCase.html
+http://developer.android.com/reference/android/test/SingleLaunchActivityTestCase.html
+http://developer.android.com/reference/android/test/SyncBaseInstrumentation.html
+http://developer.android.com/reference/android/test/TouchUtils.html
+http://developer.android.com/reference/android/test/ViewAsserts.html
+http://developer.android.com/reference/android/test/AssertionFailedError.html
+http://developer.android.com/reference/android/test/ComparisonFailure.html
+http://developer.android.com/reference/android/test/package-descr.html
+http://developer.android.com/reference/junit/framework/TestCase.html
+http://developer.android.com/reference/junit/framework/TestSuite.html
+http://developer.android.com/reference/android/Manifest.html
+http://developer.android.com/reference/android/R.html
+http://developer.android.com/reference/android/R.anim.html
+http://developer.android.com/reference/android/R.array.html
+http://developer.android.com/reference/android/R.bool.html
+http://developer.android.com/reference/android/R.color.html
+http://developer.android.com/reference/android/R.dimen.html
+http://developer.android.com/reference/android/R.drawable.html
+http://developer.android.com/reference/android/R.id.html
+http://developer.android.com/reference/android/R.integer.html
+http://developer.android.com/reference/android/R.layout.html
+http://developer.android.com/reference/android/R.plurals.html
+http://developer.android.com/reference/android/R.raw.html
+http://developer.android.com/reference/android/R.string.html
+http://developer.android.com/reference/android/R.xml.html
+http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
http://developer.android.com/reference/junit/runner/TestSuiteLoader.html
-http://developer.android.com/reference/java/util/Properties.html
-
-http://developer.android.com/reference/java/lang/ClassNotFoundException.html
-http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageParser.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageWriter.html
-http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionInputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionOutputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/ChunkedInputStream.html
-http://developer.android.com/reference/org/apache/http/impl/io/ChunkedOutputStream.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthInputStream.html
-http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthOutputStream.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestParser.html
-http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestWriter.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseParser.html
-http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseWriter.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/HttpTransportMetricsImpl.html
-http://developer.android.com/reference/org/apache/http/impl/io/IdentityInputStream.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/IdentityOutputStream.html
-http://developer.android.com/reference/org/apache/http/impl/io/SocketInputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/impl/io/SocketOutputBuffer.html
-http://developer.android.com/reference/org/apache/http/impl/io/package-descr.html
-
-http://developer.android.com/reference/java/io/InputStream.html
-http://developer.android.com/reference/java/io/OutputStream.html
-
-http://developer.android.com/reference/org/apache/http/io/HttpTransportMetrics.html
-http://developer.android.com/reference/org/apache/http/io/SessionInputBuffer.html
-
-http://developer.android.com/reference/junit/framework/Assert.html
-http://developer.android.com/reference/java/lang/IllegalAccessException.html
-
-http://developer.android.com/reference/java/lang/Exception.html
-http://developer.android.com/reference/java/util/jar/Pack200.Packer.html
-
-http://developer.android.com/reference/java/util/jar/Pack200.Unpacker.html
-http://developer.android.com/reference/java/util/jar/Attributes.html
-
-http://developer.android.com/reference/java/util/jar/Attributes.Name.html
-http://developer.android.com/reference/java/util/jar/JarEntry.html
-
-http://developer.android.com/reference/java/util/jar/JarFile.html
-http://developer.android.com/reference/java/util/jar/JarInputStream.html
-
-http://developer.android.com/reference/java/util/jar/JarOutputStream.html
-http://developer.android.com/reference/java/util/jar/Manifest.html
-
-http://developer.android.com/reference/java/util/jar/Pack200.html
-http://developer.android.com/reference/java/util/jar/JarException.html
-
-http://developer.android.com/reference/java/util/jar/package-descr.html
-http://developer.android.com/reference/android/view/View.MeasureSpec.html
-
-http://developer.android.com/guide/tutorials/views/hello-formstuff.html
+http://developer.android.com/reference/junit/runner/BaseTestRunner.html
+http://developer.android.com/reference/junit/runner/Version.html
+http://developer.android.com/reference/junit/runner/package-descr.html
+http://developer.android.com/reference/org/apache/http/auth/AuthScheme.html
+http://developer.android.com/reference/org/apache/http/auth/AuthSchemeFactory.html
+http://developer.android.com/reference/org/apache/http/auth/Credentials.html
+http://developer.android.com/reference/org/apache/http/auth/AUTH.html
+http://developer.android.com/reference/org/apache/http/auth/AuthSchemeRegistry.html
+http://developer.android.com/reference/org/apache/http/auth/AuthScope.html
+http://developer.android.com/reference/org/apache/http/auth/AuthState.html
+http://developer.android.com/reference/org/apache/http/auth/BasicUserPrincipal.html
+http://developer.android.com/reference/org/apache/http/auth/NTCredentials.html
+http://developer.android.com/reference/org/apache/http/auth/NTUserPrincipal.html
+http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html
+http://developer.android.com/reference/org/apache/http/auth/AuthenticationException.html
+http://developer.android.com/reference/org/apache/http/auth/InvalidCredentialsException.html
+http://developer.android.com/reference/org/apache/http/auth/MalformedChallengeException.html
+http://developer.android.com/reference/org/apache/http/auth/package-descr.html
+http://developer.android.com/reference/android/view/ContextMenu.html
+http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html
+http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html
+http://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html
+http://developer.android.com/reference/android/view/KeyEvent.Callback.html
+http://developer.android.com/reference/android/view/LayoutInflater.Factory.html
+http://developer.android.com/reference/android/view/LayoutInflater.Filter.html
+http://developer.android.com/reference/android/view/Menu.html
+http://developer.android.com/reference/android/view/MenuItem.html
+http://developer.android.com/reference/android/view/MenuItem.OnMenuItemClickListener.html
+http://developer.android.com/reference/android/view/SubMenu.html
+http://developer.android.com/reference/android/view/SurfaceHolder.html
+http://developer.android.com/reference/android/view/SurfaceHolder.Callback.html
http://developer.android.com/reference/android/view/View.OnClickListener.html
-
-http://developer.android.com/reference/android/view/View.OnLongClickListener.html
+http://developer.android.com/reference/android/view/View.OnCreateContextMenuListener.html
http://developer.android.com/reference/android/view/View.OnFocusChangeListener.html
-
http://developer.android.com/reference/android/view/View.OnKeyListener.html
+http://developer.android.com/reference/android/view/View.OnLongClickListener.html
http://developer.android.com/reference/android/view/View.OnTouchListener.html
-
-http://developer.android.com/reference/android/view/View.OnCreateContextMenuListener.html
+http://developer.android.com/reference/android/view/ViewGroup.OnHierarchyChangeListener.html
+http://developer.android.com/reference/android/view/ViewManager.html
http://developer.android.com/reference/android/view/ViewParent.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteCursorDriver.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.CursorFactory.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteCursor.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteProgram.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteQuery.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteAbortException.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteConstraintException.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteDatabaseCorruptException.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteDiskIOException.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteDoneException.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteException.html
-http://developer.android.com/reference/android/database/sqlite/SQLiteFullException.html
-
-http://developer.android.com/reference/android/database/sqlite/SQLiteMisuseException.html
-http://developer.android.com/reference/android/database/sqlite/package-descr.html
-
-http://developer.android.com/reference/android/database/Cursor.html
-http://developer.android.com/reference/java/lang/StackTraceElement.html
-
-http://developer.android.com/reference/java/io/PrintWriter.html
+http://developer.android.com/reference/android/view/ViewStub.OnInflateListener.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalFocusChangeListener.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.OnScrollChangedListener.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.OnTouchModeChangeListener.html
+http://developer.android.com/reference/android/view/Window.Callback.html
+http://developer.android.com/reference/android/view/WindowManager.html
+http://developer.android.com/reference/android/view/AbsSavedState.html
+http://developer.android.com/reference/android/view/Display.html
+http://developer.android.com/reference/android/view/FocusFinder.html
+http://developer.android.com/reference/android/view/GestureDetector.html
+http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html
+http://developer.android.com/reference/android/view/Gravity.html
+http://developer.android.com/reference/android/view/HapticFeedbackConstants.html
+http://developer.android.com/reference/android/view/KeyCharacterMap.html
+http://developer.android.com/reference/android/view/KeyCharacterMap.KeyData.html
+http://developer.android.com/reference/android/view/KeyEvent.html
+http://developer.android.com/reference/android/view/LayoutInflater.html
+http://developer.android.com/reference/android/view/MenuInflater.html
+http://developer.android.com/reference/android/view/MotionEvent.html
+http://developer.android.com/reference/android/view/OrientationEventListener.html
+http://developer.android.com/reference/android/view/OrientationListener.html
+http://developer.android.com/reference/android/view/SoundEffectConstants.html
+http://developer.android.com/reference/android/view/TouchDelegate.html
+http://developer.android.com/reference/android/view/VelocityTracker.html
+http://developer.android.com/reference/android/view/View.BaseSavedState.html
+http://developer.android.com/reference/android/view/View.MeasureSpec.html
+http://developer.android.com/reference/android/view/ViewConfiguration.html
+http://developer.android.com/reference/android/view/ViewDebug.html
+http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html
+http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html
+http://developer.android.com/reference/android/view/ViewStub.html
+http://developer.android.com/reference/android/view/ViewTreeObserver.html
+http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
+http://developer.android.com/reference/android/view/ViewDebug.HierarchyTraceType.html
+http://developer.android.com/reference/android/view/ViewDebug.RecyclerTraceType.html
+http://developer.android.com/reference/android/view/InflateException.html
+http://developer.android.com/reference/android/view/Surface.OutOfResourcesException.html
+http://developer.android.com/reference/android/view/SurfaceHolder.BadSurfaceTypeException.html
+http://developer.android.com/reference/android/view/WindowManager.BadTokenException.html
+http://developer.android.com/reference/android/graphics/drawable/Drawable.Callback.html
+http://developer.android.com/reference/android/widget/AnalogClock.html
+http://developer.android.com/reference/android/inputmethodservice/KeyboardView.html
+http://developer.android.com/reference/android/widget/ProgressBar.html
+http://developer.android.com/reference/android/widget/TextView.html
+http://developer.android.com/reference/android/inputmethodservice/Keyboard.html
+http://developer.android.com/reference/android/widget/AbsListView.html
+http://developer.android.com/reference/android/widget/AbsSeekBar.html
+http://developer.android.com/reference/android/widget/AbsSpinner.html
+http://developer.android.com/reference/android/appwidget/AppWidgetHostView.html
+http://developer.android.com/reference/android/widget/AutoCompleteTextView.html
+http://developer.android.com/reference/android/widget/Button.html
+http://developer.android.com/reference/android/widget/CheckBox.html
+http://developer.android.com/reference/android/widget/CheckedTextView.html
+http://developer.android.com/reference/android/widget/Chronometer.html
+http://developer.android.com/reference/android/widget/CompoundButton.html
+http://developer.android.com/reference/android/widget/DatePicker.html
+http://developer.android.com/reference/android/widget/DialerFilter.html
+http://developer.android.com/reference/android/widget/DigitalClock.html
+http://developer.android.com/reference/android/widget/EditText.html
+http://developer.android.com/reference/android/widget/ExpandableListView.html
+http://developer.android.com/reference/android/inputmethodservice/ExtractEditText.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.html
+http://developer.android.com/reference/android/widget/HorizontalScrollView.html
+http://developer.android.com/reference/android/widget/ImageButton.html
+http://developer.android.com/reference/android/widget/ImageSwitcher.html
+http://developer.android.com/reference/android/widget/MediaController.html
+http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.html
+http://developer.android.com/reference/android/widget/RadioButton.html
+http://developer.android.com/reference/android/widget/RadioGroup.html
+http://developer.android.com/reference/android/widget/RatingBar.html
+http://developer.android.com/reference/android/widget/SeekBar.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.html
+http://developer.android.com/reference/android/widget/TabWidget.html
+http://developer.android.com/reference/android/widget/TextSwitcher.html
+http://developer.android.com/reference/android/widget/TimePicker.html
+http://developer.android.com/reference/android/widget/ToggleButton.html
+http://developer.android.com/reference/android/widget/TwoLineListItem.html
+http://developer.android.com/reference/android/widget/VideoView.html
+http://developer.android.com/reference/android/widget/ViewAnimator.html
+http://developer.android.com/reference/android/webkit/WebView.html
+http://developer.android.com/reference/android/widget/ZoomButton.html
+http://developer.android.com/reference/android/widget/ZoomControls.html
+http://developer.android.com/reference/android/widget/Checkable.html
+http://developer.android.com/reference/android/os/Handler.html
+http://developer.android.com/reference/java/lang/RuntimeException.html
+http://developer.android.com/reference/android/util/AttributeSet.html
+http://developer.android.com/reference/java/util/ArrayList.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html
+http://developer.android.com/reference/android/os/IBinder.html
+http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
+http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html
+http://developer.android.com/reference/java/lang/Runnable.html
+http://developer.android.com/reference/android/util/SparseArray.html
+http://developer.android.com/reference/android/os/Parcelable.html
+http://developer.android.com/reference/android/content/res/TypedArray.html
+http://developer.android.com/
+http://developer.android.com/reference/android/widget/Scroller.html
+http://developer.android.com/reference/android/os/SystemClock.html
+http://developer.android.com/reference/android/util/Printer.html
+http://developer.android.com/reference/android/util/Config.html
+http://developer.android.com/reference/android/util/DebugUtils.html
+http://developer.android.com/reference/android/util/DisplayMetrics.html
+http://developer.android.com/reference/android/util/EventLogTags.html
+http://developer.android.com/reference/android/util/EventLogTags.Description.html
+http://developer.android.com/reference/android/util/FloatMath.html
+http://developer.android.com/reference/android/util/LogPrinter.html
+http://developer.android.com/reference/android/util/MonthDisplayHelper.html
+http://developer.android.com/reference/android/util/PrintStreamPrinter.html
+http://developer.android.com/reference/android/util/PrintWriterPrinter.html
+http://developer.android.com/reference/android/util/SparseBooleanArray.html
+http://developer.android.com/reference/android/util/SparseIntArray.html
+http://developer.android.com/reference/android/util/StateSet.html
+http://developer.android.com/reference/android/util/StringBuilderPrinter.html
+http://developer.android.com/reference/android/util/TimeUtils.html
+http://developer.android.com/reference/android/util/TimingLogger.html
+http://developer.android.com/reference/android/util/TypedValue.html
+http://developer.android.com/reference/android/util/Xml.html
+http://developer.android.com/reference/android/util/Xml.Encoding.html
+http://developer.android.com/reference/android/util/AndroidException.html
+http://developer.android.com/reference/android/util/AndroidRuntimeException.html
+http://developer.android.com/reference/android/util/TimeFormatException.html
+http://developer.android.com/reference/android/util/package-descr.html
+http://developer.android.com/reference/java/lang/Math.html
http://developer.android.com/reference/java/io/PrintStream.html
-
-http://developer.android.com/reference/java/math/BigDecimal.html
-http://developer.android.com/reference/java/math/BigInteger.html
-
-http://developer.android.com/reference/java/math/MathContext.html
-http://developer.android.com/reference/java/math/RoundingMode.html
-
-http://developer.android.com/reference/java/math/package-descr.html
-http://developer.android.com/reference/dalvik/system/DexFile.html
-
-http://developer.android.com/reference/dalvik/system/PathClassLoader.html
-http://developer.android.com/reference/dalvik/system/TemporaryDirectory.html
-
-http://developer.android.com/reference/dalvik/system/TouchDex.html
-http://developer.android.com/reference/dalvik/system/VMDebug.html
-
-http://developer.android.com/reference/dalvik/system/VMRuntime.html
-http://developer.android.com/reference/dalvik/system/VMStack.html
-
-http://developer.android.com/reference/dalvik/system/Zygote.html
-http://developer.android.com/reference/dalvik/system/AllocationLimitError.html
-
-http://developer.android.com/reference/dalvik/system/PotentialDeadlockError.html
-http://developer.android.com/reference/dalvik/system/StaleDexCacheError.html
-
+http://developer.android.com/reference/java/io/PrintWriter.html
+http://developer.android.com/reference/java/lang/StringBuilder.html
+http://developer.android.com/reference/android/location/LocationManager.html
http://developer.android.com/reference/org/apache/http/client/protocol/ClientContext.html
http://developer.android.com/reference/org/apache/http/client/protocol/ClientContextConfigurer.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/RequestAddCookies.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/RequestDefaultHeaders.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/RequestProxyAuthentication.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/RequestTargetAuthentication.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/ResponseProcessCookies.html
-
http://developer.android.com/reference/org/apache/http/client/protocol/package-descr.html
-http://developer.android.com/reference/android/graphics/drawable/Drawable.Callback.html
-
-http://developer.android.com/reference/android/graphics/drawable/ClipDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/ColorDrawable.html
-
-http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html
-http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.html
-
-http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.DrawableContainerState.html
-
-http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html
-
-http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/PaintDrawable.html
-
-http://developer.android.com/reference/android/graphics/drawable/RotateDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/ScaleDrawable.html
-
-http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.ShaderFactory.html
-
-http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html
-http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html
-
-http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.Orientation.html
-
-http://developer.android.com/reference/java/lang/Runnable.html
-http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
-
-http://developer.android.com/reference/android/util/AttributeSet.html
-http://developer.android.com/reference/org/xmlpull/v1/XmlPullParserException.html
-
-http://developer.android.com/reference/java/util/EventListener.html
-http://developer.android.com/reference/android/app/AliasActivity.html
-
-http://developer.android.com/reference/java/lang/ref/PhantomReference.html
-http://developer.android.com/reference/java/lang/ref/Reference.html
-
-http://developer.android.com/reference/java/lang/ref/ReferenceQueue.html
-http://developer.android.com/reference/java/lang/ref/SoftReference.html
-
-http://developer.android.com/reference/java/lang/ref/WeakReference.html
-http://developer.android.com/reference/javax/xml/parsers/DocumentBuilder.html
-
-http://developer.android.com/reference/javax/xml/parsers/DocumentBuilderFactory.html
-http://developer.android.com/reference/javax/xml/parsers/SAXParser.html
-
-http://developer.android.com/reference/javax/xml/parsers/SAXParserFactory.html
-http://developer.android.com/reference/javax/xml/parsers/ParserConfigurationException.html
-
-http://developer.android.com/reference/javax/xml/parsers/FactoryConfigurationError.html
-http://developer.android.com/reference/javax/xml/parsers/package-descr.html
-
+http://developer.android.com/reference/org/apache/http/protocol/HttpContext.html
+http://developer.android.com/reference/org/apache/http/client/CookieStore.html
+http://developer.android.com/reference/android/net/http/SslCertificate.html
+http://developer.android.com/reference/android/net/http/SslCertificate.DName.html
+http://developer.android.com/images/widget_design/Music_widget_button_states.psd
+http://developer.android.com/images/widget_design/4x1_Widget_Frame_Portrait.psd
+http://developer.android.com/images/widget_design/3x3_Widget_Frame_Portrait.psd
+http://developer.android.com/images/widget_design/2x2_Widget_Frame_Portrait.psd
+http://developer.android.com/images/widget_design/4x1_Widget_Frame_Landscape.psd
+http://developer.android.com/images/widget_design/3x3_Widget_Frame_Landscape.psd
+http://developer.android.com/images/widget_design/2x2_Widget_Frame_Landscape.psd
+http://developer.android.com/reference/javax/security/auth/login/LoginException.html
+http://developer.android.com/reference/javax/security/auth/login/package-descr.html
+http://developer.android.com/reference/javax/security/auth/callback/Callback.html
+http://developer.android.com/reference/javax/security/auth/callback/CallbackHandler.html
+http://developer.android.com/reference/javax/security/auth/callback/PasswordCallback.html
+http://developer.android.com/reference/javax/security/auth/callback/UnsupportedCallbackException.html
+http://developer.android.com/reference/javax/security/auth/callback/package-descr.html
+http://developer.android.com/reference/org/apache/http/util/ByteArrayBuffer.html
+http://developer.android.com/reference/org/apache/http/util/CharArrayBuffer.html
+http://developer.android.com/reference/org/apache/http/util/EncodingUtils.html
+http://developer.android.com/reference/org/apache/http/util/EntityUtils.html
+http://developer.android.com/reference/org/apache/http/util/ExceptionUtils.html
+http://developer.android.com/reference/org/apache/http/util/LangUtils.html
+http://developer.android.com/reference/org/apache/http/util/VersionInfo.html
+http://developer.android.com/reference/org/apache/http/util/package-descr.html
+http://developer.android.com/reference/org/apache/http/HttpEntity.html
http://developer.android.com/reference/android/app/DatePickerDialog.OnDateSetListener.html
http://developer.android.com/reference/android/app/KeyguardManager.OnKeyguardExitResult.html
-
http://developer.android.com/reference/android/app/PendingIntent.OnFinished.html
http://developer.android.com/reference/android/app/SearchManager.OnCancelListener.html
-
http://developer.android.com/reference/android/app/SearchManager.OnDismissListener.html
http://developer.android.com/reference/android/app/TimePickerDialog.OnTimeSetListener.html
-
http://developer.android.com/reference/android/app/ActivityGroup.html
http://developer.android.com/reference/android/app/ActivityManager.html
-
http://developer.android.com/reference/android/app/ActivityManager.MemoryInfo.html
http://developer.android.com/reference/android/app/ActivityManager.ProcessErrorStateInfo.html
-
http://developer.android.com/reference/android/app/ActivityManager.RecentTaskInfo.html
+http://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html
http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html
-
http://developer.android.com/reference/android/app/ActivityManager.RunningTaskInfo.html
http://developer.android.com/reference/android/app/AlarmManager.html
-
http://developer.android.com/reference/android/app/AlertDialog.html
http://developer.android.com/reference/android/app/AlertDialog.Builder.html
-
+http://developer.android.com/reference/android/app/AliasActivity.html
http://developer.android.com/reference/android/app/DatePickerDialog.html
-http://developer.android.com/reference/android/app/Dialog.html
-
http://developer.android.com/reference/android/app/ExpandableListActivity.html
http://developer.android.com/reference/android/app/Instrumentation.ActivityMonitor.html
-
http://developer.android.com/reference/android/app/Instrumentation.ActivityResult.html
+http://developer.android.com/reference/android/app/IntentService.html
http://developer.android.com/reference/android/app/KeyguardManager.html
-
http://developer.android.com/reference/android/app/KeyguardManager.KeyguardLock.html
http://developer.android.com/reference/android/app/LauncherActivity.html
-
+http://developer.android.com/reference/android/app/LauncherActivity.IconResizer.html
+http://developer.android.com/reference/android/app/LauncherActivity.ListItem.html
+http://developer.android.com/reference/android/app/ListActivity.html
http://developer.android.com/reference/android/app/LocalActivityManager.html
http://developer.android.com/reference/android/app/Notification.html
-
-http://developer.android.com/reference/android/app/NotificationManager.html
http://developer.android.com/reference/android/app/PendingIntent.html
-
http://developer.android.com/reference/android/app/ProgressDialog.html
http://developer.android.com/reference/android/app/SearchManager.html
-
http://developer.android.com/reference/android/app/TabActivity.html
http://developer.android.com/reference/android/app/TimePickerDialog.html
-
http://developer.android.com/reference/android/app/PendingIntent.CanceledException.html
http://developer.android.com/reference/android/content/ContextWrapper.html
-
-http://developer.android.com/reference/android/view/ContextThemeWrapper.html
-http://developer.android.com/reference/android/widget/ListAdapter.html
-
-http://developer.android.com/reference/android/widget/SimpleAdapter.html
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
-
+http://developer.android.com/reference/android/content/ComponentCallbacks.html
+http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.html
http://developer.android.com/reference/android/media/AudioManager.html
http://developer.android.com/reference/android/text/ClipboardManager.html
-
-http://developer.android.com/reference/android/view/LayoutInflater.html
-http://developer.android.com/reference/android/location/LocationManager.html
-
+http://developer.android.com/reference/android/net/ConnectivityManager.html
http://developer.android.com/reference/android/os/PowerManager.html
http://developer.android.com/reference/android/hardware/SensorManager.html
-
http://developer.android.com/reference/android/telephony/TelephonyManager.html
http://developer.android.com/reference/android/os/Vibrator.html
-
http://developer.android.com/reference/android/net/wifi/WifiManager.html
-http://developer.android.com/reference/android/view/WindowManager.html
-
-http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html
-http://developer.android.com/reference/android/view/KeyEvent.html
-
-http://developer.android.com/reference/android/view/MotionEvent.html
-http://developer.android.com/reference/android/content/ComponentName.html
-
-http://developer.android.com/reference/android/view/Window.html
-http://developer.android.com/reference/android/content/SharedPreferences.html
-
-http://developer.android.com/reference/java/lang/CharSequence.html
-http://developer.android.com/reference/android/content/res/Resources.Theme.html
-
http://developer.android.com/reference/android/content/res/Configuration.html
-http://developer.android.com/reference/android/view/Window.Callback.html
-
-http://developer.android.com/reference/android/view/LayoutInflater.Factory.html
-http://developer.android.com/reference/android/view/KeyEvent.Callback.html
-
-http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
+http://developer.android.com/reference/java/io/FileDescriptor.html
http://developer.android.com/reference/android/content/ServiceConnection.html
-
-http://developer.android.com/reference/java/lang/SecurityException.html
http://developer.android.com/reference/android/content/res/AssetManager.html
-
http://developer.android.com/reference/java/io/File.html
http://developer.android.com/reference/java/lang/ClassLoader.html
-
http://developer.android.com/reference/android/os/Looper.html
+http://developer.android.com/reference/android/content/SharedPreferences.html
+http://developer.android.com/reference/android/content/res/Resources.Theme.html
http://developer.android.com/reference/java/io/FileInputStream.html
-
http://developer.android.com/reference/java/io/FileOutputStream.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.CursorFactory.html
http://developer.android.com/reference/android/content/IntentFilter.html
-
-http://developer.android.com/reference/android/os/Handler.html
+http://developer.android.com/reference/android/os/Bundle.html
+http://developer.android.com/reference/android/content/ComponentName.html
http://developer.android.com/reference/java/util/Formatter.html
-
-http://developer.android.com/reference/android/content/res/TypedArray.html
-http://developer.android.com/reference/android/content/ComponentCallbacks.html
-
-http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html
-
-http://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator.html
-
-http://developer.android.com/reference/android/view/animation/AlphaAnimation.html
-http://developer.android.com/reference/android/view/animation/Animation.Description.html
-
-http://developer.android.com/reference/android/view/animation/AnimationUtils.html
-http://developer.android.com/reference/android/view/animation/CycleInterpolator.html
-
-http://developer.android.com/reference/android/view/animation/DecelerateInterpolator.html
-http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.html
-
-http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.AnimationParameters.html
-
-http://developer.android.com/reference/android/view/animation/LayoutAnimationController.html
-http://developer.android.com/reference/android/view/animation/LayoutAnimationController.AnimationParameters.html
-
-http://developer.android.com/reference/android/view/animation/LinearInterpolator.html
-http://developer.android.com/reference/android/view/animation/RotateAnimation.html
-
-http://developer.android.com/reference/android/view/animation/ScaleAnimation.html
-http://developer.android.com/reference/android/view/animation/Transformation.html
-
-http://developer.android.com/reference/android/view/animation/TranslateAnimation.html
-http://developer.android.com/reference/android/view/animation/package-descr.html
-
-http://developer.android.com/reference/android/os/IBinder.html
-http://developer.android.com/reference/android/os/IBinder.DeathRecipient.html
-
-http://developer.android.com/reference/android/os/IInterface.html
-http://developer.android.com/reference/android/os/MessageQueue.IdleHandler.html
-
-http://developer.android.com/reference/android/os/Parcelable.html
-http://developer.android.com/reference/android/os/Parcelable.Creator.html
-
-http://developer.android.com/reference/android/os/BatteryManager.html
+http://developer.android.com/sdk/1.1_r1/installing.html
+http://developer.android.com/reference/java/util/zip/Checksum.html
+http://developer.android.com/reference/java/util/zip/Adler32.html
+http://developer.android.com/reference/java/util/zip/CheckedInputStream.html
+http://developer.android.com/reference/java/util/zip/CheckedOutputStream.html
+http://developer.android.com/reference/java/util/zip/CRC32.html
+http://developer.android.com/reference/java/util/zip/Deflater.html
+http://developer.android.com/reference/java/util/zip/DeflaterOutputStream.html
+http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
+http://developer.android.com/reference/java/util/zip/GZIPOutputStream.html
+http://developer.android.com/reference/java/util/zip/Inflater.html
+http://developer.android.com/reference/java/util/zip/InflaterInputStream.html
+http://developer.android.com/reference/java/util/zip/ZipEntry.html
+http://developer.android.com/reference/java/util/zip/ZipFile.html
+http://developer.android.com/reference/java/util/zip/ZipInputStream.html
+http://developer.android.com/reference/java/util/zip/ZipOutputStream.html
+http://developer.android.com/reference/java/util/zip/DataFormatException.html
+http://developer.android.com/reference/java/util/zip/ZipException.html
+http://developer.android.com/reference/java/util/zip/package-descr.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHPrivateKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/DHPublicKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/PBEKey.html
+http://developer.android.com/reference/javax/crypto/interfaces/package-descr.html
+http://developer.android.com/sdk/1.1_r1/upgrading.html
+http://developer.android.com/sdk/1.0_r2/upgrading.html
+http://developer.android.com/sdk/1.0_r2/installing.html
+http://developer.android.com/sdk/1.0_r1/upgrading.html
+http://developer.android.com/sdk/1.0_r1/installing.html
+http://developer.android.com/guide/tutorials/views/hello-formstuff.html
+http://developer.android.com/reference/java/net/ContentHandlerFactory.html
+http://developer.android.com/reference/java/net/DatagramSocketImplFactory.html
+http://developer.android.com/reference/java/net/FileNameMap.html
+http://developer.android.com/reference/java/net/SocketImplFactory.html
+http://developer.android.com/reference/java/net/SocketOptions.html
+http://developer.android.com/reference/java/net/URLStreamHandlerFactory.html
+http://developer.android.com/reference/java/net/Authenticator.html
+http://developer.android.com/reference/java/net/CacheRequest.html
+http://developer.android.com/reference/java/net/CacheResponse.html
+http://developer.android.com/reference/java/net/ContentHandler.html
+http://developer.android.com/reference/java/net/CookieHandler.html
+http://developer.android.com/reference/java/net/DatagramPacket.html
+http://developer.android.com/reference/java/net/DatagramSocket.html
+http://developer.android.com/reference/java/net/DatagramSocketImpl.html
+http://developer.android.com/reference/java/net/HttpURLConnection.html
+http://developer.android.com/reference/java/net/Inet4Address.html
+http://developer.android.com/reference/java/net/Inet6Address.html
+http://developer.android.com/reference/java/net/InetAddress.html
+http://developer.android.com/reference/java/net/InetSocketAddress.html
+http://developer.android.com/reference/java/net/JarURLConnection.html
+http://developer.android.com/reference/java/net/MulticastSocket.html
+http://developer.android.com/reference/java/net/NetPermission.html
+http://developer.android.com/reference/java/net/NetworkInterface.html
+http://developer.android.com/reference/java/net/PasswordAuthentication.html
+http://developer.android.com/reference/java/net/Proxy.html
+http://developer.android.com/reference/java/net/ProxySelector.html
+http://developer.android.com/reference/java/net/ResponseCache.html
+http://developer.android.com/reference/java/net/SecureCacheResponse.html
+http://developer.android.com/reference/java/net/ServerSocket.html
+http://developer.android.com/reference/java/net/Socket.html
+http://developer.android.com/reference/java/net/SocketAddress.html
+http://developer.android.com/reference/java/net/SocketImpl.html
+http://developer.android.com/reference/java/net/SocketPermission.html
+http://developer.android.com/reference/java/net/URI.html
+http://developer.android.com/reference/java/net/URL.html
+http://developer.android.com/reference/java/net/URLClassLoader.html
+http://developer.android.com/reference/java/net/URLConnection.html
+http://developer.android.com/reference/java/net/URLDecoder.html
+http://developer.android.com/reference/java/net/URLEncoder.html
+http://developer.android.com/reference/java/net/URLStreamHandler.html
+http://developer.android.com/reference/java/net/Authenticator.RequestorType.html
+http://developer.android.com/reference/java/net/Proxy.Type.html
+http://developer.android.com/reference/java/net/BindException.html
+http://developer.android.com/reference/java/net/ConnectException.html
+http://developer.android.com/reference/java/net/HttpRetryException.html
+http://developer.android.com/reference/java/net/MalformedURLException.html
+http://developer.android.com/reference/java/net/NoRouteToHostException.html
+http://developer.android.com/reference/java/net/PortUnreachableException.html
+http://developer.android.com/reference/java/net/ProtocolException.html
+http://developer.android.com/reference/java/net/SocketException.html
+http://developer.android.com/reference/java/net/SocketTimeoutException.html
+http://developer.android.com/reference/java/net/UnknownHostException.html
+http://developer.android.com/reference/java/net/UnknownServiceException.html
+http://developer.android.com/reference/java/net/URISyntaxException.html
+http://developer.android.com/reference/java/net/package-descr.html
+http://developer.android.com/reference/android/graphics/drawable/ClipDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/ColorDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html
+http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.html
+http://developer.android.com/reference/android/graphics/drawable/DrawableContainer.DrawableContainerState.html
+http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/PaintDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/RotateDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/ScaleDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.ShaderFactory.html
+http://developer.android.com/reference/android/graphics/drawable/StateListDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html
+http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.Orientation.html
+http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
+http://developer.android.com/reference/org/xmlpull/v1/XmlPullParserException.html
+http://developer.android.com/reference/java/io/IOException.html
+http://developer.android.com/reference/android/content/DialogInterface.html
+http://developer.android.com/reference/android/content/DialogInterface.OnCancelListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnClickListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnKeyListener.html
+http://developer.android.com/reference/android/content/DialogInterface.OnMultiChoiceClickListener.html
+http://developer.android.com/reference/android/content/SharedPreferences.Editor.html
+http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerArgs.html
+http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerHandler.html
+http://developer.android.com/reference/android/content/ContentQueryMap.html
+http://developer.android.com/reference/android/content/Intent.FilterComparison.html
+http://developer.android.com/reference/android/content/Intent.ShortcutIconResource.html
+http://developer.android.com/reference/android/content/IntentFilter.AuthorityEntry.html
+http://developer.android.com/reference/android/content/MutableContextWrapper.html
+http://developer.android.com/reference/android/content/SearchRecentSuggestionsProvider.html
+http://developer.android.com/reference/android/content/UriMatcher.html
+http://developer.android.com/reference/android/content/ActivityNotFoundException.html
+http://developer.android.com/reference/android/content/IntentFilter.MalformedMimeTypeException.html
+http://developer.android.com/reference/android/content/ReceiverCallNotAllowedException.html
+http://developer.android.com/reference/android/test/mock/MockContext.html
+http://developer.android.com/reference/android/test/mock/MockApplication.html
+http://developer.android.com/reference/android/preference/PreferenceActivity.html
+http://developer.android.com/reference/android/preference/Preference.html
http://developer.android.com/reference/android/os/Binder.html
-
-http://developer.android.com/reference/android/os/Build.html
-http://developer.android.com/reference/android/os/Build.VERSION.html
-
-http://developer.android.com/reference/android/os/ConditionVariable.html
-http://developer.android.com/reference/android/os/CountDownTimer.html
-
-http://developer.android.com/reference/android/os/Debug.InstructionCount.html
-http://developer.android.com/reference/android/os/Debug.MemoryInfo.html
-
-http://developer.android.com/reference/android/os/Environment.html
-http://developer.android.com/reference/android/os/FileObserver.html
-
-http://developer.android.com/reference/android/os/HandlerThread.html
-http://developer.android.com/reference/android/os/MemoryFile.html
-
-http://developer.android.com/reference/android/os/Message.html
-http://developer.android.com/reference/android/os/MessageQueue.html
-
-http://developer.android.com/reference/android/os/Messenger.html
-http://developer.android.com/reference/android/os/Parcel.html
-
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.html
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseInputStream.html
-
-http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseOutputStream.html
-
-http://developer.android.com/reference/android/os/PatternMatcher.html
-http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
-
-http://developer.android.com/reference/android/os/RemoteCallbackList.html
-http://developer.android.com/reference/android/os/StatFs.html
-
-http://developer.android.com/reference/android/os/SystemClock.html
-http://developer.android.com/reference/android/os/TokenWatcher.html
-
-http://developer.android.com/reference/android/os/BadParcelableException.html
-http://developer.android.com/reference/android/os/DeadObjectException.html
-
-http://developer.android.com/reference/android/os/ParcelFormatException.html
-http://developer.android.com/reference/android/os/RemoteException.html
-
-http://developer.android.com/reference/java/lang/Cloneable.html
-http://developer.android.com/reference/java/lang/Byte.html
-
-http://developer.android.com/reference/java/util/ArrayList.html
-http://developer.android.com/reference/java/lang/Integer.html
-
-http://developer.android.com/reference/java/io/Serializable.html
-http://developer.android.com/reference/android/util/SparseArray.html
-
-http://developer.android.com/reference/java/util/Set.html
-http://developer.android.com/reference/java/nio/channels/DatagramChannel.html
-
-http://developer.android.com/reference/java/lang/IllegalArgumentException.html
-http://developer.android.com/reference/android/webkit/WebView.html
-
-http://developer.android.com/reference/android/hardware/Camera.html
-http://developer.android.com/reference/android/text/Spannable.html
-
-http://developer.android.com/reference/android/util/Log.html
-http://developer.android.com/reference/org/xml/sax/helpers/AttributeListImpl.html
-
-http://developer.android.com/reference/org/xml/sax/helpers/AttributesImpl.html
-http://developer.android.com/reference/org/xml/sax/helpers/DefaultHandler.html
-
-http://developer.android.com/reference/org/xml/sax/helpers/LocatorImpl.html
-http://developer.android.com/reference/org/xml/sax/helpers/NamespaceSupport.html
-
-http://developer.android.com/reference/org/xml/sax/helpers/ParserAdapter.html
-http://developer.android.com/reference/org/xml/sax/helpers/ParserFactory.html
-
-http://developer.android.com/reference/org/xml/sax/helpers/XMLFilterImpl.html
-http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderAdapter.html
-
-http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderFactory.html
-http://developer.android.com/reference/org/xml/sax/helpers/package-descr.html
-
-http://developer.android.com/reference/org/xml/sax/AttributeList.html
-http://developer.android.com/reference/org/xml/sax/Parser.html
-
-http://developer.android.com/reference/android/widget/AbsListView.OnScrollListener.html
-http://developer.android.com/reference/android/widget/AbsListView.RecyclerListener.html
-
-http://developer.android.com/reference/android/widget/Adapter.html
-http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html
-
-http://developer.android.com/reference/android/widget/AdapterView.OnItemLongClickListener.html
-
-http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html
-
-http://developer.android.com/reference/android/widget/AutoCompleteTextView.Validator.html
-http://developer.android.com/reference/android/widget/Checkable.html
-
-http://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html
-
-http://developer.android.com/reference/android/widget/DatePicker.OnDateChangedListener.html
-http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
-
-http://developer.android.com/reference/android/widget/ExpandableListView.OnChildClickListener.html
-
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupClickListener.html
-
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupCollapseListener.html
-
-http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupExpandListener.html
-
-http://developer.android.com/reference/android/widget/Filter.FilterListener.html
-http://developer.android.com/reference/android/widget/Filterable.html
-
-http://developer.android.com/reference/android/widget/FilterQueryProvider.html
-http://developer.android.com/reference/android/widget/MediaController.MediaPlayerControl.html
-
-http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.Tokenizer.html
-
-http://developer.android.com/reference/android/widget/RadioGroup.OnCheckedChangeListener.html
-
-http://developer.android.com/reference/android/widget/RatingBar.OnRatingBarChangeListener.html
-
-http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.html
-http://developer.android.com/reference/android/widget/SimpleAdapter.ViewBinder.html
-
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.CursorToStringConverter.html
-
-http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
-http://developer.android.com/reference/android/widget/SpinnerAdapter.html
-
-http://developer.android.com/reference/android/widget/TabHost.OnTabChangeListener.html
-http://developer.android.com/reference/android/widget/TabHost.TabContentFactory.html
-
-http://developer.android.com/reference/android/widget/TimePicker.OnTimeChangedListener.html
-http://developer.android.com/reference/android/widget/ViewSwitcher.ViewFactory.html
-
-http://developer.android.com/reference/android/widget/WrapperListAdapter.html
-http://developer.android.com/reference/android/widget/AbsListView.html
-
-http://developer.android.com/reference/android/widget/AbsListView.LayoutParams.html
-http://developer.android.com/reference/android/widget/AbsoluteLayout.LayoutParams.html
-
-http://developer.android.com/reference/android/widget/AbsSeekBar.html
-http://developer.android.com/reference/android/widget/AbsSpinner.html
-
-http://developer.android.com/reference/android/widget/AdapterView.html
-http://developer.android.com/reference/android/widget/AnalogClock.html
-
-http://developer.android.com/reference/android/widget/ArrayAdapter.html
-http://developer.android.com/reference/android/widget/BaseAdapter.html
-
-http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
-http://developer.android.com/reference/android/widget/CheckedTextView.html
-
-http://developer.android.com/reference/android/widget/Chronometer.html
-http://developer.android.com/reference/android/widget/CompoundButton.html
-
-http://developer.android.com/reference/android/widget/CursorAdapter.html
-http://developer.android.com/reference/android/widget/CursorTreeAdapter.html
-
-http://developer.android.com/reference/android/widget/DatePicker.html
-http://developer.android.com/reference/android/widget/DialerFilter.html
-
-http://developer.android.com/reference/android/widget/DigitalClock.html
-http://developer.android.com/reference/android/widget/ExpandableListView.html
-
-http://developer.android.com/reference/android/widget/ExpandableListView.ExpandableListContextMenuInfo.html
-
-http://developer.android.com/reference/android/widget/Filter.html
-http://developer.android.com/reference/android/widget/Filter.FilterResults.html
-
-http://developer.android.com/reference/android/widget/FrameLayout.LayoutParams.html
-http://developer.android.com/reference/android/widget/Gallery.LayoutParams.html
-
-http://developer.android.com/reference/android/widget/GridView.html
-http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html
-
-http://developer.android.com/reference/android/widget/ImageButton.html
-http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
-
-http://developer.android.com/reference/android/widget/ListView.FixedViewInfo.html
-http://developer.android.com/reference/android/widget/MediaController.html
-
-http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.html
-http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.CommaTokenizer.html
-
-http://developer.android.com/reference/android/widget/PopupWindow.html
-http://developer.android.com/reference/android/widget/ProgressBar.html
-
-http://developer.android.com/reference/android/widget/RadioGroup.html
-http://developer.android.com/reference/android/widget/RadioGroup.LayoutParams.html
-
-http://developer.android.com/reference/android/widget/RatingBar.html
-http://developer.android.com/reference/android/widget/RelativeLayout.html
-
-http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
-http://developer.android.com/reference/android/widget/RemoteViews.html
-
-http://developer.android.com/reference/android/widget/ResourceCursorAdapter.html
-http://developer.android.com/reference/android/widget/ResourceCursorTreeAdapter.html
-
-http://developer.android.com/reference/android/widget/Scroller.html
-http://developer.android.com/reference/android/widget/ScrollView.html
-
-http://developer.android.com/reference/android/widget/SeekBar.html
-http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
-
-http://developer.android.com/reference/android/widget/SimpleExpandableListAdapter.html
-http://developer.android.com/reference/android/widget/TabHost.html
-
-http://developer.android.com/reference/android/widget/TabHost.TabSpec.html
-http://developer.android.com/reference/android/widget/TableLayout.html
-
-http://developer.android.com/reference/android/widget/TableLayout.LayoutParams.html
-http://developer.android.com/reference/android/widget/TableRow.html
-
-http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html
-http://developer.android.com/reference/android/widget/TabWidget.html
-
-http://developer.android.com/reference/android/widget/TextView.SavedState.html
-http://developer.android.com/reference/android/widget/TimePicker.html
-
-http://developer.android.com/reference/android/widget/Toast.html
-http://developer.android.com/reference/android/widget/ToggleButton.html
-
-http://developer.android.com/reference/android/widget/TwoLineListItem.html
-http://developer.android.com/reference/android/widget/VideoView.html
-
-http://developer.android.com/reference/android/widget/ViewAnimator.html
-http://developer.android.com/reference/android/widget/ViewFlipper.html
-
-http://developer.android.com/reference/android/widget/ViewSwitcher.html
-http://developer.android.com/reference/android/widget/ZoomButton.html
-
-http://developer.android.com/reference/android/widget/ZoomControls.html
-http://developer.android.com/reference/android/widget/ImageView.ScaleType.html
-
-http://developer.android.com/reference/android/widget/TextView.BufferType.html
-http://developer.android.com/reference/android/widget/RemoteViews.ActionException.html
-
-http://developer.android.com/reference/java/lang/RuntimeException.html
-http://developer.android.com/reference/android/view/ViewGroup.OnHierarchyChangeListener.html
-
-http://developer.android.com/reference/android/view/TouchDelegate.html
-http://developer.android.com/reference/android/view/ViewTreeObserver.html
-
-http://developer.android.com/reference/android/view/ViewManager.html
-http://developer.android.com/reference/android/view/Gravity.html
-
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL.html
-http://developer.android.com/reference/java/awt/font/NumericShaper.html
-
-http://developer.android.com/reference/java/awt/font/TextAttribute.html
-http://developer.android.com/reference/android/text/TextWatcher.html
-
-http://developer.android.com/reference/android/text/method/MovementMethod.html
-http://developer.android.com/reference/android/text/TextUtils.TruncateAt.html
-
-http://developer.android.com/reference/android/text/InputFilter.html
-http://developer.android.com/reference/android/content/res/ColorStateList.html
-
-http://developer.android.com/reference/android/text/method/KeyListener.html
-http://developer.android.com/reference/android/text/Layout.html
-
-http://developer.android.com/reference/android/text/method/LinkMovementMethod.html
-http://developer.android.com/reference/android/text/TextPaint.html
-
-http://developer.android.com/reference/android/text/Selection.html
-http://developer.android.com/reference/android/text/method/TransformationMethod.html
-
-http://developer.android.com/reference/android/text/style/URLSpan.html
-http://developer.android.com/reference/android/text/util/Linkify.html
-
-http://developer.android.com/reference/android/text/Editable.Factory.html
-http://developer.android.com/reference/android/text/Spannable.Factory.html
-
-http://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html
-http://developer.android.com/reference/java/security/BasicPermission.html
-
-http://developer.android.com/reference/java/security/Guard.html
-http://developer.android.com/reference/java/security/Permission.html
-
-http://developer.android.com/reference/java/security/PermissionCollection.html
-http://developer.android.com/reference/java/util/Locale.html
-
-http://developer.android.com/reference/java/lang/NullPointerException.html
-http://developer.android.com/reference/org/apache/http/FormattedHeader.html
-
-http://developer.android.com/reference/org/apache/http/Header.html
-http://developer.android.com/reference/org/apache/http/HeaderElement.html
-
-http://developer.android.com/reference/org/apache/http/HeaderElementIterator.html
-http://developer.android.com/reference/org/apache/http/HeaderIterator.html
-
-http://developer.android.com/reference/org/apache/http/HttpClientConnection.html
-http://developer.android.com/reference/org/apache/http/HttpConnection.html
-
-http://developer.android.com/reference/org/apache/http/HttpConnectionMetrics.html
-http://developer.android.com/reference/org/apache/http/HttpEntity.html
-
-http://developer.android.com/reference/org/apache/http/HttpInetConnection.html
-http://developer.android.com/reference/org/apache/http/HttpMessage.html
-
-http://developer.android.com/reference/org/apache/http/HttpRequestFactory.html
-http://developer.android.com/reference/org/apache/http/HttpRequestInterceptor.html
-
-http://developer.android.com/reference/org/apache/http/HttpResponseFactory.html
-http://developer.android.com/reference/org/apache/http/HttpResponseInterceptor.html
-
-http://developer.android.com/reference/org/apache/http/HttpServerConnection.html
-http://developer.android.com/reference/org/apache/http/HttpStatus.html
-
-http://developer.android.com/reference/org/apache/http/NameValuePair.html
-http://developer.android.com/reference/org/apache/http/ReasonPhraseCatalog.html
-
-http://developer.android.com/reference/org/apache/http/RequestLine.html
-http://developer.android.com/reference/org/apache/http/StatusLine.html
-
-http://developer.android.com/reference/org/apache/http/TokenIterator.html
-http://developer.android.com/reference/org/apache/http/HttpVersion.html
-
-http://developer.android.com/reference/org/apache/http/ProtocolVersion.html
-http://developer.android.com/reference/org/apache/http/ConnectionClosedException.html
-
-http://developer.android.com/reference/org/apache/http/MalformedChunkCodingException.html
-http://developer.android.com/reference/org/apache/http/MethodNotSupportedException.html
-
-http://developer.android.com/reference/org/apache/http/NoHttpResponseException.html
-http://developer.android.com/reference/org/apache/http/ParseException.html
-
-http://developer.android.com/reference/org/apache/http/ProtocolException.html
-http://developer.android.com/reference/org/apache/http/UnsupportedHttpVersionException.html
-
-http://developer.android.com/reference/org/apache/http/impl/DefaultConnectionReuseStrategy.html
-
-http://developer.android.com/reference/org/apache/http/impl/NoConnectionReuseStrategy.html
-http://developer.android.com/reference/java/lang/Enum.html
-
-http://developer.android.com/reference/java/lang/Comparable.html
-http://developer.android.com/reference/javax/crypto/SecretKey.html
-
-http://developer.android.com/reference/javax/crypto/Cipher.html
-http://developer.android.com/reference/javax/crypto/CipherInputStream.html
-
-http://developer.android.com/reference/javax/crypto/CipherOutputStream.html
-http://developer.android.com/reference/javax/crypto/CipherSpi.html
-
-http://developer.android.com/reference/javax/crypto/EncryptedPrivateKeyInfo.html
-http://developer.android.com/reference/javax/crypto/ExemptionMechanism.html
-
-http://developer.android.com/reference/javax/crypto/ExemptionMechanismSpi.html
-http://developer.android.com/reference/javax/crypto/KeyAgreement.html
-
-http://developer.android.com/reference/javax/crypto/KeyAgreementSpi.html
-http://developer.android.com/reference/javax/crypto/KeyGenerator.html
-
-http://developer.android.com/reference/javax/crypto/KeyGeneratorSpi.html
-http://developer.android.com/reference/javax/crypto/Mac.html
-
-http://developer.android.com/reference/javax/crypto/MacSpi.html
-http://developer.android.com/reference/javax/crypto/NullCipher.html
-
-http://developer.android.com/reference/javax/crypto/SealedObject.html
-http://developer.android.com/reference/javax/crypto/SecretKeyFactory.html
-
-http://developer.android.com/reference/javax/crypto/SecretKeyFactorySpi.html
-http://developer.android.com/reference/javax/crypto/BadPaddingException.html
-
-http://developer.android.com/reference/javax/crypto/ExemptionMechanismException.html
-http://developer.android.com/reference/javax/crypto/IllegalBlockSizeException.html
-
-http://developer.android.com/reference/javax/crypto/NoSuchPaddingException.html
-http://developer.android.com/reference/javax/crypto/ShortBufferException.html
-
-http://developer.android.com/reference/javax/crypto/package-descr.html
-http://developer.android.com/reference/android/database/CrossProcessCursor.html
-
-http://developer.android.com/reference/android/database/AbstractCursor.html
-http://developer.android.com/reference/android/database/AbstractCursor.SelfContentObserver.html
-
-http://developer.android.com/reference/android/database/AbstractWindowedCursor.html
-http://developer.android.com/reference/android/database/CharArrayBuffer.html
-
-http://developer.android.com/reference/android/database/ContentObservable.html
-http://developer.android.com/reference/android/database/ContentObserver.html
-
-http://developer.android.com/reference/android/database/CursorJoiner.html
-http://developer.android.com/reference/android/database/CursorWindow.html
-
-http://developer.android.com/reference/android/database/CursorWrapper.html
-http://developer.android.com/reference/android/database/DatabaseUtils.html
-
-http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
-http://developer.android.com/reference/android/database/DataSetObservable.html
-
-http://developer.android.com/reference/android/database/DataSetObserver.html
-http://developer.android.com/reference/android/database/MatrixCursor.html
-
-http://developer.android.com/reference/android/database/MatrixCursor.RowBuilder.html
-http://developer.android.com/reference/android/database/MergeCursor.html
-
-http://developer.android.com/reference/android/database/Observable.html
-http://developer.android.com/reference/android/database/CursorJoiner.Result.html
-
-http://developer.android.com/reference/android/database/CursorIndexOutOfBoundsException.html
-http://developer.android.com/reference/android/database/SQLException.html
-
-http://developer.android.com/reference/android/database/StaleDataException.html
-http://developer.android.com/reference/android/database/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManager.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManagerFactory.html
-
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionOperator.html
-http://developer.android.com/reference/org/apache/http/conn/ClientConnectionRequest.html
-
-http://developer.android.com/reference/org/apache/http/conn/ConnectionReleaseTrigger.html
-http://developer.android.com/reference/org/apache/http/conn/EofSensorWatcher.html
-
-http://developer.android.com/reference/org/apache/http/conn/ManagedClientConnection.html
-http://developer.android.com/reference/org/apache/http/conn/OperatedClientConnection.html
-
-http://developer.android.com/reference/org/apache/http/conn/BasicEofSensorWatcher.html
-http://developer.android.com/reference/org/apache/http/conn/BasicManagedEntity.html
-
-http://developer.android.com/reference/org/apache/http/conn/EofSensorInputStream.html
-http://developer.android.com/reference/org/apache/http/conn/MultihomePlainSocketFactory.html
-
-http://developer.android.com/reference/org/apache/http/conn/ConnectionPoolTimeoutException.html
-
-http://developer.android.com/reference/org/apache/http/conn/ConnectTimeoutException.html
-http://developer.android.com/reference/org/apache/http/conn/HttpHostConnectException.html
-
-http://developer.android.com/reference/java/nio/charset/Charset.html
-http://developer.android.com/reference/java/nio/charset/CharsetDecoder.html
-
-http://developer.android.com/reference/java/nio/charset/CharsetEncoder.html
-http://developer.android.com/reference/java/nio/charset/CoderResult.html
-
-http://developer.android.com/reference/java/nio/charset/CodingErrorAction.html
-http://developer.android.com/reference/java/nio/charset/CharacterCodingException.html
-
-http://developer.android.com/reference/java/nio/charset/IllegalCharsetNameException.html
-http://developer.android.com/reference/java/nio/charset/MalformedInputException.html
-
-http://developer.android.com/reference/java/nio/charset/UnmappableCharacterException.html
-http://developer.android.com/reference/java/nio/charset/UnsupportedCharsetException.html
-
-http://developer.android.com/reference/java/nio/charset/CoderMalfunctionError.html
-http://developer.android.com/reference/java/nio/charset/package-descr.html
-
-http://developer.android.com/reference/com/google/android/maps/MapView.html
-http://developer.android.com/reference/com/google/android/maps/MapActivity.html
-
-http://developer.android.com/guide/topics/location/geo/mapkey.html
-http://developer.android.com/reference/com/google/android/maps/MapController.html
-
-http://developer.android.com/reference/com/google/android/maps/ItemizedOverlay.html
-http://developer.android.com/reference/com/google/android/maps/Overlay.html
-
-http://developer.android.com/reference/java/lang/CloneNotSupportedException.html
-http://developer.android.com/reference/java/security/AlgorithmParameters.html
-
-http://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec.html
-http://developer.android.com/reference/java/security/Key.html
-
-http://developer.android.com/reference/java/security/Provider.html
-http://developer.android.com/reference/java/security/NoSuchAlgorithmException.html
-
-http://developer.android.com/reference/java/security/NoSuchProviderException.html
-http://developer.android.com/reference/java/security/InvalidKeyException.html
-
-http://developer.android.com/reference/java/security/spec/InvalidKeySpecException.html
-http://developer.android.com/reference/android/webkit/DownloadListener.html
-
-http://developer.android.com/reference/android/webkit/Plugin.PreferencesClickHandler.html
-http://developer.android.com/reference/android/webkit/UrlInterceptHandler.html
-
-http://developer.android.com/reference/android/webkit/WebIconDatabase.IconListener.html
-http://developer.android.com/reference/android/webkit/WebView.PictureListener.html
-
-http://developer.android.com/reference/android/webkit/CacheManager.html
-http://developer.android.com/reference/android/webkit/CacheManager.CacheResult.html
-
-http://developer.android.com/reference/android/webkit/CookieManager.html
-http://developer.android.com/reference/android/webkit/CookieSyncManager.html
-
-http://developer.android.com/reference/android/webkit/DateSorter.html
-http://developer.android.com/reference/android/webkit/HttpAuthHandler.html
-
-http://developer.android.com/reference/android/webkit/JsPromptResult.html
-http://developer.android.com/reference/android/webkit/JsResult.html
-
-http://developer.android.com/reference/android/webkit/MimeTypeMap.html
-http://developer.android.com/reference/android/webkit/Plugin.html
-
-http://developer.android.com/reference/android/webkit/PluginList.html
-http://developer.android.com/reference/android/webkit/SslErrorHandler.html
-
-http://developer.android.com/reference/android/webkit/UrlInterceptRegistry.html
-http://developer.android.com/reference/android/webkit/URLUtil.html
-
-http://developer.android.com/reference/android/webkit/WebBackForwardList.html
-http://developer.android.com/reference/android/webkit/WebChromeClient.html
-
-http://developer.android.com/reference/android/webkit/WebHistoryItem.html
-http://developer.android.com/reference/android/webkit/WebIconDatabase.html
-
-http://developer.android.com/reference/android/webkit/WebSettings.html
-http://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
-
-http://developer.android.com/reference/android/webkit/WebView.WebViewTransport.html
-http://developer.android.com/reference/android/webkit/WebViewClient.html
-
-http://developer.android.com/reference/android/webkit/WebViewDatabase.html
-http://developer.android.com/reference/android/webkit/WebSettings.LayoutAlgorithm.html
-
-http://developer.android.com/reference/android/webkit/WebSettings.RenderPriority.html
-http://developer.android.com/reference/android/webkit/WebSettings.TextSize.html
-
-http://developer.android.com/reference/android/webkit/package-descr.html
-http://developer.android.com/reference/java/util/Map.html
-
+http://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html
+http://developer.android.com/reference/android/content/res/Resources.NotFoundException.html
+http://developer.android.com/reference/java/io/FileNotFoundException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteException.html
http://developer.android.com/reference/android/graphics/drawable/shapes/ArcShape.html
http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html
-
http://developer.android.com/reference/android/graphics/drawable/shapes/RectShape.html
http://developer.android.com/reference/android/graphics/drawable/shapes/RoundRectShape.html
-
http://developer.android.com/reference/android/graphics/drawable/shapes/Shape.html
-http://developer.android.com/reference/android/graphics/drawable/package-descr.html
-
-http://developer.android.com/reference/java/lang/IndexOutOfBoundsException.html
-http://developer.android.com/reference/android/content/pm/ActivityInfo.html
-
-http://developer.android.com/reference/java/lang/InstantiationException.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceView.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html
-
-http://developer.android.com/reference/java/util/concurrent/BlockingQueue.html
-http://developer.android.com/reference/java/util/concurrent/Callable.html
-
-http://developer.android.com/reference/java/util/concurrent/CompletionService.html
-http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html
-
-http://developer.android.com/reference/java/util/concurrent/Delayed.html
-http://developer.android.com/reference/java/util/concurrent/Executor.html
-
-http://developer.android.com/reference/java/util/concurrent/ExecutorService.html
-http://developer.android.com/reference/java/util/concurrent/Future.html
-
-http://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html
-http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html
-
-http://developer.android.com/reference/java/util/concurrent/ScheduledFuture.html
-http://developer.android.com/reference/java/util/concurrent/ThreadFactory.html
-
-http://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html
-http://developer.android.com/reference/java/util/concurrent/ArrayBlockingQueue.html
-
-http://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html
-http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html
-
-http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArrayList.html
-http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArraySet.html
-
-http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html
-http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html
-
-http://developer.android.com/reference/java/util/concurrent/DelayQueue.html
-http://developer.android.com/reference/java/util/concurrent/Exchanger.html
-
-http://developer.android.com/reference/java/util/concurrent/ExecutorCompletionService.html
-http://developer.android.com/reference/java/util/concurrent/Executors.html
-
-http://developer.android.com/reference/java/util/concurrent/FutureTask.html
-http://developer.android.com/reference/java/util/concurrent/LinkedBlockingQueue.html
-
-http://developer.android.com/reference/java/util/concurrent/PriorityBlockingQueue.html
-http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html
-
-http://developer.android.com/reference/java/util/concurrent/Semaphore.html
-http://developer.android.com/reference/java/util/concurrent/SynchronousQueue.html
-
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.AbortPolicy.html
-
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.CallerRunsPolicy.html
-
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardOldestPolicy.html
-
-http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardPolicy.html
-
-http://developer.android.com/reference/java/util/concurrent/TimeUnit.html
-http://developer.android.com/reference/java/util/concurrent/BrokenBarrierException.html
-
-http://developer.android.com/reference/java/util/concurrent/CancellationException.html
-http://developer.android.com/reference/java/util/concurrent/ExecutionException.html
-
-http://developer.android.com/reference/java/util/concurrent/RejectedExecutionException.html
-http://developer.android.com/reference/java/util/concurrent/TimeoutException.html
-
-http://developer.android.com/reference/java/util/concurrent/package-descr.html
-http://developer.android.com/reference/java/util/Queue.html
-
-http://developer.android.com/reference/java/util/PriorityQueue.html
-http://developer.android.com/reference/android/telephony/CellLocation.html
-
-http://developer.android.com/reference/android/telephony/PhoneNumberFormattingTextWatcher.html
-
-http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html
-http://developer.android.com/reference/android/telephony/PhoneStateListener.html
-
-http://developer.android.com/reference/android/telephony/ServiceState.html
+http://developer.android.com/reference/java/lang/annotation/Annotation.html
+http://developer.android.com/reference/java/lang/annotation/ElementType.html
+http://developer.android.com/reference/java/lang/annotation/RetentionPolicy.html
+http://developer.android.com/reference/java/lang/annotation/AnnotationTypeMismatchException.html
+http://developer.android.com/reference/java/lang/annotation/IncompleteAnnotationException.html
+http://developer.android.com/reference/java/lang/annotation/AnnotationFormatError.html
+http://developer.android.com/reference/java/lang/annotation/package-descr.html
+http://developer.android.com/reference/java/lang/ref/PhantomReference.html
+http://developer.android.com/reference/java/lang/ref/Reference.html
+http://developer.android.com/reference/java/lang/ref/SoftReference.html
+http://developer.android.com/reference/java/lang/ref/WeakReference.html
http://developer.android.com/reference/java/lang/Appendable.html
-
+http://developer.android.com/reference/java/lang/Cloneable.html
+http://developer.android.com/reference/java/lang/Comparable.html
http://developer.android.com/reference/java/lang/Iterable.html
http://developer.android.com/reference/java/lang/Readable.html
-
http://developer.android.com/reference/java/lang/Thread.UncaughtExceptionHandler.html
http://developer.android.com/reference/java/lang/Boolean.html
-
+http://developer.android.com/reference/java/lang/Byte.html
http://developer.android.com/reference/java/lang/Character.html
http://developer.android.com/reference/java/lang/Character.Subset.html
-
http://developer.android.com/reference/java/lang/Character.UnicodeBlock.html
http://developer.android.com/reference/java/lang/Compiler.html
-
http://developer.android.com/reference/java/lang/Double.html
+http://developer.android.com/reference/java/lang/Enum.html
http://developer.android.com/reference/java/lang/Float.html
-
http://developer.android.com/reference/java/lang/InheritableThreadLocal.html
+http://developer.android.com/reference/java/lang/Integer.html
http://developer.android.com/reference/java/lang/Long.html
-
-http://developer.android.com/reference/java/lang/Math.html
http://developer.android.com/reference/java/lang/Number.html
-
http://developer.android.com/reference/java/lang/Package.html
http://developer.android.com/reference/java/lang/Process.html
-
http://developer.android.com/reference/java/lang/ProcessBuilder.html
http://developer.android.com/reference/java/lang/Runtime.html
-
http://developer.android.com/reference/java/lang/RuntimePermission.html
http://developer.android.com/reference/java/lang/SecurityManager.html
-
http://developer.android.com/reference/java/lang/Short.html
+http://developer.android.com/reference/java/lang/StackTraceElement.html
http://developer.android.com/reference/java/lang/StrictMath.html
-
http://developer.android.com/reference/java/lang/StringBuffer.html
-http://developer.android.com/reference/java/lang/StringBuilder.html
-
http://developer.android.com/reference/java/lang/System.html
http://developer.android.com/reference/java/lang/Thread.html
-
http://developer.android.com/reference/java/lang/ThreadGroup.html
http://developer.android.com/reference/java/lang/ThreadLocal.html
-
http://developer.android.com/reference/java/lang/Void.html
http://developer.android.com/reference/java/lang/Thread.State.html
-
http://developer.android.com/reference/java/lang/ArithmeticException.html
http://developer.android.com/reference/java/lang/ArrayIndexOutOfBoundsException.html
-
http://developer.android.com/reference/java/lang/ArrayStoreException.html
http://developer.android.com/reference/java/lang/ClassCastException.html
-
+http://developer.android.com/reference/java/lang/ClassNotFoundException.html
+http://developer.android.com/reference/java/lang/CloneNotSupportedException.html
http://developer.android.com/reference/java/lang/EnumConstantNotPresentException.html
+http://developer.android.com/reference/java/lang/Exception.html
+http://developer.android.com/reference/java/lang/IllegalAccessException.html
+http://developer.android.com/reference/java/lang/IllegalArgumentException.html
http://developer.android.com/reference/java/lang/IllegalMonitorStateException.html
-
http://developer.android.com/reference/java/lang/IllegalStateException.html
http://developer.android.com/reference/java/lang/IllegalThreadStateException.html
-
+http://developer.android.com/reference/java/lang/IndexOutOfBoundsException.html
+http://developer.android.com/reference/java/lang/InstantiationException.html
http://developer.android.com/reference/java/lang/InterruptedException.html
http://developer.android.com/reference/java/lang/NegativeArraySizeException.html
-
http://developer.android.com/reference/java/lang/NoSuchFieldException.html
http://developer.android.com/reference/java/lang/NoSuchMethodException.html
-
+http://developer.android.com/reference/java/lang/NullPointerException.html
http://developer.android.com/reference/java/lang/NumberFormatException.html
http://developer.android.com/reference/java/lang/StringIndexOutOfBoundsException.html
-
http://developer.android.com/reference/java/lang/TypeNotPresentException.html
http://developer.android.com/reference/java/lang/UnsupportedOperationException.html
-
http://developer.android.com/reference/java/lang/AbstractMethodError.html
http://developer.android.com/reference/java/lang/AssertionError.html
-
http://developer.android.com/reference/java/lang/ClassCircularityError.html
http://developer.android.com/reference/java/lang/ClassFormatError.html
-
http://developer.android.com/reference/java/lang/Error.html
http://developer.android.com/reference/java/lang/ExceptionInInitializerError.html
-
http://developer.android.com/reference/java/lang/IllegalAccessError.html
http://developer.android.com/reference/java/lang/IncompatibleClassChangeError.html
-
http://developer.android.com/reference/java/lang/InstantiationError.html
http://developer.android.com/reference/java/lang/InternalError.html
-
http://developer.android.com/reference/java/lang/LinkageError.html
http://developer.android.com/reference/java/lang/NoClassDefFoundError.html
-
http://developer.android.com/reference/java/lang/NoSuchFieldError.html
http://developer.android.com/reference/java/lang/NoSuchMethodError.html
-
http://developer.android.com/reference/java/lang/OutOfMemoryError.html
http://developer.android.com/reference/java/lang/StackOverflowError.html
-
http://developer.android.com/reference/java/lang/ThreadDeath.html
http://developer.android.com/reference/java/lang/UnknownError.html
-
http://developer.android.com/reference/java/lang/UnsatisfiedLinkError.html
http://developer.android.com/reference/java/lang/UnsupportedClassVersionError.html
-
http://developer.android.com/reference/java/lang/VerifyError.html
http://developer.android.com/reference/java/lang/VirtualMachineError.html
-
-http://developer.android.com/reference/java/nio/ByteBuffer.html
-http://developer.android.com/reference/java/util/Calendar.html
-
-http://developer.android.com/reference/java/nio/CharBuffer.html
-http://developer.android.com/reference/android/preference/CheckBoxPreference.html
-
-http://developer.android.com/reference/java/sql/Date.html
-http://developer.android.com/reference/android/preference/DialogPreference.html
-
-http://developer.android.com/reference/java/nio/DoubleBuffer.html
-http://developer.android.com/reference/android/preference/EditTextPreference.html
-
-http://developer.android.com/reference/java/lang/annotation/ElementType.html
-http://developer.android.com/reference/java/nio/FloatBuffer.html
-
-http://developer.android.com/reference/java/util/Formatter.BigDecimalLayoutForm.html
-http://developer.android.com/reference/java/util/GregorianCalendar.html
-
-http://developer.android.com/reference/java/nio/IntBuffer.html
-http://developer.android.com/reference/java/security/KeyRep.Type.html
-
-http://developer.android.com/reference/android/text/Layout.Alignment.html
-http://developer.android.com/reference/android/preference/ListPreference.html
-
-http://developer.android.com/reference/java/nio/LongBuffer.html
-http://developer.android.com/reference/com/google/android/maps/MapView.ReticleDrawMode.html
-
-http://developer.android.com/reference/java/nio/MappedByteBuffer.html
-http://developer.android.com/reference/java/io/ObjectStreamField.html
-
-http://developer.android.com/reference/android/preference/Preference.html
-http://developer.android.com/reference/android/preference/PreferenceCategory.html
-
-http://developer.android.com/reference/android/preference/PreferenceGroup.html
-http://developer.android.com/reference/android/preference/PreferenceScreen.html
-
-http://developer.android.com/reference/java/lang/annotation/RetentionPolicy.html
-http://developer.android.com/reference/android/preference/RingtonePreference.html
-
-http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.LayerType.html
-http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.TunnelType.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.HandshakeStatus.html
-http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.Status.html
-
-http://developer.android.com/reference/java/nio/ShortBuffer.html
-http://developer.android.com/reference/android/telephony/gsm/SmsMessage.MessageClass.html
-
-http://developer.android.com/reference/android/net/wifi/SupplicantState.html
-http://developer.android.com/reference/android/text/method/TextKeyListener.Capitalize.html
-
-http://developer.android.com/reference/java/sql/Time.html
-http://developer.android.com/reference/java/sql/Timestamp.html
-
-http://developer.android.com/reference/java/util/UUID.html
-http://developer.android.com/reference/android/view/ViewDebug.HierarchyTraceType.html
-
-http://developer.android.com/reference/android/view/ViewDebug.RecyclerTraceType.html
-http://developer.android.com/reference/android/util/Xml.Encoding.html
-
-http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngine.html
-http://developer.android.com/reference/org/apache/http/impl/auth/AuthSchemeBase.html
-
-http://developer.android.com/reference/org/apache/http/impl/auth/BasicScheme.html
-http://developer.android.com/reference/org/apache/http/impl/auth/BasicSchemeFactory.html
-
-http://developer.android.com/reference/org/apache/http/impl/auth/DigestScheme.html
-http://developer.android.com/reference/org/apache/http/impl/auth/DigestSchemeFactory.html
-
-http://developer.android.com/reference/org/apache/http/impl/auth/NTLMScheme.html
-http://developer.android.com/reference/org/apache/http/impl/auth/RFC2617Scheme.html
-
-http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngineException.html
-http://developer.android.com/reference/org/apache/http/impl/auth/UnsupportedDigestAlgorithmException.html
-
-http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html
-
-http://developer.android.com/reference/android/preference/Preference.OnPreferenceClickListener.html
-
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityDestroyListener.html
-
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityResultListener.html
-
-http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityStopListener.html
-
-http://developer.android.com/reference/android/preference/Preference.BaseSavedState.html
-http://developer.android.com/reference/android/preference/PreferenceManager.html
-
-http://developer.android.com/reference/android/util/Printer.html
-http://developer.android.com/reference/android/util/Config.html
-
-http://developer.android.com/reference/android/util/DebugUtils.html
-http://developer.android.com/reference/android/util/DisplayMetrics.html
-
-http://developer.android.com/reference/android/util/EventLogTags.html
-http://developer.android.com/reference/android/util/EventLogTags.Description.html
-
-http://developer.android.com/reference/android/util/FloatMath.html
-http://developer.android.com/reference/android/util/LogPrinter.html
-
-http://developer.android.com/reference/android/util/MonthDisplayHelper.html
-http://developer.android.com/reference/android/util/PrintWriterPrinter.html
-
-http://developer.android.com/reference/android/util/SparseBooleanArray.html
-http://developer.android.com/reference/android/util/SparseIntArray.html
-
-http://developer.android.com/reference/android/util/StateSet.html
-http://developer.android.com/reference/android/util/StringBuilderPrinter.html
-
-http://developer.android.com/reference/android/util/TimeUtils.html
-http://developer.android.com/reference/android/util/TimingLogger.html
-
-http://developer.android.com/reference/android/util/TypedValue.html
-http://developer.android.com/reference/android/util/Xml.html
-
-http://developer.android.com/reference/android/util/AndroidException.html
-http://developer.android.com/reference/android/util/AndroidRuntimeException.html
-
-http://developer.android.com/reference/android/util/TimeFormatException.html
-http://developer.android.com/reference/android/content/res/XmlResourceParser.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html
-http://developer.android.com/reference/javax/net/SocketFactory.html
-
-http://developer.android.com/reference/java/security/KeyManagementException.html
-http://developer.android.com/reference/org/apache/http/message/BasicHeader.html
-
-http://developer.android.com/reference/org/apache/http/message/BufferedHeader.html
-http://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html
-
-http://developer.android.com/reference/android/view/LayoutInflater.Filter.html
-http://developer.android.com/reference/android/view/MenuItem.OnMenuItemClickListener.html
-
-http://developer.android.com/reference/android/view/SurfaceHolder.html
-http://developer.android.com/reference/android/view/SurfaceHolder.Callback.html
-
-http://developer.android.com/reference/android/view/ViewStub.OnInflateListener.html
-http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalFocusChangeListener.html
-
-http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html
-
-http://developer.android.com/reference/android/view/ViewTreeObserver.OnTouchModeChangeListener.html
-
-http://developer.android.com/reference/android/view/AbsSavedState.html
-http://developer.android.com/reference/android/view/Display.html
-
-http://developer.android.com/reference/android/view/FocusFinder.html
-http://developer.android.com/reference/android/view/GestureDetector.html
-
-http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html
-
-http://developer.android.com/reference/android/view/KeyCharacterMap.html
-http://developer.android.com/reference/android/view/KeyCharacterMap.KeyData.html
-
-http://developer.android.com/reference/android/view/OrientationListener.html
-http://developer.android.com/reference/android/view/SoundEffectConstants.html
-
-http://developer.android.com/reference/android/view/Surface.html
-http://developer.android.com/reference/android/view/VelocityTracker.html
-
-http://developer.android.com/reference/android/view/View.BaseSavedState.html
-http://developer.android.com/reference/android/view/ViewConfiguration.html
-
-http://developer.android.com/reference/android/view/ViewDebug.html
-http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html
-
-http://developer.android.com/reference/android/view/ViewStub.html
-http://developer.android.com/reference/android/view/InflateException.html
-
-http://developer.android.com/reference/android/view/Surface.OutOfResourcesException.html
-http://developer.android.com/reference/android/view/SurfaceHolder.BadSurfaceTypeException.html
-
-http://developer.android.com/reference/android/view/WindowManager.BadTokenException.html
-http://developer.android.com/reference/org/apache/http/entity/AbstractHttpEntity.html
-
-http://developer.android.com/reference/org/apache/http/entity/BasicHttpEntity.html
-http://developer.android.com/reference/org/apache/http/entity/BufferedHttpEntity.html
-
-http://developer.android.com/reference/org/apache/http/entity/ByteArrayEntity.html
-http://developer.android.com/reference/org/apache/http/entity/EntityTemplate.html
-
-http://developer.android.com/reference/org/apache/http/entity/FileEntity.html
-http://developer.android.com/reference/org/apache/http/entity/HttpEntityWrapper.html
-
-http://developer.android.com/reference/org/apache/http/entity/InputStreamEntity.html
-http://developer.android.com/reference/org/apache/http/entity/SerializableEntity.html
-
-http://developer.android.com/reference/org/apache/http/entity/StringEntity.html
-http://developer.android.com/reference/org/apache/http/client/entity/UrlEncodedFormEntity.html
-
-http://developer.android.com/reference/java/util/concurrent/atomic/AtomicInteger.html
-http://developer.android.com/reference/java/util/concurrent/atomic/AtomicLong.html
-
-http://developer.android.com/reference/java/util/Collection.html
-http://developer.android.com/reference/java/util/Comparator.html
-
-http://developer.android.com/reference/java/util/Enumeration.html
-http://developer.android.com/reference/java/util/Formattable.html
-
-http://developer.android.com/reference/java/util/Iterator.html
-http://developer.android.com/reference/java/util/ListIterator.html
-
-http://developer.android.com/reference/java/util/Map.Entry.html
-http://developer.android.com/reference/java/util/Observer.html
-
-http://developer.android.com/reference/java/util/RandomAccess.html
-http://developer.android.com/reference/java/util/SortedMap.html
-
-http://developer.android.com/reference/java/util/SortedSet.html
+http://developer.android.com/reference/org/apache/http/impl/client/AbstractAuthenticationHandler.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractClientConnAdapter.html
http://developer.android.com/reference/java/util/AbstractCollection.html
-
-http://developer.android.com/reference/java/util/AbstractList.html
-http://developer.android.com/reference/java/util/AbstractMap.html
-
-http://developer.android.com/reference/java/util/AbstractQueue.html
-http://developer.android.com/reference/java/util/AbstractSequentialList.html
-
-http://developer.android.com/reference/java/util/AbstractSet.html
-http://developer.android.com/reference/java/util/Arrays.html
-
-http://developer.android.com/reference/java/util/BitSet.html
-http://developer.android.com/reference/java/util/Collections.html
-
-http://developer.android.com/reference/java/util/Currency.html
-http://developer.android.com/reference/java/util/Dictionary.html
-
-http://developer.android.com/reference/java/util/EnumMap.html
-http://developer.android.com/reference/java/util/EnumSet.html
-
-http://developer.android.com/reference/java/util/EventListenerProxy.html
-http://developer.android.com/reference/java/util/EventObject.html
-
-http://developer.android.com/reference/java/util/FormattableFlags.html
-http://developer.android.com/reference/java/util/HashMap.html
-
-http://developer.android.com/reference/java/util/HashSet.html
-http://developer.android.com/reference/java/util/Hashtable.html
-
-http://developer.android.com/reference/java/util/IdentityHashMap.html
-http://developer.android.com/reference/java/util/LinkedHashMap.html
-
-http://developer.android.com/reference/java/util/LinkedHashSet.html
-http://developer.android.com/reference/java/util/LinkedList.html
-
-http://developer.android.com/reference/java/util/ListResourceBundle.html
-http://developer.android.com/reference/java/util/Observable.html
-
-http://developer.android.com/reference/java/util/PropertyPermission.html
-http://developer.android.com/reference/java/util/PropertyResourceBundle.html
-
-http://developer.android.com/reference/java/util/Random.html
-http://developer.android.com/reference/java/util/ResourceBundle.html
-
-http://developer.android.com/reference/java/util/Scanner.html
-http://developer.android.com/reference/java/util/SimpleTimeZone.html
-
-http://developer.android.com/reference/java/util/Stack.html
-http://developer.android.com/reference/java/util/StringTokenizer.html
-
-http://developer.android.com/reference/java/util/Timer.html
-http://developer.android.com/reference/java/util/TimerTask.html
-
-http://developer.android.com/reference/java/util/TimeZone.html
-http://developer.android.com/reference/java/util/TreeMap.html
-
-http://developer.android.com/reference/java/util/TreeSet.html
-http://developer.android.com/reference/java/util/Vector.html
-
-http://developer.android.com/reference/java/util/WeakHashMap.html
-http://developer.android.com/reference/java/util/ConcurrentModificationException.html
-
-http://developer.android.com/reference/java/util/DuplicateFormatFlagsException.html
-http://developer.android.com/reference/java/util/EmptyStackException.html
-
-http://developer.android.com/reference/java/util/FormatFlagsConversionMismatchException.html
-http://developer.android.com/reference/java/util/FormatterClosedException.html
-
-http://developer.android.com/reference/java/util/IllegalFormatCodePointException.html
-http://developer.android.com/reference/java/util/IllegalFormatConversionException.html
-
-http://developer.android.com/reference/java/util/IllegalFormatException.html
-http://developer.android.com/reference/java/util/IllegalFormatFlagsException.html
-
-http://developer.android.com/reference/java/util/IllegalFormatPrecisionException.html
-http://developer.android.com/reference/java/util/IllegalFormatWidthException.html
-
-http://developer.android.com/reference/java/util/InputMismatchException.html
-http://developer.android.com/reference/java/util/InvalidPropertiesFormatException.html
-
-http://developer.android.com/reference/java/util/MissingFormatArgumentException.html
-http://developer.android.com/reference/java/util/MissingFormatWidthException.html
-
-http://developer.android.com/reference/java/util/MissingResourceException.html
-http://developer.android.com/reference/java/util/NoSuchElementException.html
-
-http://developer.android.com/reference/java/util/TooManyListenersException.html
-http://developer.android.com/reference/java/util/UnknownFormatConversionException.html
-
-http://developer.android.com/reference/java/util/UnknownFormatFlagsException.html
-http://developer.android.com/reference/org/apache/http/impl/EnglishReasonPhraseCatalog.html
-
-http://developer.android.com/reference/org/apache/http/params/CoreConnectionPNames.html
-http://developer.android.com/reference/org/apache/http/params/CoreProtocolPNames.html
-
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/AbstractConnPool.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieAttributeHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieSpec.html
+http://developer.android.com/reference/android/database/AbstractCursor.html
+http://developer.android.com/reference/java/util/concurrent/AbstractExecutorService.html
+http://developer.android.com/reference/org/apache/http/impl/client/AbstractHttpClient.html
+http://developer.android.com/reference/org/apache/http/impl/AbstractHttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/entity/AbstractHttpEntity.html
http://developer.android.com/reference/org/apache/http/params/AbstractHttpParams.html
-http://developer.android.com/reference/org/apache/http/params/BasicHttpParams.html
-
-http://developer.android.com/reference/org/apache/http/params/DefaultedHttpParams.html
-http://developer.android.com/reference/org/apache/http/params/HttpAbstractParamBean.html
-
-http://developer.android.com/reference/org/apache/http/params/HttpConnectionParamBean.html
-http://developer.android.com/reference/org/apache/http/params/HttpConnectionParams.html
-
-http://developer.android.com/reference/org/apache/http/params/HttpProtocolParamBean.html
-http://developer.android.com/reference/org/apache/http/params/HttpProtocolParams.html
-
-http://developer.android.com/reference/org/apache/http/params/package-descr.html
-http://developer.android.com/reference/org/apache/http/io/SessionOutputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/util/CharArrayBuffer.html
-http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
-
-http://developer.android.com/reference/android/content/res/AssetManager.AssetInputStream.html
-
-http://developer.android.com/reference/android/content/res/Resources.NotFoundException.html
-http://developer.android.com/reference/java/util/zip/ZipEntry.html
-
-http://developer.android.com/reference/java/security/cert/Certificate.html
-http://developer.android.com/reference/java/security/CodeSigner.html
-
-http://developer.android.com/reference/org/apache/http/auth/AuthSchemeFactory.html
-http://developer.android.com/reference/org/apache/http/auth/AuthScheme.html
-
-http://developer.android.com/reference/android/content/SharedPreferences.Editor.html
-http://developer.android.com/reference/android/media/RingtoneManager.html
-
-http://developer.android.com/reference/android/content/DialogInterface.html
-http://developer.android.com/reference/android/content/DialogInterface.OnClickListener.html
-
-http://developer.android.com/reference/android/content/DialogInterface.OnDismissListener.html
-
-http://developer.android.com/reference/org/apache/http/conn/routing/HttpRouteDirector.html
-http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoutePlanner.html
-
-http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.html
-http://developer.android.com/reference/org/apache/http/conn/routing/BasicRouteDirector.html
-
-http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoute.html
-http://developer.android.com/reference/org/apache/http/conn/routing/RouteTracker.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnectionOperator.html
-
-http://developer.android.com/reference/org/apache/http/conn/scheme/SocketFactory.html
-http://developer.android.com/reference/java/nio/channels/Channel.html
-
-http://developer.android.com/reference/org/apache/http/message/LineParser.html
-http://developer.android.com/reference/org/apache/http/io/HttpMessageParser.html
-
-http://developer.android.com/reference/java/security/AuthProvider.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie2.html
-http://developer.android.com/reference/org/apache/http/message/BasicHeaderElement.html
-
-http://developer.android.com/reference/org/apache/http/protocol/BasicHttpProcessor.html
-http://developer.android.com/reference/org/apache/http/message/BasicNameValuePair.html
-
-http://developer.android.com/reference/org/apache/http/message/BasicRequestLine.html
-http://developer.android.com/reference/org/apache/http/message/BasicStatusLine.html
-
-http://developer.android.com/reference/java/security/cert/CRLSelector.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilderResult.html
-
-http://developer.android.com/reference/java/security/cert/CertPathParameters.html
-http://developer.android.com/reference/java/security/cert/CertPathValidatorResult.html
-
-http://developer.android.com/reference/java/security/cert/CertSelector.html
-http://developer.android.com/reference/java/security/cert/CertStoreParameters.html
-
-http://developer.android.com/reference/java/security/cert/CollectionCertStoreParameters.html
-http://developer.android.com/reference/org/apache/http/message/HeaderGroup.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpDelete.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpEntityEnclosingRequestBase.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpGet.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpHead.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpOptions.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpPost.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpPut.html
-http://developer.android.com/reference/org/apache/http/client/methods/HttpRequestBase.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpTrace.html
-http://developer.android.com/reference/java/security/cert/LDAPCertStoreParameters.html
-
-http://developer.android.com/reference/java/security/cert/PKIXBuilderParameters.html
-http://developer.android.com/reference/java/security/cert/PKIXCertPathBuilderResult.html
-
-http://developer.android.com/reference/java/security/cert/PKIXCertPathChecker.html
-http://developer.android.com/reference/java/security/cert/PKIXCertPathValidatorResult.html
-
-http://developer.android.com/reference/java/security/cert/PKIXParameters.html
-http://developer.android.com/reference/java/security/cert/X509CRLSelector.html
-
-http://developer.android.com/reference/java/security/cert/X509CertSelector.html
-http://developer.android.com/reference/android/text/Editable.html
-http://developer.android.com/reference/java/security/spec/AlgorithmParameterSpec.html
-
-http://developer.android.com/reference/java/security/SecureRandom.html
-http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedListener.html
-
-http://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html
-http://developer.android.com/reference/javax/net/ssl/KeyManager.html
-
-http://developer.android.com/reference/javax/net/ssl/ManagerFactoryParameters.html
-http://developer.android.com/reference/javax/net/ssl/SSLSession.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingListener.html
-http://developer.android.com/reference/javax/net/ssl/SSLSessionContext.html
-
-http://developer.android.com/reference/javax/net/ssl/TrustManager.html
-http://developer.android.com/reference/javax/net/ssl/X509KeyManager.html
-
-http://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
-http://developer.android.com/reference/javax/net/ssl/CertPathTrustManagerParameters.html
-
-http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedEvent.html
-http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html
-
-http://developer.android.com/reference/javax/net/ssl/KeyManagerFactory.html
-http://developer.android.com/reference/javax/net/ssl/KeyManagerFactorySpi.html
-
-http://developer.android.com/reference/javax/net/ssl/KeyStoreBuilderParameters.html
-http://developer.android.com/reference/javax/net/ssl/SSLContext.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLContextSpi.html
-http://developer.android.com/reference/javax/net/ssl/SSLEngine.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.html
-http://developer.android.com/reference/javax/net/ssl/SSLPermission.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLServerSocket.html
-http://developer.android.com/reference/javax/net/ssl/SSLServerSocketFactory.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingEvent.html
-http://developer.android.com/reference/javax/net/ssl/SSLSocket.html
-
-http://developer.android.com/reference/javax/net/ssl/TrustManagerFactory.html
-http://developer.android.com/reference/javax/net/ssl/TrustManagerFactorySpi.html
-
-http://developer.android.com/reference/javax/net/ssl/X509ExtendedKeyManager.html
-http://developer.android.com/reference/javax/net/ssl/SSLException.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLHandshakeException.html
-http://developer.android.com/reference/javax/net/ssl/SSLKeyException.html
-
-http://developer.android.com/reference/javax/net/ssl/SSLPeerUnverifiedException.html
-http://developer.android.com/reference/javax/net/ssl/SSLProtocolException.html
-
-http://developer.android.com/reference/javax/crypto/spec/DESedeKeySpec.html
-http://developer.android.com/reference/javax/crypto/spec/DESKeySpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/DHGenParameterSpec.html
-http://developer.android.com/reference/javax/crypto/spec/DHParameterSpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/DHPrivateKeySpec.html
-http://developer.android.com/reference/javax/crypto/spec/DHPublicKeySpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/IvParameterSpec.html
-http://developer.android.com/reference/javax/crypto/spec/OAEPParameterSpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/PBEKeySpec.html
-http://developer.android.com/reference/javax/crypto/spec/PBEParameterSpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/PSource.html
-http://developer.android.com/reference/javax/crypto/spec/PSource.PSpecified.html
-
-http://developer.android.com/reference/javax/crypto/spec/RC2ParameterSpec.html
-http://developer.android.com/reference/javax/crypto/spec/RC5ParameterSpec.html
-
-http://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html
-http://developer.android.com/reference/javax/crypto/spec/package-descr.html
-
-http://developer.android.com/reference/android/text/method/ArrowKeyMovementMethod.html
-http://developer.android.com/reference/android/text/method/BaseKeyListener.html
-
-http://developer.android.com/reference/android/text/method/CharacterPickerDialog.html
-http://developer.android.com/reference/android/text/method/DateKeyListener.html
-
-http://developer.android.com/reference/android/text/method/DateTimeKeyListener.html
-http://developer.android.com/reference/android/text/method/DialerKeyListener.html
-
-http://developer.android.com/reference/android/text/method/DigitsKeyListener.html
-http://developer.android.com/reference/android/text/method/HideReturnsTransformationMethod.html
-
-http://developer.android.com/reference/android/text/method/MetaKeyKeyListener.html
-http://developer.android.com/reference/android/text/method/MultiTapKeyListener.html
-
-http://developer.android.com/reference/android/text/method/NumberKeyListener.html
-http://developer.android.com/reference/android/text/method/PasswordTransformationMethod.html
-
-http://developer.android.com/reference/android/text/method/QwertyKeyListener.html
-http://developer.android.com/reference/android/text/method/ReplacementTransformationMethod.html
-
-http://developer.android.com/reference/android/text/method/ScrollingMovementMethod.html
-http://developer.android.com/reference/android/text/method/SingleLineTransformationMethod.html
-
-http://developer.android.com/reference/android/text/method/TextKeyListener.html
-http://developer.android.com/reference/android/text/method/TimeKeyListener.html
-
-http://developer.android.com/reference/android/text/method/Touch.html
-http://developer.android.com/reference/android/location/Address.html
-
-http://developer.android.com/reference/android/content/pm/ApplicationInfo.html
-http://developer.android.com/reference/android/location/Criteria.html
-
-http://developer.android.com/reference/android/content/pm/InstrumentationInfo.html
-http://developer.android.com/reference/android/content/Intent.ShortcutIconResource.html
-
-http://developer.android.com/reference/android/location/Location.html
-http://developer.android.com/reference/android/content/pm/PackageInfo.html
-
-http://developer.android.com/reference/android/content/pm/PackageStats.html
-http://developer.android.com/reference/android/content/pm/PermissionGroupInfo.html
-
-http://developer.android.com/reference/android/content/pm/PermissionInfo.html
-http://developer.android.com/reference/android/content/pm/ProviderInfo.html
-
-http://developer.android.com/reference/android/content/pm/ResolveInfo.html
-http://developer.android.com/reference/android/net/wifi/ScanResult.html
-
-http://developer.android.com/reference/android/content/pm/ServiceInfo.html
-http://developer.android.com/reference/android/content/pm/Signature.html
-
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html
-http://developer.android.com/reference/android/net/wifi/WifiInfo.html
-
-http://developer.android.com/reference/java/io/FileDescriptor.html
-http://developer.android.com/reference/java/security/SecureClassLoader.html
-
-http://developer.android.com/reference/java/security/ProtectionDomain.html
-http://developer.android.com/reference/java/io/Closeable.html
-
-http://developer.android.com/reference/java/io/DataInput.html
-http://developer.android.com/reference/java/io/DataOutput.html
-
-http://developer.android.com/reference/java/io/Externalizable.html
-http://developer.android.com/reference/java/io/FileFilter.html
-
-http://developer.android.com/reference/java/io/FilenameFilter.html
-http://developer.android.com/reference/java/io/Flushable.html
-
-http://developer.android.com/reference/java/io/ObjectInput.html
-http://developer.android.com/reference/java/io/ObjectInputValidation.html
-
-http://developer.android.com/reference/java/io/ObjectOutput.html
-http://developer.android.com/reference/java/io/ObjectStreamConstants.html
-
-http://developer.android.com/reference/java/io/BufferedInputStream.html
-http://developer.android.com/reference/java/io/BufferedOutputStream.html
-
-http://developer.android.com/reference/java/io/BufferedReader.html
-http://developer.android.com/reference/java/io/BufferedWriter.html
-
-http://developer.android.com/reference/java/io/ByteArrayInputStream.html
-http://developer.android.com/reference/java/io/ByteArrayOutputStream.html
-
-http://developer.android.com/reference/java/io/CharArrayReader.html
-http://developer.android.com/reference/java/io/CharArrayWriter.html
-
-http://developer.android.com/reference/java/io/DataInputStream.html
-http://developer.android.com/reference/java/io/DataOutputStream.html
-
-http://developer.android.com/reference/java/io/FilePermission.html
-http://developer.android.com/reference/java/io/FileReader.html
-
-http://developer.android.com/reference/java/io/FileWriter.html
-http://developer.android.com/reference/java/io/FilterInputStream.html
-
-http://developer.android.com/reference/java/io/FilterOutputStream.html
-http://developer.android.com/reference/java/io/FilterReader.html
-
-http://developer.android.com/reference/java/io/FilterWriter.html
-http://developer.android.com/reference/java/io/InputStreamReader.html
-
-http://developer.android.com/reference/java/io/LineNumberInputStream.html
-http://developer.android.com/reference/java/io/LineNumberReader.html
-
-http://developer.android.com/reference/java/io/ObjectInputStream.html
-http://developer.android.com/reference/java/io/ObjectInputStream.GetField.html
-
-http://developer.android.com/reference/java/io/ObjectOutputStream.html
-http://developer.android.com/reference/java/io/ObjectOutputStream.PutField.html
-
-http://developer.android.com/reference/java/io/ObjectStreamClass.html
-http://developer.android.com/reference/java/io/OutputStreamWriter.html
-
-http://developer.android.com/reference/java/io/PipedInputStream.html
-http://developer.android.com/reference/java/io/PipedOutputStream.html
-
-http://developer.android.com/reference/java/io/PipedReader.html
-http://developer.android.com/reference/java/io/PipedWriter.html
-
-http://developer.android.com/reference/java/io/PushbackInputStream.html
-http://developer.android.com/reference/java/io/PushbackReader.html
-
-http://developer.android.com/reference/java/io/RandomAccessFile.html
-http://developer.android.com/reference/java/io/Reader.html
-
-http://developer.android.com/reference/java/io/SequenceInputStream.html
-http://developer.android.com/reference/java/io/SerializablePermission.html
-
-http://developer.android.com/reference/java/io/StreamTokenizer.html
-http://developer.android.com/reference/java/io/StringBufferInputStream.html
-
-http://developer.android.com/reference/java/io/StringReader.html
-http://developer.android.com/reference/java/io/StringWriter.html
-
-http://developer.android.com/reference/java/io/Writer.html
-http://developer.android.com/reference/java/io/CharConversionException.html
-
-http://developer.android.com/reference/java/io/EOFException.html
-http://developer.android.com/reference/java/io/FileNotFoundException.html
-
-http://developer.android.com/reference/java/io/InterruptedIOException.html
-http://developer.android.com/reference/java/io/InvalidClassException.html
-
-http://developer.android.com/reference/java/io/InvalidObjectException.html
-http://developer.android.com/reference/java/io/NotActiveException.html
-
-http://developer.android.com/reference/java/io/NotSerializableException.html
-http://developer.android.com/reference/java/io/ObjectStreamException.html
-
-http://developer.android.com/reference/java/io/OptionalDataException.html
-http://developer.android.com/reference/java/io/StreamCorruptedException.html
-
-http://developer.android.com/reference/java/io/SyncFailedException.html
-http://developer.android.com/reference/java/io/UnsupportedEncodingException.html
-
-http://developer.android.com/reference/java/io/UTFDataFormatException.html
-http://developer.android.com/reference/java/io/WriteAbortedException.html
-
-http://developer.android.com/reference/org/apache/http/entity/ContentLengthStrategy.html
-http://developer.android.com/reference/org/apache/http/entity/ContentProducer.html
-
-http://developer.android.com/reference/java/security/Certificate.html
-http://developer.android.com/reference/java/security/DomainCombiner.html
-
-http://developer.android.com/reference/java/security/KeyStore.Entry.html
-http://developer.android.com/reference/java/security/KeyStore.LoadStoreParameter.html
-
-http://developer.android.com/reference/java/security/KeyStore.ProtectionParameter.html
-http://developer.android.com/reference/java/security/Principal.html
-
-http://developer.android.com/reference/java/security/PrivateKey.html
-http://developer.android.com/reference/java/security/PrivilegedAction.html
-
-http://developer.android.com/reference/java/security/PrivilegedExceptionAction.html
-http://developer.android.com/reference/java/security/PublicKey.html
-
+http://developer.android.com/reference/org/apache/http/impl/AbstractHttpServerConnection.html
+http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.AbstractInputMethodImpl.html
+http://developer.android.com/reference/android/inputmethodservice/AbstractInputMethodService.AbstractInputMethodSessionImpl.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractInterruptibleChannel.html
+http://developer.android.com/reference/java/util/AbstractMap.html
+http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageParser.html
+http://developer.android.com/reference/org/apache/http/impl/io/AbstractMessageWriter.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPoolEntry.html
+http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.html
+http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.ConditionObject.html
+http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionInputBuffer.html
+http://developer.android.com/reference/org/apache/http/impl/io/AbstractSessionOutputBuffer.html
+http://developer.android.com/reference/org/apache/http/conn/ssl/AbstractVerifier.html
+http://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator.html
http://developer.android.com/reference/java/security/AccessControlContext.html
http://developer.android.com/reference/java/security/AccessController.html
-
+http://developer.android.com/reference/java/lang/reflect/AccessibleObject.html
+http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
+http://developer.android.com/reference/android/location/Address.html
http://developer.android.com/reference/java/security/AlgorithmParameterGenerator.html
http://developer.android.com/reference/java/security/AlgorithmParameterGeneratorSpi.html
-
+http://developer.android.com/reference/java/security/AlgorithmParameters.html
http://developer.android.com/reference/java/security/AlgorithmParametersSpi.html
-http://developer.android.com/reference/java/security/AllPermission.html
-
-http://developer.android.com/reference/java/security/CodeSource.html
-http://developer.android.com/reference/java/security/DigestInputStream.html
-
-http://developer.android.com/reference/java/security/DigestOutputStream.html
-http://developer.android.com/reference/java/security/GuardedObject.html
-
-http://developer.android.com/reference/java/security/Identity.html
-http://developer.android.com/reference/java/security/IdentityScope.html
-
-http://developer.android.com/reference/java/security/KeyFactory.html
-http://developer.android.com/reference/java/security/KeyFactorySpi.html
-
-http://developer.android.com/reference/java/security/KeyPair.html
-http://developer.android.com/reference/java/security/KeyPairGenerator.html
-
-http://developer.android.com/reference/java/security/KeyPairGeneratorSpi.html
-http://developer.android.com/reference/java/security/KeyRep.html
-
-http://developer.android.com/reference/java/security/KeyStore.html
-http://developer.android.com/reference/java/security/KeyStore.Builder.html
-
-http://developer.android.com/reference/java/security/KeyStore.CallbackHandlerProtection.html
-http://developer.android.com/reference/java/security/KeyStore.PasswordProtection.html
-
-http://developer.android.com/reference/java/security/KeyStore.PrivateKeyEntry.html
-http://developer.android.com/reference/java/security/KeyStore.SecretKeyEntry.html
-
-http://developer.android.com/reference/java/security/KeyStore.TrustedCertificateEntry.html
-http://developer.android.com/reference/java/security/KeyStoreSpi.html
-
-http://developer.android.com/reference/java/security/MessageDigest.html
-http://developer.android.com/reference/java/security/MessageDigestSpi.html
-
-http://developer.android.com/reference/java/security/Permissions.html
-http://developer.android.com/reference/java/security/Policy.html
-
-http://developer.android.com/reference/java/security/Provider.Service.html
-http://developer.android.com/reference/java/security/SecureRandomSpi.html
-
-http://developer.android.com/reference/java/security/Security.html
-http://developer.android.com/reference/java/security/SecurityPermission.html
-
-http://developer.android.com/reference/java/security/Signature.html
-http://developer.android.com/reference/java/security/SignatureSpi.html
-
-http://developer.android.com/reference/java/security/SignedObject.html
-http://developer.android.com/reference/java/security/Signer.html
-
-http://developer.android.com/reference/java/security/Timestamp.html
-http://developer.android.com/reference/java/security/UnresolvedPermission.html
-
-http://developer.android.com/reference/java/security/AccessControlException.html
-http://developer.android.com/reference/java/security/DigestException.html
-
-http://developer.android.com/reference/java/security/GeneralSecurityException.html
-http://developer.android.com/reference/java/security/InvalidAlgorithmParameterException.html
-
-http://developer.android.com/reference/java/security/InvalidParameterException.html
-http://developer.android.com/reference/java/security/KeyException.html
-
-http://developer.android.com/reference/java/security/KeyStoreException.html
-http://developer.android.com/reference/java/security/PrivilegedActionException.html
-
-http://developer.android.com/reference/java/security/ProviderException.html
-http://developer.android.com/reference/java/security/SignatureException.html
-
-http://developer.android.com/reference/java/security/UnrecoverableEntryException.html
-http://developer.android.com/reference/java/security/UnrecoverableKeyException.html
-
-http://developer.android.com/reference/java/nio/Buffer.html
-http://developer.android.com/reference/java/nio/ByteOrder.html
-
-http://developer.android.com/reference/java/nio/BufferOverflowException.html
-http://developer.android.com/reference/java/nio/BufferUnderflowException.html
-
-http://developer.android.com/reference/java/nio/InvalidMarkException.html
-http://developer.android.com/reference/java/nio/ReadOnlyBufferException.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/AbortableHttpRequest.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/HttpUriRequest.html
-http://developer.android.com/reference/org/apache/http/conn/package-descr.html
-
-http://developer.android.com/reference/java/security/cert/PolicyNode.html
-http://developer.android.com/reference/java/security/cert/X509Extension.html
-
-http://developer.android.com/reference/java/security/cert/Certificate.CertificateRep.html
-http://developer.android.com/reference/java/security/cert/CertificateFactory.html
-
-http://developer.android.com/reference/java/security/cert/CertificateFactorySpi.html
-http://developer.android.com/reference/java/security/cert/CertPath.html
-
-http://developer.android.com/reference/java/security/cert/CertPath.CertPathRep.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilder.html
-
-http://developer.android.com/reference/java/security/cert/CertPathBuilderSpi.html
-http://developer.android.com/reference/java/security/cert/CertPathValidator.html
-
-http://developer.android.com/reference/java/security/cert/CertPathValidatorSpi.html
-http://developer.android.com/reference/java/security/cert/CertStore.html
-
-http://developer.android.com/reference/java/security/cert/CertStoreSpi.html
-http://developer.android.com/reference/java/security/cert/CRL.html
-
-http://developer.android.com/reference/java/security/cert/PolicyQualifierInfo.html
-http://developer.android.com/reference/java/security/cert/TrustAnchor.html
-
-http://developer.android.com/reference/java/security/cert/X509Certificate.html
-http://developer.android.com/reference/java/security/cert/X509CRL.html
-
-http://developer.android.com/reference/java/security/cert/X509CRLEntry.html
-http://developer.android.com/reference/java/security/cert/CertificateEncodingException.html
-
-http://developer.android.com/reference/java/security/cert/CertificateException.html
-http://developer.android.com/reference/java/security/cert/CertificateExpiredException.html
-
-http://developer.android.com/reference/java/security/cert/CertificateNotYetValidException.html
-
-http://developer.android.com/reference/java/security/cert/CertificateParsingException.html
-http://developer.android.com/reference/java/security/cert/CertPathBuilderException.html
-
-http://developer.android.com/reference/java/security/cert/CertPathValidatorException.html
-http://developer.android.com/reference/java/security/cert/CertStoreException.html
-
-http://developer.android.com/reference/java/security/cert/CRLException.html
-http://developer.android.com/reference/com/google/android/maps/ItemizedOverlay.OnFocusChangeListener.html
-
-http://developer.android.com/reference/com/google/android/maps/Projection.html
-http://developer.android.com/reference/com/google/android/maps/GeoPoint.html
-
-http://developer.android.com/reference/com/google/android/maps/OverlayItem.html
-http://developer.android.com/reference/com/google/android/maps/MapView.LayoutParams.html
-
-http://developer.android.com/reference/com/google/android/maps/MyLocationOverlay.html
-http://developer.android.com/reference/com/google/android/maps/TrackballGestureDetector.html
-
-http://developer.android.com/reference/java/sql/Array.html
-http://developer.android.com/reference/java/sql/Blob.html
-
-http://developer.android.com/reference/java/sql/CallableStatement.html
-http://developer.android.com/reference/java/sql/Clob.html
-
-http://developer.android.com/reference/java/sql/Connection.html
-http://developer.android.com/reference/java/sql/DatabaseMetaData.html
-
-http://developer.android.com/reference/java/sql/Driver.html
-http://developer.android.com/reference/java/sql/ParameterMetaData.html
-
-http://developer.android.com/reference/java/sql/PreparedStatement.html
-http://developer.android.com/reference/java/sql/Ref.html
-
-http://developer.android.com/reference/java/sql/ResultSet.html
-http://developer.android.com/reference/java/sql/ResultSetMetaData.html
-
-http://developer.android.com/reference/java/sql/Savepoint.html
-http://developer.android.com/reference/java/sql/SQLData.html
-
-http://developer.android.com/reference/java/sql/SQLInput.html
-http://developer.android.com/reference/java/sql/SQLOutput.html
-
-http://developer.android.com/reference/java/sql/Statement.html
-http://developer.android.com/reference/java/sql/Struct.html
-
-http://developer.android.com/reference/java/sql/DriverManager.html
-http://developer.android.com/reference/java/sql/DriverPropertyInfo.html
-
-http://developer.android.com/reference/java/sql/SQLPermission.html
-http://developer.android.com/reference/java/sql/Types.html
-
-http://developer.android.com/reference/java/sql/BatchUpdateException.html
-http://developer.android.com/reference/java/sql/DataTruncation.html
-
-http://developer.android.com/reference/java/sql/SQLException.html
-http://developer.android.com/reference/java/sql/SQLWarning.html
-
-http://developer.android.com/reference/org/apache/http/message/BasicTokenIterator.html
-http://developer.android.com/reference/java/security/package-descr.html
-
-http://developer.android.com/reference/java/security/spec/KeySpec.html
-http://developer.android.com/reference/android/text/GetChars.html
-
-http://developer.android.com/reference/android/text/Html.ImageGetter.html
-http://developer.android.com/reference/android/text/Html.TagHandler.html
-
-http://developer.android.com/reference/android/text/Spanned.html
-http://developer.android.com/reference/android/text/SpanWatcher.html
-
-http://developer.android.com/reference/android/text/TextUtils.EllipsizeCallback.html
-http://developer.android.com/reference/android/text/TextUtils.StringSplitter.html
-
+http://developer.android.com/reference/android/text/style/AlignmentSpan.Standard.html
http://developer.android.com/reference/android/text/AlteredCharSequence.html
http://developer.android.com/reference/android/text/AndroidCharacter.html
-
-http://developer.android.com/reference/android/text/Annotation.html
-http://developer.android.com/reference/android/text/AutoText.html
-
-http://developer.android.com/reference/android/text/BoringLayout.html
-http://developer.android.com/reference/android/text/BoringLayout.Metrics.html
-
-http://developer.android.com/reference/android/text/DynamicLayout.html
-http://developer.android.com/reference/android/text/Html.html
-
-http://developer.android.com/reference/android/text/InputFilter.AllCaps.html
-http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
-
-http://developer.android.com/reference/android/text/Layout.Directions.html
-http://developer.android.com/reference/android/text/LoginFilter.html
-
-http://developer.android.com/reference/android/text/LoginFilter.PasswordFilterGMail.html
-http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGeneric.html
-
-http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGMail.html
-http://developer.android.com/reference/android/text/SpannableString.html
-
-http://developer.android.com/reference/android/text/SpannableStringBuilder.html
-http://developer.android.com/reference/android/text/SpannedString.html
-
-http://developer.android.com/reference/android/text/StaticLayout.html
-http://developer.android.com/reference/android/text/TextUtils.html
-
-http://developer.android.com/reference/android/text/TextUtils.SimpleStringSplitter.html
-http://developer.android.com/reference/javax/security/auth/Subject.html
-
-http://developer.android.com/reference/javax/security/auth/callback/CallbackHandler.html
-http://developer.android.com/reference/javax/security/auth/login/LoginException.html
-
-http://developer.android.com/reference/java/nio/package-descr.html
-
-http://developer.android.com/reference/java/util/zip/ZipFile.html
-http://developer.android.com/reference/android/widget/RemoteViews.RemoteView.html
-
-http://developer.android.com/reference/javax/security/auth/Destroyable.html
-http://developer.android.com/reference/javax/security/auth/AuthPermission.html
-
-http://developer.android.com/reference/javax/security/auth/PrivateCredentialPermission.html
-http://developer.android.com/reference/javax/security/auth/SubjectDomainCombiner.html
-
-http://developer.android.com/reference/javax/security/auth/DestroyFailedException.html
-http://developer.android.com/reference/javax/security/auth/package-descr.html
-
-http://developer.android.com/guide/tutorials/views/hello-linearlayout.html
-http://developer.android.com/guide/tutorials/views/hello-tablelayout.html
-
-http://developer.android.com/guide/tutorials/views/hello-relativelayout.html
-http://developer.android.com/reference/android/view/ViewDebug.ExportedProperty.html
-
-http://developer.android.com/reference/android/view/ViewDebug.IntToString.html
-http://developer.android.com/reference/android/content/DialogInterface.OnCancelListener.html
-
-http://developer.android.com/reference/android/content/DialogInterface.OnKeyListener.html
-http://developer.android.com/reference/android/content/DialogInterface.OnMultiChoiceClickListener.html
-
-http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html
-
-http://developer.android.com/reference/android/content/AsyncQueryHandler.html
-http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerArgs.html
-
-http://developer.android.com/reference/android/content/AsyncQueryHandler.WorkerHandler.html
-http://developer.android.com/reference/android/content/ContentQueryMap.html
-
-http://developer.android.com/reference/android/content/ContentUris.html
-http://developer.android.com/reference/android/content/Intent.FilterComparison.html
-
-http://developer.android.com/reference/android/content/IntentFilter.AuthorityEntry.html
-http://developer.android.com/reference/android/content/MutableContextWrapper.html
-
-http://developer.android.com/reference/android/content/UriMatcher.html
-http://developer.android.com/reference/android/content/ActivityNotFoundException.html
-
-http://developer.android.com/reference/android/content/IntentFilter.MalformedMimeTypeException.html
-
-http://developer.android.com/reference/android/content/ReceiverCallNotAllowedException.html
-http://developer.android.com/reference/android/test/mock/MockContext.html
-
-http://developer.android.com/reference/android/test/mock/MockApplication.html
-http://developer.android.com/reference/android/content/pm/PackageManager.NameNotFoundException.html
-
-http://developer.android.com/reference/org/xml/sax/ContentHandler.html
-http://developer.android.com/reference/org/xml/sax/DocumentHandler.html
-
-http://developer.android.com/reference/org/xml/sax/DTDHandler.html
-http://developer.android.com/reference/org/xml/sax/EntityResolver.html
-
-http://developer.android.com/reference/org/xml/sax/ErrorHandler.html
-http://developer.android.com/reference/org/xml/sax/XMLFilter.html
-
-http://developer.android.com/reference/org/xml/sax/XMLReader.html
-http://developer.android.com/reference/org/xml/sax/HandlerBase.html
-
-http://developer.android.com/reference/org/xml/sax/InputSource.html
-http://developer.android.com/reference/org/xml/sax/SAXException.html
-
-http://developer.android.com/reference/org/xml/sax/SAXNotRecognizedException.html
-http://developer.android.com/reference/org/xml/sax/SAXNotSupportedException.html
-
-http://developer.android.com/reference/org/xml/sax/SAXParseException.html
-http://developer.android.com/reference/org/xml/sax/package-descr.html
-
-http://developer.android.com/reference/javax/sql/RowSet.html
-http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.html
-
+http://developer.android.com/reference/android/view/animation/Animation.Description.html
+http://developer.android.com/reference/android/view/animation/AnimationUtils.html
+http://developer.android.com/reference/java/text/Annotation.html
+http://developer.android.com/reference/android/appwidget/AppWidgetHost.html
+http://developer.android.com/reference/android/appwidget/AppWidgetManager.html
+http://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html
http://developer.android.com/reference/android/content/pm/ApplicationInfo.DisplayNameComparator.html
-
-http://developer.android.com/reference/android/content/pm/ComponentInfo.html
-http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.Stub.html
-
-http://developer.android.com/reference/android/content/pm/PackageItemInfo.DisplayNameComparator.html
-
-http://developer.android.com/reference/android/content/pm/ResolveInfo.DisplayNameComparator.html
-
-http://developer.android.com/guide/samples/NotePad/res/index.html
-http://developer.android.com/guide/samples/NotePad/src/index.html
-
-http://developer.android.com/guide/samples/NotePad/tests/index.html
-http://developer.android.com/guide/samples/NotePad/AndroidManifest.html
-
-http://developer.android.com/guide/samples/NotePad/sample_note.html
-http://developer.android.com/guide/samples/NotePad/sample_notepad.html
-
-http://developer.android.com/reference/android/telephony/gsm/GsmCellLocation.html
-
-http://developer.android.com/reference/java/nio/channels/ServerSocketChannel.html
-http://developer.android.com/reference/javax/xml/XMLConstants.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultResponseParser.html
-http://developer.android.com/reference/java/nio/channels/ByteChannel.html
-
-http://developer.android.com/reference/java/nio/channels/GatheringByteChannel.html
-http://developer.android.com/reference/java/nio/channels/InterruptibleChannel.html
-
-http://developer.android.com/reference/java/nio/channels/ReadableByteChannel.html
-http://developer.android.com/reference/java/nio/channels/ScatteringByteChannel.html
-
-http://developer.android.com/reference/java/nio/channels/WritableByteChannel.html
-http://developer.android.com/reference/java/nio/channels/Channels.html
-
-http://developer.android.com/reference/java/nio/channels/FileChannel.html
-http://developer.android.com/reference/java/nio/channels/FileChannel.MapMode.html
-
-http://developer.android.com/reference/java/nio/channels/FileLock.html
-http://developer.android.com/reference/java/nio/channels/Pipe.html
-
-http://developer.android.com/reference/java/nio/channels/Pipe.SinkChannel.html
-http://developer.android.com/reference/java/nio/channels/Pipe.SourceChannel.html
-
-http://developer.android.com/reference/java/nio/channels/SelectableChannel.html
-http://developer.android.com/reference/java/nio/channels/SelectionKey.html
-
-http://developer.android.com/reference/java/nio/channels/Selector.html
-http://developer.android.com/reference/java/nio/channels/SocketChannel.html
-
-http://developer.android.com/reference/java/nio/channels/AlreadyConnectedException.html
-http://developer.android.com/reference/java/nio/channels/AsynchronousCloseException.html
-
-http://developer.android.com/reference/java/nio/channels/CancelledKeyException.html
-http://developer.android.com/reference/java/nio/channels/ClosedByInterruptException.html
-
-http://developer.android.com/reference/java/nio/channels/ClosedChannelException.html
-http://developer.android.com/reference/java/nio/channels/ClosedSelectorException.html
-
-http://developer.android.com/reference/java/nio/channels/ConnectionPendingException.html
-http://developer.android.com/reference/java/nio/channels/FileLockInterruptionException.html
-
-http://developer.android.com/reference/java/nio/channels/IllegalBlockingModeException.html
-http://developer.android.com/reference/java/nio/channels/IllegalSelectorException.html
-
-http://developer.android.com/reference/java/nio/channels/NoConnectionPendingException.html
-http://developer.android.com/reference/java/nio/channels/NonReadableChannelException.html
-
-http://developer.android.com/reference/java/nio/channels/NonWritableChannelException.html
-http://developer.android.com/reference/java/nio/channels/NotYetBoundException.html
-
-http://developer.android.com/reference/java/nio/channels/NotYetConnectedException.html
-http://developer.android.com/reference/java/nio/channels/OverlappingFileLockException.html
-
-http://developer.android.com/reference/java/nio/channels/UnresolvedAddressException.html
-http://developer.android.com/reference/java/nio/channels/UnsupportedAddressTypeException.html
-
-http://developer.android.com/reference/org/apache/http/message/BasicHeaderIterator.html
-http://developer.android.com/reference/org/apache/http/message/BasicListHeaderIterator.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractClientConnAdapter.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPooledConnAdapter.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPoolEntry.html
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnection.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/DefaultHttpRoutePlanner.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/IdleConnectionHandler.html
-http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionInputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionOutputBuffer.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/ProxySelectorRoutePlanner.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.ConnAdapter.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.PoolEntry.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/Wire.html
-http://developer.android.com/reference/java/security/spec/ECField.html
-
-http://developer.android.com/reference/java/security/spec/DSAParameterSpec.html
-http://developer.android.com/reference/java/security/spec/DSAPrivateKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/DSAPublicKeySpec.html
-http://developer.android.com/reference/java/security/spec/ECFieldF2m.html
-
-http://developer.android.com/reference/java/security/spec/ECFieldFp.html
-http://developer.android.com/reference/java/security/spec/ECGenParameterSpec.html
-
-http://developer.android.com/reference/java/security/spec/ECParameterSpec.html
-http://developer.android.com/reference/java/security/spec/ECPoint.html
-
-http://developer.android.com/reference/java/security/spec/ECPrivateKeySpec.html
-http://developer.android.com/reference/java/security/spec/ECPublicKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/EllipticCurve.html
-http://developer.android.com/reference/java/security/spec/EncodedKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/MGF1ParameterSpec.html
-http://developer.android.com/reference/java/security/spec/PSSParameterSpec.html
-
-http://developer.android.com/reference/java/security/spec/RSAKeyGenParameterSpec.html
-http://developer.android.com/reference/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/RSAOtherPrimeInfo.html
-http://developer.android.com/reference/java/security/spec/RSAPrivateCrtKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/RSAPrivateKeySpec.html
-http://developer.android.com/reference/java/security/spec/RSAPublicKeySpec.html
-
-http://developer.android.com/reference/java/security/spec/X509EncodedKeySpec.html
-http://developer.android.com/reference/java/security/spec/InvalidParameterSpecException.html
-
-http://developer.android.com/reference/org/apache/http/auth/Credentials.html
-http://developer.android.com/reference/org/apache/http/auth/AUTH.html
-
-http://developer.android.com/reference/org/apache/http/auth/AuthSchemeRegistry.html
-http://developer.android.com/reference/org/apache/http/auth/AuthScope.html
-
-http://developer.android.com/reference/org/apache/http/auth/AuthState.html
-http://developer.android.com/reference/org/apache/http/auth/BasicUserPrincipal.html
-
-http://developer.android.com/reference/org/apache/http/auth/NTCredentials.html
-http://developer.android.com/reference/org/apache/http/auth/NTUserPrincipal.html
-
-http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html
-http://developer.android.com/reference/org/apache/http/auth/AuthenticationException.html
-
-http://developer.android.com/reference/org/apache/http/auth/InvalidCredentialsException.html
-http://developer.android.com/reference/org/apache/http/auth/MalformedChallengeException.html
-
-http://developer.android.com/reference/org/apache/http/auth/package-descr.html
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.AuthAlgorithm.html
-
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.GroupCipher.html
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.KeyMgmt.html
-
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.PairwiseCipher.html
-
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Protocol.html
-http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Status.html
-
-http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
-http://developer.android.com/reference/org/apache/http/protocol/HTTP.html
-
-http://developer.android.com/reference/java/util/zip/ZipInputStream.html
-http://developer.android.com/reference/java/util/zip/InflaterInputStream.html
-
-http://developer.android.com/reference/java/util/zip/Inflater.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/PoolEntryRequest.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/AbstractConnPool.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntry.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntryRef.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueWorker.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RouteSpecificPool.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThread.html
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThreadAborter.html
-
-http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/package-descr.html
-http://developer.android.com/reference/java/util/regex/PatternSyntaxException.html
-
-http://developer.android.com/reference/org/xmlpull/v1/sax2/Driver.html
-http://developer.android.com/guide/tutorials/views/hello-spinner.html
-
-http://developer.android.com/guide/tutorials/views/hello-listview.html
-http://developer.android.com/guide/tutorials/views/hello-gridview.html
-
-http://developer.android.com/reference/android/test/mock/MockPackageManager.html
-
-http://developer.android.com/reference/android/text/util/Linkify.MatchFilter.html
-
-http://developer.android.com/reference/android/text/util/Linkify.TransformFilter.html
-http://developer.android.com/reference/android/text/util/Rfc822Token.html
-
-http://developer.android.com/reference/android/text/util/Rfc822Tokenizer.html
-http://developer.android.com/reference/java/util/regex/Pattern.html
-
-http://developer.android.com/reference/java/lang/reflect/ReflectPermission.html
-
-http://developer.android.com/reference/javax/security/auth/callback/Callback.html
-http://developer.android.com/reference/javax/security/auth/callback/PasswordCallback.html
-
-http://developer.android.com/reference/javax/security/auth/callback/UnsupportedCallbackException.html
-
-http://developer.android.com/reference/javax/security/cert/Certificate.html
-http://developer.android.com/reference/javax/security/cert/X509Certificate.html
-
-http://developer.android.com/reference/javax/security/cert/CertificateEncodingException.html
-http://developer.android.com/reference/javax/security/cert/CertificateException.html
-
-http://developer.android.com/reference/javax/security/cert/CertificateExpiredException.html
-http://developer.android.com/reference/javax/security/cert/CertificateNotYetValidException.html
-
-http://developer.android.com/reference/javax/security/cert/CertificateParsingException.html
-http://developer.android.com/reference/javax/security/cert/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestExecutor.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpProcessor.html
-
-http://developer.android.com/reference/org/apache/http/impl/DefaultHttpRequestFactory.html
-http://developer.android.com/reference/javax/crypto/interfaces/PBEKey.html
-
-http://developer.android.com/reference/java/lang/annotation/Annotation.html
-http://developer.android.com/reference/java/lang/annotation/AnnotationTypeMismatchException.html
-
-http://developer.android.com/reference/java/lang/annotation/IncompleteAnnotationException.html
-
-http://developer.android.com/reference/java/lang/annotation/AnnotationFormatError.html
-http://developer.android.com/reference/java/lang/annotation/package-descr.html
-
-http://developer.android.com/reference/android/app/package-descr.html
-http://developer.android.com/reference/java/lang/reflect/Method.html
-
-http://developer.android.com/reference/org/apache/http/message/BasicHttpEntityEnclosingRequest.html
-
-http://developer.android.com/reference/org/apache/http/message/BasicHttpRequest.html
-http://developer.android.com/reference/org/apache/http/message/BasicHttpResponse.html
-
-http://developer.android.com/guide/samples/NotePad/src/com/index.html
-http://developer.android.com/reference/org/apache/http/io/HttpMessageWriter.html
-
-http://developer.android.com/reference/org/apache/http/io/package-descr.html
-http://developer.android.com/reference/android/location/LocationListener.html
-
-http://developer.android.com/reference/android/location/Geocoder.html
-http://developer.android.com/reference/android/location/LocationProvider.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/AbstractCookieSpec.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicCommentHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicDomainHandler.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicExpiresHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicMaxAgeHandler.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicPathHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BasicSecureHandler.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpec.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpecFactory.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpec.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpecFactory.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/CookieSpecBase.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/DateUtils.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDomainHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftHeaderParser.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpec.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpecFactory.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109DomainHandler.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109Spec.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109SpecFactory.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109VersionHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965CommentUrlAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965DiscardAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965DomainAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965PortAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965Spec.html
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965SpecFactory.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965VersionAttributeHandler.html
-
-http://developer.android.com/reference/org/apache/http/impl/cookie/DateParseException.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java
-
-http://developer.android.com/reference/android/net/http/SslCertificate.html
-http://developer.android.com/reference/android/net/http/SslCertificate.DName.html
-
-http://developer.android.com/reference/android/test/mock/MockContentResolver.html
-http://developer.android.com/reference/android/test/mock/MockDialogInterface.html
-
-http://developer.android.com/reference/android/test/mock/MockResources.html
-http://developer.android.com/reference/android/test/mock/package-descr.html
-
-http://developer.android.com/reference/junit/framework/Protectable.html
-http://developer.android.com/reference/junit/framework/TestFailure.html
-
-http://developer.android.com/reference/junit/framework/ComparisonFailure.html
-http://developer.android.com/reference/android/test/suitebuilder/TestSuiteBuilder.FailedToCreateTests.html
-
+http://developer.android.com/reference/java/lang/reflect/Array.html
+http://developer.android.com/reference/java/util/Arrays.html
+http://developer.android.com/reference/android/text/method/ArrowKeyMovementMethod.html
+http://developer.android.com/reference/junit/framework/Assert.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
+http://developer.android.com/reference/android/media/AsyncPlayer.html
+http://developer.android.com/reference/android/os/AsyncTask.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicIntegerArray.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicLongArray.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicLongFieldUpdater.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicMarkableReference.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicReference.html
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicReferenceArray.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.html
-
http://developer.android.com/reference/java/util/concurrent/atomic/AtomicStampedReference.html
-
-http://developer.android.com/reference/java/util/concurrent/atomic/package-descr.html
-http://developer.android.com/reference/org/apache/http/impl/AbstractHttpClientConnection.html
-
-http://developer.android.com/reference/org/apache/http/impl/AbstractHttpServerConnection.html
-
-http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.html
-
-http://developer.android.com/reference/java/util/concurrent/locks/AbstractQueuedSynchronizer.ConditionObject.html
-
-http://developer.android.com/reference/org/apache/http/conn/ssl/AbstractVerifier.html
-http://developer.android.com/reference/java/lang/reflect/AccessibleObject.html
-
-http://developer.android.com/reference/java/util/zip/Adler32.html
-http://developer.android.com/reference/android/text/style/AlignmentSpan.Standard.html
-
-http://developer.android.com/reference/java/lang/reflect/Array.html
-http://developer.android.com/reference/android/media/AsyncPlayer.html
-
+http://developer.android.com/reference/org/xml/sax/helpers/AttributeListImpl.html
+http://developer.android.com/reference/java/text/AttributedCharacterIterator.Attribute.html
+http://developer.android.com/reference/java/text/AttributedString.html
+http://developer.android.com/reference/java/util/jar/Attributes.html
+http://developer.android.com/reference/java/util/jar/Attributes.Name.html
+http://developer.android.com/reference/org/xml/sax/helpers/AttributesImpl.html
+http://developer.android.com/reference/android/media/AudioFormat.html
+http://developer.android.com/reference/android/media/AudioRecord.html
+http://developer.android.com/reference/android/media/AudioTrack.html
+http://developer.android.com/reference/org/apache/http/auth/params/AuthParams.html
http://developer.android.com/reference/org/apache/http/client/params/AuthPolicy.html
+http://developer.android.com/reference/org/apache/http/impl/auth/AuthSchemeBase.html
+http://developer.android.com/reference/android/text/AutoText.html
+http://developer.android.com/reference/android/widget/BaseAdapter.html
+http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
+http://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie.html
+http://developer.android.com/reference/org/apache/http/impl/client/BasicCookieStore.html
+http://developer.android.com/reference/org/apache/http/impl/client/BasicCredentialsProvider.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicDomainHandler.html
+http://developer.android.com/reference/org/apache/http/conn/BasicEofSensorWatcher.html
+http://developer.android.com/reference/org/apache/http/message/BasicHeader.html
+http://developer.android.com/reference/org/apache/http/message/BasicHeaderElement.html
http://developer.android.com/reference/org/apache/http/message/BasicHeaderElementIterator.html
-
+http://developer.android.com/reference/org/apache/http/message/BasicHeaderIterator.html
http://developer.android.com/reference/org/apache/http/message/BasicHeaderValueFormatter.html
-
http://developer.android.com/reference/org/apache/http/message/BasicHeaderValueParser.html
http://developer.android.com/reference/org/apache/http/protocol/BasicHttpContext.html
-
+http://developer.android.com/reference/org/apache/http/protocol/BasicHttpProcessor.html
http://developer.android.com/reference/org/apache/http/message/BasicLineFormatter.html
http://developer.android.com/reference/org/apache/http/message/BasicLineParser.html
-
+http://developer.android.com/reference/org/apache/http/message/BasicListHeaderIterator.html
+http://developer.android.com/reference/org/apache/http/message/BasicNameValuePair.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicPathHandler.html
+http://developer.android.com/reference/org/apache/http/message/BasicRequestLine.html
+http://developer.android.com/reference/org/apache/http/impl/client/BasicResponseHandler.html
+http://developer.android.com/reference/org/apache/http/conn/routing/BasicRouteDirector.html
+http://developer.android.com/reference/org/apache/http/impl/auth/BasicSchemeFactory.html
+http://developer.android.com/reference/org/apache/http/message/BasicStatusLine.html
+http://developer.android.com/reference/org/apache/http/message/BasicTokenIterator.html
+http://developer.android.com/reference/android/os/BatteryManager.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpec.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BestMatchSpecFactory.html
+http://developer.android.com/reference/java/text/Bidi.html
+http://developer.android.com/reference/java/util/BitSet.html
+http://developer.android.com/reference/java/text/BreakIterator.html
+http://developer.android.com/reference/android/provider/Browser.html
+http://developer.android.com/reference/android/provider/Browser.BookmarkColumns.html
+http://developer.android.com/reference/android/provider/Browser.SearchColumns.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpecFactory.html
+http://developer.android.com/reference/java/nio/Buffer.html
+http://developer.android.com/reference/org/apache/http/message/BufferedHeader.html
+http://developer.android.com/reference/android/os/Build.html
+http://developer.android.com/reference/android/os/Build.VERSION.html
http://developer.android.com/reference/android/text/style/BulletSpan.html
-http://developer.android.com/reference/org/apache/http/util/ByteArrayBuffer.html
-
-http://developer.android.com/reference/java/util/zip/CRC32.html
+http://developer.android.com/reference/java/nio/ByteOrder.html
+http://developer.android.com/reference/java/security/cert/CRL.html
+http://developer.android.com/reference/android/webkit/CacheManager.html
+http://developer.android.com/reference/android/webkit/CacheManager.CacheResult.html
+http://developer.android.com/reference/java/util/Calendar.html
+http://developer.android.com/reference/android/provider/CallLog.html
+http://developer.android.com/reference/android/provider/CallLog.Calls.html
http://developer.android.com/reference/android/hardware/Camera.Parameters.html
-
http://developer.android.com/reference/android/hardware/Camera.Size.html
+http://developer.android.com/reference/android/telephony/CellLocation.html
+http://developer.android.com/reference/java/security/cert/CertPath.html
+http://developer.android.com/reference/java/security/cert/CertPath.CertPathRep.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilder.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderSpi.html
+http://developer.android.com/reference/javax/net/ssl/CertPathTrustManagerParameters.html
+http://developer.android.com/reference/java/security/cert/CertPathValidator.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorSpi.html
+http://developer.android.com/reference/java/security/cert/CertStore.html
+http://developer.android.com/reference/java/security/cert/CertStoreSpi.html
+http://developer.android.com/reference/javax/security/cert/Certificate.html
+http://developer.android.com/reference/java/security/cert/Certificate.CertificateRep.html
+http://developer.android.com/reference/java/security/cert/CertificateFactory.html
+http://developer.android.com/reference/java/security/cert/CertificateFactorySpi.html
+http://developer.android.com/reference/java/nio/channels/Channels.html
http://developer.android.com/reference/android/text/style/CharacterStyle.html
-
+http://developer.android.com/reference/java/nio/charset/Charset.html
+http://developer.android.com/reference/java/nio/charset/CharsetDecoder.html
+http://developer.android.com/reference/java/nio/charset/CharsetEncoder.html
http://developer.android.com/reference/java/nio/charset/spi/CharsetProvider.html
+http://developer.android.com/reference/javax/crypto/Cipher.html
+http://developer.android.com/reference/javax/crypto/CipherSpi.html
http://developer.android.com/reference/org/apache/http/client/utils/CloneUtils.html
-
+http://developer.android.com/reference/java/security/CodeSigner.html
+http://developer.android.com/reference/java/security/CodeSource.html
+http://developer.android.com/reference/java/nio/charset/CoderResult.html
+http://developer.android.com/reference/java/nio/charset/CodingErrorAction.html
+http://developer.android.com/reference/java/text/CollationElementIterator.html
+http://developer.android.com/reference/java/text/CollationKey.html
+http://developer.android.com/reference/java/text/Collator.html
+http://developer.android.com/reference/java/security/cert/CollectionCertStoreParameters.html
+http://developer.android.com/reference/java/util/Collections.html
+http://developer.android.com/reference/android/content/res/ColorStateList.html
+http://developer.android.com/reference/android/view/inputmethod/CompletionInfo.html
+http://developer.android.com/reference/android/os/ConditionVariable.html
+http://developer.android.com/reference/android/content/pm/ConfigurationInfo.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerParams.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnPerRouteBean.html
-
http://developer.android.com/reference/org/apache/http/conn/params/ConnRouteParams.html
+http://developer.android.com/reference/android/provider/Contacts.html
+http://developer.android.com/reference/android/provider/Contacts.ContactMethods.html
+http://developer.android.com/reference/android/provider/Contacts.Extensions.html
+http://developer.android.com/reference/android/provider/Contacts.GroupMembership.html
+http://developer.android.com/reference/android/provider/Contacts.Groups.html
+http://developer.android.com/reference/android/provider/Contacts.Intents.html
+http://developer.android.com/reference/android/provider/Contacts.Intents.Insert.html
+http://developer.android.com/reference/android/provider/Contacts.Intents.UI.html
+http://developer.android.com/reference/android/provider/Contacts.Organizations.html
+http://developer.android.com/reference/android/provider/Contacts.People.ContactMethods.html
+http://developer.android.com/reference/android/provider/Contacts.People.Extensions.html
+http://developer.android.com/reference/android/provider/Contacts.People.Phones.html
+http://developer.android.com/reference/android/provider/Contacts.Photos.html
+http://developer.android.com/reference/android/provider/Contacts.Settings.html
+http://developer.android.com/reference/android/database/ContentObserver.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieIdentityComparator.html
+http://developer.android.com/reference/android/webkit/CookieManager.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieOrigin.html
+http://developer.android.com/reference/org/apache/http/cookie/CookiePathComparator.html
http://developer.android.com/reference/org/apache/http/client/params/CookiePolicy.html
-
+http://developer.android.com/reference/org/apache/http/cookie/CookieSpecRegistry.html
+http://developer.android.com/reference/android/webkit/CookieSyncManager.html
+http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArrayList.html
+http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html
+http://developer.android.com/reference/android/os/CountDownTimer.html
+http://developer.android.com/reference/android/net/Credentials.html
+http://developer.android.com/reference/android/location/Criteria.html
+http://developer.android.com/reference/java/util/Currency.html
+http://developer.android.com/reference/android/database/CursorJoiner.html
+http://developer.android.com/reference/android/database/CursorWrapper.html
+http://developer.android.com/reference/android/view/animation/CycleInterpolator.html
+http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html
+http://developer.android.com/reference/javax/crypto/spec/DESKeySpec.html
+http://developer.android.com/reference/javax/crypto/spec/DESedeKeySpec.html
+http://developer.android.com/reference/javax/crypto/spec/DHGenParameterSpec.html
+http://developer.android.com/reference/javax/crypto/spec/DHParameterSpec.html
+http://developer.android.com/reference/javax/crypto/spec/DHPrivateKeySpec.html
+http://developer.android.com/reference/javax/crypto/spec/DHPublicKeySpec.html
+http://developer.android.com/reference/java/security/spec/DSAParameterSpec.html
+http://developer.android.com/reference/java/security/spec/DSAPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/DSAPublicKeySpec.html
+http://developer.android.com/reference/android/database/DataSetObserver.html
+http://developer.android.com/reference/android/database/DatabaseUtils.html
+http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
+http://developer.android.com/reference/java/util/Date.html
+http://developer.android.com/reference/android/text/format/DateFormat.html
+http://developer.android.com/reference/java/text/DateFormatSymbols.html
+http://developer.android.com/reference/android/webkit/DateSorter.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/DateUtils.html
+http://developer.android.com/reference/android/os/Debug.InstructionCount.html
+http://developer.android.com/reference/android/os/Debug.MemoryInfo.html
+http://developer.android.com/reference/android/view/animation/DecelerateInterpolator.html
+http://developer.android.com/reference/java/text/DecimalFormatSymbols.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnectionOperator.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultConnectionReuseStrategy.html
+http://developer.android.com/reference/org/xml/sax/helpers/DefaultHandler.html
+http://developer.android.com/reference/org/apache/http/impl/DefaultHttpRequestFactory.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.html
http://developer.android.com/reference/org/apache/http/impl/DefaultHttpResponseFactory.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultHttpRoutePlanner.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultRedirectHandler.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultRequestDirector.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultUserTokenHandler.html
http://developer.android.com/reference/org/apache/http/protocol/DefaultedHttpContext.html
-
-http://developer.android.com/reference/java/util/zip/Deflater.html
+http://developer.android.com/reference/dalvik/system/DexFile.html
+http://developer.android.com/reference/android/net/DhcpInfo.html
+http://developer.android.com/reference/java/util/Dictionary.html
+http://developer.android.com/reference/org/apache/http/impl/auth/DigestSchemeFactory.html
+http://developer.android.com/reference/javax/xml/parsers/DocumentBuilder.html
+http://developer.android.com/reference/javax/xml/parsers/DocumentBuilderFactory.html
http://developer.android.com/reference/android/text/style/DrawableMarginSpan.html
-
-http://developer.android.com/reference/org/apache/http/util/EncodingUtils.html
+http://developer.android.com/reference/org/xmlpull/v1/sax2/Driver.html
+http://developer.android.com/reference/java/sql/DriverManager.html
+http://developer.android.com/reference/java/sql/DriverPropertyInfo.html
+http://developer.android.com/reference/java/security/spec/ECFieldF2m.html
+http://developer.android.com/reference/java/security/spec/ECFieldFp.html
+http://developer.android.com/reference/java/security/spec/ECGenParameterSpec.html
+http://developer.android.com/reference/java/security/spec/ECParameterSpec.html
+http://developer.android.com/reference/java/security/spec/ECPoint.html
+http://developer.android.com/reference/java/security/spec/ECPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/ECPublicKeySpec.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGLConfig.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGLContext.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGLDisplay.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGLSurface.html
+http://developer.android.com/reference/android/text/Editable.Factory.html
+http://developer.android.com/reference/android/sax/Element.html
+http://developer.android.com/reference/java/security/spec/EllipticCurve.html
+http://developer.android.com/reference/java/security/spec/EncodedKeySpec.html
+http://developer.android.com/reference/javax/crypto/EncryptedPrivateKeyInfo.html
+http://developer.android.com/reference/org/apache/http/impl/EnglishReasonPhraseCatalog.html
http://developer.android.com/reference/org/apache/http/impl/entity/EntityDeserializer.html
-
http://developer.android.com/reference/org/apache/http/impl/entity/EntitySerializer.html
-http://developer.android.com/reference/org/apache/http/util/EntityUtils.html
-
-http://developer.android.com/reference/org/apache/http/util/ExceptionUtils.html
+http://developer.android.com/reference/android/os/Environment.html
+http://developer.android.com/reference/java/util/logging/ErrorManager.html
+http://developer.android.com/reference/java/util/EventListenerProxy.html
+http://developer.android.com/reference/java/util/EventObject.html
+http://developer.android.com/reference/java/util/concurrent/Exchanger.html
+http://developer.android.com/reference/java/util/concurrent/ExecutorCompletionService.html
+http://developer.android.com/reference/java/util/concurrent/Executors.html
+http://developer.android.com/reference/javax/crypto/ExemptionMechanism.html
+http://developer.android.com/reference/javax/crypto/ExemptionMechanismSpi.html
+http://developer.android.com/reference/android/widget/ExpandableListView.ExpandableListContextMenuInfo.html
+http://developer.android.com/reference/android/view/inputmethod/ExtractedText.html
+http://developer.android.com/reference/android/view/inputmethod/ExtractedTextRequest.html
http://developer.android.com/reference/android/media/FaceDetector.html
-
http://developer.android.com/reference/android/media/FaceDetector.Face.html
+http://developer.android.com/reference/java/text/FieldPosition.html
+http://developer.android.com/reference/java/nio/channels/FileChannel.MapMode.html
+http://developer.android.com/reference/java/nio/channels/FileLock.html
+http://developer.android.com/reference/android/os/FileObserver.html
+http://developer.android.com/reference/android/widget/Filter.html
+http://developer.android.com/reference/android/widget/Filter.FilterResults.html
+http://developer.android.com/reference/java/text/Format.html
+http://developer.android.com/reference/java/util/FormattableFlags.html
+http://developer.android.com/reference/java/util/concurrent/FutureTask.html
http://developer.android.com/reference/android/opengl/GLDebugHelper.html
-
http://developer.android.com/reference/android/opengl/GLU.html
http://developer.android.com/reference/android/opengl/GLUtils.html
-
+http://developer.android.com/reference/android/hardware/GeomagneticField.html
+http://developer.android.com/reference/android/location/GpsSatellite.html
+http://developer.android.com/reference/android/location/GpsStatus.html
+http://developer.android.com/reference/java/security/GuardedObject.html
+http://developer.android.com/reference/org/apache/http/protocol/HTTP.html
+http://developer.android.com/reference/java/util/logging/Handler.html
+http://developer.android.com/reference/org/xml/sax/HandlerBase.html
+http://developer.android.com/reference/org/apache/http/message/HeaderGroup.html
+http://developer.android.com/reference/android/widget/HeaderViewListAdapter.html
+http://developer.android.com/reference/android/text/Html.html
+http://developer.android.com/reference/org/apache/http/params/HttpAbstractParamBean.html
http://developer.android.com/reference/org/apache/http/client/params/HttpClientParams.html
http://developer.android.com/reference/org/apache/http/impl/HttpConnectionMetricsImpl.html
-
+http://developer.android.com/reference/org/apache/http/params/HttpConnectionParams.html
http://developer.android.com/reference/org/apache/http/protocol/HttpDateGenerator.html
+http://developer.android.com/reference/org/apache/http/entity/HttpEntityWrapper.html
+http://developer.android.com/reference/org/apache/http/HttpHost.html
+http://developer.android.com/reference/org/apache/http/params/HttpProtocolParams.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestExecutor.html
http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerRegistry.html
-
+http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoute.html
http://developer.android.com/reference/org/apache/http/protocol/HttpService.html
+http://developer.android.com/reference/org/apache/http/impl/io/HttpTransportMetricsImpl.html
http://developer.android.com/reference/android/text/style/IconMarginSpan.html
-
+http://developer.android.com/reference/java/security/Identity.html
+http://developer.android.com/reference/org/apache/http/impl/conn/IdleConnectionHandler.html
http://developer.android.com/reference/org/apache/http/conn/util/InetAddressUtils.html
+http://developer.android.com/reference/android/view/inputmethod/InputBinding.html
+http://developer.android.com/reference/android/view/inputmethod/InputConnectionWrapper.html
+http://developer.android.com/reference/android/text/InputFilter.AllCaps.html
+http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethodInfo.html
+http://developer.android.com/reference/android/inputmethodservice/InputMethodService.Insets.html
+http://developer.android.com/reference/org/xml/sax/InputSource.html
+http://developer.android.com/reference/javax/crypto/spec/IvParameterSpec.html
http://developer.android.com/reference/org/json/JSONArray.html
-
http://developer.android.com/reference/org/json/JSONObject.html
http://developer.android.com/reference/org/json/JSONStringer.html
-
http://developer.android.com/reference/org/json/JSONTokener.html
-http://developer.android.com/reference/org/apache/http/util/LangUtils.html
-
+http://developer.android.com/reference/android/webkit/JsResult.html
+http://developer.android.com/reference/javax/crypto/KeyAgreement.html
+http://developer.android.com/reference/javax/crypto/KeyAgreementSpi.html
+http://developer.android.com/reference/java/security/KeyFactory.html
+http://developer.android.com/reference/java/security/KeyFactorySpi.html
+http://developer.android.com/reference/javax/crypto/KeyGenerator.html
+http://developer.android.com/reference/javax/crypto/KeyGeneratorSpi.html
+http://developer.android.com/reference/javax/net/ssl/KeyManagerFactory.html
+http://developer.android.com/reference/javax/net/ssl/KeyManagerFactorySpi.html
+http://developer.android.com/reference/java/security/KeyPair.html
+http://developer.android.com/reference/java/security/KeyPairGeneratorSpi.html
+http://developer.android.com/reference/java/security/KeyRep.html
+http://developer.android.com/reference/java/security/KeyStore.html
+http://developer.android.com/reference/java/security/KeyStore.Builder.html
+http://developer.android.com/reference/java/security/KeyStore.CallbackHandlerProtection.html
+http://developer.android.com/reference/java/security/KeyStore.PasswordProtection.html
+http://developer.android.com/reference/java/security/KeyStore.PrivateKeyEntry.html
+http://developer.android.com/reference/java/security/KeyStore.SecretKeyEntry.html
+http://developer.android.com/reference/java/security/KeyStore.TrustedCertificateEntry.html
+http://developer.android.com/reference/javax/net/ssl/KeyStoreBuilderParameters.html
+http://developer.android.com/reference/java/security/KeyStoreSpi.html
+http://developer.android.com/reference/android/inputmethodservice/Keyboard.Key.html
+http://developer.android.com/reference/android/inputmethodservice/Keyboard.Row.html
+http://developer.android.com/reference/java/security/cert/LDAPCertStoreParameters.html
http://developer.android.com/reference/org/apache/http/impl/entity/LaxContentLengthStrategy.html
-
+http://developer.android.com/reference/android/text/Layout.html
+http://developer.android.com/reference/android/text/Layout.Directions.html
+http://developer.android.com/reference/android/view/animation/LayoutAnimationController.html
+http://developer.android.com/reference/android/view/animation/LayoutAnimationController.AnimationParameters.html
http://developer.android.com/reference/android/text/style/LeadingMarginSpan.Standard.html
+http://developer.android.com/reference/java/util/logging/Level.html
+http://developer.android.com/reference/android/view/animation/LinearInterpolator.html
+http://developer.android.com/reference/android/text/util/Linkify.html
+http://developer.android.com/reference/android/widget/ListView.FixedViewInfo.html
+http://developer.android.com/reference/android/provider/LiveFolders.html
+http://developer.android.com/reference/android/net/LocalServerSocket.html
+http://developer.android.com/reference/android/net/LocalSocket.html
+http://developer.android.com/reference/android/net/LocalSocketAddress.html
+http://developer.android.com/reference/java/util/Locale.html
+http://developer.android.com/reference/android/location/Location.html
+http://developer.android.com/reference/android/location/LocationProvider.html
+http://developer.android.com/reference/org/xml/sax/helpers/LocatorImpl.html
http://developer.android.com/reference/java/util/concurrent/locks/LockSupport.html
-
+http://developer.android.com/reference/java/util/logging/LogManager.html
+http://developer.android.com/reference/java/util/logging/LogRecord.html
+http://developer.android.com/reference/java/util/logging/Logger.html
+http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionInputBuffer.html
+http://developer.android.com/reference/org/apache/http/impl/conn/LoggingSessionOutputBuffer.html
+http://developer.android.com/reference/android/text/LoginFilter.html
+http://developer.android.com/reference/java/security/spec/MGF1ParameterSpec.html
+http://developer.android.com/reference/javax/crypto/Mac.html
+http://developer.android.com/reference/javax/crypto/MacSpi.html
+http://developer.android.com/reference/android/net/MailTo.html
http://developer.android.com/reference/java/util/regex/Matcher.html
+http://developer.android.com/reference/java/math/MathContext.html
http://developer.android.com/reference/android/opengl/Matrix.html
-
+http://developer.android.com/reference/android/database/MatrixCursor.RowBuilder.html
http://developer.android.com/reference/android/media/MediaRecorder.AudioEncoder.html
http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html
-
http://developer.android.com/reference/android/media/MediaRecorder.OutputFormat.html
+http://developer.android.com/reference/android/media/MediaRecorder.VideoEncoder.html
+http://developer.android.com/reference/android/media/MediaRecorder.VideoSource.html
http://developer.android.com/reference/android/media/MediaScannerConnection.html
-
+http://developer.android.com/reference/android/provider/MediaStore.Audio.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Albums.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Artists.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Artists.Albums.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Genres.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Genres.Members.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Media.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Playlists.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.Playlists.Members.html
+http://developer.android.com/reference/android/provider/MediaStore.Images.html
+http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html
+http://developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails.html
+http://developer.android.com/reference/android/provider/MediaStore.Video.html
+http://developer.android.com/reference/android/provider/MediaStore.Video.Media.html
+http://developer.android.com/reference/android/os/MemoryFile.html
+http://developer.android.com/reference/android/os/Message.html
+http://developer.android.com/reference/java/security/MessageDigestSpi.html
+http://developer.android.com/reference/android/os/MessageQueue.html
+http://developer.android.com/reference/android/os/Messenger.html
+http://developer.android.com/reference/android/text/method/MetaKeyKeyListener.html
+http://developer.android.com/reference/android/webkit/MimeTypeMap.html
+http://developer.android.com/reference/android/test/mock/MockDialogInterface.html
http://developer.android.com/reference/java/lang/reflect/Modifier.html
+http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.CommaTokenizer.html
+http://developer.android.com/reference/org/apache/http/conn/MultihomePlainSocketFactory.html
+http://developer.android.com/reference/org/xml/sax/helpers/NamespaceSupport.html
+http://developer.android.com/reference/android/telephony/NeighboringCellInfo.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftHeaderParser.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpecFactory.html
+http://developer.android.com/reference/android/net/NetworkInfo.html
+http://developer.android.com/reference/org/apache/http/impl/NoConnectionReuseStrategy.html
+http://developer.android.com/reference/android/text/NoCopySpan.Concrete.html
+http://developer.android.com/reference/java/awt/font/NumericShaper.html
+http://developer.android.com/reference/javax/crypto/spec/OAEPParameterSpec.html
+http://developer.android.com/reference/java/io/ObjectInputStream.GetField.html
+http://developer.android.com/reference/java/io/ObjectOutputStream.PutField.html
+http://developer.android.com/reference/java/io/ObjectStreamClass.html
+http://developer.android.com/reference/java/io/ObjectStreamField.html
+http://developer.android.com/reference/java/util/Observable.html
+http://developer.android.com/reference/java/io/OutputStream.html
+http://developer.android.com/reference/javax/crypto/spec/PBEKeySpec.html
+http://developer.android.com/reference/javax/crypto/spec/PBEParameterSpec.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathChecker.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathValidatorResult.html
+http://developer.android.com/reference/java/security/cert/PKIXParameters.html
+http://developer.android.com/reference/java/security/spec/PSSParameterSpec.html
+http://developer.android.com/reference/javax/crypto/spec/PSource.html
+http://developer.android.com/reference/java/util/jar/Pack200.html
+http://developer.android.com/reference/android/content/pm/PackageInfo.html
+http://developer.android.com/reference/android/content/pm/PackageItemInfo.html
+http://developer.android.com/reference/android/content/pm/PackageItemInfo.DisplayNameComparator.html
+http://developer.android.com/reference/android/content/pm/PackageStats.html
+http://developer.android.com/reference/android/os/Parcel.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.html
+http://developer.android.com/reference/java/text/ParsePosition.html
+http://developer.android.com/reference/org/xml/sax/helpers/ParserAdapter.html
http://developer.android.com/reference/org/apache/http/message/ParserCursor.html
-
+http://developer.android.com/reference/org/xml/sax/helpers/ParserFactory.html
+http://developer.android.com/reference/android/text/method/PasswordTransformationMethod.html
+http://developer.android.com/reference/java/util/regex/Pattern.html
+http://developer.android.com/reference/java/security/Permission.html
+http://developer.android.com/reference/java/security/PermissionCollection.html
+http://developer.android.com/reference/android/telephony/PhoneNumberFormattingTextWatcher.html
+http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html
+http://developer.android.com/reference/android/telephony/PhoneStateListener.html
+http://developer.android.com/reference/java/nio/channels/Pipe.html
http://developer.android.com/reference/org/apache/http/conn/scheme/PlainSocketFactory.html
+http://developer.android.com/reference/android/webkit/Plugin.html
+http://developer.android.com/reference/android/webkit/PluginData.html
+http://developer.android.com/reference/android/webkit/PluginList.html
+http://developer.android.com/reference/java/security/Policy.html
+http://developer.android.com/reference/java/security/cert/PolicyQualifierInfo.html
+http://developer.android.com/reference/android/widget/PopupWindow.html
+http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
+http://developer.android.com/reference/android/preference/PreferenceManager.html
+http://developer.android.com/reference/java/util/prefs/Preferences.html
+http://developer.android.com/reference/java/beans/PropertyChangeSupport.html
+http://developer.android.com/reference/java/security/ProtectionDomain.html
+http://developer.android.com/reference/org/apache/http/ProtocolVersion.html
+http://developer.android.com/reference/java/security/Provider.Service.html
+http://developer.android.com/reference/org/apache/http/impl/conn/ProxySelectorRoutePlanner.html
http://developer.android.com/reference/android/text/style/QuoteSpan.html
-
+http://developer.android.com/reference/javax/crypto/spec/RC2ParameterSpec.html
+http://developer.android.com/reference/javax/crypto/spec/RC5ParameterSpec.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109DomainHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109SpecFactory.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965CommentUrlAttributeHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965DiscardAttributeHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965DomainAttributeHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965PortAttributeHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965SpecFactory.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965VersionAttributeHandler.html
+http://developer.android.com/reference/java/security/spec/RSAKeyGenParameterSpec.html
+http://developer.android.com/reference/java/security/spec/RSAOtherPrimeInfo.html
+http://developer.android.com/reference/java/security/spec/RSAPrivateKeySpec.html
+http://developer.android.com/reference/java/security/spec/RSAPublicKeySpec.html
+http://developer.android.com/reference/java/util/Random.html
+http://developer.android.com/reference/java/io/RandomAccessFile.html
+http://developer.android.com/reference/java/io/Reader.html
+http://developer.android.com/reference/android/speech/RecognizerIntent.html
+http://developer.android.com/reference/org/apache/http/impl/client/RedirectLocations.html
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantLock.html
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantReadWriteLock.html
-
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantReadWriteLock.ReadLock.html
-
http://developer.android.com/reference/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html
-
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueWorker.html
+http://developer.android.com/reference/android/os/RemoteCallbackList.html
+http://developer.android.com/reference/android/os/IInterface.html
+http://developer.android.com/reference/android/widget/RemoteViews.html
+http://developer.android.com/reference/android/text/method/ReplacementTransformationMethod.html
http://developer.android.com/reference/org/apache/http/protocol/RequestConnControl.html
http://developer.android.com/reference/org/apache/http/protocol/RequestContent.html
-
http://developer.android.com/reference/org/apache/http/protocol/RequestDate.html
http://developer.android.com/reference/org/apache/http/protocol/RequestExpectContinue.html
-
http://developer.android.com/reference/org/apache/http/protocol/RequestTargetHost.html
http://developer.android.com/reference/org/apache/http/protocol/RequestUserAgent.html
-
+http://developer.android.com/reference/android/content/pm/ResolveInfo.html
+http://developer.android.com/reference/android/content/pm/ResolveInfo.DisplayNameComparator.html
+http://developer.android.com/reference/java/util/ResourceBundle.html
http://developer.android.com/reference/org/apache/http/protocol/ResponseConnControl.html
http://developer.android.com/reference/org/apache/http/protocol/ResponseContent.html
-
http://developer.android.com/reference/org/apache/http/protocol/ResponseDate.html
http://developer.android.com/reference/org/apache/http/protocol/ResponseServer.html
-
+http://developer.android.com/reference/android/os/ResultReceiver.html
+http://developer.android.com/reference/android/text/util/Rfc822Token.html
+http://developer.android.com/reference/android/text/util/Rfc822Tokenizer.html
http://developer.android.com/reference/android/media/Ringtone.html
+http://developer.android.com/reference/android/media/RingtoneManager.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RouteSpecificPool.html
+http://developer.android.com/reference/org/apache/http/conn/routing/RouteTracker.html
+http://developer.android.com/reference/org/apache/http/impl/client/RoutedRequest.html
+http://developer.android.com/reference/javax/xml/parsers/SAXParser.html
+http://developer.android.com/reference/javax/xml/parsers/SAXParserFactory.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html
+http://developer.android.com/reference/javax/net/ssl/SSLContext.html
+http://developer.android.com/reference/javax/net/ssl/SSLContextSpi.html
+http://developer.android.com/reference/javax/net/ssl/SSLEngine.html
+http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.html
http://developer.android.com/reference/org/apache/http/conn/ssl/SSLSocketFactory.html
-
+http://developer.android.com/reference/android/net/wifi/ScanResult.html
+http://developer.android.com/reference/java/util/Scanner.html
http://developer.android.com/reference/org/apache/http/conn/scheme/Scheme.html
http://developer.android.com/reference/org/apache/http/conn/scheme/SchemeRegistry.html
-
+http://developer.android.com/reference/android/text/method/ScrollingMovementMethod.html
+http://developer.android.com/reference/javax/crypto/SealedObject.html
+http://developer.android.com/reference/android/provider/SearchRecentSuggestions.html
+http://developer.android.com/reference/javax/crypto/SecretKeyFactory.html
+http://developer.android.com/reference/javax/crypto/SecretKeyFactorySpi.html
+http://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html
+http://developer.android.com/reference/java/security/SecureRandomSpi.html
+http://developer.android.com/reference/java/security/Security.html
+http://developer.android.com/reference/android/text/Selection.html
+http://developer.android.com/reference/java/nio/channels/SelectionKey.html
+http://developer.android.com/reference/java/nio/channels/Selector.html
+http://developer.android.com/reference/java/nio/channels/spi/SelectorProvider.html
+http://developer.android.com/reference/java/util/concurrent/Semaphore.html
+http://developer.android.com/reference/android/hardware/Sensor.html
+http://developer.android.com/reference/android/hardware/SensorEvent.html
http://developer.android.com/reference/javax/net/ServerSocketFactory.html
+http://developer.android.com/reference/android/telephony/ServiceState.html
+http://developer.android.com/reference/android/provider/Settings.html
+http://developer.android.com/reference/android/provider/Settings.NameValueTable.html
+http://developer.android.com/reference/android/content/pm/Signature.html
+http://developer.android.com/reference/java/security/SignatureSpi.html
+http://developer.android.com/reference/java/security/SignedObject.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.html
http://developer.android.com/reference/android/telephony/gsm/SmsManager.html
-
http://developer.android.com/reference/android/telephony/gsm/SmsMessage.html
http://developer.android.com/reference/android/telephony/gsm/SmsMessage.SubmitPdu.html
-
-http://developer.android.com/reference/android/media/SoundPool.html
+http://developer.android.com/reference/javax/net/SocketFactory.html
+http://developer.android.com/reference/android/text/Spannable.Factory.html
+http://developer.android.com/reference/android/text/SpannableString.html
+http://developer.android.com/reference/android/text/SpannableStringBuilder.html
+http://developer.android.com/reference/android/text/SpannedString.html
+http://developer.android.com/reference/android/os/StatFs.html
+http://developer.android.com/reference/java/io/StreamTokenizer.html
http://developer.android.com/reference/org/apache/http/impl/entity/StrictContentLengthStrategy.html
-
+http://developer.android.com/reference/java/text/StringCharacterIterator.html
+http://developer.android.com/reference/java/util/StringTokenizer.html
+http://developer.android.com/reference/javax/security/auth/Subject.html
+http://developer.android.com/reference/javax/security/auth/SubjectDomainCombiner.html
+http://developer.android.com/reference/android/widget/TabHost.TabSpec.html
http://developer.android.com/reference/android/text/style/TabStopSpan.Standard.html
+http://developer.android.com/reference/dalvik/system/TemporaryDirectory.html
+http://developer.android.com/reference/junit/framework/TestFailure.html
http://developer.android.com/reference/android/test/suitebuilder/TestMethod.html
-
+http://developer.android.com/reference/junit/framework/TestResult.html
http://developer.android.com/reference/android/test/suitebuilder/TestSuiteBuilder.html
+http://developer.android.com/reference/android/text/TextUtils.html
+http://developer.android.com/reference/android/text/TextUtils.SimpleStringSplitter.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.AbortPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.CallerRunsPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardOldestPolicy.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.DiscardPolicy.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.html
+http://developer.android.com/reference/android/text/format/Time.html
+http://developer.android.com/reference/java/util/TimeZone.html
+http://developer.android.com/reference/java/util/Timer.html
+http://developer.android.com/reference/java/util/TimerTask.html
+http://developer.android.com/reference/java/security/Timestamp.html
+http://developer.android.com/reference/android/widget/Toast.html
+http://developer.android.com/reference/android/os/TokenWatcher.html
http://developer.android.com/reference/android/media/ToneGenerator.html
-
+http://developer.android.com/reference/android/text/method/Touch.html
+http://developer.android.com/reference/dalvik/system/TouchDex.html
+http://developer.android.com/reference/android/view/animation/Transformation.html
+http://developer.android.com/reference/java/security/cert/TrustAnchor.html
+http://developer.android.com/reference/javax/net/ssl/TrustManagerFactory.html
+http://developer.android.com/reference/javax/net/ssl/TrustManagerFactorySpi.html
+http://developer.android.com/reference/java/sql/Types.html
http://developer.android.com/reference/org/apache/http/client/utils/URIUtils.html
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html
-
+http://developer.android.com/reference/android/webkit/URLUtil.html
+http://developer.android.com/reference/java/util/UUID.html
+http://developer.android.com/reference/android/net/Uri.Builder.html
http://developer.android.com/reference/org/apache/http/protocol/UriPatternMatcher.html
-http://developer.android.com/reference/junit/runner/Version.html
-
-http://developer.android.com/reference/org/apache/http/util/VersionInfo.html
+http://developer.android.com/reference/android/webkit/UrlInterceptRegistry.html
+http://developer.android.com/reference/android/net/UrlQuerySanitizer.html
+http://developer.android.com/reference/android/net/UrlQuerySanitizer.IllegalCharacterValueSanitizer.html
+http://developer.android.com/reference/android/net/UrlQuerySanitizer.ParameterValuePair.html
+http://developer.android.com/reference/android/provider/UserDictionary.html
+http://developer.android.com/reference/android/provider/UserDictionary.Words.html
+http://developer.android.com/reference/dalvik/system/VMDebug.html
+http://developer.android.com/reference/dalvik/system/VMRuntime.html
+http://developer.android.com/reference/dalvik/system/VMStack.html
+http://developer.android.com/reference/android/opengl/Visibility.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThread.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/WaitingThreadAborter.html
+http://developer.android.com/reference/android/webkit/WebBackForwardList.html
+http://developer.android.com/reference/android/webkit/WebChromeClient.html
+http://developer.android.com/reference/android/webkit/WebHistoryItem.html
+http://developer.android.com/reference/android/webkit/WebIconDatabase.html
+http://developer.android.com/reference/android/webkit/WebSettings.html
+http://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
+http://developer.android.com/reference/android/webkit/WebView.WebViewTransport.html
+http://developer.android.com/reference/android/webkit/WebViewClient.html
+http://developer.android.com/reference/android/webkit/WebViewDatabase.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.AuthAlgorithm.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.GroupCipher.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.KeyMgmt.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.PairwiseCipher.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Protocol.html
+http://developer.android.com/reference/android/net/wifi/WifiConfiguration.Status.html
+http://developer.android.com/reference/android/net/wifi/WifiInfo.html
+http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
+http://developer.android.com/reference/org/apache/http/impl/conn/Wire.html
+http://developer.android.com/reference/java/io/Writer.html
+http://developer.android.com/reference/javax/security/auth/x500/X500Principal.html
+http://developer.android.com/reference/java/security/cert/X509CRLEntry.html
+http://developer.android.com/reference/java/security/cert/X509CRLSelector.html
+http://developer.android.com/reference/java/security/cert/X509CertSelector.html
+http://developer.android.com/reference/javax/net/ssl/X509ExtendedKeyManager.html
+http://developer.android.com/reference/javax/xml/XMLConstants.html
+http://developer.android.com/reference/org/xml/sax/helpers/XMLFilterImpl.html
+http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderAdapter.html
+http://developer.android.com/reference/org/xml/sax/helpers/XMLReaderFactory.html
http://developer.android.com/reference/org/xmlpull/v1/XmlPullParserFactory.html
-
+http://developer.android.com/reference/dalvik/system/Zygote.html
+http://developer.android.com/reference/org/apache/http/conn/OperatedClientConnection.html
+http://developer.android.com/reference/org/apache/http/conn/ManagedClientConnection.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieAttributeHandler.html
+http://developer.android.com/reference/java/util/concurrent/ExecutorService.html
+http://developer.android.com/reference/org/apache/http/io/SessionInputBuffer.html
+http://developer.android.com/reference/org/apache/http/io/SessionOutputBuffer.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethod.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethodSession.html
http://developer.android.com/reference/java/util/concurrent/locks/Lock.html
http://developer.android.com/reference/org/apache/http/conn/ssl/X509HostnameVerifier.html
-
+http://developer.android.com/reference/org/xml/sax/AttributeList.html
+http://developer.android.com/reference/org/xml/sax/Attributes.html
+http://developer.android.com/reference/org/apache/http/params/HttpParams.html
+http://developer.android.com/reference/android/widget/ListAdapter.html
+http://developer.android.com/reference/android/widget/SpinnerAdapter.html
+http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
+http://developer.android.com/reference/org/apache/http/client/CredentialsProvider.html
+http://developer.android.com/reference/org/apache/http/conn/EofSensorWatcher.html
+http://developer.android.com/reference/org/apache/http/HeaderElementIterator.html
+http://developer.android.com/reference/org/apache/http/HeaderIterator.html
+http://developer.android.com/reference/java/util/List.html
+http://developer.android.com/reference/org/apache/http/HttpRequest.html
+http://developer.android.com/reference/org/apache/http/client/ResponseHandler.html
+http://developer.android.com/reference/org/apache/http/conn/routing/HttpRouteDirector.html
+http://developer.android.com/reference/org/apache/http/TokenIterator.html
+http://developer.android.com/reference/android/telephony/gsm/GsmCellLocation.html
+http://developer.android.com/reference/javax/net/ssl/TrustManager.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManager.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionOperator.html
+http://developer.android.com/reference/org/apache/http/client/HttpRequestRetryHandler.html
+http://developer.android.com/reference/org/apache/http/conn/routing/HttpRoutePlanner.html
+http://developer.android.com/reference/org/apache/http/client/RedirectHandler.html
+http://developer.android.com/reference/org/apache/http/client/RequestDirector.html
+http://developer.android.com/reference/java/util/concurrent/CompletionService.html
+http://developer.android.com/reference/java/util/concurrent/Executor.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html
+http://developer.android.com/reference/java/util/concurrent/ThreadFactory.html
+http://developer.android.com/reference/java/util/concurrent/Callable.html
+http://developer.android.com/reference/java/util/Formattable.html
+http://developer.android.com/reference/org/xml/sax/DocumentHandler.html
+http://developer.android.com/reference/org/apache/http/io/HttpTransportMetrics.html
+http://developer.android.com/reference/java/security/Principal.html
+http://developer.android.com/reference/java/security/KeyPairGenerator.html
+http://developer.android.com/reference/java/security/Key.html
+http://developer.android.com/reference/java/math/BigDecimal.html
+http://developer.android.com/reference/java/security/MessageDigest.html
+http://developer.android.com/reference/java/util/jar/Pack200.Packer.html
+http://developer.android.com/reference/java/util/jar/Pack200.Unpacker.html
+http://developer.android.com/reference/org/xml/sax/Parser.html
http://developer.android.com/reference/java/util/concurrent/locks/ReadWriteLock.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.html
+http://developer.android.com/reference/org/xml/sax/XMLReader.html
+http://developer.android.com/reference/java/security/SecureRandom.html
+http://developer.android.com/reference/java/nio/channels/SelectableChannel.html
+http://developer.android.com/reference/java/nio/channels/DatagramChannel.html
+http://developer.android.com/reference/java/nio/channels/ServerSocketChannel.html
+http://developer.android.com/reference/java/nio/channels/SocketChannel.html
+http://developer.android.com/reference/java/security/Signature.html
+http://developer.android.com/reference/java/text/CharacterIterator.html
+http://developer.android.com/reference/android/widget/AbsListView.LayoutParams.html
+http://developer.android.com/reference/android/widget/AbsoluteLayout.LayoutParams.html
http://developer.android.com/reference/android/text/style/AbsoluteSizeSpan.html
-
+http://developer.android.com/reference/android/database/AbstractCursor.SelfContentObserver.html
+http://developer.android.com/reference/java/util/AbstractList.html
+http://developer.android.com/reference/org/apache/http/impl/conn/AbstractPooledConnAdapter.html
+http://developer.android.com/reference/java/util/prefs/AbstractPreferences.html
+http://developer.android.com/reference/java/util/AbstractQueue.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectableChannel.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelectionKey.html
+http://developer.android.com/reference/java/nio/channels/spi/AbstractSelector.html
+http://developer.android.com/reference/java/util/AbstractSequentialList.html
+http://developer.android.com/reference/java/util/AbstractSet.html
+http://developer.android.com/reference/android/database/AbstractWindowedCursor.html
+http://developer.android.com/reference/java/security/AccessControlException.html
+http://developer.android.com/reference/java/security/acl/AclNotFoundException.html
+http://developer.android.com/reference/android/content/pm/ActivityInfo.html
+http://developer.android.com/reference/java/security/AllPermission.html
+http://developer.android.com/reference/dalvik/system/AllocationLimitError.html
http://developer.android.com/reference/org/apache/http/conn/ssl/AllowAllHostnameVerifier.html
-
+http://developer.android.com/reference/android/view/animation/AlphaAnimation.html
+http://developer.android.com/reference/android/widget/AlphabetIndexer.html
+http://developer.android.com/reference/java/nio/channels/AlreadyConnectedException.html
+http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html
+http://developer.android.com/reference/android/content/pm/ApplicationInfo.html
+http://developer.android.com/reference/java/util/concurrent/ArrayBlockingQueue.html
+http://developer.android.com/reference/junit/framework/AssertionFailedError.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseInputStream.html
+http://developer.android.com/reference/android/content/res/AssetFileDescriptor.AutoCloseOutputStream.html
+http://developer.android.com/reference/android/content/res/AssetManager.AssetInputStream.html
+http://developer.android.com/reference/android/os/AsyncTask.Status.html
+http://developer.android.com/reference/java/nio/channels/AsynchronousCloseException.html
+http://developer.android.com/reference/java/util/concurrent/atomic/AtomicInteger.html
+http://developer.android.com/reference/java/util/concurrent/atomic/AtomicLong.html
+http://developer.android.com/reference/org/xml/sax/ext/Attributes2Impl.html
+http://developer.android.com/reference/org/apache/http/auth/params/AuthParamBean.html
+http://developer.android.com/reference/javax/security/auth/AuthPermission.html
+http://developer.android.com/reference/java/security/AuthProvider.html
http://developer.android.com/reference/android/text/style/BackgroundColorSpan.html
+http://developer.android.com/reference/java/util/prefs/BackingStoreException.html
+http://developer.android.com/reference/javax/crypto/BadPaddingException.html
+http://developer.android.com/reference/android/os/BadParcelableException.html
+http://developer.android.com/reference/android/text/method/BaseKeyListener.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicClientCookie2.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicCommentHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicExpiresHandler.html
+http://developer.android.com/reference/org/apache/http/entity/BasicHttpEntity.html
+http://developer.android.com/reference/org/apache/http/message/BasicHttpEntityEnclosingRequest.html
+http://developer.android.com/reference/org/apache/http/params/BasicHttpParams.html
+http://developer.android.com/reference/org/apache/http/message/BasicHttpRequest.html
+http://developer.android.com/reference/org/apache/http/message/BasicHttpResponse.html
+http://developer.android.com/reference/org/apache/http/conn/BasicManagedEntity.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicMaxAgeHandler.html
+http://developer.android.com/reference/java/security/BasicPermission.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntry.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPoolEntryRef.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter.html
+http://developer.android.com/reference/org/apache/http/impl/auth/BasicScheme.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/BasicSecureHandler.html
+http://developer.android.com/reference/java/sql/BatchUpdateException.html
+http://developer.android.com/reference/java/math/BigInteger.html
+http://developer.android.com/reference/android/text/BoringLayout.html
+http://developer.android.com/reference/android/text/BoringLayout.Metrics.html
+http://developer.android.com/reference/java/util/concurrent/BrokenBarrierException.html
http://developer.android.com/reference/org/apache/http/conn/ssl/BrowserCompatHostnameVerifier.html
-
-http://developer.android.com/reference/java/util/zip/CheckedInputStream.html
-http://developer.android.com/reference/java/util/zip/CheckedOutputStream.html
-
+http://developer.android.com/reference/org/apache/http/impl/cookie/BrowserCompatSpec.html
+http://developer.android.com/reference/java/nio/BufferOverflowException.html
+http://developer.android.com/reference/java/nio/BufferUnderflowException.html
+http://developer.android.com/reference/org/apache/http/entity/BufferedHttpEntity.html
+http://developer.android.com/reference/java/io/BufferedInputStream.html
+http://developer.android.com/reference/java/io/BufferedOutputStream.html
+http://developer.android.com/reference/java/io/BufferedReader.html
+http://developer.android.com/reference/java/io/BufferedWriter.html
+http://developer.android.com/reference/org/apache/http/entity/ByteArrayEntity.html
+http://developer.android.com/reference/java/io/ByteArrayInputStream.html
+http://developer.android.com/reference/java/io/ByteArrayOutputStream.html
+http://developer.android.com/reference/java/nio/ByteBuffer.html
+http://developer.android.com/reference/java/security/cert/CRLException.html
+http://developer.android.com/reference/java/util/concurrent/CancellationException.html
+http://developer.android.com/reference/java/nio/channels/CancelledKeyException.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderException.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorException.html
+http://developer.android.com/reference/java/security/cert/CertStoreException.html
+http://developer.android.com/reference/javax/security/cert/CertificateEncodingException.html
+http://developer.android.com/reference/javax/security/cert/CertificateException.html
+http://developer.android.com/reference/javax/security/cert/CertificateExpiredException.html
+http://developer.android.com/reference/javax/security/cert/CertificateNotYetValidException.html
+http://developer.android.com/reference/javax/security/cert/CertificateParsingException.html
+http://developer.android.com/reference/java/io/CharArrayReader.html
+http://developer.android.com/reference/java/io/CharArrayWriter.html
+http://developer.android.com/reference/java/nio/CharBuffer.html
+http://developer.android.com/reference/java/io/CharConversionException.html
+http://developer.android.com/reference/java/nio/charset/CharacterCodingException.html
+http://developer.android.com/reference/android/text/method/CharacterPickerDialog.html
+http://developer.android.com/reference/android/preference/CheckBoxPreference.html
+http://developer.android.com/reference/java/text/ChoiceFormat.html
+http://developer.android.com/reference/org/apache/http/impl/io/ChunkedInputStream.html
+http://developer.android.com/reference/org/apache/http/impl/io/ChunkedOutputStream.html
+http://developer.android.com/reference/javax/crypto/CipherInputStream.html
+http://developer.android.com/reference/javax/crypto/CipherOutputStream.html
+http://developer.android.com/reference/org/apache/http/client/CircularRedirectException.html
http://developer.android.com/reference/android/text/style/ClickableSpan.html
http://developer.android.com/reference/org/apache/http/client/params/ClientParamBean.html
-
+http://developer.android.com/reference/org/apache/http/impl/client/ClientParamsStack.html
+http://developer.android.com/reference/org/apache/http/client/ClientProtocolException.html
+http://developer.android.com/reference/java/nio/channels/ClosedByInterruptException.html
+http://developer.android.com/reference/java/nio/channels/ClosedChannelException.html
+http://developer.android.com/reference/java/nio/channels/ClosedSelectorException.html
+http://developer.android.com/reference/java/nio/charset/CoderMalfunctionError.html
+http://developer.android.com/reference/junit/framework/ComparisonFailure.html
+http://developer.android.com/reference/android/content/pm/ComponentInfo.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html
+http://developer.android.com/reference/java/util/ConcurrentModificationException.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnConnectionParamBean.html
-
http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerParamBean.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnRouteParamBean.html
-
+http://developer.android.com/reference/org/apache/http/conn/ConnectTimeoutException.html
+http://developer.android.com/reference/org/apache/http/ConnectionClosedException.html
http://developer.android.com/reference/javax/sql/ConnectionEvent.html
+http://developer.android.com/reference/java/nio/channels/ConnectionPendingException.html
+http://developer.android.com/reference/org/apache/http/conn/ConnectionPoolTimeoutException.html
+http://developer.android.com/reference/java/util/logging/ConsoleHandler.html
http://developer.android.com/reference/java/lang/reflect/Constructor.html
-
+http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthInputStream.html
+http://developer.android.com/reference/org/apache/http/impl/io/ContentLengthOutputStream.html
+http://developer.android.com/reference/android/database/ContentObservable.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/CookieSpecBase.html
http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecParamBean.html
-
+http://developer.android.com/reference/java/util/concurrent/CopyOnWriteArraySet.html
+http://developer.android.com/reference/android/widget/CursorAdapter.html
+http://developer.android.com/reference/android/database/CursorIndexOutOfBoundsException.html
+http://developer.android.com/reference/android/database/CursorJoiner.Result.html
+http://developer.android.com/reference/android/widget/CursorTreeAdapter.html
+http://developer.android.com/reference/android/database/CursorWindow.html
http://developer.android.com/reference/org/w3c/dom/DOMException.html
-http://developer.android.com/reference/java/util/zip/DataFormatException.html
-
+http://developer.android.com/reference/java/io/DataInputStream.html
+http://developer.android.com/reference/java/io/DataOutputStream.html
+http://developer.android.com/reference/android/database/DataSetObservable.html
+http://developer.android.com/reference/java/sql/DataTruncation.html
+http://developer.android.com/reference/java/sql/Date.html
+http://developer.android.com/reference/java/text/DateFormat.html
+http://developer.android.com/reference/java/text/DateFormat.Field.html
+http://developer.android.com/reference/android/text/method/DateKeyListener.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/DateParseException.html
+http://developer.android.com/reference/android/text/method/DateTimeKeyListener.html
+http://developer.android.com/reference/android/os/DeadObjectException.html
+http://developer.android.com/reference/java/text/DecimalFormat.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultClientConnection.html
+http://developer.android.com/reference/org/xml/sax/ext/DefaultHandler2.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html
http://developer.android.com/reference/org/apache/http/impl/DefaultHttpClientConnection.html
http://developer.android.com/reference/org/apache/http/impl/DefaultHttpServerConnection.html
-
-http://developer.android.com/reference/java/util/zip/DeflaterOutputStream.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultProxyAuthenticationHandler.html
+http://developer.android.com/reference/org/apache/http/impl/conn/DefaultResponseParser.html
+http://developer.android.com/reference/org/apache/http/impl/client/DefaultTargetAuthenticationHandler.html
+http://developer.android.com/reference/org/apache/http/params/DefaultedHttpParams.html
+http://developer.android.com/reference/java/util/concurrent/DelayQueue.html
+http://developer.android.com/reference/java/util/concurrent/Delayed.html
+http://developer.android.com/reference/javax/security/auth/DestroyFailedException.html
+http://developer.android.com/reference/dalvik/system/DexClassLoader.html
+http://developer.android.com/reference/android/text/method/DialerKeyListener.html
+http://developer.android.com/reference/android/preference/DialogPreference.html
+http://developer.android.com/reference/java/security/DigestException.html
+http://developer.android.com/reference/java/security/DigestInputStream.html
+http://developer.android.com/reference/java/security/DigestOutputStream.html
+http://developer.android.com/reference/org/apache/http/impl/auth/DigestScheme.html
+http://developer.android.com/reference/android/text/method/DigitsKeyListener.html
+http://developer.android.com/reference/java/nio/DoubleBuffer.html
+http://developer.android.com/reference/java/util/DuplicateFormatFlagsException.html
http://developer.android.com/reference/android/text/style/DynamicDrawableSpan.html
-
+http://developer.android.com/reference/android/text/DynamicLayout.html
+http://developer.android.com/reference/java/io/EOFException.html
+http://developer.android.com/reference/android/preference/EditTextPreference.html
+http://developer.android.com/reference/java/util/EmptyStackException.html
+http://developer.android.com/reference/org/apache/http/impl/client/EntityEnclosingRequestWrapper.html
+http://developer.android.com/reference/org/apache/http/entity/EntityTemplate.html
+http://developer.android.com/reference/java/util/EnumMap.html
+http://developer.android.com/reference/java/util/EnumSet.html
+http://developer.android.com/reference/org/apache/http/conn/EofSensorInputStream.html
+http://developer.android.com/reference/java/util/concurrent/ExecutionException.html
+http://developer.android.com/reference/javax/crypto/ExemptionMechanismException.html
+http://developer.android.com/reference/javax/xml/parsers/FactoryConfigurationError.html
http://developer.android.com/reference/java/lang/reflect/Field.html
+http://developer.android.com/reference/java/nio/channels/FileChannel.html
+http://developer.android.com/reference/org/apache/http/entity/FileEntity.html
+http://developer.android.com/reference/java/util/logging/FileHandler.html
+http://developer.android.com/reference/java/nio/channels/FileLockInterruptionException.html
+http://developer.android.com/reference/java/io/FilePermission.html
+http://developer.android.com/reference/java/io/FileReader.html
+http://developer.android.com/reference/java/io/FileWriter.html
+http://developer.android.com/reference/java/io/FilterInputStream.html
+http://developer.android.com/reference/java/io/FilterOutputStream.html
+http://developer.android.com/reference/java/io/FilterReader.html
+http://developer.android.com/reference/java/io/FilterWriter.html
+http://developer.android.com/reference/java/nio/FloatBuffer.html
http://developer.android.com/reference/android/text/style/ForegroundColorSpan.html
-
+http://developer.android.com/reference/java/text/Format.Field.html
+http://developer.android.com/reference/java/util/FormatFlagsConversionMismatchException.html
+http://developer.android.com/reference/java/util/Formatter.BigDecimalLayoutForm.html
+http://developer.android.com/reference/java/util/FormatterClosedException.html
+http://developer.android.com/reference/android/widget/FrameLayout.LayoutParams.html
http://developer.android.com/reference/android/opengl/GLException.html
-http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
-
-http://developer.android.com/reference/java/util/zip/GZIPOutputStream.html
+http://developer.android.com/reference/android/widget/Gallery.LayoutParams.html
+http://developer.android.com/reference/java/security/GeneralSecurityException.html
http://developer.android.com/reference/java/lang/reflect/GenericSignatureFormatError.html
-
+http://developer.android.com/reference/java/util/GregorianCalendar.html
+http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.html
+http://developer.android.com/reference/android/view/animation/GridLayoutAnimationController.AnimationParameters.html
+http://developer.android.com/reference/android/os/HandlerThread.html
+http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedEvent.html
+http://developer.android.com/reference/java/util/HashMap.html
+http://developer.android.com/reference/java/util/HashSet.html
+http://developer.android.com/reference/java/util/Hashtable.html
+http://developer.android.com/reference/android/text/method/HideReturnsTransformationMethod.html
+http://developer.android.com/reference/android/webkit/HttpAuthHandler.html
+http://developer.android.com/reference/org/apache/http/params/HttpConnectionParamBean.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpDelete.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpEntityEnclosingRequestBase.html
+http://developer.android.com/reference/org/apache/http/HttpException.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpGet.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpHead.html
+http://developer.android.com/reference/org/apache/http/conn/HttpHostConnectException.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpOptions.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpPost.html
+http://developer.android.com/reference/org/apache/http/params/HttpProtocolParamBean.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpPut.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpRequestBase.html
+http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestParser.html
+http://developer.android.com/reference/org/apache/http/impl/io/HttpRequestWriter.html
+http://developer.android.com/reference/org/apache/http/client/HttpResponseException.html
+http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseParser.html
+http://developer.android.com/reference/org/apache/http/impl/io/HttpResponseWriter.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpTrace.html
+http://developer.android.com/reference/org/apache/http/HttpVersion.html
+http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html
+http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.Stub.html
+http://developer.android.com/reference/java/util/IdentityHashMap.html
+http://developer.android.com/reference/org/apache/http/impl/io/IdentityInputStream.html
+http://developer.android.com/reference/org/apache/http/impl/io/IdentityOutputStream.html
+http://developer.android.com/reference/java/security/IdentityScope.html
+http://developer.android.com/reference/javax/crypto/IllegalBlockSizeException.html
+http://developer.android.com/reference/java/nio/channels/IllegalBlockingModeException.html
+http://developer.android.com/reference/java/nio/charset/IllegalCharsetNameException.html
+http://developer.android.com/reference/java/util/IllegalFormatCodePointException.html
+http://developer.android.com/reference/java/util/IllegalFormatConversionException.html
+http://developer.android.com/reference/java/util/IllegalFormatException.html
+http://developer.android.com/reference/java/util/IllegalFormatFlagsException.html
+http://developer.android.com/reference/java/util/IllegalFormatPrecisionException.html
+http://developer.android.com/reference/java/util/IllegalFormatWidthException.html
+http://developer.android.com/reference/java/nio/channels/IllegalSelectorException.html
http://developer.android.com/reference/android/text/style/ImageSpan.html
+http://developer.android.com/reference/android/widget/ImageView.ScaleType.html
+http://developer.android.com/reference/java/beans/IndexedPropertyChangeEvent.html
+http://developer.android.com/reference/android/inputmethodservice/InputMethodService.InputMethodImpl.html
+http://developer.android.com/reference/android/inputmethodservice/InputMethodService.InputMethodSessionImpl.html
+http://developer.android.com/reference/java/util/InputMismatchException.html
+http://developer.android.com/reference/org/apache/http/entity/InputStreamEntity.html
+http://developer.android.com/reference/java/io/InputStreamReader.html
+http://developer.android.com/reference/android/content/pm/InstrumentationInfo.html
+http://developer.android.com/reference/java/nio/IntBuffer.html
+http://developer.android.com/reference/java/io/InterruptedIOException.html
+http://developer.android.com/reference/java/security/InvalidAlgorithmParameterException.html
+http://developer.android.com/reference/java/io/InvalidClassException.html
+http://developer.android.com/reference/java/security/InvalidKeyException.html
+http://developer.android.com/reference/java/security/spec/InvalidKeySpecException.html
+http://developer.android.com/reference/java/nio/InvalidMarkException.html
+http://developer.android.com/reference/java/io/InvalidObjectException.html
+http://developer.android.com/reference/java/security/InvalidParameterException.html
+http://developer.android.com/reference/java/security/spec/InvalidParameterSpecException.html
+http://developer.android.com/reference/java/util/prefs/InvalidPreferencesFormatException.html
+http://developer.android.com/reference/java/util/InvalidPropertiesFormatException.html
http://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html
-
http://developer.android.com/reference/org/json/JSONException.html
+http://developer.android.com/reference/java/util/jar/JarEntry.html
+http://developer.android.com/reference/java/util/jar/JarException.html
+http://developer.android.com/reference/java/util/jar/JarFile.html
+http://developer.android.com/reference/java/util/jar/JarInputStream.html
+http://developer.android.com/reference/java/util/jar/JarOutputStream.html
+http://developer.android.com/reference/android/webkit/JsPromptResult.html
+http://developer.android.com/reference/java/security/KeyException.html
+http://developer.android.com/reference/java/security/KeyManagementException.html
+http://developer.android.com/reference/java/security/KeyRep.Type.html
+http://developer.android.com/reference/java/security/KeyStoreException.html
+http://developer.android.com/reference/java/security/acl/LastOwnerException.html
+http://developer.android.com/reference/android/text/Layout.Alignment.html
+http://developer.android.com/reference/java/io/LineNumberInputStream.html
+http://developer.android.com/reference/java/io/LineNumberReader.html
+http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
+http://developer.android.com/reference/android/text/method/LinkMovementMethod.html
+http://developer.android.com/reference/java/util/concurrent/LinkedBlockingQueue.html
+http://developer.android.com/reference/java/util/LinkedHashMap.html
+http://developer.android.com/reference/java/util/LinkedHashSet.html
+http://developer.android.com/reference/java/util/LinkedList.html
+http://developer.android.com/reference/android/preference/ListPreference.html
+http://developer.android.com/reference/java/util/ListResourceBundle.html
+http://developer.android.com/reference/android/net/LocalSocketAddress.Namespace.html
+http://developer.android.com/reference/org/xml/sax/ext/Locator2Impl.html
+http://developer.android.com/reference/java/util/logging/LoggingPermission.html
+http://developer.android.com/reference/android/text/LoginFilter.PasswordFilterGMail.html
+http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGMail.html
+http://developer.android.com/reference/android/text/LoginFilter.UsernameFilterGeneric.html
+http://developer.android.com/reference/java/nio/LongBuffer.html
+http://developer.android.com/reference/org/apache/http/MalformedChunkCodingException.html
+http://developer.android.com/reference/org/apache/http/cookie/MalformedCookieException.html
+http://developer.android.com/reference/java/nio/charset/MalformedInputException.html
http://developer.android.com/reference/java/lang/reflect/MalformedParameterizedTypeException.html
-
+http://developer.android.com/reference/java/nio/MappedByteBuffer.html
http://developer.android.com/reference/android/text/style/MaskFilterSpan.html
+http://developer.android.com/reference/java/util/logging/MemoryHandler.html
+http://developer.android.com/reference/android/database/MergeCursor.html
+http://developer.android.com/reference/java/text/MessageFormat.html
+http://developer.android.com/reference/java/text/MessageFormat.Field.html
+http://developer.android.com/reference/java/lang/reflect/Method.html
+http://developer.android.com/reference/org/apache/http/MethodNotSupportedException.html
http://developer.android.com/reference/android/text/style/MetricAffectingSpan.html
-
+http://developer.android.com/reference/java/util/MissingFormatArgumentException.html
+http://developer.android.com/reference/java/util/MissingFormatWidthException.html
+http://developer.android.com/reference/java/util/MissingResourceException.html
+http://developer.android.com/reference/android/test/mock/MockContentResolver.html
+http://developer.android.com/reference/android/test/mock/MockPackageManager.html
+http://developer.android.com/reference/android/test/mock/MockResources.html
+http://developer.android.com/reference/android/text/method/MultiTapKeyListener.html
+http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngineException.html
+http://developer.android.com/reference/org/apache/http/impl/auth/NTLMScheme.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDomainHandler.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/NetscapeDraftSpec.html
+http://developer.android.com/reference/android/net/NetworkInfo.DetailedState.html
+http://developer.android.com/reference/android/net/NetworkInfo.State.html
+http://developer.android.com/reference/java/nio/channels/NoConnectionPendingException.html
+http://developer.android.com/reference/org/apache/http/NoHttpResponseException.html
+http://developer.android.com/reference/java/security/NoSuchAlgorithmException.html
+http://developer.android.com/reference/java/util/NoSuchElementException.html
+http://developer.android.com/reference/javax/crypto/NoSuchPaddingException.html
+http://developer.android.com/reference/java/security/NoSuchProviderException.html
+http://developer.android.com/reference/java/util/prefs/NodeChangeEvent.html
+http://developer.android.com/reference/java/nio/channels/NonReadableChannelException.html
+http://developer.android.com/reference/org/apache/http/client/NonRepeatableRequestException.html
+http://developer.android.com/reference/java/nio/channels/NonWritableChannelException.html
+http://developer.android.com/reference/java/io/NotActiveException.html
+http://developer.android.com/reference/java/security/acl/NotOwnerException.html
+http://developer.android.com/reference/java/io/NotSerializableException.html
+http://developer.android.com/reference/java/nio/channels/NotYetBoundException.html
+http://developer.android.com/reference/java/nio/channels/NotYetConnectedException.html
+http://developer.android.com/reference/javax/crypto/NullCipher.html
+http://developer.android.com/reference/java/text/NumberFormat.html
+http://developer.android.com/reference/java/text/NumberFormat.Field.html
+http://developer.android.com/reference/android/text/method/NumberKeyListener.html
+http://developer.android.com/reference/java/io/ObjectInputStream.html
+http://developer.android.com/reference/java/io/ObjectOutputStream.html
+http://developer.android.com/reference/java/io/ObjectStreamException.html
+http://developer.android.com/reference/java/io/OptionalDataException.html
+http://developer.android.com/reference/java/io/OutputStreamWriter.html
+http://developer.android.com/reference/java/nio/channels/OverlappingFileLockException.html
+http://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec.html
+http://developer.android.com/reference/java/security/cert/PKIXBuilderParameters.html
+http://developer.android.com/reference/java/security/cert/PKIXCertPathBuilderResult.html
+http://developer.android.com/reference/javax/crypto/spec/PSource.PSpecified.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseInputStream.html
+http://developer.android.com/reference/android/os/ParcelFileDescriptor.AutoCloseOutputStream.html
+http://developer.android.com/reference/android/os/ParcelFormatException.html
+http://developer.android.com/reference/java/text/ParseException.html
+http://developer.android.com/reference/javax/xml/parsers/ParserConfigurationException.html
+http://developer.android.com/reference/dalvik/system/PathClassLoader.html
+http://developer.android.com/reference/java/util/regex/PatternSyntaxException.html
+http://developer.android.com/reference/android/content/pm/PermissionGroupInfo.html
+http://developer.android.com/reference/android/content/pm/PermissionInfo.html
+http://developer.android.com/reference/java/security/Permissions.html
+http://developer.android.com/reference/java/nio/channels/Pipe.SinkChannel.html
+http://developer.android.com/reference/java/nio/channels/Pipe.SourceChannel.html
+http://developer.android.com/reference/java/io/PipedInputStream.html
+http://developer.android.com/reference/java/io/PipedOutputStream.html
+http://developer.android.com/reference/java/io/PipedReader.html
+http://developer.android.com/reference/java/io/PipedWriter.html
+http://developer.android.com/reference/dalvik/system/PotentialDeadlockError.html
+http://developer.android.com/reference/android/preference/Preference.BaseSavedState.html
+http://developer.android.com/reference/android/preference/PreferenceCategory.html
+http://developer.android.com/reference/java/util/prefs/PreferenceChangeEvent.html
+http://developer.android.com/reference/android/preference/PreferenceGroup.html
+http://developer.android.com/reference/android/preference/PreferenceScreen.html
+http://developer.android.com/reference/java/util/concurrent/PriorityBlockingQueue.html
+http://developer.android.com/reference/java/util/PriorityQueue.html
+http://developer.android.com/reference/javax/security/auth/PrivateCredentialPermission.html
+http://developer.android.com/reference/java/security/PrivilegedActionException.html
+http://developer.android.com/reference/java/util/Properties.html
+http://developer.android.com/reference/java/beans/PropertyChangeEvent.html
+http://developer.android.com/reference/java/beans/PropertyChangeListenerProxy.html
+http://developer.android.com/reference/java/util/PropertyPermission.html
+http://developer.android.com/reference/java/util/PropertyResourceBundle.html
+http://developer.android.com/reference/java/security/Provider.html
+http://developer.android.com/reference/java/security/ProviderException.html
+http://developer.android.com/reference/android/content/pm/ProviderInfo.html
+http://developer.android.com/reference/java/io/PushbackInputStream.html
+http://developer.android.com/reference/java/io/PushbackReader.html
+http://developer.android.com/reference/android/text/method/QwertyKeyListener.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109Spec.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2109VersionHandler.html
+http://developer.android.com/reference/org/apache/http/impl/auth/RFC2617Scheme.html
+http://developer.android.com/reference/org/apache/http/impl/cookie/RFC2965Spec.html
+http://developer.android.com/reference/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.html
+http://developer.android.com/reference/java/security/spec/RSAPrivateCrtKeySpec.html
+http://developer.android.com/reference/android/widget/RadioGroup.LayoutParams.html
http://developer.android.com/reference/android/text/style/RasterizerSpan.html
+http://developer.android.com/reference/java/nio/ReadOnlyBufferException.html
+http://developer.android.com/reference/org/apache/http/client/RedirectException.html
+http://developer.android.com/reference/java/lang/reflect/ReflectPermission.html
+http://developer.android.com/reference/java/util/concurrent/RejectedExecutionException.html
+http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
http://developer.android.com/reference/android/text/style/RelativeSizeSpan.html
-
+http://developer.android.com/reference/android/os/RemoteException.html
+http://developer.android.com/reference/android/widget/RemoteViews.ActionException.html
http://developer.android.com/reference/android/text/style/ReplacementSpan.html
+http://developer.android.com/reference/org/apache/http/impl/client/RequestWrapper.html
+http://developer.android.com/reference/android/widget/ResourceCursorAdapter.html
+http://developer.android.com/reference/android/widget/ResourceCursorTreeAdapter.html
+http://developer.android.com/reference/android/preference/RingtonePreference.html
+http://developer.android.com/reference/android/sax/RootElement.html
+http://developer.android.com/reference/android/view/animation/RotateAnimation.html
+http://developer.android.com/reference/java/math/RoundingMode.html
+http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.LayerType.html
+http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.TunnelType.html
http://developer.android.com/reference/javax/sql/RowSetEvent.html
-
+http://developer.android.com/reference/java/text/RuleBasedCollator.html
+http://developer.android.com/reference/org/xml/sax/SAXException.html
+http://developer.android.com/reference/org/xml/sax/SAXNotRecognizedException.html
+http://developer.android.com/reference/org/xml/sax/SAXNotSupportedException.html
+http://developer.android.com/reference/org/xml/sax/SAXParseException.html
+http://developer.android.com/reference/java/sql/SQLException.html
+http://developer.android.com/reference/java/sql/SQLPermission.html
+http://developer.android.com/reference/java/sql/SQLWarning.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteAbortException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteConstraintException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDatabaseCorruptException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDiskIOException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteDoneException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteFullException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteMisuseException.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteProgram.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteQuery.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html
+http://developer.android.com/reference/android/net/SSLCertificateSocketFactory.html
+http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.HandshakeStatus.html
+http://developer.android.com/reference/javax/net/ssl/SSLEngineResult.Status.html
+http://developer.android.com/reference/javax/net/ssl/SSLException.html
+http://developer.android.com/reference/javax/net/ssl/SSLHandshakeException.html
+http://developer.android.com/reference/javax/net/ssl/SSLKeyException.html
+http://developer.android.com/reference/javax/net/ssl/SSLPeerUnverifiedException.html
+http://developer.android.com/reference/javax/net/ssl/SSLPermission.html
+http://developer.android.com/reference/javax/net/ssl/SSLProtocolException.html
+http://developer.android.com/reference/javax/net/ssl/SSLServerSocket.html
+http://developer.android.com/reference/javax/net/ssl/SSLServerSocketFactory.html
+http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingEvent.html
+http://developer.android.com/reference/javax/net/ssl/SSLSocket.html
+http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html
+http://developer.android.com/reference/android/view/animation/ScaleAnimation.html
http://developer.android.com/reference/android/text/style/ScaleXSpan.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html
+http://developer.android.com/reference/java/security/SecureClassLoader.html
+http://developer.android.com/reference/java/security/SecurityPermission.html
+http://developer.android.com/reference/java/io/SequenceInputStream.html
+http://developer.android.com/reference/org/apache/http/entity/SerializableEntity.html
+http://developer.android.com/reference/java/io/SerializablePermission.html
+http://developer.android.com/reference/android/content/pm/ServiceInfo.html
+http://developer.android.com/reference/android/provider/Settings.SettingNotFoundException.html
+http://developer.android.com/reference/android/provider/Settings.System.html
+http://developer.android.com/reference/java/nio/ShortBuffer.html
+http://developer.android.com/reference/javax/crypto/ShortBufferException.html
+http://developer.android.com/reference/java/security/SignatureException.html
+http://developer.android.com/reference/java/security/Signer.html
+http://developer.android.com/reference/android/widget/SimpleAdapter.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
+http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
+http://developer.android.com/reference/java/text/SimpleDateFormat.html
+http://developer.android.com/reference/android/widget/SimpleExpandableListAdapter.html
+http://developer.android.com/reference/java/util/logging/SimpleFormatter.html
+http://developer.android.com/reference/java/util/SimpleTimeZone.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.ConnAdapter.html
+http://developer.android.com/reference/org/apache/http/impl/conn/SingleClientConnManager.PoolEntry.html
+http://developer.android.com/reference/android/text/method/SingleLineTransformationMethod.html
+http://developer.android.com/reference/android/telephony/gsm/SmsMessage.MessageClass.html
+http://developer.android.com/reference/java/util/logging/SocketHandler.html
http://developer.android.com/reference/org/apache/http/impl/SocketHttpClientConnection.html
-
http://developer.android.com/reference/org/apache/http/impl/SocketHttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/impl/io/SocketInputBuffer.html
+http://developer.android.com/reference/org/apache/http/impl/io/SocketOutputBuffer.html
+http://developer.android.com/reference/android/webkit/SslErrorHandler.html
+http://developer.android.com/reference/java/util/Stack.html
+http://developer.android.com/reference/android/database/StaleDataException.html
+http://developer.android.com/reference/dalvik/system/StaleDexCacheError.html
+http://developer.android.com/reference/android/text/StaticLayout.html
+http://developer.android.com/reference/java/io/StreamCorruptedException.html
+http://developer.android.com/reference/java/util/logging/StreamHandler.html
http://developer.android.com/reference/org/apache/http/conn/ssl/StrictHostnameVerifier.html
-
http://developer.android.com/reference/android/text/style/StrikethroughSpan.html
+http://developer.android.com/reference/java/io/StringBufferInputStream.html
+http://developer.android.com/reference/org/apache/http/entity/StringEntity.html
+http://developer.android.com/reference/java/io/StringReader.html
+http://developer.android.com/reference/java/io/StringWriter.html
http://developer.android.com/reference/android/text/style/StyleSpan.html
-
http://developer.android.com/reference/android/text/style/SubscriptSpan.html
http://developer.android.com/reference/android/text/style/SuperscriptSpan.html
-
+http://developer.android.com/reference/android/net/wifi/SupplicantState.html
http://developer.android.com/reference/org/apache/http/protocol/SyncBasicHttpContext.html
+http://developer.android.com/reference/java/io/SyncFailedException.html
+http://developer.android.com/reference/java/util/concurrent/SynchronousQueue.html
+http://developer.android.com/reference/android/widget/TableLayout.LayoutParams.html
+http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html
+http://developer.android.com/reference/android/test/suitebuilder/TestSuiteBuilder.FailedToCreateTests.html
http://developer.android.com/reference/android/text/style/TextAppearanceSpan.html
-
+http://developer.android.com/reference/java/awt/font/TextAttribute.html
+http://developer.android.com/reference/android/text/method/TextKeyListener.html
+http://developer.android.com/reference/android/text/method/TextKeyListener.Capitalize.html
+http://developer.android.com/reference/android/text/TextPaint.html
+http://developer.android.com/reference/android/text/TextUtils.TruncateAt.html
+http://developer.android.com/reference/android/widget/TextView.BufferType.html
+http://developer.android.com/reference/android/widget/TextView.SavedState.html
+http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
+http://developer.android.com/reference/java/sql/Time.html
+http://developer.android.com/reference/android/text/method/TimeKeyListener.html
+http://developer.android.com/reference/java/util/concurrent/TimeUnit.html
+http://developer.android.com/reference/java/util/concurrent/TimeoutException.html
+http://developer.android.com/reference/java/sql/Timestamp.html
+http://developer.android.com/reference/java/util/TooManyListenersException.html
+http://developer.android.com/reference/android/view/animation/TranslateAnimation.html
+http://developer.android.com/reference/java/util/TreeMap.html
+http://developer.android.com/reference/java/util/TreeSet.html
+http://developer.android.com/reference/org/apache/http/impl/client/TunnelRefusedException.html
http://developer.android.com/reference/android/text/style/TypefaceSpan.html
+http://developer.android.com/reference/android/text/style/URLSpan.html
+http://developer.android.com/reference/java/io/UTFDataFormatException.html
http://developer.android.com/reference/java/lang/reflect/UndeclaredThrowableException.html
-
http://developer.android.com/reference/android/text/style/UnderlineSpan.html
-http://developer.android.com/reference/java/util/zip/ZipException.html
-
-http://developer.android.com/reference/java/util/zip/ZipOutputStream.html
-http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html
-
-http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html
-http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html
-
-http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html
-http://developer.android.com/reference/android/media/MediaPlayer.OnSeekCompleteListener.html
-
-http://developer.android.com/reference/android/media/MediaScannerConnection.MediaScannerConnectionClient.html
-
-http://developer.android.com/reference/java/util/zip/Checksum.html
-http://developer.android.com/guide/developing/tools/adt.html
-
-http://developer.android.com/reference/org/apache/http/client/params/AllClientPNames.html
+http://developer.android.com/reference/java/util/UnknownFormatConversionException.html
+http://developer.android.com/reference/java/util/UnknownFormatFlagsException.html
+http://developer.android.com/reference/java/nio/charset/UnmappableCharacterException.html
+http://developer.android.com/reference/java/security/UnrecoverableEntryException.html
+http://developer.android.com/reference/java/security/UnrecoverableKeyException.html
+http://developer.android.com/reference/java/nio/channels/UnresolvedAddressException.html
+http://developer.android.com/reference/java/security/UnresolvedPermission.html
+http://developer.android.com/reference/java/nio/channels/UnsupportedAddressTypeException.html
+http://developer.android.com/reference/java/nio/charset/UnsupportedCharsetException.html
+http://developer.android.com/reference/org/apache/http/impl/auth/UnsupportedDigestAlgorithmException.html
+http://developer.android.com/reference/java/io/UnsupportedEncodingException.html
+http://developer.android.com/reference/org/apache/http/UnsupportedHttpVersionException.html
+http://developer.android.com/reference/org/apache/http/client/entity/UrlEncodedFormEntity.html
+http://developer.android.com/reference/java/util/Vector.html
+http://developer.android.com/reference/java/util/WeakHashMap.html
+http://developer.android.com/reference/android/webkit/WebSettings.LayoutAlgorithm.html
+http://developer.android.com/reference/android/webkit/WebSettings.RenderPriority.html
+http://developer.android.com/reference/android/webkit/WebSettings.TextSize.html
+http://developer.android.com/reference/java/io/WriteAbortedException.html
+http://developer.android.com/reference/java/security/cert/X509CRL.html
+http://developer.android.com/reference/javax/security/cert/X509Certificate.html
+http://developer.android.com/reference/java/security/spec/X509EncodedKeySpec.html
+http://developer.android.com/reference/java/util/logging/XMLFormatter.html
+http://developer.android.com/reference/java/util/Queue.html
+http://developer.android.com/reference/java/util/concurrent/BlockingQueue.html
+http://developer.android.com/reference/org/xml/sax/ext/Attributes2.html
+http://developer.android.com/reference/javax/sql/PooledConnection.html
+http://developer.android.com/reference/java/util/Set.html
+http://developer.android.com/reference/org/xml/sax/ext/LexicalHandler.html
+http://developer.android.com/reference/org/xml/sax/ext/DeclHandler.html
+http://developer.android.com/reference/org/xml/sax/ext/EntityResolver2.html
+http://developer.android.com/reference/javax/security/auth/Destroyable.html
+http://developer.android.com/reference/org/apache/http/HttpEntityEnclosingRequest.html
+http://developer.android.com/reference/org/xml/sax/ext/Locator2.html
+http://developer.android.com/reference/javax/sql/RowSet.html
+http://developer.android.com/reference/javax/net/ssl/SSLSession.html
+http://developer.android.com/reference/java/security/Certificate.html
+http://developer.android.com/reference/java/security/DomainCombiner.html
+http://developer.android.com/reference/java/security/Guard.html
+http://developer.android.com/reference/java/security/KeyStore.Entry.html
+http://developer.android.com/reference/java/security/KeyStore.LoadStoreParameter.html
+http://developer.android.com/reference/java/security/KeyStore.ProtectionParameter.html
+http://developer.android.com/reference/java/security/PrivateKey.html
+http://developer.android.com/reference/java/security/PrivilegedAction.html
+http://developer.android.com/reference/java/security/PrivilegedExceptionAction.html
+http://developer.android.com/reference/java/security/PublicKey.html
+http://developer.android.com/reference/java/security/package-descr.html
+http://developer.android.com/reference/android/widget/AbsListView.OnScrollListener.html
+http://developer.android.com/reference/android/widget/AbsListView.RecyclerListener.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemLongClickListener.html
+http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html
+http://developer.android.com/reference/android/widget/AutoCompleteTextView.Validator.html
+http://developer.android.com/reference/android/widget/Chronometer.OnChronometerTickListener.html
+http://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html
+http://developer.android.com/reference/android/widget/DatePicker.OnDateChangedListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnChildClickListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupClickListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupCollapseListener.html
+http://developer.android.com/reference/android/widget/ExpandableListView.OnGroupExpandListener.html
+http://developer.android.com/reference/android/widget/Filter.FilterListener.html
+http://developer.android.com/reference/android/widget/Filterable.html
+http://developer.android.com/reference/android/widget/FilterQueryProvider.html
+http://developer.android.com/reference/android/widget/MediaController.MediaPlayerControl.html
+http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.Tokenizer.html
+http://developer.android.com/reference/android/widget/PopupWindow.OnDismissListener.html
+http://developer.android.com/reference/android/widget/RadioGroup.OnCheckedChangeListener.html
+http://developer.android.com/reference/android/widget/RatingBar.OnRatingBarChangeListener.html
+http://developer.android.com/reference/android/widget/SectionIndexer.html
+http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.html
+http://developer.android.com/reference/android/widget/SimpleAdapter.ViewBinder.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.CursorToStringConverter.html
+http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerCloseListener.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerOpenListener.html
+http://developer.android.com/reference/android/widget/SlidingDrawer.OnDrawerScrollListener.html
+http://developer.android.com/reference/android/widget/TabHost.OnTabChangeListener.html
+http://developer.android.com/reference/android/widget/TabHost.TabContentFactory.html
+http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html
+http://developer.android.com/reference/android/widget/TimePicker.OnTimeChangedListener.html
+http://developer.android.com/reference/android/widget/ViewSwitcher.ViewFactory.html
+http://developer.android.com/reference/android/widget/WrapperListAdapter.html
+http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html
+http://developer.android.com/reference/java/io/Closeable.html
+http://developer.android.com/reference/java/io/DataInput.html
+http://developer.android.com/reference/java/io/DataOutput.html
+http://developer.android.com/reference/java/io/Externalizable.html
+http://developer.android.com/reference/java/io/FileFilter.html
+http://developer.android.com/reference/java/io/FilenameFilter.html
+http://developer.android.com/reference/java/io/Flushable.html
+http://developer.android.com/reference/java/io/ObjectInput.html
+http://developer.android.com/reference/java/io/ObjectInputValidation.html
+http://developer.android.com/reference/java/io/ObjectOutput.html
+http://developer.android.com/reference/java/io/ObjectStreamConstants.html
+http://developer.android.com/reference/java/io/Serializable.html
+http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html
+http://developer.android.com/reference/org/xml/sax/ContentHandler.html
+http://developer.android.com/reference/java/security/acl/Acl.html
+http://developer.android.com/reference/java/security/acl/AclEntry.html
+http://developer.android.com/reference/java/security/acl/Group.html
+http://developer.android.com/reference/java/security/acl/Owner.html
+http://developer.android.com/reference/java/security/acl/Permission.html
+http://developer.android.com/reference/java/security/acl/package-descr.html
+http://developer.android.com/reference/android/os/Parcelable.Creator.html
+http://developer.android.com/reference/org/apache/http/client/AuthenticationHandler.html
+http://developer.android.com/reference/org/apache/http/client/HttpClient.html
+http://developer.android.com/reference/org/apache/http/client/UserTokenHandler.html
+http://developer.android.com/reference/org/apache/http/client/package-descr.html
+http://developer.android.com/reference/org/apache/http/HttpResponse.html
+http://developer.android.com/reference/android/hardware/Camera.AutoFocusCallback.html
+http://developer.android.com/reference/android/hardware/Camera.ErrorCallback.html
+http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html
+http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html
+http://developer.android.com/reference/android/hardware/Camera.ShutterCallback.html
+http://developer.android.com/reference/android/hardware/SensorEventListener.html
+http://developer.android.com/reference/android/hardware/SensorListener.html
+http://developer.android.com/reference/android/hardware/Camera.html
+http://developer.android.com/reference/android/hardware/package-descr.html
+http://developer.android.com/reference/java/nio/charset/package-descr.html
+http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html
+http://developer.android.com/reference/android/preference/Preference.OnPreferenceClickListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityDestroyListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityResultListener.html
+http://developer.android.com/reference/android/preference/PreferenceManager.OnActivityStopListener.html
+http://developer.android.com/reference/android/preference/package-descr.html
+http://developer.android.com/reference/java/nio/channels/ByteChannel.html
+http://developer.android.com/reference/java/nio/channels/Channel.html
+http://developer.android.com/reference/java/nio/channels/GatheringByteChannel.html
+http://developer.android.com/reference/java/nio/channels/InterruptibleChannel.html
+http://developer.android.com/reference/java/nio/channels/ReadableByteChannel.html
+http://developer.android.com/reference/java/nio/channels/ScatteringByteChannel.html
+http://developer.android.com/reference/java/nio/channels/WritableByteChannel.html
+http://developer.android.com/reference/java/util/Map.Entry.html
http://developer.android.com/reference/org/apache/http/message/HeaderValueFormatter.html
-
http://developer.android.com/reference/org/apache/http/message/HeaderValueParser.html
http://developer.android.com/reference/org/apache/http/message/LineFormatter.html
-
-http://developer.android.com/reference/java/lang/package-descr.html
+http://developer.android.com/reference/org/apache/http/message/LineParser.html
+http://developer.android.com/reference/org/apache/http/HeaderElement.html
+http://developer.android.com/reference/org/apache/http/NameValuePair.html
+http://developer.android.com/reference/javax/crypto/SecretKey.html
+http://developer.android.com/reference/java/security/spec/AlgorithmParameterSpec.html
+http://developer.android.com/reference/android/database/CrossProcessCursor.html
+http://developer.android.com/reference/android/database/CharArrayBuffer.html
+http://developer.android.com/reference/android/database/Observable.html
+http://developer.android.com/reference/android/database/SQLException.html
+http://developer.android.com/reference/java/util/Collection.html
+http://developer.android.com/reference/java/util/Comparator.html
+http://developer.android.com/reference/java/util/Enumeration.html
+http://developer.android.com/reference/java/util/EventListener.html
+http://developer.android.com/reference/java/util/Iterator.html
+http://developer.android.com/reference/java/util/ListIterator.html
+http://developer.android.com/reference/java/util/Map.html
+http://developer.android.com/reference/java/util/Observer.html
+http://developer.android.com/reference/java/util/RandomAccess.html
+http://developer.android.com/reference/java/util/SortedMap.html
+http://developer.android.com/reference/java/util/SortedSet.html
+http://developer.android.com/reference/org/apache/http/cookie/ClientCookie.html
+http://developer.android.com/reference/org/apache/http/cookie/Cookie.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieSpec.html
+http://developer.android.com/reference/org/apache/http/cookie/CookieSpecFactory.html
+http://developer.android.com/reference/org/apache/http/cookie/SetCookie.html
+http://developer.android.com/reference/org/apache/http/cookie/SetCookie2.html
+http://developer.android.com/reference/org/apache/http/cookie/SM.html
+http://developer.android.com/reference/android/content/res/XmlResourceParser.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnConnectionPNames.html
-
http://developer.android.com/reference/org/apache/http/conn/params/ConnManagerPNames.html
http://developer.android.com/reference/org/apache/http/conn/params/ConnPerRoute.html
-
http://developer.android.com/reference/org/apache/http/conn/params/ConnRoutePNames.html
-http://developer.android.com/reference/org/apache/http/conn/scheme/HostNameResolver.html
-
-http://developer.android.com/reference/org/apache/http/conn/scheme/LayeredSocketFactory.html
+http://developer.android.com/reference/org/apache/http/client/methods/AbortableHttpRequest.html
+http://developer.android.com/reference/org/apache/http/client/methods/HttpUriRequest.html
+http://developer.android.com/reference/org/apache/http/RequestLine.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionRequest.html
+http://developer.android.com/reference/org/apache/http/conn/ConnectionReleaseTrigger.html
+http://developer.android.com/reference/org/apache/http/Header.html
+http://developer.android.com/reference/org/apache/http/HttpMessage.html
+http://developer.android.com/reference/android/media/AudioRecord.OnRecordPositionUpdateListener.html
+http://developer.android.com/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener.html
+http://developer.android.com/reference/android/media/JetPlayer.OnJetEventListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnInfoListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnSeekCompleteListener.html
+http://developer.android.com/reference/android/media/MediaPlayer.OnVideoSizeChangedListener.html
+http://developer.android.com/reference/android/media/MediaRecorder.OnErrorListener.html
+http://developer.android.com/reference/android/media/MediaRecorder.OnInfoListener.html
+http://developer.android.com/reference/android/media/MediaScannerConnection.MediaScannerConnectionClient.html
+http://developer.android.com/reference/org/apache/http/conn/ClientConnectionManagerFactory.html
+http://developer.android.com/reference/org/apache/http/conn/ConnectionKeepAliveStrategy.html
+http://developer.android.com/reference/org/apache/http/HttpConnection.html
+http://developer.android.com/reference/android/net/UrlQuerySanitizer.ValueSanitizer.html
+http://developer.android.com/reference/android/net/Proxy.html
+http://developer.android.com/reference/android/net/ParseException.html
+http://developer.android.com/reference/java/util/regex/MatchResult.html
+http://developer.android.com/reference/org/apache/http/ConnectionReuseStrategy.html
+http://developer.android.com/reference/org/apache/http/FormattedHeader.html
+http://developer.android.com/reference/org/apache/http/HttpClientConnection.html
+http://developer.android.com/reference/org/apache/http/HttpConnectionMetrics.html
+http://developer.android.com/reference/org/apache/http/HttpInetConnection.html
+http://developer.android.com/reference/org/apache/http/HttpRequestFactory.html
+http://developer.android.com/reference/org/apache/http/HttpRequestInterceptor.html
+http://developer.android.com/reference/org/apache/http/HttpResponseFactory.html
+http://developer.android.com/reference/org/apache/http/HttpResponseInterceptor.html
+http://developer.android.com/reference/org/apache/http/HttpServerConnection.html
+http://developer.android.com/reference/org/apache/http/HttpStatus.html
+http://developer.android.com/reference/org/apache/http/ReasonPhraseCatalog.html
+http://developer.android.com/reference/org/apache/http/StatusLine.html
+http://developer.android.com/reference/org/apache/http/ParseException.html
+http://developer.android.com/reference/org/apache/http/ProtocolException.html
+http://developer.android.com/reference/android/provider/Contacts.ContactMethodsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.ExtensionsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.GroupsColumns.html
+http://developer.android.com/reference/android/provider/Contacts.OrganizationColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PhotosColumns.html
+http://developer.android.com/reference/android/provider/Contacts.PresenceColumns.html
+http://developer.android.com/reference/android/provider/Contacts.SettingsColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.AlbumColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.ArtistColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.GenresColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Audio.PlaylistsColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html
+http://developer.android.com/reference/android/provider/MediaStore.Video.VideoColumns.html
+http://developer.android.com/reference/android/provider/OpenableColumns.html
+http://developer.android.com/reference/java/security/cert/Certificate.html
+http://developer.android.com/reference/junit/framework/TestListener.html
+http://developer.android.com/reference/junit/framework/Test.html
+http://developer.android.com/reference/android/os/Handler.Callback.html
+http://developer.android.com/reference/android/os/IBinder.DeathRecipient.html
+http://developer.android.com/reference/android/os/MessageQueue.IdleHandler.html
+http://developer.android.com/reference/android/os/Process.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethod.SessionCallback.html
+http://developer.android.com/reference/android/view/inputmethod/InputMethodSession.EventCallback.html
+http://developer.android.com/reference/org/apache/http/io/HttpMessageParser.html
+http://developer.android.com/reference/org/apache/http/io/HttpMessageWriter.html
http://developer.android.com/reference/android/text/style/AlignmentSpan.html
-
+http://developer.android.com/reference/android/text/style/LeadingMarginSpan.html
+http://developer.android.com/reference/android/text/style/LineBackgroundSpan.html
+http://developer.android.com/reference/android/text/style/LineHeightSpan.html
+http://developer.android.com/reference/android/text/style/ParagraphStyle.html
+http://developer.android.com/reference/android/text/style/TabStopSpan.html
+http://developer.android.com/reference/android/text/style/UpdateAppearance.html
+http://developer.android.com/reference/android/text/style/UpdateLayout.html
+http://developer.android.com/reference/android/text/style/WrapTogetherSpan.html
+http://developer.android.com/reference/android/text/style/package-descr.html
+http://developer.android.com/reference/android/text/TextWatcher.html
+http://developer.android.com/reference/android/text/method/MovementMethod.html
+http://developer.android.com/reference/android/text/Editable.html
+http://developer.android.com/reference/android/text/InputFilter.html
+http://developer.android.com/reference/android/text/method/KeyListener.html
+http://developer.android.com/reference/android/text/method/TransformationMethod.html
+http://developer.android.com/reference/android/database/sqlite/SQLiteCursorDriver.html
+http://developer.android.com/reference/java/util/concurrent/locks/Condition.html
+http://developer.android.com/reference/org/apache/http/protocol/ExecutionContext.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpExpectationVerifier.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpProcessor.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandler.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerResolver.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpRequestInterceptorList.html
+http://developer.android.com/reference/org/apache/http/protocol/HttpResponseInterceptorList.html
+http://developer.android.com/reference/java/text/AttributedCharacterIterator.html
+http://developer.android.com/reference/android/provider/package-descr.html
+http://developer.android.com/reference/org/apache/http/impl/entity/package-descr.html
+http://developer.android.com/reference/javax/net/ssl/HandshakeCompletedListener.html
+http://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html
+http://developer.android.com/reference/javax/net/ssl/KeyManager.html
+http://developer.android.com/reference/javax/net/ssl/ManagerFactoryParameters.html
+http://developer.android.com/reference/javax/net/ssl/SSLSessionBindingListener.html
+http://developer.android.com/reference/javax/net/ssl/SSLSessionContext.html
+http://developer.android.com/reference/javax/net/ssl/X509KeyManager.html
+http://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
+http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html
+http://developer.android.com/reference/java/util/concurrent/Future.html
+http://developer.android.com/reference/java/util/concurrent/RejectedExecutionHandler.html
+http://developer.android.com/reference/java/util/concurrent/ScheduledFuture.html
+http://developer.android.com/reference/org/xml/sax/DTDHandler.html
+http://developer.android.com/reference/org/xml/sax/EntityResolver.html
+http://developer.android.com/reference/org/xml/sax/ErrorHandler.html
+http://developer.android.com/reference/org/xml/sax/Locator.html
+http://developer.android.com/reference/org/xml/sax/XMLFilter.html
+http://developer.android.com/reference/java/security/cert/CertPathParameters.html
+http://developer.android.com/reference/android/location/GpsStatus.Listener.html
+http://developer.android.com/reference/android/location/LocationListener.html
+http://developer.android.com/reference/org/apache/http/params/CoreConnectionPNames.html
+http://developer.android.com/reference/org/apache/http/params/CoreProtocolPNames.html
+http://developer.android.com/reference/android/text/method/package-descr.html
+http://developer.android.com/guide/samples/NotePad/res/index.html
+http://developer.android.com/guide/samples/NotePad/src/index.html
+http://developer.android.com/guide/samples/NotePad/tests/index.html
+http://developer.android.com/guide/samples/NotePad/AndroidManifest.html
+http://developer.android.com/guide/samples/NotePad/sample_note.html
+http://developer.android.com/guide/samples/NotePad/sample_notepad.html
+http://developer.android.com/reference/android/content/pm/IPackageInstallObserver.html
+http://developer.android.com/guide/samples/LunarLander/res/index.html
+http://developer.android.com/guide/samples/LunarLander/src/index.html
+http://developer.android.com/guide/samples/LunarLander/tests/index.html
+http://developer.android.com/guide/samples/LunarLander/AndroidManifest.html
+http://developer.android.com/guide/samples/LunarLander/sample_lunarlander.html
+http://developer.android.com/reference/java/security/cert/CertPathBuilderResult.html
+http://developer.android.com/reference/java/security/cert/CertPathValidatorResult.html
+http://developer.android.com/reference/java/security/cert/CertSelector.html
+http://developer.android.com/reference/java/security/cert/CertStoreParameters.html
+http://developer.android.com/reference/java/security/cert/CRLSelector.html
+http://developer.android.com/reference/java/security/cert/PolicyNode.html
+http://developer.android.com/reference/java/security/cert/X509Extension.html
+http://developer.android.com/reference/java/security/cert/X509Certificate.html
+http://developer.android.com/reference/java/security/cert/CertificateEncodingException.html
+http://developer.android.com/reference/java/security/cert/CertificateException.html
+http://developer.android.com/reference/java/security/cert/CertificateExpiredException.html
+http://developer.android.com/reference/java/security/cert/CertificateNotYetValidException.html
+http://developer.android.com/reference/java/security/cert/CertificateParsingException.html
+http://developer.android.com/reference/java/security/spec/ECField.html
+http://developer.android.com/reference/java/security/spec/KeySpec.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/PoolEntryRequest.html
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/RefQueueHandler.html
+http://developer.android.com/reference/org/apache/http/params/package-descr.html
+http://developer.android.com/sdk/android-1.5-highlights.html
+http://developer.android.com/reference/javax/security/auth/package-descr.html
+http://developer.android.com/reference/java/beans/PropertyChangeListener.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGL.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGL10.html
+http://developer.android.com/reference/javax/microedition/khronos/egl/EGL11.html
+http://developer.android.com/reference/android/text/GetChars.html
+http://developer.android.com/reference/android/text/Html.ImageGetter.html
+http://developer.android.com/reference/android/text/Html.TagHandler.html
+http://developer.android.com/reference/android/text/InputType.html
+http://developer.android.com/reference/android/text/NoCopySpan.html
+http://developer.android.com/reference/android/text/ParcelableSpan.html
+http://developer.android.com/reference/android/text/Spannable.html
+http://developer.android.com/reference/android/text/Spanned.html
+http://developer.android.com/reference/android/text/SpanWatcher.html
+http://developer.android.com/reference/android/text/TextUtils.EllipsizeCallback.html
+http://developer.android.com/reference/android/text/TextUtils.StringSplitter.html
+http://developer.android.com/reference/android/text/Annotation.html
+http://developer.android.com/reference/org/apache/http/conn/scheme/LayeredSocketFactory.html
+http://developer.android.com/reference/org/apache/http/conn/scheme/HostNameResolver.html
+http://developer.android.com/reference/org/apache/http/conn/scheme/SocketFactory.html
http://developer.android.com/reference/java/lang/reflect/AnnotatedElement.html
+http://developer.android.com/reference/java/lang/reflect/GenericArrayType.html
+http://developer.android.com/reference/java/lang/reflect/GenericDeclaration.html
+http://developer.android.com/reference/java/lang/reflect/InvocationHandler.html
+http://developer.android.com/reference/java/lang/reflect/Member.html
+http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html
+http://developer.android.com/reference/java/lang/reflect/Type.html
+http://developer.android.com/reference/java/lang/reflect/TypeVariable.html
+http://developer.android.com/reference/java/lang/reflect/WildcardType.html
+http://developer.android.com/reference/java/lang/reflect/Proxy.html
+http://developer.android.com/reference/org/apache/http/client/params/AllClientPNames.html
+http://developer.android.com/reference/junit/framework/Protectable.html
+http://developer.android.com/reference/javax/sql/ConnectionEventListener.html
+http://developer.android.com/reference/javax/sql/ConnectionPoolDataSource.html
+http://developer.android.com/reference/javax/sql/DataSource.html
+http://developer.android.com/reference/javax/sql/RowSetInternal.html
+http://developer.android.com/reference/javax/sql/RowSetListener.html
+http://developer.android.com/reference/javax/sql/RowSetMetaData.html
+http://developer.android.com/reference/javax/sql/RowSetReader.html
+http://developer.android.com/reference/javax/sql/RowSetWriter.html
+http://developer.android.com/reference/java/sql/Connection.html
+http://developer.android.com/reference/java/util/logging/Filter.html
+http://developer.android.com/reference/java/util/logging/LoggingMXBean.html
+http://developer.android.com/reference/java/util/logging/Formatter.html
+http://developer.android.com/reference/android/package-descr.html
+http://developer.android.com/reference/android/webkit/DownloadListener.html
+http://developer.android.com/reference/android/webkit/Plugin.PreferencesClickHandler.html
+http://developer.android.com/reference/android/webkit/UrlInterceptHandler.html
+http://developer.android.com/reference/android/webkit/WebIconDatabase.IconListener.html
+http://developer.android.com/reference/android/webkit/WebView.PictureListener.html
+http://developer.android.com/reference/java/security/cert/package-descr.html
+http://developer.android.com/reference/android/inputmethodservice/KeyboardView.OnKeyboardActionListener.html
+http://developer.android.com/reference/android/graphics/drawable/package-descr.html
+http://developer.android.com/reference/java/sql/Array.html
+http://developer.android.com/reference/java/sql/Blob.html
+http://developer.android.com/reference/java/sql/CallableStatement.html
+http://developer.android.com/reference/java/sql/Clob.html
+http://developer.android.com/reference/java/sql/DatabaseMetaData.html
+http://developer.android.com/reference/java/sql/Driver.html
+http://developer.android.com/reference/java/sql/ParameterMetaData.html
+http://developer.android.com/reference/java/sql/PreparedStatement.html
+http://developer.android.com/reference/java/sql/Ref.html
+http://developer.android.com/reference/java/sql/ResultSet.html
+http://developer.android.com/reference/java/sql/ResultSetMetaData.html
+http://developer.android.com/reference/java/sql/Savepoint.html
+http://developer.android.com/reference/java/sql/SQLData.html
+http://developer.android.com/reference/java/sql/SQLInput.html
+http://developer.android.com/reference/java/sql/SQLOutput.html
+http://developer.android.com/reference/java/sql/Statement.html
+http://developer.android.com/reference/java/sql/Struct.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.EGLConfigChooser.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.GLWrapper.html
+http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html
+http://developer.android.com/reference/org/apache/http/entity/ContentLengthStrategy.html
+http://developer.android.com/reference/javax/xml/parsers/package-descr.html
+http://developer.android.com/reference/org/apache/http/impl/auth/NTLMEngine.html
+http://developer.android.com/reference/java/lang/package-descr.html
+http://developer.android.com/reference/android/webkit/package-descr.html
+http://developer.android.com/reference/java/util/concurrent/locks/package-descr.html
+http://developer.android.com/reference/dalvik/system/package-descr.html
+http://developer.android.com/reference/org/apache/http/client/params/ClientPNames.html
+http://developer.android.com/reference/org/apache/http/entity/ContentProducer.html
+http://developer.android.com/reference/java/util/jar/Manifest.html
+http://developer.android.com/reference/javax/security/cert/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/params/package-descr.html
+http://developer.android.com/reference/android/view/ViewDebug.CapturedViewProperty.html
+http://developer.android.com/reference/android/view/ViewDebug.ExportedProperty.html
+http://developer.android.com/reference/android/view/ViewDebug.IntToString.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/LargeTest.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/MediumTest.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/SmallTest.html
+http://developer.android.com/reference/android/content/pm/package-descr.html
+http://developer.android.com/reference/org/xml/sax/ext/package-descr.html
+http://developer.android.com/reference/java/io/package-descr.html
+http://developer.android.com/reference/android/widget/RemoteViews.RemoteView.html
+http://developer.android.com/reference/javax/crypto/package-descr.html
+http://developer.android.com/reference/org/apache/http/auth/params/AuthPNames.html
+http://developer.android.com/reference/org/apache/http/auth/params/package-descr.html
+http://developer.android.com/reference/javax/net/package-descr.html
+http://developer.android.com/reference/java/util/prefs/NodeChangeListener.html
+http://developer.android.com/reference/java/util/prefs/PreferenceChangeListener.html
+http://developer.android.com/reference/java/util/prefs/PreferencesFactory.html
+http://developer.android.com/reference/org/apache/http/conn/routing/RouteInfo.html
+http://developer.android.com/reference/org/apache/http/entity/package-descr.html
+http://developer.android.com/sdk/1.0_r2/requirements.html
+http://developer.android.com/sdk/adt_download.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html
+http://developer.android.com/reference/android/inputmethodservice/package-descr.html
+http://developer.android.com/reference/javax/net/ssl/package-descr.html
+http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecPNames.html
+http://developer.android.com/reference/org/apache/http/cookie/params/package-descr.html
+http://developer.android.com/reference/java/security/spec/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable/index.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable-land/index.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable-port/index.html
+http://developer.android.com/guide/samples/LunarLander/res/layout/index.html
+http://developer.android.com/guide/samples/LunarLander/res/values/index.html
+http://developer.android.com/reference/java/sql/package-descr.html
+http://developer.android.com/reference/android/graphics/package-descr.html
+http://developer.android.com/reference/android/content/res/package-descr.html
+http://developer.android.com/reference/java/security/interfaces/DSAPublicKey.html
+http://developer.android.com/reference/java/security/interfaces/ECPublicKey.html
+http://developer.android.com/reference/java/security/interfaces/RSAPublicKey.html
+http://developer.android.com/reference/junit/framework/package-descr.html
+http://developer.android.com/reference/org/apache/http/impl/package-descr.html
+http://developer.android.com/guide/appendix/faq/commontasks.html
+http://developer.android.com/guide/appendix/faq/framework.html
+http://developer.android.com/guide/appendix/faq/licensingandoss.html
+http://developer.android.com/guide/appendix/faq/security.html
+http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.0_r2.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.0_r2.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.0_r2.zip
+http://developer.android.com/reference/android/opengl/package-descr.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10Ext.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11Ext.html
+http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html
+http://developer.android.com/reference/android/view/package-descr.html
http://developer.android.com/reference/org/w3c/dom/Attr.html
-
-http://developer.android.com/reference/android/hardware/Camera.AutoFocusCallback.html
-http://developer.android.com/reference/android/hardware/Camera.ErrorCallback.html
-
-http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html
-http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html
-
-http://developer.android.com/reference/android/hardware/Camera.ShutterCallback.html
http://developer.android.com/reference/org/w3c/dom/CDATASection.html
-
http://developer.android.com/reference/org/w3c/dom/CharacterData.html
-http://developer.android.com/reference/org/apache/http/client/params/ClientPNames.html
-
http://developer.android.com/reference/org/w3c/dom/Comment.html
-http://developer.android.com/reference/java/util/concurrent/locks/Condition.html
-
-http://developer.android.com/reference/javax/sql/ConnectionEventListener.html
-http://developer.android.com/reference/javax/sql/ConnectionPoolDataSource.html
-
-http://developer.android.com/reference/org/apache/http/cookie/params/CookieSpecPNames.html
-http://developer.android.com/reference/javax/sql/DataSource.html
-
-http://developer.android.com/reference/java/lang/Deprecated.html
-http://developer.android.com/reference/javax/crypto/interfaces/DHKey.html
-
-http://developer.android.com/reference/javax/crypto/interfaces/DHPrivateKey.html
-http://developer.android.com/reference/javax/crypto/interfaces/DHPublicKey.html
-
http://developer.android.com/reference/org/w3c/dom/Document.html
-http://developer.android.com/reference/java/lang/annotation/Documented.html
-
http://developer.android.com/reference/org/w3c/dom/DocumentFragment.html
http://developer.android.com/reference/org/w3c/dom/DocumentType.html
-
http://developer.android.com/reference/org/w3c/dom/DOMImplementation.html
-http://developer.android.com/reference/java/security/interfaces/DSAKey.html
-
-http://developer.android.com/reference/java/security/interfaces/DSAKeyPairGenerator.html
-http://developer.android.com/reference/java/security/interfaces/DSAParams.html
-
-http://developer.android.com/reference/java/security/interfaces/DSAPrivateKey.html
-http://developer.android.com/reference/java/security/interfaces/DSAPublicKey.html
-
-http://developer.android.com/reference/java/security/interfaces/ECKey.html
-http://developer.android.com/reference/java/security/interfaces/ECPrivateKey.html
-
-http://developer.android.com/reference/java/security/interfaces/ECPublicKey.html
http://developer.android.com/reference/org/w3c/dom/Element.html
-
http://developer.android.com/reference/org/w3c/dom/Entity.html
http://developer.android.com/reference/org/w3c/dom/EntityReference.html
-
-http://developer.android.com/reference/org/apache/http/protocol/ExecutionContext.html
-http://developer.android.com/reference/android/test/FlakyTest.html
-
-http://developer.android.com/reference/java/lang/reflect/GenericArrayType.html
-http://developer.android.com/reference/java/lang/reflect/GenericDeclaration.html
-
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10Ext.html
-
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11.html
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11Ext.html
-
-http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpExpectationVerifier.html
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandler.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestHandlerResolver.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpRequestInterceptorList.html
-
-http://developer.android.com/reference/org/apache/http/protocol/HttpResponseInterceptorList.html
-
-http://developer.android.com/reference/java/lang/annotation/Inherited.html
-http://developer.android.com/reference/java/lang/reflect/InvocationHandler.html
-
-http://developer.android.com/reference/android/text/style/LeadingMarginSpan.html
-http://developer.android.com/reference/android/text/style/LineBackgroundSpan.html
-
-http://developer.android.com/reference/android/text/style/LineHeightSpan.html
-http://developer.android.com/reference/java/util/regex/MatchResult.html
-
-http://developer.android.com/reference/java/lang/reflect/Member.html
http://developer.android.com/reference/org/w3c/dom/NamedNodeMap.html
-
http://developer.android.com/reference/org/w3c/dom/Node.html
http://developer.android.com/reference/org/w3c/dom/NodeList.html
-
http://developer.android.com/reference/org/w3c/dom/Notation.html
-http://developer.android.com/reference/dalvik/bytecode/Opcodes.html
-
-http://developer.android.com/reference/java/lang/Override.html
-http://developer.android.com/reference/android/text/style/ParagraphStyle.html
-
-http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html
-http://developer.android.com/reference/javax/sql/PooledConnection.html
-
http://developer.android.com/reference/org/w3c/dom/ProcessingInstruction.html
-http://developer.android.com/reference/java/lang/reflect/Proxy.html
-
-http://developer.android.com/reference/java/lang/annotation/Retention.html
-http://developer.android.com/reference/javax/sql/RowSetInternal.html
-
-http://developer.android.com/reference/javax/sql/RowSetListener.html
-http://developer.android.com/reference/javax/sql/RowSetMetaData.html
-
-http://developer.android.com/reference/javax/sql/RowSetReader.html
-http://developer.android.com/reference/javax/sql/RowSetWriter.html
-
+http://developer.android.com/reference/org/w3c/dom/Text.html
+http://developer.android.com/reference/org/apache/http/message/package-descr.html
+http://developer.android.com/reference/java/util/concurrent/package-descr.html
+http://developer.android.com/guide/tutorials/views/hello-datepicker.html
+http://developer.android.com/guide/tutorials/views/hello-timepicker.html
+http://developer.android.com/reference/android/net/wifi/package-descr.html
+http://developer.android.com/reference/android/content/package-descr.html
+http://developer.android.com/guide/samples/NotePad/src/com/index.html
+http://developer.android.com/guide/samples/LunarLander/src/com/index.html
+http://developer.android.com/reference/org/apache/http/impl/io/package-descr.html
+http://developer.android.com/reference/android/text/format/DateUtils.html
+http://developer.android.com/reference/android/text/format/Formatter.html
+http://developer.android.com/reference/java/security/interfaces/DSAKey.html
+http://developer.android.com/reference/java/security/interfaces/DSAKeyPairGenerator.html
+http://developer.android.com/reference/java/security/interfaces/DSAParams.html
+http://developer.android.com/reference/java/security/interfaces/DSAPrivateKey.html
+http://developer.android.com/reference/java/security/interfaces/ECKey.html
+http://developer.android.com/reference/java/security/interfaces/ECPrivateKey.html
http://developer.android.com/reference/java/security/interfaces/RSAKey.html
http://developer.android.com/reference/java/security/interfaces/RSAMultiPrimePrivateCrtKey.html
-
http://developer.android.com/reference/java/security/interfaces/RSAPrivateCrtKey.html
http://developer.android.com/reference/java/security/interfaces/RSAPrivateKey.html
-
-http://developer.android.com/reference/java/security/interfaces/RSAPublicKey.html
-http://developer.android.com/reference/android/hardware/SensorListener.html
-
-http://developer.android.com/reference/android/test/suitebuilder/annotation/Smoke.html
-http://developer.android.com/reference/android/test/suitebuilder/annotation/Suppress.html
-
-http://developer.android.com/reference/java/lang/SuppressWarnings.html
-http://developer.android.com/reference/android/text/style/TabStopSpan.html
-
+http://developer.android.com/reference/java/security/interfaces/package-descr.html
+http://developer.android.com/reference/org/apache/http/client/params/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/res/layout/lunar_layout.html
+http://developer.android.com/reference/android/net/package-descr.html
+http://developer.android.com/reference/android/text/util/Linkify.MatchFilter.html
+http://developer.android.com/reference/android/text/util/Linkify.TransformFilter.html
+http://developer.android.com/reference/android/text/util/package-descr.html
+http://developer.android.com/reference/android/appwidget/package-descr.html
+http://developer.android.com/sdk/1.1_r1/requirements.html
+http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.1_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.1_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.1_r1.zip
+http://developer.android.com/reference/android/graphics/drawable/shapes/package-descr.html
+http://developer.android.com/reference/javax/xml/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable-land/earthrise.html
+http://developer.android.com/reference/android/test/mock/package-descr.html
+http://developer.android.com/reference/org/apache/http/protocol/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/tests/src/index.html
+http://developer.android.com/guide/samples/LunarLander/tests/AndroidManifest.html
+http://developer.android.com/guide/samples/NotePad/tests/src/index.html
+http://developer.android.com/guide/samples/NotePad/tests/AndroidManifest.html
+http://developer.android.com/reference/java/lang/annotation/Retention.html
+http://developer.android.com/reference/java/util/prefs/package-descr.html
+http://developer.android.com/reference/android/view/animation/package-descr.html
+http://developer.android.com/reference/java/nio/charset/spi/package-descr.html
+http://developer.android.com/reference/javax/security/auth/x500/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/package-descr.html
+http://developer.android.com/reference/java/util/package-descr.html
+http://developer.android.com/guide/samples/NotePad/src/com/example/index.html
+http://developer.android.com/guide/samples/NotePad/src/com/google/index.html
+http://developer.android.com/reference/android/telephony/gsm/package-descr.html
+http://developer.android.com/reference/android/sax/ElementListener.html
+http://developer.android.com/reference/android/sax/EndElementListener.html
+http://developer.android.com/reference/android/sax/EndTextElementListener.html
+http://developer.android.com/reference/android/sax/StartElementListener.html
+http://developer.android.com/reference/android/sax/TextElementListener.html
+http://developer.android.com/reference/android/sax/package-descr.html
+http://developer.android.com/reference/index.html
+http://developer.android.com/reference/org/apache/http/client/methods/package-descr.html
+http://developer.android.com/reference/android/database/sqlite/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html
+http://developer.android.com/guide/samples/LunarLander/res/values/strings.html
+http://developer.android.com/reference/android/telephony/package-descr.html
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/index.html
+http://developer.android.com/reference/org/apache/http/package-descr.html
+http://developer.android.com/reference/java/util/regex/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable-port/earthrise.html
+http://developer.android.com/reference/android/location/package-descr.html
http://developer.android.com/reference/java/lang/annotation/Target.html
-http://developer.android.com/reference/dalvik/annotation/TestTarget.html
-
-http://developer.android.com/reference/dalvik/annotation/TestTargetClass.html
-http://developer.android.com/reference/org/w3c/dom/Text.html
-
-http://developer.android.com/reference/java/lang/reflect/Type.html
-http://developer.android.com/reference/java/lang/reflect/TypeVariable.html
-
-http://developer.android.com/reference/android/test/UiThreadTest.html
-http://developer.android.com/reference/android/text/style/UpdateLayout.html
-
-http://developer.android.com/reference/java/lang/reflect/WildcardType.html
-http://developer.android.com/reference/android/text/style/WrapTogetherSpan.html
-
-http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html
-
-http://developer.android.com/reference/java/util/zip/package-descr.html
-http://developer.android.com/reference/javax/security/auth/login/package-descr.html
-
-http://developer.android.com/reference/android/text/style/package-descr.html
-
-http://developer.android.com/reference/java/nio/channels/package-descr.html
-http://developer.android.com/reference/android/opengl/package-descr.html
-
http://developer.android.com/guide/tutorials/notepad/notepad-ex1.html
-
http://developer.android.com/guide/tutorials/notepad/notepad-ex2.html
http://developer.android.com/guide/tutorials/notepad/notepad-ex3.html
-
http://developer.android.com/guide/tutorials/notepad/notepad-extra-credit.html
-http://developer.android.com/reference/java/util/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/client/methods/package-descr.html
-http://developer.android.com/reference/android/os/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/client/utils/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/impl/package-descr.html
-
-http://developer.android.com/reference/java/io/package-descr.html
-http://developer.android.com/guide/samples/NotePad/src/com/example/index.html
-
-http://developer.android.com/reference/java/nio/charset/spi/package-descr.html
-
-http://developer.android.com/reference/org/apache/http/impl/entity/package-descr.html
-
-http://developer.android.com/guide/samples/LunarLander/res/index.html
-
-http://developer.android.com/guide/samples/LunarLander/src/index.html
-http://developer.android.com/guide/samples/LunarLander/tests/index.html
-
-http://developer.android.com/guide/samples/LunarLander/AndroidManifest.html
-http://developer.android.com/guide/samples/LunarLander/sample_lunarlander.html
-
-http://developer.android.com/reference/javax/crypto/interfaces/package-descr.html
+http://developer.android.com/reference/java/math/package-descr.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable/app_lunar_lander.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_crashed.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_firing.html
+http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_plain.html
+http://developer.android.com/reference/android/test/UiThreadTest.html
+http://developer.android.com/guide/topics/ui/notifiers/notifications.html
+http://developer.android.com/guide/samples/NotePad/tests/src/com/index.html
+http://developer.android.com/reference/java/util/jar/package-descr.html
+http://developer.android.com/reference/org/apache/http/io/package-descr.html
+http://developer.android.com/reference/org/xml/sax/helpers/package-descr.html
+http://developer.android.com/reference/android/database/package-descr.html
+http://developer.android.com/reference/javax/sql/package-descr.html
+http://developer.android.com/reference/java/nio/package-descr.html
+http://developer.android.com/sdk/OLD_RELEASENOTES.html
+http://developer.android.com/sdk/download.html?v=android-sdk-windows-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-0.9_beta.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_windows.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_mac-x86.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc15_linux-x86.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_windows.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_mac-x86.zip
+http://developer.android.com/sdk/download.html?v=android-sdk_m5-rc14_linux-x86.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc37a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc22a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_windows_m3-rc20a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_darwin_m3-rc20a.zip
+http://developer.android.com/sdk/download.html?v=android_sdk_linux_m3-rc20a.zip
+http://developer.android.com/reference/javax/crypto/spec/package-descr.html
+http://developer.android.com/reference/java/nio/channels/spi/package-descr.html
+http://developer.android.com/reference/dalvik/bytecode/Opcodes.html
+http://developer.android.com/reference/dalvik/bytecode/package-descr.html
+http://developer.android.com/reference/org/apache/http/conn/ssl/package-descr.html
+http://developer.android.com/sdk/api_diff/3/changes/jdiff_topleftframe.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/changes-summary.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/index.html
-
http://developer.android.com/guide/samples/ApiDemos/assets/index.html
http://developer.android.com/guide/samples/ApiDemos/res/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/index.html
http://developer.android.com/guide/samples/ApiDemos/tests/index.html
-
http://developer.android.com/guide/samples/ApiDemos/AndroidManifest.html
+http://developer.android.com/reference/org/xml/sax/package-descr.html
http://developer.android.com/reference/android/widget/package-descr.html
-http://developer.android.com/reference/org/apache/http/conn/params/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/index.html
-http://developer.android.com/guide/samples/ApiDemos/tests/AndroidManifest.html
-
http://developer.android.com/reference/android/test/suitebuilder/package-descr.html
+http://developer.android.com/reference/android/media/package-descr.html
+http://developer.android.com/reference/java/util/logging/package-descr.html
+http://developer.android.com/reference/java/nio/channels/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/assets/fonts/index.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/StyledText.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.html
-
-http://developer.android.com/reference/android/view/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.java
-
-http://developer.android.com/reference/org/w3c/dom/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.java
-
-http://developer.android.com/guide/samples/ApiDemos/res/anim/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/layout/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/raw/index.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/xml/index.html
-http://developer.android.com/reference/java/sql/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.java
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable/index.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable-land/index.html
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable-port/index.html
-http://developer.android.com/guide/samples/LunarLander/res/layout/index.html
-
-http://developer.android.com/guide/samples/LunarLander/res/values/index.html
-http://developer.android.com/reference/android/util/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.java
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/index.html
-
-http://developer.android.com/reference/android/content/package-descr.html
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/index.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/hello_world.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.html
-
+http://developer.android.com/guide/samples/ApiDemos/res/layout/surface_view_overlay.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/index.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.html
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.html
-
-http://developer.android.com/guide/samples/NotePad/tests/src/index.html
-http://developer.android.com/guide/samples/NotePad/tests/AndroidManifest.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.java
-
-http://developer.android.com/reference/org/apache/http/client/params/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.java
-
-http://developer.android.com/reference/java/security/spec/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.java
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable-land/earthrise.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.java
-
-http://developer.android.com/reference/org/apache/http/conn/ssl/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
-
-http://developer.android.com/reference/org/apache/http/message/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.java
-
-http://developer.android.com/guide/samples/ApiDemos/assets/fonts/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.java
-
-http://developer.android.com/reference/android/text/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java
-
-http://developer.android.com/reference/org/apache/http/conn/routing/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.java
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/index.html
-
-http://developer.android.com/reference/com/google/android/maps/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.java
-
-http://developer.android.com/guide/samples/NotePad/tests/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.java
-
+http://developer.android.com/reference/org/apache/http/client/utils/package-descr.html
+http://developer.android.com/guide/samples/NotePad/tests/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.java
+http://developer.android.com/guide/developing/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_view_1.html
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.java
+http://developer.android.com/reference/org/apache/http/impl/conn/tsccm/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.java
-
-http://developer.android.com/
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.java
-
-http://developer.android.com/guide/samples/ApiDemos/res/xml/advanced_preferences.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/xml/default_values.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/preference_dependencies.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/xml/preferences.html
-http://developer.android.com/guide/samples/ApiDemos/res/xml/searchable.html
-
http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePad.html
-
http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html
-
http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotesList.html
-
http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/TitleEditor.html
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/TitleEditor.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.java
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotesList.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.java
-
+http://developer.android.com/reference/java/text/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Vertices.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Typefaces.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.java
+http://developer.android.com/guide/tutorials/views/hello-autocomplete.html
+http://developer.android.com/guide/tutorials/views/hello-gallery.html
+http://developer.android.com/guide/tutorials/views/hello-tabwidget.html
+http://developer.android.com/guide/tutorials/views/hello-mapview.html
+http://developer.android.com/guide/tutorials/views/hello-webview.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.java
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.java
+http://developer.android.com/guide/samples/ApiDemos/res/anim/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/raw/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/index.html
+http://developer.android.com/guide/topics/ui/notifiers/toasts.html
+http://developer.android.com/sdk/api_diff/3/changes/packages_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/classes_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/methods_index_all.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_all.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/StyledText.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/RoundRects.java
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/fields_index_changes.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.System.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Settings.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.AudioManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.ConnectivityManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.Intent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.MotionEvent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.TelephonyManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.id.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.DynamicDrawableSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.attr.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Gravity.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.Manifest.permission.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.VideoColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.DialogInterface.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.TextUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.AssetFileDescriptor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.RectF.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.Zygote.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Images.Media.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Video.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.string.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Build.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Browser.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.Media.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.WindowManager.LayoutParams.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyEvent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.ActivityInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.PendingIntent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.PhoneNumberUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.pm.PackageManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.View.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Configuration.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.Context.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.AlarmManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.location.LocationManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Environment.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaPlayer.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.ParcelFileDescriptor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.MediaStore.Audio.AlbumColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.Intents.Insert.html
+http://developer.android.com/sdk/api_diff/3/changes/android.provider.Contacts.PeopleColumns.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.MediaRecorder.OutputFormat.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.Spanned.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.GridView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.R.style.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.wifi.WifiManager.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
+http://developer.android.com/guide/samples/LunarLander/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.java
+http://developer.android.com/guide/samples/NotePad/res/drawable/index.html
+http://developer.android.com/guide/samples/NotePad/res/layout/index.html
+http://developer.android.com/guide/samples/NotePad/res/values/index.html
+http://developer.android.com/sdk/api_diff/3/changes/jdiff_statistics.html
+http://developer.android.com/reference/android/view/inputmethod/package-descr.html
+http://developer.android.com/sdk/1.0_r1/requirements.html
+http://developer.android.com/sdk/download.html?v=android-sdk-windows-1.0_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-mac_x86-1.0_r1.zip
+http://developer.android.com/sdk/download.html?v=android-sdk-linux_x86-1.0_r1.zip
+http://developer.android.com/reference/java/util/concurrent/atomic/package-descr.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/alarm_controller.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/alarm_service.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/alert_dialog.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/alert_dialog_text_entry.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/animation_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/animation_2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/animations_main_screen.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/appwidget_configure.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/appwidget_provider.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_3.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_4.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_5.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/autocomplete_6.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_3.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_4.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_6.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_7.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/baseline_nested_3.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/buttons_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/chronometer.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/contacts_filter.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/controls_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_dialog_activity.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_title.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/custom_title_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/date_widgets_example_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/date_widgets_example_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/dialog_activity.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/focus_3.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/forward_target.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/forwarding.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/gallery_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/gallery_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/google_login.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/grid_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/grid_2.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/layout/hello_world.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/image_button_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/image_switcher_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/image_view_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_info.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_panel.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/incoming_message_view.html
-
+http://developer.android.com/guide/samples/ApiDemos/res/layout/intents.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/launcher_shortcuts.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_3.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_4.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_5.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_6.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/layout_animation_7.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_10.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_3.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_4.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_5.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_6.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_7.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_8.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/linear_layout_9.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/link.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_12.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_13.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_7.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_8.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_item_checkbox.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_item_icon_text.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/list_position.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/local_sample.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/local_service_binding.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/local_service_controller.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/log_text_box_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/mapview.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/marquee.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/mediaplayer_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/mediaplayer_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/morse_code.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/notify_with_text.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/notifying_controller.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/preference_widget_mypreference.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_3.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/progressbar_4.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/radio_group_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/ratingbar_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/read_asset.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/receive_result.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_enter.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_getter.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/redirect_main.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/relative_layout_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/relative_layout_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/remote_service_binding.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/remote_service_controller.html
-
+http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_four.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_on_launch.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_three.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/reorder_two.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/resources.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/save_restore_state.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/scroll_view_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/scroll_view_2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar2.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/scrollbar3.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/search_invoke.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/search_query_results.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/seekbar_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/select_dialog.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/send_result.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/service_start_arguments_controller.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/shape_drawable_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/spinner_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/status_bar_balloon.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/status_bar_notifications.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/styled_text.html
-http://developer.android.com/guide/samples/ApiDemos/res/layout/surface_view_overlay.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_10.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_11.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_12.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_2.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_3.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_4.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_5.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_6.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_7.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_8.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/table_layout_9.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/tabs1.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/text_switcher_1.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/translucent_background.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/videoview.html
-
http://developer.android.com/guide/samples/ApiDemos/res/layout/visibility_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/layout/voice_recognition.html
http://developer.android.com/guide/samples/ApiDemos/res/layout/webview_1.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.java
-
-http://developer.android.com/guide/samples/ApiDemos/res/menu/category_order.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/checkable.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/menu/disabled.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/groups.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/menu/order.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/shortcuts.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/menu/submenu.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/title_icon.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/menu/title_only.html
-http://developer.android.com/guide/samples/ApiDemos/res/menu/visible.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.java
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/alert_dialog_icon.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/animated_gif.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/app_sample_code.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_down_float.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_up_float.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/balloons.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/beach.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_box.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_opaque_box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/box.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/button.9.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/circular_progress.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/filled_box.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/frog.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_background_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_1.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_3.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_5.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_7.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_8.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/ic_popup_reminder.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_2.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/line.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo1.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo3.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo5.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/picture_frame.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_circular_background.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_particle.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/robot.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_0.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_1.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_3.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_5.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_7.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_0.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_1.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_3.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_4.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_5.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_6.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_7.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_state2.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_thumb.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_track.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_1.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_2.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_3.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_4.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_5.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/star_big_on.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_happy.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_neutral.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sad.html
-http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sample.html
-
-http://developer.android.com/guide/samples/LunarLander/res/layout/lunar_layout.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.java
-
-http://developer.android.com/reference/android/hardware/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.java
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePadProvider.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.java
-
-http://developer.android.com/reference/junit/runner/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/alldiffs_index_changes.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsListView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsoluteLayout.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AbsoluteSizeSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AbsSeekBar.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.Activity.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.ActivityInstrumentationTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.ActivityManager.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.app.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewTreeObserver.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Packer.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.jar.Pack200.Unpacker.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.LogManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.suitebuilder.TestSuiteBuilder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MetaKeyKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.AlertDialog.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.AlignmentSpan.Standard.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.widget.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.pm.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.content.res.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.database.sqlite.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.graphics.drawable.shapes.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.hardware.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.location.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.media.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.net.wifi.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.opengl.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.os.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.preference.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.provider.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.telephony.gsm.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.mock.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.test.suitebuilder.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.method.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.text.style.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.util.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.view.animation.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_android.webkit.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Animation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.Annotation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.DatabaseUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ArrayAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ArrowKeyMovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.AutoCompleteTextView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.AutoText.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BackgroundColorSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.BaseKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.TextView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Binder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Bitmap.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.BroadcastReceiver.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.BulletSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.telephony.gsm.SmsMessage.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.Instrumentation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.Camera.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Canvas.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.SimpleCursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Debug.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.Character.UnicodeBlock.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.Chronometer.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.Class.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.KeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ClickableSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.shapes.Shape.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Menu.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentProvider.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.ContentResolver.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.Cursor.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.CursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.CursorWrapper.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_dalvik.system.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.Date.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DateTimeKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ForegroundColorSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.LeadingMarginSpan.Standard.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.QuoteSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RelativeSizeSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ScaleXSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StrikethroughSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.StyleSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SubscriptSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.SuperscriptSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TextAppearanceSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.TypefaceSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.URLSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UnderlineSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.KeyCharacterMap.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.DexFile.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DialerKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.preference.DialogPreference.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.DigitsKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.TouchUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.Drawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.location.Location.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.IBinder.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewDebug.html
+http://developer.android.com/sdk/api_diff/3/changes/dalvik.system.VMDebug.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.GestureDetector.SimpleOnGestureListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewConfiguration.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebSettings.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.Resources.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.RotateDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.ScaleDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.Touch.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MultiTapKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.QwertyKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TextKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.TimeKeyListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.mock.MockPackageManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.content.res.TypedArray.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.WebHistoryItem.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptHandler.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.UrlInterceptRegistry.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.reflect.Proxy.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.Scroller.html
+http://developer.android.com/sdk/api_diff/3/changes/android.net.NetworkInfo.html
+http://developer.android.com/sdk/api_diff/3/changes/android.app.LauncherActivity.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Looper.html
+http://developer.android.com/sdk/api_diff/3/changes/android.util.TimeUtils.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Handler.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.Window.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.ImageSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.RingtoneManager.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.InstrumentationTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.webkit.URLUtil.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.lang.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.lang.reflect.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.net.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.jar.html
+http://developer.android.com/sdk/api_diff/3/changes/pkg_java.util.logging.html
+http://developer.android.com/sdk/api_diff/3/changes/java.util.logging.Level.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ListView.html
+http://developer.android.com/sdk/api_diff/3/changes/android.media.SoundPool.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.MaskFilterSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.MovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.method.ScrollingMovementMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ProgressBar.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.OrientationListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.os.Parcel.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.PopupWindow.OnDismissListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.ProviderTestCase.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.RasterizerSpan.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.Rect.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.RemoteViews.ActionException.html
+http://developer.android.com/sdk/api_diff/3/changes/android.util.SparseIntArray.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewParent.html
+http://developer.android.com/sdk/api_diff/3/changes/android.widget.ResourceCursorAdapter.html
+http://developer.android.com/sdk/api_diff/3/changes/android.hardware.SensorListener.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.ViewGroup.html
+http://developer.android.com/sdk/api_diff/3/changes/java.net.Socket.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.SpanWatcher.html
+http://developer.android.com/sdk/api_diff/3/changes/android.database.sqlite.SQLiteDatabase.html
+http://developer.android.com/sdk/api_diff/3/changes/java.lang.String.html
+http://developer.android.com/sdk/api_diff/3/changes/android.test.suitebuilder.TestMethod.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.TextWatcher.html
+http://developer.android.com/sdk/api_diff/3/changes/android.view.animation.Transformation.html
+http://developer.android.com/sdk/api_diff/3/changes/android.graphics.drawable.TransitionDrawable.html
+http://developer.android.com/sdk/api_diff/3/changes/android.text.style.UpdateLayout.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.java
+http://developer.android.com/reference/android/text/package-descr.html
+http://developer.android.com/guide/samples/NotePad/src/com/google/provider/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.java
http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePad.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.java
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/index.html
-http://developer.android.com/guide/samples/LunarLander/tests/AndroidManifest.html
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/index.html
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/index.html
+http://developer.android.com/reference/org/apache/http/conn/routing/package-descr.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.java
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable/app_lunar_lander.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_crashed.html
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_firing.html
-http://developer.android.com/guide/samples/LunarLander/res/drawable/lander_plain.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/StyledText.java
-
-http://developer.android.com/reference/org/apache/http/package-descr.html
-http://developer.android.com/reference/javax/net/ssl/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.java
-
-http://developer.android.com/guide/samples/LunarLander/res/values/strings.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java
+http://developer.android.com/reference/java/lang/Deprecated.html
+http://developer.android.com/reference/java/lang/annotation/Documented.html
+http://developer.android.com/reference/android/test/FlakyTest.html
+http://developer.android.com/reference/java/lang/annotation/Inherited.html
+http://developer.android.com/reference/java/lang/Override.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/Smoke.html
+http://developer.android.com/reference/android/test/suitebuilder/annotation/Suppress.html
+http://developer.android.com/reference/java/lang/SuppressWarnings.html
+http://developer.android.com/reference/dalvik/annotation/TestTarget.html
+http://developer.android.com/reference/dalvik/annotation/TestTargetClass.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Layers.java
+http://developer.android.com/guide/samples/NotePad/res/values/strings.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.java
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotePadProvider.java
http://developer.android.com/guide/samples/ApiDemos/res/anim/cycle_7.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/fade.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/hyperspace_in.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/hyperspace_out.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_row_left_slide.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_row_right_slide.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_animation_table.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_bottom_to_top_slide.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_grid_fade.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_grid_inverse_fade.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_random_fade.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/layout_wave_scale.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/push_left_in.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/push_left_out.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/push_up_in.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/push_up_out.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/shake.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_left.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_right.html
http://developer.android.com/guide/samples/ApiDemos/res/anim/slide_top_to_bottom.html
-
http://developer.android.com/guide/samples/ApiDemos/res/anim/wave_scale.html
-
-http://developer.android.com/guide/tutorials/views/hello-datepicker.html
-
-http://developer.android.com/guide/tutorials/views/hello-timepicker.html
-http://developer.android.com/guide/tutorials/views/hello-autocomplete.html
-
-http://developer.android.com/guide/tutorials/views/hello-gallery.html
-http://developer.android.com/guide/tutorials/views/hello-tabwidget.html
-
-http://developer.android.com/guide/tutorials/views/hello-mapview.html
-http://developer.android.com/guide/tutorials/views/hello-webview.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.java
-
-http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NoteEditor.java
-
-http://developer.android.com/reference/java/util/concurrent/locks/package-descr.html
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.java
-
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/TitleEditor.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.java
+http://developer.android.com/guide/samples/ApiDemos/res/values/arrays.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/attrs.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/colors.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/ids.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/strings.html
+http://developer.android.com/guide/samples/ApiDemos/res/values/styles.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.java
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
+http://developer.android.com/sdk/api_diff/3/changes/packages_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/packages_index_changes.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.java
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_removals.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/constructors_index_changes.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TextAlign.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Clipping.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Cube.java
+http://developer.android.com/reference/org/w3c/dom/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.java
+http://developer.android.com/guide/samples/ApiDemos/res/menu/category_order.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/checkable.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/disabled.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/groups.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/order.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/shortcuts.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/submenu.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/title_icon.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/title_only.html
+http://developer.android.com/guide/samples/ApiDemos/res/menu/visible.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout5.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout7.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout8.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout9.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout5.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout7.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout8.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout9.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout10.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout11.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout12.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline7.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RadioGroup1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Visibility1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List5.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List7.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List8.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/CustomView1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageButton1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Spinner1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageView1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout10.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List10.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List11.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List12.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List13.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List9.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/MapViewCompassDemo.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/MapViewDemo.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RatingBar1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/SeekBar1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs1.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/WebView1.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/CustomView1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.java
-
-http://developer.android.com/reference/android/text/method/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RadioGroup1.java
-
-http://developer.android.com/reference/org/apache/http/entity/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/WebView1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout9.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline7.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout6.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout10.java
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout11.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout7.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout5.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List6.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.java
-
-http://developer.android.com/reference/org/apache/http/protocol/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Regions.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline4.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceView.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.java
-
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/index.html
-http://developer.android.com/reference/javax/security/auth/callback/package-descr.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List5.java
-
-http://developer.android.com/reference/javax/sql/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List9.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List8.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List7.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout10.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline6.java
-
-http://developer.android.com/reference/android/location/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.java
-
-http://developer.android.com/reference/java/util/regex/package-descr.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/M4.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar4.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout10.java
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/alert_dialog_icon.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/animated_gif.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/app_sample_code.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_down_float.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/arrow_up_float.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/balloons.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/beach.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_box.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/black_opaque_box.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/box.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/button.9.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/circular_progress.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/filled_box.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/frog.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_background_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_3.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_4.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_5.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_6.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_7.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/gallery_photo_8.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/ic_popup_reminder.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/icon48x48_2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/line.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo3.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo4.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo5.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/photo6.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/picture_frame.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_circular_background.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/progress_particle.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/robot.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_0.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_3.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_4.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_5.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_6.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_7.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_0.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_3.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_4.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_5.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_6.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/sample_thumb_7.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_state2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_thumb.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/scrollbar_vertical_track.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_1.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_2.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_3.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_4.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/shape_5.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/star_big_on.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_happy.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_neutral.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sad.html
+http://developer.android.com/guide/samples/ApiDemos/res/drawable/stat_sample.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List11.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ResourcesSample.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete2.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Sweep.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List12.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/content/ReadAsset.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.java
-
-http://developer.android.com/reference/org/apache/http/cookie/params/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout4.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Pictures.java
-
-http://developer.android.com/reference/java/security/cert/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Buttons1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Spinner1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List9.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout12.java
+http://developer.android.com/reference/org/apache/http/cookie/package-descr.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List13.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/WebView1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List7.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout9.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageButton1.java
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout8.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested1.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls1.java
-
-http://developer.android.com/reference/org/apache/http/util/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List10.java
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar1.java
-
-http://developer.android.com/reference/java/security/interfaces/package-descr.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout5.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery1.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout9.java
+http://developer.android.com/guide/samples/NotePad/src/com/example/android/notepad/NotesList.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar1.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Visibility1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout12.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Patterns.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar3.java
+http://developer.android.com/reference/android/os/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List3.java
-
-http://developer.android.com/guide/samples/LunarLander/res/drawable-port/earthrise.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout7.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout1.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/SeekBar1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout9.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout11.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List12.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout7.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Spinner1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout6.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List5.java
+http://developer.android.com/guide/samples/NotePad/src/com/google/provider/NotePad.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Visibility1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Intents.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderFour.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderThree.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderTwo.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline6.java
+http://developer.android.com/reference/android/app/package-descr.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List8.java
+http://developer.android.com/sdk/api_diff/3/changes/classes_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/classes_index_changes.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Controls2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete3.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout4.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderThree.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/BaselineNested2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline7.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Forwarding.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceBinding.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.java
+http://developer.android.com/guide/samples/NotePad/src/com/google/provider/NotePad.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout6.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List10.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromXml.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollBar2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferenceDependencies.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/MeasureText.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/HelloWorld.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PreferencesFromCode.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/PersistentState.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline2.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectEnter.java
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.html
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderTwo.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AdvancedPreferences.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/Intents.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout7.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.java
+http://developer.android.com/guide/samples/NotePad/res/layout/note_editor.html
+http://developer.android.com/guide/samples/NotePad/res/layout/noteslist_item.html
+http://developer.android.com/guide/samples/NotePad/res/layout/title_editor.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageButton1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout5.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.java
+http://developer.android.com/sdk/api_diff/3/changes/methods_index_additions.html
+http://developer.android.com/sdk/api_diff/3/changes/methods_index_changes.html
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/index.html
+http://developer.android.com/guide/samples/ApiDemos/tests/AndroidManifest.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArgumentsController.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/SensorTest.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/M4.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RatingBar1.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteServiceController.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchInvoke.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Grid2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.java
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete3.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout8.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List2.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.java
-
-http://developer.android.com/guide/samples/ApiDemos/res/values/arrays.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/attrs.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/values/colors.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/ids.html
-
-http://developer.android.com/guide/samples/ApiDemos/res/values/strings.html
-http://developer.android.com/guide/samples/ApiDemos/res/values/styles.html
-
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalService.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Animation1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/MapViewCompassDemo.java
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List11.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceController.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSample.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout8.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/MyPreference.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyWithText.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.java
+http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ImageView1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsFilter.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RatingBar1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Gallery1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/RadioGroup1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingService.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ForwardTarget.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectGetter.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/LogTextBox1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout6.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/CustomTitle.java
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar3.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Marquee.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReceiveResult.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/CustomView1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DialogActivity.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/DateWidgets1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout2.java
+http://developer.android.com/guide/samples/NotePad/res/drawable/app_notes.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/ScrollView2.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/LaunchingPreferences.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Tabs3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/DefaultValues.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/RedirectMain.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/ReorderFour.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete6.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/NotifyingController.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout5.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SendResult.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.java
+http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/index.html
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/LinearLayout1.java
-
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/index.html
-
-http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/SeekBar1.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Focus3.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/TableLayout10.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List6.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/index.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/advanced_preferences.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/appwidget_provider.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/default_values.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/preference_dependencies.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/preferences.html
+http://developer.android.com/guide/samples/ApiDemos/res/xml/searchable.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java
+http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.html
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List1.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.java
-
-http://developer.android.com/guide/samples/NotePad/res/drawable/index.html
-http://developer.android.com/guide/samples/NotePad/res/layout/index.html
-
-http://developer.android.com/guide/samples/NotePad/res/values/index.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java
-
-http://developer.android.com/guide/samples/NotePad/res/drawable/app_notes.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.java
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/index.html
-
+http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/Baseline1.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.html
+http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.html
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/index.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/index.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/index.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/AllTests.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/MapViewDemo.java
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.java
http://developer.android.com/guide/samples/NotePad/tests/src/com/example/android/notepad/NotePadTest.java
-
-http://developer.android.com/guide/samples/NotePad/res/values/strings.html
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete2.java
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.java
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.html
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.java
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/index.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/AllTests.java
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.html
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/index.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.html
-
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.html
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java
+http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.java
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.java
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/text/Link.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.java
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/index.html
-
-http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.java
-
-http://developer.android.com/guide/samples/NotePad/res/layout/note_editor.html
-http://developer.android.com/guide/samples/NotePad/res/layout/noteslist_item.html
-
-http://developer.android.com/guide/samples/NotePad/res/layout/title_editor.html
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/index.html
-
http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.html
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemosApplication.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/ApiDemos.java
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.html
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCode.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarView.java
-
-http://developer.android.com/guide/samples/LunarLander/src/com/example/android/lunarlander/LunarLander.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/os/Sensors.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java
-
-http://developer.android.com/guide/samples/LunarLander/tests/src/com/example/android/lunarlander/LunarLanderTest.java
-
-http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.java \ No newline at end of file
+http://developer.android.com/guide/samples/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.java
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 3813d8f..9e88d7e 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -103,6 +103,36 @@ public class BitmapFactory {
public boolean inScaled;
/**
+ * If this is set to true, then the resulting bitmap will allocate its
+ * pixels such that they can be purged if the system needs to reclaim
+ * memory. In that instance, when the pixels need to be accessed again
+ * (e.g. the bitmap is drawn, getPixels() is called), they will be
+ * automatically re-decoded.
+ *
+ * For the re-decode to happen, the bitmap must have access to the
+ * encoded data, either by sharing a reference to the input
+ * or by making a copy of it. This distinction is controlled by
+ * inInputShareable. If this is true, then the bitmap may keep a shallow
+ * reference to the input. If this is false, then the bitmap will
+ * explicitly make a copy of the input data, and keep that. Even if
+ * sharing is allowed, the implementation may still decide to make a
+ * deep copy of the input data.
+ *
+ * @hide pending API council approval
+ */
+ public boolean inPurgeable;
+
+ /**
+ * This field works in conjuction with inPurgeable. If inPurgeable is
+ * false, then this field is ignored. If inPurgeable is true, then this
+ * field determines whether the bitmap can share a reference to the
+ * input data (inputstream, array, etc.) or if it must make a deep copy.
+ *
+ * @hide pending API council approval
+ */
+ public boolean inInputShareable;
+
+ /**
* The resulting width of the bitmap, set independent of the state of
* inJustDecodeBounds. However, if there is an error trying to decode,
* outWidth will be set to -1.
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 32ecd9f..06d53e3 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -112,7 +112,9 @@ public class Canvas {
* on behalf of the Canvas. Any subsequent drawing with a GL-backed Canvas
* will have to recreate those resources.
*/
- public static native void freeGlCaches();
+ public static void freeGlCaches() {
+ freeCaches();
+ }
/**
* Specify a bitmap for the canvas to draw into.
@@ -1405,6 +1407,14 @@ public class Canvas {
finalizer(mNativeCanvas);
}
+ /**
+ * Free up as much memory as possible from private caches (e.g. fonts,
+ * images)
+ *
+ * @hide - for now
+ */
+ public static native void freeCaches();
+
private static native int initRaster(int nativeBitmapOrZero);
private static native int initGL();
private static native void native_setBitmap(int nativeCanvas, int bitmap);
diff --git a/graphics/java/android/graphics/Matrix.java b/graphics/java/android/graphics/Matrix.java
index 2681eae..f549900 100644
--- a/graphics/java/android/graphics/Matrix.java
+++ b/graphics/java/android/graphics/Matrix.java
@@ -16,6 +16,8 @@
package android.graphics;
+import java.io.PrintWriter;
+
/**
* The Matrix class holds a 3x3 matrix for transforming coordinates.
@@ -539,17 +541,49 @@ public class Matrix {
}
public String toString() {
- return "Matrix{" + toShortString() + "}";
+ StringBuilder sb = new StringBuilder(64);
+ sb.append("Matrix{");
+ toShortString(sb);
+ sb.append('}');
+ return sb.toString();
}
public String toShortString() {
+ StringBuilder sb = new StringBuilder(64);
+ toShortString(sb);
+ return sb.toString();
+ }
+
+ /**
+ * @hide
+ */
+ public void toShortString(StringBuilder sb) {
+ float[] values = new float[9];
+ getValues(values);
+ sb.append('[');
+ sb.append(values[0]); sb.append(", "); sb.append(values[1]); sb.append(", ");
+ sb.append(values[2]); sb.append("][");
+ sb.append(values[3]); sb.append(", "); sb.append(values[4]); sb.append(", ");
+ sb.append(values[5]); sb.append("][");
+ sb.append(values[6]); sb.append(", "); sb.append(values[7]); sb.append(", ");
+ sb.append(values[8]); sb.append(']');
+ }
+
+ /**
+ * Print short string, to optimize dumping.
+ * @hide
+ */
+ public void printShortString(PrintWriter pw) {
float[] values = new float[9];
getValues(values);
- return "[" +
- values[0] + ", " + values[1] + ", " + values[2] + "][" +
- values[3] + ", " + values[4] + ", " + values[5] + "][" +
- values[6] + ", " + values[7] + ", " + values[8] + "]";
+ pw.print('[');
+ pw.print(values[0]); pw.print(", "); pw.print(values[1]); pw.print(", ");
+ pw.print(values[2]); pw.print("][");
+ pw.print(values[3]); pw.print(", "); pw.print(values[4]); pw.print(", ");
+ pw.print(values[5]); pw.print("][");
+ pw.print(values[6]); pw.print(", "); pw.print(values[7]); pw.print(", ");
+ pw.print(values[8]); pw.print(']');
}
diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java
index 2005344..50ab566 100644
--- a/graphics/java/android/graphics/Rect.java
+++ b/graphics/java/android/graphics/Rect.java
@@ -19,6 +19,8 @@ package android.graphics;
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.PrintWriter;
+
/**
* Rect holds four integer coordinates for a rectangle. The rectangle is
* represented by the coordinates of its 4 edges (left, top, right bottom).
@@ -78,14 +80,40 @@ public final class Rect implements Parcelable {
}
public String toString() {
- return "Rect(" + left + ", " + top + " - " + right + ", " + bottom + ")";
+ StringBuilder sb = new StringBuilder(32);
+ sb.append("Rect("); sb.append(left); sb.append(", ");
+ sb.append(top); sb.append(" - "); sb.append(right);
+ sb.append(", "); sb.append(bottom); sb.append(")");
+ return sb.toString();
}
/**
* Return a string representation of the rectangle in a compact form.
*/
public String toShortString() {
- return "[" + left + "," + top + "][" + right + "," + bottom + "]";
+ return toShortString(new StringBuilder(32));
+ }
+
+ /**
+ * Return a string representation of the rectangle in a compact form.
+ * @hide
+ */
+ public String toShortString(StringBuilder sb) {
+ sb.setLength(0);
+ sb.append('['); sb.append(left); sb.append(',');
+ sb.append(top); sb.append("]["); sb.append(right);
+ sb.append(','); sb.append(bottom); sb.append(']');
+ return sb.toString();
+ }
+
+ /**
+ * Print short representation to given writer.
+ * @hide
+ */
+ public void printShortString(PrintWriter pw) {
+ pw.print('['); pw.print(left); pw.print(',');
+ pw.print(top); pw.print("]["); pw.print(right);
+ pw.print(','); pw.print(bottom); pw.print(']');
}
/**
@@ -517,4 +545,17 @@ public final class Rect implements Parcelable {
right = in.readInt();
bottom = in.readInt();
}
+
+ /**
+ * Scales up the rect by the given scale.
+ * @hide
+ */
+ public void scale(float scale) {
+ if (scale != 1.0f) {
+ left *= scale;
+ top *= scale;
+ right *= scale;
+ bottom*= scale;
+ }
+ }
}
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 42e28e8..f0d49f5 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -38,32 +38,32 @@ import android.util.TypedValue;
* dealing with an underlying visual resource that may take a variety of forms.
* Unlike a {@link android.view.View}, a Drawable does not have any facility to
* receive events or otherwise interact with the user.
- *
+ *
* <p>In addition to simple drawing, Drawable provides a number of generic
* mechanisms for its client to interact with what is being drawn:
- *
+ *
* <ul>
* <li> The {@link #setBounds} method <var>must</var> be called to tell the
* Drawable where it is drawn and how large it should be. All Drawables
* should respect the requested size, often simply by scaling their
* imagery. A client can find the preferred size for some Drawables with
* the {@link #getIntrinsicHeight} and {@link #getIntrinsicWidth} methods.
- *
+ *
* <li> The {@link #getPadding} method can return from some Drawables
* information about how to frame content that is placed inside of them.
* For example, a Drawable that is intended to be the frame for a button
* widget would need to return padding that correctly places the label
* inside of itself.
- *
+ *
* <li> The {@link #setState} method allows the client to tell the Drawable
* in which state it is to be drawn, such as "focused", "selected", etc.
* Some drawables may modify their imagery based on the selected state.
- *
+ *
* <li> The {@link #setLevel} method allows the client to supply a single
* continuous controller that can modify the Drawable is displayed, such as
* a battery level or progress level. Some drawables may modify their
* imagery based on the current level.
- *
+ *
* <li> A Drawable can perform animations by calling back to its client
* through the {@link Callback} interface. All clients should support this
* interface (via {@link #setCallback}) so that animations will work. A
@@ -71,7 +71,7 @@ import android.util.TypedValue;
* {@link android.view.View#setBackgroundDrawable(Drawable)} and
* {@link android.widget.ImageView}.
* </ul>
- *
+ *
* Though usually not visible to the application, Drawables may take a variety
* of forms:
*
@@ -96,11 +96,12 @@ import android.util.TypedValue;
* and Internationalization</a>.
*/
public abstract class Drawable {
+ private static final Rect ZERO_BOUNDS_RECT = new Rect();
private int[] mStateSet = StateSet.WILD_CARD;
private int mLevel = 0;
private int mChangingConfigurations = 0;
- private Rect mBounds = new Rect();
+ private Rect mBounds = ZERO_BOUNDS_RECT;
/*package*/ Callback mCallback = null;
private boolean mVisible = true;
@@ -118,14 +119,18 @@ public abstract class Drawable {
*/
public void setBounds(int left, int top, int right, int bottom) {
Rect oldBounds = mBounds;
-
+
+ if (oldBounds == ZERO_BOUNDS_RECT) {
+ oldBounds = mBounds = new Rect();
+ }
+
if (oldBounds.left != left || oldBounds.top != top ||
oldBounds.right != right || oldBounds.bottom != bottom) {
mBounds.set(left, top, right, bottom);
onBoundsChange(mBounds);
}
}
-
+
/**
* Specify a bounding rectangle for the Drawable. This is where the drawable
* will draw when its draw() method is called.
@@ -145,12 +150,12 @@ public abstract class Drawable {
public final void copyBounds(Rect bounds) {
bounds.set(mBounds);
}
-
+
/**
* Return a copy of the drawable's bounds in a new Rect. This returns the
* same values as getBounds(), but the returned object is guaranteed to not
* be changed later by the drawable (i.e. it retains no reference to this
- * rect). If the caller already has a Rect allocated, call copyBounds(rect)
+ * rect). If the caller already has a Rect allocated, call copyBounds(rect).
*
* @return A copy of the drawable's bounds
*/
@@ -163,27 +168,37 @@ public abstract class Drawable {
* object may be the same object stored in the drawable (though this is not
* guaranteed), so if a persistent copy of the bounds is needed, call
* copyBounds(rect) instead.
+ * You should also not change the object returned by this method as it may
+ * be the same object stored in the drawable.
*
* @return The bounds of the drawable (which may change later, so caller
- * beware).
+ * beware). DO NOT ALTER the returned object as it may change the
+ * stored bounds of this drawable.
+ *
+ * @see #copyBounds()
+ * @see #copyBounds(android.graphics.Rect)
*/
public final Rect getBounds() {
+ if (mBounds == ZERO_BOUNDS_RECT) {
+ mBounds = new Rect();
+ }
+
return mBounds;
}
/**
* Set a mask of the configuration parameters for which this drawable
* may change, requiring that it be re-created.
- *
+ *
* @param configs A mask of the changing configuration parameters, as
* defined by {@link android.content.res.Configuration}.
- *
+ *
* @see android.content.res.Configuration
*/
public void setChangingConfigurations(int configs) {
mChangingConfigurations = configs;
}
-
+
/**
* Return a mask of the configuration parameters for which this drawable
* mau change, requiring that it be re-created. The default implementation
@@ -191,23 +206,23 @@ public abstract class Drawable {
* {@link #setChangingConfigurations(int)} or 0 by default. Subclasses
* may extend this to or in the changing configurations of any other
* drawables they hold.
- *
+ *
* @return Returns a mask of the changing configuration parameters, as
* defined by {@link android.content.res.Configuration}.
- *
+ *
* @see android.content.res.Configuration
*/
public int getChangingConfigurations() {
return mChangingConfigurations;
}
-
+
/**
* Set to true to have the drawable dither its colors when drawn to a device
* with fewer than 8-bits per color component. This can improve the look on
* those devices, but can also slow down the drawing a little.
*/
public void setDither(boolean dither) {}
-
+
/**
* Set to true to have the drawable filter its bitmap when scaled or rotated
* (for drawables that use bitmaps). If the drawable does not use bitmaps,
@@ -229,7 +244,7 @@ public abstract class Drawable {
* Called when the drawable needs to be redrawn. A view at this point
* should invalidate itself (or at least the part of itself where the
* drawable appears).
- *
+ *
* @param who The drawable that is requesting the update.
*/
public void invalidateDrawable(Drawable who);
@@ -240,7 +255,7 @@ public abstract class Drawable {
* {@link android.os.Handler#postAtTime(Runnable, Object, long)} with
* the parameters <var>(what, who, when)</var> to perform the
* scheduling.
- *
+ *
* @param who The drawable being scheduled.
* @param what The action to execute.
* @param when The time (in milliseconds) to run. The timebase is
@@ -254,7 +269,7 @@ public abstract class Drawable {
* generally simply call
* {@link android.os.Handler#removeCallbacks(Runnable, Object)} with
* the parameters <var>(what, who)</var> to unschedule the drawable.
- *
+ *
* @param who The drawable being unscheduled.
* @param what The action being unscheduled.
*/
@@ -264,7 +279,7 @@ public abstract class Drawable {
/**
* Bind a {@link Callback} object to this Drawable. Required for clients
* that want to support animated drawables.
- *
+ *
* @param cb The client's Callback implementation.
*/
public final void setCallback(Callback cb) {
@@ -275,7 +290,7 @@ public abstract class Drawable {
* Use the current {@link Callback} implementation to have this Drawable
* redrawn. Does nothing if there is no Callback attached to the
* Drawable.
- *
+ *
* @see Callback#invalidateDrawable
*/
public void invalidateSelf()
@@ -289,10 +304,10 @@ public abstract class Drawable {
* Use the current {@link Callback} implementation to have this Drawable
* scheduled. Does nothing if there is no Callback attached to the
* Drawable.
- *
+ *
* @param what The action being scheduled.
* @param when The time (in milliseconds) to run.
- *
+ *
* @see Callback#scheduleDrawable
*/
public void scheduleSelf(Runnable what, long when)
@@ -306,9 +321,9 @@ public abstract class Drawable {
* Use the current {@link Callback} implementation to have this Drawable
* unscheduled. Does nothing if there is no Callback attached to the
* Drawable.
- *
+ *
* @param what The runnable that you no longer want called.
- *
+ *
* @see Callback#unscheduleDrawable
*/
public void unscheduleSelf(Runnable what)
@@ -323,13 +338,13 @@ public abstract class Drawable {
* 255 means fully opaque.
*/
public abstract void setAlpha(int alpha);
-
+
/**
* Specify an optional colorFilter for the drawable. Pass null to remove
* any filters.
*/
public abstract void setColorFilter(ColorFilter cf);
-
+
/**
* Specify a color and porterduff mode to be the colorfilter for this
* drawable.
@@ -337,7 +352,7 @@ public abstract class Drawable {
public void setColorFilter(int color, PorterDuff.Mode mode) {
setColorFilter(new PorterDuffColorFilter(color, mode));
}
-
+
public void clearColorFilter() {
setColorFilter(null);
}
@@ -346,34 +361,34 @@ public abstract class Drawable {
* Indicates whether this view will change its appearance based on state.
* Clients can use this to determine whether it is necessary to calculate
* their state and call setState.
- *
+ *
* @return True if this view changes its appearance based on state, false
* otherwise.
- *
+ *
* @see #setState(int[])
*/
public boolean isStateful() {
return false;
}
-
+
/**
* Specify a set of states for the drawable. These are use-case specific,
* so see the relevant documentation. As an example, the background for
* widgets like Button understand the following states:
* [{@link android.R.attr#state_focused},
* {@link android.R.attr#state_pressed}].
- *
+ *
* <p>If the new state you are supplying causes the appearance of the
* Drawable to change, then it is responsible for calling
* {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
* true will be returned from this function.
- *
+ *
* <p>Note: The Drawable holds a reference on to <var>stateSet</var>
* until a new state array is given to it, so you must not modify this
* array during that time.</p>
- *
+ *
* @param stateSet The new set of states to be displayed.
- *
+ *
* @return Returns true if this change in state has caused the appearance
* of the Drawable to change (hence requiring an invalidate), otherwise
* returns false.
@@ -396,7 +411,7 @@ public abstract class Drawable {
public int[] getState() {
return mStateSet;
}
-
+
/**
* @return The current drawable that will be used by this drawable. For simple drawables, this
* is just the drawable itself. For drawables that change state like
@@ -416,9 +431,9 @@ public abstract class Drawable {
* Drawable to change, then it is responsible for calling
* {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
* true will be returned from this function.
- *
+ *
* @param level The new level, from 0 (minimum) to 10000 (maximum).
- *
+ *
* @return Returns true if this change in level has caused the appearance
* of the Drawable to change (hence requiring an invalidate), otherwise
* returns false.
@@ -529,7 +544,7 @@ public abstract class Drawable {
* region; subclasses can optionally override this to return an actual
* Region if they want to supply this optimization information, but it is
* not required that they do so.
- *
+ *
* @return Returns null if the Drawables has no transparent region to
* report, else a Region holding the parts of the Drawable's bounds that
* are transparent.
@@ -537,11 +552,11 @@ public abstract class Drawable {
public Region getTransparentRegion() {
return null;
}
-
+
/**
* Override this in your subclass to change appearance if you recognize the
* specified state.
- *
+ *
* @return Returns true if the state change has caused the appearance of
* the Drawable to change (that is, it needs to be drawn), else false
* if it looks the same and there is no need to redraw it since its
@@ -577,13 +592,13 @@ public abstract class Drawable {
public int getIntrinsicHeight() {
return -1;
}
-
+
/**
* Returns the minimum width suggested by this Drawable. If a View uses this
* Drawable as a background, it is suggested that the View use at least this
* value for its width. (There will be some scenarios where this will not be
* possible.) This value should INCLUDE any padding.
- *
+ *
* @return The minimum width suggested by this Drawable. If this Drawable
* doesn't have a suggested minimum width, 0 is returned.
*/
@@ -597,7 +612,7 @@ public abstract class Drawable {
* Drawable as a background, it is suggested that the View use at least this
* value for its height. (There will be some scenarios where this will not be
* possible.) This value should INCLUDE any padding.
- *
+ *
* @return The minimum height suggested by this Drawable. If this Drawable
* doesn't have a suggested minimum height, 0 is returned.
*/
@@ -605,7 +620,7 @@ public abstract class Drawable {
final int intrinsicHeight = getIntrinsicHeight();
return intrinsicHeight > 0 ? intrinsicHeight : 0;
}
-
+
/**
* Return in padding the insets suggested by this Drawable for placing
* content inside the drawable's bounds. Positive values move toward the
@@ -643,7 +658,7 @@ public abstract class Drawable {
/**
* Create a drawable from an inputstream
- *
+ *
* @hide pending API council approval
*/
public static Drawable createFromResourceStream(Resources res, TypedValue value,
diff --git a/include/ui/Camera.h b/include/ui/Camera.h
index e593fea..fd851d9 100644
--- a/include/ui/Camera.h
+++ b/include/ui/Camera.h
@@ -78,8 +78,7 @@ class Camera : public BnCameraClient, public IBinder::DeathRecipient
{
public:
// construct a camera client from an existing remote
- Camera(const sp<ICamera>& camera);
-
+ static sp<Camera> create(const sp<ICamera>& camera);
static sp<Camera> connect();
~Camera();
void init();
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index d01d83f..9b8c302 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -988,119 +988,225 @@ struct ResTable_config
return diffs;
}
- // Return true if 'this' is more specific than 'o'. Optionally, if
- // 'requested' is null, then they will also be compared against the
- // requested configuration and true will only be returned if 'this'
- // is a better candidate than 'o' for the configuration. This assumes that
- // match() has already been used to remove any configurations that don't
- // match the requested configuration at all; if they are not first filtered,
- // non-matching results can be considered better than matching ones.
+ // Return true if 'this' is more specific than 'o'.
inline bool
- isBetterThan(const ResTable_config& o, const ResTable_config* requested = NULL) const {
+ isMoreSpecificThan(const ResTable_config& o) const {
// The order of the following tests defines the importance of one
// configuration parameter over another. Those tests first are more
// important, trumping any values in those following them.
- if (imsi != 0 && (!requested || requested->imsi != 0)) {
- if (mcc != 0 && (!requested || requested->mcc != 0)) {
- if (o.mcc == 0) {
- return true;
- }
+ if (imsi || o.imsi) {
+ if (mcc != o.mcc) {
+ if (!mcc) return false;
+ if (!o.mcc) return true;
}
- if (mnc != 0 && (!requested || requested->mnc != 0)) {
- if (o.mnc == 0) {
- return true;
- }
+
+ if (mnc != o.mnc) {
+ if (!mnc) return false;
+ if (!o.mnc) return true;
}
}
- if (locale != 0 && (!requested || requested->locale != 0)) {
- if (language[0] != 0 && (!requested || requested->language[0] != 0)) {
- if (o.language[0] == 0) {
- return true;
- }
+
+ if (locale || o.locale) {
+ if (language[0] != o.language[0]) {
+ if (!language[0]) return false;
+ if (!o.language[0]) return true;
}
- if (country[0] != 0 && (!requested || requested->country[0] != 0)) {
- if (o.country[0] == 0) {
- return true;
- }
+
+ if (country[0] != o.country[0]) {
+ if (!country[0]) return false;
+ if (!o.country[0]) return true;
}
}
- if (screenType != 0 && (!requested || requested->screenType != 0)) {
- if (orientation != 0 && (!requested || requested->orientation != 0)) {
- if (o.orientation == 0) {
- return true;
- }
+
+ if (screenType || o.screenType) {
+ if (orientation != o.orientation) {
+ if (!orientation) return false;
+ if (!o.orientation) return true;
}
- if (density != 0 && (!requested || requested->density != 0)) {
- if (o.density == 0) {
- return true;
- }
+
+ // density is never 'more specific'
+ // as the default just equals 160
+
+ if (touchscreen != o.touchscreen) {
+ if (!touchscreen) return false;
+ if (!o.touchscreen) return true;
}
- if (touchscreen != 0 && (!requested || requested->touchscreen != 0)) {
- if (o.touchscreen == 0) {
- return true;
- }
+ }
+
+ if (input || o.input) {
+ if (inputFlags != o.inputFlags) {
+ if (!(inputFlags & MASK_KEYSHIDDEN)) return false;
+ if (!(o.inputFlags & MASK_KEYSHIDDEN)) return true;
+ }
+
+ if (keyboard != o.keyboard) {
+ if (!keyboard) return false;
+ if (!o.keyboard) return true;
+ }
+
+ if (navigation != o.navigation) {
+ if (!navigation) return false;
+ if (!o.navigation) return true;
}
}
- if (input != 0 && (!requested || requested->input != 0)) {
- const int keysHidden = inputFlags&MASK_KEYSHIDDEN;
- const int reqKeysHidden = requested
- ? requested->inputFlags&MASK_KEYSHIDDEN : 0;
- if (keysHidden != 0 && reqKeysHidden != 0) {
- const int oKeysHidden = o.inputFlags&MASK_KEYSHIDDEN;
- //LOGI("isBetterThan keysHidden: cur=%d, given=%d, config=%d\n",
- // keysHidden, oKeysHidden, reqKeysHidden);
- if (oKeysHidden == 0) {
- //LOGI("Better because 0!");
- return true;
+
+ if (screenSize || o.screenSize) {
+ if (screenWidth != o.screenWidth) {
+ if (!screenWidth) return false;
+ if (!o.screenWidth) return true;
+ }
+
+ if (screenHeight != o.screenHeight) {
+ if (!screenHeight) return false;
+ if (!o.screenHeight) return true;
+ }
+ }
+
+ if (version || o.version) {
+ if (sdkVersion != o.sdkVersion) {
+ if (!sdkVersion) return false;
+ if (!o.sdkVersion) return true;
+ }
+
+ if (minorVersion != o.minorVersion) {
+ if (!minorVersion) return false;
+ if (!o.minorVersion) return true;
+ }
+ }
+ return false;
+ }
+
+ // Return true if 'this' is a better match than 'o' for the 'requested'
+ // configuration. This assumes that match() has already been used to
+ // remove any configurations that don't match the requested configuration
+ // at all; if they are not first filtered, non-matching results can be
+ // considered better than matching ones.
+ // The general rule per attribute: if the request cares about an attribute
+ // (it normally does), if the two (this and o) are equal it's a tie. If
+ // they are not equal then one must be generic because only generic and
+ // '==requested' will pass the match() call. So if this is not generic,
+ // it wins. If this IS generic, o wins (return false).
+ inline bool
+ isBetterThan(const ResTable_config& o,
+ const ResTable_config* requested) const {
+ if (requested) {
+ if (imsi || o.imsi) {
+ if ((mcc != o.mcc) && requested->mcc) {
+ return (mcc);
}
- // For compatibility, we count KEYSHIDDEN_NO as being
- // the same as KEYSHIDDEN_SOFT. Here we disambiguate these
- // may making an exact match more specific.
- if (keysHidden == reqKeysHidden && oKeysHidden != reqKeysHidden) {
- // The current configuration is an exact match, and
- // the given one is not, so the current one is better.
- //LOGI("Better because other not same!");
- return true;
+
+ if ((mnc != o.mnc) && requested->mnc) {
+ return (mnc);
}
}
- if (keyboard != 0 && (!requested || requested->keyboard != 0)) {
- if (o.keyboard == 0) {
- return true;
+
+ if (locale || o.locale) {
+ if ((language[0] != o.language[0]) && requested->language[0]) {
+ return (language[0]);
}
- }
- if (navigation != 0 && (!requested || requested->navigation != 0)) {
- if (o.navigation == 0) {
- return true;
+
+ if ((country[0] != o.country[0]) && requested->country[0]) {
+ return (country[0]);
}
}
- }
- if (screenSize != 0 && (!requested || requested->screenSize != 0)) {
- if (screenWidth != 0 && (!requested || requested->screenWidth != 0)) {
- if (o.screenWidth == 0) {
- return true;
+
+ if (screenType || o.screenType) {
+ if ((orientation != o.orientation) && requested->orientation) {
+ return (orientation);
+ }
+
+ if (density != o.density) {
+ // density is tough. Any density is potentially useful
+ // because the system will scale it. Scaling down
+ // is generally better than scaling up.
+ // Default density counts as 160dpi (the system default)
+ // TODO - remove 160 constants
+ int h = (density?density:160);
+ int l = (o.density?o.density:160);
+ bool bImBigger = true;
+ if (l > h) {
+ int t = h;
+ h = l;
+ l = t;
+ bImBigger = false;
+ }
+
+ int reqValue = (requested->density?requested->density:160);
+ if (reqValue >= h) {
+ // requested value higher than both l and h, give h
+ return bImBigger;
+ }
+ if (l >= reqValue) {
+ // requested value lower than both l and h, give l
+ return !bImBigger;
+ }
+ // saying that scaling down is 2x better than up
+ if (((2 * l) - reqValue) * h > reqValue * reqValue) {
+ return !bImBigger;
+ } else {
+ return bImBigger;
+ }
+ }
+
+ if ((touchscreen != o.touchscreen) && requested->touchscreen) {
+ return (touchscreen);
}
}
- if (screenHeight != 0 && (!requested || requested->screenHeight != 0)) {
- if (o.screenHeight == 0) {
- return true;
+
+ if (input || o.input) {
+ const int keysHidden = inputFlags & MASK_KEYSHIDDEN;
+ const int oKeysHidden = o.inputFlags & MASK_KEYSHIDDEN;
+ if (keysHidden != oKeysHidden) {
+ const int reqKeysHidden =
+ requested->inputFlags & MASK_KEYSHIDDEN;
+ if (reqKeysHidden) {
+
+ if (!keysHidden) return false;
+ if (!oKeysHidden) return true;
+ // For compatibility, we count KEYSHIDDEN_NO as being
+ // the same as KEYSHIDDEN_SOFT. Here we disambiguate
+ // these by making an exact match more specific.
+ if (reqKeysHidden == keysHidden) return true;
+ if (reqKeysHidden == oKeysHidden) return false;
+ }
+ }
+
+ if ((keyboard != o.keyboard) && requested->keyboard) {
+ return (keyboard);
+ }
+
+ if ((navigation != o.navigation) && requested->navigation) {
+ return (navigation);
}
}
- }
- if (version != 0 && (!requested || requested->version != 0)) {
- if (sdkVersion != 0 && (!requested || requested->sdkVersion != 0)) {
- if (o.sdkVersion == 0) {
- return true;
+
+ if (screenSize || o.screenSize) {
+ if ((screenWidth != o.screenWidth) && requested->screenWidth) {
+ return (screenWidth);
+ }
+
+ if ((screenHeight != o.screenHeight) &&
+ requested->screenHeight) {
+ return (screenHeight);
}
}
- if (minorVersion != 0 && (!requested || requested->minorVersion != 0)) {
- if (o.minorVersion == 0) {
- return true;
+
+ if (version || o.version) {
+ if ((sdkVersion != o.sdkVersion) && requested->sdkVersion) {
+ return (sdkVersion);
+ }
+
+ if ((minorVersion != o.minorVersion) &&
+ requested->minorVersion) {
+ return (minorVersion);
}
}
+
+ return false;
}
- return false;
+ return isMoreSpecificThan(o);
}
-
+
// Return true if 'this' can be considered a match for the parameters in
// 'settings'.
// Note this is asymetric. A default piece of data will match every request
@@ -1137,8 +1243,7 @@ struct ResTable_config
&& orientation != settings.orientation) {
return false;
}
- // Density not taken into account, always match, no matter what
- // density is specified for the resource
+ // density always matches - we can scale it. See isBetterThan
if (settings.touchscreen != 0 && touchscreen != 0
&& touchscreen != settings.touchscreen) {
return false;
diff --git a/include/utils/threads.h b/include/utils/threads.h
index 8d8d46a..b320915 100644
--- a/include/utils/threads.h
+++ b/include/utils/threads.h
@@ -79,6 +79,13 @@ enum {
ANDROID_PRIORITY_LESS_FAVORABLE = +1,
};
+enum {
+ ANDROID_TGROUP_DEFAULT = 0,
+ ANDROID_TGROUP_BG_NONINTERACT = 1,
+ ANDROID_TGROUP_FG_BOOST = 2,
+ ANDROID_TGROUP_MAX = ANDROID_TGROUP_FG_BOOST,
+};
+
// Create and run a new thread.
extern int androidCreateThread(android_thread_func_t, void *);
diff --git a/libs/surfaceflinger/GPUHardware/GPUHardware.cpp b/libs/surfaceflinger/GPUHardware/GPUHardware.cpp
index eb75f99..7168bf2 100644
--- a/libs/surfaceflinger/GPUHardware/GPUHardware.cpp
+++ b/libs/surfaceflinger/GPUHardware/GPUHardware.cpp
@@ -573,7 +573,11 @@ void GPUHardware::binderDied(const wp<IBinder>& who)
sp<GPUHardwareInterface> GPUFactory::getGPU()
{
- return new GPUHardware();
+ sp<GPUHardwareInterface> gpu;
+ if (access("/dev/hw3d", F_OK) == 0) {
+ gpu = new GPUHardware();
+ }
+ return gpu;
}
// ---------------------------------------------------------------------------
diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp
index 182fbb2..8a7d467 100644
--- a/libs/surfaceflinger/Layer.cpp
+++ b/libs/surfaceflinger/Layer.cpp
@@ -118,7 +118,7 @@ status_t Layer::setBuffers( Client* client,
if (flags & ISurfaceComposer::eSecure)
bufferFlags |= Buffer::SECURE;
-
+ /* FIXME we need this code for msm7201A
if (bufferFlags & Buffer::GPU) {
// FIXME: this is msm7201A specific, as its GPU only supports
// BGRA_8888.
@@ -126,6 +126,7 @@ status_t Layer::setBuffers( Client* client,
format = PIXEL_FORMAT_BGRA_8888;
}
}
+ */
mSecure = (bufferFlags & Buffer::SECURE) ? true : false;
mNeedsBlending = (info.h_alpha - info.l_alpha) > 0;
diff --git a/libs/surfaceflinger/VRamHeap.cpp b/libs/surfaceflinger/VRamHeap.cpp
index 0ccd71f..238c602 100644
--- a/libs/surfaceflinger/VRamHeap.cpp
+++ b/libs/surfaceflinger/VRamHeap.cpp
@@ -98,7 +98,7 @@ sp<MemoryDealer> SurfaceHeapManager::createHeap(
}
}
- if (flags & ISurfaceComposer::eGPU) {
+ if ((flags & ISurfaceComposer::eGPU) && (mFlinger->getGPU() != 0)) {
// FIXME: this is msm7201A specific, where gpu surfaces may not be secure
if (!(flags & ISurfaceComposer::eSecure)) {
// if GPU doesn't work, we try eHardware
diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp
index b3cbda1..41577c4 100644
--- a/libs/ui/Camera.cpp
+++ b/libs/ui/Camera.cpp
@@ -64,15 +64,22 @@ Camera::Camera()
init();
}
-Camera::Camera(const sp<ICamera>& camera)
+// construct a camera client from an existing camera remote
+sp<Camera> Camera::create(const sp<ICamera>& camera)
{
- init();
- // connect this client to existing camera remote
- if (camera->connect(this) == NO_ERROR) {
- mStatus = NO_ERROR;
- mCamera = camera;
- camera->asBinder()->linkToDeath(this);
+ LOGV("create");
+ if (camera == 0) {
+ LOGE("camera remote is a NULL pointer");
+ return 0;
+ }
+
+ sp<Camera> c = new Camera();
+ if (camera->connect(c) == NO_ERROR) {
+ c->mStatus = NO_ERROR;
+ c->mCamera = camera;
+ camera->asBinder()->linkToDeath(c);
}
+ return c;
}
void Camera::init()
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 2ad3bfe..3d12dca 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -1820,7 +1820,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag
}
}
- if (bestPackage != NULL && bestItem.isBetterThan(thisConfig)) {
+ if (bestPackage != NULL && bestItem.isMoreSpecificThan(thisConfig)) {
continue;
}
diff --git a/location/data/Android.mk b/location/data/Android.mk
deleted file mode 100644
index 794e6c7..0000000
--- a/location/data/Android.mk
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Install 3 sample gps files (nmea, location, and properties)
-# for use with the SDK
-#
-
-# where to install the sample files on the device
-#
-local_target_dir := $(TARGET_OUT_DATA)/location
-
-########################
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := nmea
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(local_target_dir)/gps
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
-########################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := location
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(local_target_dir)/gps
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
-########################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := properties
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(local_target_dir)/gps
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
-########################
diff --git a/location/data/kml/kml b/location/data/kml/kml
deleted file mode 100644
index e1d98b8..0000000
--- a/location/data/kml/kml
+++ /dev/null
@@ -1,2 +0,0 @@
-<coordinates>003405.000,3725.3433,12205.7921 003405.000,3725.3433,12205.7921</coordinates>
-<coordinates>003405.000,3725.3433,12205.7921 003405.000,3725.3433,12205.7921</coordinates>
diff --git a/location/data/kml/properties b/location/data/kml/properties
deleted file mode 100644
index 42d319f..0000000
--- a/location/data/kml/properties
+++ /dev/null
@@ -1,11 +0,0 @@
-requiresNetwork false
-requiresSatellite false
-requiresCell true
-hasMonetaryCost false
-supportsAltitude true
-supportsBearing false
-supportsSpeed true
-repeat true
-accuracy 2
-powerRequirement 2
-trackSpeed 100
diff --git a/location/data/location b/location/data/location
deleted file mode 100644
index 1c0c986..0000000
--- a/location/data/location
+++ /dev/null
@@ -1 +0,0 @@
-gps,1193789209,37.42238666666666666666,-122.096535,0,0,0
diff --git a/location/data/nmea b/location/data/nmea
deleted file mode 100644
index 1b6b45b..0000000
--- a/location/data/nmea
+++ /dev/null
@@ -1,162 +0,0 @@
-$GPRMC,003350.000,A,3725.3432,N,12205.7921,W,0.06,151.59,061007,,,D*7F
-$GPRMC,003355.000,A,3725.3430,N,12205.7920,W,0.18,109.49,061007,,,D*7A
-$GPRMC,003400.000,A,3725.3433,N,12205.7921,W,0.02,227.11,061007,,,D*76
-$GPRMC,003405.000,A,3725.3433,N,12205.7921,W,0.17,103.32,061007,,,D*73
-$GPRMC,003410.000,A,3725.3431,N,12205.7921,W,0.22,167.43,061007,,,D*77
-$GPRMC,003415.000,A,3725.3427,N,12205.7921,W,0.23,246.49,061007,,,D*7E
-$GPRMC,003420.000,A,3725.3423,N,12205.7917,W,0.16,74.88,061007,,,D*41
-$GPRMC,003425.000,A,3725.3426,N,12205.7919,W,0.05,124.94,061007,,,D*74
-$GPRMC,003430.000,A,3725.3429,N,12205.7919,W,0.15,77.12,061007,,,D*47
-$GPRMC,003435.000,A,3725.3432,N,12205.7921,W,0.07,94.72,061007,,,D*4B
-$GPRMC,003440.000,A,3725.3436,N,12205.7921,W,0.13,336.72,061007,,,D*73
-$GPRMC,003445.000,A,3725.3440,N,12205.7953,W,2.72,278.90,061007,,,D*70
-$GPRMC,003450.000,A,3725.3442,N,12205.7977,W,2.02,164.81,061007,,,D*79
-$GPRMC,003455.000,A,3725.3380,N,12205.8008,W,8.28,200.23,061007,,,D*70
-$GPRMC,003500.000,A,3725.3207,N,12205.8057,W,14.04,189.77,061007,,,D*45
-$GPRMC,003505.000,A,3725.3032,N,12205.8094,W,11.67,205.32,061007,,,D*4D
-$GPRMC,003510.000,A,3725.2988,N,12205.8295,W,17.09,271.31,061007,,,D*4D
-$GPRMC,003515.000,A,3725.3005,N,12205.8672,W,25.02,273.74,061007,,,D*41
-$GPRMC,003520.000,A,3725.3030,N,12205.9159,W,29.84,273.27,061007,,,D*4A
-$GPRMC,003525.000,A,3725.3061,N,12205.9683,W,28.20,274.26,061007,,,D*42
-$GPRMC,003530.000,A,3725.3092,N,12206.0150,W,25.25,274.96,061007,,,D*4A
-$GPRMC,003535.000,A,3725.3124,N,12206.0503,W,12.55,276.56,061007,,,D*4C
-$GPRMC,003540.000,A,3725.3135,N,12206.0637,W,3.99,272.32,061007,,,D*7C
-$GPRMC,003545.000,A,3725.3140,N,12206.0701,W,2.80,273.59,061007,,,D*7A
-$GPRMC,003550.000,A,3725.3143,N,12206.0734,W,0.84,266.99,061007,,,D*75
-$GPRMC,003555.000,A,3725.3142,N,12206.0731,W,0.13,157.63,061007,,,D*7E
-$GPRMC,003600.000,A,3725.3142,N,12206.0729,W,0.16,239.76,061007,,,D*7E
-$GPRMC,003605.000,A,3725.3141,N,12206.0726,W,0.15,199.57,061007,,,D*7E
-$GPRMC,003610.000,A,3725.3141,N,12206.0724,W,0.07,161.75,061007,,,D*7C
-$GPRMC,003615.000,A,3725.3141,N,12206.0721,W,0.14,171.95,061007,,,D*71
-$GPRMC,003620.000,A,3725.3141,N,12206.0718,W,0.12,188.87,061007,,,D*7E
-$GPRMC,003625.000,A,3725.3141,N,12206.0716,W,0.14,164.43,061007,,,D*79
-$GPRMC,003630.000,A,3725.3141,N,12206.0714,W,0.10,186.09,061007,,,D*79
-$GPRMC,003635.000,A,3725.3142,N,12206.0716,W,0.09,224.65,061007,,,D*74
-$GPRMC,003640.000,A,3725.3142,N,12206.0716,W,0.09,187.23,061007,,,D*7E
-$GPRMC,003645.000,A,3725.3143,N,12206.0716,W,0.14,229.41,061007,,,D*75
-$GPRMC,003650.000,A,3725.3143,N,12206.0716,W,0.14,195.40,061007,,,D*74
-$GPRMC,003655.000,A,3725.3143,N,12206.0716,W,0.51,267.41,061007,,,D*7F
-$GPRMC,003700.000,A,3725.3148,N,12206.0813,W,9.83,274.54,061007,,,D*7F
-$GPRMC,003705.000,A,3725.3247,N,12206.0930,W,15.25,357.95,061007,,,D*4A
-$GPRMC,003710.000,A,3725.3558,N,12206.0907,W,27.03,4.83,061007,,,D*44
-$GPRMC,003715.000,A,3725.3993,N,12206.0862,W,34.76,4.78,061007,,,D*4C
-$GPRMC,003720.000,A,3725.4514,N,12206.0802,W,39.38,5.62,061007,,,D*45
-$GPRMC,003725.000,A,3725.5072,N,12206.0756,W,38.59,358.11,061007,,,D*43
-$GPRMC,003730.000,A,3725.5581,N,12206.0877,W,36.13,344.59,061007,,,D*43
-$GPRMC,003735.000,A,3725.6078,N,12206.1038,W,36.78,348.75,061007,,,D*4B
-$GPRMC,003740.000,A,3725.6604,N,12206.1021,W,37.66,14.75,061007,,,D*78
-$GPRMC,003745.000,A,3725.7064,N,12206.0817,W,32.70,20.79,061007,,,D*79
-$GPRMC,003750.000,A,3725.7482,N,12206.0613,W,31.70,20.73,061007,,,D*72
-$GPRMC,003755.000,A,3725.7841,N,12206.0458,W,25.05,16.94,061007,,,D*72
-$GPRMC,003800.000,A,3725.8137,N,12206.0368,W,16.01,11.76,061007,,,D*71
-$GPRMC,003805.000,A,3725.8266,N,12206.0341,W,2.45,9.89,061007,,,D*74
-$GPRMC,003810.000,A,3725.8273,N,12206.0340,W,1.42,8.42,061007,,,D*77
-$GPRMC,003815.000,A,3725.8287,N,12206.0340,W,3.02,8.77,061007,,,D*79
-$GPRMC,003820.000,A,3725.8402,N,12206.0321,W,11.90,7.87,061007,,,D*4B
-$GPRMC,003825.000,A,3725.8520,N,12206.0422,W,12.90,274.31,061007,,,D*43
-$GPRMC,003830.000,A,3725.8386,N,12206.0610,W,17.45,193.03,061007,,,D*48
-$GPRMC,003835.000,A,3725.8082,N,12206.0693,W,25.06,193.69,061007,,,D*4B
-$GPRMC,003840.000,A,3725.7732,N,12206.0836,W,24.74,216.89,061007,,,D*4F
-$GPRMC,003845.000,A,3725.7672,N,12206.1208,W,23.64,296.05,061007,,,D*43
-$GPRMC,003850.000,A,3725.7944,N,12206.1530,W,30.80,314.88,061007,,,D*47
-$GPRMC,003855.000,A,3725.8272,N,12206.1893,W,31.57,318.18,061007,,,D*49
-$GPRMC,003900.000,A,3725.8605,N,12206.2264,W,31.13,318.65,061007,,,D*47
-$GPRMC,003905.000,A,3725.8939,N,12206.2625,W,32.39,318.52,061007,,,A*49
-$GPRMC,003910.000,A,3725.9297,N,12206.2994,W,33.37,319.89,061007,,,A*4E
-$GPRMC,003915.000,A,3725.9666,N,12206.3378,W,34.92,320.36,061007,,,A*4E
-$GPRMC,003920.000,A,3726.0048,N,12206.3777,W,35.91,319.96,061007,,,A*41
-$GPRMC,003925.000,A,3726.0439,N,12206.4186,W,36.78,319.98,061007,,,A*43
-$GPRMC,003930.000,A,3726.0837,N,12206.4602,W,37.26,320.27,061007,,,A*4A
-$GPRMC,003935.000,A,3726.1240,N,12206.5024,W,37.88,320.27,061007,,,A*43
-$GPRMC,003940.000,A,3726.1647,N,12206.5449,W,37.95,319.99,061007,,,A*4E
-$GPRMC,003945.000,A,3726.2055,N,12206.5874,W,37.24,320.06,061007,,,A*49
-$GPRMC,003950.000,A,3726.2438,N,12206.6274,W,34.50,320.25,061007,,,A*4A
-$GPRMC,003955.000,A,3726.2805,N,12206.6661,W,34.75,319.90,061007,,,A*4E
-$GPRMC,004000.000,A,3726.3181,N,12206.7054,W,35.63,320.23,061007,,,A*41
-$GPRMC,004005.000,A,3726.3570,N,12206.7462,W,36.84,320.29,061007,,,A*4F
-$GPRMC,004010.000,A,3726.3961,N,12206.7872,W,35.85,320.09,061007,,,A*4A
-$GPRMC,004015.000,A,3726.4343,N,12206.8276,W,36.84,320.17,061007,,,A*4E
-$GPRMC,004020.000,A,3726.4759,N,12206.8712,W,40.53,320.65,061007,,,A*4E
-$GPRMC,004025.000,A,3726.5190,N,12206.9164,W,39.54,320.13,061007,,,A*47
-$GPRMC,004030.000,A,3726.5607,N,12206.9605,W,38.84,319.99,061007,,,A*4E
-$GPRMC,004035.000,A,3726.6010,N,12207.0030,W,36.82,320.30,061007,,,A*41
-$GPRMC,004040.000,A,3726.6413,N,12207.0416,W,35.63,328.90,061007,,,A*4A
-$GPRMC,004045.000,A,3726.6861,N,12207.0652,W,35.49,342.93,061007,,,A*43
-$GPRMC,004050.000,A,3726.7346,N,12207.0842,W,37.15,342.57,061007,,,A*44
-$GPRMC,004055.000,A,3726.7834,N,12207.1033,W,36.68,342.14,061007,,,A*4C
-$GPRMC,004100.000,A,3726.8328,N,12207.1225,W,36.73,343.04,061007,,,D*4E
-$GPRMC,004105.000,A,3726.8795,N,12207.1405,W,33.44,343.08,061007,,,D*40
-$GPRMC,004110.000,A,3726.9211,N,12207.1570,W,28.00,343.17,061007,,,D*4B
-$GPRMC,004115.000,A,3726.9507,N,12207.1678,W,18.59,345.92,061007,,,D*41
-$GPRMC,004120.000,A,3726.9639,N,12207.1722,W,3.24,343.37,061007,,,D*7E
-$GPRMC,004125.000,A,3726.9641,N,12207.1725,W,0.21,154.73,061007,,,D*71
-$GPRMC,004130.000,A,3726.9634,N,12207.1722,W,0.16,105.89,061007,,,D*75
-$GPRMC,004135.000,A,3726.9630,N,12207.1720,W,0.04,133.97,061007,,,D*7F
-$GPRMC,004140.000,A,3726.9627,N,12207.1718,W,0.16,107.47,061007,,,D*79
-$GPRMC,004145.000,A,3726.9625,N,12207.1716,W,0.14,148.73,061007,,,D*7E
-$GPRMC,004150.000,A,3726.9621,N,12207.1715,W,0.09,142.18,061007,,,D*76
-$GPRMC,004155.000,A,3726.9620,N,12207.1714,W,0.10,95.75,061007,,,D*4B
-$GPRMC,004200.000,A,3726.9618,N,12207.1714,W,0.07,135.28,061007,,,D*76
-$GPRMC,004205.000,A,3726.9617,N,12207.1713,W,0.14,86.20,061007,,,D*48
-$GPRMC,004210.000,A,3726.9616,N,12207.1713,W,0.05,130.34,061007,,,D*74
-$GPRMC,004215.000,A,3726.9614,N,12207.1714,W,0.08,120.53,061007,,,D*79
-$GPRMC,004220.000,A,3726.9612,N,12207.1714,W,0.09,147.27,061007,,,D*7A
-$GPRMC,004225.000,A,3726.9612,N,12207.1715,W,0.12,118.20,061007,,,D*79
-$GPRMC,004230.000,A,3726.9612,N,12207.1714,W,0.12,90.61,061007,,,D*48
-$GPRMC,004235.000,A,3726.9612,N,12207.1715,W,0.10,156.15,061007,,,D*76
-$GPRMC,004240.000,A,3726.9612,N,12207.1715,W,0.13,104.74,061007,,,D*77
-$GPRMC,004245.000,A,3726.9617,N,12207.1716,W,2.21,343.16,061007,,,D*72
-$GPRMC,004250.000,A,3726.9756,N,12207.1772,W,15.37,342.52,061007,,,D*40
-$GPRMC,004255.000,A,3726.9950,N,12207.1942,W,16.40,298.08,061007,,,D*4A
-$GPRMC,004300.000,A,3726.9896,N,12207.2215,W,18.97,241.60,061007,,,D*44
-$GPRMC,004305.000,A,3726.9801,N,12207.2558,W,22.01,268.09,061007,,,D*43
-$GPRMC,004310.000,A,3726.9908,N,12207.2943,W,24.76,304.28,061007,,,D*47
-$GPRMC,004315.000,A,3727.0088,N,12207.3347,W,27.35,295.83,061007,,,D*48
-$GPRMC,004320.000,A,3727.0117,N,12207.3855,W,28.97,271.02,061007,,,D*45
-$GPRMC,004325.000,A,3727.0211,N,12207.4306,W,22.94,303.62,061007,,,D*44
-$GPRMC,004330.000,A,3727.0358,N,12207.4491,W,8.59,313.76,061007,,,D*78
-$GPRMC,004335.000,A,3727.0409,N,12207.4550,W,2.33,313.55,061007,,,D*75
-$GPRMC,004340.000,A,3727.0433,N,12207.4578,W,5.75,314.25,061007,,,D*71
-$GPRMC,004345.000,A,3727.0533,N,12207.4704,W,12.55,314.18,061007,,,D*46
-$GPRMC,004350.000,A,3727.0676,N,12207.4892,W,16.68,312.98,061007,,,D*44
-$GPRMC,004355.000,A,3727.0835,N,12207.5103,W,15.11,313.21,061007,,,D*46
-$GPRMC,004400.000,A,3727.0969,N,12207.5285,W,10.26,312.85,061007,,,D*4A
-$GPRMC,004405.000,A,3727.1006,N,12207.5334,W,0.33,319.16,061007,,,D*71
-$GPRMC,004410.000,A,3727.1007,N,12207.5333,W,0.19,144.98,061007,,,D*77
-$GPRMC,004415.000,A,3727.1005,N,12207.5330,W,0.05,106.63,061007,,,D*7C
-$GPRMC,004420.000,A,3727.1006,N,12207.5327,W,0.05,92.53,061007,,,D*40
-$GPRMC,004425.000,A,3727.1005,N,12207.5323,W,0.17,148.57,061007,,,D*73
-$GPRMC,004430.000,A,3727.1037,N,12207.5355,W,8.70,314.52,061007,,,D*70
-$GPRMC,004435.000,A,3727.1168,N,12207.5516,W,16.83,312.51,061007,,,D*49
-$GPRMC,004440.000,A,3727.1344,N,12207.5787,W,23.06,309.71,061007,,,D*4E
-$GPRMC,004445.000,A,3727.1572,N,12207.6136,W,27.67,308.29,061007,,,D*48
-$GPRMC,004450.000,A,3727.1821,N,12207.6558,W,31.56,306.08,061007,,,D*43
-$GPRMC,004455.000,A,3727.2083,N,12207.7008,W,30.81,306.19,061007,,,D*4F
-$GPRMC,004500.000,A,3727.2324,N,12207.7424,W,27.68,306.75,061007,,,D*41
-$GPRMC,004505.000,A,3727.2519,N,12207.7754,W,16.50,305.19,061007,,,D*48
-$GPRMC,004510.000,A,3727.2570,N,12207.7849,W,0.13,151.16,061007,,,D*7C
-$GPRMC,004515.000,A,3727.2619,N,12207.7927,W,14.27,311.27,061007,,,D*4A
-$GPRMC,004520.000,A,3727.2786,N,12207.8214,W,23.53,303.48,061007,,,D*42
-$GPRMC,004525.000,A,3727.2980,N,12207.8564,W,25.03,306.82,061007,,,D*4F
-$GPRMC,004530.000,A,3727.3199,N,12207.8936,W,27.48,306.29,061007,,,D*4D
-$GPRMC,004535.000,A,3727.3433,N,12207.9339,W,28.66,306.28,061007,,,D*4B
-$GPRMC,004540.000,A,3727.3666,N,12207.9740,W,28.04,306.12,061007,,,D*4C
-$GPRMC,004545.000,A,3727.3886,N,12208.0118,W,25.22,306.50,061007,,,D*4B
-$GPRMC,004550.000,A,3727.4091,N,12208.0461,W,23.34,306.68,061007,,,D*47
-$GPRMC,004555.000,A,3727.4291,N,12208.0747,W,19.76,317.26,061007,,,D*42
-$GPRMC,004600.000,A,3727.4497,N,12208.1015,W,24.00,309.28,061007,,,D*4E
-$GPRMC,004605.000,A,3727.4711,N,12208.1376,W,26.83,305.61,061007,,,D*48
-$GPRMC,004610.000,A,3727.4937,N,12208.1760,W,26.40,305.68,061007,,,D*43
-$GPRMC,004615.000,A,3727.5142,N,12208.2112,W,23.46,306.19,061007,,,D*4B
-$GPRMC,004620.000,A,3727.5326,N,12208.2431,W,21.96,304.30,061007,,,D*4F
-$GPRMC,004625.000,A,3727.5515,N,12208.2693,W,20.21,323.71,061007,,,D*4B
-$GPRMC,004630.000,A,3727.5788,N,12208.2812,W,21.00,352.36,061007,,,D*49
-$GPRMC,004635.000,A,3727.6048,N,12208.2846,W,14.79,351.69,061007,,,D*44
-$GPRMC,004640.000,A,3727.6217,N,12208.2861,W,6.38,359.46,061007,,,D*78
-$GPRMC,004645.000,A,3727.6322,N,12208.2880,W,10.02,331.10,061007,,,D*46
-$GPRMC,004650.000,A,3727.6394,N,12208.3010,W,6.76,277.11,061007,,,D*79
-$GPRMC,004655.000,A,3727.6382,N,12208.3058,W,1.58,256.67,061007,,,D*7E
-$GPRMC,004700.000,A,3727.6253,N,12208.3024,W,6.34,164.31,061007,,,A*70
-$GPRMC,004715.000,A,3727.5854,N,12208.3345,W,5.00,267.98,061007,,,A*79
-$GPRMC,004720.000,A,3727.5993,N,12208.3323,W,6.50,26.91,061007,,,A*4D
-$GPRMC,004725.000,A,3727.6123,N,12208.3159,W,13.14,44.68,061007,,,A*71
diff --git a/location/data/properties b/location/data/properties
deleted file mode 100644
index b6878af..0000000
--- a/location/data/properties
+++ /dev/null
@@ -1,10 +0,0 @@
-requiresNetwork false
-requiresSatellite false
-requiresCell false
-hasMonetaryCost false
-supportsAltitude true
-supportsBearing true
-supportsSpeed true
-repeat true
-accuracy 1
-powerRequirement 1
diff --git a/location/data/test/class b/location/data/test/class
deleted file mode 100644
index 495b172..0000000
--- a/location/data/test/class
+++ /dev/null
@@ -1 +0,0 @@
-android.test.TestLocationProvider
diff --git a/location/data/track/properties b/location/data/track/properties
deleted file mode 100644
index 1f1ed5e..0000000
--- a/location/data/track/properties
+++ /dev/null
@@ -1,10 +0,0 @@
-requiresNetwork true
-requiresSatellite false
-requiresCell false
-hasMonetaryCost false
-supportsAltitude true
-supportsBearing false
-supportsSpeed false
-repeat true
-accuracy 1
-powerRequirement 3
diff --git a/location/data/track/track b/location/data/track/track
deleted file mode 100644
index a69ba2a..0000000
--- a/location/data/track/track
+++ /dev/null
@@ -1 +0,0 @@
-00 003405.000 3725.3433 12205.7921 101.2 65.3
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 7d35814..096622a 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -45,7 +45,10 @@ interface ILocationManager
boolean addGpsStatusListener(IGpsStatusListener listener);
void removeGpsStatusListener(IGpsStatusListener listener);
-
+
+ // for reporting callback completion
+ void locationCallbackFinished(ILocationListener listener);
+
boolean sendExtraCommand(String provider, String command, inout Bundle extras);
void addProximityAlert(double latitude, double longitude, float distance,
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 0c7254e..dacfeb9 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -26,6 +26,8 @@ import android.os.Message;
import android.util.Config;
import android.util.Log;
+import com.android.internal.location.DummyLocationProvider;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -101,9 +103,6 @@ public class LocationManager {
*/
public static final String KEY_LOCATION_CHANGED = "location";
- /** @hide -- does this belong here? */
- public static final String PROVIDER_DIR = "/data/location";
-
/** @hide */
public static final String SYSTEM_DIR = "/data/system/location";
@@ -194,6 +193,11 @@ public class LocationManager {
mListener.onProviderDisabled((String) msg.obj);
break;
}
+ try {
+ mService.locationCallbackFinished(this);
+ } catch (RemoteException e) {
+ Log.e(TAG, "locationCallbackFinished: RemoteException", e);
+ }
}
}
/**
diff --git a/location/java/android/location/LocationProvider.java b/location/java/android/location/LocationProvider.java
index b1670d5..3faba58 100644
--- a/location/java/android/location/LocationProvider.java
+++ b/location/java/android/location/LocationProvider.java
@@ -47,8 +47,10 @@ public abstract class LocationProvider {
* consist only of the characters [a-zA-Z0-9].
*
* @throws IllegalArgumentException if name contains an illegal character
+ *
+ * {@hide}
*/
- LocationProvider(String name) {
+ public LocationProvider(String name) {
if (name.matches(BAD_CHARS_REGEX)) {
throw new IllegalArgumentException("name " + name +
" contains an illegal character");
diff --git a/location/java/android/location/DummyLocationProvider.java b/location/java/com/android/internal/location/DummyLocationProvider.java
index e1cd4e9..ff5e27b 100644
--- a/location/java/android/location/DummyLocationProvider.java
+++ b/location/java/com/android/internal/location/DummyLocationProvider.java
@@ -14,7 +14,9 @@
* limitations under the License.
*/
-package android.location;
+package com.android.internal.location;
+
+import android.location.LocationProvider;
/**
* A stub implementation of LocationProvider used by LocationManager.
@@ -24,7 +26,7 @@ package android.location;
*
* {@hide}
*/
-class DummyLocationProvider extends LocationProvider {
+public class DummyLocationProvider extends LocationProvider {
private static final String TAG = "DummyLocationProvider";
@@ -39,7 +41,7 @@ class DummyLocationProvider extends LocationProvider {
int mPowerRequirement;
int mAccuracy;
- /* package */ DummyLocationProvider(String name) {
+ public DummyLocationProvider(String name) {
super(name);
}
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index 924641c..57d3c53 100644
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -26,7 +26,6 @@ import android.location.ILocationManager;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
-import android.location.LocationProviderImpl;
import android.net.ConnectivityManager;
import android.net.SntpClient;
import android.os.Bundle;
@@ -153,8 +152,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
// true if we are enabled
private boolean mEnabled;
- // true if we are enabled for location updates
- private boolean mLocationTracking;
// true if we have network connectivity
private boolean mNetworkAvailable;
@@ -475,10 +472,7 @@ public class GpsLocationProvider extends LocationProviderImpl {
@Override
public void enableLocationTracking(boolean enable) {
- if (mLocationTracking == enable) {
- return;
- }
-
+ super.enableLocationTracking(enable);
if (enable) {
mFixRequestTime = System.currentTimeMillis();
mTTFF = 0;
@@ -487,12 +481,6 @@ public class GpsLocationProvider extends LocationProviderImpl {
} else {
stopNavigating();
}
- mLocationTracking = enable;
- }
-
- @Override
- public boolean isLocationTracking() {
- return mLocationTracking;
}
@Override
diff --git a/location/java/com/android/internal/location/GpsXtraDownloader.java b/location/java/com/android/internal/location/GpsXtraDownloader.java
index f69fe26..33ebce7 100644
--- a/location/java/com/android/internal/location/GpsXtraDownloader.java
+++ b/location/java/com/android/internal/location/GpsXtraDownloader.java
@@ -71,11 +71,11 @@ public class GpsXtraDownloader {
if (server1 != null) mXtraServers[count++] = server1;
if (server2 != null) mXtraServers[count++] = server2;
if (server3 != null) mXtraServers[count++] = server3;
- }
-
- // randomize first server
- Random random = new Random();
- mNextServerIndex = random.nextInt(count);
+
+ // randomize first server
+ Random random = new Random();
+ mNextServerIndex = random.nextInt(count);
+ }
}
byte[] downloadXtraData() {
diff --git a/location/java/android/location/LocationProviderImpl.java b/location/java/com/android/internal/location/LocationProviderImpl.java
index a20aa3c..fc830f5 100644
--- a/location/java/android/location/LocationProviderImpl.java
+++ b/location/java/com/android/internal/location/LocationProviderImpl.java
@@ -14,21 +14,18 @@
* limitations under the License.
*/
-package android.location;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+package com.android.internal.location;
+import android.location.ILocationManager;
+import android.location.Location;
+import android.location.LocationProvider;
import android.os.Bundle;
import android.os.RemoteException;
-import android.util.Config;
import android.util.Log;
+import java.util.ArrayList;
+import java.util.HashMap;
+
/**
* An abstract superclass for location provider implementations.
* Location provider implementations are typically instantiated by the
@@ -64,57 +61,14 @@ public abstract class LocationProviderImpl extends LocationProvider {
sProvidersByName.remove(provider.getName());
}
- public static List<LocationProviderImpl> getProviders() {
- return new ArrayList<LocationProviderImpl>(sProviders);
+ public static ArrayList<LocationProviderImpl> getProviders() {
+ return sProviders;
}
public static LocationProviderImpl getProvider(String name) {
return sProvidersByName.get(name);
}
- public static LocationProviderImpl loadFromClass(File classFile) {
- if (!classFile.exists()) {
- return null;
- }
- if (Config.LOGD) {
- Log.d(TAG, "Loading class specifier file " + classFile.getPath());
- }
- String className = null;
- try {
- BufferedReader br =
- new BufferedReader(new FileReader(classFile), 8192);
- className = br.readLine();
- br.close();
- Class providerClass = Class.forName(className);
- if (Config.LOGD) {
- Log.d(TAG, "Loading provider class " + providerClass.getName());
- }
- LocationProviderImpl provider =
- (LocationProviderImpl) providerClass.newInstance();
- if (Config.LOGD) {
- Log.d(TAG, "Got provider instance " + provider);
- }
-
- return provider;
- } catch (IOException ioe) {
- Log.e(TAG, "IOException loading config file " +
- classFile.getPath(), ioe);
- } catch (IllegalAccessException iae) {
- Log.e(TAG, "IllegalAccessException loading class " +
- className, iae);
- } catch (InstantiationException ie) {
- Log.e(TAG, "InstantiationException loading class " +
- className, ie);
- } catch (ClassNotFoundException cnfe) {
- Log.e(TAG, "ClassNotFoundException loading class " +
- className, cnfe);
- } catch (ClassCastException cce) {
- Log.e(TAG, "ClassCastException loading class " +
- className, cce);
- }
- return null;
- }
-
public void reportLocationChanged(Location location) {
try {
mLocationManager.setLocation(location);
diff --git a/location/java/com/android/internal/location/LocationProviderProxy.java b/location/java/com/android/internal/location/LocationProviderProxy.java
index 72dd07d..d3c86db 100644
--- a/location/java/com/android/internal/location/LocationProviderProxy.java
+++ b/location/java/com/android/internal/location/LocationProviderProxy.java
@@ -21,7 +21,6 @@ import android.location.ILocationManager;
import android.location.ILocationProvider;
import android.location.Location;
import android.location.LocationManager;
-import android.location.LocationProviderImpl;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
diff --git a/location/java/com/android/internal/location/MockProvider.java b/location/java/com/android/internal/location/MockProvider.java
index c8d5b4f..6336e2b 100644
--- a/location/java/com/android/internal/location/MockProvider.java
+++ b/location/java/com/android/internal/location/MockProvider.java
@@ -18,7 +18,6 @@ package com.android.internal.location;
import android.location.ILocationManager;
import android.location.Location;
-import android.location.LocationProviderImpl;
import android.os.Bundle;
import android.util.PrintWriterPrinter;
diff --git a/location/java/com/android/internal/location/TrackProvider.java b/location/java/com/android/internal/location/TrackProvider.java
deleted file mode 100644
index 1686260..0000000
--- a/location/java/com/android/internal/location/TrackProvider.java
+++ /dev/null
@@ -1,732 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-
-package com.android.internal.location;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import android.location.Criteria;
-import android.location.ILocationManager;
-import android.location.Location;
-import android.location.LocationProviderImpl;
-import android.os.Bundle;
-import android.util.Config;
-import android.util.Log;
-
-/**
- * A dummy provider that returns positions interpolated from a sequence
- * of caller-supplied waypoints. The waypoints are supplied as a
- * String containing one or more numeric quadruples of the form:
- * <br>
- * <code>
- * <time in millis> <latitude> <longitude> <altitude>
- * </code>
- *
- * <p> The waypoints must be supplied in increasing timestamp order.
- *
- * <p> The time at which the provider is constructed is considered to
- * be time 0, and further requests for positions will return a
- * position that is linearly interpolated between the waypoints whose
- * timestamps are closest to the amount of wall clock time that has
- * elapsed since time 0.
- *
- * <p> Following the time of the last waypoint, the position of that
- * waypoint will continue to be returned indefinitely.
- *
- * {@hide}
- */
-public class TrackProvider extends LocationProviderImpl {
- static final String LOG_TAG = "TrackProvider";
-
- private static final long INTERVAL = 1000L;
-
- private boolean mEnabled = true;
- private TrackProviderThread mThread;
-
- private double mLatitude;
- private double mLongitude;
- private boolean mHasAltitude;
- private boolean mHasBearing;
- private boolean mHasSpeed;
- private double mAltitude;
- private float mBearing;
- private float mSpeed;
- private Bundle mExtras;
-
- private long mBaseTime;
- private long mLastTime = -1L;
- private long mTime;
-
- private long mMinTime;
- private long mMaxTime;
-
- private List<Waypoint> mWaypoints = new ArrayList<Waypoint>();
- private int mWaypointIndex = 0;
-
- private boolean mRequiresNetwork = false;
- private boolean mRequiresSatellite = false;
- private boolean mRequiresCell = false;
- private boolean mHasMonetaryCost = false;
- private boolean mSupportsAltitude = true;
- private boolean mSupportsSpeed = true;
- private boolean mSupportsBearing = true;
- private boolean mRepeat = false;
- private int mPowerRequirement = Criteria.POWER_LOW;
- private int mAccuracy = Criteria.ACCURACY_COARSE;
-
- private float mTrackSpeed = 100.0f; // km/hr - default for kml tracks
-
- private Location mInitialLocation;
-
- private class TrackProviderThread extends Thread {
-
- private boolean mDone = false;
-
- public TrackProviderThread() {
- super("TrackProviderThread");
- }
-
- public void run() {
- // thread exits after disable() is called
- synchronized (this) {
- while (!mDone) {
- try {
- wait(INTERVAL);
- } catch (InterruptedException e) {
- }
-
- if (!mDone) {
- TrackProvider.this.update();
- }
- }
- }
- }
-
- synchronized void setDone() {
- mDone = true;
- notify();
- }
- }
-
- private void close(Reader rdr) {
- try {
- if (rdr != null) {
- rdr.close();
- }
- } catch (IOException e) {
- Log.w(LOG_TAG, "Exception closing reader", e);
- }
- }
-
- public void readTrack(File trackFile) {
- BufferedReader br = null;
- try {
- br = new BufferedReader(new FileReader(trackFile), 8192);
- String s;
-
- long lastTime = -Long.MAX_VALUE;
- while ((s = br.readLine()) != null) {
- String[] tokens = s.split("\\s+");
- if (tokens.length != 4 && tokens.length != 6) {
- Log.e(LOG_TAG, "Got track \"" + s +
- "\", wanted <time> <long> <lat> <alt> [<bearing> <speed>]");
- continue;
- }
- long time;
- double longitude, latitude, altitude;
- try {
- time = Long.parseLong(tokens[0]);
- longitude = Double.parseDouble(tokens[1]);
- latitude = Double.parseDouble(tokens[2]);
- altitude = Double.parseDouble(tokens[3]);
- } catch (NumberFormatException e) {
- Log.e(LOG_TAG, "Got track \"" + s +
- "\", wanted <time> <long> <lat> <alt> " +
- "[<bearing> <speed>]", e);
- continue;
- }
-
- Waypoint w = new Waypoint(getName(), time, latitude, longitude, altitude);
- if (tokens.length >= 6) {
- float bearing, speed;
- try {
- bearing = Float.parseFloat(tokens[4]);
- speed = Float.parseFloat(tokens[5]);
- w.setBearing(bearing);
- w.setSpeed(speed);
- } catch (NumberFormatException e) {
- Log.e(LOG_TAG, "Ignoring bearing and speed \"" +
- tokens[4] + "\", \"" + tokens[5] + "\"", e);
- }
- }
-
- if (mInitialLocation == null) {
- mInitialLocation = w.getLocation();
- }
-
- // Ignore waypoints whose time is less than or equal to 0 or
- // the time of the previous waypoint
- if (time < 0) {
- Log.e(LOG_TAG, "Ignoring waypoint at negative time=" + time);
- continue;
- }
- if (time <= lastTime) {
- Log.e(LOG_TAG, "Ignoring waypoint at time=" + time +
- " (< " + lastTime + ")");
- continue;
- }
-
- mWaypoints.add(w);
- lastTime = time;
- }
-
- setTimes();
- return;
- } catch (IOException e) {
- Log.e(LOG_TAG, "Exception reading track file", e);
- mWaypoints.clear();
- } finally {
- close(br);
- }
- }
-
- public void readKml(File kmlFile) {
- FileReader kmlReader = null;
- try {
- kmlReader = new FileReader(kmlFile);
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser xpp = factory.newPullParser();
- xpp.setInput(kmlReader);
-
- // Concatenate the text of each <coordinates> tag
- boolean inCoordinates = false;
- StringBuilder sb = new StringBuilder();
- int eventType = xpp.getEventType();
- do {
- if (eventType == XmlPullParser.START_DOCUMENT) {
- // do nothing
- } else if (eventType == XmlPullParser.END_DOCUMENT) {
- // do nothing
- } else if (eventType == XmlPullParser.START_TAG) {
- String startTagName = xpp.getName();
- if (startTagName.equals("coordinates")) {
- inCoordinates = true;
- }
- } else if (eventType == XmlPullParser.END_TAG) {
- String endTagName = xpp.getName();
- if (endTagName.equals("coordinates")) {
- inCoordinates = false;
- }
- } else if (eventType == XmlPullParser.TEXT) {
- if (inCoordinates) {
- sb.append(xpp.getText());
- sb.append(' ');
- }
- }
- eventType = xpp.next();
- } while (eventType != XmlPullParser.END_DOCUMENT);
-
- String coordinates = sb.toString();
-
- // Parse the "lon,lat,alt" triples and supply times
- // for each waypoint based on a constant speed
- Location loc = null;
- double KM_PER_HOUR = mTrackSpeed;
- double KM_PER_METER = 1.0 / 1000.0;
- double MILLIS_PER_HOUR = 60.0 * 60.0 * 1000.0;
- double MILLIS_PER_METER =
- (1.0 / KM_PER_HOUR) * (KM_PER_METER) * (MILLIS_PER_HOUR);
- long time = 0L;
-
- StringTokenizer st = new StringTokenizer(coordinates, ", ");
- while (st.hasMoreTokens()) {
- try {
- String lon = st.nextToken();
- String lat = st.nextToken();
- String alt = st.nextToken();
- if (Config.LOGD) {
- Log.d(LOG_TAG,
- "lon=" + lon + ", lat=" + lat + ", alt=" + alt);
- }
-
- double nLongitude = Double.parseDouble(lon);
- double nLatitude = Double.parseDouble(lat);
- double nAltitude = Double.parseDouble(alt);
-
- Location nLoc = new Location(getName());
- nLoc.setLatitude(nLatitude);
- nLoc.setLongitude(nLongitude);
- if (loc != null) {
- double distance = loc.distanceTo(nLoc);
- if (Config.LOGD) {
- Log.d(LOG_TAG, "distance = " + distance);
- }
- time += (long) (distance * MILLIS_PER_METER);
- }
-
- Waypoint w = new Waypoint(getName(), time,
- nLatitude, nLongitude, nAltitude);
- if (supportsSpeed()) {
- w.setSpeed(mTrackSpeed);
- }
- if (supportsBearing()) {
- w.setBearing(0.0f);
- }
- mWaypoints.add(w);
-
- if (mInitialLocation == null) {
- mInitialLocation = w.getLocation();
- }
-
- loc = nLoc;
- } catch (NumberFormatException nfe) {
- Log.e(LOG_TAG, "Got NumberFormatException reading KML data: " +
- nfe, nfe);
- }
- }
-
- setTimes();
- return;
- } catch (IOException ioe) {
- mWaypoints.clear();
- Log.e(LOG_TAG, "Exception reading KML data: " + ioe, ioe);
- // fall through
- } catch (XmlPullParserException xppe) {
- mWaypoints.clear();
- Log.e(LOG_TAG, "Exception reading KML data: " + xppe, xppe);
- // fall through
- } finally {
- close(kmlReader);
- }
- }
-
- public void readNmea(String name, File file) {
- BufferedReader br = null;
- try {
- br = new BufferedReader(new FileReader(file), 8192);
- String s;
-
- String provider = getName();
- NmeaParser parser = new NmeaParser(name);
- while ((s = br.readLine()) != null) {
- boolean newWaypoint = parser.parseSentence(s);
- if (newWaypoint) {
- Location loc = parser.getLocation();
- Waypoint w = new Waypoint(loc);
- mWaypoints.add(w);
- // Log.i(TAG, "Got waypoint " + w);
- }
- }
-
- setTimes();
- return;
- } catch (IOException ioe) {
- Log.e(LOG_TAG, "Exception reading NMEA data: " + ioe);
- mWaypoints.clear();
- } finally {
- close(br);
- }
- }
-
- private static boolean booleanVal(String tf) {
- return (tf == null) || (tf.equalsIgnoreCase("true"));
- }
-
- private static int intVal(String val) {
- try {
- return (val == null) ? 0 : Integer.parseInt(val);
- } catch (NumberFormatException nfe) {
- return 0;
- }
- }
-
- private static float floatVal(String val) {
- try {
- return (val == null) ? 0 : Float.parseFloat(val);
- } catch (NumberFormatException nfe) {
- return 0.0f;
- }
- }
-
- public void readProperties(File propertiesFile) {
- BufferedReader br = null;
- if (!propertiesFile.exists()) {
- return;
- }
- try {
- if (Config.LOGD) {
- Log.d(LOG_TAG, "Loading properties file " +
- propertiesFile.getPath());
- }
- br = new BufferedReader(new FileReader(propertiesFile), 8192);
-
- String s;
- while ((s = br.readLine()) != null) {
- StringTokenizer st = new StringTokenizer(s);
- String command = null;
- String value = null;
- if (!st.hasMoreTokens()) {
- continue;
- }
- command = st.nextToken();
- if (st.hasMoreTokens()) {
- value = st.nextToken();
- }
-
- if (command.equalsIgnoreCase("requiresNetwork")) {
- setRequiresNetwork(booleanVal(value));
- } else if (command.equalsIgnoreCase("requiresSatellite")) {
- setRequiresSatellite(booleanVal(value));
- } else if (command.equalsIgnoreCase("requiresCell")) {
- setRequiresCell(booleanVal(value));
- } else if (command.equalsIgnoreCase("hasMonetaryCost")) {
- setHasMonetaryCost(booleanVal(value));
- } else if (command.equalsIgnoreCase("supportsAltitude")) {
- setSupportsAltitude(booleanVal(value));
- } else if (command.equalsIgnoreCase("supportsBearing")) {
- setSupportsBearing(booleanVal(value));
- } else if (command.equalsIgnoreCase("repeat")) {
- setRepeat(booleanVal(value));
- } else if (command.equalsIgnoreCase("supportsSpeed")) {
- setSupportsSpeed(booleanVal(value));
- } else if (command.equalsIgnoreCase("powerRequirement")) {
- setPowerRequirement(intVal(value));
- } else if (command.equalsIgnoreCase("accuracy")) {
- setAccuracy(intVal(value));
- } else if (command.equalsIgnoreCase("trackspeed")) {
- setTrackSpeed(floatVal(value));
- } else {
- Log.e(LOG_TAG, "Unknown command \"" + command + "\"");
- }
- }
- } catch (IOException ioe) {
- Log.e(LOG_TAG, "IOException reading properties file " +
- propertiesFile.getPath(), ioe);
- } finally {
- try {
- if (br != null) {
- br.close();
- }
- } catch (IOException e) {
- Log.w(LOG_TAG, "IOException closing properties file " +
- propertiesFile.getPath(), e);
- }
- }
- }
-
- public TrackProvider(String name, ILocationManager locationManager) {
- super(name, locationManager);
- setTimes();
- }
-
- public TrackProvider(String name, ILocationManager locationManager, File file) {
- this(name, locationManager);
-
- String filename = file.getName();
- if (filename.endsWith("kml")) {
- readKml(file);
- } else if (filename.endsWith("nmea")) {
- readNmea(getName(), file);
- } else if (filename.endsWith("track")) {
- readTrack(file);
- } else {
- Log.e(LOG_TAG, "Can't initialize TrackProvider from file " +
- filename + " (not *kml, *nmea, or *track)");
- }
- setTimes();
- }
-
- private void setTimes() {
- mBaseTime = System.currentTimeMillis();
- if (mWaypoints.size() >= 2) {
- mMinTime = mWaypoints.get(0).getTime();
- mMaxTime = mWaypoints.get(mWaypoints.size() - 1).getTime();
- } else {
- mMinTime = mMaxTime = 0;
- }
- }
-
- private double interp(double d0, double d1, float frac) {
- return d0 + frac * (d1 - d0);
- }
-
- private void update() {
- long time = System.currentTimeMillis() - mBaseTime;
-
- List<Waypoint> waypoints = mWaypoints;
- if (waypoints == null) {
- return;
- }
- int size = waypoints.size();
- if (size < 2) {
- return;
- }
-
- long t = time;
- if (t < mMinTime) {
- t = mMinTime;
- }
- if (mRepeat) {
- t -= mMinTime;
- long deltaT = mMaxTime - mMinTime;
- t %= 2 * deltaT;
- if (t > deltaT) {
- t = 2 * deltaT - t;
- }
- t += mMinTime;
- } else if (t > mMaxTime) {
- t = mMaxTime;
- }
-
- // Locate the time interval for the current time
- // We slide the window since we don't expect to move
- // much between calls
-
- Waypoint w0 = waypoints.get(mWaypointIndex);
- Waypoint w1 = waypoints.get(mWaypointIndex + 1);
-
- // If the right end of the current interval is too early,
- // move forward to the next waypoint
- while (t > w1.getTime()) {
- w0 = w1;
- w1 = waypoints.get(++mWaypointIndex + 1);
- }
- // If the left end of the current interval is too late,
- // move back to the previous waypoint
- while (t < w0.getTime()) {
- w1 = w0;
- w0 = waypoints.get(--mWaypointIndex);
- }
-
- // Now we know that w0.mTime <= t <= w1.mTime
- long w0Time = w0.getTime();
- long w1Time = w1.getTime();
- long dt = w1Time - w0Time;
-
- float frac = (dt == 0) ? 0 : ((float) (t - w0Time) / dt);
- mLatitude = interp(w0.getLatitude(), w1.getLatitude(), frac);
- mLongitude = interp(w0.getLongitude(), w1.getLongitude(), frac);
- mHasAltitude = w0.hasAltitude() && w1.hasAltitude();
- if (mSupportsAltitude && mHasAltitude) {
- mAltitude = interp(w0.getAltitude(), w1.getAltitude(), frac);
- }
- if (mSupportsBearing) {
- mHasBearing = frac <= 0.5f ? w0.hasBearing() : w1.hasBearing();
- if (mHasBearing) {
- mBearing = frac <= 0.5f ? w0.getBearing() : w1.getBearing();
- }
- }
- if (mSupportsSpeed) {
- mHasSpeed = frac <= 0.5f ? w0.hasSpeed() : w1.hasSpeed();
- if (mHasSpeed) {
- mSpeed = frac <= 0.5f ? w0.getSpeed() : w1.getSpeed();
- }
- }
- mLastTime = time;
- mTime = time;
- }
-
- public void setRequiresNetwork(boolean requiresNetwork) {
- mRequiresNetwork = requiresNetwork;
- }
-
- @Override public boolean requiresNetwork() {
- return mRequiresNetwork;
- }
-
- public void setRequiresSatellite(boolean requiresSatellite) {
- mRequiresSatellite = requiresSatellite;
- }
-
- @Override public boolean requiresSatellite() {
- return mRequiresSatellite;
- }
-
- public void setRequiresCell(boolean requiresCell) {
- mRequiresCell = requiresCell;
- }
-
- @Override public boolean requiresCell() {
- return mRequiresCell;
- }
-
- public void setHasMonetaryCost(boolean hasMonetaryCost) {
- mHasMonetaryCost = hasMonetaryCost;
- }
-
- @Override public boolean hasMonetaryCost() {
- return mHasMonetaryCost;
- }
-
- public void setSupportsAltitude(boolean supportsAltitude) {
- mSupportsAltitude = supportsAltitude;
- }
-
- @Override public boolean supportsAltitude() {
- return mSupportsAltitude;
- }
-
- public void setSupportsSpeed(boolean supportsSpeed) {
- mSupportsSpeed = supportsSpeed;
- }
-
- @Override public boolean supportsSpeed() {
- return mSupportsSpeed;
- }
-
- public void setSupportsBearing(boolean supportsBearing) {
- mSupportsBearing = supportsBearing;
- }
-
- @Override public boolean supportsBearing() {
- return mSupportsBearing;
- }
-
- public void setRepeat(boolean repeat) {
- mRepeat = repeat;
- }
-
- public void setPowerRequirement(int powerRequirement) {
- if (powerRequirement < Criteria.POWER_LOW ||
- powerRequirement > Criteria.POWER_HIGH) {
- throw new IllegalArgumentException("powerRequirement = " +
- powerRequirement);
- }
- mPowerRequirement = powerRequirement;
- }
-
- @Override public int getPowerRequirement() {
- return mPowerRequirement;
- }
-
- public void setAccuracy(int accuracy) {
- mAccuracy = accuracy;
- }
-
- @Override public int getAccuracy() {
- return mAccuracy;
- }
-
- public void setTrackSpeed(float trackSpeed) {
- mTrackSpeed = trackSpeed;
- }
-
- @Override public synchronized void enable() {
- mEnabled = true;
- mThread = new TrackProviderThread();
- mThread.start();
- }
-
- @Override public synchronized void disable() {
- mEnabled = false;
- if (mThread != null) {
- mThread.setDone();
- try {
- mThread.join();
- } catch (InterruptedException e) {
- }
- mThread = null;
- }
- }
-
- @Override public boolean isEnabled() {
- return mEnabled;
- }
-
- @Override public int getStatus(Bundle extras) {
- return AVAILABLE;
- }
-
- public Location getInitialLocation() {
- return mInitialLocation;
- }
-}
-
-/**
- * A simple tuple of (time stamp, latitude, longitude, altitude), plus optional
- * extras.
- *
- * {@hide}
- */
-class Waypoint {
- public Location mLocation;
-
- public Waypoint(Location location) {
- mLocation = location;
- }
-
- public Waypoint(String providerName, long time, double latitude, double longitude,
- double altitude) {
- mLocation = new Location(providerName);
- mLocation.setTime(time);
- mLocation.setLatitude(latitude);
- mLocation.setLongitude(longitude);
- mLocation.setAltitude(altitude);
- }
-
- public long getTime() {
- return mLocation.getTime();
- }
-
- public double getLatitude() {
- return mLocation.getLatitude();
- }
-
- public double getLongitude() {
- return mLocation.getLongitude();
- }
-
- public boolean hasAltitude() {
- return mLocation.hasAltitude();
- }
-
- public double getAltitude() {
- return mLocation.getAltitude();
- }
-
- public boolean hasBearing() {
- return mLocation.hasBearing();
- }
-
- public void setBearing(float bearing) {
- mLocation.setBearing(bearing);
- }
-
- public float getBearing() {
- return mLocation.getBearing();
- }
-
- public boolean hasSpeed() {
- return mLocation.hasSpeed();
- }
-
- public void setSpeed(float speed) {
- mLocation.setSpeed(speed);
- }
-
- public float getSpeed() {
- return mLocation.getSpeed();
- }
-
- public Bundle getExtras() {
- return mLocation.getExtras();
- }
-
- public Location getLocation() {
- return new Location(mLocation);
- }
-
- @Override public String toString() {
- return "Waypoint[mLocation=" + mLocation + "]";
- }
-}
diff --git a/media/libmediaplayerservice/MidiFile.cpp b/media/libmediaplayerservice/MidiFile.cpp
index d03caa5..e9cbb97 100644
--- a/media/libmediaplayerservice/MidiFile.cpp
+++ b/media/libmediaplayerservice/MidiFile.cpp
@@ -89,7 +89,7 @@ MidiFile::MidiFile() :
// create playback thread
{
Mutex::Autolock l(mMutex);
- createThreadEtc(renderThread, this, "midithread");
+ createThreadEtc(renderThread, this, "midithread", ANDROID_PRIORITY_AUDIO);
mCondition.wait(mMutex);
LOGV("thread started");
}
diff --git a/media/libmediaplayerservice/VorbisPlayer.cpp b/media/libmediaplayerservice/VorbisPlayer.cpp
index 0ad335f..14fd6ce 100644
--- a/media/libmediaplayerservice/VorbisPlayer.cpp
+++ b/media/libmediaplayerservice/VorbisPlayer.cpp
@@ -67,7 +67,7 @@ void VorbisPlayer::onFirstRef()
LOGV("onFirstRef");
// create playback thread
Mutex::Autolock l(mMutex);
- createThreadEtc(renderThread, this, "vorbis decoder");
+ createThreadEtc(renderThread, this, "vorbis decoder", ANDROID_PRIORITY_AUDIO);
mCondition.wait(mMutex);
if (mRenderTid > 0) {
LOGV("render thread(%d) started", mRenderTid);
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
index 07b43bb..281828f 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
@@ -464,6 +464,7 @@ public class MediaNames {
public static final String RECORDED_SQVGA_H263 = "/sdcard/SQVGA_H263.3gp";
public static final String RECORDED_CIF_H263 = "/sdcard/CIF_H263.3gp";
public static final String RECORDED_QCIF_H263 = "/sdcard/QCIF_H263.3gp";
+ public static final String RECORDED_PORTRAIT_H263 = "/sdcard/QCIF_mp4.3gp";
public static final String RECORDED_HVGA_MP4 = "/sdcard/HVGA_mp4.mp4";
public static final String RECORDED_QVGA_MP4 = "/sdcard/QVGA_mp4.mp4";
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
index 65451c5..261b4f4 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
@@ -22,6 +22,7 @@ import com.android.mediaframeworktest.MediaNames;
import java.io.*;
import android.content.Context;
+import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.test.ActivityInstrumentationTestCase;
@@ -46,6 +47,7 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase<MediaFram
private SurfaceHolder mSurfaceHolder = null;
private MediaRecorder mRecorder;
Context mContext;
+ Camera mCamera;
public MediaRecorderTest() {
super("com.android.mediaframeworktest", MediaFrameworkTest.class);
@@ -234,12 +236,32 @@ public class MediaRecorderTest extends ActivityInstrumentationTestCase<MediaFram
assertTrue("QCIFH263 Video Only", videoRecordedResult);
}
- @Suppress
- public void testPortraitH263() throws Exception {
+ @LargeTest
+ /*
+ * This test case set the camera in portrait mode.
+ * Verification: validate the video dimension and the duration.
+ */
+ public void testPortraitH263() throws Exception {
boolean videoRecordedResult = false;
- recordVideo(15, 144, 176, MediaRecorder.VideoEncoder.H263,
- MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true);
- videoRecordedResult = validateVideo(MediaNames.RECORDED_VIDEO_3GP, 144, 176);
+ try {
+ mCamera = Camera.open();
+ Camera.Parameters parameters = mCamera.getParameters();
+ parameters.setPreviewSize(352, 288);
+ parameters.set("orientation", "portrait");
+ mCamera.setParameters(parameters);
+ mCamera.unlock();
+ mRecorder.setCamera(mCamera);
+ Thread.sleep(1000);
+ recordVideo(15, 352, 288, MediaRecorder.VideoEncoder.H263,
+ MediaRecorder.OutputFormat.THREE_GPP,
+ MediaNames.RECORDED_PORTRAIT_H263, true);
+ videoRecordedResult =
+ validateVideo(MediaNames.RECORDED_PORTRAIT_H263, 352, 288);
+ mCamera.lock();
+ mCamera.release();
+ } catch (Exception e) {
+ Log.v(TAG, e.toString());
+ }
assertTrue("PortraitH263", videoRecordedResult);
}
diff --git a/opengl/java/android/opengl/GLES10.java b/opengl/java/android/opengl/GLES10.java
index e597d12..147b60f 100644
--- a/opengl/java/android/opengl/GLES10.java
+++ b/opengl/java/android/opengl/GLES10.java
@@ -671,20 +671,9 @@ public class GLES10 {
// C function const GLubyte * glGetString ( GLenum name )
- public native String _glGetString(
+ public static native String glGetString(
int name
);
-
- public String glGetString(
- int name
- ) {
- String returnValue;
- returnValue = _glGetString(
- name
- );
- return returnValue;
- }
-
// C function void glHint ( GLenum target, GLenum mode )
public static native void glHint(
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index c58fff8..74aed20 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -156,6 +156,7 @@ static void gl_unimplemented() {
static char const * const gl_names[] = {
#include "gl_entries.in"
+ #include "glext_entries.in"
NULL
};
@@ -279,6 +280,8 @@ EGLContext getContext() {
static __attribute__((noinline))
void *load_driver(const char* driver, gl_hooks_t* hooks)
{
+ //LOGD("%s", driver);
+ char scrap[256];
void* dso = dlopen(driver, RTLD_NOW | RTLD_LOCAL);
LOGE_IF(!dso,
"couldn't load <%s> library (%s)",
@@ -316,26 +319,42 @@ void *load_driver(const char* driver, gl_hooks_t* hooks)
*curr++ = f;
api++;
}
-
gl_hooks_t::gl_t* gl = &hooks->gl;
curr = (__eglMustCastToProperFunctionPointerType*)gl;
api = gl_names;
while (*api) {
char const * name = *api;
- // if the function starts with '__' it's a special case that
- // uses a wrapper. skip the '__' when looking into the real lib.
- if (name[0] == '_' && name[1] == '_') {
- name += 2;
- }
__eglMustCastToProperFunctionPointerType f =
(__eglMustCastToProperFunctionPointerType)dlsym(dso, name);
if (f == NULL) {
// couldn't find the entry-point, use eglGetProcAddress()
f = getProcAddress(name);
- if (f == NULL) {
- f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented;
+ }
+ if (f == NULL) {
+ // Try without the OES postfix
+ ssize_t index = ssize_t(strlen(name)) - 3;
+ if ((index>0 && (index<255)) && (!strcmp(name+index, "OES"))) {
+ strncpy(scrap, name, index);
+ scrap[index] = 0;
+ f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap);
+ //LOGD_IF(f, "found <%s> instead", scrap);
}
}
+ if (f == NULL) {
+ // Try with the OES postfix
+ ssize_t index = ssize_t(strlen(name)) - 3;
+ if ((index>0 && (index<252)) && (strcmp(name+index, "OES"))) {
+ strncpy(scrap, name, index);
+ scrap[index] = 0;
+ strcat(scrap, "OES");
+ f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap);
+ //LOGD_IF(f, "found <%s> instead", scrap);
+ }
+ }
+ if (f == NULL) {
+ //LOGD("%s", name);
+ f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented;
+ }
*curr++ = f;
api++;
}
diff --git a/opengl/libs/GLES_CM/gl.cpp b/opengl/libs/GLES_CM/gl.cpp
index a175343..d1b9ac6 100644
--- a/opengl/libs/GLES_CM/gl.cpp
+++ b/opengl/libs/GLES_CM/gl.cpp
@@ -99,6 +99,7 @@ void glVertexPointerBounds(GLint size, GLenum type,
extern "C" {
#include "gl_api.in"
+#include "glext_api.in"
}
#undef API_ENTRY
diff --git a/opengl/libs/GLES_CM/gl_api.in b/opengl/libs/GLES_CM/gl_api.in
index f36b8c0..5437d47 100644
--- a/opengl/libs/GLES_CM/gl_api.in
+++ b/opengl/libs/GLES_CM/gl_api.in
@@ -1,760 +1,435 @@
-void API_ENTRY(glColor4f)(GLfloat arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3) {
- CALL_GL_API(glColor4f, arg0, arg1, arg2, arg3);
+void API_ENTRY(glAlphaFunc)(GLenum func, GLclampf ref) {
+ CALL_GL_API(glAlphaFunc, func, ref);
}
-
-void API_ENTRY(glColor4x)(GLfixed arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3) {
- CALL_GL_API(glColor4x, arg0, arg1, arg2, arg3);
+void API_ENTRY(glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
+ CALL_GL_API(glClearColor, red, green, blue, alpha);
}
-
-void API_ENTRY(glNormal3f)(GLfloat arg0, GLfloat arg1, GLfloat arg2) {
- CALL_GL_API(glNormal3f, arg0, arg1, arg2);
+void API_ENTRY(glClearDepthf)(GLclampf depth) {
+ CALL_GL_API(glClearDepthf, depth);
}
-
-void API_ENTRY(glNormal3x)(GLfixed arg0, GLfixed arg1, GLfixed arg2) {
- CALL_GL_API(glNormal3x, arg0, arg1, arg2);
+void API_ENTRY(glClipPlanef)(GLenum plane, const GLfloat *equation) {
+ CALL_GL_API(glClipPlanef, plane, equation);
}
-
-void API_ENTRY(glCullFace)(GLenum arg0) {
- CALL_GL_API(glCullFace, arg0);
+void API_ENTRY(glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
+ CALL_GL_API(glColor4f, red, green, blue, alpha);
}
-
-void API_ENTRY(glFrontFace)(GLenum arg0) {
- CALL_GL_API(glFrontFace, arg0);
+void API_ENTRY(glDepthRangef)(GLclampf zNear, GLclampf zFar) {
+ CALL_GL_API(glDepthRangef, zNear, zFar);
}
-
-void API_ENTRY(glDisable)(GLenum arg0) {
- CALL_GL_API(glDisable, arg0);
+void API_ENTRY(glFogf)(GLenum pname, GLfloat param) {
+ CALL_GL_API(glFogf, pname, param);
}
-
-void API_ENTRY(glEnable)(GLenum arg0) {
- CALL_GL_API(glEnable, arg0);
+void API_ENTRY(glFogfv)(GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glFogfv, pname, params);
}
-
-void API_ENTRY(glFinish)(void) {
- CALL_GL_API(glFinish);
-}
-
-void API_ENTRY(glFlush)(void) {
- CALL_GL_API(glFlush);
-}
-
-GLenum API_ENTRY(glGetError)(void) {
- CALL_GL_API_RETURN(glGetError);
-}
-
-const GLubyte* API_ENTRY(glGetString)(GLenum arg0) {
- CALL_GL_API_RETURN(glGetString, arg0);
-}
-
-void API_ENTRY(glGetIntegerv)(GLenum arg0, GLint * arg1) {
- CALL_GL_API(glGetIntegerv, arg0, arg1);
-}
-
-void API_ENTRY(glColorMask)(GLboolean arg0, GLboolean arg1, GLboolean arg2, GLboolean arg3) {
- CALL_GL_API(glColorMask, arg0, arg1, arg2, arg3);
-}
-
-void API_ENTRY(glDepthMask)(GLboolean arg0) {
- CALL_GL_API(glDepthMask, arg0);
-}
-
-void API_ENTRY(glStencilMask)(GLuint arg0) {
- CALL_GL_API(glStencilMask, arg0);
-}
-
-void API_ENTRY(glDepthFunc)(GLenum arg0) {
- CALL_GL_API(glDepthFunc, arg0);
-}
-
-void API_ENTRY(glDepthRangef)(GLclampf arg0, GLclampf arg1) {
- CALL_GL_API(glDepthRangef, arg0, arg1);
-}
-
-void API_ENTRY(glDepthRangex)(GLclampx arg0, GLclampx arg1) {
- CALL_GL_API(glDepthRangex, arg0, arg1);
-}
-
-void API_ENTRY(glPolygonOffset)(GLfloat arg0, GLfloat arg1) {
- CALL_GL_API(glPolygonOffset, arg0, arg1);
-}
-
-void API_ENTRY(glPolygonOffsetx)(GLfixed arg0, GLfixed arg1) {
- CALL_GL_API(glPolygonOffsetx, arg0, arg1);
+void API_ENTRY(glFrustumf)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
+ CALL_GL_API(glFrustumf, left, right, bottom, top, zNear, zFar);
}
-
-void API_ENTRY(glLogicOp)(GLenum arg0) {
- CALL_GL_API(glLogicOp, arg0);
+void API_ENTRY(glGetClipPlanef)(GLenum pname, GLfloat eqn[4]) {
+ CALL_GL_API(glGetClipPlanef, pname, eqn);
}
-
-void API_ENTRY(glAlphaFuncx)(GLenum arg0, GLclampx arg1) {
- CALL_GL_API(glAlphaFuncx, arg0, arg1);
+void API_ENTRY(glGetFloatv)(GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetFloatv, pname, params);
}
-
-void API_ENTRY(glAlphaFunc)(GLenum arg0, GLclampf arg1) {
- CALL_GL_API(glAlphaFunc, arg0, arg1);
+void API_ENTRY(glGetLightfv)(GLenum light, GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetLightfv, light, pname, params);
}
-
-void API_ENTRY(glBlendFunc)(GLenum arg0, GLenum arg1) {
- CALL_GL_API(glBlendFunc, arg0, arg1);
+void API_ENTRY(glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetMaterialfv, face, pname, params);
}
-
-void API_ENTRY(glClear)(GLbitfield arg0) {
- CALL_GL_API(glClear, arg0);
+void API_ENTRY(glGetTexEnvfv)(GLenum env, GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetTexEnvfv, env, pname, params);
}
-
-void API_ENTRY(glClearColor)(GLclampf arg0, GLclampf arg1, GLclampf arg2, GLclampf arg3) {
- CALL_GL_API(glClearColor, arg0, arg1, arg2, arg3);
+void API_ENTRY(glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetTexParameterfv, target, pname, params);
}
-
-void API_ENTRY(glClearColorx)(GLclampx arg0, GLclampx arg1, GLclampx arg2, GLclampx arg3) {
- CALL_GL_API(glClearColorx, arg0, arg1, arg2, arg3);
+void API_ENTRY(glLightModelf)(GLenum pname, GLfloat param) {
+ CALL_GL_API(glLightModelf, pname, param);
}
-
-void API_ENTRY(glClearDepthf)(GLclampf arg0) {
- CALL_GL_API(glClearDepthf, arg0);
+void API_ENTRY(glLightModelfv)(GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glLightModelfv, pname, params);
}
-
-void API_ENTRY(glClearDepthx)(GLclampx arg0) {
- CALL_GL_API(glClearDepthx, arg0);
+void API_ENTRY(glLightf)(GLenum light, GLenum pname, GLfloat param) {
+ CALL_GL_API(glLightf, light, pname, param);
}
-
-void API_ENTRY(glClearStencil)(GLint arg0) {
- CALL_GL_API(glClearStencil, arg0);
+void API_ENTRY(glLightfv)(GLenum light, GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glLightfv, light, pname, params);
}
-
-void API_ENTRY(glPointSize)(GLfloat arg0) {
- CALL_GL_API(glPointSize, arg0);
+void API_ENTRY(glLineWidth)(GLfloat width) {
+ CALL_GL_API(glLineWidth, width);
}
-
-void API_ENTRY(glPointSizex)(GLfixed arg0) {
- CALL_GL_API(glPointSizex, arg0);
+void API_ENTRY(glLoadMatrixf)(const GLfloat *m) {
+ CALL_GL_API(glLoadMatrixf, m);
}
-
-void API_ENTRY(glSampleCoverage)(GLclampf arg0, GLboolean arg1) {
- CALL_GL_API(glSampleCoverage, arg0, arg1);
+void API_ENTRY(glMaterialf)(GLenum face, GLenum pname, GLfloat param) {
+ CALL_GL_API(glMaterialf, face, pname, param);
}
-
-void API_ENTRY(glSampleCoveragex)(GLclampx arg0, GLboolean arg1) {
- CALL_GL_API(glSampleCoveragex, arg0, arg1);
+void API_ENTRY(glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glMaterialfv, face, pname, params);
}
-
-void API_ENTRY(glStencilFunc)(GLenum arg0, GLint arg1, GLuint arg2) {
- CALL_GL_API(glStencilFunc, arg0, arg1, arg2);
+void API_ENTRY(glMultMatrixf)(const GLfloat *m) {
+ CALL_GL_API(glMultMatrixf, m);
}
-
-void API_ENTRY(glStencilOp)(GLenum arg0, GLenum arg1, GLenum arg2) {
- CALL_GL_API(glStencilOp, arg0, arg1, arg2);
+void API_ENTRY(glMultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {
+ CALL_GL_API(glMultiTexCoord4f, target, s, t, r, q);
}
-
-void API_ENTRY(glScissor)(GLint arg0, GLint arg1, GLsizei arg2, GLsizei arg3) {
- CALL_GL_API(glScissor, arg0, arg1, arg2, arg3);
+void API_ENTRY(glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz) {
+ CALL_GL_API(glNormal3f, nx, ny, nz);
}
-
-void API_ENTRY(glHint)(GLenum arg0, GLenum arg1) {
- CALL_GL_API(glHint, arg0, arg1);
+void API_ENTRY(glOrthof)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
+ CALL_GL_API(glOrthof, left, right, bottom, top, zNear, zFar);
}
-
-void API_ENTRY(glLineWidth)(GLfloat arg0) {
- CALL_GL_API(glLineWidth, arg0);
+void API_ENTRY(glPointParameterf)(GLenum pname, GLfloat param) {
+ CALL_GL_API(glPointParameterf, pname, param);
}
-
-void API_ENTRY(glLineWidthx)(GLfixed arg0) {
- CALL_GL_API(glLineWidthx, arg0);
+void API_ENTRY(glPointParameterfv)(GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glPointParameterfv, pname, params);
}
-
-void API_ENTRY(glShadeModel)(GLenum arg0) {
- CALL_GL_API(glShadeModel, arg0);
+void API_ENTRY(glPointSize)(GLfloat size) {
+ CALL_GL_API(glPointSize, size);
}
-
-void API_ENTRY(glLightModelf)(GLenum arg0, GLfloat arg1) {
- CALL_GL_API(glLightModelf, arg0, arg1);
+void API_ENTRY(glPolygonOffset)(GLfloat factor, GLfloat units) {
+ CALL_GL_API(glPolygonOffset, factor, units);
}
-
-void API_ENTRY(glLightModelfv)(GLenum arg0, const GLfloat * arg1) {
- CALL_GL_API(glLightModelfv, arg0, arg1);
+void API_ENTRY(glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {
+ CALL_GL_API(glRotatef, angle, x, y, z);
}
-
-void API_ENTRY(glLightModelx)(GLenum arg0, GLfixed arg1) {
- CALL_GL_API(glLightModelx, arg0, arg1);
+void API_ENTRY(glScalef)(GLfloat x, GLfloat y, GLfloat z) {
+ CALL_GL_API(glScalef, x, y, z);
}
-
-void API_ENTRY(glLightModelxv)(GLenum arg0, const GLfixed * arg1) {
- CALL_GL_API(glLightModelxv, arg0, arg1);
+void API_ENTRY(glTexEnvf)(GLenum target, GLenum pname, GLfloat param) {
+ CALL_GL_API(glTexEnvf, target, pname, param);
}
-
-void API_ENTRY(glLightf)(GLenum arg0, GLenum arg1, GLfloat arg2) {
- CALL_GL_API(glLightf, arg0, arg1, arg2);
+void API_ENTRY(glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glTexEnvfv, target, pname, params);
}
-
-void API_ENTRY(glLightfv)(GLenum arg0, GLenum arg1, const GLfloat * arg2) {
- CALL_GL_API(glLightfv, arg0, arg1, arg2);
+void API_ENTRY(glTexParameterf)(GLenum target, GLenum pname, GLfloat param) {
+ CALL_GL_API(glTexParameterf, target, pname, param);
}
-
-void API_ENTRY(glLightx)(GLenum arg0, GLenum arg1, GLfixed arg2) {
- CALL_GL_API(glLightx, arg0, arg1, arg2);
+void API_ENTRY(glTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glTexParameterfv, target, pname, params);
}
-
-void API_ENTRY(glLightxv)(GLenum arg0, GLenum arg1, const GLfixed * arg2) {
- CALL_GL_API(glLightxv, arg0, arg1, arg2);
+void API_ENTRY(glTranslatef)(GLfloat x, GLfloat y, GLfloat z) {
+ CALL_GL_API(glTranslatef, x, y, z);
}
-
-void API_ENTRY(glMaterialf)(GLenum arg0, GLenum arg1, GLfloat arg2) {
- CALL_GL_API(glMaterialf, arg0, arg1, arg2);
+void API_ENTRY(glActiveTexture)(GLenum texture) {
+ CALL_GL_API(glActiveTexture, texture);
}
-
-void API_ENTRY(glMaterialfv)(GLenum arg0, GLenum arg1, const GLfloat * arg2) {
- CALL_GL_API(glMaterialfv, arg0, arg1, arg2);
+void API_ENTRY(glAlphaFuncx)(GLenum func, GLclampx ref) {
+ CALL_GL_API(glAlphaFuncx, func, ref);
}
-
-void API_ENTRY(glMaterialx)(GLenum arg0, GLenum arg1, GLfixed arg2) {
- CALL_GL_API(glMaterialx, arg0, arg1, arg2);
+void API_ENTRY(glBindBuffer)(GLenum target, GLuint buffer) {
+ CALL_GL_API(glBindBuffer, target, buffer);
}
-
-void API_ENTRY(glMaterialxv)(GLenum arg0, GLenum arg1, const GLfixed * arg2) {
- CALL_GL_API(glMaterialxv, arg0, arg1, arg2);
+void API_ENTRY(glBindTexture)(GLenum target, GLuint texture) {
+ CALL_GL_API(glBindTexture, target, texture);
}
-
-void API_ENTRY(glFogf)(GLenum arg0, GLfloat arg1) {
- CALL_GL_API(glFogf, arg0, arg1);
+void API_ENTRY(glBlendFunc)(GLenum sfactor, GLenum dfactor) {
+ CALL_GL_API(glBlendFunc, sfactor, dfactor);
}
-
-void API_ENTRY(glFogfv)(GLenum arg0, const GLfloat * arg1) {
- CALL_GL_API(glFogfv, arg0, arg1);
+void API_ENTRY(glBufferData)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) {
+ CALL_GL_API(glBufferData, target, size, data, usage);
}
-
-void API_ENTRY(glFogx)(GLenum arg0, GLfixed arg1) {
- CALL_GL_API(glFogx, arg0, arg1);
+void API_ENTRY(glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) {
+ CALL_GL_API(glBufferSubData, target, offset, size, data);
}
-
-void API_ENTRY(glFogxv)(GLenum arg0, const GLfixed * arg1) {
- CALL_GL_API(glFogxv, arg0, arg1);
+void API_ENTRY(glClear)(GLbitfield mask) {
+ CALL_GL_API(glClear, mask);
}
-
-void API_ENTRY(glVertexPointer)(GLint arg0, GLenum arg1, GLsizei arg2, const GLvoid * arg3) {
- CALL_GL_API(glVertexPointer, arg0, arg1, arg2, arg3);
+void API_ENTRY(glClearColorx)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
+ CALL_GL_API(glClearColorx, red, green, blue, alpha);
}
-
-void API_ENTRY(glColorPointer)(GLint arg0, GLenum arg1, GLsizei arg2, const GLvoid * arg3) {
- CALL_GL_API(glColorPointer, arg0, arg1, arg2, arg3);
+void API_ENTRY(glClearDepthx)(GLclampx depth) {
+ CALL_GL_API(glClearDepthx, depth);
}
-
-void API_ENTRY(glNormalPointer)(GLenum arg0, GLsizei arg1, const GLvoid * arg2) {
- CALL_GL_API(glNormalPointer, arg0, arg1, arg2);
+void API_ENTRY(glClearStencil)(GLint s) {
+ CALL_GL_API(glClearStencil, s);
}
-
-void API_ENTRY(glTexCoordPointer)(GLint arg0, GLenum arg1, GLsizei arg2, const GLvoid * arg3) {
- CALL_GL_API(glTexCoordPointer, arg0, arg1, arg2, arg3);
+void API_ENTRY(glClientActiveTexture)(GLenum texture) {
+ CALL_GL_API(glClientActiveTexture, texture);
}
-
-void API_ENTRY(glEnableClientState)(GLenum arg0) {
- CALL_GL_API(glEnableClientState, arg0);
+void API_ENTRY(glClipPlanex)(GLenum plane, const GLfixed *equation) {
+ CALL_GL_API(glClipPlanex, plane, equation);
}
-
-void API_ENTRY(glDisableClientState)(GLenum arg0) {
- CALL_GL_API(glDisableClientState, arg0);
-}
-
-void API_ENTRY(glClientActiveTexture)(GLenum arg0) {
- CALL_GL_API(glClientActiveTexture, arg0);
-}
-
-void API_ENTRY(glDrawArrays)(GLenum arg0, GLint arg1, GLsizei arg2) {
- CALL_GL_API(glDrawArrays, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glDrawElements)(GLenum arg0, GLsizei arg1, GLenum arg2, const GLvoid * arg3) {
- CALL_GL_API(glDrawElements, arg0, arg1, arg2, arg3);
-}
-
-void API_ENTRY(glLoadIdentity)(void) {
- CALL_GL_API(glLoadIdentity);
-}
-
-void API_ENTRY(glLoadMatrixf)(const GLfloat* arg0) {
- CALL_GL_API(glLoadMatrixf, arg0);
-}
-
-void API_ENTRY(glLoadMatrixx)(const GLfixed* arg0) {
- CALL_GL_API(glLoadMatrixx, arg0);
-}
-
-void API_ENTRY(glMatrixMode)(GLenum arg0) {
- CALL_GL_API(glMatrixMode, arg0);
-}
-
-void API_ENTRY(glMultMatrixf)(const GLfloat* arg0) {
- CALL_GL_API(glMultMatrixf, arg0);
-}
-
-void API_ENTRY(glMultMatrixx)(const GLfixed* arg0) {
- CALL_GL_API(glMultMatrixx, arg0);
-}
-
-void API_ENTRY(glPopMatrix)(void) {
- CALL_GL_API(glPopMatrix);
-}
-
-void API_ENTRY(glPushMatrix)(void) {
- CALL_GL_API(glPushMatrix);
+void API_ENTRY(glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) {
+ CALL_GL_API(glColor4ub, red, green, blue, alpha);
}
-
-void API_ENTRY(glFrustumf)(GLfloat arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3, GLfloat arg4, GLfloat arg5) {
- CALL_GL_API(glFrustumf, arg0, arg1, arg2, arg3, arg4, arg5);
+void API_ENTRY(glColor4x)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
+ CALL_GL_API(glColor4x, red, green, blue, alpha);
}
-
-void API_ENTRY(glFrustumx)(GLfixed arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3, GLfixed arg4, GLfixed arg5) {
- CALL_GL_API(glFrustumx, arg0, arg1, arg2, arg3, arg4, arg5);
+void API_ENTRY(glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
+ CALL_GL_API(glColorMask, red, green, blue, alpha);
}
-
-void API_ENTRY(glOrthof)(GLfloat arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3, GLfloat arg4, GLfloat arg5) {
- CALL_GL_API(glOrthof, arg0, arg1, arg2, arg3, arg4, arg5);
+void API_ENTRY(glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glColorPointer, size, type, stride, pointer);
}
-
-void API_ENTRY(glOrthox)(GLfixed arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3, GLfixed arg4, GLfixed arg5) {
- CALL_GL_API(glOrthox, arg0, arg1, arg2, arg3, arg4, arg5);
+void API_ENTRY(glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) {
+ CALL_GL_API(glCompressedTexImage2D, target, level, internalformat, width, height, border, imageSize, data);
}
-
-void API_ENTRY(glRotatef)(GLfloat arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3) {
- CALL_GL_API(glRotatef, arg0, arg1, arg2, arg3);
+void API_ENTRY(glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) {
+ CALL_GL_API(glCompressedTexSubImage2D, target, level, xoffset, yoffset, width, height, format, imageSize, data);
}
-
-void API_ENTRY(glRotatex)(GLfixed arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3) {
- CALL_GL_API(glRotatex, arg0, arg1, arg2, arg3);
+void API_ENTRY(glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {
+ CALL_GL_API(glCopyTexImage2D, target, level, internalformat, x, y, width, height, border);
}
-
-void API_ENTRY(glScalef)(GLfloat arg0, GLfloat arg1, GLfloat arg2) {
- CALL_GL_API(glScalef, arg0, arg1, arg2);
+void API_ENTRY(glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
+ CALL_GL_API(glCopyTexSubImage2D, target, level, xoffset, yoffset, x, y, width, height);
}
-
-void API_ENTRY(glScalex)(GLfixed arg0, GLfixed arg1, GLfixed arg2) {
- CALL_GL_API(glScalex, arg0, arg1, arg2);
+void API_ENTRY(glCullFace)(GLenum mode) {
+ CALL_GL_API(glCullFace, mode);
}
-
-void API_ENTRY(glTranslatef)(GLfloat arg0, GLfloat arg1, GLfloat arg2) {
- CALL_GL_API(glTranslatef, arg0, arg1, arg2);
+void API_ENTRY(glDeleteBuffers)(GLsizei n, const GLuint *buffers) {
+ CALL_GL_API(glDeleteBuffers, n, buffers);
}
-
-void API_ENTRY(glTranslatex)(GLfixed arg0, GLfixed arg1, GLfixed arg2) {
- CALL_GL_API(glTranslatex, arg0, arg1, arg2);
+void API_ENTRY(glDeleteTextures)(GLsizei n, const GLuint *textures) {
+ CALL_GL_API(glDeleteTextures, n, textures);
}
-
-void API_ENTRY(glViewport)(GLint arg0, GLint arg1, GLsizei arg2, GLsizei arg3) {
- CALL_GL_API(glViewport, arg0, arg1, arg2, arg3);
+void API_ENTRY(glDepthFunc)(GLenum func) {
+ CALL_GL_API(glDepthFunc, func);
}
-
-void API_ENTRY(glActiveTexture)(GLenum arg0) {
- CALL_GL_API(glActiveTexture, arg0);
+void API_ENTRY(glDepthMask)(GLboolean flag) {
+ CALL_GL_API(glDepthMask, flag);
}
-
-void API_ENTRY(glBindTexture)(GLenum arg0, GLuint arg1) {
- CALL_GL_API(glBindTexture, arg0, arg1);
+void API_ENTRY(glDepthRangex)(GLclampx zNear, GLclampx zFar) {
+ CALL_GL_API(glDepthRangex, zNear, zFar);
}
-
-void API_ENTRY(glGenTextures)(GLsizei arg0, GLuint* arg1) {
- CALL_GL_API(glGenTextures, arg0, arg1);
+void API_ENTRY(glDisable)(GLenum cap) {
+ CALL_GL_API(glDisable, cap);
}
-
-void API_ENTRY(glDeleteTextures)(GLsizei arg0, const GLuint * arg1) {
- CALL_GL_API(glDeleteTextures, arg0, arg1);
+void API_ENTRY(glDisableClientState)(GLenum array) {
+ CALL_GL_API(glDisableClientState, array);
}
-
-void API_ENTRY(glMultiTexCoord4f)(GLenum arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3, GLfloat arg4) {
- CALL_GL_API(glMultiTexCoord4f, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glDrawArrays)(GLenum mode, GLint first, GLsizei count) {
+ CALL_GL_API(glDrawArrays, mode, first, count);
}
-
-void API_ENTRY(glMultiTexCoord4x)(GLenum arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3, GLfixed arg4) {
- CALL_GL_API(glMultiTexCoord4x, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) {
+ CALL_GL_API(glDrawElements, mode, count, type, indices);
}
-
-void API_ENTRY(glPixelStorei)(GLenum arg0, GLint arg1) {
- CALL_GL_API(glPixelStorei, arg0, arg1);
+void API_ENTRY(glEnable)(GLenum cap) {
+ CALL_GL_API(glEnable, cap);
}
-
-void API_ENTRY(glTexEnvf)(GLenum arg0, GLenum arg1, GLfloat arg2) {
- CALL_GL_API(glTexEnvf, arg0, arg1, arg2);
+void API_ENTRY(glEnableClientState)(GLenum array) {
+ CALL_GL_API(glEnableClientState, array);
}
-
-void API_ENTRY(glTexEnvfv)(GLenum arg0, GLenum arg1, const GLfloat* arg2) {
- CALL_GL_API(glTexEnvfv, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glTexEnvx)(GLenum arg0, GLenum arg1, GLfixed arg2) {
- CALL_GL_API(glTexEnvx, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glTexEnvxv)(GLenum arg0, GLenum arg1, const GLfixed* arg2) {
- CALL_GL_API(glTexEnvxv, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glTexParameterf)(GLenum arg0, GLenum arg1, GLfloat arg2) {
- CALL_GL_API(glTexParameterf, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glTexParameterx)(GLenum arg0, GLenum arg1, GLfixed arg2) {
- CALL_GL_API(glTexParameterx, arg0, arg1, arg2);
-}
-
-void API_ENTRY(glCompressedTexImage2D)(GLenum arg0, GLint arg1, GLenum arg2, GLsizei arg3, GLsizei arg4, GLint arg5, GLsizei arg6, const GLvoid* arg7) {
- CALL_GL_API(glCompressedTexImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-}
-
-void API_ENTRY(glCompressedTexSubImage2D)(GLenum arg0, GLint arg1, GLint arg2, GLint arg3, GLsizei arg4, GLsizei arg5, GLenum arg6, GLsizei arg7, const GLvoid* arg8) {
- CALL_GL_API(glCompressedTexSubImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-}
-
-void API_ENTRY(glCopyTexImage2D)(GLenum arg0, GLint arg1, GLenum arg2, GLint arg3, GLint arg4, GLsizei arg5, GLsizei arg6, GLint arg7) {
- CALL_GL_API(glCopyTexImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-}
-
-void API_ENTRY(glCopyTexSubImage2D)(GLenum arg0, GLint arg1, GLint arg2, GLint arg3, GLint arg4, GLint arg5, GLsizei arg6, GLsizei arg7) {
- CALL_GL_API(glCopyTexSubImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-}
-
-void API_ENTRY(glTexImage2D)(GLenum arg0, GLint arg1, GLint arg2, GLsizei arg3, GLsizei arg4, GLint arg5, GLenum arg6, GLenum arg7, const GLvoid* arg8) {
- CALL_GL_API(glTexImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-}
-
-void API_ENTRY(glTexSubImage2D)(GLenum arg0, GLint arg1, GLint arg2, GLint arg3, GLsizei arg4, GLsizei arg5, GLenum arg6, GLenum arg7, const GLvoid* arg8) {
- CALL_GL_API(glTexSubImage2D, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-}
-
-void API_ENTRY(glReadPixels)(GLint arg0, GLint arg1, GLsizei arg2, GLsizei arg3, GLenum arg4, GLenum arg5, GLvoid * arg6) {
- CALL_GL_API(glReadPixels, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
-}
-
-void API_ENTRY(glClipPlanef)(GLenum arg0, const GLfloat* arg1) {
- CALL_GL_API(glClipPlanef, arg0, arg1);
-}
-
-void API_ENTRY(glClipPlanex)(GLenum arg0, const GLfixed* arg1) {
- CALL_GL_API(glClipPlanex, arg0, arg1);
-}
-
-void API_ENTRY(glBindBuffer)(GLenum arg0, GLuint arg1) {
- CALL_GL_API(glBindBuffer, arg0, arg1);
-}
-
-void API_ENTRY(glBufferData)(GLenum arg0, GLsizeiptr arg1, const GLvoid* arg2, GLenum arg3) {
- CALL_GL_API(glBufferData, arg0, arg1, arg2, arg3);
-}
-
-void API_ENTRY(glBufferSubData)(GLenum arg0, GLintptr arg1, GLsizeiptr arg2, const GLvoid* arg3) {
- CALL_GL_API(glBufferSubData, arg0, arg1, arg2, arg3);
-}
-
-void API_ENTRY(glDeleteBuffers)(GLsizei arg0, const GLuint* arg1) {
- CALL_GL_API(glDeleteBuffers, arg0, arg1);
-}
-
-void API_ENTRY(glGenBuffers)(GLsizei arg0, GLuint* arg1) {
- CALL_GL_API(glGenBuffers, arg0, arg1);
-}
-
-void API_ENTRY(glGetBooleanv)(GLenum arg0, GLboolean * arg1) {
- CALL_GL_API(glGetBooleanv, arg0, arg1);
-}
-
-void API_ENTRY(glGetFixedv)(GLenum arg0, GLfixed * arg1) {
- CALL_GL_API(glGetFixedv, arg0, arg1);
-}
-
-void API_ENTRY(glGetFloatv)(GLenum arg0, GLfloat * arg1) {
- CALL_GL_API(glGetFloatv, arg0, arg1);
-}
-
-void API_ENTRY(glGetPointerv)(GLenum arg0, void ** arg1) {
- CALL_GL_API(glGetPointerv, arg0, arg1);
+void API_ENTRY(glFinish)(void) {
+ CALL_GL_API(glFinish);
}
-
-void API_ENTRY(glGetBufferParameteriv)(GLenum arg0, GLenum arg1, GLint * arg2) {
- CALL_GL_API(glGetBufferParameteriv, arg0, arg1, arg2);
+void API_ENTRY(glFlush)(void) {
+ CALL_GL_API(glFlush);
}
-
-void API_ENTRY(glGetClipPlanef)(GLenum arg0, GLfloat arg1[4]) {
- CALL_GL_API(glGetClipPlanef, arg0, arg1);
+void API_ENTRY(glFogx)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glFogx, pname, param);
}
-
-void API_ENTRY(glGetClipPlanex)(GLenum arg0, GLfixed arg1[4]) {
- CALL_GL_API(glGetClipPlanex, arg0, arg1);
+void API_ENTRY(glFogxv)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glFogxv, pname, params);
}
-
-void API_ENTRY(glGetLightxv)(GLenum arg0, GLenum arg1, GLfixed * arg2) {
- CALL_GL_API(glGetLightxv, arg0, arg1, arg2);
+void API_ENTRY(glFrontFace)(GLenum mode) {
+ CALL_GL_API(glFrontFace, mode);
}
-
-void API_ENTRY(glGetLightfv)(GLenum arg0, GLenum arg1, GLfloat * arg2) {
- CALL_GL_API(glGetLightfv, arg0, arg1, arg2);
+void API_ENTRY(glFrustumx)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
+ CALL_GL_API(glFrustumx, left, right, bottom, top, zNear, zFar);
}
-
-void API_ENTRY(glGetMaterialxv)(GLenum arg0, GLenum arg1, GLfixed * arg2) {
- CALL_GL_API(glGetMaterialxv, arg0, arg1, arg2);
+void API_ENTRY(glGetBooleanv)(GLenum pname, GLboolean *params) {
+ CALL_GL_API(glGetBooleanv, pname, params);
}
-
-void API_ENTRY(glGetMaterialfv)(GLenum arg0, GLenum arg1, GLfloat * arg2) {
- CALL_GL_API(glGetMaterialfv, arg0, arg1, arg2);
+void API_ENTRY(glGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params) {
+ CALL_GL_API(glGetBufferParameteriv, target, pname, params);
}
-
-void API_ENTRY(glGetTexEnvfv)(GLenum arg0, GLenum arg1, GLfloat * arg2) {
- CALL_GL_API(glGetTexEnvfv, arg0, arg1, arg2);
+void API_ENTRY(glGetClipPlanex)(GLenum pname, GLfixed eqn[4]) {
+ CALL_GL_API(glGetClipPlanex, pname, eqn);
}
-
-void API_ENTRY(glGetTexEnviv)(GLenum arg0, GLenum arg1, GLint * arg2) {
- CALL_GL_API(glGetTexEnviv, arg0, arg1, arg2);
+void API_ENTRY(glGenBuffers)(GLsizei n, GLuint *buffers) {
+ CALL_GL_API(glGenBuffers, n, buffers);
}
-
-void API_ENTRY(glGetTexEnvxv)(GLenum arg0, GLenum arg1, GLfixed * arg2) {
- CALL_GL_API(glGetTexEnvxv, arg0, arg1, arg2);
+void API_ENTRY(glGenTextures)(GLsizei n, GLuint *textures) {
+ CALL_GL_API(glGenTextures, n, textures);
}
-
-void API_ENTRY(glGetTexParameterfv)(GLenum arg0, GLenum arg1, GLfloat * arg2) {
- CALL_GL_API(glGetTexParameterfv, arg0, arg1, arg2);
+GLenum API_ENTRY(glGetError)(void) {
+ CALL_GL_API_RETURN(glGetError);
}
-
-void API_ENTRY(glGetTexParameteriv)(GLenum arg0, GLenum arg1, GLint * arg2) {
- CALL_GL_API(glGetTexParameteriv, arg0, arg1, arg2);
+void API_ENTRY(glGetFixedv)(GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetFixedv, pname, params);
}
-
-void API_ENTRY(glGetTexParameterxv)(GLenum arg0, GLenum arg1, GLfixed * arg2) {
- CALL_GL_API(glGetTexParameterxv, arg0, arg1, arg2);
+void API_ENTRY(glGetIntegerv)(GLenum pname, GLint *params) {
+ CALL_GL_API(glGetIntegerv, pname, params);
}
-
-GLboolean API_ENTRY(glIsBuffer)(GLuint arg0) {
- CALL_GL_API_RETURN(glIsBuffer, arg0);
+void API_ENTRY(glGetLightxv)(GLenum light, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetLightxv, light, pname, params);
}
-
-GLboolean API_ENTRY(glIsEnabled)(GLenum arg0) {
- CALL_GL_API_RETURN(glIsEnabled, arg0);
+void API_ENTRY(glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetMaterialxv, face, pname, params);
}
-
-GLboolean API_ENTRY(glIsTexture)(GLuint arg0) {
- CALL_GL_API_RETURN(glIsTexture, arg0);
+void API_ENTRY(glGetPointerv)(GLenum pname, void **params) {
+ CALL_GL_API(glGetPointerv, pname, params);
}
-
-void API_ENTRY(glPointParameterf)(GLenum arg0, GLfloat arg1) {
- CALL_GL_API(glPointParameterf, arg0, arg1);
+const GLubyte * API_ENTRY(glGetString)(GLenum name) {
+ CALL_GL_API_RETURN(glGetString, name);
}
-
-void API_ENTRY(glPointParameterfv)(GLenum arg0, const GLfloat * arg1) {
- CALL_GL_API(glPointParameterfv, arg0, arg1);
+void API_ENTRY(glGetTexEnviv)(GLenum env, GLenum pname, GLint *params) {
+ CALL_GL_API(glGetTexEnviv, env, pname, params);
}
-
-void API_ENTRY(glPointParameterx)(GLenum arg0, GLfixed arg1) {
- CALL_GL_API(glPointParameterx, arg0, arg1);
+void API_ENTRY(glGetTexEnvxv)(GLenum env, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetTexEnvxv, env, pname, params);
}
-
-void API_ENTRY(glPointParameterxv)(GLenum arg0, const GLfixed * arg1) {
- CALL_GL_API(glPointParameterxv, arg0, arg1);
+void API_ENTRY(glGetTexParameteriv)(GLenum target, GLenum pname, GLint *params) {
+ CALL_GL_API(glGetTexParameteriv, target, pname, params);
}
-
-void API_ENTRY(glColor4ub)(GLubyte arg0, GLubyte arg1, GLubyte arg2, GLubyte arg3) {
- CALL_GL_API(glColor4ub, arg0, arg1, arg2, arg3);
+void API_ENTRY(glGetTexParameterxv)(GLenum target, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetTexParameterxv, target, pname, params);
}
-
-void API_ENTRY(glTexEnvi)(GLenum arg0, GLenum arg1, GLint arg2) {
- CALL_GL_API(glTexEnvi, arg0, arg1, arg2);
+void API_ENTRY(glHint)(GLenum target, GLenum mode) {
+ CALL_GL_API(glHint, target, mode);
}
-
-void API_ENTRY(glTexEnviv)(GLenum arg0, GLenum arg1, const GLint * arg2) {
- CALL_GL_API(glTexEnviv, arg0, arg1, arg2);
+GLboolean API_ENTRY(glIsBuffer)(GLuint buffer) {
+ CALL_GL_API_RETURN(glIsBuffer, buffer);
}
-
-void API_ENTRY(glTexParameterfv)(GLenum arg0, GLenum arg1, const GLfloat * arg2) {
- CALL_GL_API(glTexParameterfv, arg0, arg1, arg2);
+GLboolean API_ENTRY(glIsEnabled)(GLenum cap) {
+ CALL_GL_API_RETURN(glIsEnabled, cap);
}
-
-void API_ENTRY(glTexParameteriv)(GLenum arg0, GLenum arg1, const GLint * arg2) {
- CALL_GL_API(glTexParameteriv, arg0, arg1, arg2);
+GLboolean API_ENTRY(glIsTexture)(GLuint texture) {
+ CALL_GL_API_RETURN(glIsTexture, texture);
}
-
-void API_ENTRY(glTexParameteri)(GLenum arg0, GLenum arg1, GLint arg2) {
- CALL_GL_API(glTexParameteri, arg0, arg1, arg2);
+void API_ENTRY(glLightModelx)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glLightModelx, pname, param);
}
-
-void API_ENTRY(glTexParameterxv)(GLenum arg0, GLenum arg1, const GLfixed * arg2) {
- CALL_GL_API(glTexParameterxv, arg0, arg1, arg2);
+void API_ENTRY(glLightModelxv)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glLightModelxv, pname, params);
}
-
-void API_ENTRY(glPointSizePointerOES)(GLenum arg0, GLsizei arg1, const GLvoid* arg2) {
- CALL_GL_API(glPointSizePointerOES, arg0, arg1, arg2);
+void API_ENTRY(glLightx)(GLenum light, GLenum pname, GLfixed param) {
+ CALL_GL_API(glLightx, light, pname, param);
}
-
-void API_ENTRY(glDrawTexsOES)(GLshort arg0, GLshort arg1, GLshort arg2, GLshort arg3, GLshort arg4) {
- CALL_GL_API(glDrawTexsOES, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glLightxv)(GLenum light, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glLightxv, light, pname, params);
}
-
-void API_ENTRY(glDrawTexiOES)(GLint arg0, GLint arg1, GLint arg2, GLint arg3, GLint arg4) {
- CALL_GL_API(glDrawTexiOES, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glLineWidthx)(GLfixed width) {
+ CALL_GL_API(glLineWidthx, width);
}
-
-void API_ENTRY(glDrawTexfOES)(GLfloat arg0, GLfloat arg1, GLfloat arg2, GLfloat arg3, GLfloat arg4) {
- CALL_GL_API(glDrawTexfOES, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glLoadIdentity)(void) {
+ CALL_GL_API(glLoadIdentity);
}
-
-void API_ENTRY(glDrawTexxOES)(GLfixed arg0, GLfixed arg1, GLfixed arg2, GLfixed arg3, GLfixed arg4) {
- CALL_GL_API(glDrawTexxOES, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glLoadMatrixx)(const GLfixed *m) {
+ CALL_GL_API(glLoadMatrixx, m);
}
-
-void API_ENTRY(glDrawTexsvOES)(const GLshort* arg0) {
- CALL_GL_API(glDrawTexsvOES, arg0);
+void API_ENTRY(glLogicOp)(GLenum opcode) {
+ CALL_GL_API(glLogicOp, opcode);
}
-
-void API_ENTRY(glDrawTexivOES)(const GLint* arg0) {
- CALL_GL_API(glDrawTexivOES, arg0);
+void API_ENTRY(glMaterialx)(GLenum face, GLenum pname, GLfixed param) {
+ CALL_GL_API(glMaterialx, face, pname, param);
}
-
-void API_ENTRY(glDrawTexfvOES)(const GLfloat* arg0) {
- CALL_GL_API(glDrawTexfvOES, arg0);
+void API_ENTRY(glMaterialxv)(GLenum face, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glMaterialxv, face, pname, params);
}
-
-void API_ENTRY(glDrawTexxvOES)(const GLfixed* arg0) {
- CALL_GL_API(glDrawTexxvOES, arg0);
+void API_ENTRY(glMatrixMode)(GLenum mode) {
+ CALL_GL_API(glMatrixMode, mode);
}
-
-GLbitfield API_ENTRY(glQueryMatrixxOES)(GLfixed* arg0, GLint* arg1) {
- CALL_GL_API_RETURN(glQueryMatrixxOES, arg0, arg1);
+void API_ENTRY(glMultMatrixx)(const GLfixed *m) {
+ CALL_GL_API(glMultMatrixx, m);
}
-
-void API_ENTRY(__glEGLImageTargetTexture2DOES)(GLenum arg0, GLeglImageOES arg1) {
- CALL_GL_API(__glEGLImageTargetTexture2DOES, arg0, arg1);
+void API_ENTRY(glMultiTexCoord4x)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
+ CALL_GL_API(glMultiTexCoord4x, target, s, t, r, q);
}
-
-void API_ENTRY(__glEGLImageTargetRenderbufferStorageOES)(GLenum arg0, GLeglImageOES arg1) {
- CALL_GL_API(__glEGLImageTargetRenderbufferStorageOES, arg0, arg1);
+void API_ENTRY(glNormal3x)(GLfixed nx, GLfixed ny, GLfixed nz) {
+ CALL_GL_API(glNormal3x, nx, ny, nz);
}
-
-void API_ENTRY(glBlendEquationSeparateOES)(GLenum arg0, GLenum arg1) {
- CALL_GL_API(glBlendEquationSeparateOES, arg0, arg1);
+void API_ENTRY(glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glNormalPointer, type, stride, pointer);
}
-
-void API_ENTRY(glBlendFuncSeparateOES)(GLenum arg0, GLenum arg1, GLenum arg2, GLenum arg3) {
- CALL_GL_API(glBlendFuncSeparateOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glOrthox)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
+ CALL_GL_API(glOrthox, left, right, bottom, top, zNear, zFar);
}
-
-void API_ENTRY(glBlendEquationOES)(GLenum arg0) {
- CALL_GL_API(glBlendEquationOES, arg0);
+void API_ENTRY(glPixelStorei)(GLenum pname, GLint param) {
+ CALL_GL_API(glPixelStorei, pname, param);
}
-
-GLboolean API_ENTRY(glIsRenderbufferOES)(GLuint arg0) {
- CALL_GL_API_RETURN(glIsRenderbufferOES, arg0);
+void API_ENTRY(glPointParameterx)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glPointParameterx, pname, param);
}
-
-void API_ENTRY(glBindRenderbufferOES)(GLenum arg0, GLuint arg1) {
- CALL_GL_API(glBindRenderbufferOES, arg0, arg1);
+void API_ENTRY(glPointParameterxv)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glPointParameterxv, pname, params);
}
-
-void API_ENTRY(glDeleteRenderbuffersOES)(GLsizei arg0, const GLuint* arg1) {
- CALL_GL_API(glDeleteRenderbuffersOES, arg0, arg1);
+void API_ENTRY(glPointSizex)(GLfixed size) {
+ CALL_GL_API(glPointSizex, size);
}
-
-void API_ENTRY(glGenRenderbuffersOES)(GLsizei arg0, GLuint* arg1) {
- CALL_GL_API(glGenRenderbuffersOES, arg0, arg1);
+void API_ENTRY(glPolygonOffsetx)(GLfixed factor, GLfixed units) {
+ CALL_GL_API(glPolygonOffsetx, factor, units);
}
-
-void API_ENTRY(glRenderbufferStorageOES)(GLenum arg0, GLenum arg1, GLsizei arg2, GLsizei arg3) {
- CALL_GL_API(glRenderbufferStorageOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glPopMatrix)(void) {
+ CALL_GL_API(glPopMatrix);
}
-
-void API_ENTRY(glGetRenderbufferParameterivOES)(GLenum arg0, GLenum arg1, GLint* arg2) {
- CALL_GL_API(glGetRenderbufferParameterivOES, arg0, arg1, arg2);
+void API_ENTRY(glPushMatrix)(void) {
+ CALL_GL_API(glPushMatrix);
}
-
-GLboolean API_ENTRY(glIsFramebufferOES)(GLuint arg0) {
- CALL_GL_API_RETURN(glIsFramebufferOES, arg0);
+void API_ENTRY(glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) {
+ CALL_GL_API(glReadPixels, x, y, width, height, format, type, pixels);
}
-
-void API_ENTRY(glBindFramebufferOES)(GLenum arg0, GLuint arg1) {
- CALL_GL_API(glBindFramebufferOES, arg0, arg1);
+void API_ENTRY(glRotatex)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glRotatex, angle, x, y, z);
}
-
-void API_ENTRY(glDeleteFramebuffersOES)(GLsizei arg0, const GLuint* arg1) {
- CALL_GL_API(glDeleteFramebuffersOES, arg0, arg1);
+void API_ENTRY(glSampleCoverage)(GLclampf value, GLboolean invert) {
+ CALL_GL_API(glSampleCoverage, value, invert);
}
-
-void API_ENTRY(glGenFramebuffersOES)(GLsizei arg0, GLuint* arg1) {
- CALL_GL_API(glGenFramebuffersOES, arg0, arg1);
+void API_ENTRY(glSampleCoveragex)(GLclampx value, GLboolean invert) {
+ CALL_GL_API(glSampleCoveragex, value, invert);
}
-
-GLenum API_ENTRY(glCheckFramebufferStatusOES)(GLenum arg0) {
- CALL_GL_API_RETURN(glCheckFramebufferStatusOES, arg0);
+void API_ENTRY(glScalex)(GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glScalex, x, y, z);
}
-
-void API_ENTRY(glFramebufferRenderbufferOES)(GLenum arg0, GLenum arg1, GLenum arg2, GLuint arg3) {
- CALL_GL_API(glFramebufferRenderbufferOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glScissor)(GLint x, GLint y, GLsizei width, GLsizei height) {
+ CALL_GL_API(glScissor, x, y, width, height);
}
-
-void API_ENTRY(glFramebufferTexture2DOES)(GLenum arg0, GLenum arg1, GLenum arg2, GLuint arg3, GLint arg4) {
- CALL_GL_API(glFramebufferTexture2DOES, arg0, arg1, arg2, arg3, arg4);
+void API_ENTRY(glShadeModel)(GLenum mode) {
+ CALL_GL_API(glShadeModel, mode);
}
-
-void API_ENTRY(glGetFramebufferAttachmentParameterivOES)(GLenum arg0, GLenum arg1, GLenum arg2, GLint* arg3) {
- CALL_GL_API(glGetFramebufferAttachmentParameterivOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glStencilFunc)(GLenum func, GLint ref, GLuint mask) {
+ CALL_GL_API(glStencilFunc, func, ref, mask);
}
-
-void API_ENTRY(glGenerateMipmapOES)(GLenum arg0) {
- CALL_GL_API(glGenerateMipmapOES, arg0);
+void API_ENTRY(glStencilMask)(GLuint mask) {
+ CALL_GL_API(glStencilMask, mask);
}
-
-void* API_ENTRY(glMapBufferOES)(GLenum arg0, GLenum arg1) {
- CALL_GL_API_RETURN(glMapBufferOES, arg0, arg1);
+void API_ENTRY(glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass) {
+ CALL_GL_API(glStencilOp, fail, zfail, zpass);
}
-
-GLboolean API_ENTRY(glUnmapBufferOES)(GLenum arg0) {
- CALL_GL_API_RETURN(glUnmapBufferOES, arg0);
+void API_ENTRY(glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glTexCoordPointer, size, type, stride, pointer);
}
-
-void API_ENTRY(glGetBufferPointervOES)(GLenum arg0, GLenum arg1, void** arg2) {
- CALL_GL_API(glGetBufferPointervOES, arg0, arg1, arg2);
+void API_ENTRY(glTexEnvi)(GLenum target, GLenum pname, GLint param) {
+ CALL_GL_API(glTexEnvi, target, pname, param);
}
-
-void API_ENTRY(glCurrentPaletteMatrixOES)(GLuint arg0) {
- CALL_GL_API(glCurrentPaletteMatrixOES, arg0);
+void API_ENTRY(glTexEnvx)(GLenum target, GLenum pname, GLfixed param) {
+ CALL_GL_API(glTexEnvx, target, pname, param);
}
-
-void API_ENTRY(glLoadPaletteFromModelViewMatrixOES)(void) {
- CALL_GL_API(glLoadPaletteFromModelViewMatrixOES);
+void API_ENTRY(glTexEnviv)(GLenum target, GLenum pname, const GLint *params) {
+ CALL_GL_API(glTexEnviv, target, pname, params);
}
-
-void API_ENTRY(glMatrixIndexPointerOES)(GLint arg0, GLenum arg1, GLsizei arg2, const GLvoid * arg3) {
- CALL_GL_API(glMatrixIndexPointerOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glTexEnvxv)(GLenum target, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glTexEnvxv, target, pname, params);
}
-
-void API_ENTRY(glWeightPointerOES)(GLint arg0, GLenum arg1, GLsizei arg2, const GLvoid * arg3) {
- CALL_GL_API(glWeightPointerOES, arg0, arg1, arg2, arg3);
+void API_ENTRY(glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) {
+ CALL_GL_API(glTexImage2D, target, level, internalformat, width, height, border, format, type, pixels);
}
-
-void API_ENTRY(glTexGenfOES)(GLenum arg0, GLenum arg1, GLfloat arg2) {
- CALL_GL_API(glTexGenfOES, arg0, arg1, arg2);
+void API_ENTRY(glTexParameteri)(GLenum target, GLenum pname, GLint param) {
+ CALL_GL_API(glTexParameteri, target, pname, param);
}
-
-void API_ENTRY(glTexGenfvOES)(GLenum arg0, GLenum arg1, const GLfloat * arg2) {
- CALL_GL_API(glTexGenfvOES, arg0, arg1, arg2);
+void API_ENTRY(glTexParameterx)(GLenum target, GLenum pname, GLfixed param) {
+ CALL_GL_API(glTexParameterx, target, pname, param);
}
-
-void API_ENTRY(glTexGeniOES)(GLenum arg0, GLenum arg1, GLint arg2) {
- CALL_GL_API(glTexGeniOES, arg0, arg1, arg2);
+void API_ENTRY(glTexParameteriv)(GLenum target, GLenum pname, const GLint *params) {
+ CALL_GL_API(glTexParameteriv, target, pname, params);
}
-
-void API_ENTRY(glTexGenivOES)(GLenum arg0, GLenum arg1, const GLint * arg2) {
- CALL_GL_API(glTexGenivOES, arg0, arg1, arg2);
+void API_ENTRY(glTexParameterxv)(GLenum target, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glTexParameterxv, target, pname, params);
}
-
-void API_ENTRY(glTexGenxOES)(GLenum arg0, GLenum arg1, GLfixed arg2) {
- CALL_GL_API(glTexGenxOES, arg0, arg1, arg2);
+void API_ENTRY(glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) {
+ CALL_GL_API(glTexSubImage2D, target, level, xoffset, yoffset, width, height, format, type, pixels);
}
-
-void API_ENTRY(glTexGenxvOES)(GLenum arg0, GLenum arg1, const GLfixed * arg2) {
- CALL_GL_API(glTexGenxvOES, arg0, arg1, arg2);
+void API_ENTRY(glTranslatex)(GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glTranslatex, x, y, z);
}
-
-void API_ENTRY(glGetTexGenfvOES)(GLenum arg0, GLenum arg1, GLfloat * arg2) {
- CALL_GL_API(glGetTexGenfvOES, arg0, arg1, arg2);
+void API_ENTRY(glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glVertexPointer, size, type, stride, pointer);
}
-
-void API_ENTRY(glGetTexGenivOES)(GLenum arg0, GLenum arg1, GLint * arg2) {
- CALL_GL_API(glGetTexGenivOES, arg0, arg1, arg2);
+void API_ENTRY(glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) {
+ CALL_GL_API(glViewport, x, y, width, height);
}
-
-void API_ENTRY(glGetTexGenxvOES)(GLenum arg0, GLenum arg1, GLfixed * arg2) {
- CALL_GL_API(glGetTexGenxvOES, arg0, arg1, arg2);
+void API_ENTRY(glPointSizePointerOES)(GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glPointSizePointerOES, type, stride, pointer);
}
-
diff --git a/opengl/libs/GLES_CM/gl_logger.cpp b/opengl/libs/GLES_CM/gl_logger.cpp
deleted file mode 100644
index 27be5c9..0000000
--- a/opengl/libs/GLES_CM/gl_logger.cpp
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- ** Copyright 2007, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-
-#define LOG_TAG "GLLogger"
-
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
-
-#include <sys/ioctl.h>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <cutils/properties.h>
-
-#include <utils/String8.h>
-
-#include "gl_logger.h"
-
-#undef NELEM
-#define NELEM(x) (sizeof(x)/sizeof(*(x)))
-
-// ----------------------------------------------------------------------------
-namespace android {
-// ----------------------------------------------------------------------------
-
-template<typename T>
-static int binarySearch(T const sortedArray[], int first, int last, EGLint key)
-{
- while (first <= last) {
- int mid = (first + last) / 2;
- if (key > sortedArray[mid].key) {
- first = mid + 1;
- } else if (key < sortedArray[mid].key) {
- last = mid - 1;
- } else {
- return mid;
- }
- }
- return -1;
-}
-
-struct pair_t {
- const char* name;
- int key;
-};
-
-static const pair_t gEnumMap[] = {
- #define GLENUM(NAME, VALUE) { #NAME, VALUE },
- #include "gl_enums.in"
- #undef GLENUM
-};
-
-// ----------------------------------------------------------------------------
-
-template<typename TYPE>
-class GLLogValue {
-public:
- GLLogValue(TYPE value) : mValue(value) { }
- const TYPE& getValue() const { return mValue; }
- String8 toString() const {
- return convertToString(mValue);
- }
-private:
- const TYPE& mValue;
- String8 convertToString(unsigned int v) const {
- char buf[16];
- snprintf(buf, 16, "%u", v);
- return String8(buf);
- }
- String8 convertToString(unsigned long v) const {
- char buf[16];
- snprintf(buf, 16, "%lu", v);
- return String8(buf);
- }
- String8 convertToString(int v) const {
- char buf[16];
- snprintf(buf, 16, "%d", v);
- return String8(buf);
- }
- String8 convertToString(long v) const {
- char buf[16];
- snprintf(buf, 16, "%ld", v);
- return String8(buf);
- }
- String8 convertToString(float v) const {
- char buf[16];
- snprintf(buf, 16, "%f", v);
- return String8(buf);
- }
- String8 convertToString(void const* v) const {
- char buf[16];
- snprintf(buf, 16, "%p", v);
- return String8(buf);
- }
-};
-
-class GLLogEnum : public GLLogValue<GLenum> {
-public:
- GLLogEnum(GLenum v) : GLLogValue<GLenum>(v) { }
- String8 toString() const {
- GLenum v = getValue();
- int i = binarySearch<pair_t>(gEnumMap, 0, NELEM(gEnumMap)-1, v);
- if (i >= 0) {
- return String8(gEnumMap[i].name);
- } else {
- char buf[16];
- snprintf(buf, 16, "0x%04x", v);
- return String8(buf);
- }
- }
-};
-
-class GLLogClearBitfield : public GLLogValue<GLbitfield> {
-public:
- GLLogClearBitfield(GLbitfield v) : GLLogValue<GLbitfield>(v) { }
- String8 toString() const {
- char buf[16];
- snprintf(buf, 16, "0x%08x", getValue());
- return String8(buf);
- }
-};
-
-class GLLogBool : public GLLogValue<GLboolean> {
-public:
- GLLogBool(GLboolean v) : GLLogValue<GLboolean>(v) { }
- String8 toString() const {
- GLboolean v = getValue();
- if (v == GL_TRUE) return String8("GL_TRUE");
- if (v == GL_FALSE) return String8("GL_FALSE");
- return GLLogValue<GLboolean>::toString();
- }
-};
-
-class GLLogFixed : public GLLogValue<GLfixed> {
-public:
- GLLogFixed(GLfixed v) : GLLogValue<GLfixed>(v) { }
- String8 toString() const {
- char buf[16];
- snprintf(buf, 16, "0x%08x", getValue());
- return String8(buf);
- }
-};
-
-
-template <typename TYPE>
-class GLLogBuffer : public GLLogValue<TYPE *> {
-public:
- GLLogBuffer(TYPE* buffer, size_t count = -1)
- : GLLogValue<TYPE*>(buffer)
- { // output buffer
- }
- GLLogBuffer(TYPE const* buffer, size_t count = -1)
- : GLLogValue<TYPE*>(const_cast<TYPE*>(buffer))
- { // input buffer
- }
-};
-
-class GLLog
-{
-public:
- GLLog(const char* name) : mNumParams(0) {
- mString.append(name);
- mString.append("(");
- }
-
- ~GLLog() {
- LOGD("%s);", mString.string());
- }
-
- GLLog& operator << (unsigned char v) {
- return *this << GLLogValue<unsigned int>(v);
- }
- GLLog& operator << (short v) {
- return *this << GLLogValue<unsigned int>(v);
- }
- GLLog& operator << (unsigned int v) {
- return *this << GLLogValue<unsigned int>(v);
- }
- GLLog& operator << (int v) {
- return *this << GLLogValue<int>(v);
- }
- GLLog& operator << (long v) {
- return *this << GLLogValue<long>(v);
- }
- GLLog& operator << (unsigned long v) {
- return *this << GLLogValue<unsigned long>(v);
- }
- GLLog& operator << (float v) {
- return *this << GLLogValue<float>(v);
- }
- GLLog& operator << (const void* v) {
- return *this << GLLogValue<const void* >(v);
- }
-
- template <typename TYPE>
- GLLog& operator << (const TYPE& rhs) {
- if (mNumParams > 0)
- mString.append(", ");
- mString.append(rhs.toString());
- mNumParams++;
- return *this;
- }
-
- const String8& string() const { return mString; }
-private:
- GLLog(const GLLog&);
-
- String8 mString;
- int mNumParams;
-};
-
-#define API_ENTRY(api) log_##api
-#define CALL_GL_API(_x, ...)
-#define CALL_GL_API_RETURN(_x, ...) return(0);
-
-void API_ENTRY(glActiveTexture)(GLenum texture) {
- CALL_GL_API(glActiveTexture, texture);
- GLLog("glActiveTexture") << GLLogEnum(texture);
-}
-
-void API_ENTRY(glAlphaFunc)(GLenum func, GLclampf ref) {
- CALL_GL_API(glAlphaFunc, func, ref);
- GLLog("glAlphaFunc") << GLLogEnum(func) << ref;
-}
-
-void API_ENTRY(glAlphaFuncx)(GLenum func, GLclampx ref) {
- CALL_GL_API(glAlphaFuncx, func, ref);
- GLLog("glAlphaFuncx") << GLLogEnum(func) << GLLogFixed(ref);
-}
-
-void API_ENTRY(glBindTexture)(GLenum target, GLuint texture) {
- CALL_GL_API(glBindTexture, target, texture);
- GLLog("glBindTexture") << GLLogEnum(target) << texture;
-}
-
-void API_ENTRY(glBlendFunc)(GLenum sfactor, GLenum dfactor) {
- CALL_GL_API(glBlendFunc, sfactor, dfactor);
- GLLog("glBlendFunc") << GLLogEnum(sfactor) << GLLogEnum(dfactor);
-}
-
-void API_ENTRY(glClear)(GLbitfield mask) {
- CALL_GL_API(glClear, mask);
- GLLog("glClear") << GLLogClearBitfield(mask);
-}
-
-void API_ENTRY(glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
- CALL_GL_API(glClearColor, red, green, blue, alpha);
- GLLog("glClearColor") << red << green << blue << alpha;
-}
-
-void API_ENTRY(glClearColorx)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
- CALL_GL_API(glClearColorx, red, green, blue, alpha);
- GLLog("glClearColorx") << GLLogFixed(red) << GLLogFixed(green) << GLLogFixed(blue) << GLLogFixed(alpha);
-}
-
-void API_ENTRY(glClearDepthf)(GLclampf depth) {
- CALL_GL_API(glClearDepthf, depth);
- GLLog("glClearDepthf") << depth;
-}
-
-void API_ENTRY(glClearDepthx)(GLclampx depth) {
- CALL_GL_API(glClearDepthx, depth);
- GLLog("glClearDepthx") << GLLogFixed(depth);
-}
-
-void API_ENTRY(glClearStencil)(GLint s) {
- CALL_GL_API(glClearStencil, s);
- GLLog("glClearStencil") << s;
-}
-
-void API_ENTRY(glClientActiveTexture)(GLenum texture) {
- CALL_GL_API(glClientActiveTexture, texture);
- GLLog("glClientActiveTexture") << GLLogEnum(texture);
-}
-
-void API_ENTRY(glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
- CALL_GL_API(glColor4f, red, green, blue, alpha);
- GLLog("glColor4f") << red << green << blue << alpha;
-}
-
-void API_ENTRY(glColor4x)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
- CALL_GL_API(glColor4x, red, green, blue, alpha);
- GLLog("glColor4x") << GLLogFixed(red) << GLLogFixed(green) << GLLogFixed(blue) << GLLogFixed(alpha);
-}
-
-void API_ENTRY(glColorMask)(GLboolean r, GLboolean g, GLboolean b, GLboolean a) {
- CALL_GL_API(glColorMask, r, g, b, a);
- GLLog("glColorMask") << GLLogBool(r) << GLLogBool(g) << GLLogBool(b) << GLLogBool(a);
-}
-
-void API_ENTRY(glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
-{
- CALL_GL_API(glColorPointer, size, type, stride, ptr);
- GLLog("glColorPointer") << size << GLLogEnum(type) << stride << ptr;
-}
-
-void API_ENTRY(glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat,
- GLsizei width, GLsizei height, GLint border,
- GLsizei imageSize, const GLvoid *data) {
- CALL_GL_API(glCompressedTexImage2D, target, level, internalformat,
- width, height, border, imageSize, data);
- GLLog("glCompressedTexImage2D")
- << GLLogEnum(target) << level << GLLogEnum(internalformat)
- << width << height << border << imageSize << data;
-}
-
-void API_ENTRY(glCompressedTexSubImage2D)( GLenum target, GLint level, GLint xoffset,
- GLint yoffset, GLsizei width, GLsizei height,
- GLenum format, GLsizei imageSize,
- const GLvoid *data) {
- CALL_GL_API(glCompressedTexSubImage2D, target, level, xoffset, yoffset,
- width, height, format, imageSize, data);
- GLLog("glCompressedTexSubImage2D")
- << GLLogEnum(target) << level << xoffset << yoffset
- << width << height << GLLogEnum(format) << imageSize << data;
-}
-
-void API_ENTRY(glCopyTexImage2D)( GLenum target, GLint level, GLenum internalformat,
- GLint x, GLint y, GLsizei width, GLsizei height,
- GLint border) {
- CALL_GL_API(glCopyTexImage2D, target, level, internalformat, x, y,
- width, height, border);
- GLLog("glCopyTexImage2D")
- << GLLogEnum(target) << level << GLLogEnum(internalformat)
- << x << y << width << height << border;
-}
-
-void API_ENTRY(glCopyTexSubImage2D)( GLenum target, GLint level, GLint xoffset,
- GLint yoffset, GLint x, GLint y, GLsizei width,
- GLsizei height) {
- CALL_GL_API(glCopyTexSubImage2D, target, level, xoffset, yoffset, x, y,
- width, height);
- GLLog("glCopyTexSubImage2D")
- << GLLogEnum(target) << level << xoffset << yoffset
- << x << y << width << height;
-}
-
-void API_ENTRY(glCullFace)(GLenum mode) {
- CALL_GL_API(glCullFace, mode);
- GLLog("glCullFace") << GLLogEnum(mode);
-}
-
-void API_ENTRY(glDeleteTextures)(GLsizei n, const GLuint *textures) {
- CALL_GL_API(glDeleteTextures, n, textures);
- GLLog("glDeleteTextures") << n << GLLogBuffer<GLuint>(textures, n);
-}
-
-void API_ENTRY(glDepthFunc)(GLenum func) {
- CALL_GL_API(glDepthFunc, func);
- GLLog("glDepthFunc") << GLLogEnum(func);
-}
-
-void API_ENTRY(glDepthMask)(GLboolean flag) {
- CALL_GL_API(glDepthMask, flag);
- GLLog("glDepthMask") << GLLogBool(flag);
-}
-
-void API_ENTRY(glDepthRangef)(GLclampf zNear, GLclampf zFar) {
- CALL_GL_API(glDepthRangef, zNear, zFar);
- GLLog("glDepthRangef") << zNear << zFar;
-}
-
-void API_ENTRY(glDepthRangex)(GLclampx zNear, GLclampx zFar) {
- CALL_GL_API(glDepthRangex, zNear, zFar);
- GLLog("glDepthRangex") << GLLogFixed(zNear) << GLLogFixed(zFar);
-}
-
-void API_ENTRY(glDisable)(GLenum cap) {
- CALL_GL_API(glDisable, cap);
- GLLog("glDisable") << GLLogEnum(cap);
-}
-
-void API_ENTRY(glDisableClientState)(GLenum array) {
- CALL_GL_API(glDisableClientState, array);
- GLLog("glDisableClientState") << GLLogEnum(array);
-}
-
-void API_ENTRY(glDrawArrays)(GLenum mode, GLint first, GLsizei count) {
- CALL_GL_API(glDrawArrays, mode, first, count);
- GLLog("glDrawArrays") << GLLogEnum(mode) << first << count;
-}
-
-void API_ENTRY(glDrawElements)(GLenum mode, GLsizei count,
- GLenum type, const GLvoid *indices) {
- CALL_GL_API(glDrawElements, mode, count, type, indices);
- GLLog log("glDrawElements");
- log << GLLogEnum(mode) << count << GLLogEnum(type);
- if (type == GL_UNSIGNED_BYTE) {
- log << GLLogBuffer<GLubyte>(static_cast<const GLubyte*>(indices), count);
- } else {
- log << GLLogBuffer<GLushort>(static_cast<const GLushort*>(indices), count);
- }
- log;
-}
-
-void API_ENTRY(glEnable)(GLenum cap) {
- CALL_GL_API(glEnable, cap);
- GLLog("glEnable") << GLLogEnum(cap);
-}
-
-void API_ENTRY(glEnableClientState)(GLenum array) {
- CALL_GL_API(glEnableClientState, array);
- GLLog("glEnableClientState") << GLLogEnum(array);
-}
-
-void API_ENTRY(glFinish)(void) {
- CALL_GL_API(glFinish);
- GLLog("glFinish");
-}
-
-void API_ENTRY(glFlush)(void) {
- CALL_GL_API(glFlush);
- GLLog("glFlush");
-}
-
-void API_ENTRY(glFogf)(GLenum pname, GLfloat param) {
- CALL_GL_API(glFogf, pname, param);
- GLLog("glFogf") << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glFogfv)(GLenum pname, const GLfloat *params) {
- CALL_GL_API(glFogfv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glFogfv") << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glFogx)(GLenum pname, GLfixed param) {
- CALL_GL_API(glFogx, pname, param);
- GLLog("glFogx") << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glFogxv)(GLenum pname, const GLfixed *params) {
- CALL_GL_API(glFogxv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glFogfx") << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-
-void API_ENTRY(glFrontFace)(GLenum mode) {
- CALL_GL_API(glFrontFace, mode);
- GLLog("glFrontFace") << GLLogEnum(mode);
- }
-
-void API_ENTRY(glFrustumf)(GLfloat left, GLfloat right,
- GLfloat bottom, GLfloat top,
- GLfloat zNear, GLfloat zFar) {
- CALL_GL_API(glFrustumf, left, right, bottom, top, zNear, zFar);
- GLLog("glFrustumf") << left << right << bottom << top << zNear << zFar;
-}
-
-void API_ENTRY(glFrustumx)(GLfixed left, GLfixed right,
- GLfixed bottom, GLfixed top,
- GLfixed zNear, GLfixed zFar) {
- CALL_GL_API(glFrustumx, left, right, bottom, top, zNear, zFar);
- GLLog("glFrustumx")
- << GLLogFixed(left) << GLLogFixed(right)
- << GLLogFixed(bottom) << GLLogFixed(top)
- << GLLogFixed(zNear) << GLLogFixed(zFar);
-}
-
-void API_ENTRY(glGenTextures)(GLsizei n, GLuint *textures) {
- CALL_GL_API(glGenTextures, n, textures);
- GLLog("glGenTextures") << n << GLLogBuffer<GLuint>(textures, n);
-}
-
-GLenum API_ENTRY(glGetError)(void) {
- GLLog("glGetError");
- CALL_GL_API_RETURN(glGetError);
-}
-
-void API_ENTRY(glGetIntegerv)(GLenum pname, GLint *params) {
- CALL_GL_API(glGetIntegerv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetIntegerv") << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-
-const GLubyte * API_ENTRY(glGetString)(GLenum name) {
- GLLog("glGetString") << GLLogEnum(name);
- CALL_GL_API_RETURN(glGetString, name);
-}
-
-void API_ENTRY(glHint)(GLenum target, GLenum mode) {
- CALL_GL_API(glHint, target, mode);
- GLLog("GLenum") << GLLogEnum(target) << GLLogEnum(mode);
-}
-
-void API_ENTRY(glLightModelf)(GLenum pname, GLfloat param) {
- CALL_GL_API(glLightModelf, pname, param);
- GLLog("glLightModelf") << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glLightModelfv)(GLenum pname, const GLfloat *params) {
- CALL_GL_API(glLightModelfv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glLightModelfv") << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glLightModelx)(GLenum pname, GLfixed param) {
- CALL_GL_API(glLightModelx, pname, param);
- GLLog("glLightModelx") << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glLightModelxv)(GLenum pname, const GLfixed *params) {
- CALL_GL_API(glLightModelxv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glLightModelxv") << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-
-void API_ENTRY(glLightf)(GLenum light, GLenum pname, GLfloat param) {
- CALL_GL_API(glLightf, light, pname, param);
- GLLog("glLightf") << GLLogEnum(light) << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glLightfv)(GLenum light, GLenum pname, const GLfloat *params) {
- CALL_GL_API(glLightfv, light, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glLightfv") << GLLogEnum(light) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glLightx)(GLenum light, GLenum pname, GLfixed param) {
- CALL_GL_API(glLightx, light, pname, param);
- GLLog("glLightx") << GLLogEnum(light) << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glLightxv)(GLenum light, GLenum pname, const GLfixed *params) {
- CALL_GL_API(glLightxv, light, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glLightxv") << GLLogEnum(light) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-
-void API_ENTRY(glLineWidth)(GLfloat width) {
- CALL_GL_API(glLineWidth, width);
- GLLog("glLineWidth") << width;
-}
-
-void API_ENTRY(glLineWidthx)(GLfixed width) {
- CALL_GL_API(glLineWidthx, width);
- GLLog("glLineWidth") << GLLogFixed(width);
-}
-
-void API_ENTRY(glLoadIdentity)(void) {
- CALL_GL_API(glLoadIdentity);
- GLLog("glLoadIdentity");
-}
-
-void API_ENTRY(glLoadMatrixf)(const GLfloat *m) {
- CALL_GL_API(glLoadMatrixf, m);
- GLLog("glLoadMatrixf") << GLLogBuffer<GLfloat>(m, 16);
-}
-
-void API_ENTRY(glLoadMatrixx)(const GLfixed *m) {
- CALL_GL_API(glLoadMatrixx, m);
- GLLog("glLoadMatrixx") << GLLogBuffer<GLfixed>(m, 16);
-}
-
-void API_ENTRY(glLogicOp)(GLenum opcode) {
- CALL_GL_API(glLogicOp, opcode);
- GLLog("glLogicOp") << GLLogEnum(opcode);
-}
-
-void API_ENTRY(glMaterialf)(GLenum face, GLenum pname, GLfloat param) {
- CALL_GL_API(glMaterialf, face, pname, param);
- GLLog("glMaterialf") << GLLogEnum(face) << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params) {
- CALL_GL_API(glMaterialfv, face, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glMaterialfv") << GLLogEnum(face) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glMaterialx)(GLenum face, GLenum pname, GLfixed param) {
- CALL_GL_API(glMaterialx, face, pname, param);
- GLLog("glMaterialx") << GLLogEnum(face) << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glMaterialxv)(GLenum face, GLenum pname, const GLfixed *params) {
- CALL_GL_API(glMaterialxv, face, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glMaterialxv") << GLLogEnum(face) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-
-void API_ENTRY(glMatrixMode)(GLenum mode) {
- CALL_GL_API(glMatrixMode, mode);
- GLLog("glMatrixMode") << GLLogEnum(mode);
-}
-
-void API_ENTRY(glMultMatrixf)(const GLfloat *m) {
- CALL_GL_API(glMultMatrixf, m);
- GLLog("glMultMatrixf") << GLLogBuffer<GLfloat>(m, 16);
-}
-
-void API_ENTRY(glMultMatrixx)(const GLfixed *m) {
- CALL_GL_API(glMultMatrixx, m);
- GLLog("glMultMatrixx") << GLLogBuffer<GLfixed>(m, 16);
-}
-
-void API_ENTRY(glMultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {
- CALL_GL_API(glMultiTexCoord4f, target, s, t, r, q);
- GLLog("glMultiTexCoord4f") << GLLogEnum(target) << s << t << r << q;
-}
-
-void API_ENTRY(glMultiTexCoord4x)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
- CALL_GL_API(glMultiTexCoord4x, target, s, t, r, q);
- GLLog("glMultiTexCoord4x") << GLLogEnum(target)
- << GLLogFixed(s) << GLLogFixed(t) << GLLogFixed(r) << GLLogFixed(q);
-}
-
-void API_ENTRY(glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz) {
- CALL_GL_API(glNormal3f, nx, ny, nz);
- GLLog("glNormal3f") << nx << ny << nz;
-}
-
-void API_ENTRY(glNormal3x)(GLfixed nx, GLfixed ny, GLfixed nz) {
- CALL_GL_API(glNormal3x, nx, ny, nz);
- GLLog("glNormal3x") << GLLogFixed(nx) << GLLogFixed(ny) << GLLogFixed(nz);
-}
-
-void API_ENTRY(glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer) {
- CALL_GL_API(glNormalPointer, type, stride, pointer);
- GLLog("glNormalPointer") << GLLogEnum(type) << stride << pointer;
-}
-
-void API_ENTRY(glOrthof)( GLfloat left, GLfloat right,
- GLfloat bottom, GLfloat top,
- GLfloat zNear, GLfloat zFar) {
- CALL_GL_API(glOrthof, left, right, bottom, top, zNear, zFar);
- GLLog("glOrthof") << left << right << bottom << top << zNear << zFar;
-}
-
-void API_ENTRY(glOrthox)( GLfixed left, GLfixed right,
- GLfixed bottom, GLfixed top,
- GLfixed zNear, GLfixed zFar) {
- CALL_GL_API(glOrthox, left, right, bottom, top, zNear, zFar);
- GLLog("glOrthox") << GLLogFixed(left) << GLLogFixed(right)
- << GLLogFixed(bottom) << GLLogFixed(top)
- << GLLogFixed(zNear) << GLLogFixed(zFar);
-}
-
-void API_ENTRY(glPixelStorei)(GLenum pname, GLint param) {
- CALL_GL_API(glPixelStorei, pname, param);
- GLLog("glPixelStorei") << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glPointSize)(GLfloat size) {
- CALL_GL_API(glPointSize, size);
- GLLog("glPointSize") << size;
-}
-
-void API_ENTRY(glPointSizex)(GLfixed size) {
- CALL_GL_API(glPointSizex, size);
- GLLog("glPointSizex") << GLLogFixed(size);
-}
-
-void API_ENTRY(glPolygonOffset)(GLfloat factor, GLfloat units) {
- CALL_GL_API(glPolygonOffset, factor, units);
- GLLog("glPolygonOffset") << factor << units;
-}
-
-void API_ENTRY(glPolygonOffsetx)(GLfixed factor, GLfixed units) {
- CALL_GL_API(glPolygonOffsetx, factor, units);
- GLLog("glPolygonOffsetx") << GLLogFixed(factor) << GLLogFixed(units);
-}
-
-void API_ENTRY(glPopMatrix)(void) {
- CALL_GL_API(glPopMatrix);
- GLLog("glPopMatrix");
-}
-
-void API_ENTRY(glPushMatrix)(void) {
- CALL_GL_API(glPushMatrix);
- GLLog("glPushMatrix");
-}
-
-void API_ENTRY(glReadPixels)( GLint x, GLint y, GLsizei width, GLsizei height,
- GLenum format, GLenum type, GLvoid *pixels) {
- CALL_GL_API(glReadPixels, x, y, width, height, format, type, pixels);
- // XXX: we need to compute the size of this buffer
- GLLog("glReadPixels") << x << y << width << height << GLLogEnum(format) << GLLogEnum(type)
- << GLLogBuffer<unsigned char>(static_cast<unsigned char *>(pixels));
-}
-
-void API_ENTRY(glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {
- CALL_GL_API(glRotatef, angle, x, y, z);
- GLLog("glRotatef") << angle << x << y << z;
-}
-
-void API_ENTRY(glRotatex)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
- CALL_GL_API(glRotatex, angle, x, y, z);
- GLLog("glRotatex") << GLLogFixed(angle) << GLLogFixed(x) << GLLogFixed(y) << GLLogFixed(z);
-}
-
-void API_ENTRY(glSampleCoverage)(GLclampf value, GLboolean invert) {
- CALL_GL_API(glSampleCoverage, value, invert);
- GLLog("glSampleCoverage") << value << GLLogBool(invert);
-}
-
-void API_ENTRY(glSampleCoveragex)(GLclampx value, GLboolean invert) {
- CALL_GL_API(glSampleCoveragex, value, invert);
- GLLog("glSampleCoveragex") << GLLogFixed(value) << GLLogBool(invert);
-}
-
-void API_ENTRY(glScalef)(GLfloat x, GLfloat y, GLfloat z) {
- CALL_GL_API(glScalef, x, y, z);
- GLLog("glScalef") << x << y << z;
-}
-
-void API_ENTRY(glScalex)(GLfixed x, GLfixed y, GLfixed z) {
- CALL_GL_API(glScalex, x, y, z);
- GLLog("glScalex") << GLLogFixed(x) << GLLogFixed(y) << GLLogFixed(z);
-}
-
-void API_ENTRY(glScissor)(GLint x, GLint y, GLsizei width, GLsizei height) {
- CALL_GL_API(glScissor, x, y, width, height);
- GLLog("glScissor") << x << y << width << height;
-}
-
-void API_ENTRY(glShadeModel)(GLenum mode) {
- CALL_GL_API(glShadeModel, mode);
- GLLog("glShadeModel") << GLLogEnum(mode);
-}
-
-void API_ENTRY(glStencilFunc)(GLenum func, GLint ref, GLuint mask) {
- CALL_GL_API(glStencilFunc, func, ref, mask);
- GLLog("glStencilFunc") << GLLogEnum(func) << ref << mask;
-}
-
-void API_ENTRY(glStencilMask)(GLuint mask) {
- CALL_GL_API(glStencilMask, mask);
- GLLog("glStencilMask") << mask;
-}
-
-void API_ENTRY(glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass) {
- CALL_GL_API(glStencilOp, fail, zfail, zpass);
- GLLog("glStencilOp") << GLLogEnum(fail) << GLLogEnum(zfail) << GLLogEnum(zpass);
-}
-
-void API_ENTRY(glTexCoordPointer)( GLint size, GLenum type,
- GLsizei stride, const GLvoid *pointer) {
- CALL_GL_API(glTexCoordPointer, size, type, stride, pointer);
- GLLog("glTexCoordPointer") << size << GLLogEnum(type) << stride << pointer;
-}
-
-void API_ENTRY(glTexEnvf)(GLenum target, GLenum pname, GLfloat param) {
- CALL_GL_API(glTexEnvf, target, pname, param);
- GLLog("glTexEnvf") << GLLogEnum(target) << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params) {
- CALL_GL_API(glTexEnvfv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexEnvx") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glTexEnvx)(GLenum target, GLenum pname, GLfixed param) {
- CALL_GL_API(glTexEnvx, target, pname, param);
- GLLog("glTexEnvx") << GLLogEnum(target) << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glTexEnvxv)(GLenum target, GLenum pname, const GLfixed *params) {
- CALL_GL_API(glTexEnvxv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexEnvxv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-
-void API_ENTRY(glTexImage2D)( GLenum target, GLint level, GLint internalformat,
- GLsizei width, GLsizei height, GLint border, GLenum format,
- GLenum type, const GLvoid *pixels) {
- CALL_GL_API(glTexImage2D, target, level, internalformat, width, height,
- border, format, type, pixels);
- GLLog("glTexImage2D") << GLLogEnum(target) << level << GLLogEnum(internalformat)
- << width << height << border << GLLogEnum(format) << GLLogEnum(type)
- << GLLogBuffer<unsigned char>( static_cast<const unsigned char *>(pixels));
-}
-
-void API_ENTRY(glTexParameterf)(GLenum target, GLenum pname, GLfloat param) {
- CALL_GL_API(glTexParameterf, target, pname, param);
- GLLog("glTexParameterf") << GLLogEnum(target) << GLLogEnum(pname) << param;
-}
-
-void API_ENTRY(glTexParameterx)(GLenum target, GLenum pname, GLfixed param) {
- CALL_GL_API(glTexParameterx, target, pname, param);
- GLLog("glTexParameterx") << GLLogEnum(target) << GLLogEnum(pname) << GLLogFixed(param);
-}
-
-void API_ENTRY(glTexSubImage2D)( GLenum target, GLint level, GLint xoffset,
- GLint yoffset, GLsizei width, GLsizei height,
- GLenum format, GLenum type, const GLvoid *pixels) {
- CALL_GL_API(glTexSubImage2D, target, level, xoffset, yoffset,
- width, height, format, type, pixels);
- GLLog("glTexSubImage2D") << GLLogEnum(target) << level << xoffset << yoffset
- << width << height << GLLogEnum(format) << GLLogEnum(type)
- << GLLogBuffer<unsigned char>( static_cast<const unsigned char *>(pixels));
-}
-
-void API_ENTRY(glTranslatef)(GLfloat x, GLfloat y, GLfloat z) {
- CALL_GL_API(glTranslatef, x, y, z);
- GLLog("glTranslatef") << x << y << z;
-}
-
-void API_ENTRY(glTranslatex)(GLfixed x, GLfixed y, GLfixed z) {
- CALL_GL_API(glTranslatex, x, y, z);
- GLLog("glTranslatex") << GLLogFixed(x) << GLLogFixed(y) << GLLogFixed(z);
-}
-
-void API_ENTRY(glVertexPointer)( GLint size, GLenum type,
- GLsizei stride, const GLvoid *pointer) {
- CALL_GL_API(glVertexPointer, size, type, stride, pointer);
- GLLog("glVertexPointer") << size << GLLogEnum(type) << stride << pointer;
-}
-
-void API_ENTRY(glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) {
- CALL_GL_API(glViewport, x, y, width, height);
- GLLog("glViewport") << x << y << width << height;
-}
-
-// ES 1.1
-void API_ENTRY(glClipPlanef)(GLenum plane, const GLfloat *equation) {
- CALL_GL_API(glClipPlanef, plane, equation);
- GLLog("glClipPlanef") << GLLogEnum(plane) << GLLogBuffer<GLfloat>(equation, 4);
-}
-void API_ENTRY(glClipPlanex)(GLenum plane, const GLfixed *equation) {
- CALL_GL_API(glClipPlanex, plane, equation);
- GLLog("glClipPlanex") << GLLogEnum(plane) << GLLogBuffer<GLfixed>(equation, 4);
-}
-void API_ENTRY(glBindBuffer)(GLenum target, GLuint buffer) {
- CALL_GL_API(glBindBuffer, target, buffer);
- GLLog("glBindBuffer") << GLLogEnum(target) << buffer;
-}
-void API_ENTRY(glBufferData)(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) {
- CALL_GL_API(glBufferData, target, size, data, usage);
- GLLog("glBufferData") << GLLogEnum(target) << size
- << GLLogBuffer<unsigned char>(static_cast<const unsigned char*>(data), size);
-}
-void API_ENTRY(glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) {
- CALL_GL_API(glBufferSubData, target, offset, size, data);
- GLLog("glBufferSubData") << GLLogEnum(target) << offset << size
- << GLLogBuffer<unsigned char>(static_cast<const unsigned char*>(data), size);
-}
-void API_ENTRY(glDeleteBuffers)(GLsizei n, const GLuint* buffers) {
- CALL_GL_API(glDeleteBuffers, n, buffers);
- GLLog("glDeleteBuffers") << n << GLLogBuffer<GLuint>(buffers, n);
-}
-void API_ENTRY(glGenBuffers)(GLsizei n, GLuint* buffers) {
- CALL_GL_API(glGenBuffers, n, buffers);
- GLLog("glGenBuffers") << n << GLLogBuffer<GLuint>(buffers, n);
-}
-void API_ENTRY(glGetBooleanv)(GLenum pname, GLboolean *params) {
- CALL_GL_API(glGetBooleanv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetBooleanv") << GLLogEnum(pname) << GLLogBuffer<GLboolean>(params);
-}
-void API_ENTRY(glGetFixedv)(GLenum pname, GLfixed *params) {
- CALL_GL_API(glGetFixedv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetFixedv") << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glGetFloatv)(GLenum pname, GLfloat *params) {
- CALL_GL_API(glGetFloatv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetFloatv") << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glGetPointerv)(GLenum pname, void **params) {
- CALL_GL_API(glGetPointerv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetPointerv") << GLLogEnum(pname) << GLLogBuffer<void*>(params);
-}
-void API_ENTRY(glGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params) {
- // XXX: we need to compute the size of this buffer
- CALL_GL_API(glGetBufferParameteriv, target, pname, params);
- GLLog("glGetBufferParameteriv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-void API_ENTRY(glGetClipPlanef)(GLenum pname, GLfloat eqn[4]) {
- CALL_GL_API(glGetClipPlanef, pname, eqn);
- GLLog("glGetClipPlanef") << GLLogEnum(pname) << GLLogBuffer<GLfloat>(eqn, 4);
-}
-void API_ENTRY(glGetClipPlanex)(GLenum pname, GLfixed eqn[4]) {
- CALL_GL_API(glGetClipPlanex, pname, eqn);
- GLLog("glGetClipPlanex") << GLLogEnum(pname) << GLLogBuffer<GLfixed>(eqn, 4);
-}
-void API_ENTRY(glGetLightxv)(GLenum light, GLenum pname, GLfixed *params) {
- CALL_GL_API(glGetLightxv, light, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetLightxv") << GLLogEnum(light) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glGetLightfv)(GLenum light, GLenum pname, GLfloat *params) {
- CALL_GL_API(glGetLightfv, light, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetLightfv") << GLLogEnum(light) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params) {
- CALL_GL_API(glGetMaterialxv, face, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetMaterialxv") << GLLogEnum(face) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params) {
- CALL_GL_API(glGetMaterialfv, face, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetMaterialfv") << GLLogEnum(face) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glGetTexEnvfv)(GLenum env, GLenum pname, GLfloat *params) {
- CALL_GL_API(glGetTexEnvfv, env, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexEnvfv") << GLLogEnum(env) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glGetTexEnviv)(GLenum env, GLenum pname, GLint *params) {
- CALL_GL_API(glGetTexEnviv, env, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexEnviv") << GLLogEnum(env) << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-void API_ENTRY(glGetTexEnvxv)(GLenum env, GLenum pname, GLfixed *params) {
- CALL_GL_API(glGetTexEnvxv, env, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexEnvxv") << GLLogEnum(env) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params) {
- CALL_GL_API(glGetTexParameterfv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexParameterfv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glGetTexParameteriv)(GLenum target, GLenum pname, GLint *params) {
- CALL_GL_API(glGetTexParameteriv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexParameteriv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-void API_ENTRY(glGetTexParameterxv)(GLenum target, GLenum pname, GLfixed *params) {
- CALL_GL_API(glGetTexParameterxv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glGetTexParameterxv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-GLboolean API_ENTRY(glIsBuffer)(GLuint buffer) {
- GLLog("glIsBuffer") << buffer;
- CALL_GL_API_RETURN(glIsBuffer, buffer);
-}
-GLboolean API_ENTRY(glIsEnabled)(GLenum cap) {
- GLLog("glIsEnabled") << GLLogEnum(cap);
- CALL_GL_API_RETURN(glIsEnabled, cap);
-}
-GLboolean API_ENTRY(glIsTexture)(GLuint texture) {
- GLLog("glIsTexture") << texture;
- CALL_GL_API_RETURN(glIsTexture, texture);
-}
-void API_ENTRY(glPointParameterf)(GLenum pname, GLfloat param) {
- CALL_GL_API(glPointParameterf, pname, param);
- GLLog("glPointParameterf") << GLLogEnum(pname) << param;
-}
-void API_ENTRY(glPointParameterfv)(GLenum pname, const GLfloat *params) {
- CALL_GL_API(glPointParameterfv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glPointParameterfv") << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-void API_ENTRY(glPointParameterx)(GLenum pname, GLfixed param) {
- CALL_GL_API(glPointParameterx, pname, param);
- GLLog("glPointParameterx") << GLLogEnum(pname) << GLLogFixed(param);
-}
-void API_ENTRY(glPointParameterxv)(GLenum pname, const GLfixed *params) {
- CALL_GL_API(glPointParameterxv, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glPointParameterxv") << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) {
- CALL_GL_API(glColor4ub, red, green, blue, alpha);
- GLLog("glColor4ub") << red << green << blue << alpha;
-}
-void API_ENTRY(glTexEnvi)(GLenum target, GLenum pname, GLint param) {
- CALL_GL_API(glTexEnvi, target, pname, param);
- GLLog("glTexEnvi") << GLLogEnum(target) << GLLogEnum(pname) << param;
-}
-void API_ENTRY(glTexEnviv)(GLenum target, GLenum pname, const GLint *params) {
- CALL_GL_API(glTexEnviv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexEnviv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-
-void API_ENTRY(glTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params) {
- CALL_GL_API(glTexParameterfv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexParameterfv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfloat>(params);
-}
-
-void API_ENTRY(glTexParameteriv)(GLenum target, GLenum pname, const GLint *params) {
- CALL_GL_API(glTexParameteriv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexParameteriv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLint>(params);
-}
-
-void API_ENTRY(glTexParameteri)(GLenum target, GLenum pname, GLint param) {
- CALL_GL_API(glTexParameteri, target, pname, param);
- GLLog("glTexParameteri") << GLLogEnum(target) << GLLogEnum(pname) << param;
-}
-void API_ENTRY(glTexParameterxv)(GLenum target, GLenum pname, const GLfixed *params) {
- CALL_GL_API(glTexParameterxv, target, pname, params);
- // XXX: we need to compute the size of this buffer
- GLLog("glTexParameterxv") << GLLogEnum(target) << GLLogEnum(pname) << GLLogBuffer<GLfixed>(params);
-}
-void API_ENTRY(glPointSizePointerOES)(GLenum type, GLsizei stride, const GLvoid *pointer) {
- CALL_GL_API(glPointSizePointerOES, type, stride, pointer);
- GLLog("glPointSizePointerOES") << GLLogEnum(type) << stride << pointer;
-}
-
-// Extensions
-void API_ENTRY(glDrawTexsOES)(GLshort x , GLshort y, GLshort z, GLshort w, GLshort h) {
- CALL_GL_API(glDrawTexsOES, x, y, z, w, h);
- GLLog("glDrawTexsOES") << x << y << z << w << h;
-}
-void API_ENTRY(glDrawTexiOES)(GLint x, GLint y, GLint z, GLint w, GLint h) {
- CALL_GL_API(glDrawTexiOES, x, y, z, w, h);
- GLLog("glDrawTexiOES") << x << y << z << w << h;
-}
-void API_ENTRY(glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h) {
- CALL_GL_API(glDrawTexfOES, x, y, z, w, h);
- GLLog("glDrawTexfOES") << x << y << z << w << h;
-}
-void API_ENTRY(glDrawTexxOES)(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h) {
- CALL_GL_API(glDrawTexxOES, x, y, z, w, h);
- GLLog("glDrawTexfOES") << GLLogFixed(x) << GLLogFixed(y) << GLLogFixed(z) << GLLogFixed(w) << GLLogFixed(h);
-}
-void API_ENTRY(glDrawTexsvOES)(const GLshort* coords) {
- CALL_GL_API(glDrawTexsvOES, coords);
- GLLog("glDrawTexsvOES") << GLLogBuffer<GLshort>(coords, 5);
-}
-void API_ENTRY(glDrawTexivOES)(const GLint* coords) {
- CALL_GL_API(glDrawTexivOES, coords);
- GLLog("glDrawTexivOES") << GLLogBuffer<GLint>(coords, 5);
-}
-void API_ENTRY(glDrawTexfvOES)(const GLfloat* coords) {
- CALL_GL_API(glDrawTexfvOES, coords);
- GLLog("glDrawTexfvOES") << GLLogBuffer<GLfloat>(coords, 5);
-}
-void API_ENTRY(glDrawTexxvOES)(const GLfixed* coords) {
- CALL_GL_API(glDrawTexxvOES, coords);
- GLLog("glDrawTexxvOES") << GLLogBuffer<GLfixed>(coords, 5);
-}
-GLbitfield API_ENTRY(glQueryMatrixxOES)(GLfixed* mantissa, GLint* exponent) {
- GLLog("glQueryMatrixxOES") << GLLogBuffer<GLfixed>(mantissa, 16) << GLLogBuffer<GLfixed>(exponent, 16);
- CALL_GL_API_RETURN(glQueryMatrixxOES, mantissa, exponent);
-}
-
-// ----------------------------------------------------------------------------
-}; // namespace android
-// ----------------------------------------------------------------------------
diff --git a/opengl/libs/GLES_CM/glext_api.in b/opengl/libs/GLES_CM/glext_api.in
new file mode 100644
index 0000000..2c8648e
--- /dev/null
+++ b/opengl/libs/GLES_CM/glext_api.in
@@ -0,0 +1,270 @@
+void API_ENTRY(glBlendEquationSeparateOES)(GLenum modeRGB, GLenum modeAlpha) {
+ CALL_GL_API(glBlendEquationSeparateOES, modeRGB, modeAlpha);
+}
+void API_ENTRY(glBlendFuncSeparateOES)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
+ CALL_GL_API(glBlendFuncSeparateOES, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+void API_ENTRY(glBlendEquationOES)(GLenum mode) {
+ CALL_GL_API(glBlendEquationOES, mode);
+}
+void API_ENTRY(glDrawTexsOES)(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height) {
+ CALL_GL_API(glDrawTexsOES, x, y, z, width, height);
+}
+void API_ENTRY(glDrawTexiOES)(GLint x, GLint y, GLint z, GLint width, GLint height) {
+ CALL_GL_API(glDrawTexiOES, x, y, z, width, height);
+}
+void API_ENTRY(glDrawTexxOES)(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height) {
+ CALL_GL_API(glDrawTexxOES, x, y, z, width, height);
+}
+void API_ENTRY(glDrawTexsvOES)(const GLshort *coords) {
+ CALL_GL_API(glDrawTexsvOES, coords);
+}
+void API_ENTRY(glDrawTexivOES)(const GLint *coords) {
+ CALL_GL_API(glDrawTexivOES, coords);
+}
+void API_ENTRY(glDrawTexxvOES)(const GLfixed *coords) {
+ CALL_GL_API(glDrawTexxvOES, coords);
+}
+void API_ENTRY(glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) {
+ CALL_GL_API(glDrawTexfOES, x, y, z, width, height);
+}
+void API_ENTRY(glDrawTexfvOES)(const GLfloat *coords) {
+ CALL_GL_API(glDrawTexfvOES, coords);
+}
+void API_ENTRY(__glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image) {
+ CALL_GL_API(glEGLImageTargetTexture2DOES, target, image);
+}
+void API_ENTRY(__glEGLImageTargetRenderbufferStorageOES)(GLenum target, GLeglImageOES image) {
+ CALL_GL_API(glEGLImageTargetRenderbufferStorageOES, target, image);
+}
+void API_ENTRY(glAlphaFuncxOES)(GLenum func, GLclampx ref) {
+ CALL_GL_API(glAlphaFuncxOES, func, ref);
+}
+void API_ENTRY(glClearColorxOES)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
+ CALL_GL_API(glClearColorxOES, red, green, blue, alpha);
+}
+void API_ENTRY(glClearDepthxOES)(GLclampx depth) {
+ CALL_GL_API(glClearDepthxOES, depth);
+}
+void API_ENTRY(glClipPlanexOES)(GLenum plane, const GLfixed *equation) {
+ CALL_GL_API(glClipPlanexOES, plane, equation);
+}
+void API_ENTRY(glColor4xOES)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
+ CALL_GL_API(glColor4xOES, red, green, blue, alpha);
+}
+void API_ENTRY(glDepthRangexOES)(GLclampx zNear, GLclampx zFar) {
+ CALL_GL_API(glDepthRangexOES, zNear, zFar);
+}
+void API_ENTRY(glFogxOES)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glFogxOES, pname, param);
+}
+void API_ENTRY(glFogxvOES)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glFogxvOES, pname, params);
+}
+void API_ENTRY(glFrustumxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
+ CALL_GL_API(glFrustumxOES, left, right, bottom, top, zNear, zFar);
+}
+void API_ENTRY(glGetClipPlanexOES)(GLenum pname, GLfixed eqn[4]) {
+ CALL_GL_API(glGetClipPlanexOES, pname, eqn);
+}
+void API_ENTRY(glGetFixedvOES)(GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetFixedvOES, pname, params);
+}
+void API_ENTRY(glGetLightxvOES)(GLenum light, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetLightxvOES, light, pname, params);
+}
+void API_ENTRY(glGetMaterialxvOES)(GLenum face, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetMaterialxvOES, face, pname, params);
+}
+void API_ENTRY(glGetTexEnvxvOES)(GLenum env, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetTexEnvxvOES, env, pname, params);
+}
+void API_ENTRY(glGetTexParameterxvOES)(GLenum target, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetTexParameterxvOES, target, pname, params);
+}
+void API_ENTRY(glLightModelxOES)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glLightModelxOES, pname, param);
+}
+void API_ENTRY(glLightModelxvOES)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glLightModelxvOES, pname, params);
+}
+void API_ENTRY(glLightxOES)(GLenum light, GLenum pname, GLfixed param) {
+ CALL_GL_API(glLightxOES, light, pname, param);
+}
+void API_ENTRY(glLightxvOES)(GLenum light, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glLightxvOES, light, pname, params);
+}
+void API_ENTRY(glLineWidthxOES)(GLfixed width) {
+ CALL_GL_API(glLineWidthxOES, width);
+}
+void API_ENTRY(glLoadMatrixxOES)(const GLfixed *m) {
+ CALL_GL_API(glLoadMatrixxOES, m);
+}
+void API_ENTRY(glMaterialxOES)(GLenum face, GLenum pname, GLfixed param) {
+ CALL_GL_API(glMaterialxOES, face, pname, param);
+}
+void API_ENTRY(glMaterialxvOES)(GLenum face, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glMaterialxvOES, face, pname, params);
+}
+void API_ENTRY(glMultMatrixxOES)(const GLfixed *m) {
+ CALL_GL_API(glMultMatrixxOES, m);
+}
+void API_ENTRY(glMultiTexCoord4xOES)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
+ CALL_GL_API(glMultiTexCoord4xOES, target, s, t, r, q);
+}
+void API_ENTRY(glNormal3xOES)(GLfixed nx, GLfixed ny, GLfixed nz) {
+ CALL_GL_API(glNormal3xOES, nx, ny, nz);
+}
+void API_ENTRY(glOrthoxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
+ CALL_GL_API(glOrthoxOES, left, right, bottom, top, zNear, zFar);
+}
+void API_ENTRY(glPointParameterxOES)(GLenum pname, GLfixed param) {
+ CALL_GL_API(glPointParameterxOES, pname, param);
+}
+void API_ENTRY(glPointParameterxvOES)(GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glPointParameterxvOES, pname, params);
+}
+void API_ENTRY(glPointSizexOES)(GLfixed size) {
+ CALL_GL_API(glPointSizexOES, size);
+}
+void API_ENTRY(glPolygonOffsetxOES)(GLfixed factor, GLfixed units) {
+ CALL_GL_API(glPolygonOffsetxOES, factor, units);
+}
+void API_ENTRY(glRotatexOES)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glRotatexOES, angle, x, y, z);
+}
+void API_ENTRY(glSampleCoveragexOES)(GLclampx value, GLboolean invert) {
+ CALL_GL_API(glSampleCoveragexOES, value, invert);
+}
+void API_ENTRY(glScalexOES)(GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glScalexOES, x, y, z);
+}
+void API_ENTRY(glTexEnvxOES)(GLenum target, GLenum pname, GLfixed param) {
+ CALL_GL_API(glTexEnvxOES, target, pname, param);
+}
+void API_ENTRY(glTexEnvxvOES)(GLenum target, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glTexEnvxvOES, target, pname, params);
+}
+void API_ENTRY(glTexParameterxOES)(GLenum target, GLenum pname, GLfixed param) {
+ CALL_GL_API(glTexParameterxOES, target, pname, param);
+}
+void API_ENTRY(glTexParameterxvOES)(GLenum target, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glTexParameterxvOES, target, pname, params);
+}
+void API_ENTRY(glTranslatexOES)(GLfixed x, GLfixed y, GLfixed z) {
+ CALL_GL_API(glTranslatexOES, x, y, z);
+}
+GLboolean API_ENTRY(glIsRenderbufferOES)(GLuint renderbuffer) {
+ CALL_GL_API_RETURN(glIsRenderbufferOES, renderbuffer);
+}
+void API_ENTRY(glBindRenderbufferOES)(GLenum target, GLuint renderbuffer) {
+ CALL_GL_API(glBindRenderbufferOES, target, renderbuffer);
+}
+void API_ENTRY(glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers) {
+ CALL_GL_API(glDeleteRenderbuffersOES, n, renderbuffers);
+}
+void API_ENTRY(glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers) {
+ CALL_GL_API(glGenRenderbuffersOES, n, renderbuffers);
+}
+void API_ENTRY(glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
+ CALL_GL_API(glRenderbufferStorageOES, target, internalformat, width, height);
+}
+void API_ENTRY(glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params) {
+ CALL_GL_API(glGetRenderbufferParameterivOES, target, pname, params);
+}
+GLboolean API_ENTRY(glIsFramebufferOES)(GLuint framebuffer) {
+ CALL_GL_API_RETURN(glIsFramebufferOES, framebuffer);
+}
+void API_ENTRY(glBindFramebufferOES)(GLenum target, GLuint framebuffer) {
+ CALL_GL_API(glBindFramebufferOES, target, framebuffer);
+}
+void API_ENTRY(glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers) {
+ CALL_GL_API(glDeleteFramebuffersOES, n, framebuffers);
+}
+void API_ENTRY(glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers) {
+ CALL_GL_API(glGenFramebuffersOES, n, framebuffers);
+}
+GLenum API_ENTRY(glCheckFramebufferStatusOES)(GLenum target) {
+ CALL_GL_API_RETURN(glCheckFramebufferStatusOES, target);
+}
+void API_ENTRY(glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {
+ CALL_GL_API(glFramebufferRenderbufferOES, target, attachment, renderbuffertarget, renderbuffer);
+}
+void API_ENTRY(glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
+ CALL_GL_API(glFramebufferTexture2DOES, target, attachment, textarget, texture, level);
+}
+void API_ENTRY(glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params) {
+ CALL_GL_API(glGetFramebufferAttachmentParameterivOES, target, attachment, pname, params);
+}
+void API_ENTRY(glGenerateMipmapOES)(GLenum target) {
+ CALL_GL_API(glGenerateMipmapOES, target);
+}
+void* API_ENTRY(glMapBufferOES)(GLenum target, GLenum access) {
+ CALL_GL_API_RETURN(glMapBufferOES, target, access);
+}
+GLboolean API_ENTRY(glUnmapBufferOES)(GLenum target) {
+ CALL_GL_API_RETURN(glUnmapBufferOES, target);
+}
+void API_ENTRY(glGetBufferPointervOES)(GLenum target, GLenum pname, void** params) {
+ CALL_GL_API(glGetBufferPointervOES, target, pname, params);
+}
+void API_ENTRY(glCurrentPaletteMatrixOES)(GLuint matrixpaletteindex) {
+ CALL_GL_API(glCurrentPaletteMatrixOES, matrixpaletteindex);
+}
+void API_ENTRY(glLoadPaletteFromModelViewMatrixOES)(void) {
+ CALL_GL_API(glLoadPaletteFromModelViewMatrixOES);
+}
+void API_ENTRY(glMatrixIndexPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glMatrixIndexPointerOES, size, type, stride, pointer);
+}
+void API_ENTRY(glWeightPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
+ CALL_GL_API(glWeightPointerOES, size, type, stride, pointer);
+}
+GLbitfield API_ENTRY(glQueryMatrixxOES)(GLfixed mantissa[16], GLint exponent[16]) {
+ CALL_GL_API_RETURN(glQueryMatrixxOES, mantissa, exponent);
+}
+void API_ENTRY(glDepthRangefOES)(GLclampf zNear, GLclampf zFar) {
+ CALL_GL_API(glDepthRangefOES, zNear, zFar);
+}
+void API_ENTRY(glFrustumfOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
+ CALL_GL_API(glFrustumfOES, left, right, bottom, top, zNear, zFar);
+}
+void API_ENTRY(glOrthofOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
+ CALL_GL_API(glOrthofOES, left, right, bottom, top, zNear, zFar);
+}
+void API_ENTRY(glClipPlanefOES)(GLenum plane, const GLfloat *equation) {
+ CALL_GL_API(glClipPlanefOES, plane, equation);
+}
+void API_ENTRY(glGetClipPlanefOES)(GLenum pname, GLfloat eqn[4]) {
+ CALL_GL_API(glGetClipPlanefOES, pname, eqn);
+}
+void API_ENTRY(glClearDepthfOES)(GLclampf depth) {
+ CALL_GL_API(glClearDepthfOES, depth);
+}
+void API_ENTRY(glTexGenfOES)(GLenum coord, GLenum pname, GLfloat param) {
+ CALL_GL_API(glTexGenfOES, coord, pname, param);
+}
+void API_ENTRY(glTexGenfvOES)(GLenum coord, GLenum pname, const GLfloat *params) {
+ CALL_GL_API(glTexGenfvOES, coord, pname, params);
+}
+void API_ENTRY(glTexGeniOES)(GLenum coord, GLenum pname, GLint param) {
+ CALL_GL_API(glTexGeniOES, coord, pname, param);
+}
+void API_ENTRY(glTexGenivOES)(GLenum coord, GLenum pname, const GLint *params) {
+ CALL_GL_API(glTexGenivOES, coord, pname, params);
+}
+void API_ENTRY(glTexGenxOES)(GLenum coord, GLenum pname, GLfixed param) {
+ CALL_GL_API(glTexGenxOES, coord, pname, param);
+}
+void API_ENTRY(glTexGenxvOES)(GLenum coord, GLenum pname, const GLfixed *params) {
+ CALL_GL_API(glTexGenxvOES, coord, pname, params);
+}
+void API_ENTRY(glGetTexGenfvOES)(GLenum coord, GLenum pname, GLfloat *params) {
+ CALL_GL_API(glGetTexGenfvOES, coord, pname, params);
+}
+void API_ENTRY(glGetTexGenivOES)(GLenum coord, GLenum pname, GLint *params) {
+ CALL_GL_API(glGetTexGenivOES, coord, pname, params);
+}
+void API_ENTRY(glGetTexGenxvOES)(GLenum coord, GLenum pname, GLfixed *params) {
+ CALL_GL_API(glGetTexGenxvOES, coord, pname, params);
+}
diff --git a/opengl/libs/gl_entries.in b/opengl/libs/gl_entries.in
index 4e8f828..d7cc5da 100644
--- a/opengl/libs/gl_entries.in
+++ b/opengl/libs/gl_entries.in
@@ -1,194 +1,145 @@
-GL_ENTRY(void, glColor4f, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glColor4x, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glNormal3f, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glNormal3x, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glCullFace, GLenum)
-GL_ENTRY(void, glFrontFace, GLenum)
-GL_ENTRY(void, glDisable, GLenum)
-GL_ENTRY(void, glEnable, GLenum)
+GL_ENTRY(void, glAlphaFunc, GLenum func, GLclampf ref)
+GL_ENTRY(void, glClearColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+GL_ENTRY(void, glClearDepthf, GLclampf depth)
+GL_ENTRY(void, glClipPlanef, GLenum plane, const GLfloat *equation)
+GL_ENTRY(void, glColor4f, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+GL_ENTRY(void, glDepthRangef, GLclampf zNear, GLclampf zFar)
+GL_ENTRY(void, glFogf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glFogfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glFrustumf, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glGetClipPlanef, GLenum pname, GLfloat eqn[4])
+GL_ENTRY(void, glGetFloatv, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetLightfv, GLenum light, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetMaterialfv, GLenum face, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexEnvfv, GLenum env, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexParameterfv, GLenum target, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glLightModelf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glLightModelfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glLightf, GLenum light, GLenum pname, GLfloat param)
+GL_ENTRY(void, glLightfv, GLenum light, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glLineWidth, GLfloat width)
+GL_ENTRY(void, glLoadMatrixf, const GLfloat *m)
+GL_ENTRY(void, glMaterialf, GLenum face, GLenum pname, GLfloat param)
+GL_ENTRY(void, glMaterialfv, GLenum face, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glMultMatrixf, const GLfloat *m)
+GL_ENTRY(void, glMultiTexCoord4f, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+GL_ENTRY(void, glNormal3f, GLfloat nx, GLfloat ny, GLfloat nz)
+GL_ENTRY(void, glOrthof, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glPointParameterf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glPointParameterfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glPointSize, GLfloat size)
+GL_ENTRY(void, glPolygonOffset, GLfloat factor, GLfloat units)
+GL_ENTRY(void, glRotatef, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glScalef, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glTexEnvf, GLenum target, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexEnvfv, GLenum target, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTexParameterf, GLenum target, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexParameterfv, GLenum target, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTranslatef, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glActiveTexture, GLenum texture)
+GL_ENTRY(void, glAlphaFuncx, GLenum func, GLclampx ref)
+GL_ENTRY(void, glBindBuffer, GLenum target, GLuint buffer)
+GL_ENTRY(void, glBindTexture, GLenum target, GLuint texture)
+GL_ENTRY(void, glBlendFunc, GLenum sfactor, GLenum dfactor)
+GL_ENTRY(void, glBufferData, GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+GL_ENTRY(void, glBufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+GL_ENTRY(void, glClear, GLbitfield mask)
+GL_ENTRY(void, glClearColorx, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+GL_ENTRY(void, glClearDepthx, GLclampx depth)
+GL_ENTRY(void, glClearStencil, GLint s)
+GL_ENTRY(void, glClientActiveTexture, GLenum texture)
+GL_ENTRY(void, glClipPlanex, GLenum plane, const GLfixed *equation)
+GL_ENTRY(void, glColor4ub, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+GL_ENTRY(void, glColor4x, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+GL_ENTRY(void, glColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+GL_ENTRY(void, glColorPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glCompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+GL_ENTRY(void, glCompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+GL_ENTRY(void, glCopyTexImage2D, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+GL_ENTRY(void, glCopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glCullFace, GLenum mode)
+GL_ENTRY(void, glDeleteBuffers, GLsizei n, const GLuint *buffers)
+GL_ENTRY(void, glDeleteTextures, GLsizei n, const GLuint *textures)
+GL_ENTRY(void, glDepthFunc, GLenum func)
+GL_ENTRY(void, glDepthMask, GLboolean flag)
+GL_ENTRY(void, glDepthRangex, GLclampx zNear, GLclampx zFar)
+GL_ENTRY(void, glDisable, GLenum cap)
+GL_ENTRY(void, glDisableClientState, GLenum array)
+GL_ENTRY(void, glDrawArrays, GLenum mode, GLint first, GLsizei count)
+GL_ENTRY(void, glDrawElements, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+GL_ENTRY(void, glEnable, GLenum cap)
+GL_ENTRY(void, glEnableClientState, GLenum array)
GL_ENTRY(void, glFinish, void)
GL_ENTRY(void, glFlush, void)
+GL_ENTRY(void, glFogx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glFogxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glFrontFace, GLenum mode)
+GL_ENTRY(void, glFrustumx, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glGetBooleanv, GLenum pname, GLboolean *params)
+GL_ENTRY(void, glGetBufferParameteriv, GLenum target, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetClipPlanex, GLenum pname, GLfixed eqn[4])
+GL_ENTRY(void, glGenBuffers, GLsizei n, GLuint *buffers)
+GL_ENTRY(void, glGenTextures, GLsizei n, GLuint *textures)
GL_ENTRY(GLenum, glGetError, void)
-GL_ENTRY(const GLubyte*, glGetString, GLenum)
-GL_ENTRY(void, glGetIntegerv, GLenum, GLint *)
-GL_ENTRY(void, glColorMask, GLboolean, GLboolean, GLboolean, GLboolean)
-GL_ENTRY(void, glDepthMask, GLboolean)
-GL_ENTRY(void, glStencilMask, GLuint)
-GL_ENTRY(void, glDepthFunc, GLenum)
-GL_ENTRY(void, glDepthRangef, GLclampf, GLclampf)
-GL_ENTRY(void, glDepthRangex, GLclampx, GLclampx)
-GL_ENTRY(void, glPolygonOffset, GLfloat, GLfloat)
-GL_ENTRY(void, glPolygonOffsetx, GLfixed, GLfixed)
-GL_ENTRY(void, glLogicOp, GLenum)
-GL_ENTRY(void, glAlphaFuncx, GLenum, GLclampx)
-GL_ENTRY(void, glAlphaFunc, GLenum, GLclampf)
-GL_ENTRY(void, glBlendFunc, GLenum, GLenum)
-GL_ENTRY(void, glClear, GLbitfield)
-GL_ENTRY(void, glClearColor, GLclampf, GLclampf, GLclampf, GLclampf)
-GL_ENTRY(void, glClearColorx, GLclampx, GLclampx, GLclampx, GLclampx)
-GL_ENTRY(void, glClearDepthf, GLclampf)
-GL_ENTRY(void, glClearDepthx, GLclampx)
-GL_ENTRY(void, glClearStencil, GLint)
-GL_ENTRY(void, glPointSize, GLfloat)
-GL_ENTRY(void, glPointSizex, GLfixed)
-GL_ENTRY(void, glSampleCoverage, GLclampf, GLboolean)
-GL_ENTRY(void, glSampleCoveragex, GLclampx, GLboolean)
-GL_ENTRY(void, glStencilFunc, GLenum, GLint, GLuint)
-GL_ENTRY(void, glStencilOp, GLenum, GLenum, GLenum)
-GL_ENTRY(void, glScissor, GLint, GLint, GLsizei, GLsizei)
-GL_ENTRY(void, glHint, GLenum, GLenum)
-GL_ENTRY(void, glLineWidth, GLfloat)
-GL_ENTRY(void, glLineWidthx, GLfixed)
-GL_ENTRY(void, glShadeModel, GLenum)
-GL_ENTRY(void, glLightModelf, GLenum, GLfloat)
-GL_ENTRY(void, glLightModelfv, GLenum, const GLfloat *)
-GL_ENTRY(void, glLightModelx, GLenum, GLfixed)
-GL_ENTRY(void, glLightModelxv, GLenum, const GLfixed *)
-GL_ENTRY(void, glLightf, GLenum, GLenum, GLfloat)
-GL_ENTRY(void, glLightfv, GLenum, GLenum, const GLfloat *)
-GL_ENTRY(void, glLightx, GLenum, GLenum, GLfixed)
-GL_ENTRY(void, glLightxv, GLenum, GLenum, const GLfixed *)
-GL_ENTRY(void, glMaterialf, GLenum, GLenum, GLfloat)
-GL_ENTRY(void, glMaterialfv, GLenum, GLenum, const GLfloat *)
-GL_ENTRY(void, glMaterialx, GLenum, GLenum, GLfixed)
-GL_ENTRY(void, glMaterialxv, GLenum, GLenum, const GLfixed *)
-GL_ENTRY(void, glFogf, GLenum, GLfloat)
-GL_ENTRY(void, glFogfv, GLenum, const GLfloat *)
-GL_ENTRY(void, glFogx, GLenum, GLfixed)
-GL_ENTRY(void, glFogxv, GLenum, const GLfixed *)
-GL_ENTRY(void, glVertexPointer, GLint, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glColorPointer, GLint, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glNormalPointer, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glTexCoordPointer, GLint, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glEnableClientState, GLenum)
-GL_ENTRY(void, glDisableClientState, GLenum)
-GL_ENTRY(void, glClientActiveTexture, GLenum)
-GL_ENTRY(void, glDrawArrays, GLenum, GLint, GLsizei)
-GL_ENTRY(void, glDrawElements, GLenum, GLsizei, GLenum, const GLvoid *)
+GL_ENTRY(void, glGetFixedv, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetIntegerv, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetLightxv, GLenum light, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetMaterialxv, GLenum face, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetPointerv, GLenum pname, void **params)
+GL_ENTRY(const GLubyte *, glGetString, GLenum name)
+GL_ENTRY(void, glGetTexEnviv, GLenum env, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexEnvxv, GLenum env, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexParameteriv, GLenum target, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexParameterxv, GLenum target, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glHint, GLenum target, GLenum mode)
+GL_ENTRY(GLboolean, glIsBuffer, GLuint buffer)
+GL_ENTRY(GLboolean, glIsEnabled, GLenum cap)
+GL_ENTRY(GLboolean, glIsTexture, GLuint texture)
+GL_ENTRY(void, glLightModelx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightModelxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLightx, GLenum light, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightxv, GLenum light, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLineWidthx, GLfixed width)
GL_ENTRY(void, glLoadIdentity, void)
-GL_ENTRY(void, glLoadMatrixf, const GLfloat*)
-GL_ENTRY(void, glLoadMatrixx, const GLfixed*)
-GL_ENTRY(void, glMatrixMode, GLenum)
-GL_ENTRY(void, glMultMatrixf, const GLfloat*)
-GL_ENTRY(void, glMultMatrixx, const GLfixed*)
+GL_ENTRY(void, glLoadMatrixx, const GLfixed *m)
+GL_ENTRY(void, glLogicOp, GLenum opcode)
+GL_ENTRY(void, glMaterialx, GLenum face, GLenum pname, GLfixed param)
+GL_ENTRY(void, glMaterialxv, GLenum face, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glMatrixMode, GLenum mode)
+GL_ENTRY(void, glMultMatrixx, const GLfixed *m)
+GL_ENTRY(void, glMultiTexCoord4x, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+GL_ENTRY(void, glNormal3x, GLfixed nx, GLfixed ny, GLfixed nz)
+GL_ENTRY(void, glNormalPointer, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glOrthox, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glPixelStorei, GLenum pname, GLint param)
+GL_ENTRY(void, glPointParameterx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glPointParameterxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glPointSizex, GLfixed size)
+GL_ENTRY(void, glPolygonOffsetx, GLfixed factor, GLfixed units)
GL_ENTRY(void, glPopMatrix, void)
GL_ENTRY(void, glPushMatrix, void)
-GL_ENTRY(void, glFrustumf, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glFrustumx, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glOrthof, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glOrthox, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glRotatef, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glRotatex, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glScalef, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glScalex, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glTranslatef, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glTranslatex, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glViewport, GLint, GLint, GLsizei, GLsizei)
-GL_ENTRY(void, glActiveTexture, GLenum)
-GL_ENTRY(void, glBindTexture, GLenum, GLuint)
-GL_ENTRY(void, glGenTextures, GLsizei, GLuint*)
-GL_ENTRY(void, glDeleteTextures, GLsizei, const GLuint *)
-GL_ENTRY(void, glMultiTexCoord4f, GLenum, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glMultiTexCoord4x, GLenum, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glPixelStorei, GLenum, GLint)
-GL_ENTRY(void, glTexEnvf, GLenum, GLenum, GLfloat)
-GL_ENTRY(void, glTexEnvfv, GLenum, GLenum, const GLfloat*)
-GL_ENTRY(void, glTexEnvx, GLenum, GLenum, GLfixed)
-GL_ENTRY(void, glTexEnvxv, GLenum, GLenum, const GLfixed*)
-GL_ENTRY(void, glTexParameterf, GLenum, GLenum, GLfloat)
-GL_ENTRY(void, glTexParameterx, GLenum, GLenum, GLfixed)
-GL_ENTRY(void, glCompressedTexImage2D, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*)
-GL_ENTRY(void, glCompressedTexSubImage2D, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*)
-GL_ENTRY(void, glCopyTexImage2D, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)
-GL_ENTRY(void, glCopyTexSubImage2D, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)
-GL_ENTRY(void, glTexImage2D, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)
-GL_ENTRY(void, glTexSubImage2D, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)
-GL_ENTRY(void, glReadPixels, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid *)
-
-// 1.1 additions
-GL_ENTRY(void, glClipPlanef, GLenum, const GLfloat*)
-GL_ENTRY(void, glClipPlanex, GLenum, const GLfixed*)
-GL_ENTRY(void, glBindBuffer, GLenum, GLuint)
-GL_ENTRY(void, glBufferData, GLenum, GLsizeiptr, const GLvoid*, GLenum)
-GL_ENTRY(void, glBufferSubData, GLenum, GLintptr, GLsizeiptr, const GLvoid*)
-GL_ENTRY(void, glDeleteBuffers, GLsizei, const GLuint*)
-GL_ENTRY(void, glGenBuffers, GLsizei, GLuint*)
-GL_ENTRY(void, glGetBooleanv, GLenum, GLboolean *)
-GL_ENTRY(void, glGetFixedv, GLenum, GLfixed *)
-GL_ENTRY(void, glGetFloatv, GLenum, GLfloat *)
-GL_ENTRY(void, glGetPointerv, GLenum, void **)
-GL_ENTRY(void, glGetBufferParameteriv, GLenum, GLenum, GLint *)
-GL_ENTRY(void, glGetClipPlanef, GLenum, GLfloat[4])
-GL_ENTRY(void, glGetClipPlanex, GLenum, GLfixed[4])
-GL_ENTRY(void, glGetLightxv, GLenum, GLenum, GLfixed *)
-GL_ENTRY(void, glGetLightfv, GLenum, GLenum, GLfloat *)
-GL_ENTRY(void, glGetMaterialxv, GLenum, GLenum, GLfixed *)
-GL_ENTRY(void, glGetMaterialfv, GLenum, GLenum, GLfloat *)
-GL_ENTRY(void, glGetTexEnvfv, GLenum, GLenum, GLfloat *)
-GL_ENTRY(void, glGetTexEnviv, GLenum, GLenum, GLint *)
-GL_ENTRY(void, glGetTexEnvxv, GLenum, GLenum, GLfixed *)
-GL_ENTRY(void, glGetTexParameterfv, GLenum, GLenum, GLfloat *)
-GL_ENTRY(void, glGetTexParameteriv, GLenum, GLenum, GLint *)
-GL_ENTRY(void, glGetTexParameterxv, GLenum, GLenum, GLfixed *)
-GL_ENTRY(GLboolean, glIsBuffer, GLuint)
-GL_ENTRY(GLboolean, glIsEnabled, GLenum)
-GL_ENTRY(GLboolean, glIsTexture, GLuint)
-GL_ENTRY(void, glPointParameterf, GLenum, GLfloat)
-GL_ENTRY(void, glPointParameterfv, GLenum, const GLfloat *)
-GL_ENTRY(void, glPointParameterx, GLenum, GLfixed)
-GL_ENTRY(void, glPointParameterxv, GLenum, const GLfixed *)
-GL_ENTRY(void, glColor4ub, GLubyte, GLubyte, GLubyte, GLubyte)
-GL_ENTRY(void, glTexEnvi, GLenum, GLenum, GLint)
-GL_ENTRY(void, glTexEnviv, GLenum, GLenum, const GLint *)
-GL_ENTRY(void, glTexParameterfv, GLenum, GLenum, const GLfloat *)
-GL_ENTRY(void, glTexParameteriv, GLenum, GLenum, const GLint *)
-GL_ENTRY(void, glTexParameteri, GLenum, GLenum, GLint)
-GL_ENTRY(void, glTexParameterxv, GLenum, GLenum, const GLfixed *)
-GL_ENTRY(void, glPointSizePointerOES, GLenum, GLsizei, const GLvoid*)
-
-// Extensions
-GL_ENTRY(void, glDrawTexsOES, GLshort, GLshort, GLshort, GLshort, GLshort)
-GL_ENTRY(void, glDrawTexiOES, GLint, GLint, GLint, GLint, GLint)
-GL_ENTRY(void, glDrawTexfOES, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat)
-GL_ENTRY(void, glDrawTexxOES, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed)
-GL_ENTRY(void, glDrawTexsvOES, const GLshort*)
-GL_ENTRY(void, glDrawTexivOES, const GLint*)
-GL_ENTRY(void, glDrawTexfvOES, const GLfloat*)
-GL_ENTRY(void, glDrawTexxvOES, const GLfixed*)
-GL_ENTRY(GLbitfield, glQueryMatrixxOES, GLfixed*, GLint*)
-GL_ENTRY(void, __glEGLImageTargetTexture2DOES, GLenum, GLeglImageOES)
-GL_ENTRY(void, __glEGLImageTargetRenderbufferStorageOES, GLenum, GLeglImageOES)
-GL_ENTRY(void, glBlendEquationSeparateOES, GLenum, GLenum)
-GL_ENTRY(void, glBlendFuncSeparateOES, GLenum, GLenum, GLenum, GLenum)
-GL_ENTRY(void, glBlendEquationOES, GLenum)
-GL_ENTRY(GLboolean, glIsRenderbufferOES, GLuint)
-GL_ENTRY(void, glBindRenderbufferOES, GLenum, GLuint)
-GL_ENTRY(void, glDeleteRenderbuffersOES, GLsizei, const GLuint*)
-GL_ENTRY(void, glGenRenderbuffersOES, GLsizei, GLuint*)
-GL_ENTRY(void, glRenderbufferStorageOES, GLenum, GLenum, GLsizei, GLsizei)
-GL_ENTRY(void, glGetRenderbufferParameterivOES, GLenum, GLenum, GLint*)
-GL_ENTRY(GLboolean, glIsFramebufferOES, GLuint)
-GL_ENTRY(void, glBindFramebufferOES, GLenum, GLuint)
-GL_ENTRY(void, glDeleteFramebuffersOES, GLsizei, const GLuint*)
-GL_ENTRY(void, glGenFramebuffersOES, GLsizei, GLuint*)
-GL_ENTRY(GLenum, glCheckFramebufferStatusOES, GLenum)
-GL_ENTRY(void, glFramebufferRenderbufferOES, GLenum, GLenum, GLenum, GLuint)
-GL_ENTRY(void, glFramebufferTexture2DOES, GLenum, GLenum, GLenum, GLuint, GLint)
-GL_ENTRY(void, glGetFramebufferAttachmentParameterivOES, GLenum, GLenum, GLenum, GLint*)
-GL_ENTRY(void, glGenerateMipmapOES, GLenum)
-GL_ENTRY(void*, glMapBufferOES, GLenum, GLenum)
-GL_ENTRY(GLboolean, glUnmapBufferOES, GLenum)
-GL_ENTRY(void, glGetBufferPointervOES, GLenum, GLenum, void**)
-GL_ENTRY(void, glCurrentPaletteMatrixOES, GLuint)
-GL_ENTRY(void, glLoadPaletteFromModelViewMatrixOES, void)
-GL_ENTRY(void, glMatrixIndexPointerOES, GLint, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glWeightPointerOES, GLint, GLenum, GLsizei, const GLvoid *)
-GL_ENTRY(void, glTexGenfOES, GLenum, GLenum, GLfloat)
-GL_ENTRY(void, glTexGenfvOES, GLenum, GLenum, const GLfloat *)
-GL_ENTRY(void, glTexGeniOES, GLenum, GLenum, GLint)
-GL_ENTRY(void, glTexGenivOES, GLenum, GLenum, const GLint *)
-GL_ENTRY(void, glTexGenxOES, GLenum, GLenum, GLfixed)
-GL_ENTRY(void, glTexGenxvOES, GLenum, GLenum, const GLfixed *)
-GL_ENTRY(void, glGetTexGenfvOES, GLenum, GLenum, GLfloat *)
-GL_ENTRY(void, glGetTexGenivOES, GLenum, GLenum, GLint *)
-GL_ENTRY(void, glGetTexGenxvOES, GLenum, GLenum, GLfixed *)
+GL_ENTRY(void, glReadPixels, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+GL_ENTRY(void, glRotatex, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glSampleCoverage, GLclampf value, GLboolean invert)
+GL_ENTRY(void, glSampleCoveragex, GLclampx value, GLboolean invert)
+GL_ENTRY(void, glScalex, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glScissor, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glShadeModel, GLenum mode)
+GL_ENTRY(void, glStencilFunc, GLenum func, GLint ref, GLuint mask)
+GL_ENTRY(void, glStencilMask, GLuint mask)
+GL_ENTRY(void, glStencilOp, GLenum fail, GLenum zfail, GLenum zpass)
+GL_ENTRY(void, glTexCoordPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glTexEnvi, GLenum target, GLenum pname, GLint param)
+GL_ENTRY(void, glTexEnvx, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexEnviv, GLenum target, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexEnvxv, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexImage2D, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+GL_ENTRY(void, glTexParameteri, GLenum target, GLenum pname, GLint param)
+GL_ENTRY(void, glTexParameterx, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexParameteriv, GLenum target, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexParameterxv, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+GL_ENTRY(void, glTranslatex, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glVertexPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glViewport, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glPointSizePointerOES, GLenum type, GLsizei stride, const GLvoid *pointer)
diff --git a/opengl/libs/gl_logger.h b/opengl/libs/gl_logger.h
deleted file mode 100644
index ce85dd1..0000000
--- a/opengl/libs/gl_logger.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- ** Copyright 2007, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-
-#ifndef ANDROID_GL_LOGGER_H
-#define ANDROID_GL_LOGGER_H
-
-namespace android {
-#define GL_ENTRY(r, api, ...) r log_##api(__VA_ARGS__);
-#include "gl_entries.in"
-#undef GL_ENTRY
-}; // namespace android
-
-#endif /* ANDROID_GL_LOGGER_H */
diff --git a/opengl/libs/glext_entries.in b/opengl/libs/glext_entries.in
new file mode 100644
index 0000000..dd09c71
--- /dev/null
+++ b/opengl/libs/glext_entries.in
@@ -0,0 +1,90 @@
+GL_ENTRY(void, glBlendEquationSeparateOES, GLenum modeRGB, GLenum modeAlpha)
+GL_ENTRY(void, glBlendFuncSeparateOES, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+GL_ENTRY(void, glBlendEquationOES, GLenum mode)
+GL_ENTRY(void, glDrawTexsOES, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
+GL_ENTRY(void, glDrawTexiOES, GLint x, GLint y, GLint z, GLint width, GLint height)
+GL_ENTRY(void, glDrawTexxOES, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
+GL_ENTRY(void, glDrawTexsvOES, const GLshort *coords)
+GL_ENTRY(void, glDrawTexivOES, const GLint *coords)
+GL_ENTRY(void, glDrawTexxvOES, const GLfixed *coords)
+GL_ENTRY(void, glDrawTexfOES, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
+GL_ENTRY(void, glDrawTexfvOES, const GLfloat *coords)
+GL_ENTRY(void, glEGLImageTargetTexture2DOES, GLenum target, GLeglImageOES image)
+GL_ENTRY(void, glEGLImageTargetRenderbufferStorageOES, GLenum target, GLeglImageOES image)
+GL_ENTRY(void, glAlphaFuncxOES, GLenum func, GLclampx ref)
+GL_ENTRY(void, glClearColorxOES, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+GL_ENTRY(void, glClearDepthxOES, GLclampx depth)
+GL_ENTRY(void, glClipPlanexOES, GLenum plane, const GLfixed *equation)
+GL_ENTRY(void, glColor4xOES, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+GL_ENTRY(void, glDepthRangexOES, GLclampx zNear, GLclampx zFar)
+GL_ENTRY(void, glFogxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glFogxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glFrustumxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glGetClipPlanexOES, GLenum pname, GLfixed eqn[4])
+GL_ENTRY(void, glGetFixedvOES, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetLightxvOES, GLenum light, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetMaterialxvOES, GLenum face, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexEnvxvOES, GLenum env, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexParameterxvOES, GLenum target, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glLightModelxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightModelxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLightxOES, GLenum light, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightxvOES, GLenum light, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLineWidthxOES, GLfixed width)
+GL_ENTRY(void, glLoadMatrixxOES, const GLfixed *m)
+GL_ENTRY(void, glMaterialxOES, GLenum face, GLenum pname, GLfixed param)
+GL_ENTRY(void, glMaterialxvOES, GLenum face, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glMultMatrixxOES, const GLfixed *m)
+GL_ENTRY(void, glMultiTexCoord4xOES, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+GL_ENTRY(void, glNormal3xOES, GLfixed nx, GLfixed ny, GLfixed nz)
+GL_ENTRY(void, glOrthoxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glPointParameterxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glPointParameterxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glPointSizexOES, GLfixed size)
+GL_ENTRY(void, glPolygonOffsetxOES, GLfixed factor, GLfixed units)
+GL_ENTRY(void, glRotatexOES, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glSampleCoveragexOES, GLclampx value, GLboolean invert)
+GL_ENTRY(void, glScalexOES, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glTexEnvxOES, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexEnvxvOES, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexParameterxOES, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexParameterxvOES, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTranslatexOES, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(GLboolean, glIsRenderbufferOES, GLuint renderbuffer)
+GL_ENTRY(void, glBindRenderbufferOES, GLenum target, GLuint renderbuffer)
+GL_ENTRY(void, glDeleteRenderbuffersOES, GLsizei n, const GLuint* renderbuffers)
+GL_ENTRY(void, glGenRenderbuffersOES, GLsizei n, GLuint* renderbuffers)
+GL_ENTRY(void, glRenderbufferStorageOES, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+GL_ENTRY(void, glGetRenderbufferParameterivOES, GLenum target, GLenum pname, GLint* params)
+GL_ENTRY(GLboolean, glIsFramebufferOES, GLuint framebuffer)
+GL_ENTRY(void, glBindFramebufferOES, GLenum target, GLuint framebuffer)
+GL_ENTRY(void, glDeleteFramebuffersOES, GLsizei n, const GLuint* framebuffers)
+GL_ENTRY(void, glGenFramebuffersOES, GLsizei n, GLuint* framebuffers)
+GL_ENTRY(GLenum, glCheckFramebufferStatusOES, GLenum target)
+GL_ENTRY(void, glFramebufferRenderbufferOES, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+GL_ENTRY(void, glFramebufferTexture2DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+GL_ENTRY(void, glGetFramebufferAttachmentParameterivOES, GLenum target, GLenum attachment, GLenum pname, GLint* params)
+GL_ENTRY(void, glGenerateMipmapOES, GLenum target)
+GL_ENTRY(void*, glMapBufferOES, GLenum target, GLenum access)
+GL_ENTRY(GLboolean, glUnmapBufferOES, GLenum target)
+GL_ENTRY(void, glGetBufferPointervOES, GLenum target, GLenum pname, void** params)
+GL_ENTRY(void, glCurrentPaletteMatrixOES, GLuint matrixpaletteindex)
+GL_ENTRY(void, glLoadPaletteFromModelViewMatrixOES, void)
+GL_ENTRY(void, glMatrixIndexPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glWeightPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(GLbitfield, glQueryMatrixxOES, GLfixed mantissa[16], GLint exponent[16])
+GL_ENTRY(void, glDepthRangefOES, GLclampf zNear, GLclampf zFar)
+GL_ENTRY(void, glFrustumfOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glOrthofOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glClipPlanefOES, GLenum plane, const GLfloat *equation)
+GL_ENTRY(void, glGetClipPlanefOES, GLenum pname, GLfloat eqn[4])
+GL_ENTRY(void, glClearDepthfOES, GLclampf depth)
+GL_ENTRY(void, glTexGenfOES, GLenum coord, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexGenfvOES, GLenum coord, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTexGeniOES, GLenum coord, GLenum pname, GLint param)
+GL_ENTRY(void, glTexGenivOES, GLenum coord, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexGenxOES, GLenum coord, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexGenxvOES, GLenum coord, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glGetTexGenfvOES, GLenum coord, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexGenivOES, GLenum coord, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexGenxvOES, GLenum coord, GLenum pname, GLfixed *params)
diff --git a/opengl/libs/hooks.h b/opengl/libs/hooks.h
index 392724f..fd97254 100644
--- a/opengl/libs/hooks.h
+++ b/opengl/libs/hooks.h
@@ -77,6 +77,7 @@ enum {
struct gl_hooks_t {
struct gl_t {
#include "gl_entries.in"
+ #include "glext_entries.in"
} gl;
struct egl_t {
#include "egl_entries.in"
diff --git a/opengl/libs/tools/genfiles b/opengl/libs/tools/genfiles
new file mode 100755
index 0000000..107768b
--- /dev/null
+++ b/opengl/libs/tools/genfiles
@@ -0,0 +1,20 @@
+#! /bin/sh
+#
+# Copyright (C) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+./glapigen ../../include/GLES/gl.h > ../GLES_CM/gl_api.in
+./glentrygen ../../include/GLES/gl.h > ../gl_entries.in
+./glapigen ../../include/GLES/glext.h > ../GLES_CM/glext_api.in
+./glentrygen ../../include/GLES/glext.h > ../glext_entries.in
diff --git a/opengl/libs/tools/glapigen b/opengl/libs/tools/glapigen
index 0333294..a2c3a7b 100755
--- a/opengl/libs/tools/glapigen
+++ b/opengl/libs/tools/glapigen
@@ -1,51 +1,72 @@
#! /usr/bin/perl
+#
+# Copyright (C) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
use strict;
-my $lineNum = 0;
while (my $line = <>) {
- $lineNum += 1;
next if $line =~ /^\//;
next if $line =~ /^#/;
next if $line =~ /^\s*$/;
- if ($line !~ /^GL_ENTRY\(([^,]+),\s*([^,]+),\s*([^)]+)\)/) {
- printf STDERR "Cannot parse line number $lineNum:\n$line";
+ if ($line !~ /^GL_API\s+(.+)\s+GL_APIENTRY\s+([\w]+)\s*\(([^\)]+)\);/) {
next;
}
my $type = $1;
my $name = $2;
my $args = $3;
- printf("%s API_ENTRY(%s)(", $type, $name);
- my @args = split ',', $args;
-
- my $len = scalar(@args);
- for (my $num = 0; $num < $len; $num++) {
- print ", " if $num > 0;
- my $arg = $args[$num];
- if ($arg =~ /([^]]+)(\[[^]]\])/) {
- my $argtype = $1;
- my $array = $2;
- printf("%s arg%d%s", $argtype, $num, $array);
- } else {
- if ($arg eq "void") {
- printf("void");
- } else {
- printf("%s arg%d", $arg, $num);
- }
- }
+ #printf("%s", $line);
+
+ my $prefix = "";
+ if ($name eq "glEGLImageTargetTexture2DOES") {
+ $prefix = "__";
}
- printf(") {\n");
+ if ($name eq "glEGLImageTargetRenderbufferStorageOES") {
+ $prefix = "__";
+ }
+
+ printf("%s API_ENTRY(%s%s)(%s)", $type, $prefix, $name, $args);
+
+ printf(" {\n");
if ($type eq "void") {
printf(" CALL_GL_API(%s", $name);
} else {
printf(" CALL_GL_API_RETURN(%s", $name);
}
+ my @args = split ',', $args;
+ my $len = scalar(@args);
for (my $num = 0; $num < $len; $num++) {
if ($args[$num] ne "void") {
print ", ";
- printf("arg%d", $num);
+ #
+ # extract the name from the parameter
+ # type name
+ # const type *name
+ # type *name
+ # type name[4]
+ #
+ if ($args[$num] =~ /(\S+\s)+\**\s*([\w]+)/) {
+ printf("%s", $2);
+ }
}
}
- printf(");\n}\n\n");
+ printf(");\n");
+ printf("}\n");
}
+
+
+
+
+
diff --git a/opengl/libs/tools/glentrygen b/opengl/libs/tools/glentrygen
new file mode 100755
index 0000000..5e0f7b6
--- /dev/null
+++ b/opengl/libs/tools/glentrygen
@@ -0,0 +1,31 @@
+#! /usr/bin/perl
+#
+# Copyright (C) 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+use strict;
+
+while (my $line = <>) {
+ next if $line =~ /^\//;
+ next if $line =~ /^#/;
+ next if $line =~ /^\s*$/;
+ if ($line !~ /^GL_API\s+(.+)\s+GL_APIENTRY\s+([\w]+)\s*\(([^\)]+)\);/) {
+ next;
+ }
+ my $type = $1;
+ my $name = $2;
+ my $args = $3;
+
+ printf("GL_ENTRY(%s, %s, %s)\n", $type, $name, $args);
+}
diff --git a/opengl/tools/glgen/specs/gles11/checks.spec b/opengl/tools/glgen/specs/gles11/checks.spec
index 9ff1205..97dac2e 100644
--- a/opengl/tools/glgen/specs/gles11/checks.spec
+++ b/opengl/tools/glgen/specs/gles11/checks.spec
@@ -59,87 +59,3 @@ glTexGenf unsupported
glTexGeni unsupported
glTexGenx unsupported
glWeightPointerOES unsupported
-// Lots of unsupported
-glAlphaFuncxOES unsupported
-glBlendEquationOES unsupported
-glBlendEquationSeparateOES unsupported
-glBlendFuncSeparateOES unsupported
-glClearColorxOES unsupported
-glClearDepthfOES unsupported
-glClearDepthxOES unsupported
-glClipPlanefOES unsupported
-glClipPlanefOES unsupported
-glClipPlanexOES unsupported
-glClipPlanexOES unsupported
-glColor4xOES unsupported
-glDepthRangefOES unsupported
-glDepthRangexOES unsupported
-glEGLImageTargetRenderbufferStorageOES unsupported
-glEGLImageTargetTexture2DOES unsupported
-glFogxOES unsupported
-glFogxvOES unsupported
-glFogxvOES unsupported
-glFrustumfOES unsupported
-glFrustumxOES unsupported
-glGetClipPlanefOES unsupported
-glGetClipPlanefOES unsupported
-glGetClipPlanexOES unsupported
-glGetClipPlanexOES unsupported
-glGetFixedvOES unsupported
-glGetFixedvOES unsupported
-glGetLightxvOES unsupported
-glGetLightxvOES unsupported
-glGetMaterialxvOES unsupported
-glGetMaterialxvOES unsupported
-glGetTexEnvxvOES unsupported
-glGetTexEnvxvOES unsupported
-glGetTexGenfvOES unsupported
-glGetTexGenfvOES unsupported
-glGetTexGenivOES unsupported
-glGetTexGenivOES unsupported
-glGetTexGenxvOES unsupported
-glGetTexGenxvOES unsupported
-glGetTexParameterxvOES unsupported
-glGetTexParameterxvOES unsupported
-glLightModelxOES unsupported
-glLightModelxvOES unsupported
-glLightModelxvOES unsupported
-glLightxOES unsupported
-glLightxvOES unsupported
-glLightxvOES unsupported
-glLineWidthxOES unsupported
-glLoadMatrixxOES unsupported
-glLoadMatrixxOES unsupported
-glMaterialxOES unsupported
-glMaterialxvOES unsupported
-glMaterialxvOES unsupported
-glMultMatrixxOES unsupported
-glMultMatrixxOES unsupported
-glMultiTexCoord4xOES unsupported
-glNormal3xOES unsupported
-glOrthofOES unsupported
-glOrthoxOES unsupported
-glPointParameterxOES unsupported
-glPointParameterxvOES unsupported
-glPointParameterxvOES unsupported
-glPointSizexOES unsupported
-glPolygonOffsetxOES unsupported
-glRotatexOES unsupported
-glSampleCoveragexOES unsupported
-glScalexOES unsupported
-glTexEnvxOES unsupported
-glTexEnvxvOES unsupported
-glTexEnvxvOES unsupported
-glTexGenfOES unsupported
-glTexGenfvOES unsupported
-glTexGenfvOES unsupported
-glTexGeniOES unsupported
-glTexGenivOES unsupported
-glTexGenivOES unsupported
-glTexGenxOES unsupported
-glTexGenxvOES unsupported
-glTexGenxvOES unsupported
-glTexParameterxOES unsupported
-glTexParameterxvOES unsupported
-glTexParameterxvOES unsupported
-glTranslatexOES unsupported \ No newline at end of file
diff --git a/opengl/tools/glgen/stubs/gles11/glGetString.java b/opengl/tools/glgen/stubs/gles11/glGetString.java
index 8c7881c..fba249b 100644
--- a/opengl/tools/glgen/stubs/gles11/glGetString.java
+++ b/opengl/tools/glgen/stubs/gles11/glGetString.java
@@ -1,16 +1,5 @@
// C function const GLubyte * glGetString ( GLenum name )
- public native String _glGetString(
+ public static native String glGetString(
int name
);
-
- public String glGetString(
- int name
- ) {
- String returnValue;
- returnValue = _glGetString(
- name
- );
- return returnValue;
- }
-
diff --git a/opengl/tools/glgen/stubs/gles11/glGetString.nativeReg b/opengl/tools/glgen/stubs/gles11/glGetString.nativeReg
index e64187c..a4af31f 100644
--- a/opengl/tools/glgen/stubs/gles11/glGetString.nativeReg
+++ b/opengl/tools/glgen/stubs/gles11/glGetString.nativeReg
@@ -1 +1 @@
-{"_glGetString", "(I)Ljava/lang/String;", (void *) android_glGetString },
+{"glGetString", "(I)Ljava/lang/String;", (void *) android_glGetString },
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index d66c6e5..9c4ace1 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -413,41 +413,45 @@ class AlarmManagerService extends IAlarmManager.Stub {
synchronized (mLock) {
pw.println("Current Alarm Manager state:");
- if (mRtcWakeupAlarms.size() > 0) {
+ if (mRtcWakeupAlarms.size() > 0 || mRtcAlarms.size() > 0) {
pw.println(" ");
- pw.println(" Realtime wakeup alarms that are scheduled:");
- dumpAlarmList(pw, mRtcWakeupAlarms, " ", "RTC_WAKEUP");
- }
- if (mRtcAlarms.size() > 0) {
- pw.println(" ");
- pw.println(" Realtime alarms that are scheduled:");
- dumpAlarmList(pw, mRtcAlarms, " ", "RTC");
- }
- if (mElapsedRealtimeWakeupAlarms.size() > 0) {
- pw.println(" ");
- pw.println(" Elapsed realtime wakeup alarms that are scheduled:");
- dumpAlarmList(pw, mElapsedRealtimeWakeupAlarms, " ", "ELAPSED_REALTIME_WAKEUP");
+ pw.print(" Realtime wakeup (now=");
+ pw.print(System.currentTimeMillis()); pw.println("):");
+ if (mRtcWakeupAlarms.size() > 0) {
+ dumpAlarmList(pw, mRtcWakeupAlarms, " ", "RTC_WAKEUP");
+ }
+ if (mRtcAlarms.size() > 0) {
+ dumpAlarmList(pw, mRtcAlarms, " ", "RTC");
+ }
}
- if (mElapsedRealtimeAlarms.size() > 0) {
+ if (mElapsedRealtimeWakeupAlarms.size() > 0 || mElapsedRealtimeAlarms.size() > 0) {
pw.println(" ");
- pw.println(" Elapsed realtime alarms that are scheduled:");
- dumpAlarmList(pw, mElapsedRealtimeAlarms, " ", "ELAPSED_REALTIME");
+ pw.print(" Elapsed realtime wakeup (now=");
+ pw.print(SystemClock.elapsedRealtime()); pw.println("):");
+ if (mElapsedRealtimeWakeupAlarms.size() > 0) {
+ dumpAlarmList(pw, mElapsedRealtimeWakeupAlarms, " ", "ELAPSED_WAKEUP");
+ }
+ if (mElapsedRealtimeAlarms.size() > 0) {
+ dumpAlarmList(pw, mElapsedRealtimeAlarms, " ", "ELAPSED");
+ }
}
pw.println(" ");
- pw.println(" Broadcast ref count: " + mBroadcastRefCount);
+ pw.print(" Broadcast ref count: "); pw.println(mBroadcastRefCount);
pw.println(" ");
pw.println(" Alarm Stats:");
for (Map.Entry<String, BroadcastStats> be : mBroadcastStats.entrySet()) {
BroadcastStats bs = be.getValue();
- pw.println(" " + be.getKey());
- pw.println(" " + bs.aggregateTime + "ms running, "
- + bs.numWakeup + " wakeups");
+ pw.print(" "); pw.println(be.getKey());
+ pw.print(" "); pw.print(bs.aggregateTime);
+ pw.print("ms running, "); pw.print(bs.numWakeup);
+ pw.println(" wakeups");
for (Map.Entry<Intent.FilterComparison, FilterStats> fe
: bs.filterStats.entrySet()) {
- pw.println(" " + fe.getValue().count + " alarms: "
- + fe.getKey().getIntent());
+ pw.print(" "); pw.print(fe.getValue().count);
+ pw.print(" alarms: ");
+ pw.println(fe.getKey().getIntent().toShortString(true, false));
}
}
}
@@ -456,7 +460,8 @@ class AlarmManagerService extends IAlarmManager.Stub {
private static final void dumpAlarmList(PrintWriter pw, ArrayList<Alarm> list, String prefix, String label) {
for (int i=list.size()-1; i>=0; i--) {
Alarm a = list.get(i);
- pw.println(prefix + label + " #" + i + ":");
+ pw.print(prefix); pw.print(label); pw.print(" #"); pw.print(i);
+ pw.print(": "); pw.println(a);
a.dump(pw, prefix + " ");
}
}
@@ -561,18 +566,24 @@ class AlarmManagerService extends IAlarmManager.Stub {
@Override
public String toString()
{
- return "Alarm{"
- + Integer.toHexString(System.identityHashCode(this))
- + " type " + type + " " + operation.getTargetPackage() + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("Alarm{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" type ");
+ sb.append(type);
+ sb.append(" ");
+ sb.append(operation.getTargetPackage());
+ sb.append('}');
+ return sb.toString();
}
public void dump(PrintWriter pw, String prefix)
{
- pw.println(prefix + this);
- pw.println(prefix + "type=" + type + " when=" + when
- + " repeatInterval=" + repeatInterval
- + " count=" + count);
- pw.println(prefix + "operation=" + operation);
+ pw.print(prefix); pw.print("type="); pw.print(type);
+ pw.print(" when="); pw.print(when);
+ pw.print(" repeatInterval="); pw.print(repeatInterval);
+ pw.print(" count="); pw.println(count);
+ pw.print(prefix); pw.print("operation="); pw.println(operation);
}
}
diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java
index de5d0ac..bb420a6 100644
--- a/services/java/com/android/server/AppWidgetService.java
+++ b/services/java/com/android/server/AppWidgetService.java
@@ -151,34 +151,57 @@ class AppWidgetService extends IAppWidgetService.Stub
synchronized (mAppWidgetIds) {
int N = mInstalledProviders.size();
- pw.println("Providers: (size=" + N + ")");
+ pw.println("Providers:");
for (int i=0; i<N; i++) {
Provider p = mInstalledProviders.get(i);
AppWidgetProviderInfo info = p.info;
- pw.println(" [" + i + "] provder=" + info.provider
- + " min=(" + info.minWidth + "x" + info.minHeight + ")"
- + " updatePeriodMillis=" + info.updatePeriodMillis
- + " initialLayout=" + info.initialLayout + " zombie=" + p.zombie);
+ pw.print(" ["); pw.print(i); pw.print("] provider ");
+ pw.print(info.provider.flattenToShortString());
+ pw.println(':');
+ pw.print(" min=("); pw.print(info.minWidth);
+ pw.print("x"); pw.print(info.minHeight);
+ pw.print(") updatePeriodMillis=");
+ pw.print(info.updatePeriodMillis);
+ pw.print(" initialLayout=#");
+ pw.print(Integer.toHexString(info.initialLayout));
+ pw.print(" zombie="); pw.println(p.zombie);
}
N = mAppWidgetIds.size();
- pw.println("AppWidgetIds: (size=" + N + ")");
+ pw.println(" ");
+ pw.println("AppWidgetIds:");
for (int i=0; i<N; i++) {
AppWidgetId id = mAppWidgetIds.get(i);
- pw.println(" [" + i + "] appWidgetId=" + id.appWidgetId
- + " host=" + id.host.hostId + "/" + id.host.packageName + " provider="
- + (id.provider == null ? "null" : id.provider.info.provider)
- + " host.callbacks=" + (id.host != null ? id.host.callbacks : "(no host)")
- + " views=" + id.views);
+ pw.print(" ["); pw.print(i); pw.print("] id=");
+ pw.println(id.appWidgetId);;
+ pw.print(" hostId=");
+ pw.print(id.host.hostId); pw.print(' ');
+ pw.print(id.host.packageName); pw.print('/');
+ pw.println(id.host.uid);
+ if (id.provider != null) {
+ pw.print(" provider=");
+ pw.println(id.provider.info.provider.flattenToShortString());
+ }
+ if (id.host != null) {
+ pw.print(" host.callbacks="); pw.println(id.host.callbacks);
+ }
+ if (id.views != null) {
+ pw.print(" views="); pw.println(id.views);
+ }
}
N = mHosts.size();
- pw.println("Hosts: (size=" + N + ")");
+ pw.println(" ");
+ pw.println("Hosts:");
for (int i=0; i<N; i++) {
Host host = mHosts.get(i);
- pw.println(" [" + i + "] packageName=" + host.packageName + " uid=" + host.uid
- + " hostId=" + host.hostId + " callbacks=" + host.callbacks
- + " instances.size=" + host.instances.size() + " zombie=" + host.zombie);
+ pw.print(" ["); pw.print(i); pw.print("] hostId=");
+ pw.print(host.hostId); pw.print(' ');
+ pw.print(host.packageName); pw.print('/');
+ pw.print(host.uid); pw.println(':');
+ pw.print(" callbacks="); pw.println(host.callbacks);
+ pw.print(" instances.size="); pw.print(host.instances.size());
+ pw.print(" zombie="); pw.println(host.zombie);
}
}
}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
new file mode 100644
index 0000000..0f95318
--- /dev/null
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.backup.BackupService;
+import android.backup.IBackupService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.SparseArray;
+
+import android.backup.IBackupManager;
+
+import java.lang.String;
+import java.util.HashSet;
+import java.util.List;
+
+class BackupManagerService extends IBackupManager.Stub {
+ private static final String TAG = "BackupManagerService";
+ private static final boolean DEBUG = true;
+
+ private static final long COLLECTION_INTERVAL = 3 * 60 * 1000;
+
+ private static final int MSG_RUN_BACKUP = 1;
+
+ private Context mContext;
+ private PackageManager mPackageManager;
+ private final BackupHandler mBackupHandler = new BackupHandler();
+ // map UIDs to the set of backup client services within that UID's app set
+ private SparseArray<HashSet<ServiceInfo>> mBackupParticipants
+ = new SparseArray<HashSet<ServiceInfo>>();
+ // set of backup services that have pending changes
+ private HashSet<ServiceInfo> mPendingBackups = new HashSet<ServiceInfo>();
+ private final Object mQueueLock = new Object();
+
+
+ // ----- Handler that runs the actual backup process asynchronously -----
+
+ private class BackupHandler extends Handler implements ServiceConnection {
+ private volatile Object mBindSignaller = new Object();
+ private volatile boolean mBinding = false;
+ private IBackupService mTargetService = null;
+
+ public void handleMessage(Message msg) {
+
+ switch (msg.what) {
+ case MSG_RUN_BACKUP:
+ {
+ // snapshot the pending-backup set and work on that
+ HashSet<ServiceInfo> queue;
+ synchronized (mQueueLock) {
+ queue = mPendingBackups;
+ mPendingBackups = new HashSet<ServiceInfo>();
+ // !!! TODO: start a new backup-queue journal file too
+ }
+
+ // Walk the set of pending backups, setting up the relevant files and
+ // invoking the backup service in each participant
+ Intent backupIntent = new Intent(BackupService.SERVICE_ACTION);
+ for (ServiceInfo service : queue) {
+ mBinding = true;
+ mTargetService = null;
+
+ backupIntent.setClassName(service.packageName, service.name);
+ Log.d(TAG, "binding to " + backupIntent);
+ if (mContext.bindService(backupIntent, this, 0)) {
+ synchronized (mBindSignaller) {
+ while (mTargetService == null && mBinding == true) {
+ try {
+ mBindSignaller.wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ if (mTargetService != null) {
+ try {
+ Log.d(TAG, "invoking doBackup() on " + backupIntent);
+ // !!! TODO: set up files
+ mTargetService.doBackup(-1, -1, -1);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Remote target " + backupIntent
+ + " threw during backup:");
+ e.printStackTrace();
+ }
+ mContext.unbindService(this);
+ }
+ } else {
+ Log.d(TAG, "Unable to bind to " + backupIntent);
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ synchronized (mBindSignaller) {
+ mTargetService = IBackupService.Stub.asInterface(service);
+ mBinding = false;
+ mBindSignaller.notifyAll();
+ }
+ }
+
+ public void onServiceDisconnected(ComponentName name) {
+ synchronized (mBindSignaller) {
+ mTargetService = null;
+ mBinding = false;
+ mBindSignaller.notifyAll();
+ }
+ }
+ }
+
+ public BackupManagerService(Context context) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+
+ // Identify the backup participants
+ // !!! TODO: also watch package-install to keep this up to date
+ List<ResolveInfo> services = mPackageManager.queryIntentServices(
+ new Intent(BackupService.SERVICE_ACTION), 0);
+ if (DEBUG) {
+ Log.v(TAG, "Backup participants: " + services.size());
+ for (ResolveInfo ri : services) {
+ Log.v(TAG, " " + ri + " : " + ri.filter);
+ }
+ }
+
+ // Build our mapping of uid to backup client services
+ for (ResolveInfo ri : services) {
+ int uid = ri.serviceInfo.applicationInfo.uid;
+ HashSet<ServiceInfo> set = mBackupParticipants.get(uid);
+ if (set == null) {
+ set = new HashSet<ServiceInfo>();
+ mBackupParticipants.put(uid, set);
+ }
+ set.add(ri.serviceInfo);
+ }
+ }
+
+
+ // ----- IBackupManager binder interface -----
+
+ public void dataChanged(String packageName) throws RemoteException {
+ // Record that we need a backup pass for the caller. Since multiple callers
+ // may share a uid, we need to note all candidates within that uid and schedule
+ // a backup pass for each of them.
+
+ HashSet<ServiceInfo> targets = mBackupParticipants.get(Binder.getCallingUid());
+ if (targets != null) {
+ synchronized (mQueueLock) {
+ // Note that this client has made data changes that need to be backed up
+ for (ServiceInfo service : targets) {
+ // validate the caller-supplied package name against the known set of
+ // packages associated with this uid
+ if (service.packageName.equals(packageName)) {
+ // add the caller to the set of pending backups
+ if (mPendingBackups.add(service)) {
+ // !!! TODO: write to the pending-backup journal file in case of crash
+ }
+ }
+ }
+
+ // Schedule a backup pass in a few minutes. As backup-eligible data
+ // keeps changing, continue to defer the backup pass until things
+ // settle down, to avoid extra overhead.
+ mBackupHandler.removeMessages(MSG_RUN_BACKUP);
+ mBackupHandler.sendEmptyMessageDelayed(MSG_RUN_BACKUP, COLLECTION_INTERVAL);
+ }
+ }
+ }
+}
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java
index b534ef1..72efca5 100644
--- a/services/java/com/android/server/IntentResolver.java
+++ b/services/java/com/android/server/IntentResolver.java
@@ -16,6 +16,7 @@
package com.android.server;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -89,11 +90,11 @@ public class IntentResolver<F extends IntentFilter, R extends Object> {
}
}
- void dumpMap(Printer out, String prefix, Map<String, ArrayList<F>> map) {
+ void dumpMap(PrintWriter out, String prefix, Map<String, ArrayList<F>> map) {
String eprefix = prefix + " ";
String fprefix = prefix + " ";
for (Map.Entry<String, ArrayList<F>> e : map.entrySet()) {
- out.println(eprefix + e.getKey() + ":");
+ out.print(eprefix); out.print(e.getKey()); out.println(":");
ArrayList<F> a = e.getValue();
final int N = a.size();
for (int i=0; i<N; i++) {
@@ -102,24 +103,25 @@ public class IntentResolver<F extends IntentFilter, R extends Object> {
}
}
- public void dump(Printer out, String prefix) {
- out.println(prefix + "Full MIME Types:");
- dumpMap(out, prefix+" ", mTypeToFilter);
- out.println(prefix);
- out.println(prefix + "Base MIME Types:");
- dumpMap(out, prefix+" ", mBaseTypeToFilter);
- out.println(prefix);
- out.println(prefix + "Wild MIME Types:");
- dumpMap(out, prefix+" ", mWildTypeToFilter);
- out.println(prefix);
- out.println(prefix + "Schemes:");
- dumpMap(out, prefix+" ", mSchemeToFilter);
- out.println(prefix);
- out.println(prefix + "Non-Data Actions:");
- dumpMap(out, prefix+" ", mActionToFilter);
- out.println(prefix);
- out.println(prefix + "MIME Typed Actions:");
- dumpMap(out, prefix+" ", mTypedActionToFilter);
+ public void dump(PrintWriter out, String prefix) {
+ String innerPrefix = prefix + " ";
+ out.print(prefix); out.println("Full MIME Types:");
+ dumpMap(out, innerPrefix, mTypeToFilter);
+ out.println(" ");
+ out.print(prefix); out.println("Base MIME Types:");
+ dumpMap(out, innerPrefix, mBaseTypeToFilter);
+ out.println(" ");
+ out.print(prefix); out.println("Wild MIME Types:");
+ dumpMap(out, innerPrefix, mWildTypeToFilter);
+ out.println(" ");
+ out.print(prefix); out.println("Schemes:");
+ dumpMap(out, innerPrefix, mSchemeToFilter);
+ out.println(" ");
+ out.print(prefix); out.println("Non-Data Actions:");
+ dumpMap(out, innerPrefix, mActionToFilter);
+ out.println(" ");
+ out.print(prefix); out.println("MIME Typed Actions:");
+ dumpMap(out, innerPrefix, mTypedActionToFilter);
}
private class IteratorWrapper implements Iterator<F> {
@@ -275,8 +277,8 @@ public class IntentResolver<F extends IntentFilter, R extends Object> {
Collections.sort(results, mResolvePrioritySorter);
}
- protected void dumpFilter(Printer out, String prefix, F filter) {
- out.println(prefix + filter);
+ protected void dumpFilter(PrintWriter out, String prefix, F filter) {
+ out.print(prefix); out.println(filter);
}
private final int register_mime_types(F filter, String prefix) {
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 5e079d4..0e1e0d9 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -53,13 +53,13 @@ import android.location.ILocationProvider;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
-import android.location.LocationProviderImpl;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
@@ -72,9 +72,9 @@ import android.util.PrintWriterPrinter;
import android.util.SparseIntArray;
import com.android.internal.location.GpsLocationProvider;
+import com.android.internal.location.LocationProviderImpl;
import com.android.internal.location.LocationProviderProxy;
import com.android.internal.location.MockProvider;
-import com.android.internal.location.TrackProvider;
import com.android.server.am.BatteryStatsService;
/**
@@ -83,7 +83,7 @@ import com.android.server.am.BatteryStatsService;
*
* {@hide}
*/
-public class LocationManagerService extends ILocationManager.Stub {
+public class LocationManagerService extends ILocationManager.Stub implements Runnable {
private static final String TAG = "LocationManagerService";
private static final boolean LOCAL_LOGV = false;
@@ -93,10 +93,6 @@ public class LocationManagerService extends ILocationManager.Stub {
// Max time to hold wake lock for, in milliseconds.
private static final long MAX_TIME_FOR_WAKE_LOCK = 60 * 1000L;
- // Time to wait after releasing a wake lock for clients to process location update,
- // in milliseconds.
- private static final long TIME_AFTER_WAKE_LOCK = 2 * 1000L;
-
// The last time a location was written, by provider name.
private HashMap<String,Long> mLastWriteTime = new HashMap<String,Long>();
@@ -130,7 +126,6 @@ public class LocationManagerService extends ILocationManager.Stub {
// Handler messages
private static final int MESSAGE_LOCATION_CHANGED = 1;
- private static final int MESSAGE_RELEASE_WAKE_LOCK = 2;
// Alarm manager and wakelock variables
private final static String ALARM_INTENT = "com.android.location.ALARM_INTENT";
@@ -138,6 +133,7 @@ public class LocationManagerService extends ILocationManager.Stub {
private AlarmManager mAlarmManager;
private long mAlarmInterval = 0;
private PowerManager.WakeLock mWakeLock = null;
+ private int mPendingBroadcasts;
private long mWakeLockAcquireTime = 0;
private boolean mWakeLockGpsReceived = true;
private boolean mWakeLockNetworkReceived = true;
@@ -159,7 +155,8 @@ public class LocationManagerService extends ILocationManager.Stub {
new HashMap<String,ArrayList<UpdateRecord>>();
// Proximity listeners
- private Receiver mProximityListener = null;
+ private Receiver mProximityReceiver = null;
+ private ILocationListener mProximityListener = null;
private HashMap<PendingIntent,ProximityAlert> mProximityAlerts =
new HashMap<PendingIntent,ProximityAlert>();
private HashSet<ProximityAlert> mProximitiesEntered =
@@ -181,11 +178,12 @@ public class LocationManagerService extends ILocationManager.Stub {
* A wrapper class holding either an ILocationListener or a PendingIntent to receive
* location updates.
*/
- private final class Receiver implements IBinder.DeathRecipient {
+ private final class Receiver implements IBinder.DeathRecipient, PendingIntent.OnFinished {
final ILocationListener mListener;
final PendingIntent mPendingIntent;
final Object mKey;
final HashMap<String,UpdateRecord> mUpdateRecords = new HashMap<String,UpdateRecord>();
+ int mPendingBroadcasts;
Receiver(ILocationListener listener) {
mListener = listener;
@@ -252,7 +250,16 @@ public class LocationManagerService extends ILocationManager.Stub {
public boolean callStatusChangedLocked(String provider, int status, Bundle extras) {
if (mListener != null) {
try {
- mListener.onStatusChanged(provider, status, extras);
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ mListener.onStatusChanged(provider, status, extras);
+ if (mListener != mProximityListener) {
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
+ }
} catch (RemoteException e) {
return false;
}
@@ -261,7 +268,14 @@ public class LocationManagerService extends ILocationManager.Stub {
statusChanged.putExtras(extras);
statusChanged.putExtra(LocationManager.KEY_STATUS_CHANGED, status);
try {
- mPendingIntent.send(mContext, 0, statusChanged, null, null);
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ mPendingIntent.send(mContext, 0, statusChanged, this, mLocationHandler);
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
} catch (PendingIntent.CanceledException e) {
return false;
}
@@ -272,7 +286,16 @@ public class LocationManagerService extends ILocationManager.Stub {
public boolean callLocationChangedLocked(Location location) {
if (mListener != null) {
try {
- mListener.onLocationChanged(location);
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ mListener.onLocationChanged(location);
+ if (mListener != mProximityListener) {
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
+ }
} catch (RemoteException e) {
return false;
}
@@ -280,7 +303,53 @@ public class LocationManagerService extends ILocationManager.Stub {
Intent locationChanged = new Intent();
locationChanged.putExtra(LocationManager.KEY_LOCATION_CHANGED, location);
try {
- mPendingIntent.send(mContext, 0, locationChanged, null, null);
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ mPendingIntent.send(mContext, 0, locationChanged, this, mLocationHandler);
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
+ } catch (PendingIntent.CanceledException e) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean callProviderEnabledLocked(String provider, boolean enabled) {
+ if (mListener != null) {
+ try {
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ if (enabled) {
+ mListener.onProviderEnabled(provider);
+ } else {
+ mListener.onProviderDisabled(provider);
+ }
+ if (mListener != mProximityListener) {
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
+ }
+ } catch (RemoteException e) {
+ return false;
+ }
+ } else {
+ Intent providerIntent = new Intent();
+ providerIntent.putExtra(LocationManager.KEY_PROVIDER_ENABLED, enabled);
+ try {
+ synchronized (this) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ mPendingIntent.send(mContext, 0, providerIntent, this, mLocationHandler);
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
} catch (PendingIntent.CanceledException e) {
return false;
}
@@ -295,6 +364,42 @@ public class LocationManagerService extends ILocationManager.Stub {
synchronized (mLock) {
removeUpdatesLocked(this);
}
+ synchronized (this) {
+ if (mPendingBroadcasts > 0) {
+ LocationManagerService.this.decrementPendingBroadcasts();
+ mPendingBroadcasts = 0;
+ }
+ }
+ }
+
+ public void onSendFinished(PendingIntent pendingIntent, Intent intent,
+ int resultCode, String resultData, Bundle resultExtras) {
+ decrementPendingBroadcasts();
+ }
+
+ // this must be called while synchronized by callerin a synchronized block
+ // containing the sending of the broadcaset
+ private void incrementPendingBroadcastsLocked() {
+ if (mPendingBroadcasts++ == 0) {
+ synchronized (mLock) {
+ LocationManagerService.this.incrementPendingBroadcastsLocked();
+ }
+ }
+ }
+
+ private void decrementPendingBroadcasts() {
+ synchronized (this) {
+ if (--mPendingBroadcasts == 0) {
+ LocationManagerService.this.decrementPendingBroadcasts();
+ }
+ }
+ }
+ }
+
+ public void locationCallbackFinished(ILocationListener listener) {
+ Receiver receiver = getReceiver(listener);
+ if (receiver != null) {
+ receiver.decrementPendingBroadcasts();
}
}
@@ -434,71 +539,6 @@ public class LocationManagerService extends ILocationManager.Stub {
LocationProviderImpl.addProvider(mGpsLocationProvider);
}
- // Load fake providers if real providers are not available
- File f = new File(LocationManager.PROVIDER_DIR);
- if (f.isDirectory()) {
- File[] subdirs = f.listFiles();
- for (int i = 0; i < subdirs.length; i++) {
- if (!subdirs[i].isDirectory()) {
- continue;
- }
-
- String name = subdirs[i].getName();
-
- if (LOCAL_LOGV) {
- Log.v(TAG, "Found dir " + subdirs[i].getAbsolutePath());
- Log.v(TAG, "name = " + name);
- }
-
- // Don't create a fake provider if a real provider exists
- if (LocationProviderImpl.getProvider(name) == null) {
- LocationProviderImpl provider = null;
- try {
- File classFile = new File(subdirs[i], "class");
- // Look for a 'class' file
- provider = LocationProviderImpl.loadFromClass(classFile);
-
- // Look for an 'kml', 'nmea', or 'track' file
- if (provider == null) {
- // Load properties from 'properties' file, if present
- File propertiesFile = new File(subdirs[i], "properties");
-
- if (propertiesFile.exists()) {
- provider = new TrackProvider(name, this);
- ((TrackProvider)provider).readProperties(propertiesFile);
-
- File kmlFile = new File(subdirs[i], "kml");
- if (kmlFile.exists()) {
- ((TrackProvider) provider).readKml(kmlFile);
- } else {
- File nmeaFile = new File(subdirs[i], "nmea");
- if (nmeaFile.exists()) {
- ((TrackProvider) provider).readNmea(name, nmeaFile);
- } else {
- File trackFile = new File(subdirs[i], "track");
- if (trackFile.exists()) {
- ((TrackProvider) provider).readTrack(trackFile);
- }
- }
- }
- }
- }
- if (provider != null) {
- LocationProviderImpl.addProvider(provider);
- }
- // Grab the initial location of a TrackProvider and
- // store it as the last known location for that provider
- if (provider instanceof TrackProvider) {
- TrackProvider tp = (TrackProvider) provider;
- mLastKnownLocation.put(tp.getName(), tp.getInitialLocation());
- }
- } catch (Exception e) {
- Log.e(TAG, "Exception loading provder " + name, e);
- }
- }
- }
- }
-
updateProvidersLocked();
}
@@ -508,14 +548,18 @@ public class LocationManagerService extends ILocationManager.Stub {
public LocationManagerService(Context context) {
super();
mContext = context;
- mLocationHandler = new LocationWorkerHandler();
+
+ Thread thread = new Thread(null, this, "LocationManagerService");
+ thread.start();
if (LOCAL_LOGV) {
Log.v(TAG, "Constructed LocationManager Service");
}
+ }
+ private void initialize() {
// Alarm manager, needs to be done before calling loadProviders() below
- mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
// Create a wake lock, needs to be done before calling loadProviders() below
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -529,7 +573,7 @@ public class LocationManagerService extends ILocationManager.Stub {
IntentFilter networkIntentFilter = new IntentFilter();
networkIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
networkIntentFilter.addAction(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION);
- context.registerReceiver(networkReceiver, networkIntentFilter);
+ mContext.registerReceiver(networkReceiver, networkIntentFilter);
// Register for power updates
PowerStateBroadcastReceiver powerStateReceiver = new PowerStateBroadcastReceiver();
@@ -537,7 +581,7 @@ public class LocationManagerService extends ILocationManager.Stub {
intentFilter.addAction(ALARM_INTENT);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
- context.registerReceiver(powerStateReceiver, intentFilter);
+ mContext.registerReceiver(powerStateReceiver, intentFilter);
// listen for settings changes
ContentResolver resolver = mContext.getContentResolver();
@@ -550,6 +594,15 @@ public class LocationManagerService extends ILocationManager.Stub {
mSettings.addObserver(settingsObserver);
}
+ public void run()
+ {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+ Looper.prepare();
+ mLocationHandler = new LocationWorkerHandler();
+ initialize();
+ Looper.loop();
+ }
+
public void setNetworkLocationProvider(ILocationProvider provider) {
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException(
@@ -650,10 +703,10 @@ public class LocationManagerService extends ILocationManager.Stub {
if (LOCAL_LOGV) {
Log.v(TAG, "getAllProviders");
}
- List<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
+ ArrayList<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
ArrayList<String> out = new ArrayList<String>(providers.size());
-
- for (LocationProviderImpl p : providers) {
+ for (int i = providers.size() - 1; i >= 0; i--) {
+ LocationProviderImpl p = providers.get(i);
out.add(p.getName());
}
return out;
@@ -676,10 +729,10 @@ public class LocationManagerService extends ILocationManager.Stub {
if (LOCAL_LOGV) {
Log.v(TAG, "getProviders");
}
- List<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
- ArrayList<String> out = new ArrayList<String>();
-
- for (LocationProviderImpl p : providers) {
+ ArrayList<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
+ ArrayList<String> out = new ArrayList<String>(providers.size());
+ for (int i = providers.size() - 1; i >= 0; i--) {
+ LocationProviderImpl p = providers.get(i);
String name = p.getName();
if (isAllowedProviderSafe(name)) {
if (enabledOnly && !isAllowedBySettingsLocked(name)) {
@@ -692,7 +745,9 @@ public class LocationManagerService extends ILocationManager.Stub {
}
private void updateProvidersLocked() {
- for (LocationProviderImpl p : LocationProviderImpl.getProviders()) {
+ ArrayList<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
+ for (int i = providers.size() - 1; i >= 0; i--) {
+ LocationProviderImpl p = providers.get(i);
boolean isEnabled = p.isEnabled();
String name = p.getName();
boolean shouldBeEnabled = isAllowedBySettingsLocked(name);
@@ -722,29 +777,11 @@ public class LocationManagerService extends ILocationManager.Stub {
for (int i=0; i<N; i++) {
UpdateRecord record = records.get(i);
// Sends a notification message to the receiver
- try {
- Receiver receiver = record.mReceiver;
- if (receiver.isListener()) {
- if (enabled) {
- receiver.getListener().onProviderEnabled(provider);
- } else {
- receiver.getListener().onProviderDisabled(provider);
- }
- } else {
- Intent providerIntent = new Intent();
- providerIntent.putExtra(LocationManager.KEY_PROVIDER_ENABLED, enabled);
- try {
- receiver.getPendingIntent().send(mContext, 0,
- providerIntent, null, null);
- } catch (PendingIntent.CanceledException e) {
- if (deadReceivers == null) {
- deadReceivers = new ArrayList<Receiver>();
- deadReceivers.add(receiver);
- }
- }
+ if (!record.mReceiver.callProviderEnabledLocked(provider, enabled)) {
+ if (deadReceivers == null) {
+ deadReceivers = new ArrayList<Receiver>();
+ deadReceivers.add(record.mReceiver);
}
- } catch (RemoteException e) {
- // The death link will clean this up.
}
listeners++;
}
@@ -958,15 +995,8 @@ public class LocationManagerService extends ILocationManager.Stub {
impl.enableLocationTracking(true);
updateWakelockStatusLocked();
} else {
- try {
- // Notify the listener that updates are currently disabled
- if (receiver.isListener()) {
- receiver.getListener().onProviderDisabled(provider);
- }
- } catch(RemoteException e) {
- Log.w(TAG, "RemoteException calling onProviderDisabled on " +
- receiver.getListener());
- }
+ // Notify the listener that updates are currently disabled
+ receiver.callProviderEnabledLocked(provider, false);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -1161,7 +1191,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
// Listener for receiving locations to trigger proximity alerts
- class ProximityListener extends ILocationListener.Stub {
+ class ProximityListener extends ILocationListener.Stub implements PendingIntent.OnFinished {
boolean isGpsAvailable = false;
@@ -1198,7 +1228,14 @@ public class LocationManagerService extends ILocationManager.Stub {
Intent enteredIntent = new Intent();
enteredIntent.putExtra(LocationManager.KEY_PROXIMITY_ENTERING, true);
try {
- intent.send(mContext, 0, enteredIntent, null, null);
+ synchronized (mLock) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ intent.send(mContext, 0, enteredIntent, this, mLocationHandler);
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
} catch (PendingIntent.CanceledException e) {
if (LOCAL_LOGV) {
Log.v(TAG, "Canceled proximity alert: " + alert, e);
@@ -1216,7 +1253,14 @@ public class LocationManagerService extends ILocationManager.Stub {
Intent exitedIntent = new Intent();
exitedIntent.putExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
try {
- intent.send(mContext, 0, exitedIntent, null, null);
+ synchronized (mLock) {
+ // synchronize to ensure incrementPendingBroadcastsLocked()
+ // is called before decrementPendingBroadcasts()
+ intent.send(mContext, 0, exitedIntent, this, mLocationHandler);
+ // call this after broadcasting so we do not increment
+ // if we throw an exeption.
+ incrementPendingBroadcastsLocked();
+ }
} catch (PendingIntent.CanceledException e) {
if (LOCAL_LOGV) {
Log.v(TAG, "Canceled proximity alert: " + alert, e);
@@ -1269,6 +1313,11 @@ public class LocationManagerService extends ILocationManager.Stub {
isGpsAvailable = false;
}
}
+
+ public void onSendFinished(PendingIntent pendingIntent, Intent intent,
+ int resultCode, String resultData, Bundle resultExtras) {
+ decrementPendingBroadcasts();
+ }
}
public void addProximityAlert(double latitude, double longitude,
@@ -1306,19 +1355,20 @@ public class LocationManagerService extends ILocationManager.Stub {
latitude, longitude, radius, expiration, intent);
mProximityAlerts.put(intent, alert);
- if (mProximityListener == null) {
- mProximityListener = new Receiver(new ProximityListener());
+ if (mProximityReceiver == null) {
+ mProximityListener = new ProximityListener();
+ mProximityReceiver = new Receiver(mProximityListener);
LocationProvider provider = LocationProviderImpl.getProvider(
LocationManager.GPS_PROVIDER);
if (provider != null) {
- requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityListener);
+ requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityReceiver);
}
provider =
LocationProviderImpl.getProvider(LocationManager.NETWORK_PROVIDER);
if (provider != null) {
- requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityListener);
+ requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityReceiver);
}
}
}
@@ -1342,7 +1392,8 @@ public class LocationManagerService extends ILocationManager.Stub {
mProximityAlerts.remove(intent);
if (mProximityAlerts.size() == 0) {
- removeUpdatesLocked(mProximityListener);
+ removeUpdatesLocked(mProximityReceiver);
+ mProximityReceiver = null;
mProximityListener = null;
}
}
@@ -1585,35 +1636,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
handleLocationChangedLocked(location);
-
- if ((mWakeLockAcquireTime != 0) &&
- (SystemClock.elapsedRealtime() - mWakeLockAcquireTime
- > MAX_TIME_FOR_WAKE_LOCK)) {
-
- removeMessages(MESSAGE_RELEASE_WAKE_LOCK);
-
- log("LocationWorkerHandler: Exceeded max time for wake lock");
- Message m = Message.obtain(this, MESSAGE_RELEASE_WAKE_LOCK);
- sendMessageAtFrontOfQueue(m);
-
- } else if (mWakeLockAcquireTime != 0 &&
- mWakeLockGpsReceived && mWakeLockNetworkReceived) {
-
- removeMessages(MESSAGE_RELEASE_WAKE_LOCK);
-
- log("LocationWorkerHandler: Locations received.");
- mWakeLockAcquireTime = 0;
- Message m = Message.obtain(this, MESSAGE_RELEASE_WAKE_LOCK);
- sendMessageDelayed(m, TIME_AFTER_WAKE_LOCK);
- }
- }
- } else if (msg.what == MESSAGE_RELEASE_WAKE_LOCK) {
- log("LocationWorkerHandler: Release");
-
- // Update wakelock status so the next alarm is set before releasing wakelock
- synchronized (mLock) {
updateWakelockStatusLocked();
- releaseWakeLockLocked();
}
}
} catch (Exception e) {
@@ -1697,8 +1720,9 @@ public class LocationManagerService extends ILocationManager.Stub {
// Notify location providers of current network state
synchronized (mLock) {
- List<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
- for (LocationProviderImpl provider : providers) {
+ ArrayList<LocationProviderImpl> providers = LocationProviderImpl.getProviders();
+ for (int i = providers.size() - 1; i >= 0; i--) {
+ LocationProviderImpl provider = providers.get(i);
if (provider.requiresNetwork()) {
provider.updateNetworkState(mNetworkState);
}
@@ -1727,7 +1751,7 @@ public class LocationManagerService extends ILocationManager.Stub {
long callerId = Binder.clearCallingIdentity();
- boolean needsLock = false;
+ boolean needsLock = (mPendingBroadcasts > 0);
long minTime = Integer.MAX_VALUE;
if (mNetworkLocationProvider != null && mNetworkLocationProvider.isLocationTracking()) {
@@ -1757,8 +1781,6 @@ public class LocationManagerService extends ILocationManager.Stub {
log("No need for alarm");
mAlarmInterval = -1;
- // Clear out existing wakelocks
- mLocationHandler.removeMessages(MESSAGE_RELEASE_WAKE_LOCK);
releaseWakeLockLocked();
}
Binder.restoreCallingIdentity(callerId);
@@ -1836,6 +1858,20 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
+ private void incrementPendingBroadcastsLocked() {
+ if (mPendingBroadcasts++ == 0) {
+ updateWakelockStatusLocked();
+ }
+ }
+
+ private void decrementPendingBroadcasts() {
+ synchronized (mLock) {
+ if (--mPendingBroadcasts == 0) {
+ updateWakelockStatusLocked();
+ }
+ }
+ }
+
// Geocoder
public String getFromLocation(double latitude, double longitude, int maxResults,
@@ -2061,6 +2097,7 @@ public class LocationManagerService extends ILocationManager.Stub {
i.dump(pw, " ");
}
}
+ pw.println(" mProximityReceiver=" + mProximityReceiver);
pw.println(" mProximityListener=" + mProximityListener);
if (mEnabledProviders.size() > 0) {
pw.println(" Enabled Providers:");
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 9e062f4..159bc76 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -2932,11 +2932,12 @@ class PackageManagerService extends IPackageManager.Stub {
}
@Override
- protected void dumpFilter(Printer out, String prefix,
+ protected void dumpFilter(PrintWriter out, String prefix,
PackageParser.ActivityIntentInfo filter) {
- out.println(prefix
- + Integer.toHexString(System.identityHashCode(filter.activity))
- + " " + filter.activity.component.flattenToShortString());
+ out.print(prefix); out.print(
+ Integer.toHexString(System.identityHashCode(filter.activity)));
+ out.print(' ');
+ out.println(filter.activity.componentShortName);
}
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
@@ -3064,11 +3065,12 @@ class PackageManagerService extends IPackageManager.Stub {
}
@Override
- protected void dumpFilter(Printer out, String prefix,
+ protected void dumpFilter(PrintWriter out, String prefix,
PackageParser.ServiceIntentInfo filter) {
- out.println(prefix
- + Integer.toHexString(System.identityHashCode(filter.service))
- + " " + filter.service.component.flattenToShortString());
+ out.print(prefix); out.print(
+ Integer.toHexString(System.identityHashCode(filter.service)));
+ out.print(' ');
+ out.println(filter.service.componentShortName);
}
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
@@ -4578,80 +4580,83 @@ class PackageManagerService extends IPackageManager.Stub {
return;
}
- Printer printer = new PrintWriterPrinter(pw);
synchronized (mPackages) {
pw.println("Activity Resolver Table:");
- mActivities.dump(printer, " ");
+ mActivities.dump(pw, " ");
pw.println(" ");
pw.println("Receiver Resolver Table:");
- mReceivers.dump(printer, " ");
+ mReceivers.dump(pw, " ");
pw.println(" ");
pw.println("Service Resolver Table:");
- mServices.dump(printer, " ");
+ mServices.dump(pw, " ");
pw.println(" ");
pw.println("Preferred Activities:");
- mSettings.mPreferredActivities.dump(printer, " ");
+ mSettings.mPreferredActivities.dump(pw, " ");
pw.println(" ");
pw.println("Preferred Packages:");
{
for (PackageSetting ps : mSettings.mPreferredPackages) {
- pw.println(" " + ps.name);
+ pw.print(" "); pw.println(ps.name);
}
}
pw.println(" ");
pw.println("Permissions:");
{
for (BasePermission p : mSettings.mPermissions.values()) {
- pw.println(" Permission [" + p.name + "] ("
- + Integer.toHexString(System.identityHashCode(p))
- + "):");
- pw.println(" sourcePackage=" + p.sourcePackage);
- pw.println(" uid=" + p.uid
- + " gids=" + arrayToString(p.gids)
- + " type=" + p.type);
+ pw.print(" Permission ["); pw.print(p.name); pw.print("] (");
+ pw.print(Integer.toHexString(System.identityHashCode(p)));
+ pw.println("):");
+ pw.print(" sourcePackage="); pw.println(p.sourcePackage);
+ pw.print(" uid="); pw.print(p.uid);
+ pw.print(" gids="); pw.print(arrayToString(p.gids));
+ pw.print(" type="); pw.println(p.type);
}
}
pw.println(" ");
pw.println("Packages:");
{
for (PackageSetting ps : mSettings.mPackages.values()) {
- pw.println(" Package [" + ps.name + "] ("
- + Integer.toHexString(System.identityHashCode(ps))
- + "):");
- pw.println(" userId=" + ps.userId
- + " gids=" + arrayToString(ps.gids));
- pw.println(" sharedUser=" + ps.sharedUser);
- pw.println(" pkg=" + ps.pkg);
- pw.println(" codePath=" + ps.codePathString);
- pw.println(" resourcePath=" + ps.resourcePathString);
+ pw.print(" Package ["); pw.print(ps.name); pw.print("] (");
+ pw.print(Integer.toHexString(System.identityHashCode(ps)));
+ pw.println("):");
+ pw.print(" userId="); pw.print(ps.userId);
+ pw.print(" gids="); pw.println(arrayToString(ps.gids));
+ pw.print(" sharedUser="); pw.println(ps.sharedUser);
+ pw.print(" pkg="); pw.println(ps.pkg);
+ pw.print(" codePath="); pw.println(ps.codePathString);
+ pw.print(" resourcePath="); pw.println(ps.resourcePathString);
if (ps.pkg != null) {
- pw.println(" dataDir=" + ps.pkg.applicationInfo.dataDir);
+ pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
}
- pw.println(" timeStamp=" + ps.getTimeStampStr());
- pw.println(" signatures=" + ps.signatures);
- pw.println(" permissionsFixed=" + ps.permissionsFixed
- + " pkgFlags=0x" + Integer.toHexString(ps.pkgFlags)
- + " installStatus=" + ps.installStatus
- + " enabled=" + ps.enabled);
+ pw.print(" timeStamp="); pw.println(ps.getTimeStampStr());
+ pw.print(" signatures="); pw.println(ps.signatures);
+ pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed);
+ pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
+ pw.print(" installStatus="); pw.print(ps.installStatus);
+ pw.print(" enabled="); pw.println(ps.enabled);
if (ps.disabledComponents.size() > 0) {
pw.println(" disabledComponents:");
for (String s : ps.disabledComponents) {
- pw.println(" " + s);
+ pw.print(" "); pw.println(s);
}
}
if (ps.enabledComponents.size() > 0) {
pw.println(" enabledComponents:");
for (String s : ps.enabledComponents) {
- pw.println(" " + s);
+ pw.print(" "); pw.println(s);
}
}
- pw.println(" grantedPermissions:");
- for (String s : ps.grantedPermissions) {
- pw.println(" " + s);
+ if (ps.grantedPermissions.size() > 0) {
+ pw.println(" grantedPermissions:");
+ for (String s : ps.grantedPermissions) {
+ pw.print(" "); pw.println(s);
+ }
}
- pw.println(" loadedPermissions:");
- for (String s : ps.loadedPermissions) {
- pw.println(" " + s);
+ if (ps.loadedPermissions.size() > 0) {
+ pw.println(" loadedPermissions:");
+ for (String s : ps.loadedPermissions) {
+ pw.print(" "); pw.println(s);
+ }
}
}
}
@@ -4659,18 +4664,18 @@ class PackageManagerService extends IPackageManager.Stub {
pw.println("Shared Users:");
{
for (SharedUserSetting su : mSettings.mSharedUsers.values()) {
- pw.println(" SharedUser [" + su.name + "] ("
- + Integer.toHexString(System.identityHashCode(su))
- + "):");
- pw.println(" userId=" + su.userId
- + " gids=" + arrayToString(su.gids));
+ pw.print(" SharedUser ["); pw.print(su.name); pw.print("] (");
+ pw.print(Integer.toHexString(System.identityHashCode(su)));
+ pw.println("):");
+ pw.print(" userId="); pw.print(su.userId);
+ pw.print(" gids="); pw.println(arrayToString(su.gids));
pw.println(" grantedPermissions:");
for (String s : su.grantedPermissions) {
- pw.println(" " + s);
+ pw.print(" "); pw.println(s);
}
pw.println(" loadedPermissions:");
for (String s : su.loadedPermissions) {
- pw.println(" " + s);
+ pw.print(" "); pw.println(s);
}
}
}
@@ -5302,16 +5307,19 @@ class PackageManagerService extends IPackageManager.Stub {
private final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
new IntentResolver<PreferredActivity, PreferredActivity>() {
@Override
- protected void dumpFilter(Printer out, String prefix,
+ protected void dumpFilter(PrintWriter out, String prefix,
PreferredActivity filter) {
- out.println(prefix
- + Integer.toHexString(System.identityHashCode(filter))
- + " " + filter.mActivity.flattenToShortString()
- + " match=0x" + Integer.toHexString(filter.mMatch));
+ out.print(prefix); out.print(
+ Integer.toHexString(System.identityHashCode(filter)));
+ out.print(' ');
+ out.print(filter.mActivity.flattenToShortString());
+ out.print(" match=0x");
+ out.println( Integer.toHexString(filter.mMatch));
if (filter.mSetComponents != null) {
- out.println(prefix + " Selected from:");
+ out.print(prefix); out.println(" Selected from:");
for (int i=0; i<filter.mSetComponents.length; i++) {
- out.println(prefix + " " + filter.mSetComponents[i]);
+ out.print(prefix); out.print(" ");
+ out.println(filter.mSetComponents[i]);
}
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index efca2cb..b19e2ee 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -310,6 +310,13 @@ class ServerThread extends Thread {
}
try {
+ Log.i(TAG, "Starting Backup Service");
+ ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
+ } catch (Throwable e) {
+ Log.e(TAG, "Failure starting Backup Service", e);
+ }
+
+ try {
Log.i(TAG, "Starting AppWidget Service");
appWidget = new AppWidgetService(context);
ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget);
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index b0fcb1c..321b17e 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -5175,6 +5175,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
final IInputContext mInputContext;
final int mUid;
final int mPid;
+ final String mStringName;
SurfaceSession mSurfaceSession;
int mNumWindow = 0;
boolean mClientDead = false;
@@ -5198,6 +5199,14 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
mInputContext = inputContext;
mUid = Binder.getCallingUid();
mPid = Binder.getCallingPid();
+ StringBuilder sb = new StringBuilder();
+ sb.append("Session{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" uid ");
+ sb.append(mUid);
+ sb.append("}");
+ mStringName = sb.toString();
+
synchronized (mWindowMap) {
if (mInputMethodManager == null && mHaveInputMethods) {
IBinder b = ServiceManager.getService(
@@ -5377,20 +5386,24 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "mNumWindow=" + mNumWindow
- + " mClientDead=" + mClientDead
- + " mSurfaceSession=" + mSurfaceSession);
- pw.println(prefix + "mPendingPointerWindow=" + mPendingPointerWindow
- + " mPendingPointerMove=" + mPendingPointerMove);
- pw.println(prefix + "mPendingTrackballWindow=" + mPendingTrackballWindow
- + " mPendingTrackballMove=" + mPendingTrackballMove);
+ pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
+ pw.print(" mClientDead="); pw.print(mClientDead);
+ pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
+ if (mPendingPointerWindow != null || mPendingPointerMove != null) {
+ pw.print(prefix);
+ pw.print("mPendingPointerWindow="); pw.print(mPendingPointerWindow);
+ pw.print(" mPendingPointerMove="); pw.println(mPendingPointerMove);
+ }
+ if (mPendingTrackballWindow != null || mPendingTrackballMove != null) {
+ pw.print(prefix);
+ pw.print("mPendingTrackballWindow="); pw.print(mPendingTrackballWindow);
+ pw.print(" mPendingTrackballMove="); pw.println(mPendingTrackballMove);
+ }
}
@Override
public String toString() {
- return "Session{"
- + Integer.toHexString(System.identityHashCode(this)) + "}";
+ return mStringName;
}
}
@@ -6458,67 +6471,114 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "mSession=" + mSession
- + " mClient=" + mClient.asBinder());
- pw.println(prefix + "mAttrs=" + mAttrs);
- pw.println(prefix + "mAttachedWindow=" + mAttachedWindow
- + " mLayoutAttached=" + mLayoutAttached
- + " mIsImWindow=" + mIsImWindow);
- pw.println(prefix + "mBaseLayer=" + mBaseLayer
- + " mSubLayer=" + mSubLayer
- + " mAnimLayer=" + mLayer + "+"
- + (mTargetAppToken != null ? mTargetAppToken.animLayerAdjustment
- : (mAppToken != null ? mAppToken.animLayerAdjustment : 0))
- + "=" + mAnimLayer
- + " mLastLayer=" + mLastLayer);
- pw.println(prefix + "mSurface=" + mSurface);
- pw.println(prefix + "mToken=" + mToken);
- pw.println(prefix + "mRootToken=" + mRootToken);
- pw.println(prefix + "mAppToken=" + mAppToken);
- pw.println(prefix + "mTargetAppToken=" + mTargetAppToken);
- pw.println(prefix + "mViewVisibility=0x" + Integer.toHexString(mViewVisibility)
- + " mPolicyVisibility=" + mPolicyVisibility
- + " (after=" + mPolicyVisibilityAfterAnim
- + ") mAttachedHidden=" + mAttachedHidden
- + " mLastHidden=" + mLastHidden
- + " mHaveFrame=" + mHaveFrame);
- pw.println(prefix + "Requested w=" + mRequestedWidth + " h=" + mRequestedHeight
- + " x=" + mReqXPos + " y=" + mReqYPos);
- pw.println(prefix + "mGivenContentInsets=" + mGivenContentInsets.toShortString()
- + " mGivenVisibleInsets=" + mGivenVisibleInsets.toShortString()
- + " mTouchableInsets=" + mTouchableInsets
- + " pending=" + mGivenInsetsPending);
- pw.println(prefix + "mShownFrame=" + mShownFrame.toShortString()
- + " last=" + mLastShownFrame.toShortString());
- pw.println(prefix + "mFrame=" + mFrame.toShortString()
- + " last=" + mLastFrame.toShortString());
- pw.println(prefix + "mContainingFrame=" + mContainingFrame.toShortString()
- + " mDisplayFrame=" + mDisplayFrame.toShortString());
- pw.println(prefix + "mContentFrame=" + mContentFrame.toShortString()
- + " mVisibleFrame=" + mVisibleFrame.toShortString());
- pw.println(prefix + "mContentInsets=" + mContentInsets.toShortString()
- + " last=" + mLastContentInsets.toShortString()
- + " mVisibleInsets=" + mVisibleInsets.toShortString()
- + " last=" + mLastVisibleInsets.toShortString());
- pw.println(prefix + "mShownAlpha=" + mShownAlpha
- + " mAlpha=" + mAlpha + " mLastAlpha=" + mLastAlpha);
- pw.println(prefix + "mAnimating=" + mAnimating
- + " mLocalAnimating=" + mLocalAnimating
- + " mAnimationIsEntrance=" + mAnimationIsEntrance
- + " mAnimation=" + mAnimation);
- pw.println(prefix + "XForm: has=" + mHasTransformation
- + " " + mTransformation.toShortString());
- pw.println(prefix + "mDrawPending=" + mDrawPending
- + " mCommitDrawPending=" + mCommitDrawPending
- + " mReadyToShow=" + mReadyToShow
- + " mHasDrawn=" + mHasDrawn);
- pw.println(prefix + "mExiting=" + mExiting
- + " mRemoveOnExit=" + mRemoveOnExit
- + " mDestroying=" + mDestroying
- + " mRemoved=" + mRemoved);
- pw.println(prefix + "mOrientationChanging=" + mOrientationChanging
- + " mAppFreezing=" + mAppFreezing);
+ StringBuilder sb = new StringBuilder(64);
+
+ pw.print(prefix); pw.print("mSession="); pw.print(mSession);
+ pw.print(" mClient="); pw.println(mClient.asBinder());
+ pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs);
+ if (mAttachedWindow != null || mLayoutAttached) {
+ pw.print(prefix); pw.print("mAttachedWindow="); pw.print(mAttachedWindow);
+ pw.print(" mLayoutAttached="); pw.println(mLayoutAttached);
+ }
+ if (mIsImWindow) {
+ pw.print(prefix); pw.print("mIsImWindow="); pw.println(mIsImWindow);
+ }
+ pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer);
+ pw.print(" mSubLayer="); pw.print(mSubLayer);
+ pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+");
+ pw.print((mTargetAppToken != null ? mTargetAppToken.animLayerAdjustment
+ : (mAppToken != null ? mAppToken.animLayerAdjustment : 0)));
+ pw.print("="); pw.print(mAnimLayer);
+ pw.print(" mLastLayer="); pw.println(mLastLayer);
+ if (mSurface != null) {
+ pw.print(prefix); pw.print("mSurface="); pw.println(mSurface);
+ }
+ pw.print(prefix); pw.print("mToken="); pw.println(mToken);
+ pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken);
+ if (mAppToken != null) {
+ pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
+ }
+ if (mTargetAppToken != null) {
+ pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken);
+ }
+ pw.print(prefix); pw.print("mViewVisibility=0x");
+ pw.print(Integer.toHexString(mViewVisibility));
+ pw.print(" mLastHidden="); pw.print(mLastHidden);
+ pw.print(" mHaveFrame="); pw.println(mHaveFrame);
+ if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || mAttachedHidden) {
+ pw.print(prefix); pw.print("mPolicyVisibility=");
+ pw.print(mPolicyVisibility);
+ pw.print(" mPolicyVisibilityAfterAnim=");
+ pw.print(mPolicyVisibilityAfterAnim);
+ pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
+ }
+ pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
+ pw.print(" h="); pw.print(mRequestedHeight);
+ pw.print(" x="); pw.print(mReqXPos);
+ pw.print(" y="); pw.println(mReqYPos);
+ pw.print(prefix); pw.print("mGivenContentInsets=");
+ mGivenContentInsets.printShortString(pw);
+ pw.print(" mGivenVisibleInsets=");
+ mGivenVisibleInsets.printShortString(pw);
+ pw.println();
+ if (mTouchableInsets != 0 || mGivenInsetsPending) {
+ pw.print(prefix); pw.print("mTouchableInsets="); pw.print(mTouchableInsets);
+ pw.print(" mGivenInsetsPending="); pw.println(mGivenInsetsPending);
+ }
+ pw.print(prefix); pw.print("mShownFrame=");
+ mShownFrame.printShortString(pw);
+ pw.print(" last="); mLastShownFrame.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
+ pw.print(" last="); mLastFrame.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mContainingFrame=");
+ mContainingFrame.printShortString(pw);
+ pw.print(" mDisplayFrame=");
+ mDisplayFrame.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mContentFrame="); mContentFrame.printShortString(pw);
+ pw.print(" mVisibleFrame="); mVisibleFrame.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mContentInsets="); mContentInsets.printShortString(pw);
+ pw.print(" last="); mLastContentInsets.printShortString(pw);
+ pw.print(" mVisibleInsets="); mVisibleInsets.printShortString(pw);
+ pw.print(" last="); mLastVisibleInsets.printShortString(pw);
+ pw.println();
+ if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) {
+ pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha);
+ pw.print(" mAlpha="); pw.print(mAlpha);
+ pw.print(" mLastAlpha="); pw.println(mLastAlpha);
+ }
+ if (mAnimating || mLocalAnimating || mAnimationIsEntrance
+ || mAnimation != null) {
+ pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating);
+ pw.print(" mLocalAnimating="); pw.print(mLocalAnimating);
+ pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance);
+ pw.print(" mAnimation="); pw.println(mAnimation);
+ }
+ if (mHasTransformation || mHasLocalTransformation) {
+ pw.print(prefix); pw.print("XForm: has=");
+ pw.print(mHasTransformation);
+ pw.print(" hasLocal="); pw.print(mHasLocalTransformation);
+ pw.print(" "); mTransformation.printShortString(pw);
+ pw.println();
+ }
+ pw.print(prefix); pw.print("mDrawPending="); pw.print(mDrawPending);
+ pw.print(" mCommitDrawPending="); pw.print(mCommitDrawPending);
+ pw.print(" mReadyToShow="); pw.print(mReadyToShow);
+ pw.print(" mHasDrawn="); pw.println(mHasDrawn);
+ if (mExiting || mRemoveOnExit || mDestroying || mRemoved) {
+ pw.print(prefix); pw.print("mExiting="); pw.print(mExiting);
+ pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit);
+ pw.print(" mDestroying="); pw.print(mDestroying);
+ pw.print(" mRemoved="); pw.println(mRemoved);
+ }
+ if (mOrientationChanging || mAppFreezing) {
+ pw.print(prefix); pw.print("mOrientationChanging=");
+ pw.print(mOrientationChanging);
+ pw.print(" mAppFreezing="); pw.println(mAppFreezing);
+ }
}
@Override
@@ -6544,6 +6604,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
// not be removed when all windows are removed.
final boolean explicit;
+ // For printing.
+ String stringName;
+
// If this is an AppWindowToken, this is non-null.
AppWindowToken appWindowToken;
@@ -6566,18 +6629,23 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "token=" + token);
- pw.println(prefix + "windows=" + windows);
- pw.println(prefix + "windowType=" + windowType + " hidden=" + hidden
- + " hasVisible=" + hasVisible);
+ pw.print(prefix); pw.print("token="); pw.println(token);
+ pw.print(prefix); pw.print("windows="); pw.println(windows);
+ pw.print(prefix); pw.print("windowType="); pw.print(windowType);
+ pw.print(" hidden="); pw.print(hidden);
+ pw.print(" hasVisible="); pw.println(hasVisible);
}
@Override
public String toString() {
- return "WindowToken{"
- + Integer.toHexString(System.identityHashCode(this))
- + " token=" + token + "}";
+ if (stringName == null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("WindowToken{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" token="); sb.append(token); sb.append('}');
+ stringName = sb.toString();
+ }
+ return stringName;
}
};
@@ -6865,38 +6933,66 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
void dump(PrintWriter pw, String prefix) {
super.dump(pw, prefix);
- pw.println(prefix + "app=" + (appToken != null));
- pw.println(prefix + "allAppWindows=" + allAppWindows);
- pw.println(prefix + "groupId=" + groupId
- + " requestedOrientation=" + requestedOrientation);
- pw.println(prefix + "hiddenRequested=" + hiddenRequested
- + " clientHidden=" + clientHidden
- + " willBeHidden=" + willBeHidden
- + " reportedVisible=" + reportedVisible);
- pw.println(prefix + "paused=" + paused
- + " freezingScreen=" + freezingScreen);
- pw.println(prefix + "numInterestingWindows=" + numInterestingWindows
- + " numDrawnWindows=" + numDrawnWindows
- + " inPendingTransaction=" + inPendingTransaction
- + " allDrawn=" + allDrawn);
- pw.println(prefix + "animating=" + animating
- + " animation=" + animation);
- pw.println(prefix + "animLayerAdjustment=" + animLayerAdjustment
- + " transformation=" + transformation.toShortString());
- pw.println(prefix + "startingData=" + startingData
- + " removed=" + removed
- + " firstWindowDrawn=" + firstWindowDrawn);
- pw.println(prefix + "startingWindow=" + startingWindow
- + " startingView=" + startingView
- + " startingDisplayed=" + startingDisplayed
- + " startingMoved" + startingMoved);
+ if (appToken != null) {
+ pw.print(prefix); pw.println("app=true");
+ }
+ if (allAppWindows.size() > 0) {
+ pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows);
+ }
+ pw.print(prefix); pw.print("groupId="); pw.print(groupId);
+ pw.print(" requestedOrientation="); pw.println(requestedOrientation);
+ pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
+ pw.print(" clientHidden="); pw.print(clientHidden);
+ pw.print(" willBeHidden="); pw.print(willBeHidden);
+ pw.print(" reportedVisible="); pw.println(reportedVisible);
+ if (paused || freezingScreen) {
+ pw.print(prefix); pw.print("paused="); pw.print(paused);
+ pw.print(" freezingScreen="); pw.println(freezingScreen);
+ }
+ if (numInterestingWindows != 0 || numDrawnWindows != 0
+ || inPendingTransaction || allDrawn) {
+ pw.print(prefix); pw.print("numInterestingWindows=");
+ pw.print(numInterestingWindows);
+ pw.print(" numDrawnWindows="); pw.print(numDrawnWindows);
+ pw.print(" inPendingTransaction="); pw.print(inPendingTransaction);
+ pw.print(" allDrawn="); pw.println(allDrawn);
+ }
+ if (animating || animation != null) {
+ pw.print(prefix); pw.print("animating="); pw.print(animating);
+ pw.print(" animation="); pw.println(animation);
+ }
+ if (animLayerAdjustment != 0) {
+ pw.print(prefix); pw.print("animLayerAdjustment="); pw.println(animLayerAdjustment);
+ }
+ if (hasTransformation) {
+ pw.print(prefix); pw.print("hasTransformation="); pw.print(hasTransformation);
+ pw.print(" transformation="); transformation.printShortString(pw);
+ pw.println();
+ }
+ if (startingData != null || removed || firstWindowDrawn) {
+ pw.print(prefix); pw.print("startingData="); pw.print(startingData);
+ pw.print(" removed="); pw.print(removed);
+ pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
+ }
+ if (startingWindow != null || startingView != null
+ || startingDisplayed || startingMoved) {
+ pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow);
+ pw.print(" startingView="); pw.print(startingView);
+ pw.print(" startingDisplayed="); pw.print(startingDisplayed);
+ pw.print(" startingMoved"); pw.println(startingMoved);
+ }
}
@Override
public String toString() {
- return "AppWindowToken{"
- + Integer.toHexString(System.identityHashCode(this))
- + " token=" + token + "}";
+ if (stringName == null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("AppWindowToken{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" token="); sb.append(token); sb.append('}');
+ stringName = sb.toString();
+ }
+ return stringName;
}
}
@@ -8652,7 +8748,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println("Current Window Manager state:");
for (int i=mWindows.size()-1; i>=0; i--) {
WindowState w = (WindowState)mWindows.get(i);
- pw.println(" Window #" + i + ":");
+ pw.print(" Window #"); pw.print(i); pw.print(' ');
+ pw.print(w); pw.println(":");
w.dump(pw, " ");
}
if (mInputMethodDialogs.size() > 0) {
@@ -8660,7 +8757,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Input method dialogs:");
for (int i=mInputMethodDialogs.size()-1; i>=0; i--) {
WindowState w = mInputMethodDialogs.get(i);
- pw.println(" IM Dialog #" + i + ": " + w);
+ pw.print(" IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w);
}
}
if (mPendingRemove.size() > 0) {
@@ -8668,7 +8765,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Remove pending for:");
for (int i=mPendingRemove.size()-1; i>=0; i--) {
WindowState w = mPendingRemove.get(i);
- pw.println(" Remove #" + i + ":");
+ pw.print(" Remove #"); pw.print(i); pw.print(' ');
+ pw.print(w); pw.println(":");
w.dump(pw, " ");
}
}
@@ -8677,7 +8775,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Windows force removing:");
for (int i=mForceRemoves.size()-1; i>=0; i--) {
WindowState w = mForceRemoves.get(i);
- pw.println(" Removing #" + i + ":");
+ pw.print(" Removing #"); pw.print(i); pw.print(' ');
+ pw.print(w); pw.println(":");
w.dump(pw, " ");
}
}
@@ -8686,7 +8785,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Windows waiting to destroy their surface:");
for (int i=mDestroySurface.size()-1; i>=0; i--) {
WindowState w = mDestroySurface.get(i);
- pw.println(" Destroy #" + i + ":");
+ pw.print(" Destroy #"); pw.print(i); pw.print(' ');
+ pw.print(w); pw.println(":");
w.dump(pw, " ");
}
}
@@ -8695,7 +8795,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Windows losing focus:");
for (int i=mLosingFocus.size()-1; i>=0; i--) {
WindowState w = mLosingFocus.get(i);
- pw.println(" Losing #" + i + ":");
+ pw.print(" Losing #"); pw.print(i); pw.print(' ');
+ pw.print(w); pw.println(":");
w.dump(pw, " ");
}
}
@@ -8705,7 +8806,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
Iterator<Session> it = mSessions.iterator();
while (it.hasNext()) {
Session s = it.next();
- pw.println(" Session " + s);
+ pw.print(" Session "); pw.print(s); pw.println(':');
s.dump(pw, " ");
}
}
@@ -8715,7 +8816,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
Iterator<WindowToken> it = mTokenMap.values().iterator();
while (it.hasNext()) {
WindowToken token = it.next();
- pw.println(" Token " + token.token);
+ pw.print(" Token "); pw.print(token.token); pw.println(':');
token.dump(pw, " ");
}
}
@@ -8723,14 +8824,16 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" ");
pw.println(" Window token list:");
for (int i=0; i<mTokenList.size(); i++) {
- pw.println(" WindowToken #" + i + ": " + mTokenList.get(i));
+ pw.print(" #"); pw.print(i); pw.print(": ");
+ pw.println(mTokenList.get(i));
}
}
if (mAppTokens.size() > 0) {
pw.println(" ");
pw.println(" Application tokens in Z order:");
for (int i=mAppTokens.size()-1; i>=0; i--) {
- pw.println(" AppWindowToken #" + i + ": " + mAppTokens.get(i));
+ pw.print(" App #"); pw.print(i); pw.print(": ");
+ pw.println(mAppTokens.get(i));
}
}
if (mFinishedStarting.size() > 0) {
@@ -8738,7 +8841,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Finishing start of application tokens:");
for (int i=mFinishedStarting.size()-1; i>=0; i--) {
WindowToken token = mFinishedStarting.get(i);
- pw.println(" Finish Starting App Token #" + i + ":");
+ pw.print(" Finished Starting #"); pw.print(i);
+ pw.print(' '); pw.print(token); pw.println(':');
token.dump(pw, " ");
}
}
@@ -8747,7 +8851,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Exiting tokens:");
for (int i=mExitingTokens.size()-1; i>=0; i--) {
WindowToken token = mExitingTokens.get(i);
- pw.println(" Exiting Token #" + i + ":");
+ pw.print(" Exiting #"); pw.print(i);
+ pw.print(' '); pw.print(token); pw.println(':');
token.dump(pw, " ");
}
}
@@ -8756,54 +8861,59 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
pw.println(" Exiting application tokens:");
for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
WindowToken token = mExitingAppTokens.get(i);
- pw.println(" Exiting App Token #" + i + ":");
+ pw.print(" Exiting App #"); pw.print(i);
+ pw.print(' '); pw.print(token); pw.println(':');
token.dump(pw, " ");
}
}
pw.println(" ");
- pw.println(" mCurrentFocus=" + mCurrentFocus);
- pw.println(" mLastFocus=" + mLastFocus);
- pw.println(" mFocusedApp=" + mFocusedApp);
- pw.println(" mInputMethodTarget=" + mInputMethodTarget);
- pw.println(" mInputMethodWindow=" + mInputMethodWindow);
- pw.println(" mInTouchMode=" + mInTouchMode);
- pw.println(" mSystemBooted=" + mSystemBooted
- + " mDisplayEnabled=" + mDisplayEnabled);
- pw.println(" mLayoutNeeded=" + mLayoutNeeded
- + " mBlurShown=" + mBlurShown);
- pw.println(" mDimShown=" + mDimShown
- + " current=" + mDimCurrentAlpha
- + " target=" + mDimTargetAlpha
- + " delta=" + mDimDeltaPerMs
- + " lastAnimTime=" + mLastDimAnimTime);
- pw.println(" mInputMethodAnimLayerAdjustment="
- + mInputMethodAnimLayerAdjustment);
- pw.println(" mDisplayFrozen=" + mDisplayFrozen
- + " mWindowsFreezingScreen=" + mWindowsFreezingScreen
- + " mAppsFreezingScreen=" + mAppsFreezingScreen);
- pw.println(" mRotation=" + mRotation
- + ", mForcedAppOrientation=" + mForcedAppOrientation
- + ", mRequestedRotation=" + mRequestedRotation);
- pw.println(" mAnimationPending=" + mAnimationPending
- + " mWindowAnimationScale=" + mWindowAnimationScale
- + " mTransitionWindowAnimationScale=" + mTransitionAnimationScale);
- pw.println(" mNextAppTransition=0x"
- + Integer.toHexString(mNextAppTransition)
- + ", mAppTransitionReady=" + mAppTransitionReady
- + ", mAppTransitionTimeout=" + mAppTransitionTimeout);
- pw.println(" mStartingIconInTransition=" + mStartingIconInTransition
- + ", mSkipAppTransitionAnimation=" + mSkipAppTransitionAnimation);
- pw.println(" mOpeningApps=" + mOpeningApps);
- pw.println(" mClosingApps=" + mClosingApps);
- pw.println(" DisplayWidth=" + mDisplay.getWidth()
- + " DisplayHeight=" + mDisplay.getHeight());
+ pw.print(" mCurrentFocus="); pw.println(mCurrentFocus);
+ pw.print(" mLastFocus="); pw.println(mLastFocus);
+ pw.print(" mFocusedApp="); pw.println(mFocusedApp);
+ pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget);
+ pw.print(" mInputMethodWindow="); pw.println(mInputMethodWindow);
+ pw.print(" mInTouchMode="); pw.println(mInTouchMode);
+ pw.print(" mSystemBooted="); pw.print(mSystemBooted);
+ pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
+ pw.print(" mLayoutNeeded="); pw.print(mLayoutNeeded);
+ pw.print(" mBlurShown="); pw.println(mBlurShown);
+ pw.print(" mDimShown="); pw.print(mDimShown);
+ pw.print(" current="); pw.print(mDimCurrentAlpha);
+ pw.print(" target="); pw.print(mDimTargetAlpha);
+ pw.print(" delta="); pw.print(mDimDeltaPerMs);
+ pw.print(" lastAnimTime="); pw.println(mLastDimAnimTime);
+ pw.print(" mInputMethodAnimLayerAdjustment=");
+ pw.println(mInputMethodAnimLayerAdjustment);
+ pw.print(" mDisplayFrozen="); pw.print(mDisplayFrozen);
+ pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
+ pw.print(" mAppsFreezingScreen="); pw.println(mAppsFreezingScreen);
+ pw.print(" mRotation="); pw.print(mRotation);
+ pw.print(", mForcedAppOrientation="); pw.print(mForcedAppOrientation);
+ pw.print(", mRequestedRotation="); pw.println(mRequestedRotation);
+ pw.print(" mAnimationPending="); pw.print(mAnimationPending);
+ pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
+ pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
+ pw.print(" mNextAppTransition=0x");
+ pw.print(Integer.toHexString(mNextAppTransition));
+ pw.print(", mAppTransitionReady="); pw.print(mAppTransitionReady);
+ pw.print(", mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
+ pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition);
+ pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
+ if (mOpeningApps.size() > 0) {
+ pw.print(" mOpeningApps="); pw.println(mOpeningApps);
+ }
+ if (mClosingApps.size() > 0) {
+ pw.print(" mClosingApps="); pw.println(mClosingApps);
+ }
+ pw.print(" DisplayWidth="); pw.print(mDisplay.getWidth());
+ pw.print(" DisplayHeight="); pw.println(mDisplay.getHeight());
pw.println(" KeyWaiter state:");
- pw.println(" mLastWin=" + mKeyWaiter.mLastWin
- + " mLastBinder=" + mKeyWaiter.mLastBinder);
- pw.println(" mFinished=" + mKeyWaiter.mFinished
- + " mGotFirstWindow=" + mKeyWaiter.mGotFirstWindow
- + " mEventDispatching=" + mKeyWaiter.mEventDispatching
- + " mTimeToSwitch=" + mKeyWaiter.mTimeToSwitch);
+ pw.print(" mLastWin="); pw.print(mKeyWaiter.mLastWin);
+ pw.print(" mLastBinder="); pw.println(mKeyWaiter.mLastBinder);
+ pw.print(" mFinished="); pw.print(mKeyWaiter.mFinished);
+ pw.print(" mGotFirstWindow="); pw.print(mKeyWaiter.mGotFirstWindow);
+ pw.print(" mEventDispatching="); pw.print(mKeyWaiter.mEventDispatching);
+ pw.print(" mTimeToSwitch="); pw.println(mKeyWaiter.mTimeToSwitch);
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index a3c23d3..b04f5a8 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -7890,24 +7890,24 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
return;
}
pw.println("Activities in Current Activity Manager State:");
- dumpHistoryList(pw, mHistory, " ", "History", true);
+ dumpHistoryList(pw, mHistory, " ", "Hist", true);
pw.println(" ");
pw.println(" Running activities (most recent first):");
- dumpHistoryList(pw, mLRUActivities, " ", "Running", false);
+ dumpHistoryList(pw, mLRUActivities, " ", "Run", false);
if (mWaitingVisibleActivities.size() > 0) {
pw.println(" ");
pw.println(" Activities waiting for another to become visible:");
- dumpHistoryList(pw, mWaitingVisibleActivities, " ", "Waiting", false);
+ dumpHistoryList(pw, mWaitingVisibleActivities, " ", "Wait", false);
}
if (mStoppingActivities.size() > 0) {
pw.println(" ");
pw.println(" Activities waiting to stop:");
- dumpHistoryList(pw, mStoppingActivities, " ", "Stopping", false);
+ dumpHistoryList(pw, mStoppingActivities, " ", "Stop", false);
}
if (mFinishingActivities.size() > 0) {
pw.println(" ");
pw.println(" Activities waiting to finish:");
- dumpHistoryList(pw, mFinishingActivities, " ", "Finishing", false);
+ dumpHistoryList(pw, mFinishingActivities, " ", "Fin", false);
}
pw.println(" ");
@@ -7922,7 +7922,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
final int N = mRecentTasks.size();
for (int i=0; i<N; i++) {
- pw.println(" Recent Task #" + i);
+ TaskRecord tr = mRecentTasks.get(i);
+ pw.print(" * Recent #"); pw.print(i); pw.print(": ");
+ pw.println(tr);
mRecentTasks.get(i).dump(pw, " ");
}
}
@@ -7944,8 +7946,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
}
ProcessRecord r = procs.valueAt(ia);
- pw.print(r.persistent ? " *PERSISTENT* Process [" : " Process [");
- pw.print(r.processName); pw.print("] UID "); pw.println(procs.keyAt(ia));
+ pw.print(r.persistent ? " *PERS*" : " *APP*");
+ pw.print(" UID "); pw.print(procs.keyAt(ia));
+ pw.print(" "); pw.println(r);
r.dump(pw, " ");
if (r.persistent) {
numPers++;
@@ -7958,7 +7961,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Running processes (most recent first):");
dumpProcessList(pw, mLRUProcesses, " ",
- "Running Norm Proc", "Running PERS Proc", true);
+ "App ", "PERS", true);
needSep = true;
}
@@ -7968,8 +7971,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" PID mappings:");
for (int i=0; i<mPidsSelfLocked.size(); i++) {
- pw.println(" PID #" + mPidsSelfLocked.keyAt(i)
- + ": " + mPidsSelfLocked.valueAt(i));
+ pw.print(" PID #"); pw.print(mPidsSelfLocked.keyAt(i));
+ pw.print(": "); pw.println(mPidsSelfLocked.valueAt(i));
}
}
}
@@ -7979,8 +7982,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Foreground Processes:");
for (int i=0; i<mForegroundProcesses.size(); i++) {
- pw.println(" PID #" + mForegroundProcesses.keyAt(i)
- + ": " + mForegroundProcesses.valueAt(i));
+ pw.print(" PID #"); pw.print(mForegroundProcesses.keyAt(i));
+ pw.print(": "); pw.println(mForegroundProcesses.valueAt(i));
}
}
@@ -7989,7 +7992,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Persisent processes that are starting:");
dumpProcessList(pw, mPersistentStartingProcesses, " ",
- "Starting Initial Proc", "Restarting PERS Proc", false);
+ "Starting Norm", "Restarting PERS", false);
}
if (mStartingProcesses.size() > 0) {
@@ -7997,7 +8000,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Processes that are starting:");
dumpProcessList(pw, mStartingProcesses, " ",
- "Starting Norm Proc", "Starting PERS Proc", false);
+ "Starting Norm", "Starting PERS", false);
}
if (mRemovedProcesses.size() > 0) {
@@ -8005,7 +8008,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Processes that are being removed:");
dumpProcessList(pw, mRemovedProcesses, " ",
- "Removed Norm Proc", "Removed PERS Proc", false);
+ "Removed Norm", "Removed PERS", false);
}
if (mProcessesOnHold.size() > 0) {
@@ -8013,7 +8016,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
needSep = true;
pw.println(" Processes that are on old until the system is ready:");
dumpProcessList(pw, mProcessesOnHold, " ",
- "OnHold Norm Proc", "OnHold PERS Proc", false);
+ "OnHold Norm", "OnHold PERS", false);
}
if (mProcessCrashTimes.getMap().size() > 0) {
@@ -8026,10 +8029,11 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
SparseArray<Long> uids = procs.getValue();
final int N = uids.size();
for (int i=0; i<N; i++) {
- pw.println(" Process " + procs.getKey()
- + " uid " + uids.keyAt(i)
- + ": last crashed "
- + (now-uids.valueAt(i)) + " ms ago");
+ pw.print(" Process "); pw.print(procs.getKey());
+ pw.print(" uid "); pw.print(uids.keyAt(i));
+ pw.print(": last crashed ");
+ pw.print((now-uids.valueAt(i)));
+ pw.println(" ms ago");
}
}
}
@@ -8043,9 +8047,10 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
SparseArray<Long> uids = procs.getValue();
final int N = uids.size();
for (int i=0; i<N; i++) {
- pw.println(" Bad process " + procs.getKey()
- + " uid " + uids.keyAt(i)
- + ": crashed at time " + uids.valueAt(i));
+ pw.print(" Bad process "); pw.print(procs.getKey());
+ pw.print(" uid "); pw.print(uids.keyAt(i));
+ pw.print(": crashed at time ");
+ pw.println(uids.valueAt(i));
}
}
}
@@ -8144,14 +8149,14 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
Iterator it = mRegisteredReceivers.values().iterator();
while (it.hasNext()) {
ReceiverList r = (ReceiverList)it.next();
- pw.println(" Receiver " + r.receiver);
+ pw.print(" * "); pw.println(r);
r.dump(pw, " ");
}
}
pw.println(" ");
pw.println("Receiver Resolver Table:");
- mReceiverResolver.dump(new PrintWriterPrinter(pw), " ");
+ mReceiverResolver.dump(pw, " ");
if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
|| mPendingBroadcast != null) {
@@ -8185,13 +8190,23 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
if (mStickyBroadcasts != null) {
pw.println(" ");
pw.println(" Sticky broadcasts:");
+ StringBuilder sb = new StringBuilder(128);
for (Map.Entry<String, ArrayList<Intent>> ent
: mStickyBroadcasts.entrySet()) {
- pw.println(" Sticky action " + ent.getKey() + ":");
+ pw.print(" * Sticky action "); pw.print(ent.getKey());
+ pw.println(":");
ArrayList<Intent> intents = ent.getValue();
final int N = intents.size();
for (int i=0; i<N; i++) {
- pw.println(" " + intents.get(i));
+ sb.setLength(0);
+ sb.append(" Intent: ");
+ intents.get(i).toShortString(sb, true, false);
+ pw.println(sb.toString());
+ Bundle bundle = intents.get(i).getExtras();
+ if (bundle != null) {
+ pw.print(" ");
+ pw.println(bundle.toString());
+ }
}
}
}
@@ -8222,7 +8237,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
Iterator<ServiceRecord> it = mServices.values().iterator();
while (it.hasNext()) {
ServiceRecord r = it.next();
- pw.println(" Service " + r.shortName);
+ pw.print(" * "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
@@ -8233,7 +8248,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
pw.println(" Pending services:");
for (int i=0; i<mPendingServices.size(); i++) {
ServiceRecord r = mPendingServices.get(i);
- pw.println(" Pending Service " + r.shortName);
+ pw.print(" * Pending "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
@@ -8244,7 +8259,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
pw.println(" Restarting services:");
for (int i=0; i<mRestartingServices.size(); i++) {
ServiceRecord r = mRestartingServices.get(i);
- pw.println(" Restarting Service " + r.shortName);
+ pw.print(" * Restarting "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
@@ -8255,7 +8270,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
pw.println(" Stopping services:");
for (int i=0; i<mStoppingServices.size(); i++) {
ServiceRecord r = mStoppingServices.get(i);
- pw.println(" Stopping Service " + r.shortName);
+ pw.print(" * Stopping "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
@@ -8268,8 +8283,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
= mServiceConnections.values().iterator();
while (it.hasNext()) {
ConnectionRecord r = it.next();
- pw.println(" " + r.binding.service.shortName
- + " -> " + r.conn.asBinder());
+ pw.print(" * "); pw.println(r);
r.dump(pw, " ");
}
}
@@ -8292,27 +8306,28 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
boolean needSep = false;
- if (mProvidersByName.size() > 0) {
- pw.println(" Published content providers (by name):");
- Iterator it = mProvidersByName.entrySet().iterator();
+ if (mProvidersByClass.size() > 0) {
+ if (needSep) pw.println(" ");
+ pw.println(" Published content providers (by class):");
+ Iterator it = mProvidersByClass.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
ContentProviderRecord r = (ContentProviderRecord)e.getValue();
- pw.println(" Provider " + (String)e.getKey());
+ pw.print(" * "); pw.println(r);
r.dump(pw, " ");
}
needSep = true;
}
- if (mProvidersByClass.size() > 0) {
- if (needSep) pw.println(" ");
- pw.println(" Published content providers (by class):");
- Iterator it = mProvidersByClass.entrySet().iterator();
+ if (mProvidersByName.size() > 0) {
+ pw.println(" ");
+ pw.println(" Authority to provider mappings:");
+ Iterator it = mProvidersByName.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
ContentProviderRecord r = (ContentProviderRecord)e.getValue();
- pw.println(" Provider " + (String)e.getKey());
- r.dump(pw, " ");
+ pw.print(" "); pw.print(e.getKey()); pw.print(": ");
+ pw.println(r);
}
needSep = true;
}
@@ -8321,21 +8336,25 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
if (needSep) pw.println(" ");
pw.println(" Launching content providers:");
for (int i=mLaunchingProviders.size()-1; i>=0; i--) {
- pw.println(" Provider #" + i + ":");
- ((ContentProviderRecord)mLaunchingProviders.get(i)).dump(pw, " ");
+ pw.print(" Launching #"); pw.print(i); pw.print(": ");
+ pw.println(mLaunchingProviders.get(i));
}
needSep = true;
}
- pw.println();
- pw.println("Granted Uri Permissions:");
- for (int i=0; i<mGrantedUriPermissions.size(); i++) {
- int uid = mGrantedUriPermissions.keyAt(i);
- HashMap<Uri, UriPermission> perms
- = mGrantedUriPermissions.valueAt(i);
- pw.println(" Uris granted to uid " + uid + ":");
- for (UriPermission perm : perms.values()) {
- perm.dump(pw, " ");
+ if (mGrantedUriPermissions.size() > 0) {
+ pw.println();
+ pw.println("Granted Uri Permissions:");
+ for (int i=0; i<mGrantedUriPermissions.size(); i++) {
+ int uid = mGrantedUriPermissions.keyAt(i);
+ HashMap<Uri, UriPermission> perms
+ = mGrantedUriPermissions.valueAt(i);
+ pw.print(" * UID "); pw.print(uid);
+ pw.println(" holds:");
+ for (UriPermission perm : perms.values()) {
+ pw.print(" "); pw.println(perm);
+ perm.dump(pw, " ");
+ }
}
}
}
@@ -8353,7 +8372,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
return;
}
- pw.println("Intent Senders in Current Activity Manager State:");
+ pw.println("Pending Intents in Current Activity Manager State:");
if (this.mIntentSenderRecords.size() > 0) {
Iterator<WeakReference<PendingIntentRecord>> it
@@ -8362,10 +8381,10 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
WeakReference<PendingIntentRecord> ref = it.next();
PendingIntentRecord rec = ref != null ? ref.get(): null;
if (rec != null) {
- pw.println(" IntentSender " + rec);
+ pw.print(" * "); pw.println(rec);
rec.dump(pw, " ");
} else {
- pw.println(" IntentSender " + ref);
+ pw.print(" * "); pw.print(ref);
}
}
}
@@ -8377,24 +8396,21 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
TaskRecord lastTask = null;
for (int i=list.size()-1; i>=0; i--) {
HistoryRecord r = (HistoryRecord)list.get(i);
+ final boolean full = complete || !r.inHistory;
if (lastTask != r.task) {
lastTask = r.task;
- if (complete || !r.inHistory) {
+ pw.print(prefix);
+ pw.print(full ? "* " : " ");
+ pw.println(lastTask);
+ if (full) {
lastTask.dump(pw, prefix + " ");
- } else {
- pw.print(prefix);
- pw.print(" ");
- pw.println(lastTask);
}
}
- if (complete || !r.inHistory) {
- pw.print(prefix); pw.print(" "); pw.print(label);
- pw.print(" #"); pw.print(i); pw.println(":");
+ pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label);
+ pw.print(" #"); pw.print(i); pw.print(": ");
+ pw.println(r);
+ if (full) {
r.dump(pw, prefix + " ");
- } else {
- pw.print(prefix); pw.print(" "); pw.print(label);
- pw.print(" #"); pw.print(i); pw.print(": ");
- pw.println(r);
}
}
}
diff --git a/services/java/com/android/server/am/AppBindRecord.java b/services/java/com/android/server/am/AppBindRecord.java
index ce6f6dc..9c57360 100644
--- a/services/java/com/android/server/am/AppBindRecord.java
+++ b/services/java/com/android/server/am/AppBindRecord.java
@@ -32,9 +32,12 @@ class AppBindRecord {
// All ConnectionRecord for this client.
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
pw.println(prefix + "service=" + service);
pw.println(prefix + "client=" + client);
+ dumpInIntentBind(pw, prefix);
+ }
+
+ void dumpInIntentBind(PrintWriter pw, String prefix) {
if (connections.size() > 0) {
pw.println(prefix + "Per-process Connections:");
Iterator<ConnectionRecord> it = connections.iterator();
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index e265f43..ddc3e68 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -302,7 +302,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
}
}
if (isCheckin) mStats.dumpCheckinLocked(pw, args);
- else mStats.dumpLocked(new PrintWriterPrinter(pw));
+ else mStats.dumpLocked(pw);
}
}
}
diff --git a/services/java/com/android/server/am/BroadcastFilter.java b/services/java/com/android/server/am/BroadcastFilter.java
index cd7f720..0eeb393 100644
--- a/services/java/com/android/server/am/BroadcastFilter.java
+++ b/services/java/com/android/server/am/BroadcastFilter.java
@@ -18,6 +18,7 @@ package com.android.server.am;
import android.content.IntentFilter;
import android.util.PrintWriterPrinter;
+import android.util.Printer;
import java.io.PrintWriter;
@@ -33,19 +34,25 @@ class BroadcastFilter extends IntentFilter {
requiredPermission = _requiredPermission;
}
- public void dumpLocal(PrintWriter pw, String prefix) {
- super.dump(new PrintWriterPrinter(pw), prefix);
- }
-
public void dump(PrintWriter pw, String prefix) {
- dumpLocal(pw, prefix);
- pw.println(prefix + "requiredPermission=" + requiredPermission);
+ dumpInReceiverList(pw, new PrintWriterPrinter(pw), prefix);
receiverList.dumpLocal(pw, prefix);
}
+ public void dumpInReceiverList(PrintWriter pw, Printer pr, String prefix) {
+ super.dump(pr, prefix);
+ if (requiredPermission != null) {
+ pw.print(prefix); pw.print("requiredPermission="); pw.println(requiredPermission);
+ }
+ }
+
public String toString() {
- return "BroadcastFilter{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + receiverList + "}";
+ StringBuilder sb = new StringBuilder();
+ sb.append("BroadcastFilter{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ sb.append(receiverList);
+ sb.append('}');
+ return sb.toString();
}
}
diff --git a/services/java/com/android/server/am/ConnectionRecord.java b/services/java/com/android/server/am/ConnectionRecord.java
index b4c7df1..b3343dd 100644
--- a/services/java/com/android/server/am/ConnectionRecord.java
+++ b/services/java/com/android/server/am/ConnectionRecord.java
@@ -31,9 +31,10 @@ class ConnectionRecord {
String stringName; // Caching of toString.
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
pw.println(prefix + "binding=" + binding);
- pw.println(prefix + "activity=" + activity);
+ if (activity != null) {
+ pw.println(prefix + "activity=" + activity);
+ }
pw.println(prefix + "conn=" + conn.asBinder()
+ " flags=0x" + Integer.toHexString(flags));
}
diff --git a/services/java/com/android/server/am/ContentProviderRecord.java b/services/java/com/android/server/am/ContentProviderRecord.java
index 2b9e006..c764635 100644
--- a/services/java/com/android/server/am/ContentProviderRecord.java
+++ b/services/java/com/android/server/am/ContentProviderRecord.java
@@ -54,19 +54,27 @@ class ContentProviderRecord extends ContentProviderHolder {
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "package=" + info.applicationInfo.packageName
- + " process=" + info.processName);
- pw.println(prefix + "app=" + app);
- pw.println(prefix + "launchingApp=" + launchingApp);
- pw.println(prefix + "provider=" + provider);
- pw.println(prefix + "name=" + info.authority);
- pw.println(prefix + "isSyncable=" + info.isSyncable);
- pw.println(prefix + "multiprocess=" + info.multiprocess
- + " initOrder=" + info.initOrder
- + " uid=" + uid);
- pw.println(prefix + "clients=" + clients);
- pw.println(prefix + "externals=" + externals);
+ pw.print(prefix); pw.print("package=");
+ pw.print(info.applicationInfo.packageName);
+ pw.print("process="); pw.println(info.processName);
+ pw.print(prefix); pw.print("app="); pw.println(app);
+ if (launchingApp != null) {
+ pw.print(prefix); pw.print("launchingApp="); pw.println(launchingApp);
+ }
+ pw.print(prefix); pw.print("uid="); pw.print(uid);
+ pw.print(" provider="); pw.println(provider);
+ pw.print(prefix); pw.print("name="); pw.println(info.authority);
+ if (info.isSyncable || info.multiprocess || info.initOrder != 0) {
+ pw.print(prefix); pw.print("isSyncable="); pw.print(info.isSyncable);
+ pw.print("multiprocess="); pw.print(info.multiprocess);
+ pw.print(" initOrder="); pw.println(info.initOrder);
+ }
+ if (clients.size() > 0) {
+ pw.print(prefix); pw.print("clients="); pw.println(clients);
+ }
+ if (externals != 0) {
+ pw.print(prefix); pw.print("externals="); pw.println(externals);
+ }
}
public String toString() {
diff --git a/services/java/com/android/server/am/HistoryRecord.java b/services/java/com/android/server/am/HistoryRecord.java
index a2fd62b..1488791 100644
--- a/services/java/com/android/server/am/HistoryRecord.java
+++ b/services/java/com/android/server/am/HistoryRecord.java
@@ -103,7 +103,6 @@ class HistoryRecord extends IApplicationToken.Stub {
String stringName; // for caching of toString().
void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.println(this);
pw.print(prefix); pw.print("packageName="); pw.print(packageName);
pw.print(" processName="); pw.println(processName);
pw.print(prefix); pw.print("launchedFromUid="); pw.print(launchedFromUid);
@@ -112,9 +111,10 @@ class HistoryRecord extends IApplicationToken.Stub {
pw.print(prefix); pw.print("frontOfTask="); pw.print(frontOfTask);
pw.print(" task="); pw.println(task);
pw.print(prefix); pw.print("taskAffinity="); pw.println(taskAffinity);
- pw.print(prefix); pw.print("realActivity="); pw.println(realActivity);
- pw.print(prefix); pw.print("dir="); pw.print(baseDir);
- pw.print(" res="); pw.print(resDir);
+ pw.print(prefix); pw.print("realActivity=");
+ pw.println(realActivity.flattenToShortString());
+ pw.print(prefix); pw.print("base="); pw.print(baseDir);
+ if (!resDir.equals(baseDir)) pw.print(" res="); pw.print(resDir);
pw.print(" data="); pw.println(dataDir);
pw.print(prefix); pw.print("labelRes=0x");
pw.print(Integer.toHexString(labelRes));
@@ -504,7 +504,7 @@ class HistoryRecord extends IApplicationToken.Stub {
sb.append("HistoryRecord{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(' ');
- sb.append(intent.getComponent().toShortString());
+ sb.append(intent.getComponent().flattenToShortString());
sb.append('}');
return stringName = sb.toString();
}
diff --git a/services/java/com/android/server/am/IntentBindRecord.java b/services/java/com/android/server/am/IntentBindRecord.java
index 24c3943..3a5ca66 100644
--- a/services/java/com/android/server/am/IntentBindRecord.java
+++ b/services/java/com/android/server/am/IntentBindRecord.java
@@ -45,22 +45,30 @@ class IntentBindRecord {
/** Set when the service's onUnbind() has asked to be told about new clients. */
boolean doRebind;
+ String stringName; // caching of toString
+
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "service=" + service);
- pw.println(prefix + "intent=" + intent.getIntent());
- pw.println(prefix + "binder=" + binder
- + " requested=" + requested
- + " received=" + received
- + " hasBound=" + hasBound
- + " doRebind=" + doRebind);
+ pw.print(prefix); pw.print("service="); pw.println(service);
+ dumpInService(pw, prefix);
+ }
+
+ void dumpInService(PrintWriter pw, String prefix) {
+ pw.print(prefix); pw.print("intent={");
+ pw.print(intent.getIntent().toShortString(true, false));
+ pw.println('}');
+ pw.print(prefix); pw.print("binder="); pw.println(binder);
+ pw.print(prefix); pw.print("requested="); pw.print(requested);
+ pw.print(" received="); pw.print(received);
+ pw.print(" hasBound="); pw.print(hasBound);
+ pw.print(" doRebind="); pw.println(doRebind);
if (apps.size() > 0) {
- pw.println(prefix + "Application Bindings:");
Iterator<AppBindRecord> it = apps.values().iterator();
while (it.hasNext()) {
AppBindRecord a = it.next();
- pw.println(prefix + "Client " + a.client);
- a.dump(pw, prefix + " ");
+ pw.print(prefix); pw.print("* Client AppBindRecord{");
+ pw.print(Integer.toHexString(System.identityHashCode(a)));
+ pw.print(' '); pw.print(a.client); pw.println('}');
+ a.dumpInIntentBind(pw, prefix + " ");
}
}
}
@@ -71,9 +79,19 @@ class IntentBindRecord {
}
public String toString() {
- return "IntentBindRecord{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + service.name.toShortString()
- + ":" + intent + "}";
+ if (stringName != null) {
+ return stringName;
+ }
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("IntentBindRecord{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ sb.append(service.shortName);
+ sb.append(':');
+ if (intent != null) {
+ intent.getIntent().toShortString(sb, false, false);
+ }
+ sb.append('}');
+ return stringName = sb.toString();
}
}
diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java
index b18aaf7..4381392 100644
--- a/services/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/java/com/android/server/am/PendingIntentRecord.java
@@ -36,6 +36,8 @@ class PendingIntentRecord extends IIntentSender.Stub {
boolean sent = false;
boolean canceled = false;
+ String stringName;
+
final static class Key {
final int type;
final String packageName;
@@ -142,7 +144,7 @@ class PendingIntentRecord extends IIntentSender.Stub {
public String toString() {
return "Key{" + typeName() + " pkg=" + packageName
- + " intent=" + requestIntent + " flags=0x"
+ + " intent=" + requestIntent.toShortString(true, false) + " flags=0x"
+ Integer.toHexString(flags) + "}";
}
@@ -260,19 +262,38 @@ class PendingIntentRecord extends IIntentSender.Stub {
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + "packageName=" + key.packageName
- + " type=" + key.typeName()
- + " flags=0x" + Integer.toHexString(key.flags));
- pw.println(prefix + "activity=" + key.activity + " who=" + key.who);
- pw.println(prefix + "requestCode=" + key.requestCode
- + " requestResolvedType=" + key.requestResolvedType);
- pw.println(prefix + "requestIntent=" + key.requestIntent);
- pw.println(prefix + "sent=" + sent + " canceled=" + canceled);
+ pw.print(prefix); pw.print("uid="); pw.print(uid);
+ pw.print(" packageName="); pw.print(key.packageName);
+ pw.print(" type="); pw.print(key.typeName());
+ pw.print(" flags=0x"); pw.println(Integer.toHexString(key.flags));
+ if (key.activity != null || key.who != null) {
+ pw.print(prefix); pw.print("activity="); pw.print(key.activity);
+ pw.print(" who="); pw.println(key.who);
+ }
+ if (key.requestCode != 0 || key.requestResolvedType != null) {
+ pw.print(prefix); pw.print("requestCode="); pw.print(key.requestCode);
+ pw.print(" requestResolvedType="); pw.println(key.requestResolvedType);
+ }
+ pw.print(prefix); pw.print("requestIntent=");
+ pw.println(key.requestIntent.toShortString(true, true));
+ if (sent || canceled) {
+ pw.print(prefix); pw.print("sent="); pw.print(sent);
+ pw.print(" canceled="); pw.println(canceled);
+ }
}
public String toString() {
- return "IntentSenderRecord{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + key.packageName + " " + key.typeName() + "}";
+ if (stringName != null) {
+ return stringName;
+ }
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("PendingIntentRecord{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ sb.append(key.packageName);
+ sb.append(' ');
+ sb.append(key.typeName());
+ sb.append('}');
+ return stringName = sb.toString();
}
}
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index d2667e7..b76547a 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -106,7 +106,6 @@ class ProcessRecord implements Watchdog.PssRequestor {
ActivityManager.ProcessErrorStateInfo notRespondingReport;
void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.println(this);
if (info.className != null) {
pw.print(prefix); pw.print("class="); pw.println(info.className);
}
diff --git a/services/java/com/android/server/am/ReceiverList.java b/services/java/com/android/server/am/ReceiverList.java
index b8bf30c..0facefc 100644
--- a/services/java/com/android/server/am/ReceiverList.java
+++ b/services/java/com/android/server/am/ReceiverList.java
@@ -18,9 +18,12 @@ package com.android.server.am;
import android.app.IIntentReceiver;
import android.content.Intent;
+import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.util.PrintWriterPrinter;
+import android.util.Printer;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -64,22 +67,26 @@ class ReceiverList extends ArrayList<BroadcastFilter>
}
void dumpLocal(PrintWriter pw, String prefix) {
- pw.println(prefix + "receiver=IBinder "
- + Integer.toHexString(System.identityHashCode(receiver.asBinder())));
- pw.println(prefix + "app=" + app + " pid=" + pid + " uid=" + uid);
- pw.println(prefix + "curBroadcast=" + curBroadcast
- + " linkedToDeath=" + linkedToDeath);
+ pw.print(prefix); pw.print("app="); pw.print(app);
+ pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.println(uid);
+ if (curBroadcast != null || linkedToDeath) {
+ pw.print(prefix); pw.print("curBroadcast="); pw.print(curBroadcast);
+ pw.print(" linkedToDeath="); pw.println(linkedToDeath);
+ }
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
+ Printer pr = new PrintWriterPrinter(pw);
dumpLocal(pw, prefix);
String p2 = prefix + " ";
final int N = size();
for (int i=0; i<N; i++) {
BroadcastFilter bf = get(i);
- pw.println(prefix + "Filter #" + i + ": " + bf);
- bf.dump(pw, p2);
+ pw.print(prefix); pw.print("Filter #"); pw.print(i);
+ pw.print(": BroadcastFilter{");
+ pw.print(Integer.toHexString(System.identityHashCode(bf)));
+ pw.println('}');
+ bf.dumpInReceiverList(pw, pr, p2);
}
}
@@ -96,7 +103,7 @@ class ReceiverList extends ArrayList<BroadcastFilter>
sb.append((app != null ? app.processName : "(unknown name)"));
sb.append('/');
sb.append(uid);
- sb.append(" client ");
+ sb.append((receiver.asBinder() instanceof Binder) ? " local:" : " remote:");
sb.append(Integer.toHexString(System.identityHashCode(receiver.asBinder())));
sb.append('}');
return stringName = sb.toString();
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index a8fc761..fc93b69 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -80,40 +80,46 @@ class ServiceRecord extends Binder {
String stringName; // caching of toString
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "intent=" + intent.getIntent());
- pw.println(prefix + "packageName=" + packageName);
- pw.println(prefix + "processName=" + processName);
- pw.println(prefix + "permission=" + permission);
- pw.println(prefix + "baseDir=" + baseDir+ " resDir=" + resDir + " dataDir=" + dataDir);
- pw.println(prefix + "app=" + app);
- pw.println(prefix + "isForeground=" + isForeground
- + " lastActivity=" + lastActivity);
- pw.println(prefix + "startRequested=" + startRequested
- + " startId=" + lastStartId
- + " executeNesting=" + executeNesting
- + " executingStart=" + executingStart
- + " crashCount=" + crashCount);
- pw.println(prefix + "totalRestartCount=" + totalRestartCount
- + " restartCount=" + restartCount
- + " restartDelay=" + restartDelay
- + " restartTime=" + restartTime
- + " nextRestartTime=" + nextRestartTime);
+ pw.print(prefix); pw.print("intent={");
+ pw.print(intent.getIntent().toShortString(true, false));
+ pw.println('}');
+ pw.print(prefix); pw.print("packageName="); pw.println(packageName);
+ pw.print(prefix); pw.print("processName="); pw.println(processName);
+ if (permission != null) {
+ pw.print(prefix); pw.print("permission="); pw.println(permission);
+ }
+ 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(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(" 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);
if (bindings.size() > 0) {
- pw.println(prefix + "Bindings:");
Iterator<IntentBindRecord> it = bindings.values().iterator();
while (it.hasNext()) {
IntentBindRecord b = it.next();
- pw.println(prefix + "Binding " + b);
- b.dump(pw, prefix + " ");
+ pw.print(prefix); pw.print("* IntentBindRecord{");
+ pw.print(Integer.toHexString(System.identityHashCode(b)));
+ pw.println("}:");
+ b.dumpInService(pw, prefix + " ");
}
}
if (connections.size() > 0) {
- pw.println(prefix + "All Connections:");
+ pw.print(prefix); pw.println("All Connections:");
Iterator<ConnectionRecord> it = connections.values().iterator();
while (it.hasNext()) {
ConnectionRecord c = it.next();
- pw.println(prefix + " " + c);
+ pw.print(prefix); pw.print(" "); pw.println(c);
}
}
}
@@ -165,11 +171,9 @@ class ServiceRecord extends Binder {
return stringName;
}
StringBuilder sb = new StringBuilder(128);
- sb.append("ServiceRecord{");
- sb.append(Integer.toHexString(System.identityHashCode(this)));
- sb.append(' ');
- sb.append(shortName);
- sb.append('}');
+ sb.append("ServiceRecord{")
+ .append(Integer.toHexString(System.identityHashCode(this)))
+ .append(' ').append(shortName).append('}');
return stringName = sb.toString();
}
}
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index aab3736..bcb8f54 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -36,6 +36,8 @@ class TaskRecord {
boolean rootWasReset; // True if the intent at the root of the task had
// the FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flag.
+ String stringName; // caching of toString() result.
+
TaskRecord(int _taskId, ActivityInfo info, Intent _intent,
boolean _clearOnBackground) {
taskId = _taskId;
@@ -53,6 +55,8 @@ class TaskRecord {
}
void setIntent(Intent _intent, ActivityInfo info) {
+ stringName = null;
+
if (info.targetActivity == null) {
intent = _intent;
realActivity = _intent != null ? _intent.getComponent() : null;
@@ -82,23 +86,63 @@ class TaskRecord {
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + "clearOnBackground=" + clearOnBackground
- + " numActivities=" + numActivities
- + " rootWasReset=" + rootWasReset);
- pw.println(prefix + "affinity=" + affinity);
- pw.println(prefix + "intent=" + intent);
- pw.println(prefix + "affinityIntent=" + affinityIntent);
- pw.println(prefix + "origActivity=" + origActivity);
- pw.println(prefix + "lastActiveTime=" + lastActiveTime
- +" (inactive for " + (getInactiveDuration()/1000) + "s)");
+ if (clearOnBackground || numActivities != 0 || rootWasReset) {
+ pw.print(prefix); pw.print("clearOnBackground="); pw.print(clearOnBackground);
+ pw.print(" numActivities="); pw.print(numActivities);
+ pw.print(" rootWasReset="); pw.println(rootWasReset);
+ }
+ if (affinity != null) {
+ pw.print(prefix); pw.print("affinity="); pw.println(affinity);
+ }
+ if (intent != null) {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append(prefix); sb.append("intent={");
+ intent.toShortString(sb, true, false);
+ sb.append('}');
+ pw.println(sb.toString());
+ }
+ if (affinityIntent != null) {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append(prefix); sb.append("affinityIntent={");
+ affinityIntent.toShortString(sb, true, false);
+ sb.append('}');
+ pw.println(sb.toString());
+ }
+ if (origActivity != null) {
+ pw.print(prefix); pw.print("origActivity=");
+ pw.println(origActivity.flattenToShortString());
+ }
+ if (realActivity != null) {
+ pw.print(prefix); pw.print("realActivity=");
+ pw.println(realActivity.flattenToShortString());
+ }
+ pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime);
+ pw.print(" (inactive for ");
+ pw.print((getInactiveDuration()/1000)); pw.println("s)");
}
public String toString() {
- return "Task{" + taskId + " "
- + (affinity != null ? affinity
- : (intent != null ? intent.getComponent().flattenToShortString()
- : affinityIntent != null ? affinityIntent.getComponent().flattenToShortString() : "??"))
- + "}";
+ if (stringName != null) {
+ return stringName;
+ }
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("TaskRecord{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" #");
+ sb.append(taskId);
+ if (affinity != null) {
+ sb.append(" A ");
+ sb.append(affinity);
+ } else if (intent != null) {
+ sb.append(" I ");
+ sb.append(intent.getComponent().flattenToShortString());
+ } else if (affinityIntent != null) {
+ sb.append(" aI ");
+ sb.append(affinityIntent.getComponent().flattenToShortString());
+ } else {
+ sb.append(" ??");
+ }
+ sb.append('}');
+ return stringName = sb.toString();
}
}
diff --git a/services/java/com/android/server/am/UriPermission.java b/services/java/com/android/server/am/UriPermission.java
index fb7a745..ffa8a2a 100644
--- a/services/java/com/android/server/am/UriPermission.java
+++ b/services/java/com/android/server/am/UriPermission.java
@@ -30,6 +30,8 @@ class UriPermission {
final HashSet<HistoryRecord> readActivities = new HashSet<HistoryRecord>();
final HashSet<HistoryRecord> writeActivities = new HashSet<HistoryRecord>();
+ String stringName;
+
UriPermission(int _uid, Uri _uri) {
uid = _uid;
uri = _uri;
@@ -65,18 +67,29 @@ class UriPermission {
}
public String toString() {
- return "UriPermission{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + uri + "}";
+ if (stringName != null) {
+ return stringName;
+ }
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("UriPermission{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ sb.append(uri);
+ sb.append('}');
+ return stringName = sb.toString();
}
void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + this);
- pw.println(prefix + " modeFlags=0x" + Integer.toHexString(modeFlags)
- + " uid=" + uid
- + " globalModeFlags=0x"
- + Integer.toHexString(globalModeFlags));
- pw.println(prefix + " readActivities=" + readActivities);
- pw.println(prefix + " writeActivities=" + writeActivities);
+ pw.print(prefix); pw.print("modeFlags=0x");
+ pw.print(Integer.toHexString(modeFlags));
+ pw.print(" uid="); pw.print(uid);
+ pw.print(" globalModeFlags=0x");
+ pw.println(Integer.toHexString(globalModeFlags));
+ if (readActivities.size() != 0) {
+ pw.print(prefix); pw.print("readActivities="); pw.println(readActivities);
+ }
+ if (writeActivities.size() != 0) {
+ pw.print(prefix); pw.print("writeActivities="); pw.println(writeActivities);
+ }
}
}
diff --git a/telephony/java/com/android/internal/telephony/IccConstants.java b/telephony/java/com/android/internal/telephony/IccConstants.java
index 59ce5bb..014fbb6 100644
--- a/telephony/java/com/android/internal/telephony/IccConstants.java
+++ b/telephony/java/com/android/internal/telephony/IccConstants.java
@@ -21,39 +21,44 @@ package com.android.internal.telephony;
*/
public interface IccConstants {
// GSM SIM file ids from TS 51.011
- public static final int EF_ADN = 0x6F3A;
- public static final int EF_FDN = 0x6F3B;
- public static final int EF_SDN = 0x6F49;
- public static final int EF_EXT1 = 0x6F4A;
- public static final int EF_EXT2 = 0x6F4B;
- public static final int EF_EXT3 = 0x6F4C;
- public static final int EF_EXT6 = 0x6fc8; // Ext record for EF[MBDN]
- public static final int EF_MWIS = 0x6FCA;
- public static final int EF_MBDN = 0x6fc7;
- public static final int EF_PNN = 0x6fc5;
- public static final int EF_SPN = 0x6F46;
- public static final int EF_SMS = 0x6F3C;
- public static final int EF_ICCID = 0x2fe2;
- public static final int EF_AD = 0x6FAD;
- public static final int EF_MBI = 0x6fc9;
- public static final int EF_MSISDN = 0x6f40;
- public static final int EF_SPDI = 0x6fcd;
- public static final int EF_SST = 0x6f38;
- public static final int EF_CFIS = 0x6FCB;
- public static final int EF_IMG = 0x4f20;
+ static final int EF_ADN = 0x6F3A;
+ static final int EF_FDN = 0x6F3B;
+ static final int EF_SDN = 0x6F49;
+ static final int EF_EXT1 = 0x6F4A;
+ static final int EF_EXT2 = 0x6F4B;
+ static final int EF_EXT3 = 0x6F4C;
+ static final int EF_EXT6 = 0x6fc8; // Ext record for EF[MBDN]
+ static final int EF_MWIS = 0x6FCA;
+ static final int EF_MBDN = 0x6fc7;
+ static final int EF_PNN = 0x6fc5;
+ static final int EF_SPN = 0x6F46;
+ static final int EF_SMS = 0x6F3C;
+ static final int EF_ICCID = 0x2fe2;
+ static final int EF_AD = 0x6FAD;
+ static final int EF_MBI = 0x6fc9;
+ static final int EF_MSISDN = 0x6f40;
+ static final int EF_SPDI = 0x6fcd;
+ static final int EF_SST = 0x6f38;
+ static final int EF_CFIS = 0x6FCB;
+ static final int EF_IMG = 0x4f20;
// GSM SIM file ids from CPHS (phase 2, version 4.2) CPHS4_2.WW6
- public static final int EF_MAILBOX_CPHS = 0x6F17;
- public static final int EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11;
- public static final int EF_CFF_CPHS = 0x6F13;
- public static final int EF_SPN_CPHS = 0x6f14;
- public static final int EF_SPN_SHORT_CPHS = 0x6f18;
- public static final int EF_INFO_CPHS = 0x6f16;
+ static final int EF_MAILBOX_CPHS = 0x6F17;
+ static final int EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11;
+ static final int EF_CFF_CPHS = 0x6F13;
+ static final int EF_SPN_CPHS = 0x6f14;
+ static final int EF_SPN_SHORT_CPHS = 0x6f18;
+ static final int EF_INFO_CPHS = 0x6f16;
// CDMA RUIM file ids from 3GPP2 C.S0023-0
- public static final int EF_CST = 0x6f32;
- public static final int EF_RUIM_SPN =0x6F41;
+ static final int EF_CST = 0x6f32;
+ static final int EF_RUIM_SPN =0x6F41;
// SMS record length from TS 51.011 10.5.3
static public final int SMS_RECORD_LENGTH = 176;
+
+ static final String MF_SIM = "3F00";
+ static final String DF_TELECOM = "7F10";
+ static final String DF_GRAPHICS = "5F50";
+ static final String DF_GSM = "7F20";
}
diff --git a/telephony/java/com/android/internal/telephony/IccFileHandler.java b/telephony/java/com/android/internal/telephony/IccFileHandler.java
index e751c5e..92ddd2c 100644
--- a/telephony/java/com/android/internal/telephony/IccFileHandler.java
+++ b/telephony/java/com/android/internal/telephony/IccFileHandler.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
/**
* {@hide}
*/
-public abstract class IccFileHandler extends Handler {
+public abstract class IccFileHandler extends Handler implements IccConstants {
//from TS 11.11 9.1 or elsewhere
static protected final int COMMAND_READ_BINARY = 0xb0;
@@ -145,7 +145,7 @@ public abstract class IccFileHandler extends Handler {
= obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
new LoadLinearFixedContext(fileid, recordNum, onLoaded));
- phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, null,
+ phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
}
@@ -163,6 +163,7 @@ public abstract class IccFileHandler extends Handler {
new LoadLinearFixedContext(IccConstants.EF_IMG, recordNum,
onLoaded));
+ // TODO(): Verify when path changes are done.
phone.mCM.iccIO(COMMAND_GET_RESPONSE, IccConstants.EF_IMG, "img",
recordNum, READ_RECORD_MODE_ABSOLUTE,
GET_RESPONSE_EF_IMG_SIZE_BYTES, null, null, response);
@@ -181,7 +182,7 @@ public abstract class IccFileHandler extends Handler {
Message response
= obtainMessage(EVENT_GET_EF_LINEAR_RECORD_SIZE_DONE,
new LoadLinearFixedContext(fileid, onLoaded));
- phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, null,
+ phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
}
@@ -198,7 +199,7 @@ public abstract class IccFileHandler extends Handler {
Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
new LoadLinearFixedContext(fileid,onLoaded));
- phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, null,
+ phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
}
@@ -216,7 +217,7 @@ public abstract class IccFileHandler extends Handler {
Message response = obtainMessage(EVENT_GET_BINARY_SIZE_DONE,
fileid, 0, onLoaded);
- phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, null,
+ phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);
}
@@ -250,7 +251,7 @@ public abstract class IccFileHandler extends Handler {
*/
public void updateEFLinearFixed(int fileid, int recordNum, byte[] data,
String pin2, Message onComplete) {
- phone.mCM.iccIO(COMMAND_UPDATE_RECORD, fileid, null,
+ phone.mCM.iccIO(COMMAND_UPDATE_RECORD, fileid, getEFPath(fileid),
recordNum, READ_RECORD_MODE_ABSOLUTE, data.length,
IccUtils.bytesToHexString(data), pin2, onComplete);
}
@@ -261,7 +262,7 @@ public abstract class IccFileHandler extends Handler {
* @param data must be exactly as long as the EF
*/
public void updateEFTransparent(int fileid, byte[] data, Message onComplete) {
- phone.mCM.iccIO(COMMAND_UPDATE_BINARY, fileid, null,
+ phone.mCM.iccIO(COMMAND_UPDATE_BINARY, fileid, getEFPath(fileid),
0, 0, data.length,
IccUtils.bytesToHexString(data), null, onComplete);
}
@@ -394,7 +395,7 @@ public abstract class IccFileHandler extends Handler {
lc.results = new ArrayList<byte[]>(lc.countRecords);
}
- phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, null,
+ phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid),
lc.recordNum,
READ_RECORD_MODE_ABSOLUTE,
lc.recordSize, null, null,
@@ -432,7 +433,7 @@ public abstract class IccFileHandler extends Handler {
size = ((data[RESPONSE_DATA_FILE_SIZE_1] & 0xff) << 8)
+ (data[RESPONSE_DATA_FILE_SIZE_2] & 0xff);
- phone.mCM.iccIO(COMMAND_READ_BINARY, fileid, null,
+ phone.mCM.iccIO(COMMAND_READ_BINARY, fileid, getEFPath(fileid),
0, 0, size, null, null,
obtainMessage(EVENT_READ_BINARY_DONE,
fileid, 0, response));
@@ -467,7 +468,7 @@ public abstract class IccFileHandler extends Handler {
if (lc.recordNum > lc.countRecords) {
sendResult(response, lc.results, null);
} else {
- phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, null,
+ phone.mCM.iccIO(COMMAND_READ_RECORD, lc.efid, getEFPath(lc.efid),
lc.recordNum,
READ_RECORD_MODE_ABSOLUTE,
lc.recordSize, null, null,
@@ -506,6 +507,36 @@ public abstract class IccFileHandler extends Handler {
}
}
+ /**
+ * Returns the root path of the EF file.
+ * i.e returns MasterFile + DFfile as a string.
+ * Ex: For EF_ADN on a SIM, it will return "3F007F10"
+ * This function handles only EFids that are common to
+ * RUIM, SIM, USIM and other types of Icc cards.
+ *
+ * @param efId
+ * @return root path of the file.
+ */
+ protected String getCommonIccEFPath(int efid) {
+ switch(efid) {
+ case EF_ADN:
+ case EF_FDN:
+ case EF_MSISDN:
+ case EF_SDN:
+ case EF_EXT1:
+ case EF_EXT2:
+ case EF_EXT3:
+ return MF_SIM + DF_TELECOM;
+
+ case EF_ICCID:
+ return MF_SIM;
+ case EF_IMG:
+ return MF_SIM + DF_TELECOM + DF_GRAPHICS;
+ }
+ return null;
+ }
+
+ protected abstract String getEFPath(int efid);
protected abstract void logd(String s);
protected abstract void loge(String s);
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 289be6e..cebbe5c 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -234,6 +234,11 @@ public final class RIL extends BaseCommands implements CommandsInterface {
static final int SOCKET_OPEN_RETRY_MILLIS = 4 * 1000;
+ // The number of the required config values for broadcast SMS stored in the C struct
+ // RIL_CDMA_BroadcastServiceInfo
+ private static final int CDMA_BSI_NO_OF_INTS_STRUCT = 3;
+
+ private static final int CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES = 31;
BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
@@ -2017,7 +2022,7 @@ public final class RIL extends BaseCommands implements CommandsInterface {
case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break;
case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break;
case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break;
- case RIL_REQUEST_CDMA_SEND_SMS: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break;
case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break;
case RIL_REQUEST_GET_BROADCAST_CONFIG: ret = responseBR_SMS_CNF(p); break;
case RIL_REQUEST_SET_BROADCAST_CONFIG: ret = responseVoid(p); break;
@@ -2738,16 +2743,37 @@ public final class RIL extends BaseCommands implements CommandsInterface {
private Object
responseCDMA_BR_CNF(Parcel p) {
- int numInts;
+ int numServiceCategories;
int response[];
- numInts = p.readInt();
-
- response = new int[numInts];
-
- response[0] = numInts;
- for (int i = 1 ; i < numInts; i++) {
- response[i] = p.readInt();
+ numServiceCategories = p.readInt();
+
+ if (numServiceCategories == 0) {
+ int numInts;
+ numInts = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES * CDMA_BSI_NO_OF_INTS_STRUCT + 1;
+ response = new int[numInts];
+
+ // indicate that a zero length table was received
+ response[0] = 0;
+ //for all supported service categories set 'english' as default language
+ //and selection status to false
+ for (int i = 1, j = 1
+ ; i <= (CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES
+ * CDMA_BSI_NO_OF_INTS_STRUCT)
+ ; i += CDMA_BSI_NO_OF_INTS_STRUCT, j++ ) {
+ response[i] = j;
+ response[i+1] = 1;
+ response[i+2] = 0;
+ }
+ } else {
+ int numInts;
+ numInts = numServiceCategories * CDMA_BSI_NO_OF_INTS_STRUCT + 1;
+ response = new int[numInts];
+
+ response[0] = numServiceCategories;
+ for (int i = 1 ; i < numInts; i++) {
+ response[i] = p.readInt();
+ }
}
return response;
@@ -3036,10 +3062,13 @@ public final class RIL extends BaseCommands implements CommandsInterface {
public void setCdmaBroadcastConfig(int[] configValuesArray, Message response) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG, response);
- for(int i = 0; i < configValuesArray.length; i++) {
+ rr.mp.writeInt(configValuesArray[0]);
+ for(int i = 1; i <= (configValuesArray[0] * 3); i++) {
rr.mp.writeInt(configValuesArray[i]);
}
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
send(rr);
}
@@ -3049,6 +3078,8 @@ public final class RIL extends BaseCommands implements CommandsInterface {
rr.mp.writeInt(1);
rr.mp.writeInt(activate);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
send(rr);
}
}
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index 28a9968..7274e99 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -98,7 +98,7 @@ public abstract class ServiceStateTracker extends Handler {
protected static final int EVENT_RESET_PREFERRED_NETWORK_TYPE = 21;
protected static final int EVENT_CHECK_REPORT_GPRS = 22;
protected static final int EVENT_RESTRICTED_STATE_CHANGED = 23;
-
+
//*****CDMA events:
protected static final int EVENT_POLL_STATE_REGISTRATION_CDMA = 24;
protected static final int EVENT_POLL_STATE_OPERATOR_CDMA = 25;
@@ -112,9 +112,6 @@ public abstract class ServiceStateTracker extends Handler {
protected static final int EVENT_SIGNAL_STRENGTH_UPDATE_CDMA = 33;
protected static final int EVENT_NV_LOADED = 34;
- // Event Log Tags
- protected static final int EVENT_LOG_CGREG_FAIL = 50107;
-
//***** Time Zones
protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index e0a84ab..651c505 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -64,7 +64,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
private static final String LOG_TAG = "CDMA";
private static final boolean DBG = true;
- //***** Instance Variables
+ private CDMAPhone mCdmaPhone;
// Indicates baseband will not auto-attach
private boolean noAutoAttach = false;
@@ -83,20 +83,19 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
private CdmaDataConnection mActiveDataConnection;
/** Defined cdma connection profiles */
- private static int EXTERNAL_NETWORK_DEFAULT_ID = 0;
- private static int EXTERNAL_NETWORK_NUM_TYPES = 1;
+ private static final int EXTERNAL_NETWORK_DEFAULT_ID = 0;
+ private static final int EXTERNAL_NETWORK_NUM_TYPES = 1;
private boolean[] dataEnabled = new boolean[EXTERNAL_NETWORK_NUM_TYPES];
- //***** Constants
-
/**
* Pool size of CdmaDataConnection objects.
*/
private static final int DATA_CONNECTION_POOL_SIZE = 1;
private static final int POLL_CONNECTION_MILLIS = 5 * 1000;
- private static final String INTENT_RECONNECT_ALARM = "com.android.internal.telephony.cdma-reconnect";
+ private static final String INTENT_RECONNECT_ALARM =
+ "com.android.internal.telephony.cdma-reconnect";
private static final String INTENT_RECONNECT_ALARM_EXTRA_REASON = "reason";
// Possibly promoate to base class, the only difference is
@@ -146,6 +145,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
CdmaDataConnectionTracker(CDMAPhone p) {
super(p);
+ mCdmaPhone = p;
p.mCM.registerForAvailable (this, EVENT_RADIO_AVAILABLE, null);
p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
@@ -187,15 +187,15 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
//Unregister from all events
phone.mCM.unregisterForAvailable(this);
phone.mCM.unregisterForOffOrNotAvailable(this);
- ((CDMAPhone) phone).mRuimRecords.unregisterForRecordsLoaded(this);
+ mCdmaPhone.mRuimRecords.unregisterForRecordsLoaded(this);
phone.mCM.unregisterForNVReady(this);
phone.mCM.unregisterForDataStateChanged(this);
- ((CDMAPhone) phone).mCT.unregisterForVoiceCallEnded(this);
- ((CDMAPhone) phone).mCT.unregisterForVoiceCallStarted(this);
- ((CDMAPhone) phone).mSST.unregisterForCdmaDataConnectionAttached(this);
- ((CDMAPhone) phone).mSST.unregisterForCdmaDataConnectionDetached(this);
- ((CDMAPhone) phone).mSST.unregisterForRoamingOn(this);
- ((CDMAPhone) phone).mSST.unregisterForRoamingOff(this);
+ mCdmaPhone.mCT.unregisterForVoiceCallEnded(this);
+ mCdmaPhone.mCT.unregisterForVoiceCallStarted(this);
+ mCdmaPhone.mSST.unregisterForCdmaDataConnectionAttached(this);
+ mCdmaPhone.mSST.unregisterForCdmaDataConnectionDetached(this);
+ mCdmaPhone.mSST.unregisterForRoamingOn(this);
+ mCdmaPhone.mSST.unregisterForRoamingOff(this);
phone.getContext().unregisterReceiver(this.mIntentReceiver);
destroyAllDataConnectionList();
@@ -277,10 +277,10 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
public boolean isDataConnectionAsDesired() {
boolean roaming = phone.getServiceState().getRoaming();
- if ( ((phone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY) ||
- ((CDMAPhone) phone).mRuimRecords.getRecordsLoaded()) &&
- ((CDMAPhone) phone).mSST.getCurrentCdmaDataConnectionState() ==
- ServiceState.STATE_IN_SERVICE &&
+ if (((phone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY) ||
+ mCdmaPhone.mRuimRecords.getRecordsLoaded()) &&
+ (mCdmaPhone.mSST.getCurrentCdmaDataConnectionState() ==
+ ServiceState.STATE_IN_SERVICE) &&
(!roaming || getDataOnRoamingEnabled()) &&
!mIsWifiConnected ) {
return (state == State.CONNECTED);
@@ -353,7 +353,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
return true;
}
- int psState = ((CDMAPhone) phone).mSST.getCurrentCdmaDataConnectionState();
+ int psState = mCdmaPhone.mSST.getCurrentCdmaDataConnectionState();
boolean roaming = phone.getServiceState().getRoaming();
if ((state == State.IDLE || state == State.SCANNING)
@@ -361,9 +361,9 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
psState == ServiceState.RADIO_TECHNOLOGY_EVDO_0 ||
psState == ServiceState.RADIO_TECHNOLOGY_EVDO_A)
&& ((phone.mCM.getRadioState() == CommandsInterface.RadioState.NV_READY) ||
- ((CDMAPhone) phone).mRuimRecords.getRecordsLoaded())
- && (((CDMAPhone) phone).mSST.isConcurrentVoiceAndData() ||
- phone.getState() == Phone.State.IDLE )
+ mCdmaPhone.mRuimRecords.getRecordsLoaded())
+ && (mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
+ phone.getState() == Phone.State.IDLE )
&& isDataAllowed()) {
return setupData(reason);
@@ -374,8 +374,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
" dataState=" + state +
" PS state=" + psState +
" radio state=" + phone.mCM.getRadioState() +
- " ruim=" + ((CDMAPhone) phone).mRuimRecords.getRecordsLoaded() +
- " concurrentVoice&Data=" + ((CDMAPhone) phone).mSST.isConcurrentVoiceAndData() +
+ " ruim=" + mCdmaPhone.mRuimRecords.getRecordsLoaded() +
+ " concurrentVoice&Data=" + mCdmaPhone.mSST.isConcurrentVoiceAndData() +
" phoneState=" + phone.getState() +
" dataEnabled=" + getAnyDataEnabled() +
" roaming=" + roaming +
@@ -781,7 +781,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
* @override com.android.internal.telephony.DataConnectionTracker
*/
protected void onVoiceCallStarted() {
- if (state == State.CONNECTED && !((CDMAPhone) phone).mSST.isConcurrentVoiceAndData()) {
+ if (state == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
stopNetStatPoll();
phone.notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
}
@@ -792,7 +792,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
*/
protected void onVoiceCallEnded() {
if (state == State.CONNECTED) {
- if (!((CDMAPhone) phone).mSST.isConcurrentVoiceAndData()) {
+ if (!mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
startNetStatPoll();
phone.notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
} else {
@@ -818,7 +818,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
CdmaDataConnection dataConn;
for (int i = 0; i < DATA_CONNECTION_POOL_SIZE; i++) {
- dataConn = new CdmaDataConnection(((CDMAPhone) phone));
+ dataConn = new CdmaDataConnection(mCdmaPhone);
dataConnectionList.add(dataConn);
}
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java b/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java
index 7d392f0..9de6c42 100644
--- a/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java
+++ b/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java
@@ -17,7 +17,6 @@
package com.android.internal.telephony.cdma;
import android.os.*;
-import android.os.AsyncResult;
import android.util.Log;
import com.android.internal.telephony.IccConstants;
@@ -68,6 +67,11 @@ public final class RuimFileHandler extends IccFileHandler {
super.handleMessage(msg);
}
+ protected String getEFPath(int efid) {
+ // TODO(): Implement for CDMA EFs.
+ return getCommonIccEFPath(efid);
+ }
+
protected void logd(String msg) {
Log.d(LOG_TAG, "[RuimFileHandler] " + msg);
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index 2f26bdc..677d609 100644
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -40,10 +40,6 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Random;
-import static android.telephony.SmsMessage.ENCODING_7BIT;
-import static android.telephony.SmsMessage.ENCODING_8BIT;
-import static android.telephony.SmsMessage.ENCODING_16BIT;
-import static android.telephony.SmsMessage.ENCODING_UNKNOWN;
import static android.telephony.SmsMessage.MAX_USER_DATA_BYTES;
import static android.telephony.SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER;
import static android.telephony.SmsMessage.MAX_USER_DATA_SEPTETS;
@@ -135,6 +131,7 @@ public class SmsMessage extends SmsMessageBase {
byte[] data;
byte count;
int countInt;
+ int addressDigitMode;
//currently not supported by the modem-lib: env.mMessageType
env.teleService = p.readInt(); //p_cur->uTeleserviceID
@@ -153,7 +150,8 @@ public class SmsMessage extends SmsMessageBase {
env.serviceCategory = p.readInt(); //p_cur->uServicecategory
// address
- addr.digitMode = (byte) (0xFF & p.readInt()); //p_cur->sAddress.digit_mode
+ addressDigitMode = p.readInt();
+ addr.digitMode = (byte) (0xFF & addressDigitMode); //p_cur->sAddress.digit_mode
addr.numberMode = (byte) (0xFF & p.readInt()); //p_cur->sAddress.number_mode
addr.ton = p.readInt(); //p_cur->sAddress.number_type
addr.numberPlan = (byte) (0xFF & p.readInt()); //p_cur->sAddress.number_plan
@@ -163,7 +161,13 @@ public class SmsMessage extends SmsMessageBase {
//p_cur->sAddress.digits[digitCount]
for (int index=0; index < count; index++) {
data[index] = p.readByte();
+
+ // convert the value if it is 4-bit DTMF to 8 bit
+ if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) {
+ data[index] = msg.convertDtmfToAscii(data[index]);
+ }
}
+
addr.origBytes = data;
// ignore subaddress
@@ -279,6 +283,7 @@ public class SmsMessage extends SmsMessageBase {
SubmitPdu ret = new SubmitPdu();
UserData uData = new UserData();
SmsHeader smsHeader;
+ byte[] data;
// Perform null parameter checks.
if (message == null || destinationAddress == null) {
@@ -287,8 +292,7 @@ public class SmsMessage extends SmsMessageBase {
// ** Set UserData + SmsHeader **
try {
- // First, try encoding it with the GSM alphabet
- int septetCount = GsmAlphabet.countGsmSeptets(message, true);
+ // First, try encoding it as 7-bit ASCII
// User Data (and length)
uData.payload = message.getBytes();
@@ -299,9 +303,7 @@ public class SmsMessage extends SmsMessageBase {
}
// desired TP-Data-Coding-Scheme
- uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET;
-
- // paddingBits not needed for UD_ENCODING_GSM_7BIT_ALPHABET
+ uData.msgEncoding = UserData.ENCODING_7BIT_ASCII;
// sms header
if(headerData != null) {
@@ -311,7 +313,13 @@ public class SmsMessage extends SmsMessageBase {
// no user data header available!
}
- } catch (EncodeException ex) {
+ data = sms.getEnvelope(destinationAddress, statusReportRequested, uData,
+ (headerData != null), (null == headerData));
+
+ } catch (Exception ex) {
+ Log.e(LOG_TAG, "getSubmitPdu: 7 bit ASCII encoding in cdma.SMSMesage failed: "
+ + ex.getMessage());
+ Log.w(LOG_TAG, "getSubmitPdu: The message will be sent as UCS-2 encoded message.");
byte[] textPart;
// Encoding to the 7-bit alphabet failed. Let's see if we can
// send it as a UCS-2 encoded message
@@ -340,10 +348,10 @@ public class SmsMessage extends SmsMessageBase {
} else {
// no user data header available!
}
- }
- byte[] data = sms.getEnvelope(destinationAddress, statusReportRequested, uData,
+ data = sms.getEnvelope(destinationAddress, statusReportRequested, uData,
(headerData != null), (null == headerData));
+ }
if (null == data) return null;
@@ -556,6 +564,7 @@ public class SmsMessage extends SmsMessageBase {
ByteArrayInputStream bais = new ByteArrayInputStream(pdu);
DataInputStream dis = new DataInputStream(new BufferedInputStream(bais));
byte length;
+ int bearerDataLength;
SmsEnvelope env = new SmsEnvelope();
CdmaSmsAddress addr = new CdmaSmsAddress();
@@ -581,9 +590,9 @@ public class SmsMessage extends SmsMessageBase {
env.causeCode = dis.readByte();
//encoded BearerData:
- length = dis.readByte();
- env.bearerData = new byte[length];
- dis.read(env.bearerData, 0, length);
+ bearerDataLength = dis.readInt();
+ env.bearerData = new byte[bearerDataLength];
+ dis.read(env.bearerData, 0, bearerDataLength);
dis.close();
} catch (Exception ex) {
Log.e(LOG_TAG, "createFromPdu: conversion from byte array to object failed: " + ex);
@@ -672,40 +681,22 @@ public class SmsMessage extends SmsMessageBase {
}
/**
- * Parses the User Data of an SMS.
+ * Copy parsed user data out from internal datastructures.
*/
private void parseUserData(UserData uData) {
- int encodingType;
-
- if (null == uData) {
+ if (uData == null) {
return;
}
- encodingType = uData.msgEncoding;
-
- // insert DCS-decoding here when type is supported by ril-library
-
userData = uData.payload;
userDataHeader = uData.userDataHeader;
-
- switch (encodingType) {
- case UserData.ENCODING_GSM_7BIT_ALPHABET:
- case UserData.ENCODING_UNICODE_16:
- // user data was already decoded by wmsts-library
- messageBody = new String(userData);
- break;
-
- // data and unsupported encodings:
- case UserData.ENCODING_OCTET:
- default:
- messageBody = null;
- break;
- }
-
- if (Config.LOGV) Log.v(LOG_TAG, "SMS message body (raw): '" + messageBody + "'");
+ messageBody = uData.payloadStr;
if (messageBody != null) {
+ if (Config.LOGV) Log.v(LOG_TAG, "SMS message body: '" + messageBody + "'");
parseMessageBody();
+ } else if ((userData != null) && (Config.LOGV)) {
+ Log.v(LOG_TAG, "SMS payload: '" + IccUtils.bytesToHexString(userData) + "'");
}
}
@@ -713,7 +704,7 @@ public class SmsMessage extends SmsMessageBase {
* {@inheritDoc}
*/
public MessageClass getMessageClass() {
- if (BearerData.DISPLAY_IMMEDIATE == mBearerData.displayMode ) {
+ if (BearerData.DISPLAY_MODE_IMMEDIATE == mBearerData.displayMode ) {
return MessageClass.CLASS_0;
} else {
return MessageClass.UNKNOWN;
@@ -766,9 +757,6 @@ public class SmsMessage extends SmsMessageBase {
mBearerData.readAckReq = false;
mBearerData.reportReq = false;
- // Set the display mode (See C.S0015-B, v2.0, 4.5.16)
- mBearerData.displayMode = BearerData.DISPLAY_DEFAULT;
-
// number of messages: not needed for encoding!
// indicate whether a user data header is available
@@ -786,7 +774,7 @@ public class SmsMessage extends SmsMessageBase {
// ** SmsEnvelope **
env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT;
- env.teleService = SmsEnvelope.TELESERVICE_WEMT;
+ env.teleService = SmsEnvelope.TELESERVICE_WMT;
env.destAddress = mSmsAddress;
env.bearerReply = RETURN_ACK;
env.bearerData = encodedBearerData;
@@ -874,7 +862,7 @@ public class SmsMessage extends SmsMessageBase {
dos.writeByte(env.errorClass);
dos.writeByte(env.causeCode);
//encoded BearerData:
- dos.writeByte(env.bearerData.length);
+ dos.writeInt(env.bearerData.length);
dos.write(env.bearerData, 0, env.bearerData.length);
dos.close();
@@ -884,4 +872,37 @@ public class SmsMessage extends SmsMessageBase {
}
}
+ /**
+ * Converts a 4-Bit DTMF encoded symbol from the calling address number to ASCII character
+ */
+ private byte convertDtmfToAscii(byte dtmfDigit) {
+ byte asciiDigit;
+
+ switch (dtmfDigit) {
+ case 0: asciiDigit = 68; break; // 'D'
+ case 1: asciiDigit = 49; break; // '1'
+ case 2: asciiDigit = 50; break; // '2'
+ case 3: asciiDigit = 51; break; // '3'
+ case 4: asciiDigit = 52; break; // '4'
+ case 5: asciiDigit = 53; break; // '5'
+ case 6: asciiDigit = 54; break; // '6'
+ case 7: asciiDigit = 55; break; // '7'
+ case 8: asciiDigit = 56; break; // '8'
+ case 9: asciiDigit = 57; break; // '9'
+ case 10: asciiDigit = 48; break; // '0'
+ case 11: asciiDigit = 42; break; // '*'
+ case 12: asciiDigit = 35; break; // '#'
+ case 13: asciiDigit = 65; break; // 'A'
+ case 14: asciiDigit = 66; break; // 'B'
+ case 15: asciiDigit = 67; break; // 'C'
+ default:
+ asciiDigit = 32; // Invalid DTMF code
+ break;
+ }
+
+ return asciiDigit;
+ }
+
+
+
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java
index 8e67387..b5952a1 100644
--- a/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java
+++ b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java
@@ -46,14 +46,14 @@ public final class BearerData{
//private final static byte SUBPARAM_VALIDITY_PERIOD_RELATIVE = 0x05;
//private final static byte SUBPARAM_DEFERRED_DELIVERY_TIME_ABSOLUTE = 0x06;
//private final static byte SUBPARAM_DEFERRED_DELIVERY_TIME_RELATIVE = 0x07;
- //private final static byte SUBPARAM_PRIORITY_INDICATOR = 0x08;
- //private final static byte SUBPARAM_PRIVACY_INDICATOR = 0x09;
+ private final static byte SUBPARAM_PRIORITY_INDICATOR = 0x08;
+ private final static byte SUBPARAM_PRIVACY_INDICATOR = 0x09;
private final static byte SUBPARAM_REPLY_OPTION = 0x0A;
private final static byte SUBPARAM_NUMBER_OF_MESSAGES = 0x0B;
- //private final static byte SUBPARAM_ALERT_ON_MESSAGE_DELIVERY = 0x0C;
- //private final static byte SUBPARAM_LANGUAGE_INDICATOR = 0x0D;
+ private final static byte SUBPARAM_ALERT_ON_MESSAGE_DELIVERY = 0x0C;
+ private final static byte SUBPARAM_LANGUAGE_INDICATOR = 0x0D;
private final static byte SUBPARAM_CALLBACK_NUMBER = 0x0E;
- //private final static byte SUBPARAM_MESSAGE_DISPLAY_MODE = 0x0F;
+ private final static byte SUBPARAM_MESSAGE_DISPLAY_MODE = 0x0F;
//private final static byte SUBPARAM_MULTIPLE_ENCODING_USER_DATA = 0x10;
//private final static byte SUBPARAM_MESSAGE_DEPOSIT_INDEX = 0x11;
//private final static byte SUBPARAM_SERVICE_CATEGORY_PROGRAM_DATA = 0x12;
@@ -63,58 +63,102 @@ public final class BearerData{
//private final static byte SUBPARAM_ENHANCED_VMN = 0x16;
//private final static byte SUBPARAM_ENHANCED_VMN_ACK = 0x17;
- // For completeness the following fields are listed, though not used yet.
+ /**
+ * Supported message types for CDMA SMS messages
+ * (See 3GPP2 C.S0015-B, v2.0, table 4.5.1-1)
+ */
+ public static final int MESSAGE_TYPE_DELIVER = 0x01;
+ public static final int MESSAGE_TYPE_SUBMIT = 0x02;
+ public static final int MESSAGE_TYPE_CANCELLATION = 0x03;
+ public static final int MESSAGE_TYPE_DELIVERY_ACK = 0x04;
+ public static final int MESSAGE_TYPE_USER_ACK = 0x05;
+ public static final int MESSAGE_TYPE_READ_ACK = 0x06;
+ public static final int MESSAGE_TYPE_DELIVER_REPORT = 0x07;
+ public static final int MESSAGE_TYPE_SUBMIT_REPORT = 0x08;
+
+ public byte messageType;
+
+ /**
+ * 16-bit value indicating the message ID, which increments modulo 65536.
+ * (Special rules apply for WAP-messages.)
+ * (See 3GPP2 C.S0015-B, v2, 4.5.1)
+ */
+ public int messageId;
+
/**
* Supported priority modes for CDMA SMS messages
* (See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1)
*/
- //public static final int PRIORITY_NORMAL = 0x0;
- //public static final int PRIORITY_INTERACTIVE = 0x1;
- //public static final int PRIORITY_URGENT = 0x2;
- //public static final int PRIORITY_EMERGENCY = 0x3;
+ public static final int PRIORITY_NORMAL = 0x0;
+ public static final int PRIORITY_INTERACTIVE = 0x1;
+ public static final int PRIORITY_URGENT = 0x2;
+ public static final int PRIORITY_EMERGENCY = 0x3;
+
+ public boolean priorityIndicatorSet = false;
+ public byte priority = PRIORITY_NORMAL;
/**
* Supported privacy modes for CDMA SMS messages
* (See 3GPP2 C.S0015-B, v2.0, table 4.5.10-1)
*/
- //public static final int PRIVACY_NOT_RESTRICTED = 0x0;
- //public static final int PRIVACY_RESTRICTED = 0x1;
- //public static final int PRIVACY_CONFIDENTIAL = 0x2;
- //public static final int PRIVACY_SECRET = 0x3;
+ public static final int PRIVACY_NOT_RESTRICTED = 0x0;
+ public static final int PRIVACY_RESTRICTED = 0x1;
+ public static final int PRIVACY_CONFIDENTIAL = 0x2;
+ public static final int PRIVACY_SECRET = 0x3;
+
+ public boolean privacyIndicatorSet = false;
+ public byte privacy = PRIVACY_NOT_RESTRICTED;
/**
- * Supported alert modes for CDMA SMS messages
+ * Supported alert priority modes for CDMA SMS messages
* (See 3GPP2 C.S0015-B, v2.0, table 4.5.13-1)
*/
- //public static final int ALERT_DEFAULT = 0x0;
- //public static final int ALERT_LOW_PRIO = 0x1;
- //public static final int ALERT_MEDIUM_PRIO = 0x2;
- //public static final int ALERT_HIGH_PRIO = 0x3;
+ public static final int ALERT_DEFAULT = 0x0;
+ public static final int ALERT_LOW_PRIO = 0x1;
+ public static final int ALERT_MEDIUM_PRIO = 0x2;
+ public static final int ALERT_HIGH_PRIO = 0x3;
+
+ public boolean alertIndicatorSet = false;
+ public int alert = ALERT_DEFAULT;
/**
- * Supported display modes for CDMA SMS messages
- * (See 3GPP2 C.S0015-B, v2.0, table 4.5.16-1)
+ * Supported display modes for CDMA SMS messages. Display mode is
+ * a 2-bit value used to indicate to the mobile station when to
+ * display the received message. (See 3GPP2 C.S0015-B, v2,
+ * 4.5.16)
*/
- public static final int DISPLAY_IMMEDIATE = 0x0;
- public static final int DISPLAY_DEFAULT = 0x1;
- public static final int DISPLAY_USER = 0x2;
+ public static final int DISPLAY_MODE_IMMEDIATE = 0x0;
+ public static final int DISPLAY_MODE_DEFAULT = 0x1;
+ public static final int DISPLAY_MODE_USER = 0x2;
+
+ public boolean displayModeSet = false;
+ public byte displayMode = DISPLAY_MODE_DEFAULT;
/**
- * Supported message types for CDMA SMS messages
- * (See 3GPP2 C.S0015-B, v2.0, table 4.5.1-1)
+ * Language Indicator values. NOTE: the spec (3GPP2 C.S0015-B,
+ * v2, 4.5.14) is ambiguous as to the meaning of this field, as it
+ * refers to C.R1001-D but that reference has been crossed out.
+ * It would seem reasonable to assume the values from C.R1001-F
+ * (table 9.2-1) are to be used instead.
*/
- public static final int MESSAGE_TYPE_DELIVER = 0x01;
- public static final int MESSAGE_TYPE_SUBMIT = 0x02;
- public static final int MESSAGE_TYPE_CANCELLATION = 0x03;
- public static final int MESSAGE_TYPE_DELIVERY_ACK = 0x04;
- public static final int MESSAGE_TYPE_USER_ACK = 0x05;
- public static final int MESSAGE_TYPE_READ_ACK = 0x06;
- public static final int MESSAGE_TYPE_DELIVER_REPORT = 0x07;
- public static final int MESSAGE_TYPE_SUBMIT_REPORT = 0x08;
+ public static final int LANGUAGE_UNKNOWN = 0x00;
+ public static final int LANGUAGE_ENGLISH = 0x01;
+ public static final int LANGUAGE_FRENCH = 0x02;
+ public static final int LANGUAGE_SPANISH = 0x03;
+ public static final int LANGUAGE_JAPANESE = 0x04;
+ public static final int LANGUAGE_KOREAN = 0x05;
+ public static final int LANGUAGE_CHINESE = 0x06;
+ public static final int LANGUAGE_HEBREW = 0x07;
+
+ public boolean languageIndicatorSet = false;
+ public int language = LANGUAGE_UNKNOWN;
/**
- * SMS Message Status Codes
- * (See 3GPP2 C.S0015-B, v2.0, table 4.5.21-1)
+ * SMS Message Status Codes. The first component of the Message
+ * status indicates if an error has occurred and whether the error
+ * is considered permanent or temporary. The second component of
+ * the Message status indicates the cause of the error (if any).
+ * (See 3GPP2 C.S0015-B, v2.0, 4.5.21)
*/
/* no-error codes */
public static final int ERROR_NONE = 0x00;
@@ -139,19 +183,9 @@ public final class BearerData{
public static final int ERROR_UNDEFINED = 0xFF;
public static final int STATUS_UNDEFINED = 0xFF;
- /**
- * 4-bit value indicating the message type in accordance to
- * table 4.5.1-1
- * (See 3GPP2 C.S0015-B, v2, 4.5.1)
- */
- public byte messageType;
-
- /**
- * 16-bit value indicating the message ID, which increments modulo 65536.
- * (Special rules apply for WAP-messages.)
- * (See 3GPP2 C.S0015-B, v2, 4.5.1)
- */
- public int messageId;
+ public boolean messageStatusSet = false;
+ public int errorClass = ERROR_UNDEFINED;
+ public int messageStatus = STATUS_UNDEFINED;
/**
* 1-bit value that indicates whether a User Data Header is present.
@@ -178,8 +212,6 @@ public final class BearerData{
//public SmsRelTime validityPeriodRelative;
//public SmsTime deferredDeliveryTimeAbsolute;
//public SmsRelTime deferredDeliveryTimeRelative;
- //public byte priority;
- //public byte privacy;
/**
* Reply Option
@@ -199,9 +231,6 @@ public final class BearerData{
*/
public int numberOfMessages;
- //public int alert;
- //public int language;
-
/**
* 4-bit or 8-bit value that indicates the number to be dialed in reply to a
* received SMS message.
@@ -209,27 +238,6 @@ public final class BearerData{
*/
public CdmaSmsAddress callbackNumber;
- /**
- * 2-bit value that is used to indicate to the mobile station when to display
- * the received message.
- * (See 3GPP2 C.S0015-B, v2, 4.5.16)
- */
- public byte displayMode = DISPLAY_DEFAULT;
-
- /**
- * First component of the Message status, that indicates if an error has occurred
- * and whether the error is considered permanent or temporary.
- * (See 3GPP2 C.S0015-B, v2, 4.5.21)
- */
- public int errorClass = ERROR_UNDEFINED;
-
- /**
- * Second component of the Message status, that indicates if an error has occurred
- * and the cause of the error.
- * (See 3GPP2 C.S0015-B, v2, 4.5.21)
- */
- public int messageStatus = STATUS_UNDEFINED;
-
private static class CodingException extends Exception {
public CodingException(String s) {
super(s);
@@ -242,6 +250,13 @@ public final class BearerData{
builder.append("BearerData:\n");
builder.append(" messageType: " + messageType + "\n");
builder.append(" messageId: " + (int)messageId + "\n");
+ builder.append(" priority: " + (priorityIndicatorSet ? priority : "not set") + "\n");
+ builder.append(" privacy: " + (privacyIndicatorSet ? privacy : "not set") + "\n");
+ builder.append(" alert: " + (alertIndicatorSet ? alert : "not set") + "\n");
+ builder.append(" displayMode: " + (displayModeSet ? displayMode : "not set") + "\n");
+ builder.append(" language: " + (languageIndicatorSet ? language : "not set") + "\n");
+ builder.append(" errorClass: " + (messageStatusSet ? errorClass : "not set") + "\n");
+ builder.append(" messageStatus: " + (messageStatusSet ? messageStatus : "not set") + "\n");
builder.append(" hasUserDataHeader: " + hasUserDataHeader + "\n");
builder.append(" timeStamp: " + timeStamp + "\n");
builder.append(" userAckReq: " + userAckReq + "\n");
@@ -250,9 +265,6 @@ public final class BearerData{
builder.append(" reportReq: " + reportReq + "\n");
builder.append(" numberOfMessages: " + numberOfMessages + "\n");
builder.append(" callbackNumber: " + callbackNumber + "\n");
- builder.append(" displayMode: " + displayMode + "\n");
- builder.append(" errorClass: " + errorClass + "\n");
- builder.append(" messageStatus: " + messageStatus + "\n");
builder.append(" userData: " + userData + "\n");
return builder.toString();
}
@@ -387,6 +399,45 @@ public final class BearerData{
outStream.writeByteArray(6 * 8, bData.timeStamp);
}
+ private static void encodePrivacyIndicator(BearerData bData, BitwiseOutputStream outStream)
+ throws BitwiseOutputStream.AccessException
+ {
+ outStream.write(8, 1);
+ outStream.write(2, bData.privacy);
+ outStream.skip(6);
+ }
+
+ private static void encodeLanguageIndicator(BearerData bData, BitwiseOutputStream outStream)
+ throws BitwiseOutputStream.AccessException
+ {
+ outStream.write(8, 1);
+ outStream.write(8, bData.language);
+ }
+
+ private static void encodeDisplayMode(BearerData bData, BitwiseOutputStream outStream)
+ throws BitwiseOutputStream.AccessException
+ {
+ outStream.write(8, 1);
+ outStream.write(2, bData.displayMode);
+ outStream.skip(6);
+ }
+
+ private static void encodePriorityIndicator(BearerData bData, BitwiseOutputStream outStream)
+ throws BitwiseOutputStream.AccessException
+ {
+ outStream.write(8, 1);
+ outStream.write(2, bData.priority);
+ outStream.skip(6);
+ }
+
+ private static void encodeMsgDeliveryAlert(BearerData bData, BitwiseOutputStream outStream)
+ throws BitwiseOutputStream.AccessException
+ {
+ outStream.write(8, 1);
+ outStream.write(2, bData.alert);
+ outStream.skip(6);
+ }
+
/**
* Create serialized representation for BearerData object.
* (See 3GPP2 C.R1001-F, v1.0, section 4.5 for layout details)
@@ -420,6 +471,30 @@ public final class BearerData{
outStream.write(8, SUBPARAM_MESSAGE_CENTER_TIME_STAMP);
encodeMsgCenterTimeStamp(bData, outStream);
}
+ if (bData.privacyIndicatorSet) {
+ outStream.write(8, SUBPARAM_PRIVACY_INDICATOR);
+ encodePrivacyIndicator(bData, outStream);
+ }
+ if (bData.languageIndicatorSet) {
+ outStream.write(8, SUBPARAM_LANGUAGE_INDICATOR);
+ encodeLanguageIndicator(bData, outStream);
+ }
+ if (bData.displayModeSet) {
+ outStream.write(8, SUBPARAM_MESSAGE_DISPLAY_MODE);
+ encodeDisplayMode(bData, outStream);
+ }
+ if (bData.priorityIndicatorSet) {
+ outStream.write(8, SUBPARAM_PRIORITY_INDICATOR);
+ encodePriorityIndicator(bData, outStream);
+ }
+ if (bData.alertIndicatorSet) {
+ outStream.write(8, SUBPARAM_ALERT_ON_MESSAGE_DELIVERY);
+ encodeMsgDeliveryAlert(bData, outStream);
+ }
+ if (bData.messageStatusSet) {
+ outStream.write(8, SUBPARAM_MESSAGE_STATUS);
+ encodeMsgStatus(bData, outStream);
+ }
return outStream.toByteArray();
} catch (BitwiseOutputStream.AccessException ex) {
Log.e(LOG_TAG, "BearerData encode failed: " + ex);
@@ -471,6 +546,33 @@ public final class BearerData{
}
}
+ private static String decodeIa5(byte[] data, int offset, int numFields) {
+ try {
+ StringBuffer strBuf = new StringBuffer(numFields);
+ BitwiseInputStream inStream = new BitwiseInputStream(data);
+ inStream.skip(offset);
+ int wantedBits = numFields * 7;
+ if (inStream.available() < wantedBits) {
+ throw new CodingException("insufficient data (wanted " + wantedBits +
+ " bits, but only have " + inStream.available() + ")");
+ }
+ for (int i = 0; i < numFields; i++) {
+ int charCode = inStream.read(7);
+ if ((charCode < UserData.IA5_MAP_BASE_INDEX) ||
+ (charCode > UserData.IA5_MAP_MAX_INDEX)) {
+ throw new CodingException("unsupported AI5 character code (" + charCode + ")");
+ }
+ strBuf.append(UserData.IA5_MAP[charCode - UserData.IA5_MAP_BASE_INDEX]);
+ }
+ return strBuf.toString();
+ } catch (BitwiseInputStream.AccessException ex) {
+ Log.e(LOG_TAG, "UserData AI5 decode failed: " + ex);
+ } catch (CodingException ex) {
+ Log.e(LOG_TAG, "UserData AI5 decode failed: " + ex);
+ }
+ return null;
+ }
+
private static void decodeUserDataPayload(UserData userData, boolean hasUserDataHeader)
throws CodingException
{
@@ -482,18 +584,23 @@ public final class BearerData{
userData.userDataHeader = SmsHeader.parse(headerData);
}
switch (userData.msgEncoding) {
- case UserData.ENCODING_GSM_7BIT_ALPHABET:
- userData.payloadStr = GsmAlphabet.gsm7BitPackedToString(userData.payload,
- offset, userData.numFields);
+ case UserData.ENCODING_OCTET:
break;
case UserData.ENCODING_7BIT_ASCII:
userData.payloadStr = decodePayloadStr(userData.payload, offset,
userData.numFields, "US-ASCII");
break;
+ case UserData.ENCODING_IA5:
+ userData.payloadStr = decodeIa5(userData.payload, offset, userData.numFields);
+ break;
case UserData.ENCODING_UNICODE_16:
userData.payloadStr = decodePayloadStr(userData.payload, offset,
userData.numFields * 2, "UTF-16");
break;
+ case UserData.ENCODING_GSM_7BIT_ALPHABET:
+ userData.payloadStr = GsmAlphabet.gsm7BitPackedToString(userData.payload,
+ offset, userData.numFields);
+ break;
default:
throw new CodingException("unsupported user data encoding ("
+ userData.msgEncoding + ")");
@@ -592,6 +699,7 @@ public final class BearerData{
}
bData.errorClass = inStream.read(2);
bData.messageStatus = inStream.read(6);
+ bData.messageStatusSet = true;
}
private static void decodeMsgCenterTimeStamp(BearerData bData,
@@ -604,6 +712,60 @@ public final class BearerData{
bData.timeStamp = inStream.readByteArray(6 * 8);
}
+ private static void decodePrivacyIndicator(BearerData bData, BitwiseInputStream inStream)
+ throws BitwiseInputStream.AccessException, CodingException
+ {
+ if (inStream.read(8) != 1) {
+ throw new CodingException("PRIVACY_INDICATOR subparam size incorrect");
+ }
+ bData.privacy = inStream.read(2);
+ inStream.skip(6);
+ bData.privacyIndicatorSet = true;
+ }
+
+ private static void decodeLanguageIndicator(BearerData bData, BitwiseInputStream inStream)
+ throws BitwiseInputStream.AccessException, CodingException
+ {
+ if (inStream.read(8) != 1) {
+ throw new CodingException("LANGUAGE_INDICATOR subparam size incorrect");
+ }
+ bData.language = inStream.read(8);
+ bData.languageIndicatorSet = true;
+ }
+
+ private static void decodeDisplayMode(BearerData bData, BitwiseInputStream inStream)
+ throws BitwiseInputStream.AccessException, CodingException
+ {
+ if (inStream.read(8) != 1) {
+ throw new CodingException("DISPLAY_MODE subparam size incorrect");
+ }
+ bData.displayMode = inStream.read(2);
+ inStream.skip(6);
+ bData.displayModeSet = true;
+ }
+
+ private static void decodePriorityIndicator(BearerData bData, BitwiseInputStream inStream)
+ throws BitwiseInputStream.AccessException, CodingException
+ {
+ if (inStream.read(8) != 1) {
+ throw new CodingException("PRIORITY_INDICATOR subparam size incorrect");
+ }
+ bData.priority = inStream.read(2);
+ inStream.skip(6);
+ bData.priorityIndicatorSet = true;
+ }
+
+ private static void decodeMsgDeliveryAlert(BearerData bData, BitwiseInputStream inStream)
+ throws BitwiseInputStream.AccessException, CodingException
+ {
+ if (inStream.read(8) != 1) {
+ throw new CodingException("ALERT_ON_MESSAGE_DELIVERY subparam size incorrect");
+ }
+ bData.alert = inStream.read(2);
+ inStream.skip(6);
+ bData.alertIndicatorSet = true;
+ }
+
/**
* Create BearerData object from serialized representation.
* (See 3GPP2 C.R1001-F, v1.0, section 4.5 for layout details)
@@ -647,6 +809,21 @@ public final class BearerData{
case SUBPARAM_MESSAGE_CENTER_TIME_STAMP:
decodeMsgCenterTimeStamp(bData, inStream);
break;
+ case SUBPARAM_PRIVACY_INDICATOR:
+ decodePrivacyIndicator(bData, inStream);
+ break;
+ case SUBPARAM_LANGUAGE_INDICATOR:
+ decodeLanguageIndicator(bData, inStream);
+ break;
+ case SUBPARAM_MESSAGE_DISPLAY_MODE:
+ decodeDisplayMode(bData, inStream);
+ break;
+ case SUBPARAM_PRIORITY_INDICATOR:
+ decodePriorityIndicator(bData, inStream);
+ break;
+ case SUBPARAM_ALERT_ON_MESSAGE_DELIVERY:
+ decodeMsgDeliveryAlert(bData, inStream);
+ break;
default:
throw new CodingException("unsupported bearer data subparameter ("
+ subparamId + ")");
diff --git a/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java b/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java
index bd6fbb4..f916089 100644
--- a/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java
+++ b/telephony/java/com/android/internal/telephony/cdma/sms/UserData.java
@@ -22,13 +22,13 @@ import com.android.internal.util.HexDump;
public class UserData{
/**
- * User data encoding types
+ * User data encoding types.
* (See 3GPP2 C.R1001-F, v1.0, table 9.1-1)
*/
public static final int ENCODING_OCTET = 0x00;
public static final int ENCODING_IS91_EXTENDED_PROTOCOL = 0x01;
public static final int ENCODING_7BIT_ASCII = 0x02;
- //public static final int ENCODING_IA5 = 0x03;
+ public static final int ENCODING_IA5 = 0x03;
public static final int ENCODING_UNICODE_16 = 0x04;
//public static final int ENCODING_SHIFT_JIS = 0x05;
//public static final int ENCODING_KOREAN = 0x06;
@@ -38,6 +38,25 @@ public class UserData{
public static final int ENCODING_GSM_DCS = 0x0A;
/**
+ * IA5 data encoding character mappings.
+ * (See CCITT Rec. T.50 Tables 1 and 3)
+ */
+ public static final char[] IA5_MAP = {
+ ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
+ '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
+ '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'};
+
+ /**
+ * Mapping for IA5 values less than 32 are flow control signals
+ * and not used here.
+ */
+ public static final int IA5_MAP_BASE_INDEX = 0x20;
+ public static final int IA5_MAP_MAX_INDEX = IA5_MAP_BASE_INDEX + IA5_MAP.length - 1;
+
+ /**
* Contains the data header of the user data
*/
public SmsHeader userDataHeader;
@@ -73,8 +92,8 @@ public class UserData{
builder.append(" paddingBits: " + paddingBits + "\n");
builder.append(" numFields: " + (int)numFields + "\n");
builder.append(" userDataHeader: " + userDataHeader + "\n");
- builder.append(" payload: " + HexDump.toHexString(payload));
- builder.append(" payloadStr: " + payloadStr);
+ builder.append(" payload: '" + HexDump.toHexString(payload) + "'");
+ builder.append(", payloadStr: '" + payloadStr + "'");
return builder.toString();
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 71ffe74..9e6ebc4 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -836,57 +836,38 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
return;
}
+ if (state == State.CONNECTED) {
+ // The way things are supposed to work, the PDP list
+ // should not contain the CID after it disconnects.
+ // However, the way things really work, sometimes the PDP
+ // context is still listed with active = false, which
+ // makes it hard to distinguish an activating context from
+ // an activated-and-then deactivated one.
+ if (!pdpStatesHasCID(pdpStates, cidActive)) {
+ // It looks like the PDP context has deactivated.
+ // Tear everything down and try to reconnect.
+
+ Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting");
+
+ // Add an event log when the network drops PDP
+ int cid = -1;
+ GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
+ if (loc != null) cid = loc.getCid();
+ EventLog.List val = new EventLog.List(cid,
+ TelephonyManager.getDefault().getNetworkType());
+ EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val);
- // This is how things are supposed to work:
- // The PDP list is supposed to be empty of the CID
- // when it disconnects
-
- if (state == State.CONNECTED
- && !pdpStatesHasCID(pdpStates, cidActive)) {
-
- // It looks like the PDP context has deactivated
- // Tear everything down and try to reconnect
-
- Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting");
-
- // Add an event log when the network drops PDP
- int cid = -1;
- GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
- if (loc != null) cid = loc.getCid();
-
- EventLog.List val = new EventLog.List(cid,
- TelephonyManager.getDefault().getNetworkType());
-
- EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val);
-
- cleanUpConnection(true, null);
-
- return;
- }
-
- if (true) {
- //
- // Workaround for issue #655426
- //
-
- // --------------------------
-
- // This is how some things work now: the PDP context is still
- // listed with active = false, which makes it hard to
- // distinguish an activating context from an activated-and-then
- // deactivated one.
- //
- // Here, we only consider this authoritative if we asked for the
- // PDP list. If it was an unsolicited response, we poll again
- // to make sure everyone agrees on the initial state
-
- if (state == State.CONNECTED
- && !pdpStatesHasActiveCID(pdpStates, cidActive)) {
+ cleanUpConnection(true, null);
+ return;
+ } else if (!pdpStatesHasActiveCID(pdpStates, cidActive)) {
+ // Here, we only consider this authoritative if we asked for the
+ // PDP list. If it was an unsolicited response, we poll again
+ // to make sure everyone agrees on the initial state.
if (!explicitPoll) {
// We think it disconnected but aren't sure...poll from our side
phone.mCM.getPDPContextList(
- this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE));
+ this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE));
} else {
Log.i(LOG_TAG, "PDP connection has dropped (active=false case). "
+ " Reconnecting");
@@ -895,10 +876,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
int cid = -1;
GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation());
if (loc != null) cid = loc.getCid();
-
EventLog.List val = new EventLog.List(cid,
TelephonyManager.getDefault().getNetworkType());
-
EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val);
cleanUpConnection(true, null);
diff --git a/telephony/java/com/android/internal/telephony/gsm/MccTable.java b/telephony/java/com/android/internal/telephony/gsm/MccTable.java
index ab2a693..6198979 100644
--- a/telephony/java/com/android/internal/telephony/gsm/MccTable.java
+++ b/telephony/java/com/android/internal/telephony/gsm/MccTable.java
@@ -167,9 +167,9 @@ public final class MccTable
*
* FIXME(mkf) this should be stored in a more efficient representation
*/
-
+
table.add(new MccEntry(202,"gr",2)); //Greece
- table.add(new MccEntry(204,"nl",2,"Europe/Amsterdam")); //Netherlands (Kingdom of the)
+ table.add(new MccEntry(204,"nl",2,"Europe/Amsterdam","nl")); //Netherlands (Kingdom of the)
table.add(new MccEntry(206,"be",2)); //Belgium
table.add(new MccEntry(208,"fr",2,"Europe/Paris","fr")); //France
table.add(new MccEntry(212,"mc",2)); //Monaco (Principality of)
@@ -183,7 +183,7 @@ public final class MccTable
table.add(new MccEntry(225,"va",2,"Europe/Rome","it")); //Vatican City State
table.add(new MccEntry(226,"ro",2)); //Romania
table.add(new MccEntry(228,"ch",2,"Europe/Zurich","en")); //Switzerland (Confederation of)
- table.add(new MccEntry(230,"cz",2,"Europe/Prague")); //Czech Republic
+ table.add(new MccEntry(230,"cz",2,"Europe/Prague","cs")); //Czech Republic
table.add(new MccEntry(231,"sk",2)); //Slovak Republic
table.add(new MccEntry(232,"at",2,"Europe/Vienna","de")); //Austria
table.add(new MccEntry(234,"gb",2,"Europe/London","en")); //United Kingdom of Great Britain and Northern Ireland
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
index ead1327..a08cdde 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
@@ -16,26 +16,19 @@
package com.android.internal.telephony.gsm;
-import android.os.*;
-import android.os.AsyncResult;
+import android.os.Message;
import android.util.Log;
import com.android.internal.telephony.IccConstants;
-import com.android.internal.telephony.IccException;
import com.android.internal.telephony.IccFileHandler;
-import com.android.internal.telephony.IccFileTypeMismatch;
-import com.android.internal.telephony.IccIoResult;
-import com.android.internal.telephony.IccUtils;
-import com.android.internal.telephony.PhoneProxy;
-
-import java.util.ArrayList;
/**
* {@hide}
*/
-public final class SIMFileHandler extends IccFileHandler {
+public final class SIMFileHandler extends IccFileHandler implements IccConstants {
static final String LOG_TAG = "GSM";
+
//***** Instance Variables
//***** Constructor
@@ -59,6 +52,37 @@ public final class SIMFileHandler extends IccFileHandler {
super.handleMessage(msg);
}
+ protected String getEFPath(int efid) {
+ // TODO(): Make changes when USIM is supported
+ // TODO(): DF_GSM can be 7F20 or 7F21 to handle backward compatibility.
+ // Implement this after discussion with OEMs.
+ switch(efid) {
+ case EF_SMS:
+ return MF_SIM + DF_TELECOM;
+
+ case EF_EXT6:
+ case EF_MWIS:
+ case EF_MBI:
+ case EF_SPN:
+ case EF_AD:
+ case EF_MBDN:
+ case EF_PNN:
+ case EF_SPDI:
+ case EF_SST:
+ case EF_CFIS:
+ return MF_SIM + DF_GSM;
+
+ case EF_MAILBOX_CPHS:
+ case EF_VOICE_MAIL_INDICATOR_CPHS:
+ case EF_CFF_CPHS:
+ case EF_SPN_CPHS:
+ case EF_SPN_SHORT_CPHS:
+ case EF_INFO_CPHS:
+ return MF_SIM + DF_GSM;
+ }
+ return getCommonIccEFPath(efid);
+ }
+
protected void logd(String msg) {
Log.d(LOG_TAG, "[SIMFileHandler] " + msg);
}
diff --git a/test-runner/android/test/InstrumentationCoreTestRunner.java b/test-runner/android/test/InstrumentationCoreTestRunner.java
index 3f77a60..ff99a74 100644
--- a/test-runner/android/test/InstrumentationCoreTestRunner.java
+++ b/test-runner/android/test/InstrumentationCoreTestRunner.java
@@ -49,7 +49,15 @@ import android.util.Log;
*/
public class InstrumentationCoreTestRunner extends InstrumentationTestRunner {
+ /**
+ * Convenience definition of our log tag.
+ */
private static final String TAG = "InstrumentationCoreTestRunner";
+
+ /**
+ * True if (and only if) we are running in single-test mode (as opposed to
+ * batch mode).
+ */
private boolean singleTest = false;
@Override
@@ -57,6 +65,7 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner {
// We might want to move this to /sdcard, if is is mounted/writable.
File cacheDir = getTargetContext().getCacheDir();
+ // Set some properties that the core tests absolutely need.
System.setProperty("user.language", "en");
System.setProperty("user.region", "US");
@@ -74,38 +83,66 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner {
super.onCreate(arguments);
}
+ @Override
protected AndroidTestRunner getAndroidTestRunner() {
AndroidTestRunner runner = super.getAndroidTestRunner();
runner.addTestListener(new TestListener() {
+ /**
+ * The last test class we executed code from.
+ */
private Class<?> lastClass;
+ /**
+ * The minimum time we expect a test to take.
+ */
+ private static final int MINIMUM_TIME = 100;
+
+ /**
+ * The start time of our current test in System.currentTimeMillis().
+ */
+ private long startTime;
+
public void startTest(Test test) {
if (test.getClass() != lastClass) {
+ lastClass = test.getClass();
printMemory(test.getClass());
}
Thread.currentThread().setContextClassLoader(
test.getClass().getClassLoader());
+
+ startTime = System.currentTimeMillis();
}
public void endTest(Test test) {
if (test instanceof TestCase) {
- if (lastClass == null) {
- lastClass = test.getClass();
- } else {
- if (test.getClass() != lastClass) {
- cleanup(lastClass);
- lastClass = test.getClass();
+ cleanup((TestCase)test);
+
+ /*
+ * Make sure all tests take at least MINIMUM_TIME to
+ * complete. If they don't, we wait a bit. The Cupcake
+ * Binder can't handle too many operations in a very
+ * short time, which causes headache for the CTS.
+ */
+ long timeTaken = System.currentTimeMillis() - startTime;
+
+ if (timeTaken < MINIMUM_TIME) {
+ try {
+ Thread.sleep(MINIMUM_TIME - timeTaken);
+ } catch (InterruptedException ignored) {
+ // We don't care.
}
}
}
}
public void addError(Test test, Throwable t) {
+ // This space intentionally left blank.
}
public void addFailure(Test test, AssertionFailedError t) {
+ // This space intentionally left blank.
}
/**
@@ -125,30 +162,31 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner {
}
/**
- * Nulls all static reference fields in the given test class. This
- * method helps us with those test classes that don't have an
+ * Nulls all non-static reference fields in the given test class.
+ * This method helps us with those test classes that don't have an
* explicit tearDown() method. Normally the garbage collector should
* take care of everything, but since JUnit keeps references to all
* test cases, a little help might be a good idea.
*/
- private void cleanup(Class<?> clazz) {
- if (clazz != TestCase.class) {
+ private void cleanup(TestCase test) {
+ Class<?> clazz = test.getClass();
+
+ while (clazz != TestCase.class) {
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
if (!f.getType().isPrimitive() &&
- Modifier.isStatic(f.getModifiers())) {
+ !Modifier.isStatic(f.getModifiers())) {
try {
f.setAccessible(true);
- f.set(null, null);
+ f.set(test, null);
} catch (Exception ignored) {
// Nothing we can do about it.
}
}
}
- // don't cleanup the superclass for now
- //cleanup(clazz.getSuperclass());
+ clazz = clazz.getSuperclass();
}
}
diff --git a/test-runner/android/test/TestLocationProvider.java b/test-runner/android/test/TestLocationProvider.java
index 69747d2..0fc3d16 100644
--- a/test-runner/android/test/TestLocationProvider.java
+++ b/test-runner/android/test/TestLocationProvider.java
@@ -20,10 +20,11 @@ package android.test;
import android.location.Criteria;
import android.location.ILocationManager;
import android.location.Location;
-import android.location.LocationProviderImpl;
import android.os.Bundle;
import android.os.SystemClock;
+import com.android.internal.location.LocationProviderImpl;
+
/**
* @hide - This is part of a framework that is under development and should not be used for
* active development.
diff --git a/test-runner/android/test/mock/MockContext.java b/test-runner/android/test/mock/MockContext.java
index e733dd1..bd39a14 100644
--- a/test-runner/android/test/mock/MockContext.java
+++ b/test-runner/android/test/mock/MockContext.java
@@ -386,4 +386,12 @@ public class MockContext extends Context {
throws PackageManager.NameNotFoundException {
throw new UnsupportedOperationException();
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public float getApplicationScale() {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/tests/AndroidTests/res/values-port/configVarying.xml b/tests/AndroidTests/res/values-32dpi/configVarying.xml
index 0e1f247..f903f0f 100644
--- a/tests/AndroidTests/res/values-port/configVarying.xml
+++ b/tests/AndroidTests/res/values-32dpi/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple portrait</item>
+ <item type="configVarying" name="simple">simple 32dpi</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag portrait</item>
+ <item name="testString">bag 32dpi</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-320x200/configVarying.xml b/tests/AndroidTests/res/values-640x400/configVarying.xml
index ca2a286..30332c0 100644
--- a/tests/AndroidTests/res/values-320x200/configVarying.xml
+++ b/tests/AndroidTests/res/values-640x400/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple 320x200</item>
+ <item type="configVarying" name="simple">simple 640x400</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag 320x200</item>
+ <item name="testString">bag 640x400</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-fr-rFR/configVarying.xml b/tests/AndroidTests/res/values-fr-rFR/configVarying.xml
new file mode 100644
index 0000000..5ecac7c
--- /dev/null
+++ b/tests/AndroidTests/res/values-fr-rFR/configVarying.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <item type="configVarying" name="simple">simple fr FR</item>
+ <bag type="configVarying" name="bag">
+ <item name="testString">bag fr FR</item>
+ </bag>
+</resources>
diff --git a/tests/AndroidTests/res/values-fr/configVarying.xml b/tests/AndroidTests/res/values-fr/configVarying.xml
new file mode 100644
index 0000000..8413b5a
--- /dev/null
+++ b/tests/AndroidTests/res/values-fr/configVarying.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <item type="configVarying" name="simple">simple fr</item>
+ <bag type="configVarying" name="bag">
+ <item name="testString">bag fr</item>
+ </bag>
+</resources>
diff --git a/tests/AndroidTests/res/values-trackball/configVarying.xml b/tests/AndroidTests/res/values-mcc110-xx/configVarying.xml
index 0dec300..82e2435 100644
--- a/tests/AndroidTests/res/values-trackball/configVarying.xml
+++ b/tests/AndroidTests/res/values-mcc110-xx/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple trackball</item>
+ <item type="configVarying" name="simple">simple mcc110 xx</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag trackball</item>
+ <item name="testString">bag mcc110 xx</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-qwerty/configVarying.xml b/tests/AndroidTests/res/values-mcc112/configVarying.xml
index 939f682..9c05d77 100644
--- a/tests/AndroidTests/res/values-qwerty/configVarying.xml
+++ b/tests/AndroidTests/res/values-mcc112/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple qwerty</item>
+ <item type="configVarying" name="simple">simple mcc112</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag qwerty</item>
+ <item name="testString">bag mcc112</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-mnc220-xx/configVarying.xml b/tests/AndroidTests/res/values-mnc220-xx/configVarying.xml
new file mode 100644
index 0000000..fbc7888
--- /dev/null
+++ b/tests/AndroidTests/res/values-mnc220-xx/configVarying.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <item type="configVarying" name="simple">simple mnc220 xx</item>
+ <bag type="configVarying" name="bag">
+ <item name="testString">bag mnc220 xx</item>
+ </bag>
+</resources>
diff --git a/tests/AndroidTests/res/values-keyshidden/configVarying.xml b/tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml
index fdffc4d..03bea33 100644
--- a/tests/AndroidTests/res/values-keyshidden/configVarying.xml
+++ b/tests/AndroidTests/res/values-mnc222-32dpi/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple keyshidden</item>
+ <item type="configVarying" name="simple">simple mnc222 32dpi</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag keyshidden</item>
+ <item name="testString">bag mnc222 32dpi</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/res/values-finger/configVarying.xml b/tests/AndroidTests/res/values-mnc223/configVarying.xml
index 674787e..8936cbc 100644
--- a/tests/AndroidTests/res/values-finger/configVarying.xml
+++ b/tests/AndroidTests/res/values-mnc223/configVarying.xml
@@ -15,8 +15,8 @@
-->
<resources>
- <item type="configVarying" name="simple">simple finger</item>
+ <item type="configVarying" name="simple">simple mnc223</item>
<bag type="configVarying" name="bag">
- <item name="testString">bag finger</item>
+ <item name="testString">bag mnc223</item>
</bag>
</resources>
diff --git a/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java b/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
index 723512c..9ff80c7 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
@@ -264,10 +264,152 @@ public class CdmaSmsTest extends AndroidTestCase {
HexDump.toHexString(revBearerData.timeStamp));
}
- // XXX test messageId
+ @SmallTest
+ public void testPrivacyIndicator() throws Exception {
+ String pdu1 = "0003104090010c485f4194dfea34becf61b840090140";
+ BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
+ assertEquals(bd1.privacy, BearerData.PRIVACY_RESTRICTED);
+ String pdu2 = "0003104090010c485f4194dfea34becf61b840090180";
+ BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
+ assertEquals(bd2.privacy, BearerData.PRIVACY_CONFIDENTIAL);
+ String pdu3 = "0003104090010c485f4194dfea34becf61b8400901c0";
+ BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
+ assertEquals(bd3.privacy, BearerData.PRIVACY_SECRET);
+ }
+
+ @SmallTest
+ public void testPrivacyIndicatorFeedback() throws Exception {
+ BearerData bearerData = new BearerData();
+ bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
+ bearerData.messageId = 0;
+ bearerData.hasUserDataHeader = false;
+ String payloadStr = "test privacy indicator";
+ bearerData.userData = makeUserData(payloadStr);
+ bearerData.privacy = BearerData.PRIVACY_SECRET;
+ bearerData.privacyIndicatorSet = true;
+ byte []encodedSms = BearerData.encode(bearerData);
+ BearerData revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.privacyIndicatorSet, true);
+ assertEquals(revBearerData.privacy, BearerData.PRIVACY_SECRET);
+ bearerData.privacy = BearerData.PRIVACY_RESTRICTED;
+ encodedSms = BearerData.encode(bearerData);
+ revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.privacy, BearerData.PRIVACY_RESTRICTED);
+ }
- // String pdu1 = "0003104090010d4866a794e07055965b91d040300c0100"; sid 12
- // String pdu1 = "0003104090011748bea794e0731436ef3bd7c2e0352eef27a1c263fe58080d0101"; sid 13
- // Log.d(LOG_TAG, "revBearerData -- " + revBearerData);
+ @SmallTest
+ public void testMsgDeliveryAlert() throws Exception {
+ String pdu1 = "0003104090010d4866a794e07055965b91d040300c0100";
+ BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
+ assertEquals(bd1.alert, 0);
+ assertEquals(bd1.userData.payloadStr, "Test Alert 0");
+ String pdu2 = "0003104090010d4866a794e07055965b91d140300c0140";
+ BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
+ assertEquals(bd2.alert, 1);
+ assertEquals(bd2.userData.payloadStr, "Test Alert 1");
+ String pdu3 = "0003104090010d4866a794e07055965b91d240300c0180";
+ BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
+ assertEquals(bd3.alert, 2);
+ assertEquals(bd3.userData.payloadStr, "Test Alert 2");
+ String pdu4 = "0003104090010d4866a794e07055965b91d340300c01c0";
+ BearerData bd4 = BearerData.decode(HexDump.hexStringToByteArray(pdu4));
+ assertEquals(bd4.alert, 3);
+ assertEquals(bd4.userData.payloadStr, "Test Alert 3");
+ }
+
+ @SmallTest
+ public void testMsgDeliveryAlertFeedback() throws Exception {
+ BearerData bearerData = new BearerData();
+ bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
+ bearerData.messageId = 0;
+ bearerData.hasUserDataHeader = false;
+ String payloadStr = "test message delivery alert";
+ bearerData.userData = makeUserData(payloadStr);
+ bearerData.alert = BearerData.ALERT_MEDIUM_PRIO;
+ bearerData.alertIndicatorSet = true;
+ byte []encodedSms = BearerData.encode(bearerData);
+ BearerData revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.alertIndicatorSet, true);
+ assertEquals(revBearerData.alert, bearerData.alert);
+ bearerData.alert = BearerData.ALERT_HIGH_PRIO;
+ encodedSms = BearerData.encode(bearerData);
+ revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.alertIndicatorSet, true);
+ assertEquals(revBearerData.alert, bearerData.alert);
+ }
+ @SmallTest
+ public void testLanguageIndicator() throws Exception {
+ String pdu1 = "0003104090011748bea794e0731436ef3bd7c2e0352eef27a1c263fe58080d0101";
+ BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
+ assertEquals(bd1.userData.payloadStr, "Test Language indicator");
+ assertEquals(bd1.language, BearerData.LANGUAGE_ENGLISH);
+ String pdu2 = "0003104090011748bea794e0731436ef3bd7c2e0352eef27a1c263fe58080d0106";
+ BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
+ assertEquals(bd2.userData.payloadStr, "Test Language indicator");
+ assertEquals(bd2.language, BearerData.LANGUAGE_CHINESE);
+ }
+
+ @SmallTest
+ public void testLanguageIndicatorFeedback() throws Exception {
+ BearerData bearerData = new BearerData();
+ bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
+ bearerData.messageId = 0;
+ bearerData.hasUserDataHeader = false;
+ String payloadStr = "test language indicator";
+ bearerData.userData = makeUserData(payloadStr);
+ bearerData.language = BearerData.LANGUAGE_ENGLISH;
+ bearerData.languageIndicatorSet = true;
+ byte []encodedSms = BearerData.encode(bearerData);
+ BearerData revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.languageIndicatorSet, true);
+ assertEquals(revBearerData.language, bearerData.language);
+ bearerData.language = BearerData.LANGUAGE_KOREAN;
+ encodedSms = BearerData.encode(bearerData);
+ revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.languageIndicatorSet, true);
+ assertEquals(revBearerData.language, bearerData.language);
+ }
+
+ @SmallTest
+ public void testDisplayMode() throws Exception {
+ String pdu1 = "0003104090010c485f4194dfea34becf61b8400f0100";
+ BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
+ //Log.d(LOG_TAG, "bd1 = " + bd1);
+ assertEquals(bd1.displayMode, BearerData.DISPLAY_MODE_IMMEDIATE);
+ String pdu2 = "0003104090010c485f4194dfea34becf61b8400f0140";
+ BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
+ assertEquals(bd2.displayMode, BearerData.DISPLAY_MODE_DEFAULT);
+ String pdu3 = "0003104090010c485f4194dfea34becf61b8400f0180";
+ BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
+ assertEquals(bd3.displayMode, BearerData.DISPLAY_MODE_USER);
+ }
+
+ @SmallTest
+ public void testDisplayModeFeedback() throws Exception {
+ BearerData bearerData = new BearerData();
+ bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
+ bearerData.messageId = 0;
+ bearerData.hasUserDataHeader = false;
+ String payloadStr = "test display mode";
+ bearerData.userData = makeUserData(payloadStr);
+ bearerData.displayMode = BearerData.DISPLAY_MODE_IMMEDIATE;
+ bearerData.displayModeSet = true;
+ byte []encodedSms = BearerData.encode(bearerData);
+ BearerData revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.displayModeSet, true);
+ assertEquals(revBearerData.displayMode, bearerData.displayMode);
+ bearerData.displayMode = BearerData.DISPLAY_MODE_USER;
+ encodedSms = BearerData.encode(bearerData);
+ revBearerData = BearerData.decode(encodedSms);
+ assertEquals(revBearerData.userData.payloadStr, payloadStr);
+ assertEquals(revBearerData.displayModeSet, true);
+ assertEquals(revBearerData.displayMode, bearerData.displayMode);
+ }
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
index 09e3b02..f3c1542 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
@@ -23,27 +23,11 @@ import android.app.ISearchManager;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
import android.os.ServiceManager;
-import android.server.search.SearchableInfo;
-import android.server.search.SearchableInfo.ActionKeyInfo;
-import android.test.ActivityInstrumentationTestCase;
-import android.test.MoreAsserts;
-import android.test.mock.MockContext;
-import android.test.mock.MockPackageManager;
+import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.AndroidRuntimeException;
-import android.view.KeyEvent;
-
-import java.util.ArrayList;
-import java.util.List;
/**
* To launch this test from the command line:
@@ -52,7 +36,7 @@ import java.util.List;
* -e class com.android.unit_tests.SearchManagerTest \
* com.android.unit_tests/android.test.InstrumentationTestRunner
*/
-public class SearchManagerTest extends ActivityInstrumentationTestCase<LocalActivity> {
+public class SearchManagerTest extends ActivityInstrumentationTestCase2<LocalActivity> {
// If non-zero, enable a set of tests that start and stop the search manager.
// This is currently disabled because it's causing an unwanted jump from the unit test
@@ -71,18 +55,6 @@ public class SearchManagerTest extends ActivityInstrumentationTestCase<LocalActi
* testSearchManagerInvocations()
* FIX - make it work again
* stress test with a very long string
- *
- * SearchableInfo tests
- * Mock the context so I can provide very specific input data
- * Confirm OK with "zero" searchables
- * Confirm "good" metadata read properly
- * Confirm "bad" metadata skipped properly
- * Confirm ordering of searchables
- * Confirm "good" actionkeys
- * confirm "bad" actionkeys are rejected
- * confirm XML ordering enforced (will fail today - bug in SearchableInfo)
- * findActionKey works
- * getIcon works
*
* SearchManager tests
* confirm proper identification of "default" activity based on policy, not hardcoded contacts
@@ -195,348 +167,6 @@ public class SearchManagerTest extends ActivityInstrumentationTestCase<LocalActi
searchManager.stopSearch();
}
}
-
- /**
- * The goal of this test is to confirm proper operation of the
- * SearchableInfo helper class.
- *
- * TODO: The metadata source needs to be mocked out because adding
- * searchability metadata via this test is causing it to leak into the
- * real system. So for now I'm just going to test for existence of the
- * GoogleSearch app (which is searchable).
- */
- @LargeTest
- public void testSearchableGoogleSearch() {
- // test basic array & hashmap
- SearchableInfo.buildSearchableList(mContext);
-
- // test linkage from another activity
- // TODO inject this via mocking into the package manager.
- // TODO for now, just check for searchable GoogleSearch app (this isn't really a unit test)
- ComponentName thisActivity = new ComponentName(
- "com.android.googlesearch",
- "com.android.googlesearch.GoogleSearch");
-
- SearchableInfo si = SearchableInfo.getSearchableInfo(mContext, thisActivity);
- assertNotNull(si);
- assertTrue(si.mSearchable);
- assertEquals(thisActivity, si.mSearchActivity);
-
- Context appContext = si.getActivityContext(mContext);
- assertNotNull(appContext);
- MoreAsserts.assertNotEqual(appContext, mContext);
- assertEquals("Google Search", appContext.getString(si.getHintId()));
- assertEquals("Google", appContext.getString(si.getLabelId()));
- }
-
- /**
- * Test that non-searchable activities return no searchable info (this would typically
- * trigger the use of the default searchable e.g. contacts)
- */
- @LargeTest
- public void testNonSearchable() {
- // test basic array & hashmap
- SearchableInfo.buildSearchableList(mContext);
-
- // confirm that we return null for non-searchy activities
- ComponentName nonActivity = new ComponentName(
- "com.android.unit_tests",
- "com.android.unit_tests.NO_SEARCH_ACTIVITY");
- SearchableInfo si = SearchableInfo.getSearchableInfo(mContext, nonActivity);
- assertNull(si);
- }
-
- /**
- * This is an attempt to run the searchable info list with a mocked context. Here are some
- * things I'd like to test.
- *
- * Confirm OK with "zero" searchables
- * Confirm "good" metadata read properly
- * Confirm "bad" metadata skipped properly
- * Confirm ordering of searchables
- * Confirm "good" actionkeys
- * confirm "bad" actionkeys are rejected
- * confirm XML ordering enforced (will fail today - bug in SearchableInfo)
- * findActionKey works
- * getIcon works
- */
- @LargeTest
- public void testSearchableMocked() {
- MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
- MyMockContext mockContext = new MyMockContext(mContext, mockPM);
- ArrayList<SearchableInfo> searchables;
- int count;
-
- // build item list with real-world source data
- mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_PASSTHROUGH);
- SearchableInfo.buildSearchableList(mockContext);
- // tests with "real" searchables (deprecate, this should be a unit test)
- searchables = SearchableInfo.getSearchablesList();
- count = searchables.size();
- assertTrue(count >= 1); // this isn't really a unit test
- checkSearchables(searchables);
-
- // build item list with mocked search data
- // this round of tests confirms good operations with "zero" searchables found
- // This should return either a null pointer or an empty list
- mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_MOCK_ZERO);
- SearchableInfo.buildSearchableList(mockContext);
- searchables = SearchableInfo.getSearchablesList();
- if (searchables != null) {
- count = searchables.size();
- assertTrue(count == 0);
- }
- }
-
- /**
- * Generic health checker for an array of searchables.
- *
- * This is designed to pass for any semi-legal searchable, without knowing much about
- * the format of the underlying data. It's fairly easy for a non-compliant application
- * to provide meta-data that will pass here (e.g. a non-existent suggestions authority).
- *
- * @param searchables The list of searchables to examine.
- */
- private void checkSearchables(ArrayList<SearchableInfo> searchablesList) {
- assertNotNull(searchablesList);
- int count = searchablesList.size();
- for (int ii = 0; ii < count; ii++) {
- SearchableInfo si = searchablesList.get(ii);
- assertNotNull(si);
- assertTrue(si.mSearchable);
- assertTrue(si.getLabelId() != 0); // This must be a useable string
- assertNotEmpty(si.mSearchActivity.getClassName());
- assertNotEmpty(si.mSearchActivity.getPackageName());
- if (si.getSuggestAuthority() != null) {
- // The suggestion fields are largely optional, so we'll just confirm basic health
- assertNotEmpty(si.getSuggestAuthority());
- assertNullOrNotEmpty(si.getSuggestPath());
- assertNullOrNotEmpty(si.getSuggestSelection());
- assertNullOrNotEmpty(si.getSuggestIntentAction());
- assertNullOrNotEmpty(si.getSuggestIntentData());
- }
- /* Add a way to get the entire action key list, then explicitly test its elements */
- /* For now, test the most common action key (CALL) */
- ActionKeyInfo ai = si.findActionKey(KeyEvent.KEYCODE_CALL);
- if (ai != null) {
- assertEquals(ai.mKeyCode, KeyEvent.KEYCODE_CALL);
- // one of these three fields must be non-null & non-empty
- boolean m1 = (ai.mQueryActionMsg != null) && (ai.mQueryActionMsg.length() > 0);
- boolean m2 = (ai.mSuggestActionMsg != null) && (ai.mSuggestActionMsg.length() > 0);
- boolean m3 = (ai.mSuggestActionMsgColumn != null) &&
- (ai.mSuggestActionMsgColumn.length() > 0);
- assertTrue(m1 || m2 || m3);
- }
-
- /*
- * Find ways to test these:
- *
- * private int mSearchMode
- * private Drawable mIcon
- */
-
- /*
- * Explicitly not tested here:
- *
- * Can be null, so not much to see:
- * public String mSearchHint
- * private String mZeroQueryBanner
- *
- * To be deprecated/removed, so don't bother:
- * public boolean mFilterMode
- * public boolean mQuickStart
- * private boolean mIconResized
- * private int mIconResizeWidth
- * private int mIconResizeHeight
- *
- * All of these are "internal" working variables, not part of any contract
- * private ActivityInfo mActivityInfo
- * private Rect mTempRect
- * private String mSuggestProviderPackage
- * private String mCacheActivityContext
- */
- }
- }
-
- /**
- * Combo assert for "string not null and not empty"
- */
- private void assertNotEmpty(final String s) {
- assertNotNull(s);
- MoreAsserts.assertNotEqual(s, "");
- }
-
- /**
- * Combo assert for "string null or (not null and not empty)"
- */
- private void assertNullOrNotEmpty(final String s) {
- if (s != null) {
- MoreAsserts.assertNotEqual(s, "");
- }
- }
-
- /**
- * This is a mock for context. Used to perform a true unit test on SearchableInfo.
- *
- */
- private class MyMockContext extends MockContext {
-
- protected Context mRealContext;
- protected PackageManager mPackageManager;
-
- /**
- * Constructor.
- *
- * @param realContext Please pass in a real context for some pass-throughs to function.
- */
- MyMockContext(Context realContext, PackageManager packageManager) {
- mRealContext = realContext;
- mPackageManager = packageManager;
- }
-
- /**
- * Resources. Pass through for now.
- */
- @Override
- public Resources getResources() {
- return mRealContext.getResources();
- }
-
- /**
- * Package manager. Pass through for now.
- */
- @Override
- public PackageManager getPackageManager() {
- return mPackageManager;
- }
-
- /**
- * Package manager. Pass through for now.
- */
- @Override
- public Context createPackageContext(String packageName, int flags)
- throws PackageManager.NameNotFoundException {
- return mRealContext.createPackageContext(packageName, flags);
- }
- }
-
-/**
- * This is a mock for package manager. Used to perform a true unit test on SearchableInfo.
- *
- */
- private class MyMockPackageManager extends MockPackageManager {
-
- public final static int SEARCHABLES_PASSTHROUGH = 0;
- public final static int SEARCHABLES_MOCK_ZERO = 1;
- public final static int SEARCHABLES_MOCK_ONEGOOD = 2;
- public final static int SEARCHABLES_MOCK_ONEGOOD_ONEBAD = 3;
-
- protected PackageManager mRealPackageManager;
- protected int mSearchablesMode;
-
- public MyMockPackageManager(PackageManager realPM) {
- mRealPackageManager = realPM;
- mSearchablesMode = SEARCHABLES_PASSTHROUGH;
- }
-
- /**
- * Set the mode for various tests.
- */
- public void setSearchablesMode(int newMode) {
- switch (newMode) {
- case SEARCHABLES_PASSTHROUGH:
- case SEARCHABLES_MOCK_ZERO:
- mSearchablesMode = newMode;
- break;
-
- default:
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * Find activities that support a given intent.
- *
- * Retrieve all activities that can be performed for the given intent.
- *
- * @param intent The desired intent as per resolveActivity().
- * @param flags Additional option flags. The most important is
- * MATCH_DEFAULT_ONLY, to limit the resolution to only
- * those activities that support the CATEGORY_DEFAULT.
- *
- * @return A List<ResolveInfo> containing one entry for each matching
- * Activity. These are ordered from best to worst match -- that
- * is, the first item in the list is what is returned by
- * resolveActivity(). If there are no matching activities, an empty
- * list is returned.
- */
- @Override
- public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
- assertNotNull(intent);
- assertEquals(intent.getAction(), Intent.ACTION_SEARCH);
- switch (mSearchablesMode) {
- case SEARCHABLES_PASSTHROUGH:
- return mRealPackageManager.queryIntentActivities(intent, flags);
- case SEARCHABLES_MOCK_ZERO:
- return null;
- default:
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * Retrieve an XML file from a package. This is a low-level API used to
- * retrieve XML meta data.
- *
- * @param packageName The name of the package that this xml is coming from.
- * Can not be null.
- * @param resid The resource identifier of the desired xml. Can not be 0.
- * @param appInfo Overall information about <var>packageName</var>. This
- * may be null, in which case the application information will be retrieved
- * for you if needed; if you already have this information around, it can
- * be much more efficient to supply it here.
- *
- * @return Returns an XmlPullParser allowing you to parse out the XML
- * data. Returns null if the xml resource could not be found for any
- * reason.
- */
- @Override
- public XmlResourceParser getXml(String packageName, int resid, ApplicationInfo appInfo) {
- assertNotNull(packageName);
- MoreAsserts.assertNotEqual(packageName, "");
- MoreAsserts.assertNotEqual(resid, 0);
- switch (mSearchablesMode) {
- case SEARCHABLES_PASSTHROUGH:
- return mRealPackageManager.getXml(packageName, resid, appInfo);
- case SEARCHABLES_MOCK_ZERO:
- default:
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * Find a single content provider by its base path name.
- *
- * @param name The name of the provider to find.
- * @param flags Additional option flags. Currently should always be 0.
- *
- * @return ContentProviderInfo Information about the provider, if found,
- * else null.
- */
- @Override
- public ProviderInfo resolveContentProvider(String name, int flags) {
- assertNotNull(name);
- MoreAsserts.assertNotEqual(name, "");
- assertEquals(flags, 0);
- switch (mSearchablesMode) {
- case SEARCHABLES_PASSTHROUGH:
- return mRealPackageManager.resolveContentProvider(name, flags);
- case SEARCHABLES_MOCK_ZERO:
- default:
- throw new UnsupportedOperationException();
- }
- }
- }
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
new file mode 100644
index 0000000..743c979
--- /dev/null
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
@@ -0,0 +1,445 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.unit_tests;
+
+import android.app.SearchManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+import android.os.RemoteException;
+import android.server.search.SearchableInfo;
+import android.server.search.Searchables;
+import android.server.search.SearchableInfo.ActionKeyInfo;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+import android.test.mock.MockContext;
+import android.test.mock.MockPackageManager;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.KeyEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * To launch this test from the command line:
+ *
+ * adb shell am instrument -w \
+ * -e class com.android.unit_tests.SearchablesTest \
+ * com.android.unit_tests/android.test.InstrumentationTestRunner
+ */
+@SmallTest
+public class SearchablesTest extends AndroidTestCase {
+
+ /*
+ * SearchableInfo tests
+ * Mock the context so I can provide very specific input data
+ * Confirm OK with "zero" searchables
+ * Confirm "good" metadata read properly
+ * Confirm "bad" metadata skipped properly
+ * Confirm ordering of searchables
+ * Confirm "good" actionkeys
+ * confirm "bad" actionkeys are rejected
+ * confirm XML ordering enforced (will fail today - bug in SearchableInfo)
+ * findActionKey works
+ * getIcon works
+ */
+
+ /**
+ * The goal of this test is to confirm proper operation of the
+ * SearchableInfo helper class.
+ *
+ * TODO: The metadata source needs to be mocked out because adding
+ * searchability metadata via this test is causing it to leak into the
+ * real system. So for now I'm just going to test for existence of the
+ * GoogleSearch app (which is searchable).
+ */
+ public void testSearchableGoogleSearch() {
+ // test basic array & hashmap
+ Searchables searchables = new Searchables(mContext);
+ searchables.buildSearchableList();
+
+ // test linkage from another activity
+ // TODO inject this via mocking into the package manager.
+ // TODO for now, just check for searchable GoogleSearch app (this isn't really a unit test)
+ ComponentName thisActivity = new ComponentName(
+ "com.android.googlesearch",
+ "com.android.googlesearch.GoogleSearch");
+
+ SearchableInfo si = searchables.getSearchableInfo(thisActivity);
+ assertNotNull(si);
+ assertTrue(si.mSearchable);
+ assertEquals(thisActivity, si.mSearchActivity);
+
+ Context appContext = si.getActivityContext(mContext);
+ assertNotNull(appContext);
+ MoreAsserts.assertNotEqual(appContext, mContext);
+ assertEquals("Google Search", appContext.getString(si.getHintId()));
+ assertEquals("Google", appContext.getString(si.getLabelId()));
+ }
+
+ /**
+ * Test that non-searchable activities return no searchable info (this would typically
+ * trigger the use of the default searchable e.g. contacts)
+ */
+ public void testNonSearchable() {
+ // test basic array & hashmap
+ Searchables searchables = new Searchables(mContext);
+ searchables.buildSearchableList();
+
+ // confirm that we return null for non-searchy activities
+ ComponentName nonActivity = new ComponentName(
+ "com.android.unit_tests",
+ "com.android.unit_tests.NO_SEARCH_ACTIVITY");
+ SearchableInfo si = searchables.getSearchableInfo(nonActivity);
+ assertNull(si);
+ }
+
+ /**
+ * Test that there is a default searchable (aka global search provider).
+ */
+ public void testDefaultSearchable() {
+ Searchables searchables = new Searchables(mContext);
+ searchables.buildSearchableList();
+ SearchableInfo si = searchables.getDefaultSearchable();
+ checkSearchable(si);
+ assertTrue(searchables.isDefaultSearchable(si));
+ }
+
+ /**
+ * This is an attempt to run the searchable info list with a mocked context. Here are some
+ * things I'd like to test.
+ *
+ * Confirm OK with "zero" searchables
+ * Confirm "good" metadata read properly
+ * Confirm "bad" metadata skipped properly
+ * Confirm ordering of searchables
+ * Confirm "good" actionkeys
+ * confirm "bad" actionkeys are rejected
+ * confirm XML ordering enforced (will fail today - bug in SearchableInfo)
+ * findActionKey works
+ * getIcon works
+
+ */
+ public void testSearchablesListReal() {
+ MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
+ MyMockContext mockContext = new MyMockContext(mContext, mockPM);
+
+ // build item list with real-world source data
+ mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_PASSTHROUGH);
+ Searchables searchables = new Searchables(mockContext);
+ searchables.buildSearchableList();
+ // tests with "real" searchables (deprecate, this should be a unit test)
+ ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
+ int count = searchablesList.size();
+ assertTrue(count >= 1); // this isn't really a unit test
+ checkSearchables(searchablesList);
+ ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
+ checkSearchables(global);
+ }
+
+ /**
+ * This round of tests confirms good operations with "zero" searchables found
+ */
+ public void testSearchablesListEmpty() {
+ MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
+ MyMockContext mockContext = new MyMockContext(mContext, mockPM);
+
+ mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_MOCK_ZERO);
+ Searchables searchables = new Searchables(mockContext);
+ searchables.buildSearchableList();
+ ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
+ assertNotNull(searchablesList);
+ MoreAsserts.assertEmpty(searchablesList);
+ ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
+ MoreAsserts.assertEmpty(global);
+ }
+
+ /**
+ * Generic health checker for an array of searchables.
+ *
+ * This is designed to pass for any semi-legal searchable, without knowing much about
+ * the format of the underlying data. It's fairly easy for a non-compliant application
+ * to provide meta-data that will pass here (e.g. a non-existent suggestions authority).
+ *
+ * @param searchables The list of searchables to examine.
+ */
+ private void checkSearchables(ArrayList<SearchableInfo> searchablesList) {
+ assertNotNull(searchablesList);
+ int count = searchablesList.size();
+ for (int ii = 0; ii < count; ii++) {
+ SearchableInfo si = searchablesList.get(ii);
+ checkSearchable(si);
+ }
+ }
+
+ private void checkSearchable(SearchableInfo si) {
+ assertNotNull(si);
+ assertTrue(si.mSearchable);
+ assertTrue(si.getLabelId() != 0); // This must be a useable string
+ assertNotEmpty(si.mSearchActivity.getClassName());
+ assertNotEmpty(si.mSearchActivity.getPackageName());
+ if (si.getSuggestAuthority() != null) {
+ // The suggestion fields are largely optional, so we'll just confirm basic health
+ assertNotEmpty(si.getSuggestAuthority());
+ assertNullOrNotEmpty(si.getSuggestPath());
+ assertNullOrNotEmpty(si.getSuggestSelection());
+ assertNullOrNotEmpty(si.getSuggestIntentAction());
+ assertNullOrNotEmpty(si.getSuggestIntentData());
+ }
+ /* Add a way to get the entire action key list, then explicitly test its elements */
+ /* For now, test the most common action key (CALL) */
+ ActionKeyInfo ai = si.findActionKey(KeyEvent.KEYCODE_CALL);
+ if (ai != null) {
+ assertEquals(ai.mKeyCode, KeyEvent.KEYCODE_CALL);
+ // one of these three fields must be non-null & non-empty
+ boolean m1 = (ai.mQueryActionMsg != null) && (ai.mQueryActionMsg.length() > 0);
+ boolean m2 = (ai.mSuggestActionMsg != null) && (ai.mSuggestActionMsg.length() > 0);
+ boolean m3 = (ai.mSuggestActionMsgColumn != null) &&
+ (ai.mSuggestActionMsgColumn.length() > 0);
+ assertTrue(m1 || m2 || m3);
+ }
+
+ /*
+ * Find ways to test these:
+ *
+ * private int mSearchMode
+ * private Drawable mIcon
+ */
+
+ /*
+ * Explicitly not tested here:
+ *
+ * Can be null, so not much to see:
+ * public String mSearchHint
+ * private String mZeroQueryBanner
+ *
+ * To be deprecated/removed, so don't bother:
+ * public boolean mFilterMode
+ * public boolean mQuickStart
+ * private boolean mIconResized
+ * private int mIconResizeWidth
+ * private int mIconResizeHeight
+ *
+ * All of these are "internal" working variables, not part of any contract
+ * private ActivityInfo mActivityInfo
+ * private Rect mTempRect
+ * private String mSuggestProviderPackage
+ * private String mCacheActivityContext
+ */
+ }
+
+ /**
+ * Combo assert for "string not null and not empty"
+ */
+ private void assertNotEmpty(final String s) {
+ assertNotNull(s);
+ MoreAsserts.assertNotEqual(s, "");
+ }
+
+ /**
+ * Combo assert for "string null or (not null and not empty)"
+ */
+ private void assertNullOrNotEmpty(final String s) {
+ if (s != null) {
+ MoreAsserts.assertNotEqual(s, "");
+ }
+ }
+
+ /**
+ * This is a mock for context. Used to perform a true unit test on SearchableInfo.
+ *
+ */
+ private class MyMockContext extends MockContext {
+
+ protected Context mRealContext;
+ protected PackageManager mPackageManager;
+
+ /**
+ * Constructor.
+ *
+ * @param realContext Please pass in a real context for some pass-throughs to function.
+ */
+ MyMockContext(Context realContext, PackageManager packageManager) {
+ mRealContext = realContext;
+ mPackageManager = packageManager;
+ }
+
+ /**
+ * Resources. Pass through for now.
+ */
+ @Override
+ public Resources getResources() {
+ return mRealContext.getResources();
+ }
+
+ /**
+ * Package manager. Pass through for now.
+ */
+ @Override
+ public PackageManager getPackageManager() {
+ return mPackageManager;
+ }
+
+ /**
+ * Package manager. Pass through for now.
+ */
+ @Override
+ public Context createPackageContext(String packageName, int flags)
+ throws PackageManager.NameNotFoundException {
+ return mRealContext.createPackageContext(packageName, flags);
+ }
+ }
+
+/**
+ * This is a mock for package manager. Used to perform a true unit test on SearchableInfo.
+ *
+ */
+ private class MyMockPackageManager extends MockPackageManager {
+
+ public final static int SEARCHABLES_PASSTHROUGH = 0;
+ public final static int SEARCHABLES_MOCK_ZERO = 1;
+ public final static int SEARCHABLES_MOCK_ONEGOOD = 2;
+ public final static int SEARCHABLES_MOCK_ONEGOOD_ONEBAD = 3;
+
+ protected PackageManager mRealPackageManager;
+ protected int mSearchablesMode;
+
+ public MyMockPackageManager(PackageManager realPM) {
+ mRealPackageManager = realPM;
+ mSearchablesMode = SEARCHABLES_PASSTHROUGH;
+ }
+
+ /**
+ * Set the mode for various tests.
+ */
+ public void setSearchablesMode(int newMode) {
+ switch (newMode) {
+ case SEARCHABLES_PASSTHROUGH:
+ case SEARCHABLES_MOCK_ZERO:
+ mSearchablesMode = newMode;
+ break;
+
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * Find activities that support a given intent.
+ *
+ * Retrieve all activities that can be performed for the given intent.
+ *
+ * @param intent The desired intent as per resolveActivity().
+ * @param flags Additional option flags. The most important is
+ * MATCH_DEFAULT_ONLY, to limit the resolution to only
+ * those activities that support the CATEGORY_DEFAULT.
+ *
+ * @return A List<ResolveInfo> containing one entry for each matching
+ * Activity. These are ordered from best to worst match -- that
+ * is, the first item in the list is what is returned by
+ * resolveActivity(). If there are no matching activities, an empty
+ * list is returned.
+ */
+ @Override
+ public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
+ assertNotNull(intent);
+ assertEquals(intent.getAction(), Intent.ACTION_SEARCH);
+ switch (mSearchablesMode) {
+ case SEARCHABLES_PASSTHROUGH:
+ return mRealPackageManager.queryIntentActivities(intent, flags);
+ case SEARCHABLES_MOCK_ZERO:
+ return null;
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ @Override
+ public ResolveInfo resolveActivity(Intent intent, int flags) {
+ assertNotNull(intent);
+ assertEquals(intent.getAction(), SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
+ switch (mSearchablesMode) {
+ case SEARCHABLES_PASSTHROUGH:
+ return mRealPackageManager.resolveActivity(intent, flags);
+ case SEARCHABLES_MOCK_ZERO:
+ return null;
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * Retrieve an XML file from a package. This is a low-level API used to
+ * retrieve XML meta data.
+ *
+ * @param packageName The name of the package that this xml is coming from.
+ * Can not be null.
+ * @param resid The resource identifier of the desired xml. Can not be 0.
+ * @param appInfo Overall information about <var>packageName</var>. This
+ * may be null, in which case the application information will be retrieved
+ * for you if needed; if you already have this information around, it can
+ * be much more efficient to supply it here.
+ *
+ * @return Returns an XmlPullParser allowing you to parse out the XML
+ * data. Returns null if the xml resource could not be found for any
+ * reason.
+ */
+ @Override
+ public XmlResourceParser getXml(String packageName, int resid, ApplicationInfo appInfo) {
+ assertNotNull(packageName);
+ MoreAsserts.assertNotEqual(packageName, "");
+ MoreAsserts.assertNotEqual(resid, 0);
+ switch (mSearchablesMode) {
+ case SEARCHABLES_PASSTHROUGH:
+ return mRealPackageManager.getXml(packageName, resid, appInfo);
+ case SEARCHABLES_MOCK_ZERO:
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * Find a single content provider by its base path name.
+ *
+ * @param name The name of the provider to find.
+ * @param flags Additional option flags. Currently should always be 0.
+ *
+ * @return ContentProviderInfo Information about the provider, if found,
+ * else null.
+ */
+ @Override
+ public ProviderInfo resolveContentProvider(String name, int flags) {
+ assertNotNull(name);
+ MoreAsserts.assertNotEqual(name, "");
+ assertEquals(flags, 0);
+ switch (mSearchablesMode) {
+ case SEARCHABLES_PASSTHROUGH:
+ return mRealPackageManager.resolveContentProvider(name, flags);
+ case SEARCHABLES_MOCK_ZERO:
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+ }
+}
+
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
index 1ea83c3..e6639d3 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
@@ -98,7 +98,7 @@ public class ConfigTest extends AndroidTestCase {
mMetrics = new DisplayMetrics();
mMetrics.widthPixels = 200;
mMetrics.heightPixels = 320;
- mMetrics.density = 120;
+ mMetrics.density = 1;
}
void setProperty(properties p, int value) {
@@ -131,7 +131,9 @@ public class ConfigTest extends AndroidTestCase {
mMetrics.heightPixels = value;
break;
case DENSITY:
- mMetrics.density = value;
+ // this is the ratio from the standard
+
+ mMetrics.density = (((float)value)/((float)DisplayMetrics.DEFAULT_DENSITY));
break;
default:
assert(false);
@@ -187,18 +189,16 @@ public class ConfigTest extends AndroidTestCase {
*/
TotalConfig config = new TotalConfig();
Resources res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple default");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag default"});
+ checkValue(res, R.configVarying.simple, "simple default");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx");
res = config.getResources();
-// got simple xx 32dpi
-// checkValue(res, R.configVarying.simple, "simple xx");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag xx"});
+ checkValue(res, R.configVarying.simple, "simple xx");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag xx"});
config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx");
@@ -225,155 +225,160 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig();
config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_NOTOUCH);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple notouch");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag notouch"});
+ checkValue(res, R.configVarying.simple, "simple notouch");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag notouch"});
config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_FINGER);
+ config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple finger");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag finger"});
+ checkValue(res, R.configVarying.simple, "simple stylus");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag stylus"});
config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
+ config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
res = config.getResources();
-// got simple 32dpi stylus
-// checkValue(res, R.configVarying.simple, "simple stylus");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag stylus"});
+ checkValue(res, R.configVarying.simple, "simple nokeys");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag nokeys"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_NOKEYS);
+ config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple nokeys");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag nokeys"});
+ checkValue(res, R.configVarying.simple, "simple 12key");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 12key"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_QWERTY);
+ config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple qwerty");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag qwerty"});
+ checkValue(res, R.configVarying.simple, "simple keysexposed");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag keysexposed"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
+ config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 12key");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 12key"});
+ checkValue(res, R.configVarying.simple, "simple nonav");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag nonav"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_YES);
+ config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple keyshidden");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag keyshidden"});
+ checkValue(res, R.configVarying.simple, "simple dpad");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag dpad"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
res = config.getResources();
-// got simple 32dpi keysexposed
-// checkValue(res, R.configVarying.simple, "simple keysexposed");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag keysexposed"});
+ checkValue(res, R.configVarying.simple, "simple wheel");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag wheel"});
config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_NONAV);
+ config.setProperty(properties.HEIGHT, 480);
+ config.setProperty(properties.WIDTH, 320);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple nonav");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag nonav"});
+ checkValue(res, R.configVarying.simple, "simple 480x320");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 480x320"});
config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
+ config.setProperty(properties.DENSITY, 240);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple dpad");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag dpad"});
+ checkValue(res, R.configVarying.simple, "simple 240dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 240dpi"});
config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_TRACKBALL);
+ config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple trackball");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag trackball"});
+ checkValue(res, R.configVarying.simple, "simple landscape");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag landscape"});
config = new TotalConfig();
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_WHEEL);
+ config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple wheel");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag wheel"});
+ checkValue(res, R.configVarying.simple, "simple square");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag square"});
+ }
+
+ @MediumTest
+ public void testDensity() throws Exception {
+ // have 32, 240 and the default 160 content.
+ // rule is that closest wins, with down scaling (larger content)
+ // being twice as nice as upscaling.
+ // transition at H/2 * (-1 +/- sqrt(1+8L/H))
+ // SO, X < 49 goes to 32
+ // 49 >= X < 182 goes to 160
+ // X >= 182 goes to 240
+ TotalConfig config = new TotalConfig();
+ config.setProperty(properties.DENSITY, 2);
+ Resources res = config.getResources();
+ checkValue(res, R.configVarying.simple, "simple 32dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
- config.setProperty(properties.HEIGHT, 320);
- config.setProperty(properties.WIDTH, 200);
+ config.setProperty(properties.DENSITY, 32);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 320x200");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 320x200"});
+ checkValue(res, R.configVarying.simple, "simple 32dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
- config.setProperty(properties.HEIGHT, 480);
- config.setProperty(properties.WIDTH, 320);
+ config.setProperty(properties.DENSITY, 48);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 480x320");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 480x320"});
+ checkValue(res, R.configVarying.simple, "simple 32dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 32dpi"});
config = new TotalConfig();
- config.setProperty(properties.DENSITY, 240);
+ config.setProperty(properties.DENSITY, 49);
res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 240dpi");
+ checkValue(res, R.configVarying.simple, "simple default");
checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 240dpi"});
+ R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
- config.setProperty(properties.DENSITY, 120);
+ config.setProperty(properties.DENSITY, 150);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 120dpi");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 120dpi"});
+ checkValue(res, R.configVarying.simple, "simple default");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_LANDSCAPE);
+ config.setProperty(properties.DENSITY, 181);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple landscape");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag landscape"});
+ checkValue(res, R.configVarying.simple, "simple default");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag default"});
config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_PORTRAIT);
+ config.setProperty(properties.DENSITY, 182);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple portrait");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag portrait"});
+ checkValue(res, R.configVarying.simple, "simple 240dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 240dpi"});
config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.DENSITY, 239);
res = config.getResources();
-// got simple square 32dpi
-// checkValue(res, R.configVarying.simple, "simple square");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag square"});
+ checkValue(res, R.configVarying.simple, "simple 240dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 240dpi"});
+
+ config = new TotalConfig();
+ config.setProperty(properties.DENSITY, 490);
+ res = config.getResources();
+ checkValue(res, R.configVarying.simple, "simple 240dpi");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 240dpi"});
}
// TODO - add tests for special cases - ie, other key params seem ignored if
@@ -407,10 +412,9 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig();
config.setProperty(properties.MNC, 333);
res = config.getResources();
-// got simple 24dpi
-// checkValue(res, R.configVarying.simple, "simple default");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag default"});
+ checkValue(res, R.configVarying.simple, "simple default");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag default"});
}
@MediumTest
@@ -419,13 +423,31 @@ public class ConfigTest extends AndroidTestCase {
* Verify that in cases of ties, the specific ordering is followed
*/
- /* full A + B + C doesn't exist. Do we get A + C or B + C?
+ /**
+ * Precidence order: mcc, mnc, locale, orientation, density,
+ * touchscreen, hidden, keyboard, navigation, width-height
+ */
+
+ /**
+ * verify mcc trumps mnc. Have 110-xx, 220-xx but no 110-220
+ * so with is selected? Should be mcc110-xx.
*/
TotalConfig config = new TotalConfig();
+ config.setProperty(properties.MCC, 110);
+ config.setProperty(properties.MNC, 220);
+ config.setProperty(properties.LANGUAGE, "xx");
+ Resources res = config.getResources();
+ checkValue(res, R.configVarying.simple, "simple mcc110 xx");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag mcc110 xx"});
+
+ /* full A + B + C doesn't exist. Do we get A + C or B + C?
+ */
+ config = new TotalConfig();
config.setProperty(properties.MCC, 111);
config.setProperty(properties.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx");
- Resources res = config.getResources();
+ res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mcc111 mnc222");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag mcc111 mnc222"});
@@ -433,7 +455,8 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig();
config.setProperty(properties.MNC, 222);
config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple mnc222 xx");
checkValue(res, R.configVarying.bag,
@@ -441,60 +464,77 @@ public class ConfigTest extends AndroidTestCase {
config = new TotalConfig();
config.setProperty(properties.LANGUAGE, "xx");
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
config.setProperty(properties.DENSITY, 32);
res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple xx 32dpi");
+ checkValue(res, R.configVarying.simple, "simple xx square");
checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag xx 32dpi"});
+ R.styleable.TestConfig, new String[]{"bag xx square"});
config = new TotalConfig();
- config.setProperty(properties.ORIENTATION, Configuration.ORIENTATION_SQUARE);
+ config.setProperty(properties.ORIENTATION,
+ Configuration.ORIENTATION_SQUARE);
config.setProperty(properties.DENSITY, 32);
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
+ config.setProperty(properties.TOUCHSCREEN,
+ Configuration.TOUCHSCREEN_STYLUS);
res = config.getResources();
- checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
+ checkValue(res, R.configVarying.simple, "simple square 32dpi");
checkValue(res, R.configVarying.bag,
- R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
+ R.styleable.TestConfig, new String[]{"bag square 32dpi"});
config = new TotalConfig();
config.setProperty(properties.DENSITY, 32);
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.TOUCHSCREEN,
+ Configuration.TOUCHSCREEN_STYLUS);
+ config.setProperty(properties.KEYBOARDHIDDEN,
+ Configuration.KEYBOARDHIDDEN_NO);
res = config.getResources();
checkValue(res, R.configVarying.simple, "simple 32dpi stylus");
checkValue(res, R.configVarying.bag,
R.styleable.TestConfig, new String[]{"bag 32dpi stylus"});
config = new TotalConfig();
- config.setProperty(properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_STYLUS);
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.TOUCHSCREEN,
+ Configuration.TOUCHSCREEN_STYLUS);
+ config.setProperty(properties.KEYBOARDHIDDEN,
+ Configuration.KEYBOARDHIDDEN_NO);
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
res = config.getResources();
-// got simple 32dpi stylus
-// checkValue(res, R.configVarying.simple, "simple stylus 12key");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag stylus 12key"});
+ checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
config = new TotalConfig();
- config.setProperty(properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_NO);
+ config.setProperty(properties.KEYBOARDHIDDEN,
+ Configuration.KEYBOARDHIDDEN_NO);
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
+ config.setProperty(properties.NAVIGATION,
+ Configuration.NAVIGATION_DPAD);
res = config.getResources();
-// got simple 32dpi exposed
-// checkValue(res, R.configVarying.simple, "simple stylus keysexposed");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag stylus keysexposed"});
+ checkValue(res, R.configVarying.simple, "simple keysexposed 12key");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag keysexposed 12key"});
config = new TotalConfig();
config.setProperty(properties.KEYBOARD, Configuration.KEYBOARD_12KEY);
- config.setProperty(properties.NAVIGATION, Configuration.NAVIGATION_DPAD);
+ config.setProperty(properties.NAVIGATION,
+ Configuration.NAVIGATION_DPAD);
config.setProperty(properties.HEIGHT, 63);
config.setProperty(properties.WIDTH, 57);
res = config.getResources();
-// got simple 240dpi
-// checkValue(res, R.configVarying.simple, "simple 12key dpad");
-// checkValue(res, R.configVarying.bag,
-// R.styleable.TestConfig, new String[]{"bag 12key dpad"});
+ checkValue(res, R.configVarying.simple, "simple 12key dpad");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag 12key dpad"});
+
+ config = new TotalConfig();
+ config.setProperty(properties.NAVIGATION,
+ Configuration.NAVIGATION_DPAD);
+ config.setProperty(properties.HEIGHT, 640);
+ config.setProperty(properties.WIDTH, 400);
+ res = config.getResources();
+ checkValue(res, R.configVarying.simple, "simple dpad");
+ checkValue(res, R.configVarying.bag,
+ R.styleable.TestConfig, new String[]{"bag dpad"});
}
}
diff --git a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java
index 663b7a4..6f89fce 100644
--- a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java
+++ b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java
@@ -147,4 +147,56 @@ public class AutoCompleteTextViewPopup
// now try moving "down" - nothing should happen since there's no longer an adapter
sendKeys("DPAD_DOWN");
}
+
+ /** Test the show/hide behavior of the drop-down. */
+ @MediumTest
+ public void testPopupShow() throws Throwable {
+ AutoCompleteTextViewSimple theActivity = getActivity();
+ final AutoCompleteTextView textView = theActivity.getTextView();
+ final Instrumentation instrumentation = getInstrumentation();
+
+ // Drop-down should not be showing when no text has been entered
+ assertFalse("isPopupShowing() on start", textView.isPopupShowing());
+
+ // focus and type
+ textView.requestFocus();
+ instrumentation.waitForIdleSync();
+ sendKeys("A");
+
+ // Drop-down should now be visible
+ assertTrue("isPopupShowing() after typing", textView.isPopupShowing());
+
+ // Clear the text
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ textView.setText("");
+ }
+ });
+ instrumentation.waitForIdleSync();
+
+ // Drop-down should be hidden when text is cleared
+ assertFalse("isPopupShowing() after text cleared", textView.isPopupShowing());
+
+ // Set the text, without filtering
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ textView.setText("a", false);
+ }
+ });
+ instrumentation.waitForIdleSync();
+
+ // Drop-down should still be hidden
+ assertFalse("isPopupShowing() after setText(\"a\", false)", textView.isPopupShowing());
+
+ // Set the text, now with filtering
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ textView.setText("a");
+ }
+ });
+ instrumentation.waitForIdleSync();
+
+ // Drop-down should show up after setText() with filtering
+ assertTrue("isPopupShowing() after text set", textView.isPopupShowing());
+ }
}
diff --git a/tools/layoutlib/bridge/.gitignore b/tools/layoutlib/bridge/.gitignore
new file mode 100644
index 0000000..efa6632
--- /dev/null
+++ b/tools/layoutlib/bridge/.gitignore
@@ -0,0 +1 @@
+bin/* \ No newline at end of file
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 baa3d53..f434e14 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
@@ -1145,4 +1145,12 @@ public final class BridgeContext extends Context {
public Context getApplicationContext() {
throw new UnsupportedOperationException();
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public float getApplicationScale() {
+ throw new UnsupportedOperationException();
+ }
}