summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.xml357
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java9
-rw-r--r--core/java/android/accounts/AccountManagerService.java12
-rw-r--r--core/java/android/app/ActionBar.java62
-rw-r--r--core/java/android/app/Activity.java53
-rw-r--r--core/java/android/app/DownloadManager.java44
-rw-r--r--core/java/android/app/FragmentManager.java158
-rw-r--r--core/java/android/app/backup/BackupManager.java8
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl20
-rw-r--r--core/java/android/content/ContentQueryMap.java26
-rw-r--r--core/java/android/database/sqlite/SQLiteCursor.java11
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java54
-rw-r--r--core/java/android/os/Binder.java4
-rw-r--r--core/java/android/os/DropBoxManager.java7
-rw-r--r--core/java/android/os/StrictMode.java28
-rw-r--r--core/java/android/preference/Preference.java59
-rw-r--r--core/java/android/preference/PreferenceActivity.java11
-rw-r--r--core/java/android/provider/ContactsContract.java8
-rw-r--r--core/java/android/text/Layout.java28
-rw-r--r--core/java/android/view/WindowManager.java20
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java9
-rw-r--r--core/java/android/webkit/CookieSyncManager.java26
-rwxr-xr-xcore/java/android/webkit/GeolocationPermissions.java2
-rw-r--r--core/java/android/webkit/JniUtil.java61
-rw-r--r--core/java/android/webkit/WebView.java43
-rw-r--r--core/java/android/webkit/WebViewCore.java6
-rw-r--r--core/java/android/widget/AbsListView.java185
-rw-r--r--core/java/android/widget/GridView.java22
-rw-r--r--core/java/android/widget/ListView.java22
-rw-r--r--core/java/android/widget/Scroller.java100
-rw-r--r--core/java/android/widget/StackView.java39
-rw-r--r--core/java/android/widget/TextView.java17
-rw-r--r--core/java/com/android/internal/app/ActionBarImpl.java20
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl2
-rw-r--r--core/java/com/android/internal/view/menu/MenuPopupHelper.java6
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/res/res/drawable-hdpi/textfield_active_holo_dark.9.pngbin0 -> 1095 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_active_holo_light.9.pngbin0 -> 1095 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_default_holo_dark.9.pngbin187 -> 1082 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_default_holo_light.9.pngbin184 -> 1088 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.pngbin0 -> 1081 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.pngbin0 -> 1080 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.pngbin245 -> 1069 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.pngbin236 -> 1078 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.pngbin235 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.pngbin233 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.pngbin0 -> 1124 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.pngbin0 -> 1122 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.pngbin0 -> 1128 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.pngbin0 -> 1120 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.pngbin0 -> 1113 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.pngbin0 -> 1113 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.pngbin0 -> 1117 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.pngbin0 -> 1128 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_pressed.9.pngbin3986 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.pngbin179 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.pngbin187 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.pngbin179 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/textfield_selected_holo_light.9.pngbin187 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.pngbin0 -> 555 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.pngbin0 -> 565 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.pngbin0 -> 458 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.pngbin0 -> 472 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.pngbin0 -> 732 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.pngbin0 -> 664 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.pngbin0 -> 734 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.pngbin0 -> 573 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.pngbin0 -> 473 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.pngbin0 -> 493 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.pngbin0 -> 743 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.pngbin0 -> 537 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.pngbin0 -> 546 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.pngbin0 -> 552 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.pngbin0 -> 448 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.pngbin0 -> 455 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.pngbin0 -> 672 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.pngbin0 -> 656 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.pngbin0 -> 757 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.pngbin0 -> 560 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.pngbin0 -> 457 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.pngbin0 -> 470 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.pngbin0 -> 756 bytes
-rw-r--r--core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.pngbin0 -> 525 bytes
-rw-r--r--core/res/res/drawable-ldpi/textfield_pressed.9.pngbin642 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_active_holo_dark.9.pngbin0 -> 1070 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_active_holo_light.9.pngbin0 -> 1073 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_default_holo_dark.9.pngbin165 -> 1068 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_default_holo_light.9.pngbin165 -> 1071 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.pngbin0 -> 1075 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.pngbin0 -> 1075 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.pngbin214 -> 1067 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.pngbin206 -> 1069 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.pngbin228 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.pngbin219 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.pngbin0 -> 1103 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.pngbin0 -> 1105 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.pngbin0 -> 1101 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.pngbin0 -> 1106 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.pngbin0 -> 1110 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.pngbin0 -> 1110 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.pngbin0 -> 1090 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.pngbin0 -> 1107 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_pressed.9.pngbin1040 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.pngbin185 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.pngbin185 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.pngbin185 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/textfield_selected_holo_light.9.pngbin185 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.pngbin0 -> 588 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.pngbin0 -> 582 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.pngbin0 -> 491 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.pngbin0 -> 456 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.pngbin0 -> 728 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.pngbin0 -> 666 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.pngbin0 -> 718 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.pngbin0 -> 517 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.pngbin0 -> 492 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.pngbin0 -> 481 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.pngbin0 -> 737 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.pngbin0 -> 495 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.pngbin0 -> 571 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.pngbin0 -> 559 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.pngbin0 -> 484 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.pngbin0 -> 458 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.pngbin0 -> 711 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.pngbin0 -> 652 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.pngbin0 -> 703 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.pngbin0 -> 512 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.pngbin0 -> 472 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.pngbin0 -> 472 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.pngbin0 -> 717 bytes
-rw-r--r--core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.pngbin0 -> 480 bytes
-rw-r--r--core/res/res/drawable/edit_text.xml7
-rw-r--r--core/res/res/drawable/edit_text_holo_dark.xml11
-rw-r--r--core/res/res/drawable/edit_text_holo_light.xml11
-rw-r--r--core/res/res/drawable/edit_text_multiline_holo_dark.xml24
-rw-r--r--core/res/res/drawable/edit_text_multiline_holo_light.xml24
-rw-r--r--core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml24
-rw-r--r--core/res/res/layout-xlarge/status_bar_latest_event_content.xml45
-rw-r--r--core/res/res/layout/preference.xml20
-rw-r--r--core/res/res/layout/preference_child.xml22
-rw-r--r--core/res/res/values-cs/strings.xml63
-rw-r--r--core/res/res/values-da/strings.xml63
-rw-r--r--core/res/res/values-de/strings.xml63
-rw-r--r--core/res/res/values-el/strings.xml63
-rw-r--r--core/res/res/values-es-rUS/strings.xml72
-rw-r--r--core/res/res/values-es/strings.xml63
-rw-r--r--core/res/res/values-fr/strings.xml63
-rw-r--r--core/res/res/values-it/strings.xml63
-rw-r--r--core/res/res/values-ja/strings.xml63
-rw-r--r--core/res/res/values-ko/strings.xml63
-rw-r--r--core/res/res/values-land/dimens.xml4
-rw-r--r--core/res/res/values-nb/strings.xml63
-rw-r--r--core/res/res/values-nl/strings.xml63
-rw-r--r--core/res/res/values-pl/strings.xml63
-rw-r--r--core/res/res/values-pt-rPT/strings.xml63
-rw-r--r--core/res/res/values-pt/strings.xml63
-rw-r--r--core/res/res/values-rm/strings.xml4
-rw-r--r--core/res/res/values-ru/strings.xml63
-rw-r--r--core/res/res/values-sv/strings.xml63
-rw-r--r--core/res/res/values-tr/strings.xml63
-rw-r--r--core/res/res/values-xlarge/styles.xml2
-rw-r--r--core/res/res/values-zh-rCN/strings.xml63
-rw-r--r--core/res/res/values-zh-rTW/strings.xml63
-rwxr-xr-xcore/res/res/values/attrs.xml16
-rw-r--r--core/res/res/values/public.xml4
-rwxr-xr-xcore/res/res/values/strings.xml2
-rw-r--r--core/res/res/values/styles.xml1
-rw-r--r--core/res/res/values/themes.xml22
-rw-r--r--core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java15
-rw-r--r--core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java53
-rw-r--r--docs/html/guide/topics/manifest/manifest-element.jd5
-rw-r--r--docs/html/guide/topics/manifest/uses-feature-element.jd76
-rw-r--r--docs/html/guide/topics/resources/menu-resource.jd144
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java30
-rw-r--r--graphics/java/android/renderscript/Allocation.java2
-rw-r--r--graphics/java/android/renderscript/RenderScript.java13
-rw-r--r--graphics/java/android/renderscript/Script.java4
-rw-r--r--graphics/java/android/renderscript/ScriptC.java4
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp15
-rw-r--r--include/media/AudioSystem.h1
-rw-r--r--include/media/EffectApi.h6
-rw-r--r--include/media/IMediaPlayer.h1
-rw-r--r--include/media/IOMX.h38
-rw-r--r--include/media/MediaPlayerInterface.h1
-rw-r--r--include/media/stagefright/HardwareAPI.h9
-rw-r--r--include/media/stagefright/VideoRenderer.h41
-rw-r--r--include/ui/FramebufferNativeWindow.h3
-rw-r--r--libs/rs/java/Balls/src/com/android/balls/BallsRS.java14
-rw-r--r--libs/rs/java/Balls/src/com/android/balls/balls.rs9
-rw-r--r--libs/rs/rs.spec7
-rw-r--r--libs/rs/rsContext.cpp52
-rw-r--r--libs/rs/rsContext.h31
-rw-r--r--libs/rs/rsFont.cpp26
-rw-r--r--libs/rs/rsScript.cpp22
-rw-r--r--libs/rs/rsScript.h1
-rw-r--r--libs/rs/rsScriptC.cpp45
-rw-r--r--libs/rs/rsScriptC.h5
-rw-r--r--libs/rs/rsScriptC_LibGL.cpp16
-rw-r--r--libs/ui/FramebufferNativeWindow.cpp45
-rw-r--r--media/java/android/media/AudioManager.java11
-rw-r--r--media/java/android/media/AudioService.java3
-rw-r--r--media/java/android/media/AudioSystem.java3
-rw-r--r--media/java/android/media/MediaRecorder.java10
-rw-r--r--media/java/android/media/MediaScanner.java11
-rw-r--r--media/java/android/media/MtpDatabase.java15
-rwxr-xr-xmedia/java/android/media/videoeditor/AudioTrack.java9
-rwxr-xr-xmedia/java/android/media/videoeditor/Effect.java13
-rwxr-xr-xmedia/java/android/media/videoeditor/MediaImageItem.java40
-rwxr-xr-xmedia/java/android/media/videoeditor/MediaItem.java34
-rwxr-xr-xmedia/java/android/media/videoeditor/MediaVideoItem.java43
-rwxr-xr-xmedia/java/android/media/videoeditor/Overlay.java11
-rw-r--r--media/java/android/media/videoeditor/WaveformData.java4
-rw-r--r--media/jni/android_media_MtpDatabase.cpp7
-rw-r--r--media/libmedia/IMediaPlayer.cpp16
-rw-r--r--media/libmedia/IOMX.cpp128
-rw-r--r--media/libmedia/mediaplayer.cpp7
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp8
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.h1
-rw-r--r--media/libmediaplayerservice/MidiFile.h1
-rw-r--r--media/libmediaplayerservice/StagefrightPlayer.cpp7
-rw-r--r--media/libmediaplayerservice/StagefrightPlayer.h1
-rw-r--r--media/libmediaplayerservice/TestPlayerStub.h3
-rw-r--r--media/libstagefright/AwesomePlayer.cpp225
-rw-r--r--media/libstagefright/MPEG4Extractor.cpp145
-rw-r--r--media/libstagefright/colorconversion/SoftwareRenderer.cpp17
-rw-r--r--media/libstagefright/httplive/LiveSource.cpp14
-rw-r--r--media/libstagefright/include/AwesomePlayer.h2
-rw-r--r--media/libstagefright/include/MPEG4Extractor.h2
-rw-r--r--media/libstagefright/include/OMX.h7
-rw-r--r--media/libstagefright/include/SoftwareRenderer.h11
-rw-r--r--media/libstagefright/omx/OMX.cpp109
-rw-r--r--media/libstagefright/omx/OMXRenderer.h44
-rw-r--r--media/mtp/MtpDatabase.h1
-rw-r--r--media/mtp/MtpServer.cpp12
-rw-r--r--media/tests/players/invoke_mock_media_player.cpp1
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java19
-rw-r--r--packages/SystemUI/assets/fonts/AndroidClock.ttfbin0 -> 2336 bytes
-rw-r--r--packages/SystemUI/assets/fonts/AndroidClock2.ttfbin0 -> 2212 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_notification_open.pngbin0 -> 445 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.pngbin0 -> 247 bytes
-rw-r--r--packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.pngbin0 -> 60874 bytes
-rw-r--r--packages/SystemUI/res/drawable-nodpi/panel_notification.pngbin0 -> 226 bytes
-rw-r--r--packages/SystemUI/res/drawable/status_bar_item_background.xml26
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar.xml190
-rw-r--r--packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml21
-rw-r--r--packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml225
-rw-r--r--packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml1
-rw-r--r--packages/SystemUI/res/values-cs-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml2
-rw-r--r--packages/SystemUI/res/values-da-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-da/strings.xml2
-rw-r--r--packages/SystemUI/res/values-de-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-de/strings.xml2
-rw-r--r--packages/SystemUI/res/values-el-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-el/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es-rUS-xlarge/strings.xml31
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml5
-rw-r--r--packages/SystemUI/res/values-es-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-es/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fr-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-it-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-it/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ja-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ko-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nb-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nl-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pl-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml2
-rw-r--r--packages/SystemUI/res/values-rm/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ru-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sv-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-tr-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml4
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/SystemUI/res/values/colors.xml1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java169
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java95
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java73
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java192
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java7
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java19
-rw-r--r--policy/src/com/android/internal/policy/impl/SimUnlockScreen.java5
-rw-r--r--services/audioflinger/AudioFlinger.cpp3
-rw-r--r--services/audioflinger/AudioPolicyManagerBase.cpp45
-rw-r--r--services/java/com/android/server/BackupManagerService.java61
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java42
-rw-r--r--services/java/com/android/server/PackageManagerService.java10
-rw-r--r--services/java/com/android/server/ProcessStats.java11
-rw-r--r--services/java/com/android/server/WiredAccessoryObserver.java57
-rw-r--r--telephony/java/android/telephony/ServiceState.java6
-rw-r--r--telephony/java/com/android/internal/telephony/CallManager.java15
-rw-r--r--telephony/java/com/android/internal/telephony/RIL.java1
-rwxr-xr-xtelephony/java/com/android/internal/telephony/cdma/CDMAPhone.java4
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java4
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java50
-rwxr-xr-xtelephony/java/com/android/internal/telephony/sip/SipPhoneBase.java4
-rw-r--r--test-runner/src/android/test/InstrumentationTestRunner.java2
-rw-r--r--tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java3
313 files changed, 3797 insertions, 2501 deletions
diff --git a/api/current.xml b/api/current.xml
index d2bd8e5..a738761 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -6686,6 +6686,17 @@
visibility="public"
>
</field>
+<field name="opacity"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843567"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="order"
type="int"
transient="false"
@@ -14722,6 +14733,28 @@
visibility="public"
>
</field>
+<field name="Theme_Holo_Wallpaper"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16973956"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="Theme_Holo_Wallpaper_NoTitleBar"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16973957"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="Theme_InputMethod"
type="int"
transient="false"
@@ -19596,6 +19629,17 @@
synchronized="false"
static="false"
final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+</method>
+<method name="getCustomView"
+ return="android.view.View"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
deprecated="not deprecated"
visibility="public"
>
@@ -20362,6 +20406,19 @@
<parameter name="view" type="android.view.View">
</parameter>
</method>
+<method name="setCustomView"
+ return="android.app.ActionBar.Tab"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="layoutResId" type="int">
+</parameter>
+</method>
<method name="setIcon"
return="android.app.ActionBar.Tab"
abstract="true"
@@ -20375,6 +20432,19 @@
<parameter name="icon" type="android.graphics.drawable.Drawable">
</parameter>
</method>
+<method name="setIcon"
+ return="android.app.ActionBar.Tab"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="resId" type="int">
+</parameter>
+</method>
<method name="setTabListener"
return="android.app.ActionBar.Tab"
abstract="true"
@@ -20414,6 +20484,19 @@
<parameter name="text" type="java.lang.CharSequence">
</parameter>
</method>
+<method name="setText"
+ return="android.app.ActionBar.Tab"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="resId" type="int">
+</parameter>
+</method>
<field name="INVALID_POSITION"
type="int"
transient="false"
@@ -21911,47 +21994,6 @@
<parameter name="exitAnim" type="int">
</parameter>
</method>
-<method name="popBackStack"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="deprecated"
- visibility="public"
->
-</method>
-<method name="popBackStack"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="deprecated"
- visibility="public"
->
-<parameter name="name" type="java.lang.String">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<method name="popBackStack"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="deprecated"
- visibility="public"
->
-<parameter name="id" type="int">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
<method name="registerForContextMenu"
return="void"
abstract="false"
@@ -22637,17 +22679,6 @@
visibility="protected"
>
</field>
-<field name="POP_BACK_STACK_INCLUSIVE"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
<field name="RESULT_CANCELED"
type="int"
transient="false"
@@ -26523,6 +26554,19 @@
<parameter name="request" type="android.app.DownloadManager.Request">
</parameter>
</method>
+<method name="getMimeTypeForDownloadedFile"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="id" type="long">
+</parameter>
+</method>
<method name="getUriForDownloadedFile"
return="android.net.Uri"
abstract="false"
@@ -28360,6 +28404,17 @@
<parameter name="args" type="java.lang.String[]">
</parameter>
</method>
+<method name="executePendingTransactions"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="findFragmentById"
return="android.app.Fragment"
abstract="true"
@@ -28426,7 +28481,7 @@
>
</method>
<method name="popBackStack"
- return="boolean"
+ return="void"
abstract="true"
native="false"
synchronized="false"
@@ -28437,7 +28492,7 @@
>
</method>
<method name="popBackStack"
- return="boolean"
+ return="void"
abstract="true"
native="false"
synchronized="false"
@@ -28452,6 +28507,47 @@
</parameter>
</method>
<method name="popBackStack"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="id" type="int">
+</parameter>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<method name="popBackStackImmediate"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="popBackStackImmediate"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<method name="popBackStackImmediate"
return="boolean"
abstract="true"
native="false"
@@ -68648,6 +68744,29 @@
</parameter>
<parameter name="selection" type="java.lang.String">
</parameter>
+<parameter name="groupBy" type="java.lang.String">
+</parameter>
+<parameter name="having" type="java.lang.String">
+</parameter>
+<parameter name="sortOrder" type="java.lang.String">
+</parameter>
+<parameter name="limit" type="java.lang.String">
+</parameter>
+</method>
+<method name="buildQuery"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+<parameter name="projectionIn" type="java.lang.String[]">
+</parameter>
+<parameter name="selection" type="java.lang.String">
+</parameter>
<parameter name="selectionArgs" type="java.lang.String[]">
</parameter>
<parameter name="groupBy" type="java.lang.String">
@@ -68725,6 +68844,33 @@
</parameter>
<parameter name="selection" type="java.lang.String">
</parameter>
+<parameter name="groupBy" type="java.lang.String">
+</parameter>
+<parameter name="having" type="java.lang.String">
+</parameter>
+</method>
+<method name="buildUnionSubQuery"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+<parameter name="typeDiscriminatorColumn" type="java.lang.String">
+</parameter>
+<parameter name="unionColumns" type="java.lang.String[]">
+</parameter>
+<parameter name="columnsPresentInTable" type="java.util.Set&lt;java.lang.String&gt;">
+</parameter>
+<parameter name="computedColumnsOffset" type="int">
+</parameter>
+<parameter name="typeDiscriminatorValue" type="java.lang.String">
+</parameter>
+<parameter name="selection" type="java.lang.String">
+</parameter>
<parameter name="selectionArgs" type="java.lang.String[]">
</parameter>
<parameter name="groupBy" type="java.lang.String">
@@ -85905,6 +86051,19 @@
<parameter name="b" type="int">
</parameter>
</method>
+<method name="setOpacity"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="opacity" type="int">
+</parameter>
+</method>
<method name="unscheduleDrawable"
return="void"
abstract="false"
@@ -101697,6 +101856,17 @@
visibility="public"
>
</field>
+<field name="VOICE_COMMUNICATION"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="7"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="VOICE_DOWNLINK"
type="int"
transient="false"
@@ -144657,6 +144827,17 @@
visibility="public"
>
</method>
+<method name="getIcon"
+ return="android.graphics.drawable.Drawable"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getIntent"
return="android.content.Intent"
abstract="false"
@@ -145243,6 +145424,32 @@
<parameter name="fragment" type="java.lang.String">
</parameter>
</method>
+<method name="setIcon"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="icon" type="android.graphics.drawable.Drawable">
+</parameter>
+</method>
+<method name="setIcon"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="iconResId" type="int">
+</parameter>
+</method>
<method name="setIntent"
return="void"
abstract="false"
@@ -212801,7 +213008,7 @@
type="int"
transient="false"
volatile="false"
- value="-2147483648"
+ value="16777216"
static="true"
final="true"
deprecated="not deprecated"
@@ -212940,6 +213147,17 @@
visibility="public"
>
</field>
+<field name="FLAG_SPLIT_TOUCH"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="8388608"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="FLAG_TOUCHABLE_WHEN_WAKING"
type="int"
transient="false"
@@ -219233,6 +219451,19 @@
visibility="public"
>
</method>
+<method name="getEnabledInputMethodSubtypeList"
+ return="java.util.List&lt;android.view.inputmethod.InputMethodSubtype&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="imi" type="android.view.inputmethod.InputMethodInfo">
+</parameter>
+</method>
<method name="getInputMethodList"
return="java.util.List&lt;android.view.inputmethod.InputMethodInfo&gt;"
abstract="false"
@@ -239896,6 +240127,20 @@
<parameter name="interpolator" type="android.view.animation.Interpolator">
</parameter>
</constructor>
+<constructor name="Scroller"
+ type="android.widget.Scroller"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="interpolator" type="android.view.animation.Interpolator">
+</parameter>
+<parameter name="flywheel" type="boolean">
+</parameter>
+</constructor>
<method name="abortAnimation"
return="void"
abstract="false"
@@ -246809,7 +247054,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="arg0" type="T">
+<parameter name="t" type="T">
</parameter>
</method>
</interface>
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index b5fddfa..ac0e410 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -217,8 +217,7 @@ public final class Bmgr {
// The rest of the 'list' options work with a restore session on the current transport
try {
- String curTransport = mBmgr.getCurrentTransport();
- mRestore = mBmgr.beginRestoreSession(curTransport);
+ mRestore = mBmgr.beginRestoreSession(null, null);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
@@ -349,8 +348,7 @@ public final class Bmgr {
private void doRestorePackage(String pkg) {
try {
- String curTransport = mBmgr.getCurrentTransport();
- mRestore = mBmgr.beginRestoreSession(curTransport);
+ mRestore = mBmgr.beginRestoreSession(pkg, null);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
@@ -378,8 +376,7 @@ public final class Bmgr {
try {
boolean didRestore = false;
- String curTransport = mBmgr.getCurrentTransport();
- mRestore = mBmgr.beginRestoreSession(curTransport);
+ mRestore = mBmgr.beginRestoreSession(null, null);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index e6b1c08..8471df9 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -520,6 +520,18 @@ public class AccountManagerService
if (account == null) throw new IllegalArgumentException("account is null");
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
+
+ cancelNotification(getSigninRequiredNotificationId(account));
+ synchronized(mCredentialsPermissionNotificationIds) {
+ for (Pair<Pair<Account, String>, Integer> pair:
+ mCredentialsPermissionNotificationIds.keySet()) {
+ if (account.equals(pair.first.first)) {
+ int id = mCredentialsPermissionNotificationIds.get(pair);
+ cancelNotification(id);
+ }
+ }
+ }
+
try {
new RemoveAccountSession(response, account).bind();
} finally {
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index a57b54a..7a6ad0f 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -138,14 +138,19 @@ public abstract class ActionBar {
* Set the action bar into custom navigation mode, supplying a view
* for custom navigation.
*
- * Custom navigation views appear between the application icon and
+ * <p>Custom navigation views appear between the application icon and
* any action buttons and may use any space available there. Common
* use cases for custom navigation views might include an auto-suggesting
* address bar for a browser or other navigation mechanisms that do not
- * translate well to provided navigation modes.
+ * translate well to provided navigation modes.</p>
+ *
+ * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for
+ * the custom view to be displayed.</p>
*
* @param view Custom navigation view to place in the ActionBar.
* @param layoutParams How this custom view should layout in the bar.
+ *
+ * @see #setDisplayOptions(int, int)
*/
public abstract void setCustomView(View view, LayoutParams layoutParams);
@@ -248,39 +253,47 @@ public abstract class ActionBar {
public abstract void setStandardNavigationMode();
/**
- * Set the action bar's title. This will only be displayed in standard navigation mode.
+ * Set the action bar's title. This will only be displayed if
+ * {@link #DISPLAY_SHOW_TITLE} is set.
*
* @param title Title to set
*
* @see #setTitle(int)
+ * @see #setDisplayOptions(int, int)
*/
public abstract void setTitle(CharSequence title);
/**
- * Set the action bar's title. This will only be displayed in standard navigation mode.
+ * Set the action bar's title. This will only be displayed if
+ * {@link #DISPLAY_SHOW_TITLE} is set.
*
* @param resId Resource ID of title string to set
*
* @see #setTitle(CharSequence)
+ * @see #setDisplayOptions(int, int)
*/
public abstract void setTitle(int resId);
/**
- * Set the action bar's subtitle. This will only be displayed in standard navigation mode.
- * Set to null to disable the subtitle entirely.
+ * Set the action bar's subtitle. This will only be displayed if
+ * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the
+ * subtitle entirely.
*
* @param subtitle Subtitle to set
*
* @see #setSubtitle(int)
+ * @see #setDisplayOptions(int, int)
*/
public abstract void setSubtitle(CharSequence subtitle);
/**
- * Set the action bar's subtitle. This will only be displayed in standard navigation mode.
+ * Set the action bar's subtitle. This will only be displayed if
+ * {@link #DISPLAY_SHOW_TITLE} is set.
*
* @param resId Resource ID of subtitle string to set
*
* @see #setSubtitle(CharSequence)
+ * @see #setDisplayOptions(int, int)
*/
public abstract void setSubtitle(int resId);
@@ -317,9 +330,16 @@ public abstract class ActionBar {
/**
* @return The current custom navigation view.
+ * @deprecated Method has been renamed. Use {@link #getCustomView()}.
*/
+ @Deprecated
public abstract View getCustomNavigationView();
-
+
+ /**
+ * @return The current custom view.
+ */
+ public abstract View getCustomView();
+
/**
* Returns the current ActionBar title in standard mode.
* Returns null if {@link #getNavigationMode()} would not return
@@ -570,6 +590,14 @@ public abstract class ActionBar {
public abstract Tab setIcon(Drawable icon);
/**
+ * Set the icon displayed on this tab.
+ *
+ * @param resId Resource ID referring to the drawable to use as an icon
+ * @return The current instance for call chaining
+ */
+ public abstract Tab setIcon(int resId);
+
+ /**
* Set the text displayed on this tab. Text may be truncated if there is not
* room to display the entire string.
*
@@ -579,6 +607,15 @@ public abstract class ActionBar {
public abstract Tab setText(CharSequence text);
/**
+ * Set the text displayed on this tab. Text may be truncated if there is not
+ * room to display the entire string.
+ *
+ * @param resId A resource ID referring to the text that should be displayed
+ * @return The current instance for call chaining
+ */
+ public abstract Tab setText(int resId);
+
+ /**
* Set a custom view to be used for this tab. This overrides values set by
* {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
*
@@ -588,6 +625,15 @@ public abstract class ActionBar {
public abstract Tab setCustomView(View view);
/**
+ * Set a custom view to be used for this tab. This overrides values set by
+ * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
+ *
+ * @param layoutResId A layout resource to inflate and use as a custom tab view
+ * @return The current instance for call chaining
+ */
+ public abstract Tab setCustomView(int layoutResId);
+
+ /**
* Retrieve a previously set custom view for this tab.
*
* @return The custom view set by {@link #setCustomView(View)}.
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 07d21fb..5174f19 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2086,63 +2086,12 @@ public class Activity extends ContextThemeWrapper
}
/**
- * Flag for {@link #popBackStack(String, int)}
- * and {@link #popBackStack(int, int)}: If set, and the name or ID of
- * a back stack entry has been supplied, then all matching entries will
- * be consumed until one that doesn't match is found or the bottom of
- * the stack is reached. Otherwise, all entries up to but not including that entry
- * will be removed.
- */
- public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
-
- /**
- * Pop the top state off the back stack. Returns true if there was one
- * to pop, else false.
- * @deprecated use {@link #getFragmentManager}.
- */
- @Deprecated
- public boolean popBackStack() {
- return mFragments.popBackStack();
- }
-
- /**
- * Pop the last fragment transition from the local activity's fragment
- * back stack. If there is nothing to pop, false is returned.
- * @param name If non-null, this is the name of a previous back state
- * to look for; if found, all states up to that state will be popped. The
- * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
- * the named state itself is popped. If null, only the top state is popped.
- * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
- * @deprecated use {@link #getFragmentManager}.
- */
- @Deprecated
- public boolean popBackStack(String name, int flags) {
- return mFragments.popBackStack(name, flags);
- }
-
- /**
- * Pop all back stack states up to the one with the given identifier.
- * @param id Identifier of the stated to be popped. If no identifier exists,
- * false is returned.
- * The identifier is the number returned by
- * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The
- * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
- * the named state itself is popped.
- * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
- * @deprecated use {@link #getFragmentManager}.
- */
- @Deprecated
- public boolean popBackStack(int id, int flags) {
- return mFragments.popBackStack(id, flags);
- }
-
- /**
* Called when the activity has detected the user's press of the back
* key. The default implementation simply finishes the current activity,
* but you can override this to do whatever you want.
*/
public void onBackPressed() {
- if (!mFragments.popBackStack()) {
+ if (!mFragments.popBackStackImmediate()) {
finish();
}
}
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 6e18533..09a21f8 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -886,8 +886,8 @@ public class DownloadManager {
* downloaded successfully. otherwise, null is returned.
*<p>
* If the specified downloaded file is in external storage (for example, /sdcard dir),
- * then it is assumed to be safe for anyone to read and the returned {@link Uri} can be used
- * by any app to access the downloaded file.
+ * then it is assumed to be safe for anyone to read and the returned {@link Uri} corresponds
+ * to the filepath on sdcard.
*
* @param id the id of the downloaded file.
* @return the {@link Uri} for the given downloaded file id, if download was successful. null
@@ -903,8 +903,7 @@ public class DownloadManager {
return null;
}
while (cursor.moveToFirst()) {
- int status = cursor.getInt(cursor.getColumnIndexOrThrow(
- DownloadManager.COLUMN_STATUS));
+ int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS));
if (DownloadManager.STATUS_SUCCESSFUL == status) {
int indx = cursor.getColumnIndexOrThrow(
Downloads.Impl.COLUMN_DESTINATION);
@@ -919,8 +918,9 @@ public class DownloadManager {
return ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, id);
} else {
// return public uri
- return ContentUris.withAppendedId(
- Downloads.Impl.PUBLICLY_ACCESSIBLE_DOWNLOADS_URI, id);
+ String path = cursor.getString(
+ cursor.getColumnIndexOrThrow(COLUMN_LOCAL_FILENAME));
+ return Uri.fromFile(new File(path));
}
}
}
@@ -934,6 +934,38 @@ public class DownloadManager {
}
/**
+ * Returns {@link Uri} for the given downloaded file id, if the file is
+ * downloaded successfully. otherwise, null is returned.
+ *<p>
+ * If the specified downloaded file is in external storage (for example, /sdcard dir),
+ * then it is assumed to be safe for anyone to read and the returned {@link Uri} corresponds
+ * to the filepath on sdcard.
+ *
+ * @param id the id of the downloaded file.
+ * @return the {@link Uri} for the given downloaded file id, if download was successful. null
+ * otherwise.
+ */
+ public String getMimeTypeForDownloadedFile(long id) {
+ Query query = new Query().setFilterById(id);
+ Cursor cursor = null;
+ try {
+ cursor = query(query);
+ if (cursor == null) {
+ return null;
+ }
+ while (cursor.moveToFirst()) {
+ return cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_MEDIA_TYPE));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ // downloaded file not found or its status is not 'successfully completed'
+ return null;
+ }
+
+ /**
* Restart the given downloads, which must have already completed (successfully or not). This
* method will only work when called from within the download manager's process.
* @param ids the IDs of the downloads
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 9970418..fbad2fe 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
@@ -99,6 +100,20 @@ public abstract class FragmentManager {
public abstract FragmentTransaction openTransaction();
/**
+ * After a {@link FragmentTransaction} is committed with
+ * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it
+ * is scheduled to be executed asynchronously on the process's main thread.
+ * If you want to immediately executing any such pending operations, you
+ * can call this function (only from the main thread) to do so. Note that
+ * all callbacks and other related behavior will be done from within this
+ * call, so be careful about where this is called from.
+ *
+ * @return Returns true if there were any pending transactions to be
+ * executed.
+ */
+ public abstract boolean executePendingTransactions();
+
+ /**
* Finds a fragment that was identified by the given id either when inflated
* from XML or as the container ID when added in a transaction. This first
* searches through fragments that are currently added to the manager's
@@ -132,7 +147,15 @@ public abstract class FragmentManager {
* Pop the top state off the back stack. Returns true if there was one
* to pop, else false.
*/
- public abstract boolean popBackStack();
+ public abstract void popBackStack();
+
+ /**
+ * Like {@link #popBackStack()}, but performs the operation immediately
+ * inside of the call. This is like calling {@link #executePendingTransactions()}
+ * afterwards.
+ * @return Returns true if there was something popped, else false.
+ */
+ public abstract boolean popBackStackImmediate();
/**
* Pop the last fragment transition from the manager's fragment
@@ -143,7 +166,15 @@ public abstract class FragmentManager {
* the named state itself is popped. If null, only the top state is popped.
* @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
*/
- public abstract boolean popBackStack(String name, int flags);
+ public abstract void popBackStack(String name, int flags);
+
+ /**
+ * Like {@link #popBackStack(String, int)}, but performs the operation immediately
+ * inside of the call. This is like calling {@link #executePendingTransactions()}
+ * afterwards.
+ * @return Returns true if there was something popped, else false.
+ */
+ public abstract boolean popBackStackImmediate(String name, int flags);
/**
* Pop all back stack states up to the one with the given identifier.
@@ -155,7 +186,15 @@ public abstract class FragmentManager {
* the named state itself is popped.
* @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
*/
- public abstract boolean popBackStack(int id, int flags);
+ public abstract void popBackStack(int id, int flags);
+
+ /**
+ * Like {@link #popBackStack(int, int)}, but performs the operation immediately
+ * inside of the call. This is like calling {@link #executePendingTransactions()}
+ * afterwards.
+ * @return Returns true if there was something popped, else false.
+ */
+ public abstract boolean popBackStackImmediate(int id, int flags);
/**
* Return the number of entries currently in the back stack.
@@ -300,17 +339,58 @@ final class FragmentManagerImpl extends FragmentManager {
}
@Override
- public boolean popBackStack() {
+ public boolean executePendingTransactions() {
+ return execPendingActions();
+ }
+
+ @Override
+ public void popBackStack() {
+ enqueueAction(new Runnable() {
+ @Override public void run() {
+ popBackStackState(mActivity.mHandler, null, -1, 0);
+ }
+ }, false);
+ }
+
+ @Override
+ public boolean popBackStackImmediate() {
+ checkStateLoss();
+ executePendingTransactions();
return popBackStackState(mActivity.mHandler, null, -1, 0);
}
@Override
- public boolean popBackStack(String name, int flags) {
+ public void popBackStack(final String name, final int flags) {
+ enqueueAction(new Runnable() {
+ @Override public void run() {
+ popBackStackState(mActivity.mHandler, name, -1, flags);
+ }
+ }, false);
+ }
+
+ @Override
+ public boolean popBackStackImmediate(String name, int flags) {
+ checkStateLoss();
+ executePendingTransactions();
return popBackStackState(mActivity.mHandler, name, -1, flags);
}
@Override
- public boolean popBackStack(int id, int flags) {
+ public void popBackStack(final int id, final int flags) {
+ if (id < 0) {
+ throw new IllegalArgumentException("Bad id: " + id);
+ }
+ enqueueAction(new Runnable() {
+ @Override public void run() {
+ popBackStackState(mActivity.mHandler, null, id, flags);
+ }
+ }, false);
+ }
+
+ @Override
+ public boolean popBackStackImmediate(int id, int flags) {
+ checkStateLoss();
+ executePendingTransactions();
if (id < 0) {
throw new IllegalArgumentException("Bad id: " + id);
}
@@ -849,16 +929,20 @@ final class FragmentManagerImpl extends FragmentManager {
return null;
}
+ private void checkStateLoss() {
+ if (mStateSaved) {
+ throw new IllegalStateException(
+ "Can not perform this action after onSaveInstanceState");
+ }
+ if (mNoTransactionsBecause != null) {
+ throw new IllegalStateException(
+ "Can not perform this action inside of " + mNoTransactionsBecause);
+ }
+ }
+
public void enqueueAction(Runnable action, boolean allowStateLoss) {
if (!allowStateLoss) {
- if (mStateSaved) {
- throw new IllegalStateException(
- "Can not perform this action after onSaveInstanceState");
- }
- if (mNoTransactionsBecause != null) {
- throw new IllegalStateException(
- "Can not perform this action inside of " + mNoTransactionsBecause);
- }
+ checkStateLoss();
}
synchronized (this) {
if (mActivity == null) {
@@ -934,17 +1018,23 @@ final class FragmentManagerImpl extends FragmentManager {
/**
* Only call from main thread!
*/
- public void execPendingActions() {
+ public boolean execPendingActions() {
if (mExecutingActions) {
- throw new IllegalStateException("Recursive entry to execPendingActions");
+ throw new IllegalStateException("Recursive entry to executePendingTransactions");
}
+ if (Looper.myLooper() != mActivity.mHandler.getLooper()) {
+ throw new IllegalStateException("Must be called from main thread of process");
+ }
+
+ boolean didSomething = false;
+
while (true) {
int numActions;
synchronized (this) {
if (mPendingActions == null || mPendingActions.size() == 0) {
- return;
+ return didSomething;
}
numActions = mPendingActions.size();
@@ -961,6 +1051,7 @@ final class FragmentManagerImpl extends FragmentManager {
mTmpActions[i].run();
}
mExecutingActions = false;
+ didSomething = true;
}
}
@@ -984,19 +1075,14 @@ final class FragmentManagerImpl extends FragmentManager {
if (mBackStack == null) {
return false;
}
- if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) {
+ if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) {
int last = mBackStack.size()-1;
if (last < 0) {
return false;
}
final BackStackRecord bss = mBackStack.remove(last);
- enqueueAction(new Runnable() {
- public void run() {
- if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss);
- bss.popFromBackStack(true);
- reportBackStackChanged();
- }
- }, false);
+ bss.popFromBackStack(true);
+ reportBackStackChanged();
} else {
int index = -1;
if (name != null || id >= 0) {
@@ -1016,7 +1102,7 @@ final class FragmentManagerImpl extends FragmentManager {
if (index < 0) {
return false;
}
- if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) {
+ if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) {
index--;
// Consume all following entries that match.
while (index >= 0) {
@@ -1038,16 +1124,12 @@ final class FragmentManagerImpl extends FragmentManager {
for (int i=mBackStack.size()-1; i>index; i--) {
states.add(mBackStack.remove(i));
}
- enqueueAction(new Runnable() {
- public void run() {
- final int LAST = states.size()-1;
- for (int i=0; i<=LAST; i++) {
- if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
- states.get(i).popFromBackStack(i == LAST);
- }
- reportBackStackChanged();
- }
- }, false);
+ final int LAST = states.size()-1;
+ for (int i=0; i<=LAST; i++) {
+ if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
+ states.get(i).popFromBackStack(i == LAST);
+ }
+ reportBackStackChanged();
}
return true;
}
@@ -1084,6 +1166,10 @@ final class FragmentManagerImpl extends FragmentManager {
}
Parcelable saveAllState() {
+ // Make sure all pending operations have now been executed to get
+ // our state update-to-date.
+ execPendingActions();
+
mStateSaved = true;
if (mActive == null || mActive.size() <= 0) {
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 52dd707..80656a1 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -138,8 +138,8 @@ public class BackupManager {
if (sService != null) {
RestoreSession session = null;
try {
- String transport = sService.getCurrentTransport();
- IRestoreSession binder = sService.beginRestoreSession(transport);
+ IRestoreSession binder = sService.beginRestoreSession(mContext.getPackageName(),
+ null);
session = new RestoreSession(mContext, binder);
result = session.restorePackage(mContext.getPackageName(), observer);
} catch (RemoteException e) {
@@ -163,8 +163,8 @@ public class BackupManager {
checkServiceBinder();
if (sService != null) {
try {
- String transport = sService.getCurrentTransport();
- IRestoreSession binder = sService.beginRestoreSession(transport);
+ // All packages, current transport
+ IRestoreSession binder = sService.beginRestoreSession(null, null);
session = new RestoreSession(mContext, binder);
} catch (RemoteException e) {
Log.w(TAG, "beginRestoreSession() couldn't connect");
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 23d6351..8af59df 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -144,13 +144,25 @@ interface IBackupManager {
String selectBackupTransport(String transport);
/**
- * Begin a restore session with the given transport (which may differ from the
- * currently-active backup transport).
+ * Begin a restore session. Either or both of packageName and transportID
+ * may be null. If packageName is non-null, then only the given package will be
+ * considered for restore. If transportID is null, then the restore will use
+ * the current active transport.
+ * <p>
+ * This method requires the android.permission.BACKUP permission <i>except</i>
+ * when transportID is null and packageName is the name of the caller's own
+ * package. In that case, the restore session returned is suitable for supporting
+ * the BackupManager.requestRestore() functionality via RestoreSession.restorePackage()
+ * without requiring the app to hold any special permission.
*
- * @param transport The name of the transport to use for the restore operation.
+ * @param packageName The name of the single package for which a restore will
+ * be requested. May be null, in which case all packages in the restore
+ * set can be restored.
+ * @param transportID The name of the transport to use for the restore operation.
+ * May be null, in which case the current active transport is used.
* @return An interface to the restore session, or null on error.
*/
- IRestoreSession beginRestoreSession(String transportID);
+ IRestoreSession beginRestoreSession(String packageName, String transportID);
/**
* Notify the backup manager that a BackupAgent has completed the operation
diff --git a/core/java/android/content/ContentQueryMap.java b/core/java/android/content/ContentQueryMap.java
index c955094..8aeaa8f 100644
--- a/core/java/android/content/ContentQueryMap.java
+++ b/core/java/android/content/ContentQueryMap.java
@@ -33,7 +33,7 @@ import java.util.Observable;
* The cursor data is accessed by row key and column name via getValue().
*/
public class ContentQueryMap extends Observable {
- private Cursor mCursor;
+ private volatile Cursor mCursor;
private String[] mColumnNames;
private int mKeyColumn;
@@ -71,7 +71,7 @@ public class ContentQueryMap extends Observable {
// ContentProvider then read it once into the cache. Otherwise the cache will be filled
// automatically.
if (!keepUpdated) {
- readCursorIntoCache();
+ readCursorIntoCache(cursor);
}
}
@@ -128,27 +128,35 @@ public class ContentQueryMap extends Observable {
/** Requeries the cursor and reads the contents into the cache */
public void requery() {
+ final Cursor cursor = mCursor;
+ if (cursor == null) {
+ // If mCursor is null then it means there was a requery() in flight
+ // while another thread called close(), which nulls out mCursor.
+ // If this happens ignore the requery() since we are closed anyways.
+ return;
+ }
mDirty = false;
- if (!mCursor.requery()) {
- throw new IllegalStateException("trying to requery an already closed cursor");
+ if (!cursor.requery()) {
+ // again, don't do anything if the cursor is already closed
+ return;
}
- readCursorIntoCache();
+ readCursorIntoCache(cursor);
setChanged();
notifyObservers();
}
- private synchronized void readCursorIntoCache() {
+ private synchronized void readCursorIntoCache(Cursor cursor) {
// Make a new map so old values returned by getRows() are undisturbed.
int capacity = mValues != null ? mValues.size() : 0;
mValues = new HashMap<String, ContentValues>(capacity);
- while (mCursor.moveToNext()) {
+ while (cursor.moveToNext()) {
ContentValues values = new ContentValues();
for (int i = 0; i < mColumnNames.length; i++) {
if (i != mKeyColumn) {
- values.put(mColumnNames[i], mCursor.getString(i));
+ values.put(mColumnNames[i], cursor.getString(i));
}
}
- mValues.put(mCursor.getString(mKeyColumn), values);
+ mValues.put(cursor.getString(mKeyColumn), values);
}
}
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index fc30da2..5a6c667 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -125,11 +125,11 @@ public class SQLiteCursor extends AbstractWindowedCursor {
// the cursor's state doesn't change
while (true) {
mLock.lock();
- if (mCursorState != mThreadState) {
- mLock.unlock();
- break;
- }
try {
+ if (mCursorState != mThreadState) {
+ break;
+ }
+
int count = getQuery().fillWindow(cw, mMaxRead, mCount);
// return -1 means there is still more data to be retrieved from the resultset
if (count != 0) {
@@ -241,9 +241,8 @@ public class SQLiteCursor extends AbstractWindowedCursor {
mColumnNameMap = null;
mQuery = query;
+ query.mDatabase.lock();
try {
- query.mDatabase.lock();
-
// Setup the list of columns
int columnCount = mQuery.columnCountLocked();
mColumns = new String[columnCount];
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 610bf70..b6aca2b 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -321,7 +321,7 @@ public class SQLiteQueryBuilder
}
String sql = buildQuery(
- projectionIn, selection, selectionArgs, groupBy, having,
+ projectionIn, selection, groupBy, having,
sortOrder, limit);
if (Log.isLoggable(TAG, Log.DEBUG)) {
@@ -345,10 +345,6 @@ public class SQLiteQueryBuilder
* formatted as an SQL WHERE clause (excluding the WHERE
* itself). Passing null will return all rows for the given
* URL.
- * @param selectionArgs You may include ?s in selection, which
- * will be replaced by the values from selectionArgs, in order
- * that they appear in the selection. The values will be bound
- * as Strings.
* @param groupBy A filter declaring how to group rows, formatted
* as an SQL GROUP BY clause (excluding the GROUP BY itself).
* Passing null will cause the rows to not be grouped.
@@ -365,8 +361,8 @@ public class SQLiteQueryBuilder
* @return the resulting SQL SELECT statement
*/
public String buildQuery(
- String[] projectionIn, String selection, String[] selectionArgs,
- String groupBy, String having, String sortOrder, String limit) {
+ String[] projectionIn, String selection, String groupBy,
+ String having, String sortOrder, String limit) {
String[] projection = computeProjection(projectionIn);
StringBuilder where = new StringBuilder();
@@ -394,6 +390,19 @@ public class SQLiteQueryBuilder
}
/**
+ * @deprecated This method's signature is misleading since no SQL parameter
+ * substitution is carried out. The selection arguments parameter does not get
+ * used at all. To avoid confusion, call
+ * {@link #buildQuery(String[], String, String, String, String, String)} instead.
+ */
+ @Deprecated
+ public String buildQuery(
+ String[] projectionIn, String selection, String[] selectionArgs,
+ String groupBy, String having, String sortOrder, String limit) {
+ return buildQuery(projectionIn, selection, groupBy, having, sortOrder, limit);
+ }
+
+ /**
* Construct a SELECT statement suitable for use in a group of
* SELECT statements that will be joined through UNION operators
* in buildUnionQuery.
@@ -422,10 +431,6 @@ public class SQLiteQueryBuilder
* formatted as an SQL WHERE clause (excluding the WHERE
* itself). Passing null will return all rows for the given
* URL.
- * @param selectionArgs You may include ?s in selection, which
- * will be replaced by the values from selectionArgs, in order
- * that they appear in the selection. The values will be bound
- * as Strings.
* @param groupBy A filter declaring how to group rows, formatted
* as an SQL GROUP BY clause (excluding the GROUP BY itself).
* Passing null will cause the rows to not be grouped.
@@ -443,7 +448,6 @@ public class SQLiteQueryBuilder
int computedColumnsOffset,
String typeDiscriminatorValue,
String selection,
- String[] selectionArgs,
String groupBy,
String having) {
int unionColumnsCount = unionColumns.length;
@@ -463,12 +467,36 @@ public class SQLiteQueryBuilder
}
}
return buildQuery(
- projectionIn, selection, selectionArgs, groupBy, having,
+ projectionIn, selection, groupBy, having,
null /* sortOrder */,
null /* limit */);
}
/**
+ * @deprecated This method's signature is misleading since no SQL parameter
+ * substitution is carried out. The selection arguments parameter does not get
+ * used at all. To avoid confusion, call
+ * {@link #buildUnionSubQuery}
+ * instead.
+ */
+ @Deprecated
+ public String buildUnionSubQuery(
+ String typeDiscriminatorColumn,
+ String[] unionColumns,
+ Set<String> columnsPresentInTable,
+ int computedColumnsOffset,
+ String typeDiscriminatorValue,
+ String selection,
+ String[] selectionArgs,
+ String groupBy,
+ String having) {
+ return buildUnionSubQuery(
+ typeDiscriminatorColumn, unionColumns, columnsPresentInTable,
+ computedColumnsOffset, typeDiscriminatorValue, selection,
+ groupBy, having);
+ }
+
+ /**
* Given a set of subqueries, all of which are SELECT statements,
* construct a query that returns the union of what those
* subqueries return.
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index f8260ca..a402c91 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -324,6 +324,10 @@ public class Binder implements IBinder {
} catch (RuntimeException e) {
reply.writeException(e);
res = true;
+ } catch (OutOfMemoryError e) {
+ RuntimeException re = new RuntimeException("Out of memory", e);
+ reply.writeException(re);
+ res = true;
}
reply.recycle();
data.recycle();
diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java
index a47c66a..47a7696 100644
--- a/core/java/android/os/DropBoxManager.java
+++ b/core/java/android/os/DropBoxManager.java
@@ -169,7 +169,12 @@ public class DropBoxManager {
is = getInputStream();
if (is == null) return null;
byte[] buf = new byte[maxBytes];
- return new String(buf, 0, Math.max(0, is.read(buf)));
+ int readBytes = 0;
+ int n = 0;
+ while (n >= 0 && (readBytes += n) < maxBytes) {
+ n = is.read(buf, readBytes, maxBytes - readBytes);
+ }
+ return new String(buf, 0, readBytes);
} catch (IOException e) {
return null;
} finally {
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 8762512..93542c6 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -106,6 +106,8 @@ public final class StrictMode {
private static final String TAG = "StrictMode";
private static final boolean LOG_V = false;
+ private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
+
// Only log a duplicate stack trace to the logs every second.
private static final long MIN_LOG_INTERVAL_MS = 1000;
@@ -693,7 +695,7 @@ public final class StrictMode {
public static boolean conditionallyEnableDebugLogging() {
// For debug builds, log event loop stalls to dropbox for analysis.
// Similar logic also appears in ActivityThread.java for system apps.
- if ("user".equals(Build.TYPE)) {
+ if (IS_USER_BUILD) {
setCloseGuardEnabled(false);
return false;
}
@@ -704,8 +706,7 @@ public final class StrictMode {
StrictMode.PENALTY_DROPBOX);
sVmPolicyMask = StrictMode.DETECT_VM_CURSOR_LEAKS |
StrictMode.DETECT_VM_CLOSABLE_LEAKS |
- StrictMode.PENALTY_DROPBOX |
- StrictMode.PENALTY_LOG;
+ StrictMode.PENALTY_DROPBOX;
setCloseGuardEnabled(vmClosableObjectLeaksEnabled());
return true;
}
@@ -1240,6 +1241,11 @@ public final class StrictMode {
mContainerState = threadState;
}
+ // Empty constructor for the NO_OP_SPAN
+ protected Span() {
+ mContainerState = null;
+ }
+
/**
* To be called when the critical span is complete (i.e. the
* animation is done animating). This can be called on any
@@ -1269,11 +1275,14 @@ public final class StrictMode {
state.mActiveHead = mNext;
}
+ state.mActiveSize--;
+
+ if (LOG_V) Log.d(TAG, "Span finished=" + mName + "; size=" + state.mActiveSize);
+
this.mCreateMillis = -1;
this.mName = null;
this.mPrev = null;
this.mNext = null;
- state.mActiveSize--;
// Add ourselves to the freeList, if it's not already
// too big.
@@ -1286,6 +1295,13 @@ public final class StrictMode {
}
}
+ // The no-op span that's used in user builds.
+ private static final Span NO_OP_SPAN = new Span() {
+ public void finish() {
+ // Do nothing.
+ }
+ };
+
/**
* Linked lists of active spans and a freelist.
*
@@ -1327,6 +1343,9 @@ public final class StrictMode {
* @hide
*/
public static Span enterCriticalSpan(String name) {
+ if (IS_USER_BUILD) {
+ return NO_OP_SPAN;
+ }
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("name must be non-null and non-empty");
}
@@ -1350,6 +1369,7 @@ public final class StrictMode {
if (span.mNext != null) {
span.mNext.mPrev = span;
}
+ if (LOG_V) Log.d(TAG, "Span enter=" + name + "; size=" + state.mActiveSize);
}
return span;
}
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 12b9f0c..e869f3f 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -31,6 +32,7 @@ import android.view.AbsSavedState;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -52,6 +54,7 @@ import java.util.Set;
* {@link SharedPreferences}. It is up to the subclass to decide how to store
* the value.
*
+ * @attr ref android.R.styleable#Preference_icon
* @attr ref android.R.styleable#Preference_key
* @attr ref android.R.styleable#Preference_title
* @attr ref android.R.styleable#Preference_summary
@@ -87,6 +90,11 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis
private int mOrder = DEFAULT_ORDER;
private CharSequence mTitle;
private CharSequence mSummary;
+ /**
+ * mIconResId is overridden by mIcon, if mIcon is specified.
+ */
+ private int mIconResId;
+ private Drawable mIcon;
private String mKey;
private Intent mIntent;
private String mFragment;
@@ -197,6 +205,10 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis
for (int i = a.getIndexCount(); i >= 0; i--) {
int attr = a.getIndex(i);
switch (attr) {
+ case com.android.internal.R.styleable.Preference_icon:
+ mIconResId = a.getResourceId(attr, 0);
+ break;
+
case com.android.internal.R.styleable.Preference_key:
mKey = a.getString(attr);
break;
@@ -499,11 +511,20 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis
}
}
+ ImageView imageView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
+ if (imageView != null && (mIconResId != 0 || mIcon != null)) {
+ if (mIcon == null) {
+ mIcon = getContext().getResources().getDrawable(mIconResId);
+ }
+ if (mIcon != null) {
+ imageView.setImageDrawable(mIcon);
+ }
+ }
if (mShouldDisableView) {
setEnabledStateOnViews(view, isEnabled());
}
}
-
+
/**
* Makes sure the view (and any children) get the enabled state changed.
*/
@@ -587,6 +608,42 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis
}
/**
+ * Sets the icon for this Preference with a Drawable.
+ * This icon will be placed into the ID
+ * {@link android.R.id#icon} within the View created by
+ * {@link #onCreateView(ViewGroup)}.
+ *
+ * @param icon The optional icon for this Preference.
+ */
+ public void setIcon(Drawable icon) {
+ if ((icon == null && mIcon != null) || (icon != null && mIcon != icon)) {
+ mIcon = icon;
+ notifyChanged();
+ }
+ }
+
+ /**
+ * Sets the icon for this Preference with a resource ID.
+ *
+ * @see #setIcon(Drawable)
+ * @param iconResId The icon as a resource ID.
+ */
+ public void setIcon(int iconResId) {
+ mIconResId = iconResId;
+ setIcon(mContext.getResources().getDrawable(iconResId));
+ }
+
+ /**
+ * Returns the icon of this Preference.
+ *
+ * @return The icon.
+ * @see #setIcon(Drawable)
+ */
+ public Drawable getIcon() {
+ return mIcon;
+ }
+
+ /**
* Returns the summary of this Preference.
*
* @return The summary.
diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java
index 0ce69ad..39f3cee 100644
--- a/core/java/android/preference/PreferenceActivity.java
+++ b/core/java/android/preference/PreferenceActivity.java
@@ -23,6 +23,7 @@ import org.xmlpull.v1.XmlPullParserException;
import android.app.Fragment;
import android.app.FragmentBreadCrumbs;
+import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ListActivity;
import android.content.Context;
@@ -902,7 +903,8 @@ public abstract class PreferenceActivity extends ListActivity implements
}
private void switchToHeaderInner(String fragmentName, Bundle args, int direction) {
- getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
+ getFragmentManager().popBackStack(BACK_STACK_PREFS,
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
Fragment f = Fragment.instantiate(this, fragmentName, args);
FragmentTransaction transaction = getFragmentManager().openTransaction();
transaction.setTransition(direction == 0 ? FragmentTransaction.TRANSIT_NONE
@@ -934,7 +936,8 @@ public abstract class PreferenceActivity extends ListActivity implements
if (mCurHeader == header) {
// This is the header we are currently displaying. Just make sure
// to pop the stack up to its root state.
- getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
+ getFragmentManager().popBackStack(BACK_STACK_PREFS,
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
int direction = mHeaders.indexOf(header) - mHeaders.indexOf(mCurHeader);
switchToHeaderInner(header.fragment, header.fragmentArguments, direction);
@@ -1061,14 +1064,14 @@ public abstract class PreferenceActivity extends ListActivity implements
setResult(resultCode, resultData);
finish();
} else {
+ // XXX be smarter about popping the stack.
+ onBackPressed();
if (caller != null) {
if (caller.getTargetFragment() != null) {
caller.getTargetFragment().onActivityResult(caller.getTargetRequestCode(),
resultCode, resultData);
}
}
- // XXX be smarter about popping the stack.
- onBackPressed();
}
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index f0aa878..2d2f205 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -6127,6 +6127,14 @@ public final class ContactsContract {
public static final int STATUS_CHANGING_LOCALE = 3;
/**
+ * The status that indicates that there are no accounts and no contacts
+ * on the device.
+ *
+ * @hide
+ */
+ public static final int STATUS_NO_ACCOUNTS_NO_CONTACTS = 4;
+
+ /**
* Additional data associated with the status.
*
* @hide
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index dd25eaa..3fe4f4c 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -26,12 +26,11 @@ import android.graphics.Rect;
import android.text.method.TextKeyListener;
import android.text.style.AlignmentSpan;
import android.text.style.LeadingMarginSpan;
+import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
import android.text.style.LineBackgroundSpan;
import android.text.style.ParagraphStyle;
import android.text.style.ReplacementSpan;
import android.text.style.TabStopSpan;
-import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
-import android.view.KeyEvent;
import java.util.Arrays;
@@ -1056,23 +1055,30 @@ public abstract class Layout {
int lineEnd = getLineEnd(line);
int lineDir = getParagraphDirection(line);
+ boolean lineChanged = false;
boolean advance = toLeft == (lineDir == DIR_RIGHT_TO_LEFT);
- if (caret == (advance ? lineEnd : lineStart)) {
- // walking off line, so look at the line we're headed to
+ // if walking off line, look at the line we're headed to
+ if (advance) {
+ if (caret == lineEnd) {
+ if (line < getLineCount() - 1) {
+ lineChanged = true;
+ ++line;
+ } else {
+ return caret; // at very end, don't move
+ }
+ }
+ } else {
if (caret == lineStart) {
if (line > 0) {
+ lineChanged = true;
--line;
} else {
return caret; // at very start, don't move
}
- } else {
- if (line < getLineCount() - 1) {
- ++line;
- } else {
- return caret; // at very end, don't move
- }
}
+ }
+ if (lineChanged) {
lineStart = getLineStart(line);
lineEnd = getLineEnd(line);
int newDir = getParagraphDirection(line);
@@ -1672,6 +1678,7 @@ public abstract class Layout {
return new String(s);
}
+ @Override
public String toString() {
char[] s = new char[length()];
getChars(0, length(), s, 0);
@@ -1709,6 +1716,7 @@ public abstract class Layout {
return mSpanned.nextSpanTransition(start, limit, type);
}
+ @Override
public CharSequence subSequence(int start, int end) {
char[] s = new char[end - start];
getChars(start, end, s, 0);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index f9e7d18..a64ee9d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -628,10 +628,18 @@ public interface WindowManager extends ViewManager {
* to which all subsequent touches of that pointer will go until that
* pointer goes up thereby enabling touches with multiple pointers
* to be split across multiple windows.
- *
- * {@hide} */
+ */
public static final int FLAG_SPLIT_TOUCH = 0x00800000;
+
+ /**
+ * Indicates whether this window should be hardware accelerated.
+ * Requesting hardware acceleration does not guarantee it will happen.
+ */
+ public static final int FLAG_HARDWARE_ACCELERATED = 0x01000000;
+ // ----- HIDDEN FLAGS.
+ // These start at the high bit and go down.
+
/**
* Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU}
* and therefore needs a Menu key. For devices where Menu is a physical button this flag is
@@ -643,7 +651,7 @@ public interface WindowManager extends ViewManager {
*
* {@hide}
*/
- public static final int FLAG_NEEDS_MENU_KEY = 0x01000000;
+ public static final int FLAG_NEEDS_MENU_KEY = 0x08000000;
/** Window flag: *sigh* The lock screen wants to continue running its
* animation while it is fading. A kind-of hack to allow this. Maybe
@@ -664,12 +672,6 @@ public interface WindowManager extends ViewManager {
* it is created.
* {@hide} */
public static final int FLAG_SYSTEM_ERROR = 0x40000000;
-
- /**
- * Indicates whether this window should be hardware accelerated.
- * Requesting hardware acceleration does not guarantee it will happen.
- */
- public static final int FLAG_HARDWARE_ACCELERATED = 0x80000000;
/**
* Given a particular set of window manager flags, determine whether
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 5e7a133..fe55f34 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -27,6 +27,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.util.Log;
+import android.util.Pair;
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.view.KeyEvent;
@@ -502,6 +503,14 @@ public final class InputMethodManager {
}
}
+ public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) {
+ try {
+ return mService.getEnabledInputMethodSubtypeList(imi);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public void showStatusIcon(IBinder imeToken, String packageName, int iconId) {
try {
mService.updateStatusIcon(imeToken, packageName, iconId);
diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java
index 8b76a3b..071eb8c 100644
--- a/core/java/android/webkit/CookieSyncManager.java
+++ b/core/java/android/webkit/CookieSyncManager.java
@@ -65,11 +65,6 @@ public final class CookieSyncManager extends WebSyncManager {
// time when last update happened
private long mLastUpdate;
- // Used by the Chromium HTTP stack. Everything else in this class is used only by the Android
- // Java HTTP stack.
- private static String sDatabaseDirectory;
- private static String sCacheDirectory;
-
private CookieSyncManager(Context context) {
super(context, "CookieSyncManager");
}
@@ -93,11 +88,10 @@ public final class CookieSyncManager extends WebSyncManager {
*/
public static synchronized CookieSyncManager createInstance(
Context context) {
+ JniUtil.setContext(context);
Context appContext = context.getApplicationContext();
if (sRef == null) {
sRef = new CookieSyncManager(appContext);
- sDatabaseDirectory = appContext.getDatabasePath("dummy").getParent();
- sCacheDirectory = appContext.getCacheDir().getAbsolutePath();
}
return sRef;
}
@@ -222,22 +216,4 @@ public final class CookieSyncManager extends WebSyncManager {
+ "before CookieSyncManager::getInstance()");
}
}
-
- /**
- * Called by JNI. Gets the application's database directory, excluding the trailing slash.
- * @return String The application's database directory
- */
- private static synchronized String getDatabaseDirectory() {
- checkInstanceIsCreated();
- return sDatabaseDirectory;
- }
-
- /**
- * Called by JNI. Gets the application's cache directory, excluding the trailing slash.
- * @return String The application's cache directory
- */
- private static synchronized String getCacheDirectory() {
- checkInstanceIsCreated();
- return sCacheDirectory;
- }
}
diff --git a/core/java/android/webkit/GeolocationPermissions.java b/core/java/android/webkit/GeolocationPermissions.java
index 4565b75..5d54180 100755
--- a/core/java/android/webkit/GeolocationPermissions.java
+++ b/core/java/android/webkit/GeolocationPermissions.java
@@ -146,7 +146,7 @@ public final class GeolocationPermissions {
boolean allowed = nativeGetAllowed(origin);
Map retValues = new HashMap<String, Object>();
retValues.put(CALLBACK, callback);
- retValues.put(ALLOWED, new Boolean(allowed));
+ retValues.put(ALLOWED, Boolean.valueOf(allowed));
postUIMessage(Message.obtain(null, RETURN_ALLOWED, retValues));
} break;
case CLEAR:
diff --git a/core/java/android/webkit/JniUtil.java b/core/java/android/webkit/JniUtil.java
new file mode 100644
index 0000000..ef44d3a
--- /dev/null
+++ b/core/java/android/webkit/JniUtil.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import android.content.Context;
+
+class JniUtil {
+ // Used by the Chromium HTTP stack.
+ private static String sDatabaseDirectory;
+ private static String sCacheDirectory;
+
+ private static boolean initialized = false;
+
+ private static void checkIntialized() {
+ if (!initialized) {
+ throw new IllegalStateException("Call CookieSyncManager::createInstance() or create a webview before using this class");
+ }
+ }
+
+ protected static synchronized void setContext(Context context) {
+ if (initialized)
+ return;
+
+ Context appContext = context.getApplicationContext();
+ sDatabaseDirectory = appContext.getDatabasePath("dummy").getParent();
+ sCacheDirectory = appContext.getCacheDir().getAbsolutePath();
+ initialized = true;
+ }
+
+ /**
+ * Called by JNI. Gets the application's database directory, excluding the trailing slash.
+ * @return String The application's database directory
+ */
+ private static synchronized String getDatabaseDirectory() {
+ checkIntialized();
+ return sDatabaseDirectory;
+ }
+
+ /**
+ * Called by JNI. Gets the application's cache directory, excluding the trailing slash.
+ * @return String The application's cache directory
+ */
+ private static synchronized String getCacheDirectory() {
+ checkIntialized();
+ return sCacheDirectory;
+ }
+}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 06800d5..f2988bc 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -893,6 +893,9 @@ public class WebView extends AbsoluteLayout
Map<String, Object> javascriptInterfaces, boolean privateBrowsing) {
super(context, attrs, defStyle);
+ // Used by the chrome stack to find application paths
+ JniUtil.setContext(context);
+
if (AccessibilityManager.getInstance(context).isEnabled()) {
if (javascriptInterfaces == null) {
javascriptInterfaces = new HashMap<String, Object>();
@@ -3555,6 +3558,7 @@ public class WebView extends AbsoluteLayout
if (inEditingMode()) {
return mWebTextView.performLongClick();
}
+ if (mSelectingText) return false; // long click does nothing on selection
/* if long click brings up a context menu, the super function
* returns true and we're done. Otherwise, nothing happened when
* the user clicked. */
@@ -3565,7 +3569,6 @@ public class WebView extends AbsoluteLayout
* click action, look for a word under the click. If one is found,
* animate the text selection into view.
* FIXME: no animation code yet */
- if (mSelectingText) return false; // long click does nothing on selection
int x = viewToContentX((int) mLastTouchX + mScrollX);
int y = viewToContentY((int) mLastTouchY + mScrollY);
setUpSelect();
@@ -4185,9 +4188,8 @@ public class WebView extends AbsoluteLayout
if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
|| keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) {
- if (pageShouldHandleShiftAndArrows()) {
- mShiftIsPressed = true;
- } else if (!nativeCursorWantsKeyEvents() && !mSelectingText) {
+ if (!pageShouldHandleShiftAndArrows() && !nativeCursorWantsKeyEvents()
+ && !mSelectingText) {
setUpSelect();
}
}
@@ -4206,7 +4208,7 @@ public class WebView extends AbsoluteLayout
&& keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) {
switchOutDrawHistory();
if (pageShouldHandleShiftAndArrows()) {
- letPageHandleNavKey(keyCode, event.getEventTime(), true);
+ letPageHandleNavKey(keyCode, event.getEventTime(), true, event.getMetaState());
return true;
}
if (mSelectingText) {
@@ -4248,7 +4250,6 @@ public class WebView extends AbsoluteLayout
&& keyCode != KeyEvent.KEYCODE_SHIFT_RIGHT) {
// turn off copy select if a shift-key combo is pressed
selectionDone();
- mShiftIsPressed = false;
}
if (getSettings().getNavDump()) {
@@ -4339,9 +4340,7 @@ public class WebView extends AbsoluteLayout
if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
|| keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) {
- if (pageShouldHandleShiftAndArrows()) {
- mShiftIsPressed = false;
- } else if (copySelection()) {
+ if (!pageShouldHandleShiftAndArrows() && copySelection()) {
selectionDone();
return true;
}
@@ -4350,7 +4349,7 @@ public class WebView extends AbsoluteLayout
if (keyCode >= KeyEvent.KEYCODE_DPAD_UP
&& keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) {
if (pageShouldHandleShiftAndArrows()) {
- letPageHandleNavKey(keyCode, event.getEventTime(), false);
+ letPageHandleNavKey(keyCode, event.getEventTime(), false, event.getMetaState());
return true;
}
// always handle the navigation keys in the UI thread
@@ -4592,7 +4591,6 @@ public class WebView extends AbsoluteLayout
mDrawCursorRing = false;
}
mGotKeyDown = false;
- mShiftIsPressed = false;
mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
mTouchMode = TOUCH_DONE_MODE;
if (mNativeClass != 0) {
@@ -5529,7 +5527,6 @@ public class WebView extends AbsoluteLayout
private int mSelectX = 0;
private int mSelectY = 0;
private boolean mFocusSizeChanged = false;
- private boolean mShiftIsPressed = false;
private boolean mTrackballDown = false;
private long mTrackballUpTime = 0;
private long mLastCursorTime = 0;
@@ -5600,7 +5597,7 @@ public class WebView extends AbsoluteLayout
}
return false; // let common code in onKeyUp at it
}
- if ((mMapTrackballToArrowKeys && mShiftIsPressed == false) ||
+ if ((mMapTrackballToArrowKeys && (ev.getMetaState() & KeyEvent.META_SHIFT_ON) == 0) ||
(mAccessibilityInjector != null || mAccessibilityScriptInjected)) {
if (DebugFlags.WEB_VIEW) Log.v(LOGTAG, "onTrackballEvent gmail quit");
return false;
@@ -5629,7 +5626,7 @@ public class WebView extends AbsoluteLayout
}
mTrackballRemainsX += ev.getX();
mTrackballRemainsY += ev.getY();
- doTrackball(time);
+ doTrackball(time, ev.getMetaState());
return true;
}
@@ -5713,7 +5710,7 @@ public class WebView extends AbsoluteLayout
"KEYCODE_DPAD_LEFT}.");
}
- private void doTrackball(long time) {
+ private void doTrackball(long time, int metaState) {
int elapsed = (int) (mTrackballLastTime - mTrackballFirstTime);
if (elapsed == 0) {
elapsed = TRACKBALL_TIMEOUT;
@@ -5771,9 +5768,9 @@ public class WebView extends AbsoluteLayout
}
if (mNativeClass != 0 && nativePageShouldHandleShiftAndArrows()) {
for (int i = 0; i < count; i++) {
- letPageHandleNavKey(selectKeyCode, time, true);
+ letPageHandleNavKey(selectKeyCode, time, true, metaState);
}
- letPageHandleNavKey(selectKeyCode, time, false);
+ letPageHandleNavKey(selectKeyCode, time, false, metaState);
} else if (navHandledKey(selectKeyCode, count, false, time)) {
playSoundEffect(keyCodeToSoundsEffect(selectKeyCode));
}
@@ -6446,7 +6443,8 @@ public class WebView extends AbsoluteLayout
mUserScroll = false;
break;
}
- // fall through
+ setContentScrollTo(msg.arg1, msg.arg2);
+ break;
case SCROLL_TO_MSG_ID:
if (setContentScrollTo(msg.arg1, msg.arg2)) {
// if we can't scroll to the exact position due to pin,
@@ -7282,7 +7280,7 @@ public class WebView extends AbsoluteLayout
* Pass the key directly to the page. This assumes that
* nativePageShouldHandleShiftAndArrows() returned true.
*/
- private void letPageHandleNavKey(int keyCode, long time, boolean down) {
+ private void letPageHandleNavKey(int keyCode, long time, boolean down, int metaState) {
int keyEventAction;
int eventHubAction;
if (down) {
@@ -7293,10 +7291,11 @@ public class WebView extends AbsoluteLayout
keyEventAction = KeyEvent.ACTION_UP;
eventHubAction = EventHub.KEY_UP;
}
+
KeyEvent event = new KeyEvent(time, time, keyEventAction, keyCode,
- 1, (mShiftIsPressed ? KeyEvent.META_SHIFT_ON : 0)
- | (false ? KeyEvent.META_ALT_ON : 0) // FIXME
- | (false ? KeyEvent.META_SYM_ON : 0) // FIXME
+ 1, (metaState & KeyEvent.META_SHIFT_ON)
+ | (metaState & KeyEvent.META_ALT_ON)
+ | (metaState & KeyEvent.META_SYM_ON)
, 0, 0, 0);
mWebViewCore.sendMessage(eventHubAction, event);
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 8c515db..17f0a97 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -285,7 +285,9 @@ final class WebViewCore {
int fileType = MediaFile.getFileTypeForMimeType(mimeType);
return MediaFile.isAudioFileType(fileType)
|| MediaFile.isVideoFileType(fileType)
- || MediaFile.isPlayListFileType(fileType);
+ || MediaFile.isPlayListFileType(fileType)
+ // The following is not in Media framework, but it's supported.
+ || (mimeType != null && mimeType.startsWith("video/m4v"));
}
/**
@@ -2054,7 +2056,7 @@ final class WebViewCore {
}
if (mWebView != null) {
Message msg = Message.obtain(mWebView.mPrivateHandler,
- WebView.SCROLL_BY_MSG_ID, dx, dy, new Boolean(animate));
+ WebView.SCROLL_BY_MSG_ID, dx, dy, Boolean.valueOf(animate));
if (mDrawIsScheduled) {
mEventHub.sendMessage(Message.obtain(null,
EventHub.MESSAGE_RELAY, msg));
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index ab5ff3d..d388985 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -29,6 +29,7 @@ import android.os.Debug;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.StrictMode;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -460,6 +461,15 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private boolean mFlingProfilingStarted = false;
/**
+ * The StrictMode "critical time span" objects to catch animation
+ * stutters. Non-null when a time-sensitive animation is
+ * in-flight. Must call finish() on them when done animating.
+ * These are no-ops on user builds.
+ */
+ private StrictMode.Span mScrollStrictSpan = null;
+ private StrictMode.Span mFlingStrictSpan = null;
+
+ /**
* The last CheckForLongPress runnable we posted, if any
*/
private CheckForLongPress mPendingCheckForLongPress;
@@ -2089,6 +2099,16 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mAdapter.unregisterDataSetObserver(mDataSetObserver);
mDataSetObserver = null;
}
+
+ if (mScrollStrictSpan != null) {
+ mScrollStrictSpan.finish();
+ mScrollStrictSpan = null;
+ }
+
+ if (mFlingStrictSpan != null) {
+ mFlingStrictSpan.finish();
+ mFlingStrictSpan = null;
+ }
}
@Override
@@ -2523,6 +2543,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mMotionCorrection = 0;
motionPosition = findMotionRow(y);
reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
+ mFlingRunnable.flywheelTouch();
}
}
}
@@ -2559,6 +2580,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
}
+ if (mScrollStrictSpan == null) {
+ // If it's non-null, we're already in a scroll.
+ mScrollStrictSpan = StrictMode.enterCriticalSpan("AbsListView-scroll");
+ }
+
if (y != mLastY) {
// We may be here after stopping a fling and continuing to scroll.
// If so, we haven't disallowed intercepting touch events yet.
@@ -2690,6 +2716,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
} else {
mTouchMode = TOUCH_MODE_REST;
reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
+ if (mFlingRunnable != null) {
+ mFlingRunnable.endFling();
+ }
}
}
} else {
@@ -2722,13 +2751,18 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mScrollProfilingStarted = false;
}
}
+
+ if (mScrollStrictSpan != null) {
+ mScrollStrictSpan.finish();
+ mScrollStrictSpan = null;
+ }
break;
}
case MotionEvent.ACTION_CANCEL: {
mTouchMode = TOUCH_MODE_REST;
setPressed(false);
- View motionView = this.getChildAt(mMotionPosition - mFirstPosition);
+ View motionView = getChildAt(mMotionPosition - mFirstPosition);
if (motionView != null) {
motionView.setPressed(false);
}
@@ -2893,8 +2927,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
void reportScrollStateChange(int newState) {
if (newState != mLastScrollState) {
if (mOnScrollListener != null) {
- mOnScrollListener.onScrollStateChanged(this, newState);
mLastScrollState = newState;
+ mOnScrollListener.onScrollStateChanged(this, newState);
}
}
}
@@ -2916,6 +2950,30 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
*/
private int mLastFlingY;
+ private final Runnable mCheckFlywheel = new Runnable() {
+ public void run() {
+ final int activeId = mActivePointerId;
+ final VelocityTracker vt = mVelocityTracker;
+ final Scroller scroller = mScroller;
+ if (vt == null || activeId == INVALID_POINTER) {
+ return;
+ }
+
+ vt.computeCurrentVelocity(1000, mMaximumVelocity);
+ final float yvel = -vt.getYVelocity(activeId);
+
+ if (scroller.isScrollingInDirection(0, yvel)) {
+ // Keep the fling alive a little longer
+ postDelayed(this, FLYWHEEL_TIMEOUT);
+ } else {
+ endFling();
+ mTouchMode = TOUCH_MODE_SCROLL;
+ }
+ }
+ };
+
+ private static final int FLYWHEEL_TIMEOUT = 40; // milliseconds
+
FlingRunnable() {
mScroller = new Scroller(getContext());
}
@@ -2934,6 +2992,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mFlingProfilingStarted = true;
}
}
+
+ if (mFlingStrictSpan == null) {
+ mFlingStrictSpan = StrictMode.enterCriticalSpan("AbsListView-fling");
+ }
}
void startScroll(int distance, int duration) {
@@ -2944,79 +3006,93 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
post(this);
}
- private void endFling() {
+ void endFling() {
mTouchMode = TOUCH_MODE_REST;
removeCallbacks(this);
+ removeCallbacks(mCheckFlywheel);
if (mPositionScroller != null) {
removeCallbacks(mPositionScroller);
}
reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
clearScrollingCache();
+ mScroller.abortAnimation();
+ }
+
+ void flywheelTouch() {
+ postDelayed(mCheckFlywheel, FLYWHEEL_TIMEOUT);
}
public void run() {
switch (mTouchMode) {
default:
+ endFling();
return;
- case TOUCH_MODE_FLING: {
+ case TOUCH_MODE_SCROLL:
+ if (mScroller.isFinished()) {
+ return;
+ }
+ // Fall through
+ case TOUCH_MODE_FLING:
if (mItemCount == 0 || getChildCount() == 0) {
endFling();
return;
}
+ break;
+ }
+ final Scroller scroller = mScroller;
+ boolean more = scroller.computeScrollOffset();
+ final int y = scroller.getCurrY();
- final Scroller scroller = mScroller;
- boolean more = scroller.computeScrollOffset();
- final int y = scroller.getCurrY();
-
- // Flip sign to convert finger direction to list items direction
- // (e.g. finger moving down means list is moving towards the top)
- int delta = mLastFlingY - y;
-
- // Pretend that each frame of a fling scroll is a touch scroll
- if (delta > 0) {
- // List is moving towards the top. Use first view as mMotionPosition
- mMotionPosition = mFirstPosition;
- final View firstView = getChildAt(0);
- mMotionViewOriginalTop = firstView.getTop();
-
- // Don't fling more than 1 screen
- delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta);
- } else {
- // List is moving towards the bottom. Use last view as mMotionPosition
- int offsetToLast = getChildCount() - 1;
- mMotionPosition = mFirstPosition + offsetToLast;
+ // Flip sign to convert finger direction to list items direction
+ // (e.g. finger moving down means list is moving towards the top)
+ int delta = mLastFlingY - y;
- final View lastView = getChildAt(offsetToLast);
- mMotionViewOriginalTop = lastView.getTop();
+ // Pretend that each frame of a fling scroll is a touch scroll
+ if (delta > 0) {
+ // List is moving towards the top. Use first view as mMotionPosition
+ mMotionPosition = mFirstPosition;
+ final View firstView = getChildAt(0);
+ mMotionViewOriginalTop = firstView.getTop();
- // Don't fling more than 1 screen
- delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta);
- }
+ // Don't fling more than 1 screen
+ delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta);
+ } else {
+ // List is moving towards the bottom. Use last view as mMotionPosition
+ int offsetToLast = getChildCount() - 1;
+ mMotionPosition = mFirstPosition + offsetToLast;
- // Don't stop just because delta is zero (it could have been rounded)
- final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0);
+ final View lastView = getChildAt(offsetToLast);
+ mMotionViewOriginalTop = lastView.getTop();
- if (more && !atEnd) {
- invalidate();
- mLastFlingY = y;
- post(this);
- } else {
- endFling();
-
- if (PROFILE_FLINGING) {
- if (mFlingProfilingStarted) {
- Debug.stopMethodTracing();
- mFlingProfilingStarted = false;
- }
+ // Don't fling more than 1 screen
+ delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta);
+ }
+
+ // Don't stop just because delta is zero (it could have been rounded)
+ final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0);
+
+ if (more && !atEnd) {
+ invalidate();
+ mLastFlingY = y;
+ post(this);
+ } else {
+ endFling();
+
+ if (PROFILE_FLINGING) {
+ if (mFlingProfilingStarted) {
+ Debug.stopMethodTracing();
+ mFlingProfilingStarted = false;
+ }
+
+ if (mFlingStrictSpan != null) {
+ mFlingStrictSpan.finish();
+ mFlingStrictSpan = null;
}
}
- break;
- }
}
-
}
}
@@ -3431,12 +3507,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
public void smoothScrollBy(int distance, int duration) {
if (mFlingRunnable == null) {
mFlingRunnable = new FlingRunnable();
- } else {
- mFlingRunnable.endFling();
}
// No sense starting to scroll if we're not going anywhere
if (distance != 0) {
+ reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
mFlingRunnable.startScroll(distance, duration);
+ } else {
+ mFlingRunnable.endFling();
}
}
@@ -3569,7 +3646,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
int count = 0;
if (down) {
- final int top = listPadding.top - incrementalDeltaY;
+ int top = -incrementalDeltaY;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ top += listPadding.top;
+ }
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
if (child.getBottom() >= top) {
@@ -3589,7 +3669,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
}
} else {
- final int bottom = getHeight() - listPadding.bottom - incrementalDeltaY;
+ int bottom = getHeight() - incrementalDeltaY;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ bottom -= listPadding.bottom;
+ }
for (int i = childCount - 1; i >= 0; i--) {
final View child = getChildAt(i);
if (child.getTop() <= bottom) {
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index b963536..114ae81 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -196,8 +196,12 @@ public class GridView extends AbsListView {
final int count = getChildCount();
if (down) {
+ int paddingTop = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ paddingTop = getListPaddingTop();
+ }
final int startOffset = count > 0 ?
- getChildAt(count - 1).getBottom() + verticalSpacing : getListPaddingTop();
+ getChildAt(count - 1).getBottom() + verticalSpacing : paddingTop;
int position = mFirstPosition + count;
if (mStackFromBottom) {
position += numColumns - 1;
@@ -205,8 +209,12 @@ public class GridView extends AbsListView {
fillDown(position, startOffset);
correctTooHigh(numColumns, verticalSpacing, getChildCount());
} else {
+ int paddingBottom = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ paddingBottom = getListPaddingBottom();
+ }
final int startOffset = count > 0 ?
- getChildAt(0).getTop() - verticalSpacing : getHeight() - getListPaddingBottom();
+ getChildAt(0).getTop() - verticalSpacing : getHeight() - paddingBottom;
int position = mFirstPosition;
if (!mStackFromBottom) {
position -= numColumns;
@@ -232,7 +240,10 @@ public class GridView extends AbsListView {
private View fillDown(int pos, int nextTop) {
View selectedView = null;
- final int end = (mBottom - mTop) - mListPadding.bottom;
+ int end = (mBottom - mTop);
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ end -= mListPadding.bottom;
+ }
while (nextTop < end && pos < mItemCount) {
View temp = makeRow(pos, nextTop, true);
@@ -316,7 +327,10 @@ public class GridView extends AbsListView {
private View fillUp(int pos, int nextBottom) {
View selectedView = null;
- final int end = mListPadding.top;
+ int end = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ end = mListPadding.top;
+ }
while (nextBottom > end && pos >= 0) {
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index e0119e9..502cc38 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -595,13 +595,21 @@ public class ListView extends AbsListView {
void fillGap(boolean down) {
final int count = getChildCount();
if (down) {
+ int paddingTop = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ paddingTop = getListPaddingTop();
+ }
final int startOffset = count > 0 ? getChildAt(count - 1).getBottom() + mDividerHeight :
- getListPaddingTop();
+ paddingTop;
fillDown(mFirstPosition + count, startOffset);
correctTooHigh(getChildCount());
} else {
+ int paddingBottom = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ paddingBottom = getListPaddingBottom();
+ }
final int startOffset = count > 0 ? getChildAt(0).getTop() - mDividerHeight :
- getHeight() - getListPaddingBottom();
+ getHeight() - paddingBottom;
fillUp(mFirstPosition - 1, startOffset);
correctTooLow(getChildCount());
}
@@ -621,7 +629,10 @@ public class ListView extends AbsListView {
private View fillDown(int pos, int nextTop) {
View selectedView = null;
- int end = (mBottom - mTop) - mListPadding.bottom;
+ int end = (mBottom - mTop);
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ end -= mListPadding.bottom;
+ }
while (nextTop < end && pos < mItemCount) {
// is this the selected item?
@@ -651,7 +662,10 @@ public class ListView extends AbsListView {
private View fillUp(int pos, int nextBottom) {
View selectedView = null;
- int end = mListPadding.top;
+ int end = 0;
+ if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
+ end = mListPadding.top;
+ }
while (nextBottom > end && pos >= 0) {
// is this the selected item?
diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java
index 79ab448..b1f50ba 100644
--- a/core/java/android/widget/Scroller.java
+++ b/core/java/android/widget/Scroller.java
@@ -18,6 +18,8 @@ package android.widget;
import android.content.Context;
import android.hardware.SensorManager;
+import android.os.Build;
+import android.util.FloatMath;
import android.view.ViewConfiguration;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
@@ -54,6 +56,7 @@ public class Scroller {
private float mViscousFluidNormalize;
private boolean mFinished;
private Interpolator mInterpolator;
+ private boolean mFlywheel;
private float mCoeffX = 0.0f;
private float mCoeffY = 1.0f;
@@ -63,9 +66,36 @@ public class Scroller {
private static final int SCROLL_MODE = 0;
private static final int FLING_MODE = 1;
+ private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math.log(0.9));
+ private static float ALPHA = 800; // pixels / seconds
+ private static float START_TENSION = 0.4f; // Tension at start: (0.4 * total T, 1.0 * Distance)
+ private static float END_TENSION = 1.0f - START_TENSION;
+ private static final int NB_SAMPLES = 100;
+ private static final float[] SPLINE = new float[NB_SAMPLES + 1];
+
private float mDeceleration;
private final float mPpi;
+ static {
+ float x_min = 0.0f;
+ for (int i = 0; i <= NB_SAMPLES; i++) {
+ final float t = (float) i / NB_SAMPLES;
+ float x_max = 1.0f;
+ float x, tx, coef;
+ while (true) {
+ x = x_min + (x_max - x_min) / 2.0f;
+ coef = 3.0f * x * (1.0f - x);
+ tx = coef * ((1.0f - x) * START_TENSION + x * END_TENSION) + x * x * x;
+ if (Math.abs(tx - t) < 1E-5) break;
+ if (tx > t) x_max = x;
+ else x_min = x;
+ }
+ final float d = coef + x * x * x;
+ SPLINE[i] = d;
+ }
+ SPLINE[NB_SAMPLES] = 1.0f;
+ }
+
/**
* Create a Scroller with the default duration and interpolator.
*/
@@ -73,22 +103,28 @@ public class Scroller {
this(context, null);
}
+ public Scroller(Context context, Interpolator interpolator) {
+ this(context, interpolator,
+ context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB);
+ }
+
/**
* Create a Scroller with the specified interpolator. If the interpolator is
* null, the default (viscous) interpolator will be used.
*/
- public Scroller(Context context, Interpolator interpolator) {
+ public Scroller(Context context, Interpolator interpolator, boolean flywheel) {
mFinished = true;
mInterpolator = interpolator;
mPpi = context.getResources().getDisplayMetrics().density * 160.0f;
mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction());
+ mFlywheel = flywheel;
}
/**
* The amount of friction applied to flings. The default value
* is {@link ViewConfiguration#getScrollFriction}.
*
- * @return A scalar dimensionless value representing the coefficient of
+ * @param friction A scalar dimension-less value representing the coefficient of
* friction.
*/
public final void setFriction(float friction) {
@@ -210,7 +246,7 @@ public class Scroller {
if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
- float x = (float)timePassed * mDurationReciprocal;
+ float x = timePassed * mDurationReciprocal;
if (mInterpolator == null)
x = viscousFluid(x);
@@ -221,16 +257,20 @@ public class Scroller {
mCurrY = mStartY + Math.round(x * mDeltaY);
break;
case FLING_MODE:
- float timePassedSeconds = timePassed / 1000.0f;
- float distance = (mVelocity * timePassedSeconds)
- - (mDeceleration * timePassedSeconds * timePassedSeconds / 2.0f);
+ final float t = (float) timePassed / mDuration;
+ final int index = (int) (NB_SAMPLES * t);
+ final float t_inf = (float) index / NB_SAMPLES;
+ final float t_sup = (float) (index + 1) / NB_SAMPLES;
+ final float d_inf = SPLINE[index];
+ final float d_sup = SPLINE[index + 1];
+ final float distanceCoef = d_inf + (t - t_inf) / (t_sup - t_inf) * (d_sup - d_inf);
- mCurrX = mStartX + Math.round(distance * mCoeffX);
+ mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX));
// Pin to mMinX <= mCurrX <= mMaxX
mCurrX = Math.min(mCurrX, mMaxX);
mCurrX = Math.max(mCurrX, mMinX);
- mCurrY = mStartY + Math.round(distance * mCoeffY);
+ mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY));
// Pin to mMinY <= mCurrY <= mMaxY
mCurrY = Math.min(mCurrY, mMaxY);
mCurrY = Math.max(mCurrY, mMinY);
@@ -292,7 +332,7 @@ public class Scroller {
mFinalY = startY + dy;
mDeltaX = dx;
mDeltaY = dy;
- mDurationReciprocal = 1.0f / (float) mDuration;
+ mDurationReciprocal = 1.0f / mDuration;
// This controls the viscous fluid effect (how much of it)
mViscousFluidScale = 8.0f;
// must be set to 1.0 (used in viscousFluid())
@@ -321,14 +361,34 @@ public class Scroller {
*/
public void fling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY) {
+ // Continue a scroll or fling in progress
+ if (mFlywheel && !mFinished) {
+ float oldVel = getCurrVelocity();
+
+ float dx = (float) (mFinalX - mStartX);
+ float dy = (float) (mFinalY - mStartY);
+ float hyp = FloatMath.sqrt(dx * dx + dy * dy);
+
+ float ndx = dx / hyp;
+ float ndy = dy / hyp;
+
+ float oldVelocityX = ndx * oldVel;
+ float oldVelocityY = ndy * oldVel;
+ if (Math.signum(velocityX) == Math.signum(oldVelocityX) &&
+ Math.signum(velocityY) == Math.signum(oldVelocityY)) {
+ velocityX += oldVelocityX;
+ velocityY += oldVelocityY;
+ }
+ }
+
mMode = FLING_MODE;
mFinished = false;
- float velocity = (float)Math.hypot(velocityX, velocityY);
+ float velocity = FloatMath.sqrt(velocityX * velocityX + velocityY * velocityY);
mVelocity = velocity;
- mDuration = (int) (1000 * velocity / mDeceleration); // Duration is in
- // milliseconds
+ final double l = Math.log(START_TENSION * velocity / ALPHA);
+ mDuration = (int) (1000.0 * Math.exp(l / (DECELERATION_RATE - 1.0)));
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartX = startX;
mStartY = startY;
@@ -336,14 +396,14 @@ public class Scroller {
mCoeffX = velocity == 0 ? 1.0f : velocityX / velocity;
mCoeffY = velocity == 0 ? 1.0f : velocityY / velocity;
- int totalDistance = (int) ((velocity * velocity) / (2 * mDeceleration));
+ int totalDistance =
+ (int) (ALPHA * Math.exp(DECELERATION_RATE / (DECELERATION_RATE - 1.0) * l));
mMinX = minX;
mMaxX = maxX;
mMinY = minY;
mMaxY = maxY;
-
-
+
mFinalX = startX + Math.round(totalDistance * mCoeffX);
// Pin to mMinX <= mFinalX <= mMaxX
mFinalX = Math.min(mFinalX, mMaxX);
@@ -395,7 +455,7 @@ public class Scroller {
public void extendDuration(int extend) {
int passed = timePassed();
mDuration = passed + extend;
- mDurationReciprocal = 1.0f / (float)mDuration;
+ mDurationReciprocal = 1.0f / mDuration;
mFinished = false;
}
@@ -433,4 +493,12 @@ public class Scroller {
mDeltaY = mFinalY - mStartY;
mFinished = false;
}
+
+ /**
+ * @hide
+ */
+ public boolean isScrollingInDirection(float xvel, float yvel) {
+ return !mFinished && Math.signum(xvel) == Math.signum(mFinalX - mStartX) &&
+ Math.signum(yvel) == Math.signum(mFinalY - mStartY);
+ }
}
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 432dd4a..e2d78c0 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -100,6 +100,8 @@ public class StackView extends AdapterViewAnimator {
private static final int FRAME_PADDING = 4;
+ private final Rect mTouchRect = new Rect();
+
/**
* These variables are all related to the current state of touch interaction
* with the stack
@@ -531,7 +533,6 @@ public class StackView extends AdapterViewAnimator {
return true;
}
- private final Rect touchRect = new Rect();
private void onSecondaryPointerUp(MotionEvent ev) {
final int activePointerIndex = ev.getActionIndex();
final int pointerId = ev.getPointerId(activePointerIndex);
@@ -552,8 +553,8 @@ public class StackView extends AdapterViewAnimator {
float x = ev.getX(index);
float y = ev.getY(index);
- touchRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
- if (touchRect.contains(Math.round(x), Math.round(y))) {
+ mTouchRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
+ if (mTouchRect.contains(Math.round(x), Math.round(y))) {
float oldX = ev.getX(activePointerIndex);
float oldY = ev.getY(activePointerIndex);
@@ -1049,18 +1050,23 @@ public class StackView extends AdapterViewAnimator {
private static final int RES_OUT = 0;
private static final int CLICK_FEEDBACK = 1;
private float mDensity;
+ private BlurMaskFilter mSmallBlurMaskFilter;
+ private BlurMaskFilter mLargeBlurMaskFilter;
+ private final Canvas mCanvas = new Canvas();
+ private final Canvas mMaskCanvas = new Canvas();
+ private final int[] mTmpXY = new int[2];
+ private final Matrix mIdentityMatrix = new Matrix();
HolographicHelper(Context context) {
- initializePaints(context);
- }
-
- void initializePaints(Context context) {
mDensity = context.getResources().getDisplayMetrics().density;
mHolographicPaint.setFilterBitmap(true);
mHolographicPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30));
mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mErasePaint.setFilterBitmap(true);
+
+ mSmallBlurMaskFilter = new BlurMaskFilter(2 * mDensity, BlurMaskFilter.Blur.NORMAL);
+ mLargeBlurMaskFilter = new BlurMaskFilter(4 * mDensity, BlurMaskFilter.Blur.NORMAL);
}
Bitmap createOutline(View v) {
@@ -1070,10 +1076,10 @@ public class StackView extends AdapterViewAnimator {
Bitmap createOutline(View v, int type) {
if (type == RES_OUT) {
mHolographicPaint.setColor(0xff6699ff);
- mBlurPaint.setMaskFilter(new BlurMaskFilter(2*mDensity, BlurMaskFilter.Blur.NORMAL));
+ mBlurPaint.setMaskFilter(mSmallBlurMaskFilter);
} else if (type == CLICK_FEEDBACK) {
mHolographicPaint.setColor(0x886699ff);
- mBlurPaint.setMaskFilter(new BlurMaskFilter(4*mDensity, BlurMaskFilter.Blur.NORMAL));
+ mBlurPaint.setMaskFilter(mLargeBlurMaskFilter);
}
if (v.getMeasuredWidth() == 0 || v.getMeasuredHeight() == 0) {
@@ -1082,7 +1088,7 @@ public class StackView extends AdapterViewAnimator {
Bitmap bitmap = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
+ mCanvas.setBitmap(bitmap);
float rotationX = v.getRotationX();
float rotation = v.getRotation();
@@ -1090,23 +1096,22 @@ public class StackView extends AdapterViewAnimator {
v.setRotationX(0);
v.setRotation(0);
v.setTranslationY(0);
- v.draw(canvas);
+ v.draw(mCanvas);
v.setRotationX(rotationX);
v.setRotation(rotation);
v.setTranslationY(translationY);
- drawOutline(canvas, bitmap);
+ drawOutline(mCanvas, bitmap);
return bitmap;
}
- final Matrix id = new Matrix();
void drawOutline(Canvas dest, Bitmap src) {
- int[] xy = new int[2];
+ final int[] xy = mTmpXY;
Bitmap mask = src.extractAlpha(mBlurPaint, xy);
- Canvas maskCanvas = new Canvas(mask);
- maskCanvas.drawBitmap(src, -xy[0], -xy[1], mErasePaint);
+ mMaskCanvas.setBitmap(mask);
+ mMaskCanvas.drawBitmap(src, -xy[0], -xy[1], mErasePaint);
dest.drawColor(0, PorterDuff.Mode.CLEAR);
- dest.setMatrix(id);
+ dest.setMatrix(mIdentityMatrix);
dest.drawBitmap(mask, xy[0], xy[1], mHolographicPaint);
mask.recycle();
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index b143325..f32ae92 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -305,6 +305,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int mTextSelectHandleRes;
int mTextEditPasteWindowLayout;
int mTextEditNoPasteWindowLayout;
+ Drawable mEditTextMultilineBackground;
+ Drawable mEditTextSingleLineBackground;
Drawable mSelectHandleLeft;
Drawable mSelectHandleRight;
@@ -751,6 +753,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mTextEditNoPasteWindowLayout = a.getResourceId(attr, 0);
break;
+ case com.android.internal.R.styleable.TextView_multilineBackground:
+ mEditTextMultilineBackground = a.getDrawable(attr);
+ break;
+
case com.android.internal.R.styleable.TextView_textLineHeight:
int lineHeight = a.getDimensionPixelSize(attr, 0);
if (lineHeight != 0) {
@@ -765,6 +771,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
a.recycle();
+ mEditTextSingleLineBackground = getBackground();
BufferType bufferType = BufferType.EDITABLE;
final int variation =
@@ -6192,12 +6199,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (applyTransformation) {
setTransformationMethod(SingleLineTransformationMethod.getInstance());
}
+ setBackgroundDrawable(mEditTextSingleLineBackground);
} else {
setMaxLines(Integer.MAX_VALUE);
setHorizontallyScrolling(false);
if (applyTransformation) {
setTransformationMethod(null);
}
+ // mEditTextMultilineBackground is defined and used only in EditText
+ if (mEditTextMultilineBackground != null) {
+ setBackgroundDrawable(mEditTextMultilineBackground);
+ }
}
}
@@ -6711,7 +6723,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
+ " before=" + before + " after=" + after + ": " + buffer);
if (AccessibilityManager.getInstance(mContext).isEnabled()
- && !isPasswordInputType(mInputType)) {
+ && !isPasswordInputType(mInputType)
+ && !hasPasswordTransformationMethod()) {
mBeforeText = buffer.toString();
}
@@ -7590,7 +7603,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return false;
}
- final boolean isPassword = isPasswordInputType(mInputType);
+ final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword) {
CharSequence text = getText();
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index cd1cae6..20402a3 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -31,6 +31,7 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.ActionMode;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -212,6 +213,10 @@ public class ActionBarImpl extends ActionBar {
}
public View getCustomNavigationView() {
+ return getCustomView();
+ }
+
+ public View getCustomView() {
return mActionView.getCustomNavigationView();
}
@@ -559,6 +564,11 @@ public class ActionBarImpl extends ActionBar {
}
@Override
+ public Tab setCustomView(int layoutResId) {
+ return setCustomView(LayoutInflater.from(mContext).inflate(layoutResId, null));
+ }
+
+ @Override
public Drawable getIcon() {
return mIcon;
}
@@ -584,12 +594,22 @@ public class ActionBarImpl extends ActionBar {
}
@Override
+ public Tab setIcon(int resId) {
+ return setIcon(mContext.getResources().getDrawable(resId));
+ }
+
+ @Override
public Tab setText(CharSequence text) {
mText = text;
return this;
}
@Override
+ public Tab setText(int resId) {
+ return setText(mContext.getResources().getText(resId));
+ }
+
+ @Override
public void select() {
selectTab(this);
}
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 7592e8b..63d05ec 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -31,7 +31,7 @@ import com.android.internal.view.IInputMethodClient;
interface IInputMethodManager {
List<InputMethodInfo> getInputMethodList();
List<InputMethodInfo> getEnabledInputMethodList();
-
+ List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in InputMethodInfo imi);
void addClient(in IInputMethodClient client,
in IInputContext inputContext, int uid, int pid);
void removeClient(in IInputMethodClient client);
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index 1d103ed..1406e4e 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -110,8 +110,10 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
if (isShowing()) {
mPopup.dismiss();
}
- mTreeObserver.removeGlobalOnLayoutListener(this);
- mTreeObserver = null;
+ if (mTreeObserver != null) {
+ mTreeObserver.removeGlobalOnLayoutListener(this);
+ mTreeObserver = null;
+ }
}
public boolean isShowing() {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 1018ddb..e50233e 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -1194,6 +1194,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_text_AndroidBidi),
REG_JNI(register_android_text_KeyCharacterMap),
REG_JNI(register_android_os_Process),
+ REG_JNI(register_android_os_SystemProperties),
REG_JNI(register_android_os_Binder),
REG_JNI(register_android_view_Display),
REG_JNI(register_android_nio_utils),
@@ -1251,7 +1252,6 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_os_ParcelFileDescriptor),
REG_JNI(register_android_os_Power),
REG_JNI(register_android_os_StatFs),
- REG_JNI(register_android_os_SystemProperties),
REG_JNI(register_android_os_UEventObserver),
REG_JNI(register_android_net_LocalSocketImpl),
REG_JNI(register_android_net_NetworkUtils),
diff --git a/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png
new file mode 100644
index 0000000..a38c03a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png
new file mode 100644
index 0000000..6a88a69
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png
index 7ec2192..87d9c21 100644
--- a/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png
index c03e4f6..720ee78 100644
--- a/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png
new file mode 100644
index 0000000..4275da0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png
new file mode 100644
index 0000000..3ec9c1f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png
index 6642717..227bde2 100644
--- a/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png
index 9572752..6ddfab0 100644
--- a/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png
deleted file mode 100644
index 0ad248c..0000000
--- a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png
deleted file mode 100644
index b7a07c4..0000000
--- a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png
new file mode 100644
index 0000000..7528479
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png
new file mode 100644
index 0000000..4c7d9e7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png
new file mode 100644
index 0000000..09ca253
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png
new file mode 100644
index 0000000..0a7d3a1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png
new file mode 100644
index 0000000..54a1519
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png
new file mode 100644
index 0000000..06ca0d4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png
new file mode 100644
index 0000000..9015299
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png
new file mode 100644
index 0000000..b355cb3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_pressed.9.png b/core/res/res/drawable-hdpi/textfield_pressed.9.png
deleted file mode 100644
index a42d87f..0000000
--- a/core/res/res/drawable-hdpi/textfield_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png
deleted file mode 100644
index a271ac9..0000000
--- a/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png
deleted file mode 100644
index 521722d..0000000
--- a/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png
deleted file mode 100644
index a271ac9..0000000
--- a/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png
deleted file mode 100644
index 521722d..0000000
--- a/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..6fbd7d2
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png
new file mode 100644
index 0000000..3a4cdec
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png
new file mode 100644
index 0000000..b1c3991
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png
new file mode 100644
index 0000000..6fbce8c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png
new file mode 100644
index 0000000..3bb4c29
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png
new file mode 100644
index 0000000..8f02162
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png
new file mode 100644
index 0000000..8f57d2c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png
new file mode 100644
index 0000000..df6f76b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png
new file mode 100644
index 0000000..a47bf31
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png
new file mode 100644
index 0000000..04046aa
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png
new file mode 100644
index 0000000..b6021e0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png
new file mode 100644
index 0000000..0f38d6b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..14a4e31
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png
new file mode 100644
index 0000000..21a2ac1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png
new file mode 100644
index 0000000..1a1da57
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png
new file mode 100644
index 0000000..a242c80
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png
new file mode 100644
index 0000000..50045e4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png
new file mode 100644
index 0000000..659b3c7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png
new file mode 100644
index 0000000..9112530
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png
new file mode 100644
index 0000000..21aa7f7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png
new file mode 100644
index 0000000..d145975
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png
new file mode 100644
index 0000000..167bab7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png
new file mode 100644
index 0000000..2844c3f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png
new file mode 100644
index 0000000..9d83038
--- /dev/null
+++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/textfield_pressed.9.png b/core/res/res/drawable-ldpi/textfield_pressed.9.png
deleted file mode 100644
index 1433365..0000000
--- a/core/res/res/drawable-ldpi/textfield_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png
new file mode 100644
index 0000000..d37c8b2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png
new file mode 100644
index 0000000..16f2197
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png
index 3a5f36d..c98c951 100644
--- a/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png
index b8cc76f..7691f81 100644
--- a/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png
new file mode 100644
index 0000000..500ede3
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png
new file mode 100644
index 0000000..99f7f38
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png
index a1f0c71..fab86ac 100644
--- a/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png
index 71e3103..876eb794 100644
--- a/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png
deleted file mode 100644
index ac6d406..0000000
--- a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png
deleted file mode 100644
index bb6e953..0000000
--- a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png
new file mode 100644
index 0000000..2646899
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png
new file mode 100644
index 0000000..374d457
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png
new file mode 100644
index 0000000..65c87ba
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png
new file mode 100644
index 0000000..724b3fd
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png
new file mode 100644
index 0000000..5f0ad56
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png
new file mode 100644
index 0000000..df03a15
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png
new file mode 100644
index 0000000..2cc7f62
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png
new file mode 100644
index 0000000..a2d9d8a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_pressed.9.png b/core/res/res/drawable-mdpi/textfield_pressed.9.png
deleted file mode 100644
index c909ad2..0000000
--- a/core/res/res/drawable-mdpi/textfield_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png
deleted file mode 100644
index 7667d95..0000000
--- a/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png
deleted file mode 100644
index 269affd..0000000
--- a/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png
deleted file mode 100644
index 7667d95..0000000
--- a/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png
deleted file mode 100644
index 269affd..0000000
--- a/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..d86534c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png
new file mode 100644
index 0000000..6ae5d4b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png
new file mode 100644
index 0000000..fd578b6
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png
new file mode 100644
index 0000000..a0caaa9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png
new file mode 100644
index 0000000..f6f4ed2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png
new file mode 100644
index 0000000..2591adb
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png
new file mode 100644
index 0000000..efee099
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png
new file mode 100644
index 0000000..f7b09de
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png
new file mode 100644
index 0000000..76f13a6
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png
new file mode 100644
index 0000000..cb8e764
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png
new file mode 100644
index 0000000..7c0d0bc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png
new file mode 100644
index 0000000..9d7ff6b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png
new file mode 100644
index 0000000..cfdfd174
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png
new file mode 100644
index 0000000..43bdf1d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png
new file mode 100644
index 0000000..2ffe46b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png
new file mode 100644
index 0000000..51bb2d0
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png
new file mode 100644
index 0000000..dece157
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png
new file mode 100644
index 0000000..384cb32
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png
new file mode 100644
index 0000000..84ec4f7
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png
new file mode 100644
index 0000000..318befc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png
new file mode 100644
index 0000000..d97a832
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png
new file mode 100644
index 0000000..19d75e5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png
new file mode 100644
index 0000000..1189e5c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png
new file mode 100644
index 0000000..9f283ab
--- /dev/null
+++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable/edit_text.xml b/core/res/res/drawable/edit_text.xml
index 315278d..e9ba84b 100644
--- a/core/res/res/drawable/edit_text.xml
+++ b/core/res/res/drawable/edit_text.xml
@@ -15,11 +15,8 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/textfield_default" />
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/textfield_disabled" />
- <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed" />
+ <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default" />
+ <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled" />
<item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected" />
<item android:state_enabled="true" android:drawable="@drawable/textfield_default" />
<item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected" />
diff --git a/core/res/res/drawable/edit_text_holo_dark.xml b/core/res/res/drawable/edit_text_holo_dark.xml
index b7d24ff..63ccd1d 100644
--- a/core/res/res/drawable/edit_text_holo_dark.xml
+++ b/core/res/res/drawable/edit_text_holo_dark.xml
@@ -15,14 +15,11 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/textfield_default_holo_dark" />
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/textfield_disabled_holo_dark" />
- <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed_holo_dark" />
- <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected_holo_dark" />
+ <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" />
+ <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_dark" />
+ <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_active_holo_dark" />
<item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" />
- <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected_holo_dark" />
+ <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_dark" />
<item android:drawable="@drawable/textfield_disabled_holo_dark" />
</selector>
diff --git a/core/res/res/drawable/edit_text_holo_light.xml b/core/res/res/drawable/edit_text_holo_light.xml
index dae39e3..324acda 100644
--- a/core/res/res/drawable/edit_text_holo_light.xml
+++ b/core/res/res/drawable/edit_text_holo_light.xml
@@ -15,14 +15,11 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/textfield_default_holo_light" />
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/textfield_disabled_holo_light" />
- <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed_holo_light" />
- <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected_holo_light" />
+ <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" />
+ <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_light" />
+ <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_active_holo_light" />
<item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" />
- <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected_holo_light" />
+ <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_light" />
<item android:drawable="@drawable/textfield_disabled_holo_light" />
</selector>
diff --git a/core/res/res/drawable/edit_text_multiline_holo_dark.xml b/core/res/res/drawable/edit_text_multiline_holo_dark.xml
new file mode 100644
index 0000000..67d2748
--- /dev/null
+++ b/core/res/res/drawable/edit_text_multiline_holo_dark.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" />
+ <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_multiline_disabled_holo_dark" />
+ <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_active_holo_dark" />
+ <item android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" />
+ <item android:state_focused="true" android:drawable="@drawable/textfield_multiline_disabled_focused_holo_dark" />
+ <item android:drawable="@drawable/textfield_multiline_disabled_holo_dark" />
+</selector>
diff --git a/core/res/res/drawable/edit_text_multiline_holo_light.xml b/core/res/res/drawable/edit_text_multiline_holo_light.xml
new file mode 100644
index 0000000..08b3ec6
--- /dev/null
+++ b/core/res/res/drawable/edit_text_multiline_holo_light.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_light" />
+ <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_multiline_disabled_holo_light" />
+ <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_active_holo_light" />
+ <item android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_light" />
+ <item android:state_focused="true" android:drawable="@drawable/textfield_multiline_disabled_focused_holo_light" />
+ <item android:drawable="@drawable/textfield_multiline_disabled_holo_light" />
+</selector>
diff --git a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml
index b3645aa..c76e833 100644
--- a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml
@@ -21,23 +21,22 @@
state of the device, as well as instructions on how to get past it
depending on the state of the device. It is the same for landscape
and portrait.-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tabunlock="http://schemas.android.com/apk/res/com.android.tabunlock"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#70000000"
- android:gravity="center_horizontal"
- android:id="@+id/root">
+ android:orientation="vertical"
+ android:id="@+id/root"
+ android:background="#70000000">
<!-- left side: status and emergency call button -->
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:orientation="vertical"
- android:gravity="center_vertical"
- >
- <include layout="@layout/keyguard_screen_status_land" />
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+ <include layout="@layout/keyguard_screen_status_port" />
</LinearLayout>
<LinearLayout
@@ -61,6 +60,7 @@
android:id="@+id/wave_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_gravity="center"
/>
<!-- "emergency calls only" shown when sim is missing or PUKd -->
@@ -93,5 +93,5 @@
/>
</LinearLayout>
-</RelativeLayout>
+</LinearLayout>
diff --git a/core/res/res/layout-xlarge/status_bar_latest_event_content.xml b/core/res/res/layout-xlarge/status_bar_latest_event_content.xml
index c64b90e..d599154 100644
--- a/core/res/res/layout-xlarge/status_bar_latest_event_content.xml
+++ b/core/res/res/layout-xlarge/status_bar_latest_event_content.xml
@@ -1,56 +1,41 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingTop="7dp"
- android:paddingLeft="5dp"
>
+ <ImageView android:id="@+id/icon"
+ android:layout_width="48dp"
+ android:layout_height="64dp"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:scaleType="center"
+ />
+
<LinearLayout
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingTop="3dp"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
>
- <!--com.android.server.status.AnimatedImageView android:id="@+id/icon" -->
- <ImageView android:id="@+id/icon"
- android:layout_width="25dp"
- android:layout_height="25dp"
- android:scaleType="fitCenter"
- android:src="@drawable/arrow_down_float"/>
<TextView android:id="@+id/title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
- android:paddingLeft="4dp"
/>
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- >
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
- android:paddingLeft="4dp"
- />
- <android.widget.DateTimeView android:id="@+id/time"
- android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
- android:layout_marginLeft="4dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:paddingRight="5dp"
/>
</LinearLayout>
</LinearLayout>
+
diff --git a/core/res/res/layout/preference.xml b/core/res/res/layout/preference.xml
index 46c3e9c..6bd5efa 100644
--- a/core/res/res/layout/preference.xml
+++ b/core/res/res/layout/preference.xml
@@ -24,13 +24,19 @@
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize">
- <!-- Preference should place its actual preference widget here. -->
- <LinearLayout android:id="@+android:id/widget_frame"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/preference_widget_width"
android:gravity="center"
- android:orientation="vertical" />
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ />
+ </LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
@@ -59,4 +65,12 @@
</RelativeLayout>
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="@dimen/preference_widget_width"
+ android:gravity="center"
+ android:orientation="vertical" />
+
</LinearLayout>
diff --git a/core/res/res/layout/preference_child.xml b/core/res/res/layout/preference_child.xml
index 713aa17..e9b50e0 100644
--- a/core/res/res/layout/preference_child.xml
+++ b/core/res/res/layout/preference_child.xml
@@ -20,20 +20,26 @@
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
+ android:paddingLeft="16dip"
android:paddingRight="?android:attr/scrollbarSize">
- <!-- Preference should place its actual preference widget here. -->
- <LinearLayout android:id="@+android:id/widget_frame"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/preference_widget_width"
android:gravity="center"
- android:orientation="vertical" />
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ />
+ </LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="16dip"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
@@ -58,4 +64,12 @@
</RelativeLayout>
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="@dimen/preference_widget_width"
+ android:gravity="center"
+ android:orientation="vertical" />
+
</LinearLayout>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0aa4247..666032c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Bez upozornění smazat všechna data telefonu obnovením továrních dat"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Nastavit globální proxy server zařízení"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Vyberte globální proxy server, který se bude používat, když jsou zásady aktivní. Aktuální globální proxy server nastavuje pouze první správce zařízení."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domů"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pracovní pager"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Vlastní"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Narozeniny"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Výročí"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Událost"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Ostatní"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Vlastní"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Domů"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Práce"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Práce"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Jiné"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Vlastní"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Vlastní"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Bratr"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Dítě"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Druh/družka"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Otec"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Známý"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Vedoucí"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Matka"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Rodič"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Doporučující osoba"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Příbuzný"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Manžel(ka)"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Vlastní"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Plocha"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Práce"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Automaticky vyplnit tento formulář"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Vyjmout"</string>
<string name="copy" msgid="2681946229533511987">"Kopírovat"</string>
<string name="paste" msgid="5629880836805036433">"Vložit"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Není co vložit"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopírovat adresu URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Vybrat text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Výběr textu"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Odeslat"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Další"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Hotovo"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Předch."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Spustit"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Vytočit číslo"\n" <xliff:g id="NUMBER">%s</xliff:g>."</string>
<string name="create_contact_using" msgid="4947405226788104538">"Vytvořit kontakt"\n"pro <xliff:g id="NUMBER">%s</xliff:g>."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index e0be775..36eb27a 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Slet telefonens data uden varsel ved at gendanne fabriksindstillinger"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Angiv enhedens globale proxy"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Angiv enhedens globale proxy, der skal bruges, mens politikken er aktiveret. Kun den første enhedsadministrator angiver den effektive globale proxy."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjem"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøger"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"mms"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Tilpasset"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Fødselsdato"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Årsdag"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Begivenhed"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Andre"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Tilpasset"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Hjem"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Arbejde"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Arbejde"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Andre"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Tilpasset"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Tilpasset"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Samlever"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Far"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Ven"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Chef"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mor"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Forælder"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Henvist af"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Familie"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Søster"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Ægtefælle"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Tilpasset"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Hjem"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbejde"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Bekræft"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dobbeltklik for at zoome ind eller ud."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofuldfør denne formular"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Klip"</string>
<string name="copy" msgid="2681946229533511987">"Kopier"</string>
<string name="paste" msgid="5629880836805036433">"Indsæt"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Intet at indsætte"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopier webadresse"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstmarkering"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Send"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Næste"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Udfør"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Forrige"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Udfør"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Ring til nummer"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Opret kontakt"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 1566b1b..fe7ddc7 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Auf Werkseinstellungen zurücksetzen und Daten auf dem Telefon ohne Warnung löschen"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Den globalen Proxy des Geräts festlegen"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Den globalen Proxy des Geräts zur Verwendung während der Aktivierung der Richtlinie festlegen. Nur der erste Geräteadministrator kann den gültigen globalen Proxy festlegen."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager (geschäftl.)"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Zweite Nummer"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Benutzerdefiniert"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Geburtstag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Jahrestag"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Termin"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Sonstige"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Benutzerdefiniert"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Privat"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Geschäftlich"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Geschäftlich"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Sonstige"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Benutzerdefiniert"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Benutzerdefiniert"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Bruder"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Kind"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Lebenspartner"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Vater"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Freund"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Vorgesetzter"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mutter"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Elternteil"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Weitergeleitet von"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Verwandter"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Schwester"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Gatte/Gattin"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Benutzerdefiniert"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Privat"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Geschäftlich"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tipp: Zum Heranzoomen und Vergrößern zweimal tippen"</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dieses Formular automatisch ausfüllen"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Ausschneiden"</string>
<string name="copy" msgid="2681946229533511987">"Kopieren"</string>
<string name="paste" msgid="5629880836805036433">"Einfügen"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Nichts zum Einfügen"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL kopieren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Text auswählen..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textauswahl"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Senden"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Weiter"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Fertig"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Zurück"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Ausführen"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Nummer"\n"mit <xliff:g id="NUMBER">%s</xliff:g> wählen"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Neuer Kontakt"\n"mit <xliff:g id="NUMBER">%s</xliff:g> erstellen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index bd86221..2103aef 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Διαγραφή των δεδομένων του τηλεφώνου χωρίς προειδοποίηση με επαναφορά των εργοστασιακών δεδομένων"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ρύθμιση του γενικού διακομιστή μεσολάβησης της συσκευής"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ορίστε τη χρήση του γενικού διακομιστή μεσολάβησης της συσκευής όταν είναι ενεργοποιημένη η πολιτική. Μόνο ο διαχειριστής της πρώτης συσκευής ορίζει τον ισχύοντα γενικό διακομιστή μεσολάβησης."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Οικία"</item>
<item msgid="869923650527136615">"Κινητό"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Βομβητής εργασίας"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Βοηθός"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Προσαρμοσμένο"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Γενέθλια"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Επέτειος"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Συμβάν"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Άλλο"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Προσαρμοσμένο"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Οικία"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Εργασία"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Εργασία"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Άλλο"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Προσαρμοσμένο"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Προσαρμοσμένο"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Βοηθός"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Αδερφός"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Παιδί"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Σύντρ. ελεύθ. συμβ."</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Πατέρας"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Φίλος"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Διευθυντής"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Μητέρα"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Γονέας"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Συνεργάτης"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Συστήθηκε από"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Συγγενής"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Αδερφή"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Σύζυγος"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Προσαρμοσμένο"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Αρχική σελίδα"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Εργασία"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Επιβεβαίωση"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Συμβουλή: διπλό άγγιγμα για μεγέθυνση και σμίκρυνση."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Να γίνει αυτόματη συμπλήρωση αυτής της φόρμας"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Αποκοπή"</string>
<string name="copy" msgid="2681946229533511987">"Αντιγραφή"</string>
<string name="paste" msgid="5629880836805036433">"Επικόλληση"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Καν. στοιχ. για επικ."</string>
<string name="copyUrl" msgid="2538211579596067402">"Αντιγραφή διεύθυνσης URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Επιλογή κειμένου..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Επιλογή κειμένου"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Αποστολή"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Επόμενο"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Τέλος"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Προηγ."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Εκτέλεση"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Κλήση αριθμού"\n"με τη χρήση <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Δημιουργία επαφής"\n"με τη χρήση του <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e303707..bd5371f 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -481,6 +481,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Borrar los datos del teléfono sin advertencias al restablecer la configuración original"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Configura el proxy global de dispositivo"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Configuración del proxy global de dispositivo que se utilizará mientras se habilita la política. Sólo la primera administración de dispositivo configura el proxy global efectivo."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Celular"</item>
@@ -545,11 +549,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Localizador del trabajo"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Cumpleaños"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Otro"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Trabajo"</string>
@@ -576,36 +579,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Trabajo"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Otro"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistente"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Hermano"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Hijo"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Conviviente"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Gerente"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Padre"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Socio"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Pariente"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Hermana"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Cónyuge"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Página principal"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string>
@@ -673,12 +661,10 @@
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: presiona dos veces para acercar y alejar"</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
- <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
- <skip />
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
<!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
<skip />
<string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"leer historial y marcadores del navegador"</string>
@@ -803,8 +789,7 @@
<string name="cut" msgid="3092569408438626261">"Cortar"</string>
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Pegar"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Nada que pegar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string>
@@ -950,8 +935,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Siguiente"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Hecho"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Ant."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Ejecutar"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Marcar el número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Crear contacto "\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1008,8 +992,6 @@
<string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Una computadora está utilizando el almacenamiento USB en este momento."</string>
<string name="media_shared" product="default" msgid="5706130568133540435">"Una computadora está utilizando la tarjeta SD en este momento."</string>
<string name="media_unknown_state" msgid="729192782197290385">"Medios externos en estado desconocido."</string>
- <!-- no translation found for share (1778686618230011964) -->
- <skip />
- <!-- no translation found for find (4808270900322985960) -->
- <skip />
+ <string name="share" msgid="1778686618230011964">"Compartir"</string>
+ <string name="find" msgid="4808270900322985960">"Buscar"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 452eefd..5de5c9f 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Borrado de los datos del teléfono sin avisar restableciendo datos de fábrica"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir el servidor proxy global"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Define el servidor proxy global que se debe utilizar mientras la política esté habilitada. Solo el primer administrador de dispositivos define el servidor proxy global efectivo."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Buscapersonas del trabajo"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizados"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Cumpleaños"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Otros"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Trabajo"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Trabajo"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Otra"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizada"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizada"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistente"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Hermano"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Hijo/a"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Pareja de hecho"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo/a"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Padre/madre"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Pareja"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Pariente"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Hermana"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Cónyuge"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizada"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Casa"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: toca dos veces para ampliar o reducir."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Cortar"</string>
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Pegar"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Portapapeles vacío"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Siguiente"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Listo"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Anterior"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Ejecutar"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Marcar número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Crear un contacto"\n"a partir de <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index a802350..fa97fc0 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Effacer les données du téléphone sans avertissement, en restaurant les valeurs d\'usine"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Définir le proxy global du mobile"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Indiquez le proxy global à utiliser pour ce mobile lorsque les règles sont activées. Seul l\'administrateur principal du mobile peut définir le proxy global utilisé."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domicile"</item>
<item msgid="869923650527136615">"Mobile"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Téléavertisseur (professionnel)"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistant"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personnalisé"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Anniversaire"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Fête"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Événement"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Autre"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personnalisé"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Domicile"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Bureau"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Bureau"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Autre"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personnalisé"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personnalisée"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Frère"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Enfant"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Concubin"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Père"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Ami"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Responsable"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mère"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Parent"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partenaire"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Recommandé par"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Proche"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Sœur"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Conjoint"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personnalisée"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Accueil"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Professionnelle"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Confirmer"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Conseil : Appuyez deux fois pour effectuer un zoom avant ou arrière."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Permettre le remplissage automatique du formulaire"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Couper"</string>
<string name="copy" msgid="2681946229533511987">"Copier"</string>
<string name="paste" msgid="5629880836805036433">"Coller"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Presse-papiers vide"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copier l\'URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Sélect. le texte..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Sélection de texte"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Envoyer"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Suivant"</string>
<string name="ime_action_done" msgid="8971516117910934605">"OK"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Préc."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Exécuter"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Composer le numéro"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Ajouter un contact"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 6e5987e..89d0a32 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Cancella i dati del telefono senza preavviso eseguendo un ripristino dati di fabbrica"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Imposta il proxy globale del dispositivo"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Imposta il proxy globale del dispositivo in modo da utilizzarlo mentre la norma è attiva. Il proxy globale effettivo è impostabile solo dal primo amministratore del dispositivo."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Cellulare"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Cercapersone lavoro"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizzato"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Compleanno"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Anniversario"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Altri"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizzato"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Lavoro"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Lavoro"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Altro"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizzato"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizzato"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Fratello"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Figlio"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Convivente"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Amico"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Dirigente"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Genitore"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Riferito da"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Parente"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Sorella"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Coniuge"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizzato"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Casa"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Lavoro"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Conferma"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Suggerimento. Tocca due volte per aumentare/ridurre lo zoom."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Compila automaticamente il modulo"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Taglia"</string>
<string name="copy" msgid="2681946229533511987">"Copia"</string>
<string name="paste" msgid="5629880836805036433">"Incolla"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Niente da incollare"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copia URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleziona testo..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selezione testo"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Invia"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Avanti"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Fine"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Prec."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Esegui"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Componi numero"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Crea contatto"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 12cb290..dcbcdc2 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"警告せずにデータの初期化を実行して端末内のデータを消去します。"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"端末のグローバルプロキシを設定"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ポリシーが有効になっている場合は端末のグローバルプロキシが使用されるように設定します。有効なグローバルプロキシを設定できるのは最初のデバイス管理者だけです。"</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"自宅"</item>
<item msgid="869923650527136615">"携帯"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"ポケベル(勤務先)"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"アシスタント"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"カスタム"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"誕生日"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"記念日"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"予定"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"その他"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"カスタム"</string>
<string name="emailTypeHome" msgid="449227236140433919">"自宅"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"勤務先"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"勤務先"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"その他"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"カスタム"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"カスタム"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"アシスタント"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"子ども"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"パートナー(国内)"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"父"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"友だち"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"上司"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"母"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"親"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"パートナー"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"紹介者"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"親戚"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"姉妹"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"配偶者"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"カスタム"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"自宅"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"勤務先"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"確認"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"ヒント: ダブルタップで拡大/縮小できます。"</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"このフォームを自動入力"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"切り取り"</string>
<string name="copy" msgid="2681946229533511987">"コピー"</string>
<string name="paste" msgid="5629880836805036433">"貼り付け"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"クリップボードが空です"</string>
<string name="copyUrl" msgid="2538211579596067402">"URLをコピー"</string>
<string name="selectTextMode" msgid="6738556348861347240">"テキストを選択..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"テキスト選択"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"送信"</string>
<string name="ime_action_next" msgid="3138843904009813834">"次へ"</string>
<string name="ime_action_done" msgid="8971516117910934605">"完了"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"前へ"</string>
<string name="ime_action_default" msgid="2840921885558045721">"実行"</string>
<string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"発信"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"連絡先を新規登録"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 36e5134..8fe117f 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"초기화를 수행하여 경고 없이 휴대전화 데이터를 지웁니다."</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"기기 전체 프록시 설정"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"정책이 사용 설정되어 있는 동안 사용될 기기 전체 프록시를 설정합니다. 첫 번째 기기 관리자가 설정한 전체 프록시만 유효합니다."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"집"</item>
<item msgid="869923650527136615">"모바일"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"직장 호출기"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"비서"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"맞춤설정"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"생일"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"기념일"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"일정"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"기타"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"맞춤설정"</string>
<string name="emailTypeHome" msgid="449227236140433919">"집"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"직장"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"직장"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"기타"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"맞춤설정"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"맞춤설정"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"비서"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"남자 형제"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"자녀"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"동거인"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"아버지"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"친구"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"상사"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"어머니"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"부모"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"파트너"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"추천인"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"친척"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"여자 형제"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"배우자"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"맞춤설정"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"홈"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"직장"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"확인"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"도움말: 축소/확대하려면 두 번 누릅니다."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"양식 자동완성"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"잘라내기"</string>
<string name="copy" msgid="2681946229533511987">"복사"</string>
<string name="paste" msgid="5629880836805036433">"붙여넣기"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"붙여넣을 내용이 없습니다."</string>
<string name="copyUrl" msgid="2538211579596067402">"URL 복사"</string>
<string name="selectTextMode" msgid="6738556348861347240">"텍스트 선택..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"텍스트 선택"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"전송"</string>
<string name="ime_action_next" msgid="3138843904009813834">"다음"</string>
<string name="ime_action_done" msgid="8971516117910934605">"완료"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"이전"</string>
<string name="ime_action_default" msgid="2840921885558045721">"실행"</string>
<string name="dial_number_using" msgid="5789176425167573586">"전화하기 "\n"<xliff:g id="NUMBER">%s</xliff:g>에 연결"</string>
<string name="create_contact_using" msgid="4947405226788104538">"전화번호부에"\n"<xliff:g id="NUMBER">%s</xliff:g> 추가"</string>
diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml
index d562d96..b1f12b5 100644
--- a/core/res/res/values-land/dimens.xml
+++ b/core/res/res/values-land/dimens.xml
@@ -21,6 +21,6 @@
<resources>
<dimen name="password_keyboard_key_height">47dip</dimen>
<dimen name="password_keyboard_spacebar_vertical_correction">2dip</dimen>
- <dimen name="preference_screen_side_margin">32dp</dimen>
- <dimen name="preference_widget_width">64dp</dimen>
+ <dimen name="preference_screen_side_margin">96dp</dimen>
+ <dimen name="preference_widget_width">72dp</dimen>
</resources> \ No newline at end of file
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index e43aabd..cdc3f0a 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Tilbakestill telefonens data uten advarsel ved å utføre tilbakestilling til fabrikkstandard"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Angi enhetens globale mellomtjener"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Angir den globale mellomtjeneren på enheten som skal brukes når regelen er aktivert. Kun den opprinnelige administratoren av enheten kan angi den globale mellomtjeneren."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjemmenummer"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøker arbeid"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Egendefinert"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Bursdag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Akivitet"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Andre"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Egendefinert"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Hjemme"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Arbeid"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Arbeid"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Annen"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Egendefinert"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Egendefinert"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Samboer"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Far"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Venn"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Sjef"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mor"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Foresatt"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Anbefalt av"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Slektning"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Søster"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Ektefelle"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Egendefinert"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Startside"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbeid"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Bekreft"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Dobbelttrykk for å zoome inn og ut."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Fyll ut dette skjemaet automatisk"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Klipp ut"</string>
<string name="copy" msgid="2681946229533511987">"Kopier"</string>
<string name="paste" msgid="5629880836805036433">"Lim inn"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Ingenting å lime inn"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopier URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Merket tekst"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Send"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Neste"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Utført"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Forrige"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Utfør"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Ring nummeret"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Lag kontakt"\n"med nummeret <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index d66b694..12034f2 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"De gegevens van de telefoon zonder waarschuwing wissen door de fabrieksinstellingen te herstellen"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Algemene proxy voor het apparaat instellen"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Stel de algemene proxy voor het apparaat in die moet worden gebruikt terwijl het beleid is geactiveerd. Alleen de eerste apparaatbeheerder stelt de algemene proxy in."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Thuis"</item>
<item msgid="869923650527136615">"Mobiel"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager werk"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Aangepast"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Verjaardag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Afspraak"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Overig"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Aangepast"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Thuis"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Werk"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Werk"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Overig"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Aangepast"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Aangepast"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Broer"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Kind"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Levenspartner"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Vader"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Vriend"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Moeder"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Ouder"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Genoemd door"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Familielid"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Zus"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Echtgenoot/-genote"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Aangepast"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Startpagina"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Werk"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Bevestigen"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tip: tik tweemaal om in of uit te zoomen."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dit formulier automatisch aanvullen"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Knippen"</string>
<string name="copy" msgid="2681946229533511987">"Kopiëren"</string>
<string name="paste" msgid="5629880836805036433">"Plakken"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Niets te plakken"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL kopiëren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Tekst selecteren..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstselectie"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Verzenden"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Volgende"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Gereed"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Vorige"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Uitvoeren"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Nummer bellen"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Contact maken"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 66a7160..089026f 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Wymazywanie danych z telefonu bez ostrzeżenia, przez przywrócenie danych fabrycznych"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ustaw globalny serwer proxy urządzenia"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ustaw globalny serwer proxy urządzenia do wykorzystywania przy włączonych zasadach. Tylko pierwszy administrator urządzenia ustawia obowiązujący globalny serwer proxy."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Dom"</item>
<item msgid="869923650527136615">"Komórka"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager służbowy"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asystent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"Wiadomość MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Niestandardowe"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Urodziny"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Rocznica"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Wydarzenie"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Inne"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Niestandardowy"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Domowy"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Służbowy"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Służbowy"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Inny"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Niestandardowy"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Niestandardowa"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Asystent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Dziecko"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Partner życiowy"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Ojciec"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Znajomy"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Kierownik"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Matka"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Rodzic"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Z polecenia"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Krewny"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Siostra"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Współmałżonek"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Niestandardowy"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Domowy"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Służbowy"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Potwierdź"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Wypełnij ten formularz automatycznie"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Wytnij"</string>
<string name="copy" msgid="2681946229533511987">"Kopiuj"</string>
<string name="paste" msgid="5629880836805036433">"Wklej"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Schowek jest pusty"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiuj adres URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Zaznacz tekst"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Zaznaczanie tekstu"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Wyślij"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Dalej"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Gotowe"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Wstecz"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Wykonaj"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Połącz"\n"z numerem <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Utwórz kontakt"\n"dla numeru <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 990d630..3f270a0 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Apagar os dados do telefone sem avisar, ao efectuar uma reposição de dados de fábrica"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir o proxy global do aparelho"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Definir o proxy global do aparelho a ser utilizado quando a política estiver activada. Só o primeiro administrador do aparelho define o proxy global efectivo."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Residência"</item>
<item msgid="869923650527136615">"Móvel"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager do trabalho"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Data de nascimento"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversário"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Outro"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Residência"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Emprego"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Emprego"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Outro"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Irmão"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Filho"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Companheiro(a)"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Pai"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Director"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mãe"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Pais"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Sócio"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Família"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Irmã"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Cônjuge"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Página inicial"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Emprego"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Sugestão: toque duas vezes para aumentar ou diminuir o zoom."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preenchimento automático deste formulário"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Cortar"</string>
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Colar"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Nada para colar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecção de texto"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Seguinte"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Concluído"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Ant"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Executar"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Marcar número"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Criar contacto"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index ce106db..368132e 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Apaga os dados do telefone sem aviso, executando uma redefinição da configuração original"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir o proxy global do dispositivo"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Configura o proxy global do dispositivo para ser usado enquanto a política estiver ativada. Somente o primeiro administrador do dispositivo pode configurar um verdadeiro proxy global."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Residencial"</item>
<item msgid="869923650527136615">"Celular"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager comercial"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Aniversário"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Data comemorativa"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Outros"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Residencial"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Comercial"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Comercial"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Outros"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Irmão"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Filho(a)"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Parceiro doméstico"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Pai"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo(a)"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Gerente"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mãe"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Pai/Mãe"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Parceiro"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Indicado por"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Parente"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Irmã"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Cônjuge"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Página inicial"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Comercial"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preencher automaticamente este formulário"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Recortar"</string>
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Colar"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Nada para colar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selecionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Seleção de texto"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Avançar"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Concluído"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Anter."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Executar"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Discar número"\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Criar contato "\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index bbd61bd..e8f7298 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -488,6 +488,10 @@
<!-- outdated translation 2314060933796396205 --> <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Restaurar ils parameters originals dal telefonin. Qua tras vegnan tut Vossas datas stizzadas senza dumonda da conferma."</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir il proxy global da l\'apparat"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Definir il proxy global da l\'apparat che duai vegnir utilisà sche la directiva è activada. Mo l\'emprim administratur dad apparats definescha il vair proxy global."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
<item msgid="869923650527136615">"Telefonin"</item>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 4babb3b..0ef23ee 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Уничтожить все данные на телефоне без предупреждения путем сброса настроек"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Глобальный прокси-сервер"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Настройте глобальный прокси-сервер устройства, который будет использоваться при активной политике. Глобальный прокси-сервер должен настроить первый администратор устройства."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Домашний"</item>
<item msgid="869923650527136615">"Мобильный"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Раб. пейджер"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Секретарь"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Особый"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"День рождения"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Юбилей"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Мероприятие"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Другой"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Создать свой ярлык"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Личный"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Рабочий"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Работа"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Другое"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Создать свой ярлык"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Особый"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Секретарь"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Брат"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Ребенок"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"В гражданском браке"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Отец"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Друг"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Руководитель"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Мать"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Родитель"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Партнер"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Рекомендуют:"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Родственник"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Сестра"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Супруг(а)"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Особый"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Домашний"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Рабочий"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Подтвердите"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Заполнить форму автоматически"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Вырезать"</string>
<string name="copy" msgid="2681946229533511987">"Копировать"</string>
<string name="paste" msgid="5629880836805036433">"Вставить"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Текст для вставки отсутствует"</string>
<string name="copyUrl" msgid="2538211579596067402">"Копировать URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Выбрать текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Выбор текста"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Отправить"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Далее"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Пред."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Выполнить"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Набрать номер"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Создать контакт"\n"с номером <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 102a08d..8ac9273 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Ta bort data från telefonen utan förvarning genom att återställa standardinställningarna"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ange global proxyserver"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ange vilken global proxyserver som ska användas när policyn är aktiverad. Endast den första enhetsadministratören anger den faktiska globala proxyservern."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hem"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsökare, arbetet"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Anpassad"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Födelsedag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Högtidsdag"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Händelse"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Övrigt"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Anpassad"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Hem"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Arbete"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"Arbete"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Övrigt"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Anpassad"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Anpassad"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Sambo"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Pappa"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Vän"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Chef"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Mamma"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Förälder"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Rekommenderad av"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Släkting"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Syster"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Make/maka"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Anpassad"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Startsida"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbete"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Bekräfta"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tips! Dubbelklicka om du vill zooma in eller ut."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofyll formuläret"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Klipp ut"</string>
<string name="copy" msgid="2681946229533511987">"Kopiera"</string>
<string name="paste" msgid="5629880836805036433">"Klistra in"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Inget att klistra in"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiera webbadress"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Markera text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textmarkering"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Skicka"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Nästa"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Färdig"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Föreg."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Utför"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Slå nummer "\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Skapa kontakt"\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index a6bfbf6..90dd16d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek telefondaki verileri uyarıda bulunmadan silin"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Cihaz genelinde geçerli proxy\'i ayarla"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Politika etkin olduğunda kullanılacak cihaz genelinde geçerli proxy\'yi ayarlayın. Etkin genel proxy\'yi yalnızca ilk cihaz yöneticisi ayarlar."</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Ev"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"İş Yeri Çağrı Cihazı"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Yardımcı"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Özel"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Doğum günü"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Yıldönümü"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Etkinlik"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Diğer"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Özel"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Ev"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"İş"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"İş"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Diğer"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Özel"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Özel"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Yardımcı"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"Erkek Kardeş"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"Çocuk"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Hayat Arkadaşı"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Baba"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Arkadaş"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Yönetici"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Anne"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Ebeveyn"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Hayat Arkadaşı"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Öneren"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Akraba"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Kız Kardeş"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Eş"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Özel"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Ev"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"Onayla"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe vurun."</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Bu formu otomatik doldur"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"Kes"</string>
<string name="copy" msgid="2681946229533511987">"Kopyala"</string>
<string name="paste" msgid="5629880836805036433">"Yapıştır"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"Yapştrlck bir şy yok"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL\'yi kopyala"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Metin seç..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Metin seçimi"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"Gönder"</string>
<string name="ime_action_next" msgid="3138843904009813834">"İleri"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Bitti"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"Önceki"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Çalıştır"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Numarayı çevir:"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>"\n" ile kişi oluştur"</string>
diff --git a/core/res/res/values-xlarge/styles.xml b/core/res/res/values-xlarge/styles.xml
index 4692656..316861e 100644
--- a/core/res/res/values-xlarge/styles.xml
+++ b/core/res/res/values-xlarge/styles.xml
@@ -30,9 +30,9 @@
</style>
<style name="TextAppearance.StatusBar.EventContent">
<item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textSize">16sp</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Title">
- <item name="android:textSize">18sp</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 4fd5161..9dc64a4 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"恢复出厂设置时,将擦除手机上的数据而不发送警告"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"设置设备全局代理"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"请设置在启用政策的情况下要使用的设备全局代理。只有第一设备管理员才可设置有效的全局代理。"</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"住宅"</item>
<item msgid="869923650527136615">"手机"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"单位寻呼机"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"助理"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"彩信"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"自定义"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"生日"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"周年纪念"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"活动"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"其他"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"自定义"</string>
<string name="emailTypeHome" msgid="449227236140433919">"家用"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"单位"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"公司"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"其他"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"自定义"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"自定义"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"助理"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"子女"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"同居伴侣"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"父亲"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"朋友"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"经理"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"母亲"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"父母"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"合作伙伴"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"介绍人"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"亲属"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"姐妹"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"配偶"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"自定义"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"住宅"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"单位"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"确认"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"提示:点按两次可放大和缩小。"</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自动填充此表单"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"剪切"</string>
<string name="copy" msgid="2681946229533511987">"复制"</string>
<string name="paste" msgid="5629880836805036433">"粘贴"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"剪贴板无内容"</string>
<string name="copyUrl" msgid="2538211579596067402">"复制网址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"选择文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"文字选择"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"发送"</string>
<string name="ime_action_next" msgid="3138843904009813834">"下一步"</string>
<string name="ime_action_done" msgid="8971516117910934605">"完成"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"上一页"</string>
<string name="ime_action_default" msgid="2840921885558045721">"执行"</string>
<string name="dial_number_using" msgid="5789176425167573586">"拨打电话"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"创建电话号码为"\n"<xliff:g id="NUMBER">%s</xliff:g> 的联系人"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 6d5c4d4..37f9d58 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -482,6 +482,10 @@
<string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"執行重設為原廠設定時,系統會直接清除手機資料而不提出警告"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"設定裝置全域 Proxy"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"設定政策啟用時所要使用的裝置全域 Proxy,只有第一個裝置管理員所設定的全域 Proxy 具有效力。"</string>
+ <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"住家電話"</item>
<item msgid="869923650527136615">"行動電話"</item>
@@ -546,11 +550,10 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"公司呼叫器"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"助理"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeCustom (7837586198458073404) -->
- <skip />
+ <string name="eventTypeCustom" msgid="7837586198458073404">"自訂"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"生日"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"週年紀念日"</string>
- <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"活動"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"其他"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"自訂"</string>
<string name="emailTypeHome" msgid="449227236140433919">"住家"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"公司"</string>
@@ -577,36 +580,21 @@
<string name="orgTypeWork" msgid="29268870505363872">"公司"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"其他"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"自訂"</string>
- <!-- no translation found for relationTypeCustom (3542403679827297300) -->
- <skip />
- <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
- <skip />
- <!-- no translation found for relationTypeBrother (8757913506784067713) -->
- <skip />
- <!-- no translation found for relationTypeChild (1890746277276881626) -->
- <skip />
- <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
- <skip />
- <!-- no translation found for relationTypeFather (5228034687082050725) -->
- <skip />
- <!-- no translation found for relationTypeFriend (7313106762483391262) -->
- <skip />
- <!-- no translation found for relationTypeManager (6365677861610137895) -->
- <skip />
- <!-- no translation found for relationTypeMother (4578571352962758304) -->
- <skip />
- <!-- no translation found for relationTypeParent (4755635567562925226) -->
- <skip />
- <!-- no translation found for relationTypePartner (7266490285120262781) -->
- <skip />
- <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
- <skip />
- <!-- no translation found for relationTypeRelative (1799819930085610271) -->
- <skip />
- <!-- no translation found for relationTypeSister (1735983554479076481) -->
- <skip />
- <!-- no translation found for relationTypeSpouse (394136939428698117) -->
- <skip />
+ <string name="relationTypeCustom" msgid="3542403679827297300">"自訂"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"助理"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"子女"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"同居人"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"父親"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"好友"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"經理"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"母親"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"父母"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"夥伴"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"介紹人"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"親戚"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"姊妹"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"配偶"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"自訂"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"住家"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"公司"</string>
@@ -674,8 +662,7 @@
<string name="save_password_label" msgid="6860261758665825069">"確認"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"提示:輕按兩下可放大縮小。"</string>
<!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自動填寫此表單"</string>
- <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
- <skip />
+ <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
<!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
<skip />
<!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
@@ -804,8 +791,7 @@
<string name="cut" msgid="3092569408438626261">"剪下"</string>
<string name="copy" msgid="2681946229533511987">"複製"</string>
<string name="paste" msgid="5629880836805036433">"貼上"</string>
- <!-- no translation found for pasteDisabled (7259254654641456570) -->
- <skip />
+ <string name="pasteDisabled" msgid="7259254654641456570">"沒有可貼上的內容"</string>
<string name="copyUrl" msgid="2538211579596067402">"複製網址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"選取文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string>
@@ -951,8 +937,7 @@
<string name="ime_action_send" msgid="2316166556349314424">"傳送"</string>
<string name="ime_action_next" msgid="3138843904009813834">"下一頁"</string>
<string name="ime_action_done" msgid="8971516117910934605">"完成"</string>
- <!-- no translation found for ime_action_previous (1443550039250105948) -->
- <skip />
+ <string name="ime_action_previous" msgid="1443550039250105948">"上一步"</string>
<string name="ime_action_default" msgid="2840921885558045721">"執行"</string>
<string name="dial_number_using" msgid="5789176425167573586">"使用 <xliff:g id="NUMBER">%s</xliff:g>"\n"撥號"</string>
<string name="create_contact_using" msgid="4947405226788104538">"建立手機號碼為 <xliff:g id="NUMBER">%s</xliff:g>"\n"的聯絡人"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 0b61202..9d54a80 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -49,7 +49,6 @@
window is floating. -->
<attr name="backgroundDimEnabled" format="boolean" />
-
<!-- =========== -->
<!-- Text styles -->
<!-- =========== -->
@@ -142,6 +141,8 @@
<attr name="editTextColor" format="reference|color" />
<!-- EditText background drawable. -->
<attr name="editTextBackground" format="reference" />
+ <!-- EditText background drawable for multiline EditText. -->
+ <attr name="editTextMultilineBackground" format="reference" />
<!-- A styled string, specifying the style to be used for showing
inline candidate text when composing with an input method. The
@@ -2508,7 +2509,8 @@
<attr name="textLineHeight" />
<!-- Indicates that a non-editable text can be selected. -->
<attr name="textIsSelectable" />
-
+ <!-- A specific background drawable used by multi-line EditText only. -->
+ <attr name="multilineBackground" format="reference"/>
</declare-styleable>
<!-- An <code>input-extras</code> is a container for extra data to supply to
an input method. Contains
@@ -2937,6 +2939,14 @@
<attr name="bottom" format="dimension" />
</declare-styleable>
+ <declare-styleable name="LayerDrawable">
+ <attr name="opacity">
+ <enum name="opaque" value="-1" />
+ <enum name="transparent" value="-2" />
+ <enum name="translucent" value="-3" />
+ </attr>
+ </declare-styleable>
+
<declare-styleable name="LayerDrawableItem">
<attr name="left" />
<attr name="top" />
@@ -3851,6 +3861,8 @@
<!-- Base attributes available to Preference. -->
<declare-styleable name="Preference">
+ <!-- The optional icon for the preference -->
+ <attr name="icon" />
<!-- The key to store the Preference value. -->
<attr name="key" format="string" />
<!-- The title for the Preference in a PreferenceActivity screen. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index ad4e7a2..aa33aa3 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1377,6 +1377,7 @@
<public type="attr" name="animationResolution" />
<public type="attr" name="state_accelerated" />
<public type="attr" name="baseline" />
+ <public type="attr" name="opacity" />
<public type="anim" name="animator_fade_in" />
<public type="anim" name="animator_fade_out" />
@@ -1447,4 +1448,7 @@
<public type="style" name="Theme.Holo.Light.DialogWhenLarge" />
<public type="string" name="selectTextMode" />
+
+ <public type="style" name="Theme.Holo.Wallpaper" />
+ <public type="style" name="Theme.Holo.Wallpaper.NoTitleBar" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 64cd00a..c8a5de8 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1806,7 +1806,7 @@
<!-- Do not translate. WebView User Agent string -->
<string name="web_user_agent" translatable="false">Mozilla/5.0 (Linux; U; <xliff:g id="x">Android %s</xliff:g>)
- AppleWebKit/534.11 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.11</string>
+ AppleWebKit/534.12 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.12</string>
<!-- Do not translate. WebView User Agent targeted content -->
<string name="web_user_agent_target_content" translatable="false">"Mobile "</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index b2db9b4..dc67f45 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -422,6 +422,7 @@
<item name="android:focusableInTouchMode">true</item>
<item name="android:clickable">true</item>
<item name="android:background">?android:attr/editTextBackground</item>
+ <item name="android:multilineBackground">?android:attr/editTextMultilineBackground</item>
<item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
<item name="android:textColor">?android:attr/editTextColor</item>
<item name="android:gravity">center_vertical</item>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 88e755f..a409c24 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -72,6 +72,7 @@
<item name="editTextColor">?android:attr/textColorPrimaryInverse</item>
<item name="editTextBackground">@android:drawable/edit_text</item>
+ <item name="editTextMultilineBackground">@android:drawable/edit_text</item>
<item name="candidatesTextStyleSpans">@android:string/candidates_style</item>
@@ -366,7 +367,7 @@
</style>
<!-- Default theme for windows that want to have the user's selected
- wallpaper appear behind them. -->
+ wallpaper appear behind them. -->
<style name="Theme.Wallpaper">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
@@ -685,6 +686,7 @@
<item name="editTextColor">?android:attr/textColorPrimary</item>
<item name="editTextBackground">@android:drawable/edit_text_holo_dark</item>
+ <item name="editTextMultilineBackground">@android:drawable/edit_text_multiline_holo_dark</item>
<item name="candidatesTextStyleSpans">@android:string/candidates_style</item>
@@ -917,10 +919,11 @@
<item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.Holo.Light.SearchResult.Subtitle</item>
<item name="textAppearanceButton">@android:style/TextAppearance.Holo.Light.Widget.Button</item>
-
+
<item name="editTextColor">?android:attr/textColorPrimary</item>
<item name="editTextBackground">@android:drawable/edit_text_holo_light</item>
-
+ <item name="editTextMultilineBackground">@android:drawable/edit_text_multiline_holo_light</item>
+
<item name="candidatesTextStyleSpans">@android:string/candidates_style</item>
<item name="textCheckMark">@android:drawable/indicator_check_mark_light</item>
@@ -1235,4 +1238,17 @@
<item name="windowContentOverlay">@null</item>
</style>
+ <!-- Default holographic (dark) for windows that want to have the user's selected
+ wallpaper appear behind them. -->
+ <style name="Theme.Holo.Wallpaper">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:colorBackgroundCacheHint">@null</item>
+ <item name="android:windowShowWallpaper">true</item>
+ </style>
+
+ <!-- Variant of the holographic (dark) theme with no title bar -->
+ <style name="Theme.Holo.Wallpaper.NoTitleBar">
+ <item name="android:windowNoTitle">true</item>
+ </style>
+
</resources>
diff --git a/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java b/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java
index f019599..43cf06a 100644
--- a/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java
+++ b/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java
@@ -110,6 +110,21 @@ public class BluetoothStressTest extends InstrumentationTestCase {
mTestUtils.disable(adapter);
}
+ public void testAcceptPair() {
+ int iterations = BluetoothTestRunner.sPairIterations;
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ BluetoothDevice device = adapter.getRemoteDevice(BluetoothTestRunner.sPairAddress);
+ mTestUtils.enable(adapter);
+
+ for (int i = 0; i < iterations; i++) {
+ mTestUtils.writeOutput("acceptPair iteration " + (i + 1) + " of " + iterations);
+ mTestUtils.acceptPair(adapter, device, BluetoothTestRunner.sPairPasskey,
+ BluetoothTestRunner.sPairPin);
+ mTestUtils.unpair(adapter, device);
+ }
+ mTestUtils.disable(adapter);
+ }
+
public void testConnectA2dp() {
int iterations = BluetoothTestRunner.sConnectA2dpIterations;
if (iterations == 0) {
diff --git a/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java b/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java
index 328891c..29dee34 100644
--- a/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java
+++ b/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java
@@ -137,7 +137,6 @@ public class BluetoothTestUtils extends Assert {
@Override
public void onReceive(Context context, Intent intent) {
- Log.i("BT", intent.toString());
if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())) {
setFiredFlag(DISCOVERY_STARTED_FLAG);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())) {
@@ -203,7 +202,7 @@ public class BluetoothTestUtils extends Assert {
if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction())) {
int varient = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, -1);
assertNotSame(-1, varient);
- switch(varient) {
+ switch (varient) {
case BluetoothDevice.PAIRING_VARIANT_PIN:
mDevice.setPin(mPin);
break;
@@ -252,7 +251,7 @@ public class BluetoothTestUtils extends Assert {
mDevice = device;
mProfile = profile;
- switch(mProfile) {
+ switch (mProfile) {
case BluetoothProfile.A2DP:
mConnectionAction = BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED;
break;
@@ -384,11 +383,14 @@ public class BluetoothTestUtils extends Assert {
mask = 0; // Don't check for received intents since we might have missed them.
break;
case BluetoothAdapter.STATE_OFF:
- case BluetoothAdapter.STATE_TURNING_OFF:
assertFalse(adapter.isEnabled());
start = System.currentTimeMillis();
assertTrue(adapter.enable());
break;
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ start = System.currentTimeMillis();
+ assertTrue(adapter.enable());
+ break;
default:
removeReceiver(receiver);
fail(String.format("enable() invalid state: state=%d", state));
@@ -410,7 +412,6 @@ public class BluetoothTestUtils extends Assert {
return;
}
} else {
- assertFalse(adapter.isEnabled());
assertEquals(BluetoothAdapter.STATE_TURNING_ON, state);
}
sleep(POLL_TIME);
@@ -437,7 +438,6 @@ public class BluetoothTestUtils extends Assert {
case BluetoothAdapter.STATE_TURNING_ON:
assertFalse(adapter.isEnabled());
start = System.currentTimeMillis();
- assertTrue(adapter.disable());
break;
case BluetoothAdapter.STATE_ON:
assertTrue(adapter.isEnabled());
@@ -470,7 +470,6 @@ public class BluetoothTestUtils extends Assert {
return;
}
} else {
- assertFalse(adapter.isEnabled());
assertEquals(BluetoothAdapter.STATE_TURNING_OFF, state);
}
sleep(POLL_TIME);
@@ -629,11 +628,22 @@ public class BluetoothTestUtils extends Assert {
}
public void pair(BluetoothAdapter adapter, BluetoothDevice device, int passkey, byte[] pin) {
+ pairOrAcceptPair(adapter, device, passkey, pin, true);
+ }
+
+ public void acceptPair(BluetoothAdapter adapter, BluetoothDevice device, int passkey,
+ byte[] pin) {
+ pairOrAcceptPair(adapter, device, passkey, pin, false);
+ }
+
+ private void pairOrAcceptPair(BluetoothAdapter adapter, BluetoothDevice device, int passkey,
+ byte[] pin, boolean pair) {
int mask = PairReceiver.STATE_BONDING_FLAG | PairReceiver.STATE_BONDED_FLAG;
long start = -1;
+ String methodName = pair ? "pair()" : "acceptPair()";
if (!adapter.isEnabled()) {
- fail("pair() bluetooth not enabled");
+ fail(methodName + " bluetooth not enabled");
}
PairReceiver receiver = getPairReceiver(device, passkey, pin, mask);
@@ -643,7 +653,9 @@ public class BluetoothTestUtils extends Assert {
case BluetoothDevice.BOND_NONE:
assertFalse(adapter.getBondedDevices().contains(device));
start = System.currentTimeMillis();
- assertTrue(device.createBond());
+ if (pair) {
+ assertTrue(device.createBond());
+ }
break;
case BluetoothDevice.BOND_BONDING:
mask = 0; // Don't check for received intents since we might have missed them.
@@ -653,7 +665,8 @@ public class BluetoothTestUtils extends Assert {
return;
default:
removeReceiver(receiver);
- fail(String.format("pair() invalid state: device=%s, state=%d", device, state));
+ fail(String.format("%s invalid state: device=%s, state=%d", methodName, device,
+ state));
}
long s = System.currentTimeMillis();
@@ -664,10 +677,10 @@ public class BluetoothTestUtils extends Assert {
if ((receiver.getFiredFlags() & mask) == mask) {
long finish = receiver.getCompletedTime();
if (start != -1 && finish != -1) {
- writeOutput(String.format("pair() completed in %d ms: device=%s",
+ writeOutput(String.format("%s completed in %d ms: device=%s", methodName,
(finish - start), device));
} else {
- writeOutput(String.format("pair() completed: device=%s", device));
+ writeOutput(String.format("%s completed: device=%s", methodName, device));
}
removeReceiver(receiver);
return;
@@ -678,9 +691,9 @@ public class BluetoothTestUtils extends Assert {
int firedFlags = receiver.getFiredFlags();
removeReceiver(receiver);
- fail(String.format("pair() timeout: device=%s, state=%d (expected %d), "
- + "flags=0x%x (expected 0x%x)", device, state, BluetoothDevice.BOND_BONDED,
- firedFlags, mask));
+ fail(String.format("%s timeout: device=%s, state=%d (expected %d), "
+ + "flags=0x%x (expected 0x%x)", methodName, device, state,
+ BluetoothDevice.BOND_BONDED, firedFlags, mask));
}
public void unpair(BluetoothAdapter adapter, BluetoothDevice device) {
@@ -788,7 +801,7 @@ public class BluetoothTestUtils extends Assert {
long finish = receiver.getCompletedTime();
if (start != -1 && finish != -1) {
writeOutput(String.format("connectProfile() completed in %d ms: "
- +"device=%s, profile=%d", (finish - start), device, profile));
+ + "device=%s, profile=%d", (finish - start), device, profile));
} else {
writeOutput(String.format("connectProfile() completed: device=%s, "
+ "profile=%d", device, profile));
@@ -857,7 +870,7 @@ public class BluetoothTestUtils extends Assert {
long finish = receiver.getCompletedTime();
if (start != -1 && finish != -1) {
writeOutput(String.format("disconnectProfile() completed in %d ms: "
- +"device=%s, profile=%d", (finish - start), device, profile));
+ + "device=%s, profile=%d", (finish - start), device, profile));
} else {
writeOutput(String.format("disconnectProfile() completed: device=%s, "
+ "profile=%d", device, profile));
@@ -934,14 +947,12 @@ public class BluetoothTestUtils extends Assert {
long s = System.currentTimeMillis();
switch (profile) {
case BluetoothProfile.A2DP:
- while (mA2dp != null
- && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) {
+ while (mA2dp != null && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) {
sleep(POLL_TIME);
}
return mA2dp;
case BluetoothProfile.HEADSET:
- while (mHeadset != null
- && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) {
+ while (mHeadset != null && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) {
sleep(POLL_TIME);
}
return mHeadset;
diff --git a/docs/html/guide/topics/manifest/manifest-element.jd b/docs/html/guide/topics/manifest/manifest-element.jd
index a35c5a1..7f21e6b 100644
--- a/docs/html/guide/topics/manifest/manifest-element.jd
+++ b/docs/html/guide/topics/manifest/manifest-element.jd
@@ -159,6 +159,9 @@ multiple SD cards can be used with the same device.</li>
storage. However, the system will not allow the user to move the application to external storage if
this attribute is set to {@code internalOnly}, which is the default setting.</p>
+<p>Read <a href="{@docRoot}guide/appendix/install-location.html">App Install Location</a> for
+more information about using this attribute (including how to maintain backward compatibility).</p>
+
<p>Introduced in: API Level 8.</p>
@@ -173,7 +176,7 @@ this attribute is set to {@code internalOnly}, which is the default setting.</p>
<p>
<dt>see also:</dt>
-<dd><a href="{@docRoot}guide/appendix/install-location.html">App Install Location</a><br/>
+<dd>
<code><a href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a></code></dd>
</dl>
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index 45f4a66..b5b30f6 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -472,11 +472,11 @@ If you are developing in Eclipse with ADT, right-click the project and select
Package</strong>. Select a destination filename and path and click
<strong>OK</strong>. </li>
<li>Next, locate the <code>aapt</code> tool, if it is not already in your PATH.
-If you are using SDK Tools r7 or earlier, you can find <code>aapt</code> in the
-<code>&lt;<em>SDK</em>&gt;/platforms/android-&lt;<em>platform</em>&gt;/tools/</code> directory.
+If you are using SDK Tools r8 or higher, you can find <code>aapt</code> in the
+<code>&lt;<em>SDK</em>&gt;/platform-tools/</code> directory.
<p class="note"><strong>Note:</strong> You must use the version of
-<code>aapt</code> that is provided for the latest platform release available. If
-you do not have the latest platform release, download it using the <a
+<code>aapt</code> that is provided for the latest Platform-Tools component available. If
+you do not have the latest Platform-Tools component, download it using the <a
href="{@docRoot}sdk/adding-components.html">Android SDK and AVD Manager</a>.
</p></li>
<li>Run <code>aapt</code> using this syntax: </li>
@@ -522,6 +522,14 @@ in a separate <code>&lt;uses-feature&gt;</code> element. </p>
<th>Comments</th>
</tr>
<tr>
+ <td>Audio</td>
+ <td><code>android.hardware.audio.low_latency</td>
+ <td>The application uses a low-latency audio pipeline on the device and
+is sensitive to delays or lag in sound input or output.</td>
+<td>
+</td>
+ </tr>
+ <tr>
<td>Bluetooth</td>
<td><code>android.hardware.bluetooth</td>
<td>The application uses Bluetooth radio features in the device.</td>
@@ -529,7 +537,7 @@ in a separate <code>&lt;uses-feature&gt;</code> element. </p>
</td>
</tr>
<tr>
- <td rowspan="3">Camera</td>
+ <td rowspan="4">Camera</td>
<td><code>android.hardware.camera</code></td>
<td>The application uses the device's camera. If the device supports
multiple cameras, the application uses the camera that facing
@@ -539,7 +547,7 @@ in a separate <code>&lt;uses-feature&gt;</code> element. </p>
<tr>
<td><code>android.hardware.camera.autofocus</code></td>
<td>Subfeature. The application uses the device camera's autofocus capability.</td>
- <td rowspan="2">If declared with the <code>"android:required="true"</code>
+ <td rowspan="3">If declared with the <code>"android:required="true"</code>
attribute, these subfeatures implicitly declare the
<code>android.hardware.camera</code> parent feature. </td>
</tr>
@@ -547,6 +555,10 @@ attribute, these subfeatures implicitly declare the
<td><code>android.hardware.camera.flash</code></td>
<td>Subfeature. The application uses the device camera's flash.</td>
</tr>
+<tr>
+ <td><code>android.hardware.camera.front</code></td>
+ <td>Subfeature. The application uses a front-facing camera on the device.</td>
+</tr>
<tr>
<td rowspan="3">Location</td>
@@ -568,21 +580,43 @@ attribute, these subfeatures implicitly declare the
<td>Subfeature. The application uses precise location coordinates obtained
from a Global Positioning System receiver on the device. </td>
</tr>
-
<tr>
- <td rowspan="4">Sensors</td>
+ <td>Microphone</td>
+ <td><code>android.hardware.microphone</code></td>
+ <td>The application uses a microphone on the device.
+ </td>
+ <td></td>
+</tr>
+<tr>
+ <td>Near Field Communications</td>
+ <td><code>android.hardware.nfc</td>
+ <td>The application uses NFC radio features in the device.</td>
+ <td></td>
+</tr>
+<tr>
+ <td rowspan="6">Sensors</td>
<td><code>android.hardware.sensor.accelerometer</code></td>
<td>The application uses motion readings from an accelerometer on the
device.</td>
<td></td>
</tr>
<tr>
+ <td><code>android.hardware.sensor.barometer</code></td>
+ <td>The application uses the device's barometer.</td>
+ <td></td>
+</tr>
+<tr>
<td><code>android.hardware.sensor.compass</code></td>
<td>The application uses directional readings from a magnetometer (compass) on
the device.</td>
<td></td>
</tr>
<tr>
+ <td><code>android.hardware.sensor.gyroscope</code></td>
+ <td>The application uses the device's gyroscope sensor.</td>
+ <td></td>
+</tr>
+<tr>
<td><code>android.hardware.sensor.light</code></td>
<td>The application uses the device's light sensor.</td>
<td></td>
@@ -593,12 +627,20 @@ the device.</td>
<td></td>
</tr>
<tr>
- <td>Microphone</td>
- <td><code>android.hardware.microphone</code></td>
- <td>The application uses a microphone on the device.
+ <td rowspan="2">SIP/VOIP</td>
+ <td><code>android.hardware.sip</code></td>
+ <td>The application uses SIP service on the device.
</td>
<td></td>
</tr>
+<tr>
+ <td><code>android.hardware.sip.voip</code></td>
+ <td>Subfeature. The application uses SIP-based VOIP service on the device.
+ </td>
+ <td>If declared with the <code>"android:required="true"</code> attribute, this
+subfeature implicitly declares the <code>android.hardware.sip</code>
+parent feature.</td>
+</tr>
<tr>
<td rowspan="3">Telephony</td>
@@ -622,14 +664,14 @@ device.</td>
</tr>
<tr>
- <td rowspan="3">Touchscreen</td>
+ <td rowspan="4">Touchscreen</td>
<td><code>android.hardware.touchscreen</code></td>
<td>The application uses touchscreen capabilities on the device.</td>
<td></td>
</tr>
<tr>
<td><code>android.hardware.touchscreen.multitouch</code></td>
- <td>The application uses basic two-point multitouch capabilities on the device
+ <td>Subfeature. The application uses basic two-point multitouch capabilities on the device
screen.</td>
<td>If declared with the <code>"android:required="true"</code> attribute, this
subfeature implicitly declares the <code>android.hardware.touchscreen</code>
@@ -640,10 +682,16 @@ parent feature. </td>
<td>Subfeature. The application uses advanced multipoint multitouch
capabilities on the device screen, such as for tracking two or more points fully
independently.</td>
- <td>If declared with the <code>"android:required="true"</code> attribute, this
+ <td rowspan="2">If declared with the <code>"android:required="true"</code> attribute, this
subfeature implicitly declares the
<code>android.hardware.touchscreen.multitouch</code> parent feature. </td>
</tr>
+<tr>
+ <td><code>android.hardware.touchscreen.multitouch.jazzhand</code></td>
+ <td>Subfeature. The application uses advanced multipoint multitouch
+capabilities on the device screen, for tracking up to five points fully
+independently.</td>
+</tr>
<tr>
<td>Wifi</td>
diff --git a/docs/html/guide/topics/resources/menu-resource.jd b/docs/html/guide/topics/resources/menu-resource.jd
index cde72bd..7bcd78a 100644
--- a/docs/html/guide/topics/resources/menu-resource.jd
+++ b/docs/html/guide/topics/resources/menu-resource.jd
@@ -36,22 +36,23 @@ In XML: <code>@[<em>package</em>:]menu.<em>filename</em></code>
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;<a href="#menu-element">menu</a> xmlns:android="http://schemas.android.com/apk/res/android">
&lt;<a href="#item-element">item</a> android:id="@[+][<em>package</em>:]id/<em>resource_name</em>"
- android:menuCategory=["container" | "system" | "secondary" | "alternative"]
- android:orderInCategory="<em>integer</em>"
android:title="<em>string</em>"
android:titleCondensed="<em>string</em>"
android:icon="@[package:]drawable/<em>drawable_resource_name</em>"
+ android:showAsAction=["ifRoom" | "never" | "withText" | "always"]
android:alphabeticShortcut="<em>string</em>"
android:numericShortcut="<em>string</em>"
android:checkable=["true" | "false"]
android:visible=["visible" | "invisible" | "gone"]
- android:enabled=["enabled" | "disabled"] /&gt;
+ android:enabled=["enabled" | "disabled"]
+ android:menuCategory=["container" | "system" | "secondary" | "alternative"]
+ android:orderInCategory="<em>integer</em>" /&gt;
&lt;<a href="#group-element">group</a> android:id="@[+][<em>package</em>:]id/<em>resource name</em>"
- android:menuCategory=["container" | "system" | "secondary" | "alternative"]
- android:orderInCategory="<em>integer</em>"
android:checkableBehavior=["none" | "all" | "single"]
android:visible=["visible" | "invisible" | "gone"]
- android:enabled=["enabled" | "disabled"] &gt;
+ android:enabled=["enabled" | "disabled"]
+ android:menuCategory=["container" | "system" | "secondary" | "alternative"]
+ android:orderInCategory="<em>integer</em>" &gt;
&lt;<a href="#item-element">item</a> /&gt;
&lt;/group&gt;
&lt;<a href="#item-element">item</a> &gt;
@@ -77,91 +78,120 @@ In XML: <code>@[<em>package</em>:]menu.<em>filename</em></code>
<code>"http://schemas.android.com/apk/res/android"</code>.
</dl>
</dd>
- <dt id="group-element"><code>&lt;group&gt;</code></dt>
- <dd>A menu group (to create a collection of items that share traits, such as whether they are
-visible, enabled, or checkable). Contains one or more <code>&lt;item&gt;</code> elements. Must be a
-child of a <code>&lt;menu&gt;</code> element.
+
+ <dt id="item-element"><code>&lt;item&gt;</code></dt>
+ <dd>A menu item. May contain a <code>&lt;menu&gt;</code> element (for a Sub
+ Menu). Must be a child of a <code>&lt;menu&gt;</code> or <code>&lt;group&gt;</code> element.
<p class="caps">attributes:</p>
<dl class="atn-list">
<dt><code>android:id</code></dt>
<dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item, use the form:
-<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new ID.</dd>
+<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new
+ID.</dd>
+ <dt><code>android:title</code></dt>
+ <dd><em>String</em>. The menu title.</dd>
+ <dt><code>android:titleCondensed</code></dt>
+ <dd><em>String</em>. A condensed title, for situations in which the normal title is
+too long.</dd>
+ <dt><code>android:icon</code></dt>
+ <dd><em>Drawable resource</em>. An image to be used as the menu item icon.</dd>
+
+ <dt><code>android:showAsAction</code></dt>
+ <dd><em>Keyword</em>. When and how this item should appear as an action item in the Action
+Bar. A menu item can appear as an action item only when the activity includes an {@link
+android.app.ActionBar} (introduced in API Level HONEYCOMB). Valid values:
+ <table>
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr><td><code>ifRoom</code></td><td>Only place this item in the Action Bar if
+there is room for it.</td></tr>
+ <tr><td><code>withText</code></td><td>Also include the title text (defined
+by {@code android:title}) with the action item. You can include this value along with one
+of the others as a flag set, by separating them with a pipe {@code |}.</td></tr>
+ <tr><td><code>never</code></td><td>Never place this item in the Action Bar.</td></tr>
+ <tr><td><code>always</code></td><td>Always place this item in the Action Bar.
+Avoid using this unless it's critical that the item always appear in the action
+bar. Setting multiple items to always appear as action items can result in them overlapping
+with other UI in the action bar.</td></tr>
+ </table>
+ <p>See <a href="{@docRoot}guide/topics/ui/actionbar.html">Using the Action Bar</a> for
+more information.</p>
+ <p>Introduced in API Level HONEYCOMB.</p>
+ </dd>
+
+ <dt><code>android:alphabeticShortcut</code></dt>
+ <dd><em>Char</em>. A character for the alphabetic shortcut key.</dd>
+ <dt><code>android:numericShortcut</code></dt>
+ <dd><em>Integer</em>. A number for the numeric shortcut key.</dd>
+ <dt><code>android:checkable</code></dt>
+ <dd><em>Boolean</em>. "true" if the item is checkable.</dd>
+ <dt><code>android:checked</code></dt>
+ <dd><em>Boolean</em>. "true" if the item is checked by default.</dd>
+ <dt><code>android:visible</code></dt>
+ <dd><em>Boolean</em>. "true" if the item is visible by default.</dd>
+ <dt><code>android:enabled</code></dt>
+ <dd><em>Boolean</em>. "true" if the item is enabled by default.</dd>
<dt><code>android:menuCategory</code></dt>
<dd><em>Keyword</em>. Value corresponding to {@link android.view.Menu} {@code CATEGORY_*}
- constants, which define the group's priority. Valid values:
+ constants, which define the item's priority. Valid values:
<table>
<tr><th>Value</th><th>Description</th></tr>
- <tr><td><code>container</code></td><td>For groups that are part of a
+ <tr><td><code>container</code></td><td>For items that are part of a
container.</td></tr>
- <tr><td><code>system</code></td><td>For groups that are provided by the
+ <tr><td><code>system</code></td><td>For items that are provided by the
system.</td></tr>
- <tr><td><code>secondary</code></td><td>For groups that are user-supplied secondary
+ <tr><td><code>secondary</code></td><td>For items that are user-supplied secondary
(infrequently used) options.</td></tr>
- <tr><td><code>alternative</code></td><td>For groups that are alternative actions
+ <tr><td><code>alternative</code></td><td>For items that are alternative actions
on the data that is currently displayed.</td></tr>
</table>
</dd>
<dt><code>android:orderInCategory</code></dt>
- <dd><em>Integer</em>. The default order of the items within the category.</dd>
+ <dd><em>Integer</em>. The order of "importance" of the item, within a group.</dd>
+ </dl>
+ </dd>
+
+ <dt id="group-element"><code>&lt;group&gt;</code></dt>
+ <dd>A menu group (to create a collection of items that share traits, such as whether they are
+visible, enabled, or checkable). Contains one or more <code>&lt;item&gt;</code> elements. Must be a
+child of a <code>&lt;menu&gt;</code> element.
+ <p class="caps">attributes:</p>
+ <dl class="atn-list">
+ <dt><code>android:id</code></dt>
+ <dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item,
+use the form:
+<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new
+ID.</dd>
<dt><code>android:checkableBehavior</code></dt>
<dd><em>Keyword</em>. The type of checkable behavior for the group. Valid values:
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>none</code></td><td>Not checkable</td></tr>
<tr><td><code>all</code></td><td>All items can be checked (use checkboxes)</td></tr>
- <tr><td><code>single</code></td><td>Only one item can be checked (use radio buttons)</td></tr>
+ <tr><td><code>single</code></td><td>Only one item can be checked (use radio
+buttons)</td></tr>
</table>
</dd>
<dt><code>android:visible</code></dt>
<dd><em>Boolean</em>. "true" if the group is visible.</dd>
<dt><code>android:enabled</code></dt>
<dd><em>Boolean</em>. "true" if the group is enabled.</dd>
- </dl>
- </dd>
- <dt id="item-element"><code>&lt;item&gt;</code></dt>
- <dd>A menu item. May contain a <code>&lt;menu&gt;</code> element (for a Sub
- Menu). Must be a child of a <code>&lt;menu&gt;</code> or <code>&lt;group&gt;</code> element.
- <p class="caps">attributes:</p>
- <dl class="atn-list">
- <dt><code>android:id</code></dt>
- <dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item, use the form:
-<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new ID.</dd>
<dt><code>android:menuCategory</code></dt>
<dd><em>Keyword</em>. Value corresponding to {@link android.view.Menu} {@code CATEGORY_*}
- constants, which define the item's priority. Valid values:
+ constants, which define the group's priority. Valid values:
<table>
<tr><th>Value</th><th>Description</th></tr>
- <tr><td><code>container</code></td><td>For items that are part of a
+ <tr><td><code>container</code></td><td>For groups that are part of a
container.</td></tr>
- <tr><td><code>system</code></td><td>For items that are provided by the
+ <tr><td><code>system</code></td><td>For groups that are provided by the
system.</td></tr>
- <tr><td><code>secondary</code></td><td>For items that are user-supplied secondary
+ <tr><td><code>secondary</code></td><td>For groups that are user-supplied secondary
(infrequently used) options.</td></tr>
- <tr><td><code>alternative</code></td><td>For items that are alternative actions
+ <tr><td><code>alternative</code></td><td>For groups that are alternative actions
on the data that is currently displayed.</td></tr>
</table>
</dd>
<dt><code>android:orderInCategory</code></dt>
- <dd><em>Integer</em>. The order of "importance" of the item, within a group.</dd>
- <dt><code>android:title</code></dt>
- <dd><em>String</em>. The menu title.</dd>
- <dt><code>android:titleCondensed</code></dt>
- <dd><em>String</em>. A condensed title, for situations in which the normal title is
-too long.</dd>
- <dt><code>android:icon</code></dt>
- <dd><em>Drawable resource</em>. An image to be used as the menu item icon.</dd>
- <dt><code>android:alphabeticShortcut</code></dt>
- <dd><em>Char</em>. A character for the alphabetic shortcut key.</dd>
- <dt><code>android:numericShortcut</code></dt>
- <dd><em>Integer</em>. A number for the numeric shortcut key.</dd>
- <dt><code>android:checkable</code></dt>
- <dd><em>Boolean</em>. "true" if the item is checkable.</dd>
- <dt><code>android:checked</code></dt>
- <dd><em>Boolean</em>. "true" if the item is checked by default.</dd>
- <dt><code>android:visible</code></dt>
- <dd><em>Boolean</em>. "true" if the item is visible by default.</dd>
- <dt><code>android:enabled</code></dt>
- <dd><em>Boolean</em>. "true" if the item is enabled by default.</dd>
+ <dd><em>Integer</em>. The default order of the items within the category.</dd>
</dl>
</dd>
</dl>
@@ -174,7 +204,8 @@ too long.</dd>
&lt;menu xmlns:android="http://schemas.android.com/apk/res/android">
&lt;item android:id="@+id/item1"
android:title="@string/item1"
- android:icon="@drawable/group_item1_icon" />
+ android:icon="@drawable/group_item1_icon"
+ android:showAsAction="ifRoom|withText"/>
&lt;group android:id="@+id/group">
&lt;item android:id="@+id/group_item1"
android:title="@string/group_item1"
@@ -184,7 +215,8 @@ too long.</dd>
android:icon="@drawable/group_item2_icon" />
&lt;/group>
&lt;item android:id="@+id/submenu"
- android:title="@string/submenu_title" >
+ android:title="@string/submenu_title"
+ android:showAsAction="ifRoom|withText" >
&lt;menu>
&lt;item android:id="@+id/submenu_item1"
android:title="@string/submenu_item1" />
@@ -201,6 +233,8 @@ public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
</pre>
+<p class="note"><strong>Note:</strong> The {@code android:showAsAction} attribute is
+available only on Android X.X (API Level HONEYCOMB) and greater.</p>
</dd> <!-- end example -->
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index b6cce7e..09c041f 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -26,6 +26,7 @@ import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.Slog;
import android.view.View;
import java.io.IOException;
@@ -49,6 +50,7 @@ import java.io.IOException;
public class LayerDrawable extends Drawable implements Drawable.Callback {
LayerState mLayerState;
+ private int mOpacityOverride = PixelFormat.UNKNOWN;
private int[] mPaddingL;
private int[] mPaddingT;
private int[] mPaddingR;
@@ -113,6 +115,13 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
int type;
+ TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.LayerDrawable);
+
+ mOpacityOverride = a.getInt(com.android.internal.R.styleable.LayerDrawable_opacity,
+ PixelFormat.UNKNOWN);
+
+ a.recycle();
+
final int innerDepth = parser.getDepth() + 1;
int depth;
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -125,7 +134,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
continue;
}
- TypedArray a = r.obtainAttributes(attrs,
+ a = r.obtainAttributes(attrs,
com.android.internal.R.styleable.LayerDrawableItem);
int left = a.getDimensionPixelOffset(
@@ -391,9 +400,28 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
array[i].mDrawable.setColorFilter(cf);
}
}
+
+ /**
+ * Sets the opacity of this drawable directly, instead of collecting the states from
+ * the layers
+ *
+ * @param opacity The opacity to use, or {@link PixelFormat#UNKNOWN PixelFormat.UNKNOWN}
+ * for the default behavior
+ *
+ * @see PixelFormat#UNKNOWN
+ * @see PixelFormat#TRANSLUCENT
+ * @see PixelFormat#TRANSPARENT
+ * @see PixelFormat#OPAQUE
+ */
+ public void setOpacity(int opacity) {
+ mOpacityOverride = opacity;
+ }
@Override
public int getOpacity() {
+ if (mOpacityOverride != PixelFormat.UNKNOWN) {
+ return mOpacityOverride;
+ }
return mLayerState.getOpacity();
}
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 9dc291b..0de53f2 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -352,7 +352,7 @@ public class Allocation extends BaseObj {
if (bc == Bitmap.Config.RGB_565) {
return Element.RGB_565(rs);
}
- throw new RSInvalidStateException("Bad bitmap type.");
+ throw new RSInvalidStateException("Bad bitmap type: " + bc);
}
static private Type typeFromBitmap(RenderScript rs, Bitmap b) {
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index df03e13..dcf86e3 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -389,6 +389,10 @@ public class RenderScript {
synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
rsnScriptSetVarV(mContext, id, slot, val);
}
+ native void rsnScriptSetVarObj(int con, int id, int slot, int val);
+ synchronized void nScriptSetVarObj(int id, int slot, int val) {
+ rsnScriptSetVarObj(mContext, id, slot, val);
+ }
native void rsnScriptCBegin(int con);
synchronized void nScriptCBegin() {
@@ -398,9 +402,9 @@ public class RenderScript {
synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
rsnScriptCSetScript(mContext, script, offset, length);
}
- native int rsnScriptCCreate(int con);
- synchronized int nScriptCCreate() {
- return rsnScriptCCreate(mContext);
+ native int rsnScriptCCreate(int con, String val);
+ synchronized int nScriptCCreate(String val) {
+ return rsnScriptCCreate(mContext, val);
}
native void rsnSamplerBegin(int con);
@@ -810,6 +814,3 @@ public class RenderScript {
return 0;
}
}
-
-
-
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 7d7dd6d..ea616c6 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -88,6 +88,10 @@ public class Script extends BaseObj {
mRS.nScriptSetVarI(getID(), index, v ? 1 : 0);
}
+ public void setVar(int index, BaseObj o) {
+ mRS.nScriptSetVarObj(getID(), index, (o == null) ? 0 : o.getID());
+ }
+
public void setVar(int index, FieldPacker v) {
mRS.nScriptSetVarV(getID(), index, v.getData());
}
diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java
index 44fc5fd..64ed75b 100644
--- a/graphics/java/android/renderscript/ScriptC.java
+++ b/graphics/java/android/renderscript/ScriptC.java
@@ -75,7 +75,7 @@ public class ScriptC extends Script {
rs.nScriptCBegin();
rs.nScriptCSetScript(pgm, 0, pgmLength);
- return rs.nScriptCCreate();
+ Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID));
+ return rs.nScriptCCreate(resources.getResourceName(resourceID));
}
}
-
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index dd84848..1cc4386 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -829,6 +829,13 @@ nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slo
}
static void
+nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
+{
+ LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
+ rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val);
+}
+
+static void
nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val)
{
LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val);
@@ -947,10 +954,11 @@ exit:
}
static jint
-nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con)
+nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName)
{
LOG_API("nScriptCCreate, con(%p)", con);
- return (jint)rsScriptCCreate(con);
+ const char* resNameUTF = _env->GetStringUTFChars(resName, NULL);
+ return (jint)rsScriptCCreate(con, resNameUTF);
}
// ---------------------------------------------------------------------------
@@ -1335,10 +1343,11 @@ static JNINativeMethod methods[] = {
{"rsnScriptSetVarF", "(IIIF)V", (void*)nScriptSetVarF },
{"rsnScriptSetVarD", "(IIID)V", (void*)nScriptSetVarD },
{"rsnScriptSetVarV", "(III[B)V", (void*)nScriptSetVarV },
+{"rsnScriptSetVarObj", "(IIII)V", (void*)nScriptSetVarObj },
{"rsnScriptCBegin", "(I)V", (void*)nScriptCBegin },
{"rsnScriptCSetScript", "(I[BII)V", (void*)nScriptCSetScript },
-{"rsnScriptCCreate", "(I)I", (void*)nScriptCCreate },
+{"rsnScriptCCreate", "(ILjava/lang/String;)I", (void*)nScriptCCreate },
{"rsnProgramStoreBegin", "(III)V", (void*)nProgramStoreBegin },
{"rsnProgramStoreDepthFunc", "(II)V", (void*)nProgramStoreDepthFunc },
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index cce2400..1e29d82 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -156,6 +156,7 @@ public:
MODE_NORMAL = 0,
MODE_RINGTONE,
MODE_IN_CALL,
+ MODE_IN_COMMUNICATION,
NUM_MODES // not a valid entry, denotes end-of-list
};
diff --git a/include/media/EffectApi.h b/include/media/EffectApi.h
index 16fb43c..b97c22e 100644
--- a/include/media/EffectApi.h
+++ b/include/media/EffectApi.h
@@ -602,9 +602,9 @@ enum audio_device_e {
// Audio mode
enum audio_mode_e {
- AUDIO_MODE_NORMAL, // phone idle
- AUDIO_MODE_RINGTONE, // phone ringing
- AUDIO_MODE_IN_CALL // phone call connected
+ AUDIO_MODE_NORMAL, // device idle
+ AUDIO_MODE_RINGTONE, // device ringing
+ AUDIO_MODE_IN_CALL // audio call connected (VoIP or telephony)
};
// Values for "accessMode" field of buffer_config_t:
diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h
index 3d77278..bba7ed7 100644
--- a/include/media/IMediaPlayer.h
+++ b/include/media/IMediaPlayer.h
@@ -34,7 +34,6 @@ public:
virtual void disconnect() = 0;
- virtual status_t setVideoISurface(const sp<ISurface>& surface) = 0;
virtual status_t setVideoSurface(const sp<Surface>& surface) = 0;
virtual status_t prepareAsync() = 0;
virtual status_t start() = 0;
diff --git a/include/media/IOMX.h b/include/media/IOMX.h
index fa775e7..cb36bbb 100644
--- a/include/media/IOMX.h
+++ b/include/media/IOMX.h
@@ -120,30 +120,6 @@ public:
node_id node,
const char *parameter_name,
OMX_INDEXTYPE *index) = 0;
-
- virtual sp<IOMXRenderer> createRenderer(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) = 0;
-
- // Note: These methods are _not_ virtual, it exists as a wrapper around
- // the virtual "createRenderer" method above facilitating extraction
- // of the ISurface from a regular Surface or a java Surface object.
- sp<IOMXRenderer> createRenderer(
- const sp<Surface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight);
-
- sp<IOMXRenderer> createRendererFromJavaSurface(
- JNIEnv *env, jobject javaSurface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight);
};
struct omx_message {
@@ -190,13 +166,6 @@ public:
virtual void onMessage(const omx_message &msg) = 0;
};
-class IOMXRenderer : public IInterface {
-public:
- DECLARE_META_INTERFACE(OMXRenderer);
-
- virtual void render(IOMX::buffer_id buffer) = 0;
-};
-
////////////////////////////////////////////////////////////////////////////////
class BnOMX : public BnInterface<IOMX> {
@@ -213,13 +182,6 @@ public:
uint32_t flags = 0);
};
-class BnOMXRenderer : public BnInterface<IOMXRenderer> {
-public:
- virtual status_t onTransact(
- uint32_t code, const Parcel &data, Parcel *reply,
- uint32_t flags = 0);
-};
-
} // namespace android
#endif // ANDROID_IOMX_H_
diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h
index 2d55a55..672931e 100644
--- a/include/media/MediaPlayerInterface.h
+++ b/include/media/MediaPlayerInterface.h
@@ -106,7 +106,6 @@ public:
const KeyedVector<String8, String8> *headers = NULL) = 0;
virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0;
- virtual status_t setVideoISurface(const sp<ISurface>& surface) = 0;
virtual status_t setVideoSurface(const sp<Surface>& surface) = 0;
virtual status_t prepare() = 0;
virtual status_t prepareAsync() = 0;
diff --git a/include/media/stagefright/HardwareAPI.h b/include/media/stagefright/HardwareAPI.h
index 4fd281b..17908b4 100644
--- a/include/media/stagefright/HardwareAPI.h
+++ b/include/media/stagefright/HardwareAPI.h
@@ -19,8 +19,6 @@
#define HARDWARE_API_H_
#include <media/stagefright/OMXPluginBase.h>
-#include <media/stagefright/VideoRenderer.h>
-#include <surfaceflinger/ISurface.h>
#include <ui/android_native_buffer.h>
#include <utils/RefBase.h>
@@ -91,13 +89,6 @@ struct UseAndroidNativeBufferParams {
} // namespace android
-extern android::VideoRenderer *createRenderer(
- const android::sp<android::ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight);
-
extern android::OMXPluginBase *createOMXPlugin();
#endif // HARDWARE_API_H_
diff --git a/include/media/stagefright/VideoRenderer.h b/include/media/stagefright/VideoRenderer.h
deleted file mode 100644
index f80b277..0000000
--- a/include/media/stagefright/VideoRenderer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef VIDEO_RENDERER_H_
-
-#define VIDEO_RENDERER_H_
-
-#include <sys/types.h>
-
-namespace android {
-
-class VideoRenderer {
-public:
- virtual ~VideoRenderer() {}
-
- virtual void render(
- const void *data, size_t size, void *platformPrivate) = 0;
-
-protected:
- VideoRenderer() {}
-
- VideoRenderer(const VideoRenderer &);
- VideoRenderer &operator=(const VideoRenderer &);
-};
-
-} // namespace android
-
-#endif // VIDEO_RENDERER_H_
diff --git a/include/ui/FramebufferNativeWindow.h b/include/ui/FramebufferNativeWindow.h
index c913355..2cd0911 100644
--- a/include/ui/FramebufferNativeWindow.h
+++ b/include/ui/FramebufferNativeWindow.h
@@ -29,6 +29,7 @@
#include <ui/egl/android_natives.h>
+#define NUM_FRAME_BUFFERS 2
extern "C" EGLNativeWindowType android_createDisplaySurface(void);
@@ -72,7 +73,7 @@ private:
framebuffer_device_t* fbDev;
alloc_device_t* grDev;
- sp<NativeBuffer> buffers[2];
+ sp<NativeBuffer> buffers[NUM_FRAME_BUFFERS];
sp<NativeBuffer> front;
mutable Mutex mutex;
diff --git a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
index 359f334..76c23b7 100644
--- a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
+++ b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
@@ -33,8 +33,6 @@ public class BallsRS {
private ProgramFragment mPFLines;
private ProgramFragment mPFPoints;
private ProgramVertex mPV;
- private ProgramRaster mPR;
- private ProgramStore mPS;
private ScriptField_Point mPoints;
private ScriptField_Point mArcs;
private ScriptField_VpConsts mVpConsts;
@@ -48,12 +46,6 @@ public class BallsRS {
mVpConsts.set(i, 0, true);
}
- private void createProgramRaster() {
- ProgramRaster.Builder b = new ProgramRaster.Builder(mRS);
- mPR = b.create();
- mScript.set_gPR(mPR);
- }
-
private void createProgramVertex() {
updateProjectionMatrices();
@@ -71,7 +63,7 @@ public class BallsRS {
sb.addInput(mPoints.getElement());
ProgramVertex pvs = sb.create();
pvs.bindConstants(mVpConsts.getAllocation(), 0);
- mScript.set_gPV(pvs);
+ mRS.contextBindProgramVertex(pvs);
}
private Allocation loadTexture(int id) {
@@ -125,10 +117,8 @@ public class BallsRS {
mScript.set_gPFLines(mPFLines);
mScript.set_gPFPoints(mPFPoints);
createProgramVertex();
- createProgramRaster();
- mPS = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS);
- mScript.set_gPS(mPS);
+ mRS.contextBindProgramStore(ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS));
mPhysicsScript.set_gMinPos(new Float2(5, 5));
mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5));
diff --git a/libs/rs/java/Balls/src/com/android/balls/balls.rs b/libs/rs/java/Balls/src/com/android/balls/balls.rs
index bbd03cf..3edbe2d 100644
--- a/libs/rs/java/Balls/src/com/android/balls/balls.rs
+++ b/libs/rs/java/Balls/src/com/android/balls/balls.rs
@@ -4,13 +4,11 @@
#include "balls.rsh"
-#pragma stateFragment(parent)
+#pragma stateVertex(parent)
+#pragma stateStore(parent)
rs_program_fragment gPFPoints;
rs_program_fragment gPFLines;
-rs_program_vertex gPV;
-rs_program_raster gPR;
-rs_program_store gPS;
rs_mesh partMesh;
rs_mesh arcMesh;
@@ -95,9 +93,6 @@ int root() {
frame++;
rsgBindProgramFragment(gPFLines);
- rsgBindProgramVertex(gPV);
- rsgBindProgramRaster(gPR);
- rsgBindProgramStore(gPS);
rsgDrawMesh(arcMesh, 0, 0, arcIdx);
rsgBindProgramFragment(gPFPoints);
rsgDrawMesh(partMesh);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index ac9abe0..1b584c8 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -280,6 +280,12 @@ ScriptSetVarI {
param int value
}
+ScriptSetVarObj {
+ param RsScript s
+ param uint32_t slot
+ param RsObjectBase value
+ }
+
ScriptSetVarJ {
param RsScript s
param uint32_t slot
@@ -314,6 +320,7 @@ ScriptCSetText {
}
ScriptCCreate {
+ param const char * resName
ret RsScript
}
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 18bf9fa..143c4dc 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -262,21 +262,27 @@ void Context::deinitEGL() {
}
}
+Context::PushState::PushState(Context *con) {
+ mRsc = con;
+ mFragment.set(con->getProgramFragment());
+ mVertex.set(con->getProgramVertex());
+ mStore.set(con->getProgramStore());
+ mRaster.set(con->getProgramRaster());
+}
+
+Context::PushState::~PushState() {
+ mRsc->setProgramFragment(mFragment.get());
+ mRsc->setProgramVertex(mVertex.get());
+ mRsc->setProgramStore(mStore.get());
+ mRsc->setProgramRaster(mRaster.get());
+ mRsc->setFont(mFont.get());
+}
+
uint32_t Context::runScript(Script *s) {
- ObjectBaseRef<ProgramFragment> frag(mFragment);
- ObjectBaseRef<ProgramVertex> vtx(mVertex);
- ObjectBaseRef<ProgramStore> store(mFragmentStore);
- ObjectBaseRef<ProgramRaster> raster(mRaster);
- ObjectBaseRef<Font> font(mFont);
+ PushState(this);
uint32_t ret = s->run(this);
-
- mFragment.set(frag);
- mVertex.set(vtx);
- mFragmentStore.set(store);
- mRaster.set(raster);
- mFont.set(font);
return ret;
}
@@ -441,13 +447,13 @@ void * Context::threadProc(void *vrsc) {
rsc->mScriptC.init(rsc);
if (rsc->mIsGraphicsContext) {
rsc->mStateRaster.init(rsc);
- rsc->setRaster(NULL);
+ rsc->setProgramRaster(NULL);
rsc->mStateVertex.init(rsc);
- rsc->setVertex(NULL);
+ rsc->setProgramVertex(NULL);
rsc->mStateFragment.init(rsc);
- rsc->setFragment(NULL);
+ rsc->setProgramFragment(NULL);
rsc->mStateFragmentStore.init(rsc);
- rsc->setFragmentStore(NULL);
+ rsc->setProgramStore(NULL);
rsc->mStateFont.init(rsc);
rsc->setFont(NULL);
rsc->mStateVertexArray.init(rsc);
@@ -753,7 +759,7 @@ void Context::setRootScript(Script *s) {
mRootScript.set(s);
}
-void Context::setFragmentStore(ProgramStore *pfs) {
+void Context::setProgramStore(ProgramStore *pfs) {
rsAssert(mIsGraphicsContext);
if (pfs == NULL) {
mFragmentStore.set(mStateFragmentStore.mDefault);
@@ -762,7 +768,7 @@ void Context::setFragmentStore(ProgramStore *pfs) {
}
}
-void Context::setFragment(ProgramFragment *pf) {
+void Context::setProgramFragment(ProgramFragment *pf) {
rsAssert(mIsGraphicsContext);
if (pf == NULL) {
mFragment.set(mStateFragment.mDefault);
@@ -771,7 +777,7 @@ void Context::setFragment(ProgramFragment *pf) {
}
}
-void Context::setRaster(ProgramRaster *pr) {
+void Context::setProgramRaster(ProgramRaster *pr) {
rsAssert(mIsGraphicsContext);
if (pr == NULL) {
mRaster.set(mStateRaster.mDefault);
@@ -780,7 +786,7 @@ void Context::setRaster(ProgramRaster *pr) {
}
}
-void Context::setVertex(ProgramVertex *pv) {
+void Context::setProgramVertex(ProgramVertex *pv) {
rsAssert(mIsGraphicsContext);
if (pv == NULL) {
mVertex.set(mStateVertex.mDefault);
@@ -951,22 +957,22 @@ void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) {
void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) {
ProgramStore *pfs = static_cast<ProgramStore *>(vpfs);
- rsc->setFragmentStore(pfs);
+ rsc->setProgramStore(pfs);
}
void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) {
ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
- rsc->setFragment(pf);
+ rsc->setProgramFragment(pf);
}
void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) {
ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
- rsc->setRaster(pr);
+ rsc->setProgramRaster(pr);
}
void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) {
ProgramVertex *pv = static_cast<ProgramVertex *>(vpv);
- rsc->setVertex(pv);
+ rsc->setProgramVertex(pv);
}
void rsi_ContextBindFont(Context *rsc, RsFont vfont) {
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 6945342..c377c73 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -80,6 +80,21 @@ public:
Context * mContext;
Script * mScript;
};
+
+ class PushState {
+ public:
+ PushState(Context *);
+ ~PushState();
+
+ private:
+ ObjectBaseRef<ProgramFragment> mFragment;
+ ObjectBaseRef<ProgramVertex> mVertex;
+ ObjectBaseRef<ProgramStore> mStore;
+ ObjectBaseRef<ProgramRaster> mRaster;
+ ObjectBaseRef<Font> mFont;
+ Context *mRsc;
+ };
+
ScriptTLSStruct *mTlsStruct;
RsSurfaceConfig mUserSurfaceConfig;
@@ -101,18 +116,18 @@ public:
void swapBuffers();
void setRootScript(Script *);
- void setRaster(ProgramRaster *);
- void setVertex(ProgramVertex *);
- void setFragment(ProgramFragment *);
- void setFragmentStore(ProgramStore *);
+ void setProgramRaster(ProgramRaster *);
+ void setProgramVertex(ProgramVertex *);
+ void setProgramFragment(ProgramFragment *);
+ void setProgramStore(ProgramStore *);
void setFont(Font *);
void updateSurface(void *sur);
- const ProgramFragment * getFragment() {return mFragment.get();}
- const ProgramStore * getFragmentStore() {return mFragmentStore.get();}
- const ProgramRaster * getRaster() {return mRaster.get();}
- const ProgramVertex * getVertex() {return mVertex.get();}
+ ProgramFragment * getProgramFragment() {return mFragment.get();}
+ ProgramStore * getProgramStore() {return mFragmentStore.get();}
+ ProgramRaster * getProgramRaster() {return mRaster.get();}
+ ProgramVertex * getProgramVertex() {return mVertex.get();}
Font * getFont() {return mFont.get();}
bool setupCheck();
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp
index 96e350d..e4d77b2 100644
--- a/libs/rs/rsFont.cpp
+++ b/libs/rs/rsFont.cpp
@@ -613,18 +613,12 @@ void FontState::checkInit() {
}
void FontState::issueDrawCommand() {
+ Context::PushState ps(mRSC);
- ObjectBaseRef<const ProgramVertex> tmpV(mRSC->getVertex());
- mRSC->setVertex(mRSC->getDefaultProgramVertex());
-
- ObjectBaseRef<const ProgramRaster> tmpR(mRSC->getRaster());
- mRSC->setRaster(mRSC->getDefaultProgramRaster());
-
- ObjectBaseRef<const ProgramFragment> tmpF(mRSC->getFragment());
- mRSC->setFragment(mFontShaderF.get());
-
- ObjectBaseRef<const ProgramStore> tmpPS(mRSC->getFragmentStore());
- mRSC->setFragmentStore(mFontProgramStore.get());
+ mRSC->setProgramVertex(mRSC->getDefaultProgramVertex());
+ mRSC->setProgramRaster(mRSC->getDefaultProgramRaster());
+ mRSC->setProgramFragment(mFontShaderF.get());
+ mRSC->setProgramStore(mFontProgramStore.get());
if (mConstantsDirty) {
mFontShaderFConstant->data(mRSC, &mConstants, sizeof(mConstants));
@@ -632,10 +626,6 @@ void FontState::issueDrawCommand() {
}
if (!mRSC->setupCheck()) {
- mRSC->setVertex((ProgramVertex *)tmpV.get());
- mRSC->setRaster((ProgramRaster *)tmpR.get());
- mRSC->setFragment((ProgramFragment *)tmpF.get());
- mRSC->setFragmentStore((ProgramStore *)tmpPS.get());
return;
}
@@ -651,12 +641,6 @@ void FontState::issueDrawCommand() {
mIndexBuffer->uploadCheck(mRSC);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID());
glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, (uint16_t *)(0));
-
- // Reset the state
- mRSC->setVertex((ProgramVertex *)tmpV.get());
- mRSC->setRaster((ProgramRaster *)tmpR.get());
- mRSC->setFragment((ProgramFragment *)tmpF.get());
- mRSC->setFragmentStore((ProgramStore *)tmpPS.get());
}
void FontState::appendMeshQuad(float x1, float y1, float z1,
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index 4ffdbfd..efdc626 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -67,6 +67,22 @@ void Script::setVar(uint32_t slot, const void *val, uint32_t len) {
}
}
+void Script::setVarObj(uint32_t slot, ObjectBase *val) {
+ ObjectBase **destPtr = ((ObjectBase ***)mEnviroment.mFieldAddress)[slot];
+
+ if (destPtr) {
+ if (val != NULL) {
+ val->incSysRef();
+ }
+ if (*destPtr) {
+ (*destPtr)->decSysRef();
+ }
+ *destPtr = val;
+ } else {
+ LOGV("Calling setVarObj on slot = %i which is null. This is dangerous because the script will not hold a ref count on the object.", slot);
+ }
+}
+
namespace android {
namespace renderscript {
@@ -103,6 +119,12 @@ void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) {
s->setVar(slot, &value, sizeof(value));
}
+void rsi_ScriptSetVarObj(Context *rsc, RsScript vs, uint32_t slot, RsObjectBase value) {
+ Script *s = static_cast<Script *>(vs);
+ ObjectBase *o = static_cast<ObjectBase *>(value);
+ s->setVarObj(slot, o);
+}
+
void rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, long long value) {
Script *s = static_cast<Script *>(vs);
s->setVar(slot, &value, sizeof(value));
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
index 9b6d8a9..bad095b 100644
--- a/libs/rs/rsScript.h
+++ b/libs/rs/rsScript.h
@@ -61,6 +61,7 @@ public:
void initSlots();
void setSlot(uint32_t slot, Allocation *a);
void setVar(uint32_t slot, const void *val, uint32_t len);
+ void setVarObj(uint32_t slot, ObjectBase *val);
virtual void runForEach(Context *rsc,
const Allocation * ain,
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 033f316..6587b51 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -65,12 +65,11 @@ void ScriptC::setupScript(Context *rsc) {
void **dest = ((void ***)mEnviroment.mFieldAddress)[ct];
if (rsc->props.mLogScripts) {
- LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType());
-
- //const uint32_t *p32 = (const uint32_t *)ptr;
- //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) {
- //LOGE(" %i = 0x%08x ", ct2, p32[ct2]);
- //}
+ if (mSlots[ct].get() != NULL) {
+ LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType());
+ } else {
+ LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=null", rsc, ct, dest, ptr);
+ }
}
if (dest) {
@@ -105,16 +104,16 @@ Script * ScriptC::setTLS(Script *sc) {
void ScriptC::setupGLState(Context *rsc) {
if (mEnviroment.mFragmentStore.get()) {
- rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
+ rsc->setProgramStore(mEnviroment.mFragmentStore.get());
}
if (mEnviroment.mFragment.get()) {
- rsc->setFragment(mEnviroment.mFragment.get());
+ rsc->setProgramFragment(mEnviroment.mFragment.get());
}
if (mEnviroment.mVertex.get()) {
- rsc->setVertex(mEnviroment.mVertex.get());
+ rsc->setProgramVertex(mEnviroment.mVertex.get());
}
if (mEnviroment.mRaster.get()) {
- rsc->setRaster(mEnviroment.mRaster.get());
+ rsc->setProgramRaster(mEnviroment.mRaster.get());
}
}
@@ -233,6 +232,7 @@ void ScriptC::runForEach(Context *rsc,
const RsScriptCall *sc) {
MTLaunchStruct mtls;
memset(&mtls, 0, sizeof(mtls));
+ Context::PushState ps(rsc);
if (ain) {
mtls.dimX = ain->getType()->getDimX();
@@ -396,15 +396,25 @@ static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) {
extern const char rs_runtime_lib_bc[];
extern unsigned rs_runtime_lib_bc_size;
-void ScriptCState::runCompiler(Context *rsc, ScriptC *s) {
+void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName) {
{
- StopWatch compileTimer("RenderScript compile time");
s->mBccScript = bccCreateScript();
s->mEnviroment.mIsThreadable = true;
- bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength);
- //bccLinkBitcode(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size);
bccRegisterSymbolCallback(s->mBccScript, symbolLookup, s);
- bccCompileScript(s->mBccScript);
+ // bccReadBC() reads in the BitCode, if no cache file corresponding to
+ // the resName is found. Otherwise, bccReadBC() returns a negative value
+ // and the "else" branch will be taken.
+ if (bccReadBC(s->mBccScript,
+ s->mEnviroment.mScriptText,
+ s->mEnviroment.mScriptTextLength,
+ resName) >= 0) {
+ //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size);
+ bccCompileBC(s->mBccScript);
+ } else {
+ // bccReadBC returns a neagative value: Didn't read any script,
+ // So, use cached binary instead
+ bccLoadBinary(s->mBccScript);
+ }
bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot);
bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit);
}
@@ -518,14 +528,15 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) {
ss->mScript->mEnviroment.mScriptTextLength = len;
}
-RsScript rsi_ScriptCCreate(Context * rsc) {
+RsScript rsi_ScriptCCreate(Context * rsc, const char *resName)
+{
ScriptCState *ss = &rsc->mScriptC;
ObjectBaseRef<ScriptC> s(ss->mScript);
ss->mScript.clear();
s->incUserRef();
- ss->runCompiler(rsc, s.get());
+ ss->runCompiler(rsc, s.get(), resName);
ss->clear(rsc);
return s.get();
}
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 7ca33ac..4f0dff3 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -81,7 +81,7 @@ public:
void init(Context *rsc);
void clear(Context *rsc);
- void runCompiler(Context *rsc, ScriptC *s);
+ void runCompiler(Context *rsc, ScriptC *s, const char *resName);
struct SymbolTable_t {
const char * mName;
@@ -98,6 +98,3 @@ public:
}
}
#endif
-
-
-
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
index ef1475c..0f84e4b 100644
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -92,17 +92,17 @@ static void SC_bindProgramRaster(RsProgramRaster pv) {
static void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) {
GET_TLS();
- rsc->getVertex()->setProjectionMatrix(rsc, m);
+ rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
}
static void SC_vpLoadModelMatrix(const rsc_Matrix *m) {
GET_TLS();
- rsc->getVertex()->setModelviewMatrix(rsc, m);
+ rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
}
static void SC_vpLoadTextureMatrix(const rsc_Matrix *m) {
GET_TLS();
- rsc->getVertex()->setTextureMatrix(rsc, m);
+ rsc->getProgramVertex()->setTextureMatrix(rsc, m);
}
static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) {
@@ -114,7 +114,7 @@ static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b,
static void SC_vpGetProjectionMatrix(rsc_Matrix *m) {
GET_TLS();
- rsc->getVertex()->getProjectionMatrix(rsc, m);
+ rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
}
//////////////////////////////////////////////////////////////////////////////
@@ -165,8 +165,8 @@ static void SC_drawQuad(float x1, float y1, float z1,
static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) {
GET_TLS();
- ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
- rsc->setVertex(rsc->getDefaultProgramVertex());
+ ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
+ rsc->setProgramVertex(rsc->getDefaultProgramVertex());
//rsc->setupCheck();
//GLint crop[4] = {0, h, w, -h};
@@ -177,7 +177,7 @@ static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h
x+w, sh - y, z,
x+w, sh - (y+h), z,
x, sh - (y+h), z);
- rsc->setVertex((ProgramVertex *)tmp.get());
+ rsc->setProgramVertex((ProgramVertex *)tmp.get());
}
/*
static void SC_drawSprite(float x, float y, float z, float w, float h)
@@ -271,7 +271,7 @@ static void SC_meshComputeBoundingBox(RsMesh vsm,
static void SC_color(float r, float g, float b, float a) {
GET_TLS();
- ProgramFragment *pf = (ProgramFragment *)rsc->getFragment();
+ ProgramFragment *pf = (ProgramFragment *)rsc->getProgramFragment();
pf->setConstantColor(rsc, r, g, b, a);
}
diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp
index a36d555..04a0195 100644
--- a/libs/ui/FramebufferNativeWindow.cpp
+++ b/libs/ui/FramebufferNativeWindow.cpp
@@ -83,6 +83,7 @@ FramebufferNativeWindow::FramebufferNativeWindow()
if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
int stride;
int err;
+ int i;
err = framebuffer_open(module, &fbDev);
LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err));
@@ -96,27 +97,33 @@ FramebufferNativeWindow::FramebufferNativeWindow()
mUpdateOnDemand = (fbDev->setUpdateRect != 0);
// initialize the buffer FIFO
- mNumBuffers = 2;
- mNumFreeBuffers = 2;
+ mNumBuffers = NUM_FRAME_BUFFERS;
+ mNumFreeBuffers = NUM_FRAME_BUFFERS;
mBufferHead = mNumBuffers-1;
- buffers[0] = new NativeBuffer(
- fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
- buffers[1] = new NativeBuffer(
- fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
-
- err = grDev->alloc(grDev,
- fbDev->width, fbDev->height, fbDev->format,
- GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride);
-
- LOGE_IF(err, "fb buffer 0 allocation failed w=%d, h=%d, err=%s",
- fbDev->width, fbDev->height, strerror(-err));
-
- err = grDev->alloc(grDev,
- fbDev->width, fbDev->height, fbDev->format,
- GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride);
- LOGE_IF(err, "fb buffer 1 allocation failed w=%d, h=%d, err=%s",
- fbDev->width, fbDev->height, strerror(-err));
+ for (i = 0; i < mNumBuffers; i++)
+ {
+ buffers[i] = new NativeBuffer(
+ fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
+ }
+
+ for (i = 0; i < mNumBuffers; i++)
+ {
+ err = grDev->alloc(grDev,
+ fbDev->width, fbDev->height, fbDev->format,
+ GRALLOC_USAGE_HW_FB, &buffers[i]->handle, &buffers[i]->stride);
+
+ LOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s",
+ i, fbDev->width, fbDev->height, strerror(-err));
+
+ if (err)
+ {
+ mNumBuffers = i;
+ mNumFreeBuffers = i;
+ mBufferHead = mNumBuffers-1;
+ break;
+ }
+ }
const_cast<uint32_t&>(ANativeWindow::flags) = fbDev->flags;
const_cast<float&>(ANativeWindow::xdpi) = fbDev->xdpi;
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index b84a2c2..def88ae 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -984,7 +984,7 @@ public class AudioManager {
* application when it places a phone call, as it will cause signals from the radio layer
* to feed the platform mixer.
*
- * @param mode the requested audio mode (NORMAL, RINGTONE, or IN_CALL).
+ * @param mode the requested audio mode (NORMAL, RINGTONE, IN_CALL or IN_COMMUNICATION).
* Informs the HAL about the current audio state so that
* it can route the audio appropriately.
*/
@@ -1000,7 +1000,7 @@ public class AudioManager {
/**
* Returns the current audio mode.
*
- * @return the current audio mode (NORMAL, RINGTONE, or IN_CALL).
+ * @return the current audio mode (NORMAL, RINGTONE, IN_CALL or IN_COMMUNICATION).
* Returns the current current audio state from the HAL.
*/
public int getMode() {
@@ -1034,9 +1034,14 @@ public class AudioManager {
*/
public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE;
/**
- * In call audio mode. A call is established.
+ * In call audio mode. A telephony call is established.
*/
public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL;
+ /**
+ * @hide
+ * In communication audio mode. An audio/video chat or VoIP call is established.
+ */
+ public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION;
/* Routing bits for setRouting/getRouting API */
/**
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 3bee906..cfcc2ba 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -718,7 +718,7 @@ public class AudioService extends IAudioService.Stub {
return;
}
- if (mode < AudioSystem.MODE_CURRENT || mode > AudioSystem.MODE_IN_CALL) {
+ if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) {
return;
}
@@ -2305,6 +2305,7 @@ public class AudioService extends IAudioService.Stub {
// add modify the phone app to take advantage of the new API
synchronized(mRingingLock) {
if (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL) ||
+ (getMode() == AudioSystem.MODE_IN_COMMUNICATION) ||
(getMode() == AudioSystem.MODE_RINGTONE) ) {
return;
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 5442791..1fd03dc 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -106,7 +106,8 @@ public class AudioSystem
public static final int MODE_NORMAL = 0;
public static final int MODE_RINGTONE = 1;
public static final int MODE_IN_CALL = 2;
- public static final int NUM_MODES = 3;
+ public static final int MODE_IN_COMMUNICATION = 3;
+ public static final int NUM_MODES = 4;
/* Routing bits for setRouting/getRouting API */
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 2bea84f..39c4a28 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -149,12 +149,10 @@ public class MediaRecorder
* {@link #DEFAULT} otherwise. */
public static final int VOICE_RECOGNITION = 6;
- /**
- * @hide
- * Microphone audio source tuned for voice communications such as VoIP. It
- * will for instance take advantage of echo cancellation or automatic gain control
- * if available. It otherwise behaves like {@link #DEFAULT} if no voice processing
- * is available.
+ /** Microphone audio source tuned for voice communications such as VoIP. It
+ * will for instance take advantage of echo cancellation or automatic gain control
+ * if available. It otherwise behaves like {@link #DEFAULT} if no voice processing
+ * is applied.
*/
public static final int VOICE_COMMUNICATION = 7;
}
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 7f4960f..69b872b 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -434,24 +434,23 @@ public class MediaScanner
}
}
- mMimeType = null;
+ mMimeType = mimeType;
mFileType = 0;
mFileSize = fileSize;
// try mimeType first, if it is specified
if (mimeType != null) {
mFileType = MediaFile.getFileTypeForMimeType(mimeType);
- if (mFileType != 0) {
- mMimeType = mimeType;
- }
}
// if mimeType was not specified, compute file type based on file extension.
- if (mMimeType == null) {
+ if (mFileType == 0) {
MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
if (mediaFileType != null) {
mFileType = mediaFileType.fileType;
- mMimeType = mediaFileType.mimeType;
+ if (mMimeType == null) {
+ mMimeType = mediaFileType.mimeType;
+ }
}
}
diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java
index 42d068f..e48e9e8 100644
--- a/media/java/android/media/MtpDatabase.java
+++ b/media/java/android/media/MtpDatabase.java
@@ -164,7 +164,7 @@ public class MtpDatabase {
}
}
- private void endSendObject(String path, int handle, int format, boolean succeeded) {
+ private void endSendObject(String path, int handle, int format, long actualSize, boolean succeeded) {
if (succeeded) {
// handle abstract playlists separately
// they do not exist in the file system so don't use the media scanner here
@@ -184,6 +184,7 @@ public class MtpDatabase {
ContentValues values = new ContentValues(1);
values.put(Audio.Playlists.DATA, path);
values.put(Audio.Playlists.NAME, name);
+ values.put(Files.FileColumns.FORMAT, format);
values.put(MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, handle);
try {
Uri uri = mMediaProvider.insert(Audio.Playlists.EXTERNAL_CONTENT_URI, values);
@@ -191,6 +192,18 @@ public class MtpDatabase {
Log.e(TAG, "RemoteException in endSendObject", e);
}
} else {
+ if (actualSize >= 0) {
+ // update size if necessary
+ ContentValues values = new ContentValues();
+ values.put(Files.FileColumns.SIZE, actualSize);
+ try {
+ String[] whereArgs = new String[] { Integer.toString(handle) };
+ mMediaProvider.update(mObjectsUri, values, ID_WHERE, whereArgs);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException in mMediaProvider.update", e);
+ }
+ }
+
mMediaScanner.scanMtpFile(path, mVolumeName, handle, format);
}
} else {
diff --git a/media/java/android/media/videoeditor/AudioTrack.java b/media/java/android/media/videoeditor/AudioTrack.java
index d02709e..32ff553 100755
--- a/media/java/android/media/videoeditor/AudioTrack.java
+++ b/media/java/android/media/videoeditor/AudioTrack.java
@@ -102,7 +102,7 @@ public class AudioTrack {
// Ducking is enabled by default
mDuckingThreshold = 0;
mDuckedTrackVolume = 0;
- mIsDuckingEnabled = true;
+ mIsDuckingEnabled = false;
// The audio waveform file is generated later
mAudioWaveformFilename = null;
@@ -369,14 +369,15 @@ public class AudioTrack {
/**
* Enable ducking by specifying the required parameters
*
- * @param threshold Ducking will be activated when the relative energy in
+ * @param threshold Ducking will be activated when the energy in
* the media items audio signal goes above this value. The valid
- * range of values is 0 to 100.
+ * range of values is 0db to 90dB. 0dB is equivalent to disabling
+ * ducking.
* @param duckedTrackVolume The relative volume of the audio track when ducking
* is active. The valid range of values is 0 to 100.
*/
public void enableDucking(int threshold, int duckedTrackVolume) {
- if (threshold < 0 || threshold > 100) {
+ if (threshold < 0 || threshold > 90) {
throw new IllegalArgumentException("Invalid threshold value: " + threshold);
}
diff --git a/media/java/android/media/videoeditor/Effect.java b/media/java/android/media/videoeditor/Effect.java
index ef0aeb1..8fd0d27 100755
--- a/media/java/android/media/videoeditor/Effect.java
+++ b/media/java/android/media/videoeditor/Effect.java
@@ -76,7 +76,7 @@ public abstract class Effect {
/**
* Set the duration of the effect. If a preview or export is in progress,
- * then this change is effective for next preview or export session. s
+ * then this change is effective for next preview or export session.
*
* @param durationMs of the effect in milliseconds
*/
@@ -85,9 +85,10 @@ public abstract class Effect {
throw new IllegalArgumentException("Duration is too large");
}
+ final long oldDurationMs = mDurationMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -111,9 +112,10 @@ public abstract class Effect {
throw new IllegalArgumentException("Start time is too large");
}
+ final long oldStartTimeMs = mStartTimeMs;
mStartTimeMs = startTimeMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -134,10 +136,13 @@ public abstract class Effect {
throw new IllegalArgumentException("Invalid start time or duration");
}
+ final long oldStartTimeMs = mStartTimeMs;
+ final long oldDurationMs = mDurationMs;
+
mStartTimeMs = startTimeMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java
index a4b0770..fa8d61b 100755
--- a/media/java/android/media/videoeditor/MediaImageItem.java
+++ b/media/java/android/media/videoeditor/MediaImageItem.java
@@ -242,15 +242,49 @@ public class MediaImageItem extends MediaItem {
*/
@Override
void invalidateTransitions(long startTimeMs, long durationMs) {
- // Check if the effect overlaps with the beginning and end transitions
+ // Check if the item overlaps with the beginning and end transitions
if (mBeginTransition != null) {
- if (startTimeMs < mBeginTransition.getDuration()) {
+ if (isOverlapping(startTimeMs, durationMs, 0, mBeginTransition.getDuration())) {
mBeginTransition.invalidate();
}
}
if (mEndTransition != null) {
- if (startTimeMs + durationMs > mDurationMs - mEndTransition.getDuration()) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ if (isOverlapping(startTimeMs, durationMs,
+ getDuration() - transitionDurationMs, transitionDurationMs)) {
+ mEndTransition.invalidate();
+ }
+ }
+ }
+
+ /*
+ * {@inheritDoc}
+ */
+ @Override
+ void invalidateTransitions(long oldStartTimeMs, long oldDurationMs, long newStartTimeMs,
+ long newDurationMs) {
+ // Check if the item overlaps with the beginning and end transitions
+ if (mBeginTransition != null) {
+ final long transitionDurationMs = mBeginTransition.getDuration();
+ // If the start time has changed and if the old or the new item
+ // overlaps with the begin transition, invalidate the transition.
+ if (oldStartTimeMs != newStartTimeMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs, 0, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs, 0, transitionDurationMs))) {
+ mBeginTransition.invalidate();
+ }
+ }
+
+ if (mEndTransition != null) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ // If the start time + duration has changed and if the old or the new
+ // item overlaps the end transition, invalidate the transition/
+ if (oldStartTimeMs + oldDurationMs != newStartTimeMs + newDurationMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mDurationMs - transitionDurationMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mDurationMs - transitionDurationMs, transitionDurationMs))) {
mEndTransition.invalidate();
}
}
diff --git a/media/java/android/media/videoeditor/MediaItem.java b/media/java/android/media/videoeditor/MediaItem.java
index 12f6084..20fd6c9 100755
--- a/media/java/android/media/videoeditor/MediaItem.java
+++ b/media/java/android/media/videoeditor/MediaItem.java
@@ -455,6 +455,40 @@ public abstract class MediaItem {
abstract void invalidateTransitions(long startTimeMs, long durationMs);
/**
+ * Invalidate the start and end transitions if necessary. This method is
+ * typically called when the start time and/or duration of an overlay or
+ * effect is changing.
+ *
+ * @param oldStartTimeMs The old start time of the effect or overlay
+ * @param oldDurationMs The old duration of the effect or overlay
+ * @param newStartTimeMs The new start time of the effect or overlay
+ * @param newDurationMs The new duration of the effect or overlay
+ */
+ abstract void invalidateTransitions(long oldStartTimeMs, long oldDurationMs,
+ long newStartTimeMs, long newDurationMs);
+
+ /**
+ * Check if two items overlap in time
+ *
+ * @param startTimeMs1 Item 1 start time
+ * @param durationMs1 Item 1 duration
+ * @param startTimeMs2 Item 2 start time
+ * @param durationMs2 Item 2 end time
+ *
+ * @return true if the two items overlap
+ */
+ protected boolean isOverlapping(long startTimeMs1, long durationMs1,
+ long startTimeMs2, long durationMs2) {
+ if (startTimeMs1 + durationMs1 <= startTimeMs2) {
+ return false;
+ } else if (startTimeMs1 >= startTimeMs2 + durationMs2) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Adjust the duration transitions.
*/
protected void adjustTransitions() {
diff --git a/media/java/android/media/videoeditor/MediaVideoItem.java b/media/java/android/media/videoeditor/MediaVideoItem.java
index 745b00a..cb835b5 100755
--- a/media/java/android/media/videoeditor/MediaVideoItem.java
+++ b/media/java/android/media/videoeditor/MediaVideoItem.java
@@ -218,15 +218,52 @@ public class MediaVideoItem extends MediaItem {
*/
@Override
void invalidateTransitions(long startTimeMs, long durationMs) {
- // Check if the effect overlaps with the beginning and end transitions
+ // Check if the item overlaps with the beginning and end transitions
if (mBeginTransition != null) {
- if (startTimeMs < mBeginTransition.getDuration()) {
+ if (isOverlapping(startTimeMs, durationMs,
+ mBeginBoundaryTimeMs, mBeginTransition.getDuration())) {
mBeginTransition.invalidate();
}
}
if (mEndTransition != null) {
- if (startTimeMs + durationMs > mEndBoundaryTimeMs - mEndTransition.getDuration()) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ if (isOverlapping(startTimeMs, durationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs)) {
+ mEndTransition.invalidate();
+ }
+ }
+ }
+
+ /*
+ * {@inheritDoc}
+ */
+ @Override
+ void invalidateTransitions(long oldStartTimeMs, long oldDurationMs, long newStartTimeMs,
+ long newDurationMs) {
+ // Check if the item overlaps with the beginning and end transitions
+ if (mBeginTransition != null) {
+ final long transitionDurationMs = mBeginTransition.getDuration();
+ // If the start time has changed and if the old or the new item
+ // overlaps with the begin transition, invalidate the transition.
+ if (oldStartTimeMs != newStartTimeMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mBeginBoundaryTimeMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mBeginBoundaryTimeMs, transitionDurationMs))) {
+ mBeginTransition.invalidate();
+ }
+ }
+
+ if (mEndTransition != null) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ // If the start time + duration has changed and if the old or the new
+ // item overlaps the end transition, invalidate the transition/
+ if (oldStartTimeMs + oldDurationMs != newStartTimeMs + newDurationMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs))) {
mEndTransition.invalidate();
}
}
diff --git a/media/java/android/media/videoeditor/Overlay.java b/media/java/android/media/videoeditor/Overlay.java
index e43f229..0174ba8 100755
--- a/media/java/android/media/videoeditor/Overlay.java
+++ b/media/java/android/media/videoeditor/Overlay.java
@@ -96,9 +96,10 @@ public abstract class Overlay {
throw new IllegalArgumentException("Duration is too large");
}
+ final long oldDurationMs = mDurationMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -120,9 +121,10 @@ public abstract class Overlay {
throw new IllegalArgumentException("Start time is too large");
}
+ final long oldStartTimeMs = mStartTimeMs;
mStartTimeMs = startTimeMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -136,10 +138,13 @@ public abstract class Overlay {
throw new IllegalArgumentException("Invalid start time or duration");
}
+ final long oldStartTimeMs = mStartTimeMs;
+ final long oldDurationMs = mDurationMs;
+
mStartTimeMs = startTimeMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
diff --git a/media/java/android/media/videoeditor/WaveformData.java b/media/java/android/media/videoeditor/WaveformData.java
index b53bd7d..5791046 100644
--- a/media/java/android/media/videoeditor/WaveformData.java
+++ b/media/java/android/media/videoeditor/WaveformData.java
@@ -16,6 +16,8 @@
package android.media.videoeditor;
+import java.io.IOException;
+
/**
* Class which describes the waveform data of an audio track. The gain values
* represent the average gain for an audio frame. For audio codecs which do
@@ -33,7 +35,7 @@ public class WaveformData {
* This constructor shall not be used
*/
@SuppressWarnings("unused")
- private WaveformData() {
+ private WaveformData() throws IOException {
mFrameDurationMs = 0;
mFramesCount = 0;
mGains = null;
diff --git a/media/jni/android_media_MtpDatabase.cpp b/media/jni/android_media_MtpDatabase.cpp
index 5377af6..4525d1f 100644
--- a/media/jni/android_media_MtpDatabase.cpp
+++ b/media/jni/android_media_MtpDatabase.cpp
@@ -99,6 +99,7 @@ public:
virtual void endSendObject(const char* path,
MtpObjectHandle handle,
MtpObjectFormat format,
+ int64_t actualSize,
bool succeeded);
virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID,
@@ -235,11 +236,11 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path,
}
void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle,
- MtpObjectFormat format, bool succeeded) {
+ MtpObjectFormat format, int64_t actualSize, bool succeeded) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
jstring pathStr = env->NewStringUTF(path);
env->CallVoidMethod(mDatabase, method_endSendObject, pathStr,
- (jint)handle, (jint)format, (jboolean)succeeded);
+ (jint)handle, (jint)format, (jlong)actualSize, (jboolean)succeeded);
if (pathStr)
env->DeleteLocalRef(pathStr);
@@ -1076,7 +1077,7 @@ int register_android_media_MtpDatabase(JNIEnv *env)
LOGE("Can't find beginSendObject");
return -1;
}
- method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V");
+ method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIJZ)V");
if (method_endSendObject == NULL) {
LOGE("Can't find endSendObject");
return -1;
diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp
index 1a46715..c287c0a 100644
--- a/media/libmedia/IMediaPlayer.cpp
+++ b/media/libmedia/IMediaPlayer.cpp
@@ -29,7 +29,6 @@ namespace android {
enum {
DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
SET_VIDEO_SURFACE,
- SET_VIDEO_ISURFACE,
PREPARE_ASYNC,
START,
STOP,
@@ -65,15 +64,6 @@ public:
remote()->transact(DISCONNECT, data, &reply);
}
- status_t setVideoISurface(const sp<ISurface>& surface)
- {
- Parcel data, reply;
- data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
- data.writeStrongBinder(surface->asBinder());
- remote()->transact(SET_VIDEO_ISURFACE, data, &reply);
- return reply.readInt32();
- }
-
status_t setVideoSurface(const sp<Surface>& surface)
{
Parcel data, reply;
@@ -245,12 +235,6 @@ status_t BnMediaPlayer::onTransact(
disconnect();
return NO_ERROR;
} break;
- case SET_VIDEO_ISURFACE: {
- CHECK_INTERFACE(IMediaPlayer, data, reply);
- sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
- reply->writeInt32(setVideoISurface(surface));
- return NO_ERROR;
- } break;
case SET_VIDEO_SURFACE: {
CHECK_INTERFACE(IMediaPlayer, data, reply);
sp<Surface> surface = Surface::readFromParcel(data);
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index f975217..9ce6738 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -31,48 +31,9 @@ enum {
FILL_BUFFER,
EMPTY_BUFFER,
GET_EXTENSION_INDEX,
- CREATE_RENDERER,
OBSERVER_ON_MSG,
- RENDERER_RENDER,
};
-sp<IOMXRenderer> IOMX::createRenderer(
- const sp<Surface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) {
- return createRenderer(
- surface->getISurface(),
- componentName, colorFormat, encodedWidth, encodedHeight,
- displayWidth, displayHeight);
-}
-
-sp<IOMXRenderer> IOMX::createRendererFromJavaSurface(
- JNIEnv *env, jobject javaSurface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) {
- jclass surfaceClass = env->FindClass("android/view/Surface");
- if (surfaceClass == NULL) {
- LOGE("Can't find android/view/Surface");
- return NULL;
- }
-
- jfieldID surfaceID = env->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I");
- if (surfaceID == NULL) {
- LOGE("Can't find Surface.mSurface");
- return NULL;
- }
-
- sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID);
-
- return createRenderer(
- surface, componentName, colorFormat, encodedWidth,
- encodedHeight, displayWidth, displayHeight);
-}
-
class BpOMX : public BpInterface<IOMX> {
public:
BpOMX(const sp<IBinder> &impl)
@@ -395,28 +356,6 @@ public:
return err;
}
-
- virtual sp<IOMXRenderer> createRenderer(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) {
- Parcel data, reply;
- data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
-
- data.writeStrongBinder(surface->asBinder());
- data.writeCString(componentName);
- data.writeInt32(colorFormat);
- data.writeInt32(encodedWidth);
- data.writeInt32(encodedHeight);
- data.writeInt32(displayWidth);
- data.writeInt32(displayHeight);
-
- remote()->transact(CREATE_RENDERER, data, &reply);
-
- return interface_cast<IOMXRenderer>(reply.readStrongBinder());
- }
};
IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
@@ -767,33 +706,6 @@ status_t BnOMX::onTransact(
return OK;
}
- case CREATE_RENDERER:
- {
- CHECK_INTERFACE(IOMX, data, reply);
-
- sp<ISurface> isurface =
- interface_cast<ISurface>(data.readStrongBinder());
-
- const char *componentName = data.readCString();
-
- OMX_COLOR_FORMATTYPE colorFormat =
- static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32());
-
- size_t encodedWidth = (size_t)data.readInt32();
- size_t encodedHeight = (size_t)data.readInt32();
- size_t displayWidth = (size_t)data.readInt32();
- size_t displayHeight = (size_t)data.readInt32();
-
- sp<IOMXRenderer> renderer =
- createRenderer(isurface, componentName, colorFormat,
- encodedWidth, encodedHeight,
- displayWidth, displayHeight);
-
- reply->writeStrongBinder(renderer->asBinder());
-
- return OK;
- }
-
default:
return BBinder::onTransact(code, data, reply, flags);
}
@@ -839,44 +751,4 @@ status_t BnOMXObserver::onTransact(
}
}
-////////////////////////////////////////////////////////////////////////////////
-
-class BpOMXRenderer : public BpInterface<IOMXRenderer> {
-public:
- BpOMXRenderer(const sp<IBinder> &impl)
- : BpInterface<IOMXRenderer>(impl) {
- }
-
- virtual void render(IOMX::buffer_id buffer) {
- Parcel data, reply;
- data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor());
- data.writeIntPtr((intptr_t)buffer);
-
- // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous
- // so that the caller knows when to recycle the buffer.
- remote()->transact(RENDERER_RENDER, data, &reply);
- }
-};
-
-IMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer");
-
-status_t BnOMXRenderer::onTransact(
- uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
- switch (code) {
- case RENDERER_RENDER:
- {
- CHECK_INTERFACE(IOMXRenderer, data, reply);
-
- IOMX::buffer_id buffer = (void*)data.readIntPtr();
-
- render(buffer);
-
- return NO_ERROR;
- }
-
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
-}
-
} // namespace android
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 34e41a1..54b292c 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -198,13 +198,6 @@ status_t MediaPlayer::setVideoSurface(const sp<Surface>& surface)
Mutex::Autolock _l(mLock);
if (mPlayer == 0) return NO_INIT;
- status_t err = mPlayer->setVideoISurface(
- surface == NULL ? NULL : surface->getISurface());
-
- if (err != OK) {
- return err;
- }
-
return mPlayer->setVideoSurface(surface);
}
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index e84c2dc..00e510b 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -864,14 +864,6 @@ status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64
return mStatus;
}
-status_t MediaPlayerService::Client::setVideoISurface(const sp<ISurface>& surface)
-{
- LOGV("[%d] setVideoISurface(%p)", mConnId, surface.get());
- sp<MediaPlayerBase> p = getPlayer();
- if (p == 0) return UNKNOWN_ERROR;
- return p->setVideoISurface(surface);
-}
-
status_t MediaPlayerService::Client::setVideoSurface(const sp<Surface>& surface)
{
LOGV("[%d] setVideoSurface(%p)", mConnId, surface.get());
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index e197cde..184324c 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -206,7 +206,6 @@ private:
// IMediaPlayer interface
virtual void disconnect();
- virtual status_t setVideoISurface(const sp<ISurface>& surface);
virtual status_t setVideoSurface(const sp<Surface>& surface);
virtual status_t prepareAsync();
virtual status_t start();
diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h
index 06e4b70..aa8f3f0 100644
--- a/media/libmediaplayerservice/MidiFile.h
+++ b/media/libmediaplayerservice/MidiFile.h
@@ -35,7 +35,6 @@ public:
const char* path, const KeyedVector<String8, String8> *headers);
virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
- virtual status_t setVideoISurface(const sp<ISurface>& surface) { return UNKNOWN_ERROR; }
virtual status_t setVideoSurface(const sp<Surface>& surface) { return UNKNOWN_ERROR; }
virtual status_t prepare();
virtual status_t prepareAsync();
diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp
index e0957f6..58ef99b 100644
--- a/media/libmediaplayerservice/StagefrightPlayer.cpp
+++ b/media/libmediaplayerservice/StagefrightPlayer.cpp
@@ -44,13 +44,6 @@ status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length
return mPlayer->setDataSource(dup(fd), offset, length);
}
-status_t StagefrightPlayer::setVideoISurface(const sp<ISurface> &surface) {
- LOGV("setVideoISurface");
-
- mPlayer->setISurface(surface);
- return OK;
-}
-
status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) {
LOGV("setVideoSurface");
diff --git a/media/libmediaplayerservice/StagefrightPlayer.h b/media/libmediaplayerservice/StagefrightPlayer.h
index 3899447..c4a2588 100644
--- a/media/libmediaplayerservice/StagefrightPlayer.h
+++ b/media/libmediaplayerservice/StagefrightPlayer.h
@@ -35,7 +35,6 @@ public:
const char *url, const KeyedVector<String8, String8> *headers);
virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
- virtual status_t setVideoISurface(const sp<ISurface> &surface);
virtual status_t setVideoSurface(const sp<Surface> &surface);
virtual status_t prepare();
virtual status_t prepareAsync();
diff --git a/media/libmediaplayerservice/TestPlayerStub.h b/media/libmediaplayerservice/TestPlayerStub.h
index 5eaf592..6abd8e3 100644
--- a/media/libmediaplayerservice/TestPlayerStub.h
+++ b/media/libmediaplayerservice/TestPlayerStub.h
@@ -75,9 +75,6 @@ class TestPlayerStub : public MediaPlayerInterface {
// All the methods below wrap the mPlayer instance.
- virtual status_t setVideoISurface(const android::sp<android::ISurface>& s) {
- return mPlayer->setVideoISurface(s);
- }
virtual status_t setVideoSurface(const android::sp<android::Surface>& s) {
return mPlayer->setVideoSurface(s);
}
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 41f5f30..538e7bf 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -79,39 +79,18 @@ private:
AwesomeEvent &operator=(const AwesomeEvent &);
};
-struct AwesomeRemoteRenderer : public AwesomeRenderer {
- AwesomeRemoteRenderer(const sp<IOMXRenderer> &target)
- : mTarget(target) {
- }
-
- virtual void render(MediaBuffer *buffer) {
- void *id;
- if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
- mTarget->render((IOMX::buffer_id)id);
- }
- }
-
-private:
- sp<IOMXRenderer> mTarget;
-
- AwesomeRemoteRenderer(const AwesomeRemoteRenderer &);
- AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &);
-};
-
struct AwesomeLocalRenderer : public AwesomeRenderer {
AwesomeLocalRenderer(
- bool previewOnly,
- const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
- const sp<ISurface> &isurface,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight)
- : mTarget(NULL),
- mLibHandle(NULL) {
- init(previewOnly, componentName,
- colorFormat, isurface, surface, displayWidth,
- displayHeight, decodedWidth, decodedHeight);
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees)
+ : mTarget(NULL) {
+ init(colorFormat, surface,
+ displayWidth, displayHeight,
+ decodedWidth, decodedHeight,
+ rotationDegrees);
}
virtual void render(MediaBuffer *buffer) {
@@ -127,78 +106,39 @@ protected:
virtual ~AwesomeLocalRenderer() {
delete mTarget;
mTarget = NULL;
-
- if (mLibHandle) {
- dlclose(mLibHandle);
- mLibHandle = NULL;
- }
}
private:
- VideoRenderer *mTarget;
- void *mLibHandle;
+ SoftwareRenderer *mTarget;
void init(
- bool previewOnly,
- const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
- const sp<ISurface> &isurface,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight);
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees);
AwesomeLocalRenderer(const AwesomeLocalRenderer &);
AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
};
void AwesomeLocalRenderer::init(
- bool previewOnly,
- const char *componentName,
OMX_COLOR_FORMATTYPE colorFormat,
- const sp<ISurface> &isurface,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight) {
- if (!previewOnly) {
- // We will stick to the vanilla software-color-converting renderer
- // for "previewOnly" mode, to avoid unneccessarily switching overlays
- // more often than necessary.
-
- mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
-
- if (mLibHandle) {
- typedef VideoRenderer *(*CreateRendererFunc)(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight);
-
- CreateRendererFunc func =
- (CreateRendererFunc)dlsym(
- mLibHandle,
- "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20"
- "OMX_COLOR_FORMATTYPEjjjj");
-
- if (func) {
- mTarget =
- (*func)(isurface, componentName, colorFormat,
- displayWidth, displayHeight,
- decodedWidth, decodedHeight);
- }
- }
- }
-
- if (mTarget == NULL) {
- mTarget = new SoftwareRenderer(
- colorFormat, surface, displayWidth, displayHeight,
- decodedWidth, decodedHeight);
- }
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees) {
+ mTarget = new SoftwareRenderer(
+ colorFormat, surface, displayWidth, displayHeight,
+ decodedWidth, decodedHeight, rotationDegrees);
}
struct AwesomeNativeWindowRenderer : public AwesomeRenderer {
- AwesomeNativeWindowRenderer(const sp<ANativeWindow> &nativeWindow)
+ AwesomeNativeWindowRenderer(
+ const sp<ANativeWindow> &nativeWindow,
+ int32_t rotationDegrees)
: mNativeWindow(nativeWindow) {
+ applyRotation(rotationDegrees);
}
virtual void render(MediaBuffer *buffer) {
@@ -220,6 +160,22 @@ protected:
private:
sp<ANativeWindow> mNativeWindow;
+ void applyRotation(int32_t rotationDegrees) {
+ uint32_t transform;
+ switch (rotationDegrees) {
+ case 0: transform = 0; break;
+ case 90: transform = HAL_TRANSFORM_ROT_90; break;
+ case 180: transform = HAL_TRANSFORM_ROT_180; break;
+ case 270: transform = HAL_TRANSFORM_ROT_270; break;
+ default: transform = 0; break;
+ }
+
+ if (transform) {
+ CHECK_EQ(0, native_window_set_buffers_transform(
+ mNativeWindow.get(), transform));
+ }
+ }
+
AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
AwesomeNativeWindowRenderer &operator=(
const AwesomeNativeWindowRenderer &);
@@ -863,58 +819,65 @@ void AwesomePlayer::notifyVideoSize_l() {
CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
- notifyListener_l(MEDIA_SET_VIDEO_SIZE, decodedWidth, decodedHeight);
+ int32_t rotationDegrees;
+ if (!mVideoTrack->getFormat()->findInt32(
+ kKeyRotation, &rotationDegrees)) {
+ rotationDegrees = 0;
+ }
+
+ if (rotationDegrees == 90 || rotationDegrees == 270) {
+ notifyListener_l(
+ MEDIA_SET_VIDEO_SIZE, decodedHeight, decodedWidth);
+ } else {
+ notifyListener_l(
+ MEDIA_SET_VIDEO_SIZE, decodedWidth, decodedHeight);
+ }
}
void AwesomePlayer::initRenderer_l() {
- if (mSurface != NULL || mISurface != NULL) {
- sp<MetaData> meta = mVideoSource->getFormat();
+ if (mSurface == NULL) {
+ return;
+ }
- int32_t format;
- const char *component;
- int32_t decodedWidth, decodedHeight;
- CHECK(meta->findInt32(kKeyColorFormat, &format));
- CHECK(meta->findCString(kKeyDecoderComponent, &component));
- CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
- CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
+ sp<MetaData> meta = mVideoSource->getFormat();
- mVideoRenderer.clear();
+ int32_t format;
+ const char *component;
+ int32_t decodedWidth, decodedHeight;
+ CHECK(meta->findInt32(kKeyColorFormat, &format));
+ CHECK(meta->findCString(kKeyDecoderComponent, &component));
+ CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
+ CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
- // Must ensure that mVideoRenderer's destructor is actually executed
- // before creating a new one.
- IPCThreadState::self()->flushCommands();
+ int32_t rotationDegrees;
+ if (!mVideoTrack->getFormat()->findInt32(
+ kKeyRotation, &rotationDegrees)) {
+ rotationDegrees = 0;
+ }
- if (mSurface != NULL) {
- if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) {
- // Hardware decoders avoid the CPU color conversion by decoding
- // directly to ANativeBuffers, so we must use a renderer that
- // just pushes those buffers to the ANativeWindow.
- mVideoRenderer = new AwesomeNativeWindowRenderer(mSurface);
- } else {
- // Other decoders are instantiated locally and as a consequence
- // allocate their buffers in local address space. This renderer
- // then performs a color conversion and copy to get the data
- // into the ANativeBuffer.
- mVideoRenderer = new AwesomeLocalRenderer(
- false, // previewOnly
- component,
- (OMX_COLOR_FORMATTYPE)format,
- mISurface,
- mSurface,
- mVideoWidth, mVideoHeight,
- decodedWidth, decodedHeight);
- }
- } else {
- // Our OMX codecs allocate buffers on the media_server side
- // therefore they require a remote IOMXRenderer that knows how
- // to display them.
- mVideoRenderer = new AwesomeRemoteRenderer(
- mClient.interface()->createRenderer(
- mISurface, component,
- (OMX_COLOR_FORMATTYPE)format,
- decodedWidth, decodedHeight,
- mVideoWidth, mVideoHeight));
- }
+ mVideoRenderer.clear();
+
+ // Must ensure that mVideoRenderer's destructor is actually executed
+ // before creating a new one.
+ IPCThreadState::self()->flushCommands();
+
+ if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) {
+ // Hardware decoders avoid the CPU color conversion by decoding
+ // directly to ANativeBuffers, so we must use a renderer that
+ // just pushes those buffers to the ANativeWindow.
+ mVideoRenderer =
+ new AwesomeNativeWindowRenderer(mSurface, rotationDegrees);
+ } else {
+ // Other decoders are instantiated locally and as a consequence
+ // allocate their buffers in local address space. This renderer
+ // then performs a color conversion and copy to get the data
+ // into the ANativeBuffer.
+ mVideoRenderer = new AwesomeLocalRenderer(
+ (OMX_COLOR_FORMATTYPE)format,
+ mSurface,
+ mVideoWidth, mVideoHeight,
+ decodedWidth, decodedHeight,
+ rotationDegrees);
}
}
@@ -958,12 +921,6 @@ bool AwesomePlayer::isPlaying() const {
return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
}
-void AwesomePlayer::setISurface(const sp<ISurface> &isurface) {
- Mutex::Autolock autoLock(mLock);
-
- mISurface = isurface;
-}
-
void AwesomePlayer::setSurface(const sp<Surface> &surface) {
Mutex::Autolock autoLock(mLock);
@@ -1897,18 +1854,16 @@ status_t AwesomePlayer::resume() {
mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS);
- if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) {
+ if (state->mLastVideoFrame && mSurface != NULL) {
mVideoRenderer =
new AwesomeLocalRenderer(
- true, // previewOnly
- "",
(OMX_COLOR_FORMATTYPE)state->mColorFormat,
- mISurface,
mSurface,
state->mVideoWidth,
state->mVideoHeight,
state->mDecodedWidth,
- state->mDecodedHeight);
+ state->mDecodedHeight,
+ 0);
mVideoRendererIsPreview = true;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 2e94a12..bb929fd 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -27,11 +27,11 @@
#include <stdlib.h>
#include <string.h>
+#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/DataSource.h>
#include "include/ESDS.h"
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaBufferGroup.h>
-#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h>
@@ -766,55 +766,11 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) {
case FOURCC('t', 'k', 'h', 'd'):
{
- if (chunk_data_size < 4) {
- return ERROR_MALFORMED;
- }
-
- uint8_t version;
- if (mDataSource->readAt(data_offset, &version, 1) < 1) {
- return ERROR_IO;
- }
-
- uint64_t ctime, mtime, duration;
- int32_t id;
- uint32_t width, height;
-
- if (version == 1) {
- if (chunk_data_size != 36 + 60) {
- return ERROR_MALFORMED;
- }
-
- uint8_t buffer[36 + 60];
- if (mDataSource->readAt(
- data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) {
- return ERROR_IO;
- }
-
- ctime = U64_AT(&buffer[4]);
- mtime = U64_AT(&buffer[12]);
- id = U32_AT(&buffer[20]);
- duration = U64_AT(&buffer[28]);
- width = U32_AT(&buffer[88]);
- height = U32_AT(&buffer[92]);
- } else if (version == 0) {
- if (chunk_data_size != 24 + 60) {
- return ERROR_MALFORMED;
- }
-
- uint8_t buffer[24 + 60];
- if (mDataSource->readAt(
- data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) {
- return ERROR_IO;
- }
- ctime = U32_AT(&buffer[4]);
- mtime = U32_AT(&buffer[8]);
- id = U32_AT(&buffer[12]);
- duration = U32_AT(&buffer[20]);
- width = U32_AT(&buffer[76]);
- height = U32_AT(&buffer[80]);
+ status_t err;
+ if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) {
+ return err;
}
- mLastTrack->meta->setInt32(kKeyTrackID, id);
*offset += chunk_size;
break;
}
@@ -1275,6 +1231,93 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) {
return OK;
}
+status_t MPEG4Extractor::parseTrackHeader(
+ off_t data_offset, off_t data_size) {
+ if (data_size < 4) {
+ return ERROR_MALFORMED;
+ }
+
+ uint8_t version;
+ if (mDataSource->readAt(data_offset, &version, 1) < 1) {
+ return ERROR_IO;
+ }
+
+ size_t dynSize = (version == 1) ? 36 : 24;
+
+ uint8_t buffer[36 + 60];
+
+ if (data_size != (off_t)dynSize + 60) {
+ return ERROR_MALFORMED;
+ }
+
+ if (mDataSource->readAt(
+ data_offset, buffer, data_size) < (ssize_t)data_size) {
+ return ERROR_IO;
+ }
+
+ uint64_t ctime, mtime, duration;
+ int32_t id;
+
+ if (version == 1) {
+ ctime = U64_AT(&buffer[4]);
+ mtime = U64_AT(&buffer[12]);
+ id = U32_AT(&buffer[20]);
+ duration = U64_AT(&buffer[28]);
+ } else {
+ CHECK_EQ((unsigned)version, 0u);
+
+ ctime = U32_AT(&buffer[4]);
+ mtime = U32_AT(&buffer[8]);
+ id = U32_AT(&buffer[12]);
+ duration = U32_AT(&buffer[20]);
+ }
+
+ mLastTrack->meta->setInt32(kKeyTrackID, id);
+
+ size_t matrixOffset = dynSize + 16;
+ int32_t a00 = U32_AT(&buffer[matrixOffset]);
+ int32_t a01 = U32_AT(&buffer[matrixOffset + 4]);
+ int32_t dx = U32_AT(&buffer[matrixOffset + 8]);
+ int32_t a10 = U32_AT(&buffer[matrixOffset + 12]);
+ int32_t a11 = U32_AT(&buffer[matrixOffset + 16]);
+ int32_t dy = U32_AT(&buffer[matrixOffset + 20]);
+
+#if 0
+ LOGI("x' = %.2f * x + %.2f * y + %.2f",
+ a00 / 65536.0f, a01 / 65536.0f, dx / 65536.0f);
+ LOGI("y' = %.2f * x + %.2f * y + %.2f",
+ a10 / 65536.0f, a11 / 65536.0f, dy / 65536.0f);
+#endif
+
+ uint32_t rotationDegrees;
+
+ static const int32_t kFixedOne = 0x10000;
+ if (a00 == kFixedOne && a01 == 0 && a10 == 0 && a11 == kFixedOne) {
+ // Identity, no rotation
+ rotationDegrees = 0;
+ } else if (a00 == 0 && a01 == kFixedOne && a10 == -kFixedOne && a11 == 0) {
+ rotationDegrees = 90;
+ } else if (a00 == 0 && a01 == -kFixedOne && a10 == kFixedOne && a11 == 0) {
+ rotationDegrees = 270;
+ } else if (a00 == -kFixedOne && a01 == 0 && a10 == 0 && a11 == -kFixedOne) {
+ rotationDegrees = 180;
+ } else {
+ LOGW("We only support 0,90,180,270 degree rotation matrices");
+ rotationDegrees = 0;
+ }
+
+ if (rotationDegrees != 0) {
+ mLastTrack->meta->setInt32(kKeyRotation, rotationDegrees);
+ }
+
+#if 0
+ uint32_t width = U32_AT(&buffer[dynSize + 52]);
+ uint32_t height = U32_AT(&buffer[dynSize + 56]);
+#endif
+
+ return OK;
+}
+
status_t MPEG4Extractor::parseMetaData(off_t offset, size_t size) {
if (size < 4) {
return ERROR_MALFORMED;
@@ -1588,7 +1631,7 @@ MPEG4Source::MPEG4Source(
const uint8_t *ptr = (const uint8_t *)data;
CHECK(size >= 7);
- CHECK_EQ(ptr[0], 1); // configurationVersion == 1
+ CHECK_EQ((unsigned)ptr[0], 1u); // configurationVersion == 1
// The number of bytes used to encode the length of a NAL unit.
mNALLengthSize = 1 + (ptr[4] & 3);
@@ -1736,7 +1779,7 @@ status_t MPEG4Source::read(
}
uint32_t sampleTime;
- CHECK_EQ(OK, mSampleTable->getMetaDataForSample(
+ CHECK_EQ((status_t)OK, mSampleTable->getMetaDataForSample(
sampleIndex, NULL, NULL, &sampleTime));
if (mode == ReadOptions::SEEK_CLOSEST) {
@@ -1783,7 +1826,7 @@ status_t MPEG4Source::read(
err = mGroup->acquire_buffer(&mBuffer);
if (err != OK) {
- CHECK_EQ(mBuffer, NULL);
+ CHECK(mBuffer == NULL);
return err;
}
}
diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
index 662a84a..3d507ca 100644
--- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp
+++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
@@ -35,7 +35,8 @@ SoftwareRenderer::SoftwareRenderer(
OMX_COLOR_FORMATTYPE colorFormat,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight)
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees)
: mColorFormat(colorFormat),
mConverter(NULL),
mYUVMode(None),
@@ -95,6 +96,20 @@ SoftwareRenderer::SoftwareRenderer(
CHECK_EQ(0, native_window_set_buffers_geometry(
mSurface.get(), mDecodedWidth, mDecodedHeight,
halFormat));
+
+ uint32_t transform;
+ switch (rotationDegrees) {
+ case 0: transform = 0; break;
+ case 90: transform = HAL_TRANSFORM_ROT_90; break;
+ case 180: transform = HAL_TRANSFORM_ROT_180; break;
+ case 270: transform = HAL_TRANSFORM_ROT_270; break;
+ default: transform = 0; break;
+ }
+
+ if (transform) {
+ CHECK_EQ(0, native_window_set_buffers_transform(
+ mSurface.get(), transform));
+ }
}
SoftwareRenderer::~SoftwareRenderer() {
diff --git a/media/libstagefright/httplive/LiveSource.cpp b/media/libstagefright/httplive/LiveSource.cpp
index 39e3e75..f9d27eb 100644
--- a/media/libstagefright/httplive/LiveSource.cpp
+++ b/media/libstagefright/httplive/LiveSource.cpp
@@ -278,7 +278,19 @@ bool LiveSource::switchToNext() {
}
if (mLastFetchTimeUs < 0) {
- mPlaylistIndex = 0;
+ if (isSeekable()) {
+ mPlaylistIndex = 0;
+ } else {
+ // This is live streamed content, the first seqnum in the
+ // various bandwidth' streams may be slightly off, so don't
+ // start at the very first entry.
+ // With a segment duration of 6-10secs, this really only
+ // delays playback up to 30secs compared to real time.
+ mPlaylistIndex = 3;
+ if (mPlaylistIndex >= mPlaylist->size()) {
+ mPlaylistIndex = mPlaylist->size() - 1;
+ }
+ }
} else {
if (nextSequenceNumber < mFirstItemSequenceNumber
|| nextSequenceNumber
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 302a1ba..4e63b7a 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -79,7 +79,6 @@ struct AwesomePlayer {
bool isPlaying() const;
- void setISurface(const sp<ISurface> &isurface);
void setSurface(const sp<Surface> &surface);
void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink);
status_t setLooping(bool shouldLoop);
@@ -130,7 +129,6 @@ private:
bool mQueueStarted;
wp<MediaPlayerBase> mListener;
- sp<ISurface> mISurface;
sp<Surface> mSurface;
sp<MediaPlayerBase::AudioSink> mAudioSink;
diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h
index 4e31059..bc2e4dc 100644
--- a/media/libstagefright/include/MPEG4Extractor.h
+++ b/media/libstagefright/include/MPEG4Extractor.h
@@ -88,6 +88,8 @@ private:
bool mIsDrm;
status_t parseDrmSINF(off_t *offset, off_t data_offset);
+ status_t parseTrackHeader(off_t data_offset, off_t data_size);
+
MPEG4Extractor(const MPEG4Extractor &);
MPEG4Extractor &operator=(const MPEG4Extractor &);
};
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index 5a6c96f9..5fed98a 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -97,13 +97,6 @@ public:
const char *parameter_name,
OMX_INDEXTYPE *index);
- virtual sp<IOMXRenderer> createRenderer(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight);
-
virtual void binderDied(const wp<IBinder> &the_late_who);
OMX_ERRORTYPE OnEvent(
diff --git a/media/libstagefright/include/SoftwareRenderer.h b/media/libstagefright/include/SoftwareRenderer.h
index 8d58056..9cafc68 100644
--- a/media/libstagefright/include/SoftwareRenderer.h
+++ b/media/libstagefright/include/SoftwareRenderer.h
@@ -19,25 +19,24 @@
#define SOFTWARE_RENDERER_H_
#include <media/stagefright/ColorConverter.h>
-#include <media/stagefright/VideoRenderer.h>
#include <utils/RefBase.h>
namespace android {
class Surface;
-class MemoryHeapBase;
-class SoftwareRenderer : public VideoRenderer {
+class SoftwareRenderer {
public:
SoftwareRenderer(
OMX_COLOR_FORMATTYPE colorFormat,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight);
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees);
- virtual ~SoftwareRenderer();
+ ~SoftwareRenderer();
- virtual void render(
+ void render(
const void *data, size_t size, void *platformPrivate);
private:
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index f9f638f..4e9920b 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -24,14 +24,11 @@
#include <sys/resource.h>
#include "../include/OMX.h"
-#include "OMXRenderer.h"
#include "../include/OMXNodeInstance.h"
-#include "../include/SoftwareRenderer.h"
#include <binder/IMemory.h>
#include <media/stagefright/MediaDebug.h>
-#include <media/stagefright/VideoRenderer.h>
#include <utils/threads.h>
#include "OMXMaster.h"
@@ -442,110 +439,4 @@ void OMX::invalidateNodeID_l(node_id node) {
mNodeIDToInstance.removeItem(node);
}
-////////////////////////////////////////////////////////////////////////////////
-
-struct SharedVideoRenderer : public VideoRenderer {
- SharedVideoRenderer(void *libHandle, VideoRenderer *obj)
- : mLibHandle(libHandle),
- mObj(obj) {
- }
-
- virtual ~SharedVideoRenderer() {
- delete mObj;
- mObj = NULL;
-
- dlclose(mLibHandle);
- mLibHandle = NULL;
- }
-
- virtual void render(
- const void *data, size_t size, void *platformPrivate) {
- return mObj->render(data, size, platformPrivate);
- }
-
-private:
- void *mLibHandle;
- VideoRenderer *mObj;
-
- SharedVideoRenderer(const SharedVideoRenderer &);
- SharedVideoRenderer &operator=(const SharedVideoRenderer &);
-};
-
-sp<IOMXRenderer> OMX::createRenderer(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) {
- Mutex::Autolock autoLock(mLock);
-
- VideoRenderer *impl = NULL;
-
- void *libHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
-
- if (libHandle) {
- typedef VideoRenderer *(*CreateRendererFunc)(
- const sp<ISurface> &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t displayWidth, size_t displayHeight,
- size_t decodedWidth, size_t decodedHeight);
-
- CreateRendererFunc func =
- (CreateRendererFunc)dlsym(
- libHandle,
- "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20"
- "OMX_COLOR_FORMATTYPEjjjj");
-
- if (func) {
- impl = (*func)(surface, componentName, colorFormat,
- displayWidth, displayHeight, encodedWidth, encodedHeight);
-
- if (impl) {
- impl = new SharedVideoRenderer(libHandle, impl);
- libHandle = NULL;
- }
- }
-
- if (libHandle) {
- dlclose(libHandle);
- libHandle = NULL;
- }
- }
-
- if (!impl) {
-#if 0
- LOGW("Using software renderer.");
- impl = new SoftwareRenderer(
- colorFormat,
- surface,
- displayWidth, displayHeight,
- encodedWidth, encodedHeight);
-#else
- CHECK(!"Should not be here.");
- return NULL;
-#endif
- }
-
- return new OMXRenderer(impl);
-}
-
-OMXRenderer::OMXRenderer(VideoRenderer *impl)
- : mImpl(impl) {
-}
-
-OMXRenderer::~OMXRenderer() {
- delete mImpl;
- mImpl = NULL;
-}
-
-void OMXRenderer::render(IOMX::buffer_id buffer) {
- OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
-
- mImpl->render(
- header->pBuffer + header->nOffset,
- header->nFilledLen,
- header->pPlatformPrivate);
-}
-
} // namespace android
diff --git a/media/libstagefright/omx/OMXRenderer.h b/media/libstagefright/omx/OMXRenderer.h
deleted file mode 100644
index 4d194ce..0000000
--- a/media/libstagefright/omx/OMXRenderer.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef OMX_RENDERER_H_
-
-#define OMX_RENDERER_H_
-
-#include <media/IOMX.h>
-
-namespace android {
-
-class VideoRenderer;
-
-class OMXRenderer : public BnOMXRenderer {
-public:
- // Assumes ownership of "impl".
- OMXRenderer(VideoRenderer *impl);
- virtual ~OMXRenderer();
-
- virtual void render(IOMX::buffer_id buffer);
-
-private:
- VideoRenderer *mImpl;
-
- OMXRenderer(const OMXRenderer &);
- OMXRenderer &operator=(const OMXRenderer &);
-};
-
-} // namespace android
-
-#endif // OMX_RENDERER_H_
diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h
index fafd221..900b517 100644
--- a/media/mtp/MtpDatabase.h
+++ b/media/mtp/MtpDatabase.h
@@ -42,6 +42,7 @@ public:
virtual void endSendObject(const char* path,
MtpObjectHandle handle,
MtpObjectFormat format,
+ int64_t size,
bool succeeded) = 0;
virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID,
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 6cf70ec..ca13636 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -624,6 +624,7 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
mData.getString(modified); // date modified
// keywords follow
+ LOGD("name: %s format: %04X\n", (const char *)name, format);
time_t modifiedTime;
if (!parseDateTime(modified, modifiedTime))
modifiedTime = 0;
@@ -663,6 +664,7 @@ MtpResponseCode MtpServer::doSendObject() {
MtpResponseCode result = MTP_RESPONSE_OK;
mode_t mask;
int ret;
+ uint64_t actualSize = -1;
if (mSendObjectHandle == kInvalidObjectHandle) {
LOGE("Expected SendObjectInfo before SendObject");
@@ -692,6 +694,7 @@ MtpResponseCode MtpServer::doSendObject() {
mfr.offset = 0;
mfr.length = mSendObjectFileSize;
+ LOGD("receiving %s\n", (const char *)mSendObjectFilePath);
// transfer the file
ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
close(mfr.fd);
@@ -704,11 +707,18 @@ MtpResponseCode MtpServer::doSendObject() {
result = MTP_RESPONSE_TRANSACTION_CANCELLED;
else
result = MTP_RESPONSE_GENERAL_ERROR;
+ } else if (mSendObjectFileSize == 0xFFFFFFFF) {
+ // actual size is likely > 4 gig so stat the file to compute actual length
+ struct stat s;
+ if (lstat(mSendObjectFilePath, &s) == 0) {
+ actualSize = s.st_size;
+ LOGD("actualSize: %lld\n", actualSize);
+ }
}
done:
mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat,
- result == MTP_RESPONSE_OK);
+ actualSize, result == MTP_RESPONSE_OK);
mSendObjectHandle = kInvalidObjectHandle;
mSendObjectFormat = 0;
return result;
diff --git a/media/tests/players/invoke_mock_media_player.cpp b/media/tests/players/invoke_mock_media_player.cpp
index 53308be..1e3731e 100644
--- a/media/tests/players/invoke_mock_media_player.cpp
+++ b/media/tests/players/invoke_mock_media_player.cpp
@@ -68,7 +68,6 @@ class Player: public MediaPlayerBase
}
virtual status_t setDataSource(int fd, int64_t offset, int64_t length) {return OK;}
- virtual status_t setVideoISurface(const sp<ISurface>& surface) {return OK;}
virtual status_t setVideoSurface(const sp<Surface>& surface) {return OK;}
virtual status_t prepare() {return OK;}
virtual status_t prepareAsync() {return OK;}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index b98071e..fa63edb 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -16,6 +16,7 @@
package com.android.providers.settings;
+import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
@@ -27,6 +28,7 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.Arrays;
import java.util.zip.CRC32;
@@ -352,10 +354,11 @@ public class SettingsBackupAgent extends BackupAgentHelper {
}
private byte[] getWifiSupplicant(String filename) {
+ BufferedReader br = null;
try {
File file = new File(filename);
if (file.exists()) {
- BufferedReader br = new BufferedReader(new FileReader(file));
+ br = new BufferedReader(new FileReader(file));
StringBuffer relevantLines = new StringBuffer();
boolean started = false;
String line;
@@ -378,6 +381,13 @@ public class SettingsBackupAgent extends BackupAgentHelper {
} catch (IOException ioe) {
Log.w(TAG, "Couldn't backup " + filename);
return EMPTY_DATA;
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ }
+ }
}
}
@@ -390,9 +400,10 @@ public class SettingsBackupAgent extends BackupAgentHelper {
if (supplicantFile.exists()) supplicantFile.delete();
copyWifiSupplicantTemplate();
- FileOutputStream fos = new FileOutputStream(filename, true);
- fos.write("\n".getBytes());
- fos.write(bytes);
+ OutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true));
+ os.write("\n".getBytes());
+ os.write(bytes);
+ os.close();
} catch (IOException ioe) {
Log.w(TAG, "Couldn't restore " + filename);
}
diff --git a/packages/SystemUI/assets/fonts/AndroidClock.ttf b/packages/SystemUI/assets/fonts/AndroidClock.ttf
new file mode 100644
index 0000000..3945183
--- /dev/null
+++ b/packages/SystemUI/assets/fonts/AndroidClock.ttf
Binary files differ
diff --git a/packages/SystemUI/assets/fonts/AndroidClock2.ttf b/packages/SystemUI/assets/fonts/AndroidClock2.ttf
new file mode 100644
index 0000000..fa0221e
--- /dev/null
+++ b/packages/SystemUI/assets/fonts/AndroidClock2.ttf
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png
new file mode 100644
index 0000000..17fd52e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png
new file mode 100644
index 0000000..c888c21
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png
new file mode 100644
index 0000000..6e13ebe
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/panel_notification.png b/packages/SystemUI/res/drawable-nodpi/panel_notification.png
new file mode 100644
index 0000000..eca47d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/panel_notification.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/status_bar_item_background.xml b/packages/SystemUI/res/drawable/status_bar_item_background.xml
new file mode 100644
index 0000000..9da92a7
--- /dev/null
+++ b/packages/SystemUI/res/drawable/status_bar_item_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:opacity="translucent"
+ >
+ <item
+ android:drawable="@drawable/notification_item_background_color"
+ android:left="16dp"
+ />
+</layer-list>
+
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml
index a6e5c89..d4a6136 100644
--- a/packages/SystemUI/res/layout-xlarge/status_bar.xml
+++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml
@@ -25,20 +25,10 @@
android:id="@+id/bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:animateLayoutChanges="true"
+ android:animateLayoutChanges="false"
>
- <FrameLayout
- android:id="@+id/ticker"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentRight="true"
- android:layout_toRightOf="@+id/systemInfo"
- android:paddingLeft="6dip"
- android:gravity="center_vertical"
- android:animateLayoutChanges="true"
- />
-
+ <!-- notification icons & panel access -->
<LinearLayout
android:id="@+id/notificationArea"
android:layout_width="wrap_content"
@@ -67,73 +57,89 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
>
- <com.android.systemui.statusbar.policy.Clock
- style="@*android:style/TextAppearance.StatusBar.Icon"
+ <com.android.systemui.statusbar.tablet.HoloClock
android:id="@+id/clock"
- android:layout_width="64dip"
- android:layout_height="48dip"
- android:singleLine="true"
- android:gravity="center"
- android:textSize="16sp"
- android:textStyle="bold"
- android:padding="2dip"
- />
- <ImageView
- android:id="@+id/battery"
- android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_gravity="center_vertical"
- />
- <ImageView
- android:id="@+id/network"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_gravity="center_vertical"
- android:src="@drawable/ic_sysbar_wifi_mini"
- />
+ android:layout_height="match_parent"
+ >
+ <TextView android:id="@+id/time_bg"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:textSize="72dip"
+ android:textColor="#1f1f1f" />
+ <TextView android:id="@+id/time_fg"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:textSize="72dip"
+ android:textColor="#2e2e2e" />
+ </com.android.systemui.statusbar.tablet.HoloClock>
+
+ <LinearLayout
+ android:layout_width="48dip"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ >
+ <ImageView
+ android:id="@+id/battery"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="center_vertical"
+ />
+ <ImageView
+ android:id="@+id/network"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:src="@drawable/ic_sysbar_wifi_mini"
+ />
+ </LinearLayout>
</LinearLayout>
</LinearLayout>
+ <!-- navigation controls -->
<LinearLayout
android:id="@+id/navigationArea"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:orientation="horizontal"
- android:animateLayoutChanges="true"
+ android:animateLayoutChanges="false"
>
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
- android:layout_width="wrap_content"
+ android:layout_width="96dip"
android:layout_height="match_parent"
- android:paddingLeft="15dip"
- android:paddingRight="15dip"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
android:src="@drawable/ic_sysbar_back"
android:background="@drawable/ic_sysbar_icon_bg"
systemui:keyCode="4"
/>
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
- android:layout_width="wrap_content"
+ android:layout_width="96dip"
android:layout_height="match_parent"
- android:paddingLeft="15dip"
- android:paddingRight="15dip"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
android:src="@drawable/ic_sysbar_home"
android:background="@drawable/ic_sysbar_icon_bg"
systemui:keyCode="3"
/>
<ImageButton android:id="@+id/recent_apps"
- android:layout_width="wrap_content"
+ android:layout_width="96dip"
android:layout_height="match_parent"
android:src="@drawable/ic_sysbar_recent"
android:background="@drawable/ic_sysbar_icon_bg"
- android:paddingLeft="15dip"
- android:paddingRight="15dip"
+ android:paddingLeft="18dip"
+ android:clickable="true"
+ android:paddingRight="18dip"
/>
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
- android:layout_width="wrap_content"
+ android:layout_width="96dip"
android:layout_height="match_parent"
- android:paddingLeft="15dip"
- android:paddingRight="15dip"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
android:src="@drawable/ic_sysbar_menu"
android:background="@drawable/ic_sysbar_icon_bg"
systemui:keyCode="82"
@@ -141,11 +147,11 @@
/>
<com.android.systemui.statusbar.tablet.ShirtPocket
android:id="@+id/pocket"
- android:layout_width="71dip"
+ android:layout_width="96dip"
android:layout_height="match_parent"
android:background="@drawable/ic_sysbar_icon_bg"
- android:paddingLeft="15dip"
- android:paddingRight="15dip"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
android:animateLayoutChanges="true"
android:clickable="true"
android:descendantFocusability="blocksDescendants"
@@ -170,18 +176,76 @@
android:visibility="invisible"
/>
</LinearLayout>
- </RelativeLayout>
- <!-- It's curtains for you. -->
- <ImageView
- android:id="@+id/lights_out"
- android:src="@drawable/ic_sysbar_lightsout"
- android:gravity="center"
- android:background="#FF000000"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible"
- android:clickable="true"
- />
-</com.android.systemui.statusbar.tablet.TabletStatusBarView>
+ <!-- lights out mode: "shadow" views -->
+ <ImageView
+ android:id="@+id/notification_shadow"
+ android:layout_width="176dip"
+ android:layout_height="match_parent"
+ android:paddingRight="48dip"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ android:scaleType="fitXY"
+ />
+ <ImageView
+ android:id="@+id/back_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/home_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/back_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/recent_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/home_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/menu_shadow"
+ android:layout_width="96dip"
+ android:layout_height="match_parent"
+ android:paddingLeft="18dip"
+ android:paddingRight="18dip"
+ android:layout_toRightOf="@id/recent_shadow"
+ android:layout_alignParentBottom="true"
+ android:src="@drawable/ic_sysbar_shadow"
+ android:visibility="gone"
+ />
+
+ <!-- ticker: transient incoming notification information -->
+ <FrameLayout
+ android:id="@+id/ticker"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentRight="true"
+ android:layout_toRightOf="@+id/systemInfo"
+ android:paddingLeft="6dip"
+ android:gravity="center_vertical"
+ android:animateLayoutChanges="true"
+ />
+
+ </RelativeLayout>
+</com.android.systemui.statusbar.tablet.TabletStatusBarView>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml b/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml
index 049a1cc..b6679a5 100644
--- a/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml
@@ -1,36 +1,35 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="65sp"
- android:orientation="vertical"
- android:background="@android:drawable/status_bar_item_background"
+ android:layout_height="65dp"
+ android:background="@drawable/status_bar_item_background"
>
<ImageButton
android:id="@+id/veto"
- android:layout_width="wrap_content"
+ android:layout_width="48dp"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:src="@drawable/status_bar_veto"
android:scaleType="center"
- android:background="@null"
- android:paddingLeft="16dip"
- android:paddingRight="16dip"
+ android:background="#ff000000"
/>
<com.android.systemui.statusbar.LatestItemView android:id="@+id/content"
+ android:layout_width="wrap_content"
+ android:layout_height="64sp"
android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/veto"
- android:layout_width="match_parent"
- android:layout_height="64sp"
+ android:layout_marginLeft="16dp"
android:focusable="true"
android:clickable="true"
- android:paddingRight="6sp"
/>
<View
android:layout_width="match_parent"
- android:layout_height="1sp"
+ android:layout_height="1dp"
+ android:layout_marginLeft="16dp"
android:layout_alignParentBottom="true"
android:background="@android:drawable/divider_horizontal_dark"
/>
diff --git a/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml b/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml
index 884a473..b23cc7b 100644
--- a/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml
+++ b/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml
@@ -21,118 +21,149 @@
<!-- android:background="@drawable/status_bar_closed_default_background" -->
<com.android.systemui.statusbar.tablet.NotificationPanel
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:background="@*android:drawable/dialog_full_holo_dark"
- android:orientation="vertical"
+ android:layout_height="match_parent"
+ android:layout_width="540dp"
android:animateLayoutChanges="true"
+ android:background="@drawable/bg_scrim_notification"
+ android:paddingBottom="32dp"
>
- <com.android.systemui.statusbar.policy.Clock
- android:id="@+id/clock"
+ <com.android.systemui.statusbar.tablet.NotificationTitleArea
+ android:id="@+id/title_area"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_alignParentTop="true"
- android:gravity="right"
- />
+ android:layout_width="384dp"
+ android:layout_above="@+id/content_frame"
+ android:layout_marginLeft="24dp"
+ android:paddingBottom="16dp"
+ android:orientation="vertical"
+ android:animateLayoutChanges="true"
+ android:layout_alignParentRight="true"
+ >
- <com.android.systemui.statusbar.policy.DateView
- android:id="@+id/date"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_below="@id/clock"
- android:gravity="right"
- />
+ <com.android.systemui.statusbar.tablet.HoloClock
+ android:id="@+id/clock"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_alignParentTop="true"
+ android:layout_marginRight="40dip"
+ android:layout_marginBottom="4dip"
+ >
+ <TextView android:id="@+id/time_bg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:singleLine="true"
+ android:textSize="90dip"
+ android:textColor="#999999" />
+ <TextView android:id="@+id/time_fg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:singleLine="true"
+ android:textSize="90dip"
+ android:textColor="#666666" />
+ </com.android.systemui.statusbar.tablet.HoloClock>
- <ImageView
- android:id="@+id/settings_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/date"
- android:layout_alignParentRight="true"
- android:paddingRight="10dp"
- android:src="@drawable/ic_sysbar_quicksettings"
- android:baseline="17dp"
- />
+ <com.android.systemui.statusbar.policy.DateView
+ android:id="@+id/date"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_below="@id/clock"
+ android:layout_marginRight="48dp"
+ android:gravity="right"
+ />
- <ImageView
- android:id="@+id/notification_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignBaseline="@id/settings_button"
- android:layout_alignParentRight="true"
- android:paddingRight="10dp"
- android:visibility="invisible"
- android:src="@drawable/status_bar_veto"
- android:baseline="17dp"
- />
+ <ImageView
+ android:id="@+id/battery"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_below="@id/date"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="48dp"
+ android:src="@drawable/ic_sysbar_battery_mini"
+ android:baseline="17dp"
+ />
- <ImageView
- android:id="@+id/battery"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignBaseline="@id/settings_button"
- android:src="@drawable/ic_sysbar_battery_mini"
- android:baseline="17dp"
- />
+ <TextView
+ android:id="@+id/battery_text"
+ android:layout_width="48dp"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/battery"
+ android:layout_alignBaseline="@id/battery"
+ android:singleLine="true"
+ android:text="@string/system_panel_settings_button"
+ />
- <TextView
- android:id="@+id/battery_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/battery"
- android:layout_alignBaseline="@id/settings_button"
- android:singleLine="true"
- android:text="@string/system_panel_settings_button"
- />
+ <ImageView
+ android:id="@+id/network"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_toRightOf="@id/battery_text"
+ android:layout_alignBaseline="@id/battery"
+ android:src="@drawable/ic_sysbar_wifi_mini"
+ android:baseline="21dp"
+ />
- <ImageView
- android:id="@+id/network"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_toRightOf="@id/battery_text"
- android:layout_alignBaseline="@id/settings_button"
- android:src="@drawable/ic_sysbar_wifi_mini"
- android:baseline="21dp"
- />
+ <TextView
+ android:id="@+id/network_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/network"
+ android:layout_alignBaseline="@id/battery"
+ android:singleLine="true"
+ android:text="@string/system_panel_settings_button"
+ />
- <TextView
- android:id="@+id/network_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/network"
- android:layout_alignBaseline="@id/settings_button"
- android:singleLine="true"
- android:text="@string/system_panel_settings_button"
- />
+ <ImageView
+ android:id="@+id/settings_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignBaseline="@id/battery"
+ android:paddingRight="16dp"
+ android:src="@drawable/ic_notification_open"
+ android:baseline="17dp"
+ />
- <FrameLayout
- android:id="@+id/settings_frame"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_below="@id/settings_button"
- />
+ <ImageView
+ android:id="@+id/notification_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignBaseline="@id/battery"
+ android:paddingRight="16dp"
+ android:visibility="invisible"
+ android:src="@drawable/status_bar_veto"
+ android:baseline="17dp"
+ />
+ </com.android.systemui.statusbar.tablet.NotificationTitleArea>
- <ScrollView
- android:id="@+id/notificationScroller"
+ <FrameLayout
+ android:id="@+id/content_frame"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_below="@id/settings_button"
+ android:layout_width="408dp"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
>
- <LinearLayout
- android:id="@+id/content"
- android:layout_width="match_parent"
+ <ScrollView
+ android:id="@+id/notificationScroller"
android:layout_height="wrap_content"
- android:gravity="center_horizontal|bottom"
- android:animateLayoutChanges="true"
- android:animationCache="false"
- android:orientation="vertical"
- android:background="@drawable/status_bar_background"
- android:clickable="true"
- android:focusable="true"
- android:descendantFocusability="afterDescendants"
+ android:layout_width="match_parent"
>
- </LinearLayout>
- </ScrollView>
+ <LinearLayout
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal|bottom"
+ android:animateLayoutChanges="true"
+ android:animationCache="false"
+ android:orientation="vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:descendantFocusability="afterDescendants"
+ >
+ </LinearLayout>
+ </ScrollView>
+ </FrameLayout>
</com.android.systemui.statusbar.tablet.NotificationPanel>
diff --git a/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml b/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml
index c6ddfed..a800afb 100644
--- a/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml
+++ b/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml
@@ -19,6 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dip"
+ android:background="#ff000000"
>
</com.android.systemui.statusbar.tablet.SettingsPanel>
diff --git a/packages/SystemUI/res/values-cs-xlarge/strings.xml b/packages/SystemUI/res/values-cs-xlarge/strings.xml
index 33a3a08..a0301bb 100644
--- a/packages/SystemUI/res/values-cs-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-cs-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Baterie: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"žádné připojení k internetu"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: připojeno"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: připojování"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mob. data: připojeno"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 828fae8..4e7f5cf 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-da-xlarge/strings.xml b/packages/SystemUI/res/values-da-xlarge/strings.xml
index 3d99be3..d75b5a5 100644
--- a/packages/SystemUI/res/values-da-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-da-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen forbindelse"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi forbundet"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: forbinder..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata tilsluttet"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 74def1c..aad6d71 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-de-xlarge/strings.xml b/packages/SystemUI/res/values-de-xlarge/strings.xml
index 0717429..eb402da 100644
--- a/packages/SystemUI/res/values-de-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-de-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Akku: <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Keine Verbindung"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"WLAN: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"WLAN: verbunden"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"WLAN: verbindet..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobile Daten: aktiv"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index e033982..1674c22 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-el-xlarge/strings.xml b/packages/SystemUI/res/values-el-xlarge/strings.xml
index 9c29e8b..63e59aa 100644
--- a/packages/SystemUI/res/values-el-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-el-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Μπαταρία: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"χωρίς σύνδ. σε Διαδ."</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: συνδέθηκε"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: σύνδεση..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Δεδ. κιν.: συνδέθηκε"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index ddcfc2c..bb7fab1 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml
new file mode 100644
index 0000000..b4f8f27
--- /dev/null
+++ b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
+ <skip />
+ <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"no hay conexión a Internet"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
+ <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string>
+ <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string>
+ <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Datos para cel: conectado"</string>
+ <string name="system_panel_signal_meter_data_connecting" msgid="7183001278053801143">"Datos para cel: conectando"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index aff9f4ca..c18de7d 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
@@ -35,8 +35,7 @@
<!-- no translation found for invalid_charger (4549105996740522523) -->
<skip />
<string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
- <!-- no translation found for system_panel_settings_button (7832600575390861653) -->
- <skip />
+ <string name="system_panel_settings_button" msgid="7832600575390861653">"Configuración"</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string>
<!-- no translation found for recent_tasks_empty (1905484479067697884) -->
<skip />
diff --git a/packages/SystemUI/res/values-es-xlarge/strings.xml b/packages/SystemUI/res/values-es-xlarge/strings.xml
index e7214b6..2045aa8 100644
--- a/packages/SystemUI/res/values-es-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-es-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batería: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"sin conexión"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"WiFi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"WiFi: conectado"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"WiFi: conectando..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Datos móviles: conectados"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 0b6af34..84b7e32 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-fr-xlarge/strings.xml b/packages/SystemUI/res/values-fr-xlarge/strings.xml
index 8566a96..36c6f77 100644
--- a/packages/SystemUI/res/values-fr-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-fr-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batterie : <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Internet indisponible"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi : <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi : connecté"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi : connexion..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Données mobiles connectées"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 0e2a765..914e98e 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-it-xlarge/strings.xml b/packages/SystemUI/res/values-it-xlarge/strings.xml
index 62ce9f2..512dfa4 100644
--- a/packages/SystemUI/res/values-it-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-it-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"no conness. Internet"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: connesso"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: connessione…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dati cell.: connesso"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c45bb4c..849be2e 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-ja-xlarge/strings.xml b/packages/SystemUI/res/values-ja-xlarge/strings.xml
index 72e6025..01dacb3 100644
--- a/packages/SystemUI/res/values-ja-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ja-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"電池: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"インターネット接続なし"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 接続されました"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 接続中..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"データ通信: 接続されました"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index f6a8e5f..f787541 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-ko-xlarge/strings.xml b/packages/SystemUI/res/values-ko-xlarge/strings.xml
index 8aa38e1..a26940a 100644
--- a/packages/SystemUI/res/values-ko-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ko-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"배터리: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"인터넷에 연결되지 않음"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 연결됨"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 연결 중…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"모바일 데이터: 연결됨"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 1189194..ff82d99 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-nb-xlarge/strings.xml b/packages/SystemUI/res/values-nb-xlarge/strings.xml
index 8d59b43..9a95faf 100644
--- a/packages/SystemUI/res/values-nb-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-nb-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen Int.-tilkobl."</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: tilkoblet"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: kobler til"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mob.data: tilkoblet"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index b5f4676..aefd2ec 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-nl-xlarge/strings.xml b/packages/SystemUI/res/values-nl-xlarge/strings.xml
index 750f20f..8ab6234 100644
--- a/packages/SystemUI/res/values-nl-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-nl-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Accu: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"geen internet"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: verbonden"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: verbinden…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobiel: verbonden"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index ec8fcfb..e7fd55b 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-pl-xlarge/strings.xml b/packages/SystemUI/res/values-pl-xlarge/strings.xml
index d816068..a11754b 100644
--- a/packages/SystemUI/res/values-pl-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-pl-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"brak połączenia internetowego"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: połączono"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: łączenie…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Sieć komórkowa: połączono"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 7034a6d..108ef13 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml
index 4aa75b8..9f20932 100644
--- a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Sem ligação à internet"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ligado"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: a ligar…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dados móveis: ligado"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 80028a2..1f38ed7 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-pt-xlarge/strings.xml b/packages/SystemUI/res/values-pt-xlarge/strings.xml
index 811dae8..481263f 100644
--- a/packages/SystemUI/res/values-pt-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-pt-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Sem conex. à intern."</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dados móv: conectado"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 006379c..83bde68 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index 646d7f5..8a5014e 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Stizzar"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-ru-xlarge/strings.xml b/packages/SystemUI/res/values-ru-xlarge/strings.xml
index f602b34..7514d4b 100644
--- a/packages/SystemUI/res/values-ru-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ru-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Батарея: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"связь отсутствует"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: подключено"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: подключение..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Моб. данные: подключено"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index d598ff3..f701fe3 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-sv-xlarge/strings.xml b/packages/SystemUI/res/values-sv-xlarge/strings.xml
index 20d7081..ccc30ec 100644
--- a/packages/SystemUI/res/values-sv-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-sv-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen Internetanslutn."</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ansluten"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: ansluter..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata: ansluten"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 6ecdfa8..4f9cfd0 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-tr-xlarge/strings.xml b/packages/SystemUI/res/values-tr-xlarge/strings.xml
index 7782627..008006d 100644
--- a/packages/SystemUI/res/values-tr-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-tr-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Pil: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"internet bağlantısı yok"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Kablosuz: <xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Kablosuz: bağlı"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Kablosuz: bağlanıyor..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobil veri: bağlı"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 059a4f1..cef5539 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml
index 1c3624b..68b0fac 100644
--- a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"电池:<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"无互联网连接"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi:<xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi:已连接"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:正在连接..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"移动数据:已连接"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 9c1f71f..9ed98c9 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
index 720c043..bc41d11 100644
--- a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
<skip />
- <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"電池:<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"沒有網際網路連線"</string>
- <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi:<xliff:g id="SSID">%s</xliff:g>"</string>
+ <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) -->
+ <skip />
<string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-F:已連線"</string>
<string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:連線中..."</string>
<string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"行動數據:已連線"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 11051be..4dc323b 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_label (4489004083283879149) -->
+ <!-- no translation found for app_label (7164937344850004466) -->
<skip />
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index a0def6b..fd2cf99 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -18,4 +18,5 @@
-->
<resources>
<drawable name="notification_number_text_color">#ffffffff</drawable>
+ <drawable name="notification_item_background_color">#ff000000</drawable>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java
new file mode 100644
index 0000000..3b76434
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.tablet;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.AssetManager;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.format.DateFormat;
+import android.text.style.CharacterStyle;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.StyleSpan;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import com.android.systemui.R;
+
+public class HoloClock extends FrameLayout {
+ private boolean mAttached;
+ private Calendar mCalendar;
+ private String mClockFormatString;
+ private SimpleDateFormat mClockFormat;
+
+ private static Typeface sBackgroundType, sForegroundType;
+ private TextView mBgText, mFgText;
+
+ public HoloClock(Context context) {
+ this(context, null);
+ }
+
+ public HoloClock(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public HoloClock(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ if (sBackgroundType == null) {
+ AssetManager assets = getContext().getAssets();
+
+ sBackgroundType = Typeface.createFromAsset(assets,
+ "fonts/AndroidClock.ttf");
+ sForegroundType = Typeface.createFromAsset(assets,
+ "fonts/AndroidClock2.ttf");
+ }
+ mBgText = (TextView) findViewById(R.id.time_bg);
+ if (mBgText != null) {
+ mBgText.setTypeface(sBackgroundType);
+ }
+ mFgText = (TextView) findViewById(R.id.time_fg);
+ if (mFgText != null) {
+ mFgText.setTypeface(sForegroundType);
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ if (!mAttached) {
+ mAttached = true;
+ IntentFilter filter = new IntentFilter();
+
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+
+ getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
+ }
+
+ // NOTE: It's safe to do these after registering the receiver since the receiver always runs
+ // in the main thread, therefore the receiver can't run before this method returns.
+
+ // The time zone may have changed while the receiver wasn't registered, so update the Time
+ mCalendar = Calendar.getInstance(TimeZone.getDefault());
+
+ // Make sure we update to the current time
+ updateClock();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (mAttached) {
+ getContext().unregisterReceiver(mIntentReceiver);
+ mAttached = false;
+ }
+ }
+
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
+ String tz = intent.getStringExtra("time-zone");
+ mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
+ if (mClockFormat != null) {
+ mClockFormat.setTimeZone(mCalendar.getTimeZone());
+ }
+ }
+ updateClock();
+ }
+ };
+
+ final void updateClock() {
+ mCalendar.setTimeInMillis(System.currentTimeMillis());
+ CharSequence txt = getTimeText();
+ mBgText.setText(txt);
+ mFgText.setText(txt);
+ }
+
+ private final CharSequence getTimeText() {
+ Context context = getContext();
+ int res = DateFormat.is24HourFormat(context)
+ ? com.android.internal.R.string.twenty_four_hour_time_format
+ : com.android.internal.R.string.twelve_hour_time_format;
+
+ SimpleDateFormat sdf;
+ String format = context.getString(res);
+ if (!format.equals(mClockFormatString)) {
+ // we don't want AM/PM showing up in our statusbar, even in 12h mode
+ format = format.replaceAll("a", "").trim();
+ mClockFormat = sdf = new SimpleDateFormat(format);
+ mClockFormatString = format;
+ } else {
+ sdf = mClockFormat;
+ }
+ String result = sdf.format(mCalendar.getTime());
+ return result;
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
index ce81fdc..80cb5b2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
@@ -22,6 +22,7 @@ import android.util.Slog;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -31,10 +32,11 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
View.OnClickListener {
static final String TAG = "NotificationPanel";
+ View mTitleArea;
View mSettingsButton;
View mNotificationButton;
View mNotificationScroller;
- FrameLayout mSettingsFrame;
+ FrameLayout mContentFrame;
View mSettingsPanel;
public NotificationPanel(Context context, AttributeSet attrs) {
@@ -49,13 +51,15 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
public void onFinishInflate() {
super.onFinishInflate();
+ mTitleArea = findViewById(R.id.title_area);
+
mSettingsButton = (ImageView)findViewById(R.id.settings_button);
mSettingsButton.setOnClickListener(this);
mNotificationButton = (ImageView)findViewById(R.id.notification_button);
mNotificationButton.setOnClickListener(this);
mNotificationScroller = findViewById(R.id.notificationScroller);
- mSettingsFrame = (FrameLayout)findViewById(R.id.settings_frame);
+ mContentFrame = (FrameLayout)findViewById(R.id.content_frame);
}
@Override
@@ -91,22 +95,24 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
}
public boolean isInContentArea(int x, int y) {
- final int l = getPaddingLeft();
- final int r = getWidth() - getPaddingRight();
- final int t = getPaddingTop();
- final int b = getHeight() - getPaddingBottom();
+ final int l = mContentFrame.getLeft();
+ final int r = mContentFrame.getRight();
+ final int t = mTitleArea.getTop();
+ final int b = mContentFrame.getBottom();
return x >= l && x < r && y >= t && y < b;
}
void removeSettingsPanel() {
if (mSettingsPanel != null) {
- mSettingsFrame.removeViewAt(0);
+ mContentFrame.removeView(mSettingsPanel);
mSettingsPanel = null;
}
}
void addSettingsPanel() {
- mSettingsPanel = View.inflate(getContext(), R.layout.sysbar_panel_settings, mSettingsFrame);
+ LayoutInflater infl = LayoutInflater.from(getContext());
+ mSettingsPanel = infl.inflate(R.layout.sysbar_panel_settings, mContentFrame, false);
+ mContentFrame.addView(mSettingsPanel);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java
new file mode 100644
index 0000000..d4413db
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.tablet;
+
+import android.content.Context;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.graphics.Paint;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.android.systemui.R;
+
+public class NotificationTitleArea extends RelativeLayout {
+ static final String TAG = "NotificationTitleArea";
+
+ View mSettingsButton;
+ View mNotificationButton;
+ View mNotificationScroller;
+ FrameLayout mSettingsFrame;
+ View mSettingsPanel;
+
+ // for drawing the background
+ Bitmap mTexture;
+ Paint mPaint;
+ int mTextureWidth;
+ int mTextureHeight;
+
+
+ public NotificationTitleArea(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public NotificationTitleArea(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ // for drawing the background
+ mTexture = BitmapFactory.decodeResource(getResources(), R.drawable.panel_notification);
+ mTextureWidth = mTexture.getWidth();
+ mTextureHeight = mTexture.getHeight();
+
+ mPaint = new Paint();
+ mPaint.setDither(false);
+ }
+
+ public void onFinishInflate() {
+ super.onFinishInflate();
+ setWillNotDraw(false);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ final Bitmap texture = mTexture;
+ final Paint paint = mPaint;
+
+ final int width = getWidth();
+ final int height = getHeight();
+
+ final int textureWidth = mTextureWidth;
+ final int textureHeight = mTextureHeight;
+
+ int x = 0;
+ int y;
+
+ while (x < width) {
+ y = 0;
+ while (y < height) {
+ canvas.drawBitmap(texture, x, y, paint);
+ y += textureHeight;
+ }
+ x += textureWidth;
+ }
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java
new file mode 100644
index 0000000..5eafdc1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.view.View;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.graphics.Paint;
+import android.graphics.Canvas;
+
+public class PanelBackgroundView extends View {
+ private Bitmap mTexture;
+ private Paint mPaint;
+ private int mTextureWidth;
+ private int mTextureHeight;
+
+ public PanelBackgroundView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ /*
+ mTexture = BitmapFactory.decodeResource(getResources(),
+ com.android.internal.R.drawable.status_bar_background);
+ mTextureWidth = mTexture.getWidth();
+ mTextureHeight = mTexture.getHeight();
+
+ mPaint = new Paint();
+ mPaint.setDither(false);
+ */
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ /*
+ final Bitmap texture = mTexture;
+ final Paint paint = mPaint;
+
+ final int width = getWidth();
+ final int height = getHeight();
+
+ final int textureWidth = mTextureWidth;
+ final int textureHeight = mTextureHeight;
+
+ int x = 0;
+ int y;
+
+ while (x < width) {
+ y = 0;
+ while (y < height) {
+ canvas.drawBitmap(texture, x, y, paint);
+ y += textureHeight;
+ }
+ x += textureWidth;
+ }
+ */
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 983215e..7c97ac7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -31,6 +31,8 @@ import android.content.Intent;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -75,12 +77,15 @@ public class TabletStatusBar extends StatusBar {
public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003;
public static final int MSG_OPEN_RECENTS_PANEL = 1020;
public static final int MSG_CLOSE_RECENTS_PANEL = 1021;
- public static final int MSG_LIGHTS_ON = 1030;
- public static final int MSG_LIGHTS_OUT = 1031;
+ public static final int MSG_HIDE_SHADOWS = 1030;
+ public static final int MSG_SHOW_SHADOWS = 1031;
+ public static final int MSG_RESTORE_SHADOWS = 1032;
private static final int MAX_IMAGE_LEVEL = 10000;
private static final boolean USE_2D_RECENTS = true;
+ public static final int LIGHTS_ON_DELAY = 5000;
+
int mIconSize;
H mHandler = new H();
@@ -93,6 +98,9 @@ public class TabletStatusBar extends StatusBar {
View mNotificationTrigger;
NotificationIconArea mNotificationIconArea;
View mNavigationArea;
+
+ View mBackButton;
+ View mHomeButton;
View mMenuButton;
View mRecentButton;
@@ -113,7 +121,10 @@ public class TabletStatusBar extends StatusBar {
NetworkController mNetworkController;
View mBarContents;
- View mCurtains;
+
+ // lights out support
+ View mBackShadow, mHomeShadow, mRecentShadow, mMenuShadow, mNotificationShadow;
+ ShadowController mShadowController;
NotificationIconArea.IconLayout mIconLayout;
@@ -153,8 +164,8 @@ public class TabletStatusBar extends StatusBar {
mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- 512, // ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
@@ -245,14 +256,21 @@ public class TabletStatusBar extends StatusBar {
sb.setHandler(mHandler);
mBarContents = sb.findViewById(R.id.bar_contents);
- mCurtains = sb.findViewById(R.id.lights_out);
- mRecentButton = sb.findViewById(R.id.recent_apps);
- mRecentButton.setOnClickListener(mOnClickListener);
+ // "shadows" of the status bar features, for lights-out mode
+ mBackShadow = sb.findViewById(R.id.back_shadow);
+ mHomeShadow = sb.findViewById(R.id.home_shadow);
+ mRecentShadow = sb.findViewById(R.id.recent_shadow);
+ mMenuShadow = sb.findViewById(R.id.menu_shadow);
+ mNotificationShadow = sb.findViewById(R.id.notification_shadow);
+
+ mShadowController = new ShadowController(false);
- SetLightsOnListener on = new SetLightsOnListener(true);
- mCurtains.setOnClickListener(on);
- mCurtains.setOnLongClickListener(on);
+ mBackShadow.setOnTouchListener(mShadowController.makeTouchListener());
+ mHomeShadow.setOnTouchListener(mShadowController.makeTouchListener());
+ mRecentShadow.setOnTouchListener(mShadowController.makeTouchListener());
+ mMenuShadow.setOnTouchListener(mShadowController.makeTouchListener());
+ mNotificationShadow.setOnTouchListener(mShadowController.makeTouchListener());
// the whole right-hand side of the bar
mNotificationArea = sb.findViewById(R.id.notificationArea);
@@ -282,10 +300,15 @@ public class TabletStatusBar extends StatusBar {
// The navigation buttons
mNavigationArea = sb.findViewById(R.id.navigationArea);
+ mBackButton = mNavigationArea.findViewById(R.id.back);
+ mHomeButton = mNavigationArea.findViewById(R.id.home);
mMenuButton = mNavigationArea.findViewById(R.id.menu);
+ mRecentButton = mNavigationArea.findViewById(R.id.recent_apps);
+ Slog.d(TAG, "rec=" + mRecentButton + ", listener=" + mOnClickListener);
+ mRecentButton.setOnClickListener(mOnClickListener);
// The bar contents buttons
- mInputMethodButton = (InputMethodButton) mBarContents.findViewById(R.id.imeButton);
+ mInputMethodButton = (InputMethodButton) sb.findViewById(R.id.imeButton);
// set the initial view visibility
setAreThereNotifications();
@@ -362,6 +385,8 @@ public class TabletStatusBar extends StatusBar {
mNotificationPeekWindow.setVisibility(View.GONE);
mNotificationPanel.setVisibility(View.VISIBLE);
+
+ // XXX: need to synchronize with shadows here
mNotificationArea.setVisibility(View.GONE);
}
break;
@@ -369,6 +394,8 @@ public class TabletStatusBar extends StatusBar {
if (DEBUG) Slog.d(TAG, "closing notifications panel");
if (mNotificationPanel.getVisibility() == View.VISIBLE) {
mNotificationPanel.setVisibility(View.GONE);
+
+ // XXX: need to synchronize with shadows here
mNotificationArea.setVisibility(View.VISIBLE);
}
break;
@@ -380,14 +407,18 @@ public class TabletStatusBar extends StatusBar {
if (DEBUG) Slog.d(TAG, "closing recents panel");
if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.GONE);
break;
- case MSG_LIGHTS_ON:
- setViewVisibility(mCurtains, View.GONE, R.anim.lights_out_out);
- setViewVisibility(mBarContents, View.VISIBLE, R.anim.status_bar_in);
+ case MSG_HIDE_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)");
+ mShadowController.hideAllShadows();
break;
- case MSG_LIGHTS_OUT:
+ case MSG_SHOW_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "showing shadows (lights out)");
animateCollapse();
- setViewVisibility(mCurtains, View.VISIBLE, R.anim.lights_out_in);
- setViewVisibility(mBarContents, View.GONE, R.anim.status_bar_out);
+ mShadowController.showAllShadows();
+ break;
+ case MSG_RESTORE_SHADOWS:
+ if (DEBUG) Slog.d(TAG, "quickly re-showing shadows if appropriate");
+ mShadowController.refresh();
break;
}
}
@@ -434,7 +465,7 @@ public class TabletStatusBar extends StatusBar {
Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive"));
} catch (RemoteException ex) {
}
- if (immersive) {
+ if (false && immersive) {
// TODO: immersive mode popups for tablet
} else if (notification.notification.fullScreenIntent != null) {
// not immersive & a full-screen alert should be shown
@@ -605,16 +636,16 @@ public class TabletStatusBar extends StatusBar {
// called by StatusBar
@Override
public void setLightsOn(boolean on) {
- mHandler.removeMessages(MSG_LIGHTS_OUT);
- mHandler.removeMessages(MSG_LIGHTS_ON);
- mHandler.sendEmptyMessage(on ? MSG_LIGHTS_ON : MSG_LIGHTS_OUT);
+ mHandler.removeMessages(MSG_SHOW_SHADOWS);
+ mHandler.removeMessages(MSG_HIDE_SHADOWS);
+ mHandler.sendEmptyMessage(on ? MSG_HIDE_SHADOWS : MSG_SHOW_SHADOWS);
}
public void setMenuKeyVisible(boolean visible) {
if (DEBUG) {
Slog.d(TAG, (visible?"showing":"hiding") + " the MENU button");
}
- mMenuButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
+ mMenuButton.setVisibility(visible ? View.VISIBLE : View.GONE);
}
public void setIMEButtonVisible(boolean visible) {
@@ -664,7 +695,7 @@ public class TabletStatusBar extends StatusBar {
};
public void onClickNotificationTrigger() {
- if (DEBUG) Slog.d(TAG, "clicked notification icons");
+ if (DEBUG) Slog.d(TAG, "clicked notification icons; disabled=" + mDisabled);
if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
if (!mNotificationsOn) {
mNotificationsOn = true;
@@ -681,7 +712,7 @@ public class TabletStatusBar extends StatusBar {
}
public void onClickRecentButton() {
- if (DEBUG) Slog.d(TAG, "clicked recent apps");
+ if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled);
if (mRecentsPanel == null) {
Intent intent = new Intent();
intent.setClass(mContext, RecentApplicationsActivity.class);
@@ -939,6 +970,13 @@ public class TabletStatusBar extends StatusBar {
}
}
+ void workAroundBadLayerDrawableOpacity(View v) {
+ LayerDrawable d = (LayerDrawable)v.getBackground();
+ v.setBackgroundDrawable(null);
+ d.setOpacity(PixelFormat.TRANSLUCENT);
+ v.setBackgroundDrawable(d);
+ }
+
private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) {
StatusBarNotification sbn = entry.notification;
RemoteViews remoteViews = sbn.notification.contentView;
@@ -950,6 +988,7 @@ public class TabletStatusBar extends StatusBar {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false);
+ workAroundBadLayerDrawableOpacity(row);
View vetoButton = row.findViewById(R.id.veto);
if (entry.notification.isClearable()) {
final String _pkg = sbn.pkg;
@@ -1006,23 +1045,108 @@ public class TabletStatusBar extends StatusBar {
return true;
}
- public class SetLightsOnListener implements View.OnLongClickListener,
- View.OnClickListener {
- private boolean mOn;
+ public class ShadowController {
+ boolean mShowShadows;
+ View mTouchTarget;
- SetLightsOnListener(boolean on) {
- mOn = on;
+ ShadowController(boolean showShadows) {
+ mShowShadows = showShadows;
+ mTouchTarget = null;
}
- public void onClick(View v) {
- setLightsOn(mOn);
+ public boolean getShadowState() {
+ return mShowShadows;
+ }
+
+ public View.OnTouchListener makeTouchListener() {
+ return new View.OnTouchListener() {
+ public boolean onTouch(View v, MotionEvent ev) {
+ final int action = ev.getAction();
+
+ if (DEBUG) Slog.d(TAG, "ShadowController: v=" + v + ", ev=" + ev);
+
+ // currently redirecting events?
+ if (mTouchTarget == null) {
+ if (v == mBackShadow) {
+ mTouchTarget = mBackButton;
+ } else if (v == mHomeShadow) {
+ mTouchTarget = mHomeButton;
+ } else if (v == mMenuShadow) {
+ mTouchTarget = mMenuButton;
+ } else if (v == mRecentShadow) {
+ mTouchTarget = mRecentButton;
+ } else if (v == mNotificationShadow) {
+ mTouchTarget = mNotificationArea;
+ }
+ }
+
+ if (mTouchTarget != null && mTouchTarget.getVisibility() != View.GONE) {
+ boolean last = false;
+ switch (action) {
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ mHandler.removeMessages(MSG_RESTORE_SHADOWS);
+ if (mShowShadows) {
+ mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS,
+ v == mNotificationShadow ? 5000 : 500);
+ }
+ last = true;
+ break;
+ case MotionEvent.ACTION_DOWN:
+ mHandler.removeMessages(MSG_RESTORE_SHADOWS);
+ setShadowForButton(mTouchTarget, false);
+ break;
+ }
+ mTouchTarget.dispatchTouchEvent(ev);
+ if (last) mTouchTarget = null;
+ return true;
+ }
+
+ return false;
+ }
+ };
}
- public boolean onLongClick(View v) {
- setLightsOn(mOn);
- return true;
+ public void refresh() {
+ setShadowForButton(mBackButton, mShowShadows);
+ setShadowForButton(mHomeButton, mShowShadows);
+ setShadowForButton(mRecentButton, mShowShadows);
+ setShadowForButton(mMenuButton, mShowShadows);
+ setShadowForButton(mNotificationArea, mShowShadows);
}
+ public void showAllShadows() {
+ mShowShadows = true;
+ refresh();
+ }
+
+ public void hideAllShadows() {
+ mShowShadows = false;
+ refresh();
+ }
+
+ // Use View.INVISIBLE for things hidden due to shadowing, and View.GONE for things that are
+ // disabled (and should not be shadowed or re-shown)
+ public void setShadowForButton(View button, boolean shade) {
+ View shadow = null;
+ if (button == mBackButton) {
+ shadow = mBackShadow;
+ } else if (button == mHomeButton) {
+ shadow = mHomeShadow;
+ } else if (button == mMenuButton) {
+ shadow = mMenuShadow;
+ } else if (button == mRecentButton) {
+ shadow = mRecentShadow;
+ } else if (button == mNotificationArea) {
+ shadow = mNotificationShadow;
+ }
+ if (shadow != null) {
+ if (button.getVisibility() != View.GONE) {
+ shadow.setVisibility(shade ? View.VISIBLE : View.INVISIBLE);
+ button.setVisibility(shade ? View.INVISIBLE : View.VISIBLE);
+ }
+ }
+ }
}
public class TouchOutsideListener implements View.OnTouchListener {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java
index bd8266a..823b793 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.tablet;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
+import android.util.Slog;
import android.view.View;
import android.view.MotionEvent;
import android.widget.FrameLayout;
@@ -40,6 +41,9 @@ public class TabletStatusBarView extends FrameLayout {
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ if (TabletStatusBar.DEBUG) {
+ Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev);
+ }
mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL);
@@ -48,6 +52,9 @@ public class TabletStatusBarView extends FrameLayout {
for (int i=0; i < mPanels.length; i++) {
if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) {
if (eventInside(mIgnoreChildren[i], ev)) {
+ if (TabletStatusBar.DEBUG) {
+ Slog.d(TabletStatusBar.TAG, "TabletStatusBarView eating event for view: " + mIgnoreChildren[i]);
+ }
return true;
}
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index bb39c8f..18815f5 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -1832,7 +1832,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
- ActionMode mode = getCallback().onWindowStartingActionMode(wrappedCallback);
+ ActionMode mode = null;
+ try {
+ mode = getCallback().onWindowStartingActionMode(wrappedCallback);
+ } catch (AbstractMethodError ame) {
+ // Older apps might not implement this callback method.
+ }
if (mode != null) {
mActionMode = mode;
} else {
@@ -1877,7 +1882,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
}
if (mActionMode != null) {
- getCallback().onActionModeStarted(mActionMode);
+ try {
+ getCallback().onActionModeStarted(mActionMode);
+ } catch (AbstractMethodError ame) {
+ // Older apps might not implement this callback method.
+ }
}
return mActionMode;
}
@@ -2094,7 +2103,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
if (mActionModeView != null) {
mActionModeView.removeAllViews();
}
- getCallback().onActionModeFinished(mActionMode);
+ try {
+ getCallback().onActionModeFinished(mActionMode);
+ } catch (AbstractMethodError ame) {
+ // Older apps might not implement this callback method.
+ }
mActionMode = null;
}
}
diff --git a/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java b/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java
index 5518e11..486e7aa 100644
--- a/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java
@@ -130,9 +130,10 @@ public class SimUnlockScreen extends LinearLayout implements KeyguardScreen, Vie
/** {@inheritDoc} */
public void cleanUp() {
- // hide the dialog.
+ // dismiss the dialog.
if (mSimUnlockProgressDialog != null) {
- mSimUnlockProgressDialog.hide();
+ mSimUnlockProgressDialog.dismiss();
+ mSimUnlockProgressDialog = null;
}
mUpdateMonitor.removeCallback(this);
}
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index cd9b07e..84dd022 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -5808,7 +5808,8 @@ uint32_t AudioFlinger::EffectModule::deviceAudioSystemToEffectApi(uint32_t devic
const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = {
AUDIO_MODE_NORMAL, // AudioSystem::MODE_NORMAL
AUDIO_MODE_RINGTONE, // AudioSystem::MODE_RINGTONE
- AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_CALL
+ AUDIO_MODE_IN_CALL, // AudioSystem::MODE_IN_CALL
+ AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_COMMUNICATION, same conversion as for MODE_IN_CALL
};
int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode)
diff --git a/services/audioflinger/AudioPolicyManagerBase.cpp b/services/audioflinger/AudioPolicyManagerBase.cpp
index b17584a..e3b5db1 100644
--- a/services/audioflinger/AudioPolicyManagerBase.cpp
+++ b/services/audioflinger/AudioPolicyManagerBase.cpp
@@ -246,7 +246,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
// if leaving call state, handle special case of active streams
// pertaining to sonification strategy see handleIncallSonification()
- if (mPhoneState == AudioSystem::MODE_IN_CALL) {
+ if (isInCall()) {
LOGV("setPhoneState() in call state management: new state is %d", state);
for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
handleIncallSonification(stream, false, true);
@@ -259,16 +259,21 @@ void AudioPolicyManagerBase::setPhoneState(int state)
bool force = false;
// are we entering or starting a call
- if ((oldState != AudioSystem::MODE_IN_CALL) && (state == AudioSystem::MODE_IN_CALL)) {
+ if (!isStateInCall(oldState) && isStateInCall(state)) {
LOGV(" Entering call in setPhoneState()");
// force routing command to audio hardware when starting a call
// even if no device change is needed
force = true;
- } else if ((oldState == AudioSystem::MODE_IN_CALL) && (state != AudioSystem::MODE_IN_CALL)) {
+ } else if (isStateInCall(oldState) && !isStateInCall(state)) {
LOGV(" Exiting call in setPhoneState()");
// force routing command to audio hardware when exiting a call
// even if no device change is needed
force = true;
+ } else if (isStateInCall(state) && (state != oldState)) {
+ LOGV(" Switching between telephony and VoIP in setPhoneState()");
+ // force routing command to audio hardware when switching between telephony and VoIP
+ // even if no device change is needed
+ force = true;
}
// check for device and output changes triggered by new phone state
@@ -290,7 +295,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
// force routing command to audio hardware when ending call
// even if no device change is needed
- if (oldState == AudioSystem::MODE_IN_CALL && newDevice == 0) {
+ if (isStateInCall(oldState) && newDevice == 0) {
newDevice = hwOutputDesc->device();
}
@@ -298,7 +303,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
// immediately and delay the route change to avoid sending the ring tone
// tail into the earpiece or headset.
int delayMs = 0;
- if (state == AudioSystem::MODE_IN_CALL && oldState == AudioSystem::MODE_RINGTONE) {
+ if (isStateInCall(state) && oldState == AudioSystem::MODE_RINGTONE) {
// delay the device change command by twice the output latency to have some margin
// and be sure that audio buffers not yet affected by the mute are out when
// we actually apply the route change
@@ -311,7 +316,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
// if entering in call state, handle special case of active streams
// pertaining to sonification strategy see handleIncallSonification()
- if (state == AudioSystem::MODE_IN_CALL) {
+ if (isStateInCall(state)) {
LOGV("setPhoneState() in call state management: new state is %d", state);
// unmute the ringing tone after a sufficient delay if it was muted before
// setting output device above
@@ -586,7 +591,7 @@ status_t AudioPolicyManagerBase::startOutput(audio_io_handle_t output,
setOutputDevice(output, getNewDevice(output));
// handle special case for sonification while in call
- if (mPhoneState == AudioSystem::MODE_IN_CALL) {
+ if (isInCall()) {
handleIncallSonification(stream, true, false);
}
@@ -611,7 +616,7 @@ status_t AudioPolicyManagerBase::stopOutput(audio_io_handle_t output,
routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
// handle special case for sonification while in call
- if (mPhoneState == AudioSystem::MODE_IN_CALL) {
+ if (isInCall()) {
handleIncallSonification(stream, false, false);
}
@@ -1478,7 +1483,7 @@ uint32_t AudioPolicyManagerBase::getNewDevice(audio_io_handle_t output, bool fro
// use device for strategy media
// 4: the strategy DTMF is active on the hardware output:
// use device for strategy DTMF
- if (mPhoneState == AudioSystem::MODE_IN_CALL ||
+ if (isInCall() ||
outputDesc->isUsedByStrategy(STRATEGY_PHONE)) {
device = getDeviceForStrategy(STRATEGY_PHONE, fromCache);
} else if (outputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
@@ -1533,7 +1538,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
switch (strategy) {
case STRATEGY_DTMF:
- if (mPhoneState != AudioSystem::MODE_IN_CALL) {
+ if (!isInCall()) {
// when off call, DTMF strategy follows the same rules as MEDIA strategy
device = getDeviceForStrategy(STRATEGY_MEDIA, false);
break;
@@ -1546,7 +1551,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
// of priority
switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) {
case AudioSystem::FORCE_BT_SCO:
- if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
+ if (!isInCall() || strategy != STRATEGY_DTMF) {
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
if (device) break;
}
@@ -1566,7 +1571,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
if (device) break;
#ifdef WITH_A2DP
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to A2DP
- if (mPhoneState != AudioSystem::MODE_IN_CALL) {
+ if (!isInCall()) {
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
@@ -1580,14 +1585,14 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
break;
case AudioSystem::FORCE_SPEAKER:
- if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
+ if (!isInCall() || strategy != STRATEGY_DTMF) {
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
if (device) break;
}
#ifdef WITH_A2DP
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to
// A2DP speaker when forcing to speaker output
- if (mPhoneState != AudioSystem::MODE_IN_CALL) {
+ if (!isInCall()) {
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
if (device) break;
}
@@ -1604,7 +1609,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
// If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by
// handleIncallSonification().
- if (mPhoneState == AudioSystem::MODE_IN_CALL) {
+ if (isInCall()) {
device = getDeviceForStrategy(STRATEGY_PHONE, false);
break;
}
@@ -1971,6 +1976,16 @@ void AudioPolicyManagerBase::handleIncallSonification(int stream, bool starting,
}
}
+bool AudioPolicyManagerBase::isInCall()
+{
+ return isStateInCall(mPhoneState);
+}
+
+bool AudioPolicyManagerBase::isStateInCall(int state) {
+ return ((state == AudioSystem::MODE_IN_CALL) ||
+ (state == AudioSystem::MODE_IN_COMMUNICATION));
+}
+
bool AudioPolicyManagerBase::needsDirectOuput(AudioSystem::stream_type stream,
uint32_t samplingRate,
uint32_t format,
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 6a86076..bebd013 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -2399,15 +2399,45 @@ class BackupManagerService extends IBackupManager.Stub {
}
// Hand off a restore session
- public IRestoreSession beginRestoreSession(String transport) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "beginRestoreSession");
+ public IRestoreSession beginRestoreSession(String packageName, String transport) {
+ if (DEBUG) Slog.v(TAG, "beginRestoreSession: pkg=" + packageName
+ + " transport=" + transport);
+
+ boolean needPermission = true;
+ if (transport == null) {
+ transport = mCurrentTransport;
+
+ if (packageName != null) {
+ PackageInfo app = null;
+ try {
+ app = mPackageManager.getPackageInfo(packageName, 0);
+ } catch (NameNotFoundException nnf) {
+ Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName);
+ throw new IllegalArgumentException("Package " + packageName + " not found");
+ }
+
+ if (app.applicationInfo.uid == Binder.getCallingUid()) {
+ // So: using the current active transport, and the caller has asked
+ // that its own package will be restored. In this narrow use case
+ // we do not require the caller to hold the permission.
+ needPermission = false;
+ }
+ }
+ }
+
+ if (needPermission) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "beginRestoreSession");
+ } else {
+ if (DEBUG) Slog.d(TAG, "restoring self on current transport; no permission needed");
+ }
synchronized(this) {
if (mActiveRestoreSession != null) {
Slog.d(TAG, "Restore session requested but one already active");
return null;
}
- mActiveRestoreSession = new ActiveRestoreSession(transport);
+ mActiveRestoreSession = new ActiveRestoreSession(packageName, transport);
}
return mActiveRestoreSession;
}
@@ -2427,10 +2457,12 @@ class BackupManagerService extends IBackupManager.Stub {
class ActiveRestoreSession extends IRestoreSession.Stub {
private static final String TAG = "RestoreSession";
+ private String mPackageName;
private IBackupTransport mRestoreTransport = null;
RestoreSet[] mRestoreSets = null;
- ActiveRestoreSession(String transport) {
+ ActiveRestoreSession(String packageName, String transport) {
+ mPackageName = packageName;
mRestoreTransport = getTransport(transport);
}
@@ -2466,11 +2498,16 @@ class BackupManagerService extends IBackupManager.Stub {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"performRestore");
- if (DEBUG) Slog.d(TAG, "performRestore token=" + Long.toHexString(token)
+ if (DEBUG) Slog.d(TAG, "restoreAll token=" + Long.toHexString(token)
+ " observer=" + observer);
if (mRestoreTransport == null || mRestoreSets == null) {
- Slog.e(TAG, "Ignoring performRestore() with no restore set");
+ Slog.e(TAG, "Ignoring restoreAll() with no restore set");
+ return -1;
+ }
+
+ if (mPackageName != null) {
+ Slog.e(TAG, "Ignoring restoreAll() on single-package session");
return -1;
}
@@ -2495,6 +2532,14 @@ class BackupManagerService extends IBackupManager.Stub {
public synchronized int restorePackage(String packageName, IRestoreObserver observer) {
if (DEBUG) Slog.v(TAG, "restorePackage pkg=" + packageName + " obs=" + observer);
+ if (mPackageName != null) {
+ if (! mPackageName.equals(packageName)) {
+ Slog.e(TAG, "Ignoring attempt to restore pkg=" + packageName
+ + " on session for package " + mPackageName);
+ return -1;
+ }
+ }
+
PackageInfo app = null;
try {
app = mPackageManager.getPackageInfo(packageName, 0);
@@ -2529,6 +2574,7 @@ class BackupManagerService extends IBackupManager.Stub {
// the app has never been backed up from this device -- there's nothing
// to do but return failure.
if (token == 0) {
+ if (DEBUG) Slog.w(TAG, "No data available for this package; not restoring");
return -1;
}
@@ -2543,9 +2589,6 @@ class BackupManagerService extends IBackupManager.Stub {
}
public synchronized void endRestoreSession() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "endRestoreSession");
-
if (DEBUG) Slog.d(TAG, "endRestoreSession");
synchronized (this) {
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 4f8862c..84bc100 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -555,6 +555,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) {
+ synchronized (mMethodMap) {
+ if (imi == null && mCurMethodId != null) {
+ imi = mMethodMap.get(mCurMethodId);
+ }
+ return mSettings.getEnabledInputMethodSubtypeListLocked(imi);
+ }
+ }
+
public void addClient(IInputMethodClient client,
IInputContext inputContext, int uid, int pid) {
synchronized (mMethodMap) {
@@ -1607,7 +1616,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
synchronized (mMethodMap) {
final List<Pair<InputMethodInfo, ArrayList<String>>> immis =
- mSettings.getEnabledInputMethodAndSubtypeListLocked();
+ mSettings.getEnabledInputMethodAndSubtypeHashCodeListLocked();
ArrayList<Integer> subtypeIds = new ArrayList<Integer>();
if (immis == null || immis.size() == 0) {
@@ -2026,11 +2035,36 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
public List<Pair<InputMethodInfo, ArrayList<String>>>
- getEnabledInputMethodAndSubtypeListLocked() {
- return createEnabledInputMethodAndSubtypeListLocked(
+ getEnabledInputMethodAndSubtypeHashCodeListLocked() {
+ return createEnabledInputMethodAndSubtypeHashCodeListLocked(
getEnabledInputMethodsAndSubtypeListLocked());
}
+ public List<InputMethodSubtype> getEnabledInputMethodSubtypeListLocked(
+ InputMethodInfo imi) {
+ List<Pair<String, ArrayList<String>>> imsList =
+ getEnabledInputMethodsAndSubtypeListLocked();
+ ArrayList<InputMethodSubtype> enabledSubtypes =
+ new ArrayList<InputMethodSubtype>();
+ if (imi != null) {
+ for (Pair<String, ArrayList<String>> imsPair : imsList) {
+ InputMethodInfo info = mMethodMap.get(imsPair.first);
+ if (info != null && info.getId().equals(imi.getId())) {
+ ArrayList<InputMethodSubtype> subtypes = info.getSubtypes();
+ for (InputMethodSubtype ims: subtypes) {
+ for (String s: imsPair.second) {
+ if (String.valueOf(ims.hashCode()).equals(s)) {
+ enabledSubtypes.add(ims);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ return enabledSubtypes;
+ }
+
// At the initial boot, the settings for input methods are not set,
// so we need to enable IME in that case.
public void enableAllIMEsIfThereIsNoEnabledIME() {
@@ -2128,7 +2162,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
private List<Pair<InputMethodInfo, ArrayList<String>>>
- createEnabledInputMethodAndSubtypeListLocked(
+ createEnabledInputMethodAndSubtypeHashCodeListLocked(
List<Pair<String, ArrayList<String>>> imsList) {
final ArrayList<Pair<InputMethodInfo, ArrayList<String>>> res
= new ArrayList<Pair<InputMethodInfo, ArrayList<String>>>();
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index cd58284..a0a1974 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -7327,16 +7327,22 @@ class PackageManagerService extends IPackageManager.Stub {
pw.println(" ");
pw.println("Package warning messages:");
File fname = getSettingsProblemFile();
- FileInputStream in;
+ FileInputStream in = null;
try {
in = new FileInputStream(fname);
int avail = in.available();
byte[] data = new byte[avail];
in.read(data);
pw.print(new String(data));
- in.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ }
+ }
}
}
}
diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java
index 43dbcc0..1a12a84 100644
--- a/services/java/com/android/server/ProcessStats.java
+++ b/services/java/com/android/server/ProcessStats.java
@@ -799,8 +799,9 @@ public class ProcessStats {
}
private String readFile(String file, char endChar) {
+ FileInputStream is = null;
try {
- FileInputStream is = new FileInputStream(file);
+ is = new FileInputStream(file);
int len = is.read(mBuffer);
is.close();
@@ -815,6 +816,13 @@ public class ProcessStats {
}
} catch (java.io.FileNotFoundException e) {
} catch (java.io.IOException e) {
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (java.io.IOException e) {
+ }
+ }
}
return null;
}
@@ -841,4 +849,3 @@ public class ProcessStats {
}
}
}
-
diff --git a/services/java/com/android/server/WiredAccessoryObserver.java b/services/java/com/android/server/WiredAccessoryObserver.java
index 4a85aff..0529080 100644
--- a/services/java/com/android/server/WiredAccessoryObserver.java
+++ b/services/java/com/android/server/WiredAccessoryObserver.java
@@ -86,33 +86,40 @@ class WiredAccessoryObserver extends UEventObserver {
if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());
try {
- if ((event.get("SWITCH_NAME")).equals("usb_audio")) {
- if (Integer.parseInt(event.get("SWITCH_STATE")) == 1) {
- switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
- BIT_USB_HEADSET_DGTL)) |
- (Integer.parseInt(event.get("SWITCH_STATE")) << 2));
- } else if (Integer.parseInt(event.get("SWITCH_STATE")) == 2) {
- switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
- BIT_USB_HEADSET_ANLG)) |
- (Integer.parseInt(event.get("SWITCH_STATE")) << 3));
- }
- else switchState = (mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC));
- }
- else if ((event.get("SWITCH_NAME")).equals("hdmi")) {
- switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
- BIT_USB_HEADSET_DGTL|BIT_USB_HEADSET_ANLG)) |
- (Integer.parseInt(event.get("SWITCH_STATE")) << 4));
- }
- else {
- switchState = ((mHeadsetState & (BIT_USB_HEADSET_ANLG|BIT_USB_HEADSET_DGTL)) |
- (Integer.parseInt(event.get("SWITCH_STATE"))));
- }
- update(event.get("SWITCH_NAME"), switchState);
+ String name = event.get("SWITCH_NAME");
+ int state = Integer.parseInt(event.get("SWITCH_STATE"));
+ updateState(name, state);
} catch (NumberFormatException e) {
Slog.e(TAG, "Could not parse switch state from event " + event);
}
}
+ private synchronized final void updateState(String name, int state)
+ {
+ if (name.equals("usb_audio")) {
+ if (state == 1) {
+ switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
+ BIT_USB_HEADSET_DGTL|BIT_HDMI_AUDIO)) |
+ (state << 2));
+ } else if (state == 2) {
+ switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
+ BIT_USB_HEADSET_ANLG|BIT_HDMI_AUDIO)) |
+ (state << 3));
+ } else switchState = (mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|BIT_HDMI_AUDIO));
+ }
+ else if (name.equals("hdmi")) {
+ switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|
+ BIT_USB_HEADSET_DGTL|BIT_USB_HEADSET_ANLG)) |
+ (state << 4));
+ }
+ else {
+ switchState = ((mHeadsetState & (BIT_HDMI_AUDIO|BIT_USB_HEADSET_ANLG|
+ BIT_USB_HEADSET_DGTL)) |
+ state);
+ }
+ update(name, switchState);
+ }
+
private synchronized final void init() {
char[] buffer = new char[1024];
@@ -132,13 +139,15 @@ class WiredAccessoryObserver extends UEventObserver {
file.close();
newName = new String(buffer, 0, len).trim();
+ if (newState > 0) {
+ updateState(newName, newState);
+ }
+
} catch (FileNotFoundException e) {
Slog.w(TAG, "This kernel does not have wired headset support");
} catch (Exception e) {
Slog.e(TAG, "" , e);
}
-
- update(newName, newState);
}
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 35a2c19..290f2c1 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -438,9 +438,9 @@ public class ServiceState implements Parcelable {
+ " " + (mCssIndicator ? "CSS supported" : "CSS not supported")
+ " " + mNetworkId
+ " " + mSystemId
- + "RoamInd: " + mCdmaRoamingIndicator
- + "DefRoamInd: " + mCdmaDefaultRoamingIndicator
- + "EmergOnly: " + mIsEmergencyOnly);
+ + " RoamInd=" + mCdmaRoamingIndicator
+ + " DefRoamInd=" + mCdmaDefaultRoamingIndicator
+ + " EmergOnly=" + mIsEmergencyOnly);
}
public void setStateOutOfService() {
diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java
index d74a547..5b49305 100644
--- a/telephony/java/com/android/internal/telephony/CallManager.java
+++ b/telephony/java/com/android/internal/telephony/CallManager.java
@@ -380,12 +380,17 @@ public final class CallManager {
break;
case OFFHOOK:
Phone fgPhone = getFgPhone();
- // Enable IN_CALL mode while foreground call is in DIALING,
- // ALERTING, ACTIVE and DISCONNECTING state and not from sipPhone
+ // While foreground call is in DIALING,
+ // ALERTING, ACTIVE and DISCONNECTING state
if (getActiveFgCallState() != Call.State.IDLE
- && getActiveFgCallState() != Call.State.DISCONNECTED
- && !(fgPhone instanceof SipPhone)) {
- mode = AudioManager.MODE_IN_CALL;
+ && getActiveFgCallState() != Call.State.DISCONNECTED) {
+ if (fgPhone instanceof SipPhone) {
+ // enable IN_COMMUNICATION audio mode for sipPhone
+ mode = AudioManager.MODE_IN_COMMUNICATION;
+ } else {
+ // enable IN_CALL audio mode for telephony
+ mode = AudioManager.MODE_IN_CALL;
+ }
}
break;
}
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 35d5564..a77e73e 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -141,6 +141,7 @@ class RILRequest {
this.mNext = sPool;
sPool = this;
sPoolSize++;
+ mResult = null;
}
}
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index b9d5673..099bc30 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -934,13 +934,13 @@ public class CDMAPhone extends PhoneBase {
switch(action) {
case CANCEL_ECM_TIMER:
removeCallbacks(mExitEcmRunnable);
- mEcmTimerResetRegistrants.notifyResult(new Boolean(true));
+ mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE);
break;
case RESTART_ECM_TIMER:
long delayInMillis = SystemProperties.getLong(
TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
postDelayed(mExitEcmRunnable, delayInMillis);
- mEcmTimerResetRegistrants.notifyResult(new Boolean(false));
+ mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE);
break;
default:
Log.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action);
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 7c652c5..d7ff0c5 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -240,8 +240,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
mCdmaPhone.mRuimRecords.getRecordsLoaded())) {
reason += " - radioState= " + mPhone.mCM.getRadioState() + " - RUIM not loaded";
}
- if (mPhone.getState() != Phone.State.IDLE &&
- mCdmaPhone.mSST.isConcurrentVoiceAndData()) {
+ if (!(mCdmaPhone.mSST.isConcurrentVoiceAndData() ||
+ mPhone.getState() == Phone.State.IDLE)) {
reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState();
}
if (roaming) reason += " - Roaming";
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 2aca9ad..70328f7 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -106,7 +106,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
* It is a subset of allApns and has the same format
*/
private ArrayList<ApnSetting> mWaitingApns = null;
-
+ private int mWaitingApnsPermanentFailureCountDown = 0;
private ApnSetting mPreferredApn = null;
/* Currently active APN */
@@ -328,8 +328,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
reason += " - PhoneState= " + mPhone.getState();
}
if (!mMasterDataEnabled) reason += " - mMasterDataEnabled= false";
- if (mPhone.getServiceState().getRoaming() && getDataOnRoamingEnabled()) {
- reason += " - Roaming";
+ if (mPhone.getServiceState().getRoaming() && !getDataOnRoamingEnabled()) {
+ reason += " - Roaming and data roaming not enabled";
}
if (mIsPsRestricted) reason += " - mIsPsRestricted= true";
if (!desiredPowerState) reason += " - desiredPowerState= false";
@@ -361,6 +361,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (mState == State.IDLE) {
mWaitingApns = buildWaitingApns(mRequestedApnType);
+ mWaitingApnsPermanentFailureCountDown = mWaitingApns.size();
if (mWaitingApns.isEmpty()) {
if (DBG) log("No APN found");
notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN);
@@ -996,6 +997,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
}
if (ar.exception == null) {
+ if(DBG) {
+ log(String.format("onDataSetupComplete: success apn=%s", mWaitingApns.get(0).apn));
+ }
// TODO: We should clear LinkProperties/Capabilities when torn down or disconnected
mLinkProperties = getLinkProperties(mPendingDataConnection);
mLinkCapabilities = getLinkCapabilities(mPendingDataConnection);
@@ -1037,30 +1041,42 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
} else {
GsmDataConnection.FailCause cause;
cause = (GsmDataConnection.FailCause) (ar.result);
- if(DBG) log("PDP setup failed " + cause);
- // Log this failure to the Event Logs.
+ if (DBG) {
+ String apnString;
+ try {
+ apnString = mWaitingApns.get(0).apn;
+ } catch (Exception e) {
+ apnString = "<unknown>";
+ }
+ log(String.format("onDataSetupComplete: error apn=%s cause=%s", apnString, cause));
+ }
if (cause.isEventLoggable()) {
+ // Log this failure to the Event Logs.
GsmCellLocation loc = ((GsmCellLocation)mPhone.getCellLocation());
EventLog.writeEvent(EventLogTags.PDP_SETUP_FAIL,
cause.ordinal(), loc != null ? loc.getCid() : -1,
TelephonyManager.getDefault().getNetworkType());
}
- // Do not retry on permanent failure
- // TODO: We should not fail permanently if more Apns to try!
- if (cause.isPermanentFail()) {
- notifyNoData(cause);
- notifyDataConnection(Phone.REASON_APN_FAILED);
- onEnableApn(apnTypeToId(mRequestedApnType), DISABLED);
- return;
- }
-
+ // Count permanent failures and remove the APN we just tried
+ mWaitingApnsPermanentFailureCountDown -= cause.isPermanentFail() ? 1 : 0;
mWaitingApns.remove(0);
+ if (DBG) log(String.format("onDataSetupComplete: mWaitingApns.size=%d" +
+ " mWaitingApnsPermanenatFailureCountDown=%d",
+ mWaitingApns.size(), mWaitingApnsPermanentFailureCountDown));
+
+ // See if there are more APN's to try
if (mWaitingApns.isEmpty()) {
- // No more to try, start delayed retry
- startDelayedRetry(cause, reason);
+ if (mWaitingApnsPermanentFailureCountDown == 0) {
+ if (DBG) log("onDataSetupComplete: Permanent failures stop retrying");
+ notifyNoData(cause);
+ notifyDataConnection(Phone.REASON_APN_FAILED);
+ } else {
+ if (DBG) log("onDataSetupComplete: Not all permanent failures, retry");
+ startDelayedRetry(cause, reason);
+ }
} else {
- // we still have more apns to try
+ if (DBG) log("onDataSetupComplete: Try next APN");
setState(State.SCANNING);
// Wait a bit before trying the next APN, so that
// we're not tying up the RIL command channel
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
index afd4d0c..db9e35a 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
@@ -101,12 +101,12 @@ abstract class SipPhoneBase extends PhoneBase {
}
protected void startRingbackTone() {
- AsyncResult result = new AsyncResult(null, new Boolean(true), null);
+ AsyncResult result = new AsyncResult(null, Boolean.TRUE, null);
mRingbackRegistrants.notifyRegistrants(result);
}
protected void stopRingbackTone() {
- AsyncResult result = new AsyncResult(null, new Boolean(false), null);
+ AsyncResult result = new AsyncResult(null, Boolean.FALSE, null);
mRingbackRegistrants.notifyRegistrants(result);
}
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 3ac74f7..5ce3efc 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -785,7 +785,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
mIncludeDetailedStats = false;
try {
// Look for TimedTest annotation on both test class and test method
- if (testMethod.isAnnotationPresent(TimedTest.class)) {
+ if (testMethod != null && testMethod.isAnnotationPresent(TimedTest.class)) {
mIsTimedTest = true;
mIncludeDetailedStats = testMethod.getAnnotation(
TimedTest.class).includeDetailedStats();
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
index c62f4de..d545018 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
@@ -80,9 +80,6 @@ public class FileFilter {
"fast/regex/test1.html", // Causes DumpRenderTree to hang with V8
"fast/regex/slow.html", // Causes DumpRenderTree to hang with V8
"http/tests/xmlhttprequest/simple-cross-origin-progress-events.html", // runs webcore into bad state, http://b/2929261
- "ietestcenter/Javascript/15.4.4.15-3-14.html", // hangs the layout tests, http://b/2889595
- "ietestcenter/Javascript/15.4.4.15-3-29.html", // hangs the layout tests, http://b/2889596
- "ietestcenter/Javascript/15.4.4.15-3-8.html", // hangs the layout tests, http://b/2889598
};
static void fillIgnoreResultList() {