summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk4
-rw-r--r--api/13.xml12
-rw-r--r--build/phone-xhdpi-1024-dalvik-heap.mk22
-rw-r--r--cmds/ip-up-vpn/ip-up-vpn.c10
-rw-r--r--cmds/stagefright/sf2.cpp61
-rw-r--r--cmds/stagefright/stagefright.cpp57
-rw-r--r--cmds/stagefright/stream.cpp2
-rw-r--r--core/java/android/app/ActionBar.java38
-rw-r--r--core/java/android/app/ActivityManagerNative.java17
-rw-r--r--core/java/android/app/ActivityThread.java77
-rw-r--r--core/java/android/app/IActivityManager.java3
-rw-r--r--core/java/android/app/SearchManager.java2
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java10
-rw-r--r--core/java/android/bluetooth/BluetoothProfile.java6
-rw-r--r--core/java/android/content/Intent.java38
-rw-r--r--core/java/android/content/SyncManager.java294
-rw-r--r--core/java/android/content/pm/ActivityInfo.java6
-rw-r--r--core/java/android/content/pm/PackageInfoLite.java17
-rw-r--r--core/java/android/content/pm/PackageManager.java11
-rw-r--r--core/java/android/content/pm/PackageParser.java116
-rw-r--r--core/java/android/content/pm/Signature.java19
-rw-r--r--core/java/android/content/pm/VerifierInfo.aidl19
-rw-r--r--core/java/android/content/pm/VerifierInfo.java83
-rw-r--r--core/java/android/inputmethodservice/Keyboard.java46
-rw-r--r--core/java/android/inputmethodservice/KeyboardView.java4
-rw-r--r--core/java/android/net/DhcpInfoInternal.java45
-rw-r--r--core/java/android/net/DhcpStateMachine.java5
-rw-r--r--core/java/android/net/NetworkStatsHistory.java5
-rw-r--r--core/java/android/net/NetworkTemplate.java41
-rw-r--r--core/java/android/net/Uri.java42
-rw-r--r--core/java/android/nfc/NfcAdapter.java32
-rw-r--r--core/java/android/nfc/NfcEvent.java4
-rw-r--r--core/java/android/preference/PreferenceScreen.java18
-rw-r--r--core/java/android/provider/ContactsContract.java8
-rw-r--r--core/java/android/provider/MediaStore.java11
-rw-r--r--core/java/android/text/DynamicLayout.java14
-rw-r--r--core/java/android/text/SpannableStringBuilder.java16
-rw-r--r--core/java/android/text/StaticLayout.java20
-rw-r--r--core/java/android/text/TextLine.java189
-rw-r--r--core/java/android/text/TextUtils.java41
-rw-r--r--core/java/android/text/format/Time.java6
-rw-r--r--core/java/android/text/method/Touch.java43
-rw-r--r--core/java/android/text/style/SpellCheckSpan.java4
-rw-r--r--core/java/android/view/ActionProvider.java28
-rw-r--r--core/java/android/view/IWindowManager.aidl9
-rw-r--r--core/java/android/view/Surface.java5
-rw-r--r--core/java/android/view/TextureView.java14
-rw-r--r--core/java/android/view/View.java57
-rw-r--r--core/java/android/view/ViewGroup.java38
-rw-r--r--core/java/android/view/ViewRootImpl.java1
-rw-r--r--core/java/android/view/VolumePanel.java38
-rw-r--r--core/java/android/view/Window.java6
-rw-r--r--core/java/android/view/WindowManagerPolicy.java52
-rwxr-xr-xcore/java/android/view/WindowOrientationListener.java460
-rw-r--r--core/java/android/view/textservice/TextServicesManager.java4
-rw-r--r--core/java/android/webkit/BrowserFrame.java38
-rw-r--r--core/java/android/webkit/CallbackProxy.java27
-rw-r--r--core/java/android/webkit/CookieSyncManager.java4
-rw-r--r--core/java/android/webkit/HTML5Audio.java46
-rw-r--r--core/java/android/webkit/HTML5VideoInline.java9
-rw-r--r--core/java/android/webkit/JniUtil.java16
-rw-r--r--core/java/android/webkit/SslCertLookupTable.java19
-rw-r--r--core/java/android/webkit/WebView.java54
-rw-r--r--core/java/android/webkit/WebViewCore.java24
-rw-r--r--core/java/android/webkit/ZoomManager.java6
-rw-r--r--core/java/android/widget/AbsListView.java10
-rw-r--r--core/java/android/widget/ActivityChooserView.java64
-rw-r--r--core/java/android/widget/AdapterView.java42
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java21
-rw-r--r--core/java/android/widget/BaseAdapter.java11
-rw-r--r--core/java/android/widget/CalendarView.java20
-rw-r--r--core/java/android/widget/GridLayout.java571
-rw-r--r--core/java/android/widget/HorizontalScrollView.java12
-rw-r--r--core/java/android/widget/MediaController.java75
-rw-r--r--core/java/android/widget/NumberPicker.java401
-rw-r--r--core/java/android/widget/OverScroller.java8
-rw-r--r--core/java/android/widget/PopupMenu.java2
-rw-r--r--core/java/android/widget/PopupWindow.java30
-rw-r--r--core/java/android/widget/ProgressBar.java3
-rw-r--r--core/java/android/widget/RelativeLayout.java5
-rw-r--r--core/java/android/widget/ScrollView.java12
-rw-r--r--core/java/android/widget/SearchView.java4
-rw-r--r--core/java/android/widget/ShareActionProvider.java1
-rw-r--r--core/java/android/widget/Space.java24
-rw-r--r--core/java/android/widget/SpellChecker.java128
-rw-r--r--core/java/android/widget/TextView.java361
-rw-r--r--core/java/android/widget/VideoView.java7
-rw-r--r--core/java/com/android/internal/policy/IFaceLockCallback.aidl1
-rw-r--r--core/java/com/android/internal/util/ArrayUtils.java9
-rw-r--r--core/java/com/android/internal/view/menu/ActionMenuPresenter.java46
-rw-r--r--core/java/com/android/internal/view/menu/IconMenuPresenter.java4
-rw-r--r--core/java/com/android/internal/view/menu/ListMenuPresenter.java45
-rw-r--r--core/java/com/android/internal/view/menu/MenuBuilder.java4
-rw-r--r--core/java/com/android/internal/view/menu/MenuPopupHelper.java57
-rw-r--r--core/java/com/android/internal/widget/AbsActionBarView.java22
-rw-r--r--core/java/com/android/internal/widget/ActionBarContextView.java35
-rw-r--r--core/java/com/android/internal/widget/ActionBarView.java23
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java33
-rw-r--r--core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java9
-rw-r--r--core/java/com/android/server/NetworkManagementSocketTagger.java117
-rw-r--r--core/jni/Android.mk1
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/jni/android/graphics/Canvas.cpp29
-rw-r--r--core/jni/android/graphics/Paint.cpp15
-rw-r--r--core/jni/android/graphics/TextLayout.cpp92
-rw-r--r--core/jni/android/graphics/TextLayout.h10
-rw-r--r--core/jni/android/graphics/TextLayoutCache.cpp395
-rw-r--r--core/jni/android/graphics/TextLayoutCache.h67
-rw-r--r--core/jni/android_net_wifi_Wifi.cpp28
-rw-r--r--core/jni/android_server_NetworkManagementSocketTagger.cpp97
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp28
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.pngbin1374 -> 1731 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.pngbin1380 -> 1695 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.pngbin1027 -> 1172 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.pngbin1028 -> 1146 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.pngbin1984 -> 2332 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.pngbin1984 -> 2367 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_holo.pngbin2131 -> 2336 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_holo_dark.pngbin1816 -> 2132 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_holo_light.pngbin1831 -> 2186 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.pngbin2815 -> 2952 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.pngbin2701 -> 2831 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_code_lock_default_holo.pngbin597 -> 697 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_code_lock_touched_holo.pngbin537 -> 596 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.pngbin432 -> 404 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.pngbin432 -> 404 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.pngbin410 -> 392 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.pngbin413 -> 395 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.pngbin2311 -> 2576 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.pngbin2402 -> 2762 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.pngbin1022 -> 1159 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.pngbin1069 -> 1209 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.pngbin2428 -> 2734 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.pngbin2477 -> 2943 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.pngbin1102 -> 1317 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.pngbin1167 -> 1326 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.pngbin2704 -> 3162 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.pngbin2709 -> 3282 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.pngbin2344 -> 2601 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.pngbin2395 -> 2743 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.pngbin1521 -> 1848 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.pngbin1540 -> 1864 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.pngbin2478 -> 2764 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.pngbin2471 -> 2913 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.pngbin1550 -> 1992 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.pngbin1626 -> 2002 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.pngbin2728 -> 3226 bytes
-rw-r--r--core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.pngbin2685 -> 3252 bytes
-rw-r--r--core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.pngbin167 -> 165 bytes
-rw-r--r--core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.pngbin165 -> 164 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_angel.pngbin1068 -> 1387 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_cool.pngbin1048 -> 1404 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_crying.pngbin933 -> 1263 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_embarrassed.pngbin937 -> 1279 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_foot_in_mouth.pngbin1010 -> 1336 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_happy.pngbin957 -> 1273 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_kissing.pngbin1042 -> 1380 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_laughing.pngbin947 -> 1286 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_lips_are_sealed.pngbin1083 -> 1420 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_money_mouth.pngbin1159 -> 1529 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_sad.pngbin956 -> 1291 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_surprised.pngbin954 -> 1326 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.pngbin1064 -> 1436 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_undecided.pngbin892 -> 1201 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_winking.pngbin989 -> 1292 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_wtf.pngbin985 -> 1308 bytes
-rw-r--r--core/res/res/drawable-hdpi/emo_im_yelling.pngbin1020 -> 1359 bytes
-rw-r--r--core/res/res/drawable-hdpi/expander_close_holo_dark.9.pngbin397 -> 555 bytes
-rw-r--r--core/res/res/drawable-hdpi/expander_close_holo_light.9.pngbin412 -> 475 bytes
-rw-r--r--core/res/res/drawable-hdpi/expander_open_holo_dark.9.pngbin434 -> 609 bytes
-rw-r--r--core/res/res/drawable-hdpi/expander_open_holo_light.9.pngbin417 -> 485 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.pngbin1545 -> 1774 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.pngbin1552 -> 1763 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.pngbin1573 -> 1737 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.pngbin1540 -> 1683 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.pngbin116 -> 131 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.pngbin116 -> 131 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.pngbin116 -> 132 bytes
-rw-r--r--core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.pngbin116 -> 132 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_audio_ring_notif.pngbin1222 -> 1196 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.pngbin1456 -> 1398 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_input_delete.pngbin1307 -> 1031 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_answer_active.pngbin9066 -> 9066 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.pngbin17978 -> 17982 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.pngbin6413 -> 6412 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.pngbin16551 -> 16563 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.pngbin5387 -> 5387 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.pngbin8578 -> 7896 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.pngbin8363 -> 8378 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.pngbin12977 -> 12968 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.pngbin5708 -> 5716 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.pngbin12771 -> 12774 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.pngbin5176 -> 5172 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.pngbin9616 -> 9620 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.pngbin6731 -> 6727 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.pngbin9325 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.pngbin1347 -> 1376 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_embed_play.pngbin5320 -> 1112 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_notification_ime_default.pngbin755 -> 755 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_suggestions_add.pngbin0 -> 381 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_suggestions_delete.pngbin0 -> 478 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.pngbin298 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.pngbin597 -> 697 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.pngbin7573 -> 7367 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.pngbin7560 -> 7343 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.pngbin517 -> 804 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.pngbin444 -> 513 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.pngbin392 -> 461 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.pngbin378 -> 460 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.pngbin519 -> 863 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.pngbin470 -> 571 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.pngbin494 -> 624 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.pngbin494 -> 624 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.pngbin390 -> 511 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.pngbin390 -> 511 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.pngbin498 -> 608 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.pngbin498 -> 608 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.pngbin503 -> 780 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.pngbin429 -> 500 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.pngbin373 -> 458 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.pngbin368 -> 435 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.pngbin508 -> 825 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.pngbin452 -> 553 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.pngbin484 -> 612 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.pngbin484 -> 612 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.pngbin373 -> 504 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.pngbin373 -> 510 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.pngbin489 -> 604 bytes
-rw-r--r--core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.pngbin489 -> 604 bytes
-rw-r--r--core/res/res/drawable-hdpi/panel_bg_holo_dark.9.pngbin434 -> 422 bytes
-rw-r--r--core/res/res/drawable-hdpi/panel_bg_holo_light.9.pngbin416 -> 693 bytes
-rw-r--r--core/res/res/drawable-hdpi/presence_away.pngbin1280 -> 1278 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.pngbin1176 -> 1174 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.pngbin1275 -> 1283 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.pngbin1125 -> 1179 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.pngbin1169 -> 1224 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.pngbin974 -> 981 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.pngbin1102 -> 1105 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.pngbin1095 -> 1087 bytes
-rw-r--r--core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.pngbin1106 -> 1097 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.pngbin1965 -> 2444 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_half_holo_light.pngbin2057 -> 2503 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.pngbin1340 -> 1570 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_off_holo_light.pngbin1401 -> 1620 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.pngbin1943 -> 2448 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_big_on_holo_light.pngbin2033 -> 2463 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.pngbin1355 -> 1696 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_half_holo_light.pngbin1413 -> 1746 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.pngbin942 -> 1132 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_off_holo_light.pngbin988 -> 1159 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.pngbin1348 -> 1696 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_med_on_holo_light.pngbin1390 -> 1727 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.pngbin945 -> 1126 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_half_holo_light.pngbin977 -> 1157 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.pngbin703 -> 783 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_off_holo_light.pngbin723 -> 799 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.pngbin938 -> 1126 bytes
-rw-r--r--core/res/res/drawable-hdpi/rate_star_small_on_holo_light.pngbin982 -> 1143 bytes
-rw-r--r--core/res/res/drawable-hdpi/scrubber_control_disabled_holo.pngbin851 -> 999 bytes
-rw-r--r--core/res/res/drawable-hdpi/scrubber_control_focused_holo.pngbin1429 -> 1579 bytes
-rw-r--r--core/res/res/drawable-hdpi/scrubber_control_normal_holo.pngbin1113 -> 1227 bytes
-rw-r--r--core/res/res/drawable-hdpi/scrubber_control_pressed_holo.pngbin1759 -> 2229 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_16_inner_holo.pngbin1608 -> 755 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_16_outer_holo.pngbin1333 -> 654 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_20_inner_holo.pngbin1820 -> 879 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_20_outer_holo.pngbin1463 -> 759 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_48_inner_holo.pngbin3645 -> 2081 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_48_outer_holo.pngbin2622 -> 1811 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_76_inner_holo.pngbin5421 -> 3374 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_76_outer_holo.pngbin3929 -> 2876 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.pngbin390 -> 388 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.pngbin398 -> 394 bytes
-rw-r--r--core/res/res/drawable-hdpi/stat_notify_error.pngbin769 -> 904 bytes
-rw-r--r--core/res/res/drawable-hdpi/stat_notify_wifi_in_range.pngbin1081 -> 1474 bytes
-rw-r--r--core/res/res/drawable-hdpi/stat_sys_adb.pngbin1220 -> 1171 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.pngbin219 -> 204 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.pngbin219 -> 204 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.pngbin262 -> 252 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.pngbin264 -> 254 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_holo_dark.9.pngbin195 -> 182 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_bg_holo_light.9.pngbin195 -> 182 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.pngbin600 -> 854 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.pngbin427 -> 653 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.pngbin371 -> 483 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.pngbin392 -> 502 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.pngbin400 -> 598 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_holo_light.9.pngbin399 -> 544 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.pngbin672 -> 956 bytes
-rw-r--r--core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.pngbin428 -> 720 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_bottom_holo.9.pngbin133 -> 129 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_focus.9.pngbin628 -> 623 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_focus_bar_left.9.pngbin140 -> 138 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_focus_bar_right.9.pngbin140 -> 138 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_press.9.pngbin614 -> 608 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_press_bar_left.9.pngbin139 -> 138 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_press_bar_right.9.pngbin139 -> 138 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_pressed_holo.9.pngbin437 -> 428 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_selected.9.pngbin622 -> 623 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_selected_bar_left.9.pngbin137 -> 135 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_selected_bar_right.9.pngbin137 -> 135 bytes
-rw-r--r--core/res/res/drawable-hdpi/tab_unselected.9.pngbin386 -> 380 bytes
-rw-r--r--core/res/res/drawable-hdpi/text_select_handle_left.pngbin1461 -> 1667 bytes
-rw-r--r--core/res/res/drawable-hdpi/text_select_handle_middle.pngbin1569 -> 1800 bytes
-rw-r--r--core/res/res/drawable-hdpi/text_select_handle_right.pngbin1506 -> 1762 bytes
-rw-r--r--core/res/res/drawable-hdpi/vpn_connected.pngbin757 -> 539 bytes
-rw-r--r--core/res/res/drawable-hdpi/vpn_disconnected.pngbin717 -> 577 bytes
-rw-r--r--core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.pngbin573 -> 0 bytes
-rw-r--r--core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.pngbin359 -> 0 bytes
-rw-r--r--core/res/res/drawable-ldpi/stat_sys_adb.pngbin1066 -> 362 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.pngbin1033 -> 1115 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.pngbin1033 -> 1118 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.pngbin742 -> 792 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.pngbin752 -> 793 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.pngbin1347 -> 1452 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.pngbin1358 -> 1455 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_holo.pngbin1356 -> 1463 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_holo_dark.pngbin1238 -> 1339 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_holo_light.pngbin1250 -> 1346 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.pngbin1709 -> 1737 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.pngbin1678 -> 1711 bytes
-rw-r--r--[-rwxr-xr-x]core/res/res/drawable-mdpi/btn_code_lock_default.pngbin1190 -> 1254 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_code_lock_default_holo.pngbin481 -> 523 bytes
-rw-r--r--[-rwxr-xr-x]core/res/res/drawable-mdpi/btn_code_lock_touched.pngbin739 -> 827 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_code_lock_touched_holo.pngbin447 -> 476 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.pngbin295 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.pngbin295 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.pngbin294 -> 289 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.pngbin296 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.pngbin2282 -> 2286 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.pngbin1572 -> 1575 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.pngbin2367 -> 2361 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.pngbin1656 -> 1661 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.pngbin2668 -> 2664 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.pngbin1470 -> 1569 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.pngbin1518 -> 1668 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.pngbin722 -> 770 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.pngbin752 -> 813 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.pngbin1539 -> 1648 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.pngbin1578 -> 1731 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.pngbin790 -> 857 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.pngbin817 -> 877 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.pngbin1736 -> 1914 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.pngbin1749 -> 1962 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.pngbin1483 -> 1575 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.pngbin1516 -> 1649 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.pngbin1063 -> 1165 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.pngbin1097 -> 1198 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.pngbin1552 -> 1658 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.pngbin1570 -> 1724 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.pngbin1086 -> 1239 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.pngbin1143 -> 1274 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.pngbin1776 -> 1912 bytes
-rw-r--r--core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.pngbin1739 -> 1947 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_angel.pngbin782 -> 893 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_cool.pngbin776 -> 916 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_crying.pngbin714 -> 873 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_embarrassed.pngbin771 -> 913 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_foot_in_mouth.pngbin783 -> 911 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_happy.pngbin716 -> 862 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_kissing.pngbin793 -> 926 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_laughing.pngbin727 -> 893 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_lips_are_sealed.pngbin806 -> 952 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_money_mouth.pngbin830 -> 985 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_sad.pngbin711 -> 856 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_surprised.pngbin773 -> 916 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.pngbin788 -> 941 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_undecided.pngbin686 -> 884 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_winking.pngbin734 -> 895 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_wtf.pngbin747 -> 893 bytes
-rw-r--r--core/res/res/drawable-mdpi/emo_im_yelling.pngbin754 -> 927 bytes
-rw-r--r--core/res/res/drawable-mdpi/expander_close_holo_dark.9.pngbin285 -> 409 bytes
-rw-r--r--core/res/res/drawable-mdpi/expander_close_holo_light.9.pngbin298 -> 343 bytes
-rw-r--r--core/res/res/drawable-mdpi/expander_open_holo_dark.9.pngbin303 -> 424 bytes
-rw-r--r--core/res/res/drawable-mdpi/expander_open_holo_light.9.pngbin296 -> 338 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.pngbin1053 -> 1170 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.pngbin1068 -> 1152 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.pngbin1060 -> 1128 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.pngbin1017 -> 1128 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.pngbin111 -> 127 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.pngbin111 -> 127 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.pngbin112 -> 128 bytes
-rw-r--r--core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.pngbin112 -> 128 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_audio_ring_notif.pngbin878 -> 855 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.pngbin964 -> 918 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_input_delete.pngbin3769 -> 786 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.pngbin4734 -> 4412 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.pngbin4231 -> 4237 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.pngbin5437 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.pngbin1006 -> 1041 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_embed_play.pngbin3159 -> 934 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_ff.pngbin1410 -> 929 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_fullscreen.pngbin2125 -> 1396 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_next.pngbin1211 -> 864 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_pause.pngbin1065 -> 561 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_play.pngbin1360 -> 918 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_previous.pngbin1211 -> 858 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_rew.pngbin1410 -> 997 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_notification_ime_default.pngbin642 -> 642 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_suggestions_add.pngbin0 -> 353 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_suggestions_delete.pngbin0 -> 401 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.pngbin388 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.pngbin2498 -> 3222 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.pngbin481 -> 523 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.pngbin6335 -> 6481 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.pngbin4105 -> 4021 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.pngbin4080 -> 4025 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.pngbin463 -> 726 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.pngbin399 -> 455 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.pngbin368 -> 429 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.pngbin359 -> 421 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.pngbin470 -> 760 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.pngbin424 -> 501 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.pngbin441 -> 538 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.pngbin441 -> 538 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.pngbin368 -> 458 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.pngbin368 -> 458 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.pngbin441 -> 530 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.pngbin441 -> 530 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.pngbin453 -> 710 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.pngbin392 -> 447 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.pngbin355 -> 435 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.pngbin350 -> 426 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.pngbin460 -> 746 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.pngbin418 -> 495 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.pngbin433 -> 526 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.pngbin433 -> 526 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.pngbin355 -> 461 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.pngbin355 -> 457 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.pngbin433 -> 509 bytes
-rw-r--r--core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.pngbin433 -> 509 bytes
-rw-r--r--core/res/res/drawable-mdpi/panel_bg_holo_dark.9.pngbin321 -> 344 bytes
-rw-r--r--core/res/res/drawable-mdpi/popup_inline_error.9.pngbin1566 -> 1572 bytes
-rw-r--r--core/res/res/drawable-mdpi/popup_inline_error_above.9.pngbin1537 -> 1541 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.pngbin700 -> 728 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.pngbin739 -> 748 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.pngbin653 -> 701 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.pngbin680 -> 714 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.pngbin638 -> 663 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.pngbin668 -> 668 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.pngbin668 -> 664 bytes
-rw-r--r--core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.pngbin660 -> 662 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.pngbin1341 -> 1600 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_half_holo_light.pngbin1374 -> 1651 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.pngbin925 -> 1072 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_off_holo_light.pngbin948 -> 1090 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.pngbin1342 -> 1609 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_big_on_holo_light.pngbin1361 -> 1631 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.pngbin934 -> 1102 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_half_holo_light.pngbin959 -> 1133 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.pngbin689 -> 763 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_off_holo_light.pngbin709 -> 782 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.pngbin911 -> 1094 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_med_on_holo_light.pngbin937 -> 1125 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.pngbin678 -> 753 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_half_holo_light.pngbin696 -> 758 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.pngbin521 -> 566 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_off_holo_light.pngbin536 -> 561 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.pngbin677 -> 752 bytes
-rw-r--r--core/res/res/drawable-mdpi/rate_star_small_on_holo_light.pngbin688 -> 753 bytes
-rw-r--r--core/res/res/drawable-mdpi/scrubber_control_disabled_holo.pngbin650 -> 713 bytes
-rw-r--r--core/res/res/drawable-mdpi/scrubber_control_focused_holo.pngbin993 -> 1020 bytes
-rw-r--r--core/res/res/drawable-mdpi/scrubber_control_normal_holo.pngbin822 -> 796 bytes
-rw-r--r--core/res/res/drawable-mdpi/scrubber_control_pressed_holo.pngbin1241 -> 1306 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_16_inner_holo.pngbin1378 -> 553 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_16_outer_holo.pngbin1189 -> 491 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_20_inner_holo.pngbin1479 -> 627 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_20_outer_holo.pngbin1222 -> 548 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_48_inner_holo.pngbin2571 -> 1336 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_48_outer_holo.pngbin1892 -> 1165 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_76_inner_holo.pngbin3908 -> 2104 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_76_outer_holo.pngbin2816 -> 1808 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.pngbin299 -> 298 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.pngbin295 -> 291 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_notify_error.pngbin654 -> 662 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_notify_wifi_in_range.pngbin773 -> 993 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_sys_adb.pngbin1193 -> 302 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.pngbin194 -> 198 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.pngbin195 -> 200 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.pngbin206 -> 205 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.pngbin208 -> 207 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_holo_dark.9.pngbin170 -> 163 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_bg_holo_light.9.pngbin170 -> 163 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.pngbin432 -> 607 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.pngbin330 -> 537 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.pngbin287 -> 393 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.pngbin302 -> 413 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.pngbin306 -> 493 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_holo_light.9.pngbin301 -> 453 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.pngbin479 -> 676 bytes
-rw-r--r--core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.pngbin330 -> 578 bytes
-rw-r--r--core/res/res/drawable-mdpi/tab_selected_v4.9.pngbin323 -> 307 bytes
-rw-r--r--core/res/res/drawable-mdpi/tab_unselected_v4.9.pngbin294 -> 289 bytes
-rw-r--r--core/res/res/drawable-mdpi/text_select_handle_left.pngbin972 -> 1117 bytes
-rw-r--r--core/res/res/drawable-mdpi/text_select_handle_middle.pngbin1050 -> 1176 bytes
-rw-r--r--core/res/res/drawable-mdpi/text_select_handle_right.pngbin999 -> 1201 bytes
-rw-r--r--core/res/res/drawable-mdpi/vpn_connected.pngbin762 -> 502 bytes
-rw-r--r--core/res/res/drawable-mdpi/vpn_disconnected.pngbin756 -> 496 bytes
-rw-r--r--core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.pngbin0 -> 70 bytes
-rw-r--r--core/res/res/drawable-nodpi/platlogo.pngbin2058 -> 46426 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_disable.pngbin1959 -> 1756 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.pngbin2145 -> 2242 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.pngbin2123 -> 2204 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.pngbin1499 -> 1519 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.pngbin1491 -> 1495 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.pngbin3066 -> 3274 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.pngbin3073 -> 3329 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_holo.pngbin3188 -> 3392 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_holo_dark.pngbin2810 -> 2987 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_holo_light.pngbin2845 -> 3043 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_pressed.pngbin4595 -> 4168 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.pngbin4268 -> 4220 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.pngbin4091 -> 4133 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_check_on_selected.pngbin4882 -> 4499 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_code_lock_default.pngbin2944 -> 2893 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_code_lock_default_holo.pngbin802 -> 923 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_code_lock_touched.pngbin1692 -> 1672 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.pngbin713 -> 780 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_normal.9.pngbin1597 -> 1623 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_normal_disable.9.pngbin1498 -> 1518 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.pngbin1779 -> 1791 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_pressed.9.pngbin1885 -> 1889 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_selected.9.pngbin1154 -> 1185 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_small_normal.9.pngbin1325 -> 1364 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.pngbin1201 -> 1269 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.pngbin1738 -> 1702 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_small_selected.9.pngbin1057 -> 1061 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.pngbin2789 -> 2794 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.pngbin5697 -> 5725 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_dropdown_normal.9.pngbin3625 -> 3617 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.pngbin10434 -> 10445 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_dropdown_selected.9.pngbin11934 -> 11846 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.pngbin2997 -> 3004 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.pngbin3619 -> 3627 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.pngbin3721 -> 3729 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.pngbin3085 -> 3089 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.pngbin3745 -> 3751 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.pngbin3804 -> 3809 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.pngbin1263 -> 1267 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.pngbin1786 -> 1792 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.pngbin2052 -> 2054 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.pngbin1243 -> 1249 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.pngbin1841 -> 1847 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.pngbin2020 -> 2024 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.pngbin2015 -> 2027 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.pngbin2253 -> 2262 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.pngbin2077 -> 2084 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.pngbin2222 -> 2229 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_default.9.pngbin1424 -> 1428 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.pngbin2452 -> 2463 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.pngbin2517 -> 2523 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.pngbin1985 -> 1991 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.pngbin3151 -> 3159 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.pngbin3195 -> 3202 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_off.pngbin2669 -> 2674 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_off_disable.pngbin2933 -> 2798 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.pngbin5466 -> 5067 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_off_pressed.pngbin4760 -> 4733 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_off_selected.pngbin4697 -> 4663 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_on.pngbin5052 -> 5092 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_on_disable.pngbin5304 -> 4802 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.pngbin5287 -> 4818 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_on_pressed.pngbin4821 -> 4825 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_big_on_selected.pngbin4646 -> 4605 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.pngbin3410 -> 3672 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.pngbin3604 -> 4000 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.pngbin1405 -> 1514 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.pngbin1501 -> 1609 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.pngbin3649 -> 3934 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.pngbin3748 -> 4185 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.pngbin1575 -> 1749 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.pngbin1620 -> 1777 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.pngbin3963 -> 4429 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.pngbin4079 -> 4616 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.pngbin3502 -> 3795 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.pngbin3585 -> 3948 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.pngbin2217 -> 2480 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.pngbin2245 -> 2499 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.pngbin3732 -> 4060 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.pngbin3737 -> 4166 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.pngbin2385 -> 2657 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.pngbin2391 -> 2677 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.pngbin4106 -> 4536 bytes
-rw-r--r--core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.pngbin4057 -> 4571 bytes
-rw-r--r--core/res/res/drawable-xhdpi/code_lock_top.9.pngbin144 -> 141 bytes
-rw-r--r--core/res/res/drawable-xhdpi/contact_header_bg.9.pngbin254 -> 262 bytes
-rw-r--r--core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.pngbin135 -> 134 bytes
-rw-r--r--core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.pngbin137 -> 142 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_angel.pngbin1416 -> 1912 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_cool.pngbin1349 -> 1916 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_crying.pngbin1246 -> 1712 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_embarrassed.pngbin1319 -> 1814 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.pngbin1324 -> 1822 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_happy.pngbin1223 -> 1719 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_kissing.pngbin1408 -> 1888 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_laughing.pngbin1222 -> 1708 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.pngbin1485 -> 1986 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_money_mouth.pngbin1561 -> 2150 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_sad.pngbin1260 -> 1751 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_surprised.pngbin1235 -> 1742 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.pngbin1425 -> 1926 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_undecided.pngbin1169 -> 1582 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_winking.pngbin1288 -> 1762 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_wtf.pngbin1287 -> 1768 bytes
-rw-r--r--core/res/res/drawable-xhdpi/emo_im_yelling.pngbin1332 -> 1833 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_close_holo_dark.9.pngbin542 -> 753 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_close_holo_light.9.pngbin545 -> 624 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_ic_maximized.9.pngbin5331 -> 5345 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_ic_minimized.9.pngbin5514 -> 5523 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_open_holo_dark.9.pngbin623 -> 821 bytes
-rw-r--r--core/res/res/drawable-xhdpi/expander_open_holo_light.9.pngbin558 -> 636 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.pngbin2271 -> 2406 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.pngbin2237 -> 2405 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.pngbin2316 -> 2453 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.pngbin2192 -> 2411 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.pngbin117 -> 133 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.pngbin117 -> 133 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.pngbin117 -> 133 bytes
-rw-r--r--core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.pngbin117 -> 133 bytes
-rw-r--r--core/res/res/drawable-xhdpi/frame_gallery_thumb.9.pngbin1975 -> 1937 bytes
-rw-r--r--core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.pngbin1877 -> 1812 bytes
-rw-r--r--core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.pngbin1388 -> 1340 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_audio_ring_notif.pngbin1579 -> 1581 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.pngbin1971 -> 1949 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_input_delete.pngbin1743 -> 1307 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.pngbin12479 -> 11519 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.pngbin9630 -> 9615 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.pngbin13386 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.pngbin1759 -> 1760 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_notification_ime_default.pngbin1012 -> 1012 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_notification_overlay.9.pngbin1690 -> 1671 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_suggestions_add.pngbin0 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_suggestions_delete.pngbin0 -> 627 bytes
-rw-r--r--core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.pngbin2516 -> 2448 bytes
-rw-r--r--core/res/res/drawable-xhdpi/icon_highlight_square.9.pngbin3362 -> 3204 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.pngbin825 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.pngbin9531 -> 8836 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.pngbin802 -> 923 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.pngbin19681 -> 19083 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.pngbin11979 -> 11439 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.pngbin11992 -> 11335 bytes
-rw-r--r--core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.pngbin425 -> 433 bytes
-rw-r--r--core/res/res/drawable-xhdpi/list_section_header_holo_light.9.pngbin294 -> 301 bytes
-rw-r--r--core/res/res/drawable-xhdpi/menu_background.9.pngbin334 -> 332 bytes
-rw-r--r--core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.pngbin243 -> 243 bytes
-rw-r--r--core/res/res/drawable-xhdpi/menu_separator.9.pngbin146 -> 145 bytes
-rw-r--r--core/res/res/drawable-xhdpi/menu_submenu_background.9.pngbin1092 -> 1070 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.pngbin1083 -> 1333 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.pngbin2006 -> 2367 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.pngbin654 -> 910 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.pngbin534 -> 598 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.pngbin425 -> 522 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.pngbin425 -> 512 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.pngbin707 -> 969 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.pngbin587 -> 676 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.pngbin635 -> 756 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.pngbin635 -> 756 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_normal.9.pngbin1921 -> 2142 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.pngbin425 -> 564 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.pngbin424 -> 563 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.pngbin2926 -> 3259 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.pngbin623 -> 755 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.pngbin623 -> 755 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_down_selected.9.pngbin2990 -> 3258 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.pngbin594 -> 706 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_input_normal.9.pngbin1184 -> 1263 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.pngbin2111 -> 2284 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_input_selected.9.pngbin1786 -> 2045 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.pngbin1740 -> 2174 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.pngbin2574 -> 3193 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.pngbin659 -> 867 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.pngbin541 -> 597 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.pngbin426 -> 535 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.pngbin427 -> 515 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.pngbin684 -> 940 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.pngbin570 -> 679 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.pngbin612 -> 760 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.pngbin612 -> 760 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_normal.9.pngbin2788 -> 3195 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.pngbin424 -> 564 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.pngbin425 -> 563 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.pngbin3865 -> 4374 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.pngbin614 -> 742 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.pngbin614 -> 742 bytes
-rw-r--r--core/res/res/drawable-xhdpi/numberpicker_up_selected.9.pngbin3876 -> 4368 bytes
-rw-r--r--core/res/res/drawable-xhdpi/panel_background.9.pngbin2179 -> 2196 bytes
-rw-r--r--core/res/res/drawable-xhdpi/panel_bg_holo_light.9.pngbin680 -> 917 bytes
-rw-r--r--core/res/res/drawable-xhdpi/password_field_default.9.pngbin2871 -> 2877 bytes
-rw-r--r--core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.pngbin237 -> 240 bytes
-rw-r--r--core/res/res/drawable-xhdpi/popup_center_bright.9.pngbin253 -> 256 bytes
-rw-r--r--core/res/res/drawable-xhdpi/popup_full_bright.9.pngbin2199 -> 2202 bytes
-rw-r--r--core/res/res/drawable-xhdpi/popup_full_dark.9.pngbin2205 -> 2209 bytes
-rw-r--r--core/res/res/drawable-xhdpi/popup_inline_error.9.pngbin4445 -> 4398 bytes
-rw-r--r--core/res/res/drawable-xhdpi/popup_inline_error_above.9.pngbin4463 -> 4430 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.pngbin1488 -> 1509 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.pngbin1436 -> 1468 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.pngbin1342 -> 1375 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.pngbin1424 -> 1459 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.pngbin1289 -> 1333 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.pngbin1292 -> 1292 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.pngbin1284 -> 1288 bytes
-rw-r--r--core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.pngbin1279 -> 1285 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.pngbin702 -> 704 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.pngbin691 -> 691 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.pngbin727 -> 727 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.pngbin732 -> 732 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.pngbin685 -> 687 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.pngbin687 -> 688 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.pngbin707 -> 707 bytes
-rw-r--r--core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.pngbin698 -> 700 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_half.pngbin3018 -> 2695 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.pngbin2674 -> 3242 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.pngbin2820 -> 3367 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_off.pngbin1679 -> 1461 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.pngbin1776 -> 2091 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.pngbin1846 -> 2153 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_on.pngbin3443 -> 3071 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.pngbin2622 -> 3225 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.pngbin2723 -> 3306 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_half.pngbin2553 -> 2224 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.pngbin1958 -> 2304 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.pngbin2034 -> 2339 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_off.pngbin1421 -> 1283 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.pngbin1318 -> 1500 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.pngbin1358 -> 1546 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_on.pngbin2860 -> 2468 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.pngbin1953 -> 2286 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.pngbin2011 -> 2314 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_half.pngbin1558 -> 1538 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.pngbin1301 -> 1499 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.pngbin1328 -> 1528 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_off.pngbin861 -> 827 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.pngbin922 -> 1018 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.pngbin922 -> 1032 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_on.pngbin1593 -> 1643 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.pngbin1316 -> 1478 bytes
-rw-r--r--core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.pngbin1320 -> 1498 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.pngbin3772 -> 3797 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.pngbin596 -> 568 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.pngbin1162 -> 1287 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrubber_control_focused_holo.pngbin2123 -> 2153 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrubber_control_normal_holo.pngbin1539 -> 1567 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.pngbin2679 -> 2929 bytes
-rw-r--r--core/res/res/drawable-xhdpi/search_plate.9.pngbin420 -> 423 bytes
-rw-r--r--core/res/res/drawable-xhdpi/settings_header_raw.9.pngbin21167 -> 21143 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_16_inner_holo.pngbin1935 -> 938 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_16_outer_holo.pngbin1504 -> 808 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_20_inner_holo.pngbin2240 -> 1160 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_20_outer_holo.pngbin1669 -> 1007 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_48_inner_holo.pngbin4981 -> 2769 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_48_outer_holo.pngbin3570 -> 2432 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_76_inner_holo.pngbin7567 -> 4534 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_76_outer_holo.pngbin5445 -> 4020 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.pngbin519 -> 519 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.pngbin515 -> 511 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.pngbin993 -> 997 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.pngbin951 -> 952 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_normal.9.pngbin2006 -> 2008 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_press.9.pngbin3987 -> 4005 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_select.9.pngbin4234 -> 4221 bytes
-rw-r--r--core/res/res/drawable-xhdpi/stat_notify_error.pngbin1099 -> 1142 bytes
-rw-r--r--core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.pngbin1411 -> 1979 bytes
-rw-r--r--core/res/res/drawable-xhdpi/stat_sys_adb.pngbin1258 -> 1414 bytes
-rw-r--r--core/res/res/drawable-xhdpi/status_bar_header_background.9.pngbin243 -> 248 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.pngbin940 -> 1234 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.pngbin659 -> 902 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.pngbin588 -> 676 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.pngbin609 -> 708 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.pngbin613 -> 825 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.pngbin614 -> 760 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.pngbin1021 -> 1320 bytes
-rw-r--r--core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.pngbin665 -> 1030 bytes
-rw-r--r--core/res/res/drawable-xhdpi/tab_selected_v4.9.pngbin682 -> 682 bytes
-rw-r--r--core/res/res/drawable-xhdpi/tab_unselected_v4.9.pngbin414 -> 414 bytes
-rw-r--r--core/res/res/drawable-xhdpi/text_select_handle_left.pngbin1989 -> 2239 bytes
-rw-r--r--core/res/res/drawable-xhdpi/text_select_handle_middle.pngbin2249 -> 2422 bytes
-rw-r--r--core/res/res/drawable-xhdpi/text_select_handle_right.pngbin2182 -> 2373 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_default.9.pngbin944 -> 951 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_disabled.9.pngbin1139 -> 1142 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_disabled_selected.9.pngbin1657 -> 1665 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_default.9.pngbin1377 -> 1381 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_empty_default.9.pngbin1821 -> 1817 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.pngbin2444 -> 2449 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.pngbin2222 -> 2226 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_pressed.9.pngbin2408 -> 2415 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_search_selected.9.pngbin1847 -> 1852 bytes
-rw-r--r--core/res/res/drawable-xhdpi/textfield_selected.9.pngbin1359 -> 1361 bytes
-rw-r--r--core/res/res/drawable-xhdpi/title_bar_medium.9.pngbin333 -> 342 bytes
-rw-r--r--core/res/res/drawable-xhdpi/title_bar_portrait.9.pngbin237 -> 242 bytes
-rw-r--r--core/res/res/drawable-xhdpi/title_bar_tall.9.pngbin356 -> 370 bytes
-rw-r--r--core/res/res/drawable-xhdpi/vpn_connected.pngbin2017 -> 688 bytes
-rw-r--r--core/res/res/drawable-xhdpi/vpn_disconnected.pngbin1973 -> 717 bytes
-rw-r--r--core/res/res/drawable-xhdpi/zoom_plate.9.pngbin2979 -> 2975 bytes
-rw-r--r--core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.pngbin860 -> 0 bytes
-rw-r--r--core/res/res/drawable/btn_cab_done_holo_dark.xml5
-rw-r--r--core/res/res/drawable/btn_cab_done_holo_light.xml5
-rw-r--r--core/res/res/drawable/item_background_holo_dark.xml2
-rw-r--r--core/res/res/drawable/item_background_holo_light.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_glogin_unlock.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_lock.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_password_landscape.xml14
-rw-r--r--core/res/res/layout/keyguard_screen_password_portrait.xml15
-rw-r--r--core/res/res/layout/keyguard_screen_sim_pin_landscape.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_sim_pin_portrait.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_sim_puk_landscape.xml2
-rw-r--r--core/res/res/layout/keyguard_screen_tab_unlock.xml5
-rw-r--r--core/res/res/layout/keyguard_screen_tab_unlock_land.xml1
-rw-r--r--core/res/res/layout/keyguard_screen_unlock_landscape.xml14
-rw-r--r--core/res/res/layout/keyguard_screen_unlock_portrait.xml18
-rw-r--r--core/res/res/layout/number_picker.xml4
-rw-r--r--core/res/res/layout/status_bar_latest_event_content_large_icon.xml4
-rw-r--r--core/res/res/layout/text_edit_suggestion_item.xml3
-rw-r--r--core/res/res/layout/volume_adjust.xml1
-rw-r--r--core/res/res/layout/webview_find.xml2
-rw-r--r--core/res/res/values-af/strings.xml9
-rw-r--r--core/res/res/values-am/strings.xml32
-rw-r--r--core/res/res/values-ar/strings.xml22
-rw-r--r--core/res/res/values-bg/strings.xml22
-rw-r--r--core/res/res/values-ca/strings.xml9
-rw-r--r--core/res/res/values-cs/strings.xml22
-rw-r--r--core/res/res/values-da/strings.xml22
-rw-r--r--core/res/res/values-de/strings.xml22
-rw-r--r--core/res/res/values-el/strings.xml24
-rw-r--r--core/res/res/values-en-rGB/strings.xml9
-rw-r--r--core/res/res/values-es-rUS/strings.xml22
-rw-r--r--core/res/res/values-es/strings.xml22
-rw-r--r--core/res/res/values-fa/strings.xml22
-rw-r--r--core/res/res/values-fi/strings.xml22
-rw-r--r--core/res/res/values-fr/strings.xml22
-rw-r--r--core/res/res/values-hr/strings.xml22
-rw-r--r--core/res/res/values-hu/strings.xml22
-rw-r--r--core/res/res/values-in/strings.xml22
-rw-r--r--core/res/res/values-it/strings.xml9
-rw-r--r--core/res/res/values-iw/strings.xml22
-rw-r--r--core/res/res/values-ja/strings.xml22
-rw-r--r--core/res/res/values-ko/strings.xml22
-rw-r--r--core/res/res/values-lt/strings.xml22
-rw-r--r--core/res/res/values-lv/strings.xml22
-rw-r--r--core/res/res/values-mcc204-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc204-da/strings.xml19
-rw-r--r--core/res/res/values-mcc204-de/strings.xml19
-rw-r--r--core/res/res/values-mcc204-el/strings.xml19
-rw-r--r--core/res/res/values-mcc204-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc204-es/strings.xml19
-rw-r--r--core/res/res/values-mcc204-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc204-it/strings.xml19
-rw-r--r--core/res/res/values-mcc204-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc204-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc204-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc204-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc204-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc204-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc204-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc204-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc204-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc204-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc204-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-mcc230-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc230-da/strings.xml19
-rw-r--r--core/res/res/values-mcc230-de/strings.xml19
-rw-r--r--core/res/res/values-mcc230-el/strings.xml19
-rw-r--r--core/res/res/values-mcc230-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc230-es/strings.xml19
-rw-r--r--core/res/res/values-mcc230-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc230-it/strings.xml19
-rw-r--r--core/res/res/values-mcc230-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc230-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc230-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc230-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc230-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc230-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc230-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc230-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc230-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc230-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc230-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-mcc232-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc232-da/strings.xml19
-rw-r--r--core/res/res/values-mcc232-de/strings.xml19
-rw-r--r--core/res/res/values-mcc232-el/strings.xml19
-rw-r--r--core/res/res/values-mcc232-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc232-es/strings.xml19
-rw-r--r--core/res/res/values-mcc232-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc232-it/strings.xml19
-rw-r--r--core/res/res/values-mcc232-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc232-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc232-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc232-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc232-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc232-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc232-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc232-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc232-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc232-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc232-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-mcc234-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc234-da/strings.xml19
-rw-r--r--core/res/res/values-mcc234-de/strings.xml19
-rw-r--r--core/res/res/values-mcc234-el/strings.xml19
-rw-r--r--core/res/res/values-mcc234-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc234-es/strings.xml19
-rw-r--r--core/res/res/values-mcc234-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc234-it/strings.xml19
-rw-r--r--core/res/res/values-mcc234-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc234-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc234-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc234-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc234-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc234-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc234-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc234-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc234-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc234-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc234-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-mcc260-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc260-da/strings.xml19
-rw-r--r--core/res/res/values-mcc260-de/strings.xml19
-rw-r--r--core/res/res/values-mcc260-el/strings.xml19
-rw-r--r--core/res/res/values-mcc260-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc260-es/strings.xml19
-rw-r--r--core/res/res/values-mcc260-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc260-it/strings.xml19
-rw-r--r--core/res/res/values-mcc260-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc260-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc260-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc260-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc260-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc260-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc260-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc260-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc260-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc260-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc260-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-mcc262-cs/strings.xml19
-rw-r--r--core/res/res/values-mcc262-da/strings.xml19
-rw-r--r--core/res/res/values-mcc262-de/strings.xml19
-rw-r--r--core/res/res/values-mcc262-el/strings.xml19
-rw-r--r--core/res/res/values-mcc262-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-mcc262-es/strings.xml19
-rw-r--r--core/res/res/values-mcc262-fr/strings.xml19
-rw-r--r--core/res/res/values-mcc262-it/strings.xml19
-rw-r--r--core/res/res/values-mcc262-ja/strings.xml19
-rw-r--r--core/res/res/values-mcc262-ko/strings.xml19
-rw-r--r--core/res/res/values-mcc262-nl/strings.xml19
-rw-r--r--core/res/res/values-mcc262-pl/strings.xml19
-rw-r--r--core/res/res/values-mcc262-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-mcc262-pt/strings.xml19
-rw-r--r--core/res/res/values-mcc262-ru/strings.xml19
-rw-r--r--core/res/res/values-mcc262-sv/strings.xml19
-rw-r--r--core/res/res/values-mcc262-tr/strings.xml19
-rw-r--r--core/res/res/values-mcc262-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-mcc262-zh-rTW/strings.xml19
-rw-r--r--core/res/res/values-ms/strings.xml14
-rw-r--r--core/res/res/values-nb/strings.xml22
-rw-r--r--core/res/res/values-nl/strings.xml22
-rw-r--r--core/res/res/values-pl/strings.xml22
-rw-r--r--core/res/res/values-pt-rPT/strings.xml22
-rw-r--r--core/res/res/values-pt/strings.xml22
-rw-r--r--core/res/res/values-ro/strings.xml22
-rw-r--r--core/res/res/values-ru/strings.xml40
-rw-r--r--core/res/res/values-sk/strings.xml22
-rw-r--r--core/res/res/values-sl/strings.xml22
-rw-r--r--core/res/res/values-sr/strings.xml22
-rw-r--r--core/res/res/values-sv/strings.xml22
-rw-r--r--core/res/res/values-sw/strings.xml46
-rw-r--r--core/res/res/values-sw600dp/config.xml3
-rw-r--r--core/res/res/values-th/strings.xml22
-rw-r--r--core/res/res/values-tl/strings.xml22
-rw-r--r--core/res/res/values-tr/strings.xml22
-rw-r--r--core/res/res/values-uk/strings.xml22
-rw-r--r--core/res/res/values-vi/strings.xml22
-rw-r--r--core/res/res/values-zh-rCN/strings.xml22
-rw-r--r--core/res/res/values-zh-rTW/donottranslate-cldr.xml28
-rw-r--r--core/res/res/values-zh-rTW/strings.xml22
-rw-r--r--core/res/res/values-zu/strings.xml50
-rw-r--r--core/res/res/values/attrs_manifest.xml5
-rw-r--r--core/res/res/values/colors.xml3
-rwxr-xr-xcore/res/res/values/config.xml14
-rw-r--r--core/res/res/values/dimens.xml7
-rwxr-xr-xcore/res/res/values/strings.xml6
-rw-r--r--core/res/res/values/styles.xml14
-rw-r--r--core/res/res/values/themes.xml4
-rw-r--r--core/tests/bandwidthtests/Android.mk2
-rw-r--r--core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java36
-rw-r--r--core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java46
-rw-r--r--core/tests/coretests/apks/install_verifier_bad/Android.mk11
-rw-r--r--core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml23
-rw-r--r--core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml6
-rw-r--r--core/tests/coretests/apks/install_verifier_good/Android.mk10
-rw-r--r--core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml23
-rw-r--r--core/tests/coretests/apks/install_verifier_good/res/values/strings.xml6
-rw-r--r--core/tests/coretests/src/android/net/http/AbstractProxyTest.java17
-rw-r--r--docs/html/guide/appendix/media-formats.jd137
-rw-r--r--docs/html/guide/guide_toc.cs22
-rw-r--r--docs/html/guide/practices/design/jni.jd168
-rw-r--r--docs/html/guide/practices/ui_guidelines/widget_design.jd428
-rw-r--r--docs/html/guide/topics/appwidgets/index.jd43
-rw-r--r--docs/html/guide/topics/resources/more-resources.jd2
-rw-r--r--docs/html/guide/topics/ui/notifiers/notifications.jd357
-rw-r--r--docs/html/guide/topics/usb/adk.jd9
-rwxr-xr-xdocs/html/images/custom_message.pngbin11120 -> 17871 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Landscape.pngbin3504 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psdbin84164 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Portrait.pngbin3765 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psdbin192054 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Landscape.pngbin4851 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psdbin356070 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Portrait.pngbin4943 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psdbin369054 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Landscape.pngbin3270 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psdbin114336 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Portrait.pngbin3403 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psdbin73853 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/Add_Noise.pngbin68306 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/Layer_Style.pngbin80200 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/Music_widget_button_states.psdbin948899 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/alignment.pngbin44231 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/buttons.pngbin6358 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/file_format.pngbin128651 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/landscape_sizes.pngbin88782 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/music_example.pngbin0 -> 6381 bytes
-rw-r--r--docs/html/images/widget_design/music_example_layouts.pngbin0 -> 33988 bytes
-rw-r--r--docs/html/images/widget_design/music_example_redline.pngbin0 -> 6055 bytes
-rw-r--r--docs/html/images/widget_design/music_example_stretched.pngbin0 -> 7688 bytes
-rw-r--r--docs/html/images/widget_design/portrait_sizes.pngbin97525 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/widget_examples.pngbin126431 -> 50203 bytes
-rw-r--r--docs/html/images/widget_design/widget_sizes_landscape.pngbin113725 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/widget_sizes_portrait.pngbin143836 -> 0 bytes
-rw-r--r--docs/html/images/widget_design/widget_template_excerpts.pngbin0 -> 5707 bytes
-rw-r--r--docs/html/images/widget_design/widget_terms.pngbin0 -> 4830 bytes
-rw-r--r--docs/html/resources/articles/speech-input.jd4
-rw-r--r--docs/html/resources/resources-data.js39
-rw-r--r--docs/html/sdk/android-3.2.jd4
-rw-r--r--docs/html/sdk/index.jd24
-rw-r--r--docs/html/sdk/sdk_toc.cs11
-rw-r--r--docs/html/sdk/tools-notes.jd47
-rw-r--r--docs/html/shareables/app_widget_templates-v4.0.zipbin0 -> 140221 bytes
-rw-r--r--drm/drmserver/DrmManager.cpp24
-rw-r--r--graphics/java/android/renderscript/ProgramRaster.java7
-rw-r--r--graphics/java/android/renderscript/RenderScript.java9
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp10
-rw-r--r--include/gui/SurfaceTexture.h11
-rw-r--r--include/media/stagefright/ACodec.h7
-rw-r--r--include/surfaceflinger/ISurfaceComposer.h8
-rw-r--r--include/ui/Rect.h2
-rw-r--r--include/utils/threads.h4
-rw-r--r--libs/gui/SurfaceTexture.cpp145
-rw-r--r--libs/hwui/LayerRenderer.cpp6
-rw-r--r--libs/hwui/Rect.h62
-rw-r--r--libs/hwui/TextDropShadowCache.h2
-rw-r--r--libs/rs/driver/rsdCore.cpp2
-rw-r--r--libs/rs/driver/rsdGL.cpp5
-rw-r--r--libs/rs/rs.spec3
-rw-r--r--libs/rs/rsContext.cpp22
-rw-r--r--libs/rs/rsProgramRaster.cpp27
-rw-r--r--libs/rs/rsProgramRaster.h9
-rw-r--r--libs/utils/Android.mk8
-rw-r--r--libs/utils/Threads.cpp8
-rw-r--r--media/java/android/media/AudioService.java28
-rw-r--r--media/java/android/media/MediaScanner.java54
-rw-r--r--media/java/android/media/Ringtone.java20
-rw-r--r--media/jni/android_media_MediaPlayer.cpp4
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp13
-rw-r--r--media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp22
-rw-r--r--media/libmediaplayerservice/nuplayer/HTTPLiveSource.h5
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp151
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.h30
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp15
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h3
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp28
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDriver.h7
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp89
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h28
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerSource.h5
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h4
-rw-r--r--media/libmediaplayerservice/nuplayer/StreamingSource.cpp16
-rw-r--r--media/libmediaplayerservice/nuplayer/StreamingSource.h5
-rw-r--r--media/libstagefright/ACodec.cpp137
-rw-r--r--media/libstagefright/AVIExtractor.cpp445
-rw-r--r--media/libstagefright/AudioPlayer.cpp3
-rw-r--r--media/libstagefright/AwesomePlayer.cpp8
-rwxr-xr-xmedia/libstagefright/OMXCodec.cpp12
-rw-r--r--media/libstagefright/SampleTable.cpp101
-rw-r--r--media/libstagefright/avc_utils.cpp24
-rw-r--r--media/libstagefright/chromium_http/support.cpp22
-rw-r--r--media/libstagefright/foundation/AMessage.cpp9
-rw-r--r--media/libstagefright/include/AVIExtractor.h6
-rw-r--r--media/libstagefright/include/SampleTable.h6
-rw-r--r--media/libstagefright/include/avc_utils.h1
-rw-r--r--media/libstagefright/matroska/MatroskaExtractor.cpp108
-rw-r--r--media/libstagefright/omx/OMX.cpp2
-rw-r--r--media/libstagefright/omx/SimpleSoftOMXComponent.cpp2
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java15
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java26
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java13
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java30
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java19
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java20
-rw-r--r--native/include/android/rect.h3
-rw-r--r--opengl/java/android/opengl/Matrix.java191
-rw-r--r--opengl/libs/EGL/egl_object.h2
-rw-r--r--opengl/libs/GLES2_dbg/Android.mk3
-rw-r--r--opengl/libs/GLES2_dbg/src/dbgcontext.cpp24
-rw-r--r--opengl/libs/GLES2_dbg/src/egl.cpp6
-rw-r--r--opengl/libs/GLES2_dbg/src/header.h4
-rw-r--r--opengl/libs/GLES2_dbg/src/vertex.cpp19
-rw-r--r--opengl/libs/GLES2_dbg/test/test_main.cpp2
-rw-r--r--opengl/libs/GLES2_dbg/test/test_server.cpp2
-rw-r--r--opengl/libs/GLES2_dbg/test/test_socket.cpp2
-rw-r--r--packages/BackupRestoreConfirmation/res/values-am/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ar/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-bg/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-cs/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-da/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-de/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-el/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-es/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-fa/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-fi/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-fr/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hr/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hu/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-in/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-iw/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ja/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ko/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-lt/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-lv/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-nb/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-nl/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-pl/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-pt/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ro/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ru/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-sk/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-sl/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-sr/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-sv/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-sw/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-th/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-tl/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-tr/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-uk/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-vi/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-zh-rCN/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml21
-rw-r--r--packages/BackupRestoreConfirmation/res/values-zu/strings.xml21
-rw-r--r--packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java1
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.pngbin1032 -> 1043 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.pngbin3015 -> 3026 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.pngbin852 -> 840 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.pngbin1550 -> 1565 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.pngbin1427 -> 1390 bytes
-rw-r--r--packages/SystemUI/res/drawable/notification_row_bg.xml22
-rw-r--r--packages/SystemUI/res/layout-land/status_bar_recent_item.xml4
-rw-r--r--packages/SystemUI/res/layout-port/status_bar_recent_item.xml4
-rw-r--r--packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml4
-rw-r--r--packages/SystemUI/res/layout/signal_cluster_view.xml6
-rw-r--r--packages/SystemUI/res/layout/status_bar_notification_row.xml5
-rw-r--r--packages/SystemUI/res/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml3
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml3
-rw-r--r--packages/SystemUI/res/values-da/strings.xml3
-rw-r--r--packages/SystemUI/res/values-de/strings.xml3
-rw-r--r--packages/SystemUI/res/values-el/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml3
-rw-r--r--packages/SystemUI/res/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-in/strings.xml3
-rw-r--r--packages/SystemUI/res/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml3
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml3
-rw-r--r--packages/SystemUI/res/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml7
-rw-r--r--packages/SystemUI/res/values/colors.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java3
-rw-r--r--packages/VpnDialogs/res/layout/confirm.xml81
-rw-r--r--packages/VpnDialogs/res/values-am/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ar/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-bg/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-cs/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-da/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-de/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-el/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-es-rUS/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-es/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-fa/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-fi/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-fr/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-hr/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-hu/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-in/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-iw/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ja/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ko/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-lt/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-lv/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-nb/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-nl/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-pl/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-pt-rPT/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-pt/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ro/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ru/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-sk/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-sl/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-sr/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-sv/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-sw/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-th/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-tl/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-tr/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-uk/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-vi/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-zh-rCN/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-zh-rTW/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-zu/strings.xml4
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java6
-rw-r--r--policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java3
-rw-r--r--policy/src/com/android/internal/policy/impl/KeyguardViewBase.java14
-rw-r--r--policy/src/com/android/internal/policy/impl/KeyguardViewManager.java14
-rw-r--r--policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java52
-rw-r--r--policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java176
-rw-r--r--policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java6
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java69
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java379
-rw-r--r--services/audioflinger/AudioFlinger.cpp15
-rw-r--r--services/audioflinger/AudioResampler.cpp16
-rw-r--r--services/java/com/android/server/AlarmManagerService.java2
-rw-r--r--services/java/com/android/server/BackupManagerService.java48
-rw-r--r--services/java/com/android/server/ConnectivityService.java60
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java3
-rw-r--r--services/java/com/android/server/PowerManagerService.java134
-rw-r--r--services/java/com/android/server/SystemServer.java3
-rw-r--r--services/java/com/android/server/TextServicesManagerService.java3
-rw-r--r--services/java/com/android/server/WallpaperManagerService.java130
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java28
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java79
-rw-r--r--services/java/com/android/server/am/ActivityRecord.java2
-rw-r--r--services/java/com/android/server/am/ActivityStack.java49
-rw-r--r--services/java/com/android/server/am/ContentProviderRecord.java8
-rw-r--r--services/java/com/android/server/am/IntentBindRecord.java4
-rw-r--r--services/java/com/android/server/am/PendingIntentRecord.java5
-rw-r--r--services/java/com/android/server/am/ServiceRecord.java2
-rw-r--r--services/java/com/android/server/am/TaskRecord.java4
-rw-r--r--services/java/com/android/server/connectivity/Tethering.java17
-rw-r--r--services/java/com/android/server/net/NetworkStatsService.java99
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java345
-rw-r--r--services/java/com/android/server/pm/PackageVerificationResponse.java28
-rw-r--r--services/java/com/android/server/pm/PackageVerificationState.java149
-rw-r--r--services/java/com/android/server/wm/DragState.java19
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java330
-rw-r--r--services/java/com/android/server/wm/WindowState.java15
-rw-r--r--services/surfaceflinger/Layer.cpp5
-rw-r--r--services/surfaceflinger/Layer.h1
-rw-r--r--services/surfaceflinger/LayerBase.h2
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h2
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java205
-rw-r--r--telephony/java/android/telephony/PhoneNumberUtils.java40
-rw-r--r--telephony/java/com/android/internal/telephony/CallerInfo.java4
-rw-r--r--telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java4
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java5
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java17
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java2
-rw-r--r--telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java15
-rw-r--r--test-runner/src/android/test/InstrumentationTestRunner.java12
-rw-r--r--test-runner/src/android/test/mock/MockPackageManager.java2
-rw-r--r--tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java14
-rw-r--r--tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java3
-rw-r--r--tests/HwAccelerationTest/AndroidManifest.xml9
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java125
-rw-r--r--tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java26
-rw-r--r--tools/aapt/Command.cpp10
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java5
-rwxr-xr-xtools/orientationplot/orientationplot.py132
-rw-r--r--wifi/java/android/net/wifi/WifiNative.java16
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java25
1316 files changed, 11959 insertions, 4846 deletions
diff --git a/Android.mk b/Android.mk
index 91850d5af79d..be8c25b714a1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -381,7 +381,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \
-since ./frameworks/base/api/11.xml 11 \
-since ./frameworks/base/api/12.xml 12 \
-since ./frameworks/base/api/13.xml 13 \
- -since ./frameworks/base/api/current.txt ICS \
+ -since ./frameworks/base/api/14.txt 14 \
-werror -hide 113 \
-overview $(LOCAL_PATH)/core/java/overview.html
@@ -473,7 +473,7 @@ web_docs_sample_code_flags := \
## SDK version identifiers used in the published docs
# major[.minor] version for current SDK. (full releases only)
-framework_docs_SDK_VERSION:=3.2
+framework_docs_SDK_VERSION:=4.0
# release version (ie "Release x") (full releases only)
framework_docs_SDK_REL_ID:=1
diff --git a/api/13.xml b/api/13.xml
index 2bfa04ed8bc1..73995deca1ab 100644
--- a/api/13.xml
+++ b/api/13.xml
@@ -288451,7 +288451,7 @@
type="double"
transient="false"
volatile="false"
- value="(-1.0 / 0.0)"
+ value="(-1.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -288462,7 +288462,7 @@
type="double"
transient="false"
volatile="false"
- value="(0.0 / 0.0)"
+ value="(0.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -288473,7 +288473,7 @@
type="double"
transient="false"
volatile="false"
- value="(1.0 / 0.0)"
+ value="(1.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289154,7 +289154,7 @@
type="float"
transient="false"
volatile="false"
- value="(-1.0f / 0.0f)"
+ value="(-1.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289165,7 +289165,7 @@
type="float"
transient="false"
volatile="false"
- value="(0.0f / 0.0f)"
+ value="(0.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289176,7 +289176,7 @@
type="float"
transient="false"
volatile="false"
- value="(1.0f / 0.0f)"
+ value="(1.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
diff --git a/build/phone-xhdpi-1024-dalvik-heap.mk b/build/phone-xhdpi-1024-dalvik-heap.mk
new file mode 100644
index 000000000000..f76535a7ad63
--- /dev/null
+++ b/build/phone-xhdpi-1024-dalvik-heap.mk
@@ -0,0 +1,22 @@
+#
+# Copyright (C) 2011 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.
+#
+
+# Provides overrides to configure the Dalvik heap for a standard tablet device.
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ dalvik.vm.heapstartsize=8m \
+ dalvik.vm.heapgrowthlimit=64m \
+ dalvik.vm.heapsize=256m
diff --git a/cmds/ip-up-vpn/ip-up-vpn.c b/cmds/ip-up-vpn/ip-up-vpn.c
index e9ee95d67680..0e6286f9279c 100644
--- a/cmds/ip-up-vpn/ip-up-vpn.c
+++ b/cmds/ip-up-vpn/ip-up-vpn.c
@@ -40,6 +40,7 @@ static const char *env(const char *name) {
static int set_address(struct sockaddr *sa, const char *address) {
sa->sa_family = AF_INET;
+ errno = EINVAL;
return inet_pton(AF_INET, address, &((struct sockaddr_in *)sa)->sin_addr);
}
@@ -124,10 +125,11 @@ int main(int argc, char **argv)
}
/* Set the netmask. */
- if (!set_address(&ifr.ifr_netmask, env("INTERNAL_NETMASK4")) ||
- ioctl(s, SIOCSIFNETMASK, &ifr)) {
- LOGE("Cannot set netmask: %s", strerror(errno));
- return 1;
+ if (set_address(&ifr.ifr_netmask, env("INTERNAL_NETMASK4"))) {
+ if (ioctl(s, SIOCSIFNETMASK, &ifr)) {
+ LOGE("Cannot set netmask: %s", strerror(errno));
+ return 1;
+ }
}
/* TODO: Send few packets to trigger phase 2? */
diff --git a/cmds/stagefright/sf2.cpp b/cmds/stagefright/sf2.cpp
index 6fa66cf3524e..f547e019171c 100644
--- a/cmds/stagefright/sf2.cpp
+++ b/cmds/stagefright/sf2.cpp
@@ -46,7 +46,8 @@ struct Controller : public AHandler {
mDecodeAudio(decodeAudio),
mSurface(surface),
mRenderToSurface(renderToSurface),
- mCodec(new ACodec) {
+ mCodec(new ACodec),
+ mIsVorbis(false) {
CHECK(!mDecodeAudio || mSurface == NULL);
}
@@ -85,6 +86,12 @@ protected:
if (!strncasecmp(mDecodeAudio ? "audio/" : "video/",
mime, 6)) {
mSource = extractor->getTrack(i);
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
+ mIsVorbis = true;
+ } else {
+ mIsVorbis = false;
+ }
break;
}
}
@@ -227,6 +234,7 @@ private:
bool mRenderToSurface;
sp<ACodec> mCodec;
sp<MediaSource> mSource;
+ bool mIsVorbis;
Vector<sp<ABuffer> > mCSD;
size_t mCSDIndex;
@@ -369,6 +377,20 @@ private:
buffer->meta()->setInt32("csd", true);
mCSD.push(buffer);
+ } else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) {
+ sp<ABuffer> buffer = new ABuffer(size);
+ memcpy(buffer->data(), data, size);
+
+ buffer->meta()->setInt32("csd", true);
+ mCSD.push(buffer);
+
+ CHECK(meta->findData(kKeyVorbisBooks, &type, &data, &size));
+
+ buffer = new ABuffer(size);
+ memcpy(buffer->data(), data, size);
+
+ buffer->meta()->setInt32("csd", true);
+ mCSD.push(buffer);
}
int32_t maxInputSize;
@@ -423,10 +445,17 @@ private:
}
}
- if (inBuffer->range_length() > sizeLeft) {
+ size_t sizeNeeded = inBuffer->range_length();
+ if (mIsVorbis) {
+ // Vorbis data is suffixed with the number of
+ // valid samples on the page.
+ sizeNeeded += sizeof(int32_t);
+ }
+
+ if (sizeNeeded > sizeLeft) {
if (outBuffer->size() == 0) {
LOGE("Unable to fit even a single input buffer of size %d.",
- inBuffer->range_length());
+ sizeNeeded);
}
CHECK_GT(outBuffer->size(), 0u);
@@ -448,10 +477,22 @@ private:
+ inBuffer->range_offset(),
inBuffer->range_length());
+ if (mIsVorbis) {
+ int32_t numPageSamples;
+ if (!inBuffer->meta_data()->findInt32(
+ kKeyValidSamples, &numPageSamples)) {
+ numPageSamples = -1;
+ }
+
+ memcpy(outBuffer->data()
+ + outBuffer->size() + inBuffer->range_length(),
+ &numPageSamples, sizeof(numPageSamples));
+ }
+
outBuffer->setRange(
- 0, outBuffer->size() + inBuffer->range_length());
+ 0, outBuffer->size() + sizeNeeded);
- sizeLeft -= inBuffer->range_length();
+ sizeLeft -= sizeNeeded;
inBuffer->release();
inBuffer = NULL;
@@ -569,12 +610,16 @@ int main(int argc, char **argv) {
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
surface = control->getSurface();
CHECK(surface != NULL);
+
+ CHECK_EQ((status_t)OK,
+ native_window_api_connect(
+ surface.get(), NATIVE_WINDOW_API_MEDIA));
}
sp<Controller> controller =
@@ -589,6 +634,10 @@ int main(int argc, char **argv) {
looper->unregisterHandler(controller->id());
if (!decodeAudio && useSurface) {
+ CHECK_EQ((status_t)OK,
+ native_window_api_disconnect(
+ surface.get(), NATIVE_WINDOW_API_MEDIA));
+
composerClient->dispose();
}
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 34f0a64f0b72..528d197dd0fb 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -133,6 +133,39 @@ static void displayAVCProfileLevelIfPossible(const sp<MetaData>& meta) {
}
}
+static void dumpSource(const sp<MediaSource> &source, const String8 &filename) {
+ FILE *out = fopen(filename.string(), "wb");
+
+ CHECK_EQ((status_t)OK, source->start());
+
+ status_t err;
+ for (;;) {
+ MediaBuffer *mbuf;
+ err = source->read(&mbuf);
+
+ if (err == INFO_FORMAT_CHANGED) {
+ continue;
+ } else if (err != OK) {
+ break;
+ }
+
+ CHECK_EQ(
+ fwrite((const uint8_t *)mbuf->data() + mbuf->range_offset(),
+ 1,
+ mbuf->range_length(),
+ out),
+ (ssize_t)mbuf->range_length());
+
+ mbuf->release();
+ mbuf = NULL;
+ }
+
+ CHECK_EQ((status_t)OK, source->stop());
+
+ fclose(out);
+ out = NULL;
+}
+
static void playSource(OMXClient *client, sp<MediaSource> &source) {
sp<MetaData> meta = source->getFormat();
@@ -578,6 +611,7 @@ static void usage(const char *me) {
"(video only)\n");
fprintf(stderr, " -S allocate buffers from a surface\n");
fprintf(stderr, " -T allocate buffers from a surface texture\n");
+ fprintf(stderr, " -d(ump) filename (raw stream data to a file)\n");
}
int main(int argc, char **argv) {
@@ -590,6 +624,8 @@ int main(int argc, char **argv) {
bool seekTest = false;
bool useSurfaceAlloc = false;
bool useSurfaceTexAlloc = false;
+ bool dumpStream = false;
+ String8 dumpStreamFilename;
gNumRepetitions = 1;
gMaxNumFrames = 0;
gReproduceBug = -1;
@@ -604,7 +640,7 @@ int main(int argc, char **argv) {
sp<LiveSession> liveSession;
int res;
- while ((res = getopt(argc, argv, "han:lm:b:ptsrow:kxST")) >= 0) {
+ while ((res = getopt(argc, argv, "han:lm:b:ptsrow:kxSTd:")) >= 0) {
switch (res) {
case 'a':
{
@@ -612,6 +648,13 @@ int main(int argc, char **argv) {
break;
}
+ case 'd':
+ {
+ dumpStream = true;
+ dumpStreamFilename.setTo(optarg);
+ break;
+ }
+
case 'l':
{
listComponents = true;
@@ -874,7 +917,7 @@ int main(int argc, char **argv) {
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
@@ -886,6 +929,10 @@ int main(int argc, char **argv) {
sp<SurfaceTexture> texture = new SurfaceTexture(0 /* tex */);
gSurface = new SurfaceTextureClient(texture);
}
+
+ CHECK_EQ((status_t)OK,
+ native_window_api_connect(
+ gSurface.get(), NATIVE_WINDOW_API_MEDIA));
}
DataSource::RegisterDefaultSniffers();
@@ -1062,6 +1109,8 @@ int main(int argc, char **argv) {
if (gWriteMP4) {
writeSourcesToMP4(mediaSources, syncInfoPresent);
+ } else if (dumpStream) {
+ dumpSource(mediaSource, dumpStreamFilename);
} else if (seekTest) {
performSeekTest(mediaSource);
} else {
@@ -1077,6 +1126,10 @@ int main(int argc, char **argv) {
}
if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) {
+ CHECK_EQ((status_t)OK,
+ native_window_api_disconnect(
+ gSurface.get(), NATIVE_WINDOW_API_MEDIA));
+
gSurface.clear();
if (useSurfaceAlloc) {
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp
index b13236a3569c..2378345821c2 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -323,7 +323,7 @@ int main(int argc, char **argv) {
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index be00aa56b90f..51c6f3adbbb3 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -29,16 +29,29 @@ import android.view.Window;
import android.widget.SpinnerAdapter;
/**
- * Acts as a replacement for the title bar in Activities.
- * The action bar provides facilities for creating toolbar actions as well as
- * methods of navigating the application.
- * <p>By default, the action bar appears at the top of every activity, with the application icon on
- * the left, followed by the activity title. Items from the activity's options menu are also
- * accessible from the action bar.</p>
+ * A window feature at the top of the activity that may display the activity title, navigation
+ * modes, and other interactive items.
+ * <p>Beginning with Android 3.0 (API level 11), the action bar appears at the top of an
+ * activity's window when the activity uses the system's {@link
+ * android.R.style#Theme_Holo Holo} theme (or one of its descendant themes), which is the default.
+ * You may otherwise add the action bar by calling {@link
+ * android.view.Window#requestFeature requestFeature(FEATURE_ACTION_BAR)} or by declaring it in a
+ * custom theme with the {@link android.R.styleable#Theme_windowActionBar windowActionBar} property.
+ * <p>By default, the action bar shows the application icon on
+ * the left, followed by the activity title. If your activity has an options menu, you can make
+ * select items accessible directly from the action bar as "action items". You can also
+ * modify various characteristics of the action bar or remove it completely.</p>
* <p>From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link
* android.app.Activity#getActionBar getActionBar()}.</p>
- * <p>For more information, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action
+ * <p>For information about how to use the action bar, including how to add action items, navigation
+ * modes and more, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action
* Bar</a> developer guide.</p>
+ * <p>In some cases, the action bar may be overlayed by another bar that enables contextual actions,
+ * using an {@link android.view.ActionMode}. For example, when the user selects one or more items in
+ * your activity, you can enable an action mode that offers actions specific to the selected
+ * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the
+ * same space, the {@link android.view.ActionMode} APIs are distinct and independent from those for
+ * {@link ActionBar}.
*/
public abstract class ActionBar {
/**
@@ -423,6 +436,7 @@ public abstract class ActionBar {
* Set the ActionBar's split background. This will appear in
* the split action bar containing menu-provided action buttons
* on some devices and configurations.
+ * <p>You can enable split action bar with {@link android.R.attr#uiOptions}
*
* @param d Background drawable for the split bar
*/
@@ -460,13 +474,6 @@ public abstract class ActionBar {
* </ul>
*
* @return The current navigation mode.
- *
- * @see #setStandardNavigationMode()
- * @see #setStandardNavigationMode(CharSequence)
- * @see #setStandardNavigationMode(CharSequence, CharSequence)
- * @see #setDropdownNavigationMode(SpinnerAdapter)
- * @see #setTabNavigationMode()
- * @see #setCustomNavigationMode(View)
*/
public abstract int getNavigationMode();
@@ -498,7 +505,6 @@ public abstract class ActionBar {
* @return A new Tab
*
* @see #addTab(Tab)
- * @see #insertTab(Tab, int)
*/
public abstract Tab newTab();
@@ -606,7 +612,7 @@ public abstract class ActionBar {
public abstract void show();
/**
- * Hide the ActionBar if it is not currently showing.
+ * Hide the ActionBar if it is currently showing.
* If the window hosting the ActionBar does not have the feature
* {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application
* content to fit the new space available.
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 77997796a8f7..b4471f096ad5 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1550,6 +1550,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ dismissKeyguardOnNextActivity();
+ reply.writeNoException();
+ return true;
+ }
+
}
return super.onTransact(code, data, reply, flags);
@@ -3504,5 +3511,15 @@ class ActivityManagerProxy implements IActivityManager
reply.recycle();
}
+ public void dismissKeyguardOnNextActivity() throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ mRemote.transact(DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
private IBinder mRemote;
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2c2a493f85e2..0776e1015c3c 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -153,6 +153,7 @@ public final class ActivityThread {
final HashMap<IBinder, Service> mServices
= new HashMap<IBinder, Service>();
AppBindData mBoundApplication;
+ Profiler mProfiler;
Configuration mConfiguration;
Configuration mCompatConfiguration;
Configuration mResConfiguration;
@@ -364,10 +365,6 @@ public final class ActivityThread {
ApplicationInfo appInfo;
List<ProviderInfo> providers;
ComponentName instrumentationName;
- String profileFile;
- ParcelFileDescriptor profileFd;
- boolean autoStopProfiler;
- boolean profiling;
Bundle instrumentationArgs;
IInstrumentationWatcher instrumentationWatcher;
int debugMode;
@@ -375,10 +372,23 @@ public final class ActivityThread {
boolean persistent;
Configuration config;
CompatibilityInfo compatInfo;
- boolean handlingProfiling;
+
+ /** Initial values for {@link Profiler}. */
+ String initProfileFile;
+ ParcelFileDescriptor initProfileFd;
+ boolean initAutoStopProfiler;
+
public String toString() {
return "AppBindData{appInfo=" + appInfo + "}";
}
+ }
+
+ static final class Profiler {
+ String profileFile;
+ ParcelFileDescriptor profileFd;
+ boolean autoStopProfiler;
+ boolean profiling;
+ boolean handlingProfiling;
public void setProfiler(String file, ParcelFileDescriptor fd) {
if (profiling) {
if (fd != null) {
@@ -661,8 +671,6 @@ public final class ActivityThread {
data.appInfo = appInfo;
data.providers = providers;
data.instrumentationName = instrumentationName;
- data.setProfiler(profileFile, profileFd);
- data.autoStopProfiler = false;
data.instrumentationArgs = instrumentationArgs;
data.instrumentationWatcher = instrumentationWatcher;
data.debugMode = debugMode;
@@ -670,6 +678,9 @@ public final class ActivityThread {
data.persistent = persistent;
data.config = config;
data.compatInfo = compatInfo;
+ data.initProfileFile = profileFile;
+ data.initProfileFd = profileFd;
+ data.initAutoStopProfiler = false;
queueOrSendMessage(H.BIND_APPLICATION, data);
}
@@ -1293,8 +1304,8 @@ public final class ActivityThread {
public final boolean queueIdle() {
ActivityClientRecord a = mNewActivities;
boolean stopProfiling = false;
- if (mBoundApplication != null && mBoundApplication.profileFd != null
- && mBoundApplication.autoStopProfiler) {
+ if (mBoundApplication != null && mProfiler.profileFd != null
+ && mProfiler.autoStopProfiler) {
stopProfiling = true;
}
if (a != null) {
@@ -1320,7 +1331,7 @@ public final class ActivityThread {
} while (a != null);
}
if (stopProfiling) {
- mBoundApplication.stopProfiling();
+ mProfiler.stopProfiling();
}
ensureJitEnabled();
return false;
@@ -1635,12 +1646,12 @@ public final class ActivityThread {
}
public boolean isProfiling() {
- return mBoundApplication != null && mBoundApplication.profileFile != null
- && mBoundApplication.profileFd == null;
+ return mProfiler != null && mProfiler.profileFile != null
+ && mProfiler.profileFd == null;
}
public String getProfileFilePath() {
- return mBoundApplication.profileFile;
+ return mProfiler.profileFile;
}
public Looper getLooper() {
@@ -1679,6 +1690,9 @@ public final class ActivityThread {
ContextImpl context = getSystemContext();
context.init(new LoadedApk(this, "android", context, info,
CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO), null, this);
+
+ // give ourselves a default profiler
+ mProfiler = new Profiler();
}
}
@@ -1947,9 +1961,9 @@ public final class ActivityThread {
unscheduleGcIdler();
if (r.profileFd != null) {
- mBoundApplication.setProfiler(r.profileFile, r.profileFd);
- mBoundApplication.startProfiling();
- mBoundApplication.autoStopProfiler = r.autoStopProfiler;
+ mProfiler.setProfiler(r.profileFile, r.profileFd);
+ mProfiler.startProfiling();
+ mProfiler.autoStopProfiler = r.autoStopProfiler;
}
if (localLOGV) Slog.v(
@@ -3570,10 +3584,10 @@ public final class ActivityThread {
case 1:
ViewDebug.startLooperProfiling(pcd.path, pcd.fd.getFileDescriptor());
break;
- default:
- mBoundApplication.setProfiler(pcd.path, pcd.fd);
- mBoundApplication.autoStopProfiler = false;
- mBoundApplication.startProfiling();
+ default:
+ mProfiler.setProfiler(pcd.path, pcd.fd);
+ mProfiler.autoStopProfiler = false;
+ mProfiler.startProfiling();
break;
}
} catch (RuntimeException e) {
@@ -3592,7 +3606,7 @@ public final class ActivityThread {
ViewDebug.stopLooperProfiling();
break;
default:
- mBoundApplication.stopProfiling();
+ mProfiler.stopProfiling();
break;
}
}
@@ -3685,6 +3699,11 @@ public final class ActivityThread {
mConfiguration = new Configuration(data.config);
mCompatConfiguration = new Configuration(data.config);
+ mProfiler = new Profiler();
+ mProfiler.profileFile = data.initProfileFile;
+ mProfiler.profileFd = data.initProfileFd;
+ mProfiler.autoStopProfiler = data.initAutoStopProfiler;
+
// send up app name; do this *before* waiting for debugger
Process.setArgV0(data.processName);
android.ddm.DdmHandleAppName.setAppName(data.processName);
@@ -3699,8 +3718,8 @@ public final class ActivityThread {
}
}
- if (data.profileFd != null) {
- data.startProfiling();
+ if (mProfiler.profileFd != null) {
+ mProfiler.startProfiling();
}
// If the app is Honeycomb MR1 or earlier, switch its AsyncTask
@@ -3841,10 +3860,10 @@ public final class ActivityThread {
mInstrumentation.init(this, instrContext, appContext,
new ComponentName(ii.packageName, ii.name), data.instrumentationWatcher);
- if (data.profileFile != null && !ii.handleProfiling
- && data.profileFd == null) {
- data.handlingProfiling = true;
- File file = new File(data.profileFile);
+ if (mProfiler.profileFile != null && !ii.handleProfiling
+ && mProfiler.profileFd == null) {
+ mProfiler.handlingProfiling = true;
+ File file = new File(mProfiler.profileFile);
file.getParentFile().mkdirs();
Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
}
@@ -3896,8 +3915,8 @@ public final class ActivityThread {
/*package*/ final void finishInstrumentation(int resultCode, Bundle results) {
IActivityManager am = ActivityManagerNative.getDefault();
- if (mBoundApplication.profileFile != null && mBoundApplication.handlingProfiling
- && mBoundApplication.profileFd == null) {
+ if (mProfiler.profileFile != null && mProfiler.handlingProfiling
+ && mProfiler.profileFd == null) {
Debug.stopMethodTracing();
}
//Slog.i(TAG, "am: " + ActivityManagerNative.getDefault()
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 27dd6916af18..26813bf117df 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -372,6 +372,8 @@ public interface IActivityManager extends IInterface {
public void showBootMessage(CharSequence msg, boolean always) throws RemoteException;
+ public void dismissKeyguardOnNextActivity() throws RemoteException;
+
/*
* Private non-Binder interfaces
*/
@@ -602,4 +604,5 @@ public interface IActivityManager extends IInterface {
int UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+135;
int GET_PROCESS_PSS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+136;
int SHOW_BOOT_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+137;
+ int DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+138;
}
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 5c4cc876313e..3290b9d5ad19 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -338,7 +338,7 @@ public class SearchManager
/**
* Column name for suggestions cursor. <i>Optional.</i> This column may be
- * used to specify the time in (@link System#currentTimeMillis
+ * used to specify the time in {@link System#currentTimeMillis
* System.currentTImeMillis()} (wall time in UTC) when an item was last
* accessed within the results-providing application. If set, this may be
* used to show more-recently-used items first.
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 254c98ff8cf0..ea5c3db86571 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -781,7 +781,7 @@ public final class BluetoothAdapter {
* Get the current connection state of a profile.
* This function can be used to check whether the local Bluetooth adapter
* is connected to any remote device for a specific profile.
- * Profile can be one of {@link BluetoothProfile#HEADSET},
+ * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET},
* {@link BluetoothProfile#A2DP}.
*
* <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
@@ -1132,15 +1132,15 @@ public final class BluetoothAdapter {
/**
* Get the profile proxy object associated with the profile.
*
- * <p>Profile can be one of {@link BluetoothProfile#HEADSET} or
+ * <p>Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET} or
* {@link BluetoothProfile#A2DP}. Clients must implements
* {@link BluetoothProfile.ServiceListener} to get notified of
* the connection status and to get the proxy object.
*
* @param context Context of the application
* @param listener The service Listener for connection callbacks.
- * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEADSET}
- * or {@link BluetoothProfile#A2DP}.
+ * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEALTH},
+ * {@link BluetoothProfile#HEADSET} or {@link BluetoothProfile#A2DP}.
* @return true on success, false on error
*/
public boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener,
@@ -1172,7 +1172,7 @@ public final class BluetoothAdapter {
*
* <p> Clients should call this when they are no longer using
* the proxy obtained from {@link #getProfileProxy}.
- * Profile can be one of {@link BluetoothProfile#HEADSET} or
+ * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET} or
* {@link BluetoothProfile#A2DP}
*
* @param profile
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index f7ccfbd35fba..1920efa52f87 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -161,9 +161,9 @@ public interface BluetoothProfile {
/**
* Called to notify the client when the proxy object has been
* connected to the service.
- * @param profile - One of {@link #HEADSET} or
+ * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or
* {@link #A2DP}
- * @param proxy - One of {@link BluetoothHeadset} or
+ * @param proxy - One of {@link BluetoothHealth}, {@link BluetoothHeadset} or
* {@link BluetoothA2dp}
*/
public void onServiceConnected(int profile, BluetoothProfile proxy);
@@ -171,7 +171,7 @@ public interface BluetoothProfile {
/**
* Called to notify the client that this proxy object has been
* disconnected from the service.
- * @param profile - One of {@link #HEADSET} or
+ * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or
* {@link #A2DP}
*/
public void onServiceDisconnected(int profile);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 72cf26acf6f8..f44d038a5fee 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5577,24 +5577,35 @@ public class Intent implements Parcelable, Cloneable {
@Override
public String toString() {
- StringBuilder b = new StringBuilder(128);
+ StringBuilder b = new StringBuilder(128);
b.append("Intent { ");
- toShortString(b, true, true);
+ toShortString(b, true, true, true);
b.append(" }");
return b.toString();
}
/** @hide */
- public String toShortString(boolean comp, boolean extras) {
- StringBuilder b = new StringBuilder(128);
- toShortString(b, comp, extras);
+ public String toInsecureString() {
+ StringBuilder b = new StringBuilder(128);
+
+ b.append("Intent { ");
+ toShortString(b, false, true, true);
+ b.append(" }");
+
return b.toString();
}
/** @hide */
- public void toShortString(StringBuilder b, boolean comp, boolean extras) {
+ public String toShortString(boolean secure, boolean comp, boolean extras) {
+ StringBuilder b = new StringBuilder(128);
+ toShortString(b, secure, comp, extras);
+ return b.toString();
+ }
+
+ /** @hide */
+ public void toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras) {
boolean first = true;
if (mAction != null) {
b.append("act=").append(mAction);
@@ -5621,19 +5632,8 @@ public class Intent implements Parcelable, Cloneable {
}
first = false;
b.append("dat=");
- String scheme = mData.getScheme();
- if (scheme != null) {
- if (scheme.equalsIgnoreCase("tel")) {
- b.append("tel:xxx-xxx-xxxx");
- } else if (scheme.equalsIgnoreCase("sip")) {
- b.append("sip:xxxxxxxxxx");
- } else if (scheme.equalsIgnoreCase("sms")) {
- b.append("sms:xxx-xxx-xxxx");
- } else if (scheme.equalsIgnoreCase("smsto")) {
- b.append("smsto:xxx-xxx-xxxx");
- } else {
- b.append(mData);
- }
+ if (secure) {
+ b.append(mData.toSafeString());
} else {
b.append(mData);
}
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 684c4fed858e..127efa219308 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -16,22 +16,10 @@
package android.content;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
import com.android.internal.R;
import com.android.internal.util.ArrayUtils;
+import com.google.android.collect.Lists;
+import com.google.android.collect.Maps;
import android.accounts.Account;
import android.accounts.AccountManager;
@@ -42,12 +30,23 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.RegisteredServicesCache;
import android.content.pm.ProviderInfo;
+import android.content.pm.RegisteredServicesCache;
import android.content.pm.RegisteredServicesCacheListener;
+import android.content.pm.ResolveInfo;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.WorkSource;
import android.provider.Settings;
import android.text.format.DateUtils;
@@ -59,12 +58,15 @@ import android.util.Pair;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
@@ -1006,9 +1008,8 @@ public class SyncManager implements OnAccountsUpdateListener {
}
protected void dump(FileDescriptor fd, PrintWriter pw) {
- StringBuilder sb = new StringBuilder();
- dumpSyncState(pw, sb);
- dumpSyncHistory(pw, sb);
+ dumpSyncState(pw);
+ dumpSyncHistory(pw);
pw.println();
pw.println("SyncAdapters:");
@@ -1023,7 +1024,7 @@ public class SyncManager implements OnAccountsUpdateListener {
return tobj.format("%Y-%m-%d %H:%M:%S");
}
- protected void dumpSyncState(PrintWriter pw, StringBuilder sb) {
+ protected void dumpSyncState(PrintWriter pw) {
pw.print("data connected: "); pw.println(mDataConnectionIsConnected);
pw.print("memory low: "); pw.println(mStorageIsLow);
@@ -1055,7 +1056,7 @@ public class SyncManager implements OnAccountsUpdateListener {
}
pw.print("notification info: ");
- sb.setLength(0);
+ final StringBuilder sb = new StringBuilder();
mSyncHandler.mSyncNotificationInfo.toString(sb);
pw.println(sb.toString());
@@ -1204,7 +1205,197 @@ public class SyncManager implements OnAccountsUpdateListener {
pw.println(")");
}
- protected void dumpSyncHistory(PrintWriter pw, StringBuilder sb) {
+ protected void dumpSyncHistory(PrintWriter pw) {
+ dumpRecentHistory(pw);
+ dumpDayStatistics(pw);
+ }
+
+ private void dumpRecentHistory(PrintWriter pw) {
+ final ArrayList<SyncStorageEngine.SyncHistoryItem> items
+ = mSyncStorageEngine.getSyncHistory();
+ if (items != null && items.size() > 0) {
+ final Map<String, AuthoritySyncStats> authorityMap = Maps.newHashMap();
+ long totalElapsedTime = 0;
+ long totalTimes = 0;
+ final int N = items.size();
+
+ int maxAuthority = 0;
+ int maxAccount = 0;
+ for (SyncStorageEngine.SyncHistoryItem item : items) {
+ SyncStorageEngine.AuthorityInfo authority
+ = mSyncStorageEngine.getAuthority(item.authorityId);
+ final String authorityName;
+ final String accountKey;
+ if (authority != null) {
+ authorityName = authority.authority;
+ accountKey = authority.account.name + "/" + authority.account.type;
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
+
+ int length = authorityName.length();
+ if (length > maxAuthority) {
+ maxAuthority = length;
+ }
+ length = accountKey.length();
+ if (length > maxAccount) {
+ maxAccount = length;
+ }
+
+ final long elapsedTime = item.elapsedTime;
+ totalElapsedTime += elapsedTime;
+ totalTimes++;
+ AuthoritySyncStats authoritySyncStats = authorityMap.get(authorityName);
+ if (authoritySyncStats == null) {
+ authoritySyncStats = new AuthoritySyncStats(authorityName);
+ authorityMap.put(authorityName, authoritySyncStats);
+ }
+ authoritySyncStats.elapsedTime += elapsedTime;
+ authoritySyncStats.times++;
+ final Map<String, AccountSyncStats> accountMap = authoritySyncStats.accountMap;
+ AccountSyncStats accountSyncStats = accountMap.get(accountKey);
+ if (accountSyncStats == null) {
+ accountSyncStats = new AccountSyncStats(accountKey);
+ accountMap.put(accountKey, accountSyncStats);
+ }
+ accountSyncStats.elapsedTime += elapsedTime;
+ accountSyncStats.times++;
+
+ }
+
+ pw.println();
+ pw.printf("Detailed Statistics (Recent history): %d (# of times) %ds (sync time)\n",
+ totalTimes, totalElapsedTime / 1000);
+
+ final List<AuthoritySyncStats> sortedAuthorities =
+ new ArrayList<AuthoritySyncStats>(authorityMap.values());
+ Collections.sort(sortedAuthorities, new Comparator<AuthoritySyncStats>() {
+ @Override
+ public int compare(AuthoritySyncStats lhs, AuthoritySyncStats rhs) {
+ // reverse order
+ int compare = Integer.compare(rhs.times, lhs.times);
+ if (compare == 0) {
+ compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime);
+ }
+ return compare;
+ }
+ });
+
+ final int maxLength = Math.max(maxAuthority, maxAccount + 3);
+ final int padLength = 2 + 2 + maxLength + 2 + 10 + 11;
+ final char chars[] = new char[padLength];
+ Arrays.fill(chars, '-');
+ final String separator = new String(chars);
+
+ final String authorityFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength + 2);
+ final String accountFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength);
+
+ pw.println(separator);
+ for (AuthoritySyncStats authoritySyncStats : sortedAuthorities) {
+ String name = authoritySyncStats.name;
+ long elapsedTime;
+ int times;
+ String timeStr;
+ String timesStr;
+
+ elapsedTime = authoritySyncStats.elapsedTime;
+ times = authoritySyncStats.times;
+ timeStr = String.format("%d/%d%%",
+ elapsedTime / 1000,
+ elapsedTime * 100 / totalElapsedTime);
+ timesStr = String.format("%d/%d%%",
+ times,
+ times * 100 / totalTimes);
+ pw.printf(authorityFormat, name, timesStr, timeStr);
+
+ if (authoritySyncStats.accountMap.size() > 1) {
+ final List<AccountSyncStats> sortedAccounts =
+ new ArrayList<AccountSyncStats>(
+ authoritySyncStats.accountMap.values());
+ Collections.sort(sortedAccounts, new Comparator<AccountSyncStats>() {
+ @Override
+ public int compare(AccountSyncStats lhs, AccountSyncStats rhs) {
+ // reverse order
+ int compare = Integer.compare(rhs.times, lhs.times);
+ if (compare == 0) {
+ compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime);
+ }
+ return compare;
+ }
+ });
+ for (AccountSyncStats stats: sortedAccounts) {
+ elapsedTime = stats.elapsedTime;
+ times = stats.times;
+ timeStr = String.format("%d/%d%%",
+ elapsedTime / 1000,
+ elapsedTime * 100 / totalElapsedTime);
+ timesStr = String.format("%d/%d%%",
+ times,
+ times * 100 / totalTimes);
+ pw.printf(accountFormat, stats.name, timesStr, timeStr);
+ }
+ }
+ pw.println(separator);
+ }
+
+ pw.println();
+ pw.println("Recent Sync History");
+ final String format = " %-" + maxAccount + "s %s\n";
+ String lastAuthorityName = null;
+ String lastAccountKey = null;
+ long lastEventTime = 0;
+ for (int i = 0; i < N; i++) {
+ SyncStorageEngine.SyncHistoryItem item = items.get(i);
+ SyncStorageEngine.AuthorityInfo authority
+ = mSyncStorageEngine.getAuthority(item.authorityId);
+ final String authorityName;
+ final String accountKey;
+ if (authority != null) {
+ authorityName = authority.authority;
+ accountKey = authority.account.name + "/" + authority.account.type;
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
+ final long elapsedTime = item.elapsedTime;
+ final Time time = new Time();
+ final long eventTime = item.eventTime;
+ time.set(eventTime);
+
+ pw.printf(" #%-3d: %s %8s %5.1fs",
+ i + 1,
+ formatTime(eventTime),
+ SyncStorageEngine.SOURCES[item.source],
+ ((float) elapsedTime) / 1000);
+ if (authorityName.equals(lastAuthorityName) && accountKey.equals(lastAccountKey)) {
+ final long span = (lastEventTime - eventTime) / 1000;
+ pw.printf(" %02d:%02d\n", span / 60, span % 60);
+ } else {
+ pw.printf(format, accountKey, authorityName);
+ }
+
+ lastAuthorityName = authorityName;
+ lastAccountKey = accountKey;
+ lastEventTime = eventTime;
+
+ if (item.event != SyncStorageEngine.EVENT_STOP
+ || item.upstreamActivity != 0
+ || item.downstreamActivity != 0) {
+ pw.printf(" event=%d upstreamActivity=%d downstreamActivity=%d\n",
+ item.event,
+ item.upstreamActivity,
+ item.downstreamActivity);
+ }
+ if (item.mesg != null
+ && !SyncStorageEngine.MESG_SUCCESS.equals(item.mesg)) {
+ pw.printf(" mesg=%s\n", item.mesg);
+ }
+ }
+ }
+ }
+
+ private void dumpDayStatistics(PrintWriter pw) {
SyncStorageEngine.DayStats dses[] = mSyncStorageEngine.getDayStatistics();
if (dses != null && dses[0] != null) {
pw.println();
@@ -1254,47 +1445,26 @@ public class SyncManager implements OnAccountsUpdateListener {
}
}
}
+ }
- ArrayList<SyncStorageEngine.SyncHistoryItem> items
- = mSyncStorageEngine.getSyncHistory();
- if (items != null && items.size() > 0) {
- pw.println();
- pw.println("Recent Sync History");
- final int N = items.size();
- for (int i=0; i<N; i++) {
- SyncStorageEngine.SyncHistoryItem item = items.get(i);
- SyncStorageEngine.AuthorityInfo authority
- = mSyncStorageEngine.getAuthority(item.authorityId);
- pw.print(" #"); pw.print(i+1); pw.print(": ");
- if (authority != null) {
- pw.print(authority.account.name);
- pw.print(":");
- pw.print(authority.account.type);
- pw.print(" ");
- pw.print(authority.authority);
- } else {
- pw.print("<no account>");
- }
- Time time = new Time();
- time.set(item.eventTime);
- pw.print(" "); pw.print(SyncStorageEngine.SOURCES[item.source]);
- pw.print(" @ ");
- pw.print(formatTime(item.eventTime));
- pw.print(" for ");
- dumpTimeSec(pw, item.elapsedTime);
- pw.println();
- if (item.event != SyncStorageEngine.EVENT_STOP
- || item.upstreamActivity !=0
- || item.downstreamActivity != 0) {
- pw.print(" event="); pw.print(item.event);
- pw.print(" upstreamActivity="); pw.print(item.upstreamActivity);
- pw.print(" downstreamActivity="); pw.println(item.downstreamActivity);
- }
- if (item.mesg != null
- && !SyncStorageEngine.MESG_SUCCESS.equals(item.mesg)) {
- pw.print(" mesg="); pw.println(item.mesg);
- }
- }
+ private static class AuthoritySyncStats {
+ String name;
+ long elapsedTime;
+ int times;
+ Map<String, AccountSyncStats> accountMap = Maps.newHashMap();
+
+ private AuthoritySyncStats(String name) {
+ this.name = name;
+ }
+ }
+
+ private static class AccountSyncStats {
+ String name;
+ long elapsedTime;
+ int times;
+
+ private AccountSyncStats(String name) {
+ this.name = name;
}
}
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index bba329dd441e..0e6694deef2c 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -442,7 +442,11 @@ public class ActivityInfo extends ComponentInfo
public int uiOptions = 0;
/**
- * Flag for use with uiOptions.
+ * Flag for use with {@link #uiOptions}.
+ * Indicates that the action bar should put all action items in a separate bar when
+ * the screen is narrow.
+ * <p>This value corresponds to "splitActionBarWhenNarrow" for the {@link #uiOptions} XML
+ * attribute.
*/
public static final int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = 1;
diff --git a/core/java/android/content/pm/PackageInfoLite.java b/core/java/android/content/pm/PackageInfoLite.java
index da97fde006ef..962594440e8f 100644
--- a/core/java/android/content/pm/PackageInfoLite.java
+++ b/core/java/android/content/pm/PackageInfoLite.java
@@ -41,6 +41,8 @@ public class PackageInfoLite implements Parcelable {
public int recommendedInstallLocation;
public int installLocation;
+ public VerifierInfo[] verifiers;
+
public PackageInfoLite() {
}
@@ -58,6 +60,13 @@ public class PackageInfoLite implements Parcelable {
dest.writeString(packageName);
dest.writeInt(recommendedInstallLocation);
dest.writeInt(installLocation);
+
+ if (verifiers == null || verifiers.length == 0) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(verifiers.length);
+ dest.writeTypedArray(verifiers, parcelableFlags);
+ }
}
public static final Parcelable.Creator<PackageInfoLite> CREATOR
@@ -75,5 +84,13 @@ public class PackageInfoLite implements Parcelable {
packageName = source.readString();
recommendedInstallLocation = source.readInt();
installLocation = source.readInt();
+
+ final int verifiersLength = source.readInt();
+ if (verifiersLength == 0) {
+ verifiers = new VerifierInfo[0];
+ } else {
+ verifiers = new VerifierInfo[verifiersLength];
+ source.readTypedArray(verifiers, VerifierInfo.CREATOR);
+ }
}
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index ef7e23345036..7a7e4f4b54ab 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -725,6 +725,16 @@ public abstract class PackageManager {
public static final int MOVE_EXTERNAL_MEDIA = 0x00000002;
/**
+ * Usable by the required verifier as the {@code verificationCode} argument
+ * for {@link PackageManager#verifyPendingInstall} to indicate that it will
+ * allow the installation to proceed without any of the optional verifiers
+ * needing to vote.
+ *
+ * @hide
+ */
+ public static final int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT = 2;
+
+ /**
* Used as the {@code verificationCode} argument for
* {@link PackageManager#verifyPendingInstall} to indicate that the calling
* package verifier allows the installation to proceed.
@@ -2527,6 +2537,7 @@ public abstract class PackageManager {
* {@link #COMPONENT_ENABLED_STATE_DEFAULT}. The last one means the
* application's enabled state is based on the original information in
* the manifest as found in {@link ComponentInfo}.
+ * @throws IllegalArgumentException if the named package does not exist.
*/
public abstract int getApplicationEnabledSetting(String packageName);
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index e7b844c4808b..c30675b6a36d 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -28,7 +28,9 @@ import android.os.Build;
import android.os.Bundle;
import android.os.PatternMatcher;
import android.util.AttributeSet;
+import android.util.Base64;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.util.Slog;
import android.util.TypedValue;
import com.android.internal.util.XmlUtils;
@@ -40,11 +42,18 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
+import java.security.spec.EncodedKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
+import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -150,12 +159,14 @@ public class PackageParser {
* @hide
*/
public static class PackageLite {
- public String packageName;
- public int installLocation;
- public String mScanPath;
- public PackageLite(String packageName, int installLocation) {
+ public final String packageName;
+ public final int installLocation;
+ public final VerifierInfo[] verifiers;
+
+ public PackageLite(String packageName, int installLocation, List<VerifierInfo> verifiers) {
this.packageName = packageName;
this.installLocation = installLocation;
+ this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]);
}
}
@@ -619,8 +630,9 @@ public class PackageParser {
* @return PackageLite object with package information or null on failure.
*/
public static PackageLite parsePackageLite(String packageFilePath, int flags) {
- XmlResourceParser parser = null;
AssetManager assmgr = null;
+ final XmlResourceParser parser;
+ final Resources res;
try {
assmgr = new AssetManager();
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -631,6 +643,9 @@ public class PackageParser {
return null;
}
+ final DisplayMetrics metrics = new DisplayMetrics();
+ metrics.setToDefaults();
+ res = new Resources(assmgr, metrics, null);
parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);
} catch (Exception e) {
if (assmgr != null) assmgr.close();
@@ -638,11 +653,12 @@ public class PackageParser {
+ packageFilePath, e);
return null;
}
- AttributeSet attrs = parser;
- String errors[] = new String[1];
+
+ final AttributeSet attrs = parser;
+ final String errors[] = new String[1];
PackageLite packageLite = null;
try {
- packageLite = parsePackageLite(parser, attrs, flags, errors);
+ packageLite = parsePackageLite(res, parser, attrs, flags, errors);
} catch (IOException e) {
Slog.w(TAG, packageFilePath, e);
} catch (XmlPullParserException e) {
@@ -719,9 +735,9 @@ public class PackageParser {
return pkgName.intern();
}
- private static PackageLite parsePackageLite(XmlPullParser parser,
- AttributeSet attrs, int flags, String[] outError)
- throws IOException, XmlPullParserException {
+ private static PackageLite parsePackageLite(Resources res, XmlPullParser parser,
+ AttributeSet attrs, int flags, String[] outError) throws IOException,
+ XmlPullParserException {
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -759,7 +775,26 @@ public class PackageParser {
break;
}
}
- return new PackageLite(pkgName.intern(), installLocation);
+
+ // Only search the tree when the tag is directly below <manifest>
+ final int searchDepth = parser.getDepth() + 1;
+
+ final List<VerifierInfo> verifiers = new ArrayList<VerifierInfo>();
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() >= searchDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ if (parser.getDepth() == searchDepth && "package-verifier".equals(parser.getName())) {
+ final VerifierInfo verifier = parseVerifier(res, parser, attrs, flags, outError);
+ if (verifier != null) {
+ verifiers.add(verifier);
+ }
+ }
+ }
+
+ return new PackageLite(pkgName.intern(), installLocation, verifiers);
}
/**
@@ -2691,6 +2726,63 @@ public class PackageParser {
return data;
}
+ private static VerifierInfo parseVerifier(Resources res, XmlPullParser parser,
+ AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException,
+ IOException {
+ final TypedArray sa = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier);
+
+ final String packageName = sa.getNonResourceString(
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier_name);
+
+ final String encodedPublicKey = sa.getNonResourceString(
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier_publicKey);
+
+ sa.recycle();
+
+ if (packageName == null || packageName.length() == 0) {
+ Slog.i(TAG, "verifier package name was null; skipping");
+ return null;
+ } else if (encodedPublicKey == null) {
+ Slog.i(TAG, "verifier " + packageName + " public key was null; skipping");
+ }
+
+ EncodedKeySpec keySpec;
+ try {
+ final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT);
+ keySpec = new X509EncodedKeySpec(encoded);
+ } catch (IllegalArgumentException e) {
+ Slog.i(TAG, "Could not parse verifier " + packageName + " public key; invalid Base64");
+ return null;
+ }
+
+ /* First try the key as an RSA key. */
+ try {
+ final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ final PublicKey publicKey = keyFactory.generatePublic(keySpec);
+ return new VerifierInfo(packageName, publicKey);
+ } catch (NoSuchAlgorithmException e) {
+ Log.wtf(TAG, "Could not parse public key because RSA isn't included in build");
+ return null;
+ } catch (InvalidKeySpecException e) {
+ // Not a RSA public key.
+ }
+
+ /* Now try it as a DSA key. */
+ try {
+ final KeyFactory keyFactory = KeyFactory.getInstance("DSA");
+ final PublicKey publicKey = keyFactory.generatePublic(keySpec);
+ return new VerifierInfo(packageName, publicKey);
+ } catch (NoSuchAlgorithmException e) {
+ Log.wtf(TAG, "Could not parse public key because DSA isn't included in build");
+ return null;
+ } catch (InvalidKeySpecException e) {
+ // Not a DSA public key.
+ }
+
+ return null;
+ }
+
private static final String ANDROID_RESOURCES
= "http://schemas.android.com/apk/res/android";
diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java
index c6aefb87c723..9c9340d0ef00 100644
--- a/core/java/android/content/pm/Signature.java
+++ b/core/java/android/content/pm/Signature.java
@@ -19,7 +19,12 @@ package android.content.pm;
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.ByteArrayInputStream;
import java.lang.ref.SoftReference;
+import java.security.PublicKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.util.Arrays;
/**
@@ -135,6 +140,20 @@ public class Signature implements Parcelable {
return bytes;
}
+ /**
+ * Returns the public key for this signature.
+ *
+ * @throws CertificateException when Signature isn't a valid X.509
+ * certificate; shouldn't happen.
+ * @hide
+ */
+ public PublicKey getPublicKey() throws CertificateException {
+ final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ final ByteArrayInputStream bais = new ByteArrayInputStream(mSignature);
+ final Certificate cert = certFactory.generateCertificate(bais);
+ return cert.getPublicKey();
+ }
+
@Override
public boolean equals(Object obj) {
try {
diff --git a/core/java/android/content/pm/VerifierInfo.aidl b/core/java/android/content/pm/VerifierInfo.aidl
new file mode 100644
index 000000000000..7702d387d3f0
--- /dev/null
+++ b/core/java/android/content/pm/VerifierInfo.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011, 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.content.pm;
+
+parcelable VerifierInfo;
diff --git a/core/java/android/content/pm/VerifierInfo.java b/core/java/android/content/pm/VerifierInfo.java
new file mode 100644
index 000000000000..0a2b2832d319
--- /dev/null
+++ b/core/java/android/content/pm/VerifierInfo.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2011 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.content.pm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.security.PublicKey;
+
+/**
+ * Contains information about a package verifier as used by
+ * {@code PackageManagerService} during package verification.
+ *
+ * @hide
+ */
+public class VerifierInfo implements Parcelable {
+ /** Package name of the verifier. */
+ public final String packageName;
+
+ /** Signatures used to sign the package verifier's package. */
+ public final PublicKey publicKey;
+
+ /**
+ * Creates an object that represents a verifier info object.
+ *
+ * @param packageName the package name in Java-style. Must not be {@code
+ * null} or empty.
+ * @param publicKey the public key for the signer encoded in Base64. Must
+ * not be {@code null} or empty.
+ * @throws IllegalArgumentException if either argument is null or empty.
+ */
+ public VerifierInfo(String packageName, PublicKey publicKey) {
+ if (packageName == null || packageName.length() == 0) {
+ throw new IllegalArgumentException("packageName must not be null or empty");
+ } else if (publicKey == null) {
+ throw new IllegalArgumentException("publicKey must not be null");
+ }
+
+ this.packageName = packageName;
+ this.publicKey = publicKey;
+ }
+
+ private VerifierInfo(Parcel source) {
+ packageName = source.readString();
+ publicKey = (PublicKey) source.readSerializable();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(packageName);
+ dest.writeSerializable(publicKey);
+ }
+
+ public static final Parcelable.Creator<VerifierInfo> CREATOR
+ = new Parcelable.Creator<VerifierInfo>() {
+ public VerifierInfo createFromParcel(Parcel source) {
+ return new VerifierInfo(source);
+ }
+
+ public VerifierInfo[] newArray(int size) {
+ return new VerifierInfo[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/core/java/android/inputmethodservice/Keyboard.java b/core/java/android/inputmethodservice/Keyboard.java
index 10386f84671d..4fe54c0aa4dd 100644
--- a/core/java/android/inputmethodservice/Keyboard.java
+++ b/core/java/android/inputmethodservice/Keyboard.java
@@ -144,6 +144,8 @@ public class Keyboard {
/** Number of key widths from current touch point to search for nearest keys. */
private static float SEARCH_DISTANCE = 1.8f;
+ private ArrayList<Row> rows = new ArrayList<Row>();
+
/**
* Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
* Some of the key size defaults can be overridden per row from what the {@link Keyboard}
@@ -164,6 +166,9 @@ public class Keyboard {
public int defaultHorizontalGap;
/** Vertical gap following this row. */
public int verticalGap;
+
+ ArrayList<Key> mKeys = new ArrayList<Key>();
+
/**
* Edge flags for this row of keys. Possible values that can be assigned are
* {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
@@ -256,7 +261,7 @@ public class Keyboard {
public CharSequence text;
/** Popup characters */
public CharSequence popupCharacters;
-
+
/**
* Flags that specify the anchoring to edges of the keyboard for detecting touch events
* that are just out of the boundary of the key. This is a bit mask of
@@ -596,11 +601,44 @@ public class Keyboard {
column++;
x += key.width + key.gap;
mKeys.add(key);
+ row.mKeys.add(key);
if (x > mTotalWidth) {
mTotalWidth = x;
}
}
- mTotalHeight = y + mDefaultHeight;
+ mTotalHeight = y + mDefaultHeight;
+ rows.add(row);
+ }
+
+ final void resize(int newWidth, int newHeight) {
+ int numRows = rows.size();
+ for (int rowIndex = 0; rowIndex < numRows; ++rowIndex) {
+ Row row = rows.get(rowIndex);
+ int numKeys = row.mKeys.size();
+ int totalGap = 0;
+ int totalWidth = 0;
+ for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) {
+ Key key = row.mKeys.get(keyIndex);
+ if (keyIndex > 0) {
+ totalGap += key.gap;
+ }
+ totalWidth += key.width;
+ }
+ if (totalGap + totalWidth > newWidth) {
+ int x = 0;
+ float scaleFactor = (float)(newWidth - totalGap) / totalWidth;
+ for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) {
+ Key key = row.mKeys.get(keyIndex);
+ key.width *= scaleFactor;
+ key.x = x;
+ x += key.width + key.gap;
+ }
+ }
+ }
+ mTotalWidth = newWidth;
+ // TODO: This does not adjust the vertical placement according to the new size.
+ // The main problem in the previous code was horizontal placement/size, but we should
+ // also recalculate the vertical sizes/positions when we get this resize call.
}
public List<Key> getKeys() {
@@ -749,7 +787,7 @@ public class Keyboard {
Row currentRow = null;
Resources res = context.getResources();
boolean skipRow = false;
-
+
try {
int event;
while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
@@ -759,6 +797,7 @@ public class Keyboard {
inRow = true;
x = 0;
currentRow = createRowFromXml(res, parser);
+ rows.add(currentRow);
skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode;
if (skipRow) {
skipToEndOfRow(parser);
@@ -781,6 +820,7 @@ public class Keyboard {
} else if (key.codes[0] == KEYCODE_ALT) {
mModifierKeys.add(key);
}
+ currentRow.mKeys.add(key);
} else if (TAG_KEYBOARD.equals(tag)) {
parseKeyboardAttributes(res, parser);
}
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index 05444f628ffe..1119c1eb1b31 100644
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -376,6 +376,7 @@ public class KeyboardView extends View implements View.OnClickListener {
initGestureDetector();
}
+
private void initGestureDetector() {
mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
@@ -615,6 +616,9 @@ public class KeyboardView extends View implements View.OnClickListener {
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
+ if (mKeyboard != null) {
+ mKeyboard.resize(w, h);
+ }
// Release the buffer, if any and it will be reallocated on the next draw
mBuffer = null;
}
diff --git a/core/java/android/net/DhcpInfoInternal.java b/core/java/android/net/DhcpInfoInternal.java
index 9b0a2d7056fb..fa77bc5c0993 100644
--- a/core/java/android/net/DhcpInfoInternal.java
+++ b/core/java/android/net/DhcpInfoInternal.java
@@ -24,6 +24,7 @@ import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
/**
* A simple object for retrieving the results of a DHCP request.
@@ -41,14 +42,18 @@ public class DhcpInfoInternal {
public String serverAddress;
public int leaseDuration;
- private Collection<RouteInfo> routes;
+ private Collection<RouteInfo> mRoutes;
public DhcpInfoInternal() {
- routes = new ArrayList<RouteInfo>();
+ mRoutes = new ArrayList<RouteInfo>();
}
public void addRoute(RouteInfo routeInfo) {
- routes.add(routeInfo);
+ mRoutes.add(routeInfo);
+ }
+
+ public Collection<RouteInfo> getRoutes() {
+ return Collections.unmodifiableCollection(mRoutes);
}
private int convertToInt(String addr) {
@@ -66,7 +71,7 @@ public class DhcpInfoInternal {
public DhcpInfo makeDhcpInfo() {
DhcpInfo info = new DhcpInfo();
info.ipAddress = convertToInt(ipAddress);
- for (RouteInfo route : routes) {
+ for (RouteInfo route : mRoutes) {
if (route.isDefaultRoute()) {
info.gateway = convertToInt(route.getGateway().getHostAddress());
break;
@@ -94,14 +99,14 @@ public class DhcpInfoInternal {
public LinkProperties makeLinkProperties() {
LinkProperties p = new LinkProperties();
p.addLinkAddress(makeLinkAddress());
- for (RouteInfo route : routes) {
+ for (RouteInfo route : mRoutes) {
p.addRoute(route);
}
+ //if empty, connectivity configures default DNS
if (TextUtils.isEmpty(dns1) == false) {
p.addDns(NetworkUtils.numericToInetAddress(dns1));
} else {
- p.addDns(NetworkUtils.numericToInetAddress(serverAddress));
- Log.d(TAG, "empty dns1, use dhcp server as dns1!");
+ Log.d(TAG, "makeLinkProperties with empty dns1!");
}
if (TextUtils.isEmpty(dns2) == false) {
p.addDns(NetworkUtils.numericToInetAddress(dns2));
@@ -111,11 +116,33 @@ public class DhcpInfoInternal {
return p;
}
+ /* Updates the DHCP fields that need to be retained from
+ * original DHCP request if the DHCP renewal shows them as
+ * being empty
+ */
+ public void updateFromDhcpRequest(DhcpInfoInternal orig) {
+ if (orig == null) return;
+
+ if (TextUtils.isEmpty(dns1)) {
+ dns1 = orig.dns1;
+ }
+
+ if (TextUtils.isEmpty(dns2)) {
+ dns2 = orig.dns2;
+ }
+
+ if (mRoutes.size() == 0) {
+ for (RouteInfo route : orig.getRoutes()) {
+ addRoute(route);
+ }
+ }
+ }
+
public String toString() {
String routeString = "";
- for (RouteInfo route : routes) routeString += route.toString() + " | ";
+ for (RouteInfo route : mRoutes) routeString += route.toString() + " | ";
return "addr: " + ipAddress + "/" + prefixLength +
- " routes: " + routeString +
+ " mRoutes: " + routeString +
" dns: " + dns1 + "," + dns2 +
" dhcpServer: " + serverAddress +
" leaseDuration: " + leaseDuration;
diff --git a/core/java/android/net/DhcpStateMachine.java b/core/java/android/net/DhcpStateMachine.java
index 445b2f77b06c..79c939565804 100644
--- a/core/java/android/net/DhcpStateMachine.java
+++ b/core/java/android/net/DhcpStateMachine.java
@@ -63,6 +63,9 @@ public class DhcpStateMachine extends StateMachine {
private PowerManager.WakeLock mDhcpRenewWakeLock;
private static final String WAKELOCK_TAG = "DHCP";
+ //Remember DHCP configuration from first request
+ private DhcpInfoInternal mDhcpInfo;
+
private static final int DHCP_RENEW = 0;
private static final String ACTION_DHCP_RENEW = "android.net.wifi.DHCP_RENEW";
@@ -335,9 +338,11 @@ public class DhcpStateMachine extends StateMachine {
if (dhcpAction == DhcpAction.START) {
Log.d(TAG, "DHCP request on " + mInterfaceName);
success = NetworkUtils.runDhcp(mInterfaceName, dhcpInfoInternal);
+ mDhcpInfo = dhcpInfoInternal;
} else if (dhcpAction == DhcpAction.RENEW) {
Log.d(TAG, "DHCP renewal on " + mInterfaceName);
success = NetworkUtils.runDhcpRenew(mInterfaceName, dhcpInfoInternal);
+ dhcpInfoInternal.updateFromDhcpRequest(mDhcpInfo);
}
if (success) {
diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java
index a5cdf70325ee..a6635bee205a 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -270,6 +270,11 @@ public class NetworkStatsHistory implements Parcelable {
|| entry.operations < 0) {
throw new IllegalArgumentException("tried recording negative data");
}
+ if (entry.rxBytes == 0 && entry.rxPackets == 0 && entry.txBytes == 0 && entry.txPackets == 0
+ && entry.operations == 0) {
+ // nothing to record; skip
+ return;
+ }
// create any buckets needed by this range
ensureBuckets(start, end);
diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java
index cd4902308b72..418b82fdeaa2 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -19,14 +19,15 @@ package android.net;
import static android.net.ConnectivityManager.TYPE_ETHERNET;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static android.net.ConnectivityManager.isNetworkTypeMobile;
import static android.net.NetworkIdentity.scrubSubscriberId;
import static android.telephony.TelephonyManager.NETWORK_CLASS_2_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_3_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_4_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_UNKNOWN;
import static android.telephony.TelephonyManager.getNetworkClass;
+import static com.android.internal.util.ArrayUtils.contains;
+import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
@@ -52,6 +53,16 @@ public class NetworkTemplate implements Parcelable {
public static final int MATCH_ETHERNET = 5;
/**
+ * Set of {@link NetworkInfo#getType()} that reflect data usage.
+ */
+ private static final int[] DATA_USAGE_NETWORK_TYPES;
+
+ static {
+ DATA_USAGE_NETWORK_TYPES = Resources.getSystem().getIntArray(
+ com.android.internal.R.array.config_data_usage_network_types);
+ }
+
+ /**
* Template to combine all {@link ConnectivityManager#TYPE_MOBILE} style
* networks together. Only uses statistics for requested IMSI.
*/
@@ -151,7 +162,7 @@ public class NetworkTemplate implements Parcelable {
}
/**
- * Test if this network matches the given template and IMSI.
+ * Test if given {@link NetworkIdentity} matches this template.
*/
public boolean matches(NetworkIdentity ident) {
switch (mMatchRule) {
@@ -171,23 +182,25 @@ public class NetworkTemplate implements Parcelable {
}
/**
- * Check if mobile network with matching IMSI. Also matches
- * {@link #TYPE_WIMAX}.
+ * Check if mobile network with matching IMSI.
*/
private boolean matchesMobile(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
- return true;
- } else if (ident.mType == TYPE_WIMAX) {
+ if (ident.mType == TYPE_WIMAX) {
+ // TODO: consider matching against WiMAX subscriber identity
return true;
+ } else {
+ return (contains(DATA_USAGE_NETWORK_TYPES, ident.mType)
+ && Objects.equal(mSubscriberId, ident.mSubscriberId));
}
- return false;
}
/**
* Check if mobile network classified 3G or lower with matching IMSI.
*/
private boolean matchesMobile3gLower(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
+ if (ident.mType == TYPE_WIMAX) {
+ return false;
+ } else if (matchesMobile(ident)) {
switch (getNetworkClass(ident.mSubType)) {
case NETWORK_CLASS_UNKNOWN:
case NETWORK_CLASS_2_G:
@@ -199,17 +212,17 @@ public class NetworkTemplate implements Parcelable {
}
/**
- * Check if mobile network classified 4G with matching IMSI. Also matches
- * {@link #TYPE_WIMAX}.
+ * Check if mobile network classified 4G with matching IMSI.
*/
private boolean matchesMobile4g(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
+ if (ident.mType == TYPE_WIMAX) {
+ // TODO: consider matching against WiMAX subscriber identity
+ return true;
+ } else if (matchesMobile(ident)) {
switch (getNetworkClass(ident.mSubType)) {
case NETWORK_CLASS_4_G:
return true;
}
- } else if (ident.mType == TYPE_WIMAX) {
- return true;
}
return false;
}
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 2c875c82e780..9d28effe27b1 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -353,6 +353,48 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
public abstract String toString();
/**
+ * Return a string representation of the URI that is safe to print
+ * to logs and other places where PII should be avoided.
+ * @hide
+ */
+ public String toSafeString() {
+ String scheme = getScheme();
+ String ssp = getSchemeSpecificPart();
+ if (scheme != null) {
+ if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip")
+ || scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto")
+ || scheme.equalsIgnoreCase("mailto")) {
+ StringBuilder builder = new StringBuilder(64);
+ builder.append(scheme);
+ builder.append(':');
+ if (ssp != null) {
+ for (int i=0; i<ssp.length(); i++) {
+ char c = ssp.charAt(i);
+ if (c == '-' || c == '@' || c == '.') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ }
+ return builder.toString();
+ }
+ }
+ // Not a sensitive scheme, but let's still be conservative about
+ // the data we include -- only the ssp, not the query params or
+ // fragment, because those can often have sensitive info.
+ StringBuilder builder = new StringBuilder(64);
+ if (scheme != null) {
+ builder.append(scheme);
+ builder.append(':');
+ }
+ if (ssp != null) {
+ builder.append(ssp);
+ }
+ return builder.toString();
+ }
+
+ /**
* Constructs a new builder, copying the attributes from this Uri.
*/
public abstract Builder buildUpon();
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index e392bca671ee..fe0106dc52c4 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -208,7 +208,9 @@ public final class NfcAdapter {
final NfcActivityManager mNfcActivityManager;
/**
- * @see {@link #setNdefPushMessageCallback}
+ * A callback to be invoked when the system successfully delivers your {@link NdefMessage}
+ * to another device.
+ * @see #setOnNdefPushCompleteCallback
*/
public interface OnNdefPushCompleteCallback {
/**
@@ -217,13 +219,21 @@ public final class NfcAdapter {
* <p>This callback is usually made on a binder thread (not the UI thread).
*
* @param event {@link NfcEvent} with the {@link NfcEvent#nfcAdapter} field set
- * @see {@link #setNdefPushMessageCallback}
+ * @see #setNdefPushMessageCallback
*/
public void onNdefPushComplete(NfcEvent event);
}
/**
- * @see {@link #setCeateNdefMessageCallback}
+ * A callback to be invoked when another NFC device capable of NDEF push (Android Beam)
+ * is within range.
+ * <p>Implement this interface and pass it to {@link
+ * NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()} in order to create an
+ * {@link NdefMessage} at the moment that another device is within range for NFC. Using this
+ * callback allows you to create a message with data that might vary based on the
+ * content currently visible to the user. Alternatively, you can call {@link
+ * #setNdefPushMessage setNdefPushMessage()} if the {@link NdefMessage} always contains the
+ * same data.
*/
public interface CreateNdefMessageCallback {
/**
@@ -507,13 +517,15 @@ public final class NfcAdapter {
* <p>Pass a null NDEF message to disable foreground NDEF push in the
* specified activities.
*
- * <p>One or more activities must be specified.
+ * <p>At least one activity must be specified, and usually only one is necessary.
*
* <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
*
* @param message NDEF message to push over NFC, or null to disable
- * @param activity an activity to enable for NDEF push (at least one is required)
- * @param activities zero or more additional activities to enable for NDEF Push
+ * @param activity an activity in which NDEF push should be enabled to share the provided
+ * NDEF message
+ * @param activities optional additional activities that should also enable NDEF push with
+ * the provided NDEF message
*/
public void setNdefPushMessage(NdefMessage message, Activity activity,
Activity ... activities) {
@@ -544,13 +556,15 @@ public final class NfcAdapter {
* <p>Pass a null callback to disable the callback in the
* specified activities.
*
- * <p>One or more activities must be specified.
+ * <p>At least one activity must be specified, and usually only one is necessary.
*
* <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
*
* @param callback callback, or null to disable
- * @param activity an activity to enable for NDEF push (at least one is required)
- * @param activities zero or more additional activities to enable for NDEF Push
+ * @param activity an activity in which NDEF push should be enabled to share an NDEF message
+ * that's retrieved from the provided callback
+ * @param activities optional additional activities that should also enable NDEF push using
+ * the provided callback
*/
public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity,
Activity ... activities) {
diff --git a/core/java/android/nfc/NfcEvent.java b/core/java/android/nfc/NfcEvent.java
index b00d8b755b03..860700a80f02 100644
--- a/core/java/android/nfc/NfcEvent.java
+++ b/core/java/android/nfc/NfcEvent.java
@@ -29,8 +29,8 @@ package android.nfc;
* in the callback) because it allows new fields to be added without breaking
* API compatibility.
*
- * @see {@link NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete}
- * @see {@link NfcAdapter.CreateNdefMessageCallback#createNdefMessage}
+ * @see NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete
+ * @see NfcAdapter.CreateNdefMessageCallback#createNdefMessage
*/
public final class NfcEvent {
/**
diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java
index 45e3a4ccf984..8b9945925da2 100644
--- a/core/java/android/preference/PreferenceScreen.java
+++ b/core/java/android/preference/PreferenceScreen.java
@@ -25,6 +25,8 @@ import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
+import android.view.Window;
+import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ListAdapter;
@@ -156,13 +158,13 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi
// Set the title bar if title is available, else no title bar
final CharSequence title = getTitle();
- Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title)
- ? com.android.internal.R.style.Theme_NoTitleBar
- : com.android.internal.R.style.Theme);
- dialog.setContentView(mListView);
- if (!TextUtils.isEmpty(title)) {
+ Dialog dialog = mDialog = new Dialog(context, context.getThemeResId());
+ if (TextUtils.isEmpty(title)) {
+ dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ } else {
dialog.setTitle(title);
}
+ dialog.setContentView(mListView);
dialog.setOnDismissListener(this);
if (state != null) {
dialog.onRestoreInstanceState(state);
@@ -189,9 +191,13 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi
}
public void onItemClick(AdapterView parent, View view, int position, long id) {
+ // If the list has headers, subtract them from the index.
+ if (parent instanceof ListView) {
+ position -= ((ListView) parent).getHeaderViewsCount();
+ }
Object item = getRootAdapter().getItem(position);
if (!(item instanceof Preference)) return;
-
+
final Preference preference = (Preference) item;
preference.performClick(this);
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index ca1d0d9e371d..fb119b343abd 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -2983,8 +2983,9 @@ public final class ContactsContract {
* long streamItemId = ContentUris.parseId(streamItemUri);
* </pre>
* </dd>
- * <dt>Via the {@link StreamItems#CONTENT_URI} URI:</dt>
+ * <dt>Via {@link StreamItems#CONTENT_URI}:</dt>
* <dd>
+ *<pre>
* ContentValues values = new ContentValues();
* values.put(StreamItems.RAW_CONTACT_ID, rawContactId);
* values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
@@ -2992,6 +2993,7 @@ public final class ContactsContract {
* values.put(StreamItems.COMMENTS, "3 people reshared this");
* Uri streamItemUri = getContentResolver().insert(StreamItems.CONTENT_URI, values);
* long streamItemId = ContentUris.parseId(streamItemUri);
+ *</pre>
* </dd>
* </dl>
* </dd>
@@ -3012,7 +3014,7 @@ public final class ContactsContract {
* StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), values);
* </pre>
* </dd>
- * <dt>Via {@link ContactsContract.StreamItems#CONTENT_PHOTO_URI}</dt>
+ * <dt>Via {@link ContactsContract.StreamItems#CONTENT_PHOTO_URI}:</dt>
* <dd>
* <pre>
* values.clear();
@@ -3021,7 +3023,7 @@ public final class ContactsContract {
* values.put(StreamItemPhotos.PHOTO, photoData);
* getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values);
* </pre>
- * Note that this latter form allows the insertion of a stream item and its
+ * <p>Note that this latter form allows the insertion of a stream item and its
* photos in a single transaction, by using {@link ContentProviderOperation} with
* back references to populate the stream item ID in the {@link ContentValues}.
* </dd>
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 5da31149968c..5f111eb8e73c 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -283,6 +283,17 @@ public final class MediaStore {
*/
public static final String IS_DRM = "is_drm";
+ /**
+ * The width of the image/video in pixels.
+ * @hide
+ */
+ public static final String WIDTH = "width";
+
+ /**
+ * The height of the image/video in pixels.
+ * @hide
+ */
+ public static final String HEIGHT = "height";
}
/**
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 2f9852d6a816..c3a2308d9df7 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -76,7 +76,7 @@ extends Layout
boolean includepad,
TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
this(base, display, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR,
- spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth);
+ spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth, Integer.MAX_VALUE);
}
/**
@@ -93,7 +93,7 @@ extends Layout
int width, Alignment align, TextDirectionHeuristic textDir,
float spacingmult, float spacingadd,
boolean includepad,
- TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
+ TextUtils.TruncateAt ellipsize, int ellipsizedWidth, int maxLines) {
super((ellipsize == null)
? display
: (display instanceof Spanned)
@@ -135,6 +135,8 @@ extends Layout
mEllipsize = true;
}
+ mMaxLines = maxLines;
+
// Initial state is a single line with 0 characters (0 to 0),
// with top at 0 and bottom at whatever is natural, and
// undefined ellipsis.
@@ -275,7 +277,7 @@ extends Layout
}
if (reflowed == null) {
- reflowed = new StaticLayout(getText());
+ reflowed = new StaticLayout(null);
} else {
reflowed.prepare();
}
@@ -283,7 +285,7 @@ extends Layout
reflowed.generate(text, where, where + after,
getPaint(), getWidth(), getAlignment(), getTextDirectionHeuristic(),
getSpacingMultiplier(), getSpacingAdd(),
- false, true, mEllipsizedWidth, mEllipsizeAt);
+ false, true, mEllipsizedWidth, mEllipsizeAt, mMaxLines);
int n = reflowed.getLineCount();
// If the new layout has a blank line at the end, but it is not
@@ -488,7 +490,9 @@ extends Layout
private int mTopPadding, mBottomPadding;
- private static StaticLayout sStaticLayout = null;
+ private int mMaxLines;
+
+ private static StaticLayout sStaticLayout = new StaticLayout(null);
private static final Object[] sLock = new Object[0];
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 5fed775dc035..231f9132e6ae 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -709,21 +709,18 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
T ret1 = null;
for (int i = 0; i < spanCount; i++) {
- if (!kind.isInstance(spans[i])) continue;
-
int spanStart = starts[i];
- int spanEnd = ends[i];
-
if (spanStart > gapstart) {
spanStart -= gaplen;
}
- if (spanEnd > gapstart) {
- spanEnd -= gaplen;
- }
-
if (spanStart > queryEnd) {
continue;
}
+
+ int spanEnd = ends[i];
+ if (spanEnd > gapstart) {
+ spanEnd -= gaplen;
+ }
if (spanEnd < queryStart) {
continue;
}
@@ -735,6 +732,9 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
continue;
}
+ // Expensive test, should be performed after the previous tests
+ if (!kind.isInstance(spans[i])) continue;
+
if (count == 0) {
// Safe conversion thanks to the isInstance test above
ret1 = (T) spans[i];
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index e8b2045ef828..7c273964fa5d 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -139,7 +139,7 @@ public class StaticLayout extends Layout {
generate(source, bufstart, bufend, paint, outerwidth, align, textDir,
spacingmult, spacingadd, includepad, includepad,
- ellipsizedWidth, ellipsize);
+ ellipsizedWidth, ellipsize, mMaximumVisibleLineCount);
mMeasured = MeasuredText.recycle(mMeasured);
mFontMetricsInt = null;
@@ -160,7 +160,7 @@ public class StaticLayout extends Layout {
Alignment align, TextDirectionHeuristic textDir,
float spacingmult, float spacingadd,
boolean includepad, boolean trackpad,
- float ellipsizedWidth, TextUtils.TruncateAt ellipsize) {
+ float ellipsizedWidth, TextUtils.TruncateAt ellipsize, int maxLines) {
mLineCount = 0;
int v = 0;
@@ -477,13 +477,13 @@ public class StaticLayout extends Layout {
width = restWidth;
}
}
- if (mLineCount >= mMaximumVisibleLineCount) {
+ if (mLineCount >= maxLines) {
break;
}
}
}
- if (paraEnd != here && mLineCount < mMaximumVisibleLineCount) {
+ if (paraEnd != here && mLineCount < maxLines) {
if ((fitTop | fitBottom | fitDescent | fitAscent) == 0) {
paint.getFontMetricsInt(fm);
@@ -514,7 +514,7 @@ public class StaticLayout extends Layout {
}
if ((bufEnd == bufStart || source.charAt(bufEnd - 1) == CHAR_NEW_LINE) &&
- mLineCount < mMaximumVisibleLineCount) {
+ mLineCount < maxLines) {
// Log.e("text", "output last " + bufEnd);
paint.getFontMetricsInt(fm);
@@ -763,7 +763,8 @@ public class StaticLayout extends Layout {
return;
}
- float ellipsisWidth = paint.measureText(HORIZONTAL_ELLIPSIS);
+ float ellipsisWidth = paint.measureText(
+ (where == TextUtils.TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS : ELLIPSIS_NORMAL);
int ellipsisStart = 0;
int ellipsisCount = 0;
int len = lineEnd - lineStart;
@@ -791,7 +792,8 @@ public class StaticLayout extends Layout {
Log.w(TAG, "Start Ellipsis only supported with one line");
}
}
- } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE) {
+ } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE ||
+ where == TextUtils.TruncateAt.END_SMALL) {
float sum = 0;
int i;
@@ -1001,7 +1003,9 @@ public class StaticLayout extends Layout {
private static final char CHAR_HYPHEN = '-';
private static final double EXTRA_ROUNDING = 0.5;
- private static final String HORIZONTAL_ELLIPSIS = "\u2026"; // this is "..."
+
+ private static final String ELLIPSIS_NORMAL = "\u2026"; // this is "..."
+ private static final String ELLIPSIS_TWO_DOTS = "\u2025"; // this is ".."
private static final int CHAR_FIRST_HIGH_SURROGATE = 0xD800;
private static final int CHAR_LAST_LOW_SURROGATE = 0xDFFF;
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index a52d48e630d1..68fea1907b87 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -30,6 +30,8 @@ import android.util.Log;
import com.android.internal.util.ArrayUtils;
+import java.lang.reflect.Array;
+
/**
* Represents a line of styled text, for measuring in visual order and
* for rendering.
@@ -679,6 +681,12 @@ class TextLine {
wp.getFontMetricsInt(fmi);
+ updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom,
+ previousLeading);
+ }
+
+ static void updateMetrics(FontMetricsInt fmi, int previousTop, int previousAscent,
+ int previousDescent, int previousBottom, int previousLeading) {
fmi.top = Math.min(fmi.top, previousTop);
fmi.ascent = Math.min(fmi.ascent, previousAscent);
fmi.descent = Math.max(fmi.descent, previousDescent);
@@ -809,7 +817,28 @@ class TextLine {
int textLimit = mStart + limit;
if (needWidth || (c != null && runIsRtl)) {
+ int previousTop = 0;
+ int previousAscent = 0;
+ int previousDescent = 0;
+ int previousBottom = 0;
+ int previousLeading = 0;
+
+ boolean needUpdateMetrics = (fmi != null);
+
+ if (needUpdateMetrics) {
+ previousTop = fmi.top;
+ previousAscent = fmi.ascent;
+ previousDescent = fmi.descent;
+ previousBottom = fmi.bottom;
+ previousLeading = fmi.leading;
+ }
+
ret = replacement.getSize(wp, mText, textStart, textLimit, fmi);
+
+ if (needUpdateMetrics) {
+ updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom,
+ previousLeading);
+ }
}
if (c != null) {
@@ -823,6 +852,73 @@ class TextLine {
return runIsRtl ? -ret : ret;
}
+ private static class SpanSet<E> {
+ final int numberOfSpans;
+ final E[] spans;
+ final int[] spanStarts;
+ final int[] spanEnds;
+ final int[] spanFlags;
+
+ @SuppressWarnings("unchecked")
+ SpanSet(Spanned spanned, int start, int limit, Class<? extends E> type) {
+ final E[] allSpans = spanned.getSpans(start, limit, type);
+ final int length = allSpans.length;
+ // These arrays may end up being too large because of empty spans
+ spans = (E[]) Array.newInstance(type, length);
+ spanStarts = new int[length];
+ spanEnds = new int[length];
+ spanFlags = new int[length];
+
+ int count = 0;
+ for (int i = 0; i < length; i++) {
+ final E span = allSpans[i];
+
+ final int spanStart = spanned.getSpanStart(span);
+ final int spanEnd = spanned.getSpanEnd(span);
+ if (spanStart == spanEnd) continue;
+
+ final int spanFlag = spanned.getSpanFlags(span);
+ final int priority = spanFlag & Spanned.SPAN_PRIORITY;
+ if (priority != 0 && count != 0) {
+ int j;
+
+ for (j = 0; j < count; j++) {
+ final int otherPriority = spanFlags[j] & Spanned.SPAN_PRIORITY;
+ if (priority > otherPriority) break;
+ }
+
+ System.arraycopy(spans, j, spans, j + 1, count - j);
+ System.arraycopy(spanStarts, j, spanStarts, j + 1, count - j);
+ System.arraycopy(spanEnds, j, spanEnds, j + 1, count - j);
+ System.arraycopy(spanFlags, j, spanFlags, j + 1, count - j);
+
+ spans[j] = span;
+ spanStarts[j] = spanStart;
+ spanEnds[j] = spanEnd;
+ spanFlags[j] = spanFlag;
+ } else {
+ spans[i] = span;
+ spanStarts[i] = spanStart;
+ spanEnds[i] = spanEnd;
+ spanFlags[i] = spanFlag;
+ }
+
+ count++;
+ }
+ numberOfSpans = count;
+ }
+
+ int getNextTransition(int start, int limit) {
+ for (int i = 0; i < numberOfSpans; i++) {
+ final int spanStart = spanStarts[i];
+ final int spanEnd = spanEnds[i];
+ if (spanStart > start && spanStart < limit) limit = spanStart;
+ if (spanEnd > start && spanEnd < limit) limit = spanEnd;
+ }
+ return limit;
+ }
+ }
+
/**
* Utility function for handling a unidirectional run. The run must not
* contain tabs or emoji but can contain styles.
@@ -856,66 +952,70 @@ class TextLine {
return 0f;
}
+ if (mSpanned == null) {
+ TextPaint wp = mWorkPaint;
+ wp.set(mPaint);
+ final int mlimit = measureLimit;
+ return handleText(wp, start, mlimit, start, limit, runIsRtl, c, x, top,
+ y, bottom, fmi, needWidth || mlimit < measureLimit);
+ }
+
+ final SpanSet<MetricAffectingSpan> metricAffectingSpans = new SpanSet<MetricAffectingSpan>(
+ mSpanned, mStart + start, mStart + limit, MetricAffectingSpan.class);
+ final SpanSet<CharacterStyle> characterStyleSpans = new SpanSet<CharacterStyle>(
+ mSpanned, mStart + start, mStart + limit, CharacterStyle.class);
+
// Shaping needs to take into account context up to metric boundaries,
// but rendering needs to take into account character style boundaries.
// So we iterate through metric runs to get metric bounds,
// then within each metric run iterate through character style runs
// for the run bounds.
- float ox = x;
+ final float originalX = x;
for (int i = start, inext; i < measureLimit; i = inext) {
TextPaint wp = mWorkPaint;
wp.set(mPaint);
- int mlimit;
- if (mSpanned == null) {
- inext = limit;
- mlimit = measureLimit;
- } else {
- inext = mSpanned.nextSpanTransition(mStart + i, mStart + limit,
- MetricAffectingSpan.class) - mStart;
-
- mlimit = inext < measureLimit ? inext : measureLimit;
- MetricAffectingSpan[] spans = mSpanned.getSpans(mStart + i,
- mStart + mlimit, MetricAffectingSpan.class);
- spans = TextUtils.removeEmptySpans(spans, mSpanned, MetricAffectingSpan.class);
-
- if (spans.length > 0) {
- ReplacementSpan replacement = null;
- for (int j = 0; j < spans.length; j++) {
- MetricAffectingSpan span = spans[j];
- if (span instanceof ReplacementSpan) {
- replacement = (ReplacementSpan)span;
- } else {
- // We might have a replacement that uses the draw
- // state, otherwise measure state would suffice.
- span.updateDrawState(wp);
- }
- }
-
- if (replacement != null) {
- x += handleReplacement(replacement, wp, i,
- mlimit, runIsRtl, c, x, top, y, bottom, fmi,
- needWidth || mlimit < measureLimit);
- continue;
- }
+ inext = metricAffectingSpans.getNextTransition(mStart + i, mStart + limit) - mStart;
+ int mlimit = Math.min(inext, measureLimit);
+
+ ReplacementSpan replacement = null;
+
+ for (int j = 0; j < metricAffectingSpans.numberOfSpans; j++) {
+ // Both intervals [spanStarts..spanEnds] and [mStart + i..mStart + mlimit] are NOT
+ // empty by construction. This special case in getSpans() explains the >= & <= tests
+ if ((metricAffectingSpans.spanStarts[j] >= mStart + mlimit) ||
+ (metricAffectingSpans.spanEnds[j] <= mStart + i)) continue;
+ MetricAffectingSpan span = metricAffectingSpans.spans[j];
+ if (span instanceof ReplacementSpan) {
+ replacement = (ReplacementSpan)span;
+ } else {
+ // We might have a replacement that uses the draw
+ // state, otherwise measure state would suffice.
+ span.updateDrawState(wp);
}
}
- if (mSpanned == null || c == null) {
+ if (replacement != null) {
+ x += handleReplacement(replacement, wp, i, mlimit, runIsRtl, c, x, top, y,
+ bottom, fmi, needWidth || mlimit < measureLimit);
+ continue;
+ }
+
+ if (c == null) {
x += handleText(wp, i, mlimit, i, inext, runIsRtl, c, x, top,
y, bottom, fmi, needWidth || mlimit < measureLimit);
} else {
for (int j = i, jnext; j < mlimit; j = jnext) {
- jnext = mSpanned.nextSpanTransition(mStart + j,
- mStart + mlimit, CharacterStyle.class) - mStart;
-
- CharacterStyle[] spans = mSpanned.getSpans(mStart + j,
- mStart + jnext, CharacterStyle.class);
- spans = TextUtils.removeEmptySpans(spans, mSpanned, CharacterStyle.class);
+ jnext = characterStyleSpans.getNextTransition(mStart + j, mStart + mlimit) -
+ mStart;
wp.set(mPaint);
- for (int k = 0; k < spans.length; k++) {
- CharacterStyle span = spans[k];
+ for (int k = 0; k < characterStyleSpans.numberOfSpans; k++) {
+ // Intentionally using >= and <= as explained above
+ if ((characterStyleSpans.spanStarts[k] >= mStart + jnext) ||
+ (characterStyleSpans.spanEnds[k] <= mStart + j)) continue;
+
+ CharacterStyle span = characterStyleSpans.spans[k];
span.updateDrawState(wp);
}
@@ -925,7 +1025,7 @@ class TextLine {
}
}
- return x - ox;
+ return x - originalX;
}
/**
@@ -970,8 +1070,7 @@ class TextLine {
}
pos += mStart;
- MetricAffectingSpan[] spans = mSpanned.getSpans(pos, pos + 1,
- MetricAffectingSpan.class);
+ MetricAffectingSpan[] spans = mSpanned.getSpans(pos, pos + 1, MetricAffectingSpan.class);
if (spans.length == 0) {
return mPaint.ascent();
}
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 894afbdc20ef..95a3cdc6ad8d 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -53,9 +53,8 @@ import java.util.Iterator;
import java.util.regex.Pattern;
public class TextUtils {
- private TextUtils() { /* cannot be instantiated */ }
- private static String[] EMPTY_STRING_ARRAY = new String[]{};
+ private TextUtils() { /* cannot be instantiated */ }
public static void getChars(CharSequence s, int start, int end,
char[] dest, int destoff) {
@@ -1000,6 +999,10 @@ public class TextUtils {
MIDDLE,
END,
MARQUEE,
+ /**
+ * @hide
+ */
+ END_SMALL
}
public interface EllipsizeCallback {
@@ -1010,8 +1013,6 @@ public class TextUtils {
public void ellipsized(int start, int end);
}
- private static String sEllipsis = null;
-
/**
* Returns the original text if it fits in the specified width
* given the properties of the specified Paint,
@@ -1042,7 +1043,8 @@ public class TextUtils {
boolean preserveLength,
EllipsizeCallback callback) {
return ellipsize(text, paint, avail, where, preserveLength, callback,
- TextDirectionHeuristics.FIRSTSTRONG_LTR);
+ TextDirectionHeuristics.FIRSTSTRONG_LTR,
+ (where == TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS : ELLIPSIS_NORMAL);
}
/**
@@ -1063,11 +1065,7 @@ public class TextUtils {
float avail, TruncateAt where,
boolean preserveLength,
EllipsizeCallback callback,
- TextDirectionHeuristic textDir) {
- if (sEllipsis == null) {
- Resources r = Resources.getSystem();
- sEllipsis = r.getString(R.string.ellipsis);
- }
+ TextDirectionHeuristic textDir, String ellipsis) {
int len = text.length();
@@ -1085,7 +1083,7 @@ public class TextUtils {
// XXX assumes ellipsis string does not require shaping and
// is unaffected by style
- float ellipsiswid = paint.measureText(sEllipsis);
+ float ellipsiswid = paint.measureText(ellipsis);
avail -= ellipsiswid;
int left = 0;
@@ -1094,7 +1092,7 @@ public class TextUtils {
// it all goes
} else if (where == TruncateAt.START) {
right = len - mt.breakText(0, len, false, avail);
- } else if (where == TruncateAt.END) {
+ } else if (where == TruncateAt.END || where == TruncateAt.END_SMALL) {
left = mt.breakText(0, len, true, avail);
} else {
right = len - mt.breakText(0, len, false, avail / 2);
@@ -1112,10 +1110,10 @@ public class TextUtils {
int remaining = len - (right - left);
if (preserveLength) {
if (remaining > 0) { // else eliminate the ellipsis too
- buf[left++] = '\u2026';
+ buf[left++] = ellipsis.charAt(0);
}
for (int i = left; i < right; i++) {
- buf[i] = '\uFEFF';
+ buf[i] = ZWNBS_CHAR;
}
String s = new String(buf, 0, len);
if (sp == null) {
@@ -1131,16 +1129,16 @@ public class TextUtils {
}
if (sp == null) {
- StringBuilder sb = new StringBuilder(remaining + sEllipsis.length());
+ StringBuilder sb = new StringBuilder(remaining + ellipsis.length());
sb.append(buf, 0, left);
- sb.append(sEllipsis);
+ sb.append(ellipsis);
sb.append(buf, right, len - right);
return sb.toString();
}
SpannableStringBuilder ssb = new SpannableStringBuilder();
ssb.append(text, 0, left);
- ssb.append(sEllipsis);
+ ssb.append(ellipsis);
ssb.append(text, right, len);
return ssb;
} finally {
@@ -1664,4 +1662,13 @@ public class TextUtils {
private static Object sLock = new Object();
private static char[] sTemp = null;
+
+ private static String[] EMPTY_STRING_ARRAY = new String[]{};
+
+ private static final char ZWNBS_CHAR = '\uFEFF';
+
+ private static final String ELLIPSIS_NORMAL = Resources.getSystem().getString(
+ R.string.ellipsis);
+ private static final String ELLIPSIS_TWO_DOTS = Resources.getSystem().getString(
+ R.string.ellipsis_two_dots);
}
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index 5926db3713db..b4445ca1e0ed 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -22,8 +22,8 @@ import java.util.Locale;
import java.util.TimeZone;
/**
- * The Time class is a faster replacement for the java.util.Calendar and
- * java.util.GregorianCalendar classes. An instance of the Time class represents
+ * An alternative to the {@link java.util.Calendar} and
+ * {@link java.util.GregorianCalendar} classes. An instance of the Time class represents
* a moment in time, specified with second precision. It is modelled after
* struct tm, and in fact, uses struct tm to implement most of the
* functionality.
@@ -79,7 +79,7 @@ public class Time {
public int month;
/**
- * Year. TBD. Is this years since 1900 like in struct tm?
+ * Year. For example, 1970.
*/
public int year;
diff --git a/core/java/android/text/method/Touch.java b/core/java/android/text/method/Touch.java
index 3f9b94563a0b..106a80190b36 100644
--- a/core/java/android/text/method/Touch.java
+++ b/core/java/android/text/method/Touch.java
@@ -35,44 +35,39 @@ public class Touch {
* Y position.
*/
public static void scrollTo(TextView widget, Layout layout, int x, int y) {
- int padding = widget.getTotalPaddingTop() +
- widget.getTotalPaddingBottom();
- int top = layout.getLineForVertical(y);
- int bottom = layout.getLineForVertical(y + widget.getHeight() -
- padding);
+ final int verticalPadding = widget.getTotalPaddingTop() + widget.getTotalPaddingBottom();
+ final int top = layout.getLineForVertical(y);
+ final int bottom = layout.getLineForVertical(y + widget.getHeight() - verticalPadding);
int left = Integer.MAX_VALUE;
int right = 0;
- Alignment a = null;
- boolean ltr = true;
+ Alignment a = layout.getParagraphAlignment(top);
+ boolean ltr = layout.getParagraphDirection(top) > 0;
for (int i = top; i <= bottom; i++) {
left = (int) Math.min(left, layout.getLineLeft(i));
right = (int) Math.max(right, layout.getLineRight(i));
-
- if (a == null) {
- a = layout.getParagraphAlignment(i);
- ltr = layout.getParagraphDirection(i) > 0;
- }
}
- padding = widget.getTotalPaddingLeft() + widget.getTotalPaddingRight();
- int width = widget.getWidth();
- int diff = 0;
+ final int hoizontalPadding = widget.getTotalPaddingLeft() + widget.getTotalPaddingRight();
+ final int availableWidth = widget.getWidth() - hoizontalPadding;
+ final int actualWidth = right - left;
- // align_opposite does NOT mean align_right, we need the paragraph
- // direction to resolve it to left or right
- if (right - left < width - padding) {
+ if (actualWidth < availableWidth) {
if (a == Alignment.ALIGN_CENTER) {
- diff = (width - padding - (right - left)) / 2;
- } else if (ltr == (a == Alignment.ALIGN_OPPOSITE)) {
- diff = width - padding - (right - left);
+ x = left - ((availableWidth - actualWidth) / 2);
+ } else if ((ltr && (a == Alignment.ALIGN_OPPOSITE)) || (a == Alignment.ALIGN_RIGHT)) {
+ // align_opposite does NOT mean align_right, we need the paragraph
+ // direction to resolve it to left or right
+ x = left - (availableWidth - actualWidth);
+ } else {
+ x = left;
}
+ } else {
+ x = Math.min(x, right - availableWidth);
+ x = Math.max(x, left);
}
- x = Math.min(x, right - (width - padding) - diff);
- x = Math.max(x, left - diff);
-
widget.scrollTo(x, y);
}
diff --git a/core/java/android/text/style/SpellCheckSpan.java b/core/java/android/text/style/SpellCheckSpan.java
index caaae99630a1..0d8a1034ed8f 100644
--- a/core/java/android/text/style/SpellCheckSpan.java
+++ b/core/java/android/text/style/SpellCheckSpan.java
@@ -39,8 +39,8 @@ public class SpellCheckSpan implements ParcelableSpan {
mSpellCheckInProgress = (src.readInt() != 0);
}
- public void setSpellCheckInProgress() {
- mSpellCheckInProgress = true;
+ public void setSpellCheckInProgress(boolean inProgress) {
+ mSpellCheckInProgress = inProgress;
}
public boolean isSpellCheckInProgress() {
diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java
index 5601dc526c2f..ed976ab1d6b6 100644
--- a/core/java/android/view/ActionProvider.java
+++ b/core/java/android/view/ActionProvider.java
@@ -58,6 +58,7 @@ import android.content.Context;
* @see MenuItem#getActionProvider()
*/
public abstract class ActionProvider {
+ private SubUiVisibilityListener mSubUiVisibilityListener;
/**
* Creates a new instance.
@@ -138,4 +139,31 @@ public abstract class ActionProvider {
*/
public void onPrepareSubMenu(SubMenu subMenu) {
}
+
+ /**
+ * Notify the system that the visibility of an action view's sub-UI such as
+ * an anchored popup has changed. This will affect how other system
+ * visibility notifications occur.
+ *
+ * @hide Pending future API approval
+ */
+ public void subUiVisibilityChanged(boolean isVisible) {
+ if (mSubUiVisibilityListener != null) {
+ mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible);
+ }
+ }
+
+ /**
+ * @hide Internal use only
+ */
+ public void setSubUiVisibilityListener(SubUiVisibilityListener listener) {
+ mSubUiVisibilityListener = listener;
+ }
+
+ /**
+ * @hide Internal use only
+ */
+ public interface SubUiVisibilityListener {
+ public void onSubUiVisibilityChanged(boolean isVisible);
+ }
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 335c66b036dc..45f9da21c435 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -116,6 +116,7 @@ interface IWindowManager
boolean isKeyguardLocked();
boolean isKeyguardSecure();
boolean inKeyguardRestrictedInputMode();
+ void dismissKeyguard();
void closeSystemDialogs(String reason);
@@ -163,15 +164,13 @@ interface IWindowManager
// These can only be called with the SET_ORIENTATION permission.
/**
- * Change the current screen rotation, constants as per
- * {@link android.view.Surface}.
- * @param rotation the intended rotation.
+ * Update the current screen rotation based on the current state of
+ * the world.
* @param alwaysSendConfiguration Flag to force a new configuration to
* be evaluated. This can be used when there are other parameters in
* configuration that are changing.
- * @param animFlags Animation flags as per {@link android.view.Surface}.
*/
- void setRotation(int rotation, boolean alwaysSendConfiguration, int animFlags);
+ void updateRotation(boolean alwaysSendConfiguration);
/**
* Retrieve the current screen orientation, constants as per
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 3880bc45b4f3..64d3d3101cdb 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -207,9 +207,6 @@ public class Surface implements Parcelable {
/** Enable dithering when compositing this surface @hide */
public static final int SURFACE_DITHER = 0x04;
-
- /** Disable the orientation animation @hide */
- public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001;
// The mSurfaceControl will only be present for Surfaces used by the window
// server or system processes. When this class is parceled we defer to the
@@ -393,7 +390,7 @@ public class Surface implements Parcelable {
* set the orientation of the given display.
* @param display
* @param orientation
- * @param flags
+ * @param flags Currently unused, set to 0.
* @hide
*/
public static native void setOrientation(int display, int orientation, int flags);
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index c735d6bddba6..d57132aef84d 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -93,6 +93,11 @@ import android.util.Log;
* been invoked.) It is therefore highly recommended you use a listener to
* be notified when the SurfaceTexture becomes available.</p>
*
+ * <p>It is important to note that only one producer can use the TextureView.
+ * For instance, if you use a TextureView to display the camera preview, you
+ * cannot use {@link #lockCanvas()} to draw onto the TextureView at the same
+ * time.</p>
+ *
* @see SurfaceView
* @see SurfaceTexture
*/
@@ -245,6 +250,11 @@ public class TextureView extends View {
return LAYER_TYPE_HARDWARE;
}
+ @Override
+ boolean hasStaticLayer() {
+ return true;
+ }
+
/**
* Calling this method has no effect.
*/
@@ -523,6 +533,10 @@ public class TextureView extends View {
* rectangle is specified, in which case, non-dirty pixels will be
* preserved.</p>
*
+ * <p>This method can only be used if the underlying surface is not already
+ * owned by another producer. For instance, if the TextureView is being used
+ * to render the camera's preview you cannot invoke this method.</p>
+ *
* @return A Canvas used to draw into the surface.
*
* @see #lockCanvas(android.graphics.Rect)
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f993160f1829..d193d6e41504 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -81,7 +81,6 @@ import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
-import java.util.WeakHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -1497,12 +1496,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
/**
* Map used to store views' tags.
*/
- private static WeakHashMap<View, SparseArray<Object>> sTags;
-
- /**
- * Lock used to access sTags.
- */
- private static final Object sTagsLock = new Object();
+ private SparseArray<Object> mKeyedTags;
/**
* The next available accessiiblity id.
@@ -2915,6 +2909,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
initializeScrollbars(a);
}
break;
+ //noinspection deprecation
case R.styleable.View_fadingEdge:
if (context.getApplicationInfo().targetSdkVersion >= ICE_CREAM_SANDWICH) {
// Ignore the attribute starting with ICS
@@ -3900,6 +3895,12 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
* Note: Called from the default {@link AccessibilityDelegate}.
*/
boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ // Do not populate text to scroll events. They describe position change
+ // and usually come from container with a lot of text which is not very
+ // informative for accessibility purposes. Also they are fired frequently.
+ if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+ return true;
+ }
onPopulateAccessibilityEvent(event);
return false;
}
@@ -10000,6 +10001,15 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
}
/**
+ * Indicates whether this view has a static layer. A view with layer type
+ * {@link #LAYER_TYPE_NONE} is a static layer. Other types of layers are
+ * dynamic.
+ */
+ boolean hasStaticLayer() {
+ return mLayerType == LAYER_TYPE_NONE;
+ }
+
+ /**
* Indicates what type of layer is currently associated with this view. By default
* a view does not have a layer, and the layer type is {@link #LAYER_TYPE_NONE}.
* Refer to the documentation of {@link #setLayerType(int, android.graphics.Paint)}
@@ -12236,14 +12246,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
* @see #getTag()
*/
public Object getTag(int key) {
- SparseArray<Object> tags = null;
- synchronized (sTagsLock) {
- if (sTags != null) {
- tags = sTags.get(this);
- }
- }
-
- if (tags != null) return tags.get(key);
+ if (mKeyedTags != null) return mKeyedTags.get(key);
return null;
}
@@ -12276,7 +12279,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
+ "resource id.");
}
- setTagInternal(this, key, tag);
+ setKeyedTag(key, tag);
}
/**
@@ -12291,27 +12294,15 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
+ "resource id.");
}
- setTagInternal(this, key, tag);
+ setKeyedTag(key, tag);
}
- private static void setTagInternal(View view, int key, Object tag) {
- SparseArray<Object> tags = null;
- synchronized (sTagsLock) {
- if (sTags == null) {
- sTags = new WeakHashMap<View, SparseArray<Object>>();
- } else {
- tags = sTags.get(view);
- }
- }
-
- if (tags == null) {
- tags = new SparseArray<Object>(2);
- synchronized (sTagsLock) {
- sTags.put(view, tags);
- }
+ private void setKeyedTag(int key, Object tag) {
+ if (mKeyedTags == null) {
+ mKeyedTags = new SparseArray<Object>();
}
- tags.put(key, tag);
+ mKeyedTags.put(key, tag);
}
/**
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c7b59b8b79f0..fb0d80a688e4 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -34,7 +34,6 @@ import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
-import android.view.View.AccessibilityDelegate;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
@@ -290,6 +289,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
private static final int FLAG_SPLIT_MOTION_EVENTS = 0x200000;
/**
+ * When set, this ViewGroup will not dispatch onAttachedToWindow calls
+ * to children when adding new views. This is used to prevent multiple
+ * onAttached calls when a ViewGroup adds children in its own onAttached method.
+ */
+ private static final int FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW = 0x400000;
+
+ /**
* Indicates which types of drawing caches are to be kept in memory.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
@@ -608,9 +614,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* Called when a child has requested sending an {@link AccessibilityEvent} and
* gives an opportunity to its parent to augment the event.
* <p>
- * If an {@link AccessibilityDelegate} has been specified via calling
- * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
- * {@link AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
+ * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
+ * {@link android.view.View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
+ * {@link android.view.View.AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
* is responsible for handling this call.
* </p>
*
@@ -2154,8 +2160,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
*/
@Override
void dispatchAttachedToWindow(AttachInfo info, int visibility) {
+ mGroupFlags |= FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW;
super.dispatchAttachedToWindow(info, visibility);
+ mGroupFlags &= ~FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW;
+
visibility |= mViewFlags & VISIBILITY_MASK;
+
final int count = mChildrenCount;
final View[] children = mChildren;
for (int i = 0; i < count; i++) {
@@ -2165,13 +2175,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
@Override
boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
- // We first get a chance to populate the event.
- super.dispatchPopulateAccessibilityEventInternal(event);
+ boolean handled = super.dispatchPopulateAccessibilityEventInternal(event);
+ if (handled) {
+ return handled;
+ }
// Let our children have a shot in populating the event.
for (int i = 0, count = getChildCount(); i < count; i++) {
View child = getChildAt(i);
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
- boolean handled = getChildAt(i).dispatchPopulateAccessibilityEvent(event);
+ handled = getChildAt(i).dispatchPopulateAccessibilityEvent(event);
if (handled) {
return handled;
}
@@ -2548,7 +2560,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
final View[] children = mChildren;
for (int i = 0; i < count; i++) {
final View child = children[i];
- if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
+ if (((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) &&
+ child.hasStaticLayer()) {
child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED;
child.mPrivateFlags &= ~INVALIDATED;
child.getDisplayList();
@@ -2811,6 +2824,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
if (hasDisplayList) {
displayList = child.getDisplayList();
+ if (!displayList.isValid()) {
+ // Uncommon, but possible. If a view is removed from the hierarchy during the call
+ // to getDisplayList(), the display list will be marked invalid and we should not
+ // try to use it again.
+ displayList = null;
+ hasDisplayList = false;
+ }
}
if (hasNoCache) {
@@ -3321,7 +3341,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
AttachInfo ai = mAttachInfo;
- if (ai != null) {
+ if (ai != null && (mGroupFlags & FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW) == 0) {
boolean lastKeepOn = ai.mKeepScreenOn;
ai.mKeepScreenOn = false;
child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK));
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 46119843951f..9cb4e5e7b0a8 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1054,7 +1054,6 @@ public final class ViewRootImpl extends Handler implements ViewParent,
|| attachInfo.mSystemUiVisibility != oldVis
|| attachInfo.mHasSystemUiListeners) {
params = lp;
- windowAttributesChanges |= WindowManager.LayoutParams.BUFFER_CHANGED;
}
}
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java
index fb87e23a4d9e..122865e1e4cf 100644
--- a/core/java/android/view/VolumePanel.java
+++ b/core/java/android/view/VolumePanel.java
@@ -34,10 +34,12 @@ import android.media.ToneGenerator;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
+import android.os.RemoteException;
import android.os.Vibrator;
import android.provider.Settings;
import android.provider.Settings.System;
import android.util.Log;
+import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
@@ -175,20 +177,8 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
View view = mView = inflater.inflate(R.layout.volume_adjust, null);
mView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
- // Dismiss the dialog if the user touches outside the visible area. This is not
- // handled by the usual dialog dismissing code because there is a region above
- // the panel (marginTop) that is still within the dialog.
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- int x = (int) event.getX();
- int y = (int) event.getY();
- if (x < mPanel.getLeft() || x > mPanel.getRight() || y < mPanel.getTop()
- || y > mPanel.getBottom()) {
- forceTimeout();
- return true;
- }
- }
resetTimeout();
- return true;
+ return false;
}
});
mPanel = (ViewGroup) mView.findViewById(R.id.visible_panel);
@@ -196,7 +186,15 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
mMoreButton = (ImageView) mView.findViewById(R.id.expand_button);
mDivider = (ImageView) mView.findViewById(R.id.expand_button_divider);
- mDialog = new Dialog(context, R.style.Theme_Panel_Volume);
+ mDialog = new Dialog(context, R.style.Theme_Panel_Volume) {
+ public boolean onTouchEvent(MotionEvent event) {
+ if (isShowing() && event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ forceTimeout();
+ return true;
+ }
+ return false;
+ }
+ };
mDialog.setTitle("Volume control"); // No need to localize
mDialog.setContentView(mView);
mDialog.setOnDismissListener(new OnDismissListener() {
@@ -208,11 +206,17 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
// Change some window properties
Window window = mDialog.getWindow();
window.setGravity(Gravity.TOP);
- WindowManager.LayoutParams lp = window.getAttributes();
+ LayoutParams lp = window.getAttributes();
lp.token = null;
- lp.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
+ // Offset from the top
+ lp.y = mContext.getResources().getDimensionPixelOffset(
+ com.android.internal.R.dimen.volume_panel_top);
+ lp.type = LayoutParams.TYPE_VOLUME_OVERLAY;
+ lp.width = LayoutParams.WRAP_CONTENT;
+ lp.height = LayoutParams.WRAP_CONTENT;
window.setAttributes(lp);
- window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
mToneGenerators = new ToneGenerator[AudioSystem.getNumStreamTypes()];
mVibrator = new Vibrator();
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 75c75927a769..d0841dd2b3e7 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -26,6 +26,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.SystemProperties;
import android.util.Slog;
import android.view.accessibility.AccessibilityEvent;
@@ -472,11 +473,14 @@ public abstract class Window {
}
private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper {
+ private static final String PROPERTY_HARDWARE_UI = "persist.sys.ui.hw";
+
private final boolean mHardwareAccelerated;
LocalWindowManager(WindowManager wm, boolean hardwareAccelerated) {
super(wm, getCompatInfo(mContext));
- mHardwareAccelerated = hardwareAccelerated;
+ mHardwareAccelerated = hardwareAccelerated ||
+ SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);
}
public boolean isHardwareAccelerated() {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index c07faf63d222..4f67675c1aed 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -375,12 +375,6 @@ public interface WindowManagerPolicy {
/** Screen turned off because of proximity sensor */
public final int OFF_BECAUSE_OF_PROX_SENSOR = 4;
- /**
- * Magic constant to {@link IWindowManager#setRotation} to not actually
- * modify the rotation.
- */
- public final int USE_LAST_ROTATION = -1000;
-
/** When not otherwise specified by the activity's screenOrientation, rotation should be
* determined by the system (that is, using sensors). */
public final int USER_ROTATION_FREE = 0;
@@ -856,22 +850,42 @@ public interface WindowManagerPolicy {
public boolean inKeyguardRestrictedKeyInputMode();
/**
- * Given an orientation constant
- * ({@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE
- * ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE} or
- * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_PORTRAIT
- * ActivityInfo.SCREEN_ORIENTATION_PORTRAIT}), return a surface
- * rotation.
+ * Ask the policy to dismiss the keyguard, if it is currently shown.
*/
- public int rotationForOrientationLw(int orientation, int lastRotation,
- boolean displayEnabled);
-
+ public void dismissKeyguardLw();
+
+ /**
+ * Given an orientation constant, returns the appropriate surface rotation,
+ * taking into account sensors, docking mode, rotation lock, and other factors.
+ *
+ * @param orientation An orientation constant, such as
+ * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}.
+ * @param lastRotation The most recently used rotation.
+ * @return The surface rotation to use.
+ */
+ public int rotationForOrientationLw(int orientation, int lastRotation);
+
/**
- * Return the currently locked screen rotation, if any. Return
- * Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, or
- * Surface.ROTATION_270 if locked; return -1 if not locked.
+ * Given an orientation constant and a rotation, returns true if the rotation
+ * has compatible metrics to the requested orientation. For example, if
+ * the application requested landscape and got seascape, then the rotation
+ * has compatible metrics; if the application requested portrait and got landscape,
+ * then the rotation has incompatible metrics; if the application did not specify
+ * a preference, then anything goes.
+ *
+ * @param orientation An orientation constant, such as
+ * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}.
+ * @param rotation The rotation to check.
+ * @return True if the rotation is compatible with the requested orientation.
+ */
+ public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation);
+
+ /**
+ * Called by the window manager when the rotation changes.
+ *
+ * @param rotation The new rotation.
*/
- public int getLockedRotationLw();
+ public void setRotationLw(int rotation);
/**
* Called when the system is mostly done booting to determine whether
diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java
index 76b47ca5a5e5..c3c74a7c59c5 100755
--- a/core/java/android/view/WindowOrientationListener.java
+++ b/core/java/android/view/WindowOrientationListener.java
@@ -26,7 +26,7 @@ import android.util.Slog;
/**
* A special helper class used by the WindowManager
- * for receiving notifications from the SensorManager when
+ * for receiving notifications from the SensorManager when
* the orientation of the device has changed.
*
* NOTE: If changing anything here, please run the API demo
@@ -54,6 +54,7 @@ public abstract class WindowOrientationListener {
private Sensor mSensor;
private SensorEventListenerImpl mSensorEventListener;
boolean mLogEnabled;
+ int mCurrentRotation = -1;
/**
* Creates a new WindowOrientationListener.
@@ -117,15 +118,27 @@ public abstract class WindowOrientationListener {
}
/**
- * Gets the current orientation.
- * @param lastRotation
- * @return
+ * Sets the current rotation.
+ *
+ * @param rotation The current rotation.
+ */
+ public void setCurrentRotation(int rotation) {
+ mCurrentRotation = rotation;
+ }
+
+ /**
+ * Gets the proposed rotation.
+ *
+ * This method only returns a rotation if the orientation listener is certain
+ * of its proposal. If the rotation is indeterminate, returns -1.
+ *
+ * @return The proposed rotation, or -1 if unknown.
*/
- public int getCurrentRotation(int lastRotation) {
+ public int getProposedRotation() {
if (mEnabled) {
- return mSensorEventListener.getCurrentRotation(lastRotation);
+ return mSensorEventListener.getProposedRotation();
}
- return lastRotation;
+ return -1;
}
/**
@@ -138,10 +151,14 @@ public abstract class WindowOrientationListener {
/**
* Called when the rotation view of the device has changed.
*
+ * This method is called whenever the orientation becomes certain of an orientation.
+ * It is called each time the orientation determination transitions from being
+ * uncertain to being certain again, even if it is the same orientation as before.
+ *
* @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants.
* @see Surface
*/
- public abstract void onOrientationChanged(int rotation);
+ public abstract void onProposedRotationChanged(int rotation);
/**
* Enables or disables the window orientation listener logging for use with
@@ -183,23 +200,8 @@ public abstract class WindowOrientationListener {
* to the corresponding orientation. These thresholds have some hysteresis built-in
* to avoid oscillations between adjacent orientations.
*
- * - Use the magnitude to judge the confidence of the orientation.
- * Under ideal conditions, the magnitude should equal to that of gravity. When it
- * differs significantly, we know the device is under external acceleration and
- * we can't trust the data.
- *
- * - Use the tilt angle to judge the confidence of the orientation.
- * When the tilt angle is high in absolute value then the device is nearly flat
- * so small physical movements produce large changes in orientation angle.
- * This can be the case when the device is being picked up from a table.
- *
- * - Use the orientation angle to judge the confidence of the orientation.
- * The close the orientation angle is to the canonical orientation angle, the better.
- *
- * - Based on the aggregate confidence, we determine how long we want to wait for
- * the new orientation to settle. This is accomplished by integrating the confidence
- * for each orientation over time. When a threshold integration sum is reached
- * then we actually change orientations.
+ * - Wait for the device to settle for a little bit. Once that happens, issue the
+ * new orientation proposal.
*
* Details are explained inline.
*/
@@ -212,22 +214,8 @@ public abstract class WindowOrientationListener {
private static final int ACCELEROMETER_DATA_Y = 1;
private static final int ACCELEROMETER_DATA_Z = 2;
- // Rotation constants.
- // These are the same as Surface rotation constants with the addition of a 5th
- // unknown state when we are not confident about the proporsed orientation.
- // One important property of these constants is that they are equal to the
- // orientation angle itself divided by 90. We use this fact to map
- // back and forth between orientation angles and rotation values.
- private static final int ROTATION_UNKNOWN = -1;
- //private static final int ROTATION_0 = Surface.ROTATION_0; // 0
- //private static final int ROTATION_90 = Surface.ROTATION_90; // 1
- //private static final int ROTATION_180 = Surface.ROTATION_180; // 2
- //private static final int ROTATION_270 = Surface.ROTATION_270; // 3
-
private final WindowOrientationListener mOrientationListener;
- private int mRotation = ROTATION_UNKNOWN;
-
/* State for first order low-pass filtering of accelerometer data.
* See http://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization for
* signal processing background.
@@ -236,6 +224,24 @@ public abstract class WindowOrientationListener {
private long mLastTimestamp = Long.MAX_VALUE; // in nanoseconds
private float mLastFilteredX, mLastFilteredY, mLastFilteredZ;
+ // The current proposal. We wait for the proposal to be stable for a
+ // certain amount of time before accepting it.
+ //
+ // The basic idea is to ignore intermediate poses of the device while the
+ // user is picking up, putting down or turning the device.
+ private int mProposalRotation;
+ private long mProposalAgeMS;
+
+ // A historical trace of tilt and orientation angles. Used to determine whether
+ // the device posture has settled down.
+ private static final int HISTORY_SIZE = 20;
+ private int mHistoryIndex; // index of most recent sample
+ private int mHistoryLength; // length of historical trace
+ private final long[] mHistoryTimestampMS = new long[HISTORY_SIZE];
+ private final float[] mHistoryMagnitudes = new float[HISTORY_SIZE];
+ private final int[] mHistoryTiltAngles = new int[HISTORY_SIZE];
+ private final int[] mHistoryOrientationAngles = new int[HISTORY_SIZE];
+
// The maximum sample inter-arrival time in milliseconds.
// If the acceleration samples are further apart than this amount in time, we reset the
// state of the low-pass filter and orientation properties. This helps to handle
@@ -243,24 +249,26 @@ public abstract class WindowOrientationListener {
// a significant gap in samples.
private static final float MAX_FILTER_DELTA_TIME_MS = 1000;
- // The acceleration filter cutoff frequency.
- // This is the frequency at which signals are attenuated by 3dB (half the passband power).
+ // The acceleration filter time constant.
+ //
+ // This time constant is used to tune the acceleration filter such that
+ // impulses and vibrational noise (think car dock) is suppressed before we
+ // try to calculate the tilt and orientation angles.
+ //
+ // The filter time constant is related to the filter cutoff frequency, which is the
+ // frequency at which signals are attenuated by 3dB (half the passband power).
// Each successive octave beyond this frequency is attenuated by an additional 6dB.
//
- // We choose the cutoff frequency such that impulses and vibrational noise
- // (think car dock) is suppressed. However, this filtering does not eliminate
- // all possible sources of orientation ambiguity so we also rely on a dynamic
- // settle time for establishing a new orientation. Filtering adds latency
- // inversely proportional to the cutoff frequency so we don't want to make
- // it too small or we can lose hundreds of milliseconds of responsiveness.
- private static final float FILTER_CUTOFF_FREQUENCY_HZ = 1f;
- private static final float FILTER_TIME_CONSTANT_MS = (float)(500.0f
- / (Math.PI * FILTER_CUTOFF_FREQUENCY_HZ)); // t = 1 / (2pi * Fc) * 1000ms
-
- // The filter gain.
- // We choose a value slightly less than unity to avoid numerical instabilities due
- // to floating-point error accumulation.
- private static final float FILTER_GAIN = 0.999f;
+ // Given a time constant t in seconds, the filter cutoff frequency Fc in Hertz
+ // is given by Fc = 1 / (2pi * t).
+ //
+ // The higher the time constant, the lower the cutoff frequency, so more noise
+ // will be suppressed.
+ //
+ // Filtering adds latency proportional the time constant (inversely proportional
+ // to the cutoff frequency) so we don't want to make the time constant too
+ // large or we can lose responsiveness.
+ private static final float FILTER_TIME_CONSTANT_MS = 100.0f;
/* State for orientation detection. */
@@ -298,10 +306,10 @@ public abstract class WindowOrientationListener {
// The ideal tilt angle is 0 (when the device is vertical) so the limits establish
// how close to vertical the device must be in order to change orientation.
private static final int[][] TILT_TOLERANCE = new int[][] {
- /* ROTATION_0 */ { -20, 75 },
- /* ROTATION_90 */ { -20, 70 },
- /* ROTATION_180 */ { -20, 65 },
- /* ROTATION_270 */ { -20, 70 }
+ /* ROTATION_0 */ { -20, 70 },
+ /* ROTATION_90 */ { -20, 60 },
+ /* ROTATION_180 */ { -20, 50 },
+ /* ROTATION_270 */ { -20, 60 }
};
// The gap angle in degrees between adjacent orientation angles for hysteresis.
@@ -309,41 +317,31 @@ public abstract class WindowOrientationListener {
// adjacent orientation. No orientation proposal is made when the orientation
// angle is within the gap between the current orientation and the adjacent
// orientation.
- private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 30;
-
- // The confidence scale factors for angle, tilt and magnitude.
- // When the distance between the actual value and the ideal value is the
- // specified delta, orientation transitions will take twice as long as they would
- // in the ideal case. Increasing or decreasing the delta has an exponential effect
- // on each factor's influence over the transition time.
+ private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 45;
- // Transition takes 2x longer when angle is 30 degrees from ideal orientation angle.
- private static final float ORIENTATION_ANGLE_CONFIDENCE_SCALE =
- confidenceScaleFromDelta(30);
+ // The number of milliseconds for which the device posture must be stable
+ // before we perform an orientation change. If the device appears to be rotating
+ // (being picked up, put down) then we keep waiting until it settles.
+ private static final int SETTLE_TIME_MS = 200;
- // Transition takes 2x longer when tilt is 60 degrees from vertical.
- private static final float TILT_ANGLE_CONFIDENCE_SCALE = confidenceScaleFromDelta(60);
+ // The maximum change in magnitude that can occur during the settle time.
+ // Tuning this constant particularly helps to filter out situations where the
+ // device is being picked up or put down by the user.
+ private static final float SETTLE_MAGNITUDE_MAX_DELTA =
+ SensorManager.STANDARD_GRAVITY * 0.2f;
- // Transition takes 2x longer when acceleration is 0.5 Gs.
- private static final float MAGNITUDE_CONFIDENCE_SCALE = confidenceScaleFromDelta(
- SensorManager.STANDARD_GRAVITY * 0.5f);
+ // The maximum change in tilt angle that can occur during the settle time.
+ private static final int SETTLE_TILT_ANGLE_MAX_DELTA = 5;
- // The number of milliseconds for which a new orientation must be stable before
- // we perform an orientation change under ideal conditions. It will take
- // proportionally longer than this to effect an orientation change when
- // the proposed orientation confidence is low.
- private static final float ORIENTATION_SETTLE_TIME_MS = 250;
-
- // The confidence that we have abount effecting each orientation change.
- // When one of these values exceeds 1.0, we have determined our new orientation!
- private float mConfidence[] = new float[4];
+ // The maximum change in orientation angle that can occur during the settle time.
+ private static final int SETTLE_ORIENTATION_ANGLE_MAX_DELTA = 5;
public SensorEventListenerImpl(WindowOrientationListener orientationListener) {
mOrientationListener = orientationListener;
}
- public int getCurrentRotation(int lastRotation) {
- return mRotation != ROTATION_UNKNOWN ? mRotation : lastRotation;
+ public int getProposedRotation() {
+ return mProposalAgeMS >= SETTLE_TIME_MS ? mProposalRotation : -1;
}
@Override
@@ -369,20 +367,18 @@ public abstract class WindowOrientationListener {
// Reset the orientation listener state if the samples are too far apart in time
// or when we see values of (0, 0, 0) which indicates that we polled the
// accelerometer too soon after turning it on and we don't have any data yet.
- final float timeDeltaMS = (event.timestamp - mLastTimestamp) * 0.000001f;
+ final long now = event.timestamp;
+ final float timeDeltaMS = (now - mLastTimestamp) * 0.000001f;
boolean skipSample;
if (timeDeltaMS <= 0 || timeDeltaMS > MAX_FILTER_DELTA_TIME_MS
|| (x == 0 && y == 0 && z == 0)) {
if (log) {
Slog.v(TAG, "Resetting orientation listener.");
}
- for (int i = 0; i < 4; i++) {
- mConfidence[i] = 0;
- }
+ clearProposal();
skipSample = true;
} else {
- final float alpha = timeDeltaMS
- / (FILTER_TIME_CONSTANT_MS + timeDeltaMS) * FILTER_GAIN;
+ final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS + timeDeltaMS);
x = alpha * (x - mLastFilteredX) + mLastFilteredX;
y = alpha * (y - mLastFilteredY) + mLastFilteredY;
z = alpha * (z - mLastFilteredZ) + mLastFilteredZ;
@@ -392,17 +388,13 @@ public abstract class WindowOrientationListener {
}
skipSample = false;
}
- mLastTimestamp = event.timestamp;
+ mLastTimestamp = now;
mLastFilteredX = x;
mLastFilteredY = y;
mLastFilteredZ = z;
- boolean orientationChanged = false;
+ final int oldProposedRotation = getProposedRotation();
if (!skipSample) {
- // Determine a proposed orientation based on the currently available data.
- int proposedOrientation = ROTATION_UNKNOWN;
- float combinedConfidence = 1.0f;
-
// Calculate the magnitude of the acceleration vector.
final float magnitude = (float) Math.sqrt(x * x + y * y + z * z);
if (magnitude < MIN_ACCELERATION_MAGNITUDE
@@ -411,6 +403,7 @@ public abstract class WindowOrientationListener {
Slog.v(TAG, "Ignoring sensor data, magnitude out of range: "
+ "magnitude=" + magnitude);
}
+ clearProposal();
} else {
// Calculate the tilt angle.
// This is the angle between the up vector and the x-y plane (the plane of
@@ -418,123 +411,82 @@ public abstract class WindowOrientationListener {
// -90 degrees: screen horizontal and facing the ground (overhead)
// 0 degrees: screen vertical
// 90 degrees: screen horizontal and facing the sky (on table)
- final int tiltAngle = (int) Math.round(
- Math.asin(z / magnitude) * RADIANS_TO_DEGREES);
-
- // If the tilt angle is too close to horizontal then we cannot determine
- // the orientation angle of the screen.
- if (Math.abs(tiltAngle) > MAX_TILT) {
- if (log) {
- Slog.v(TAG, "Ignoring sensor data, tilt angle too high: "
- + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle);
- }
- } else {
- // Calculate the orientation angle.
- // This is the angle between the x-y projection of the up vector onto
- // the +y-axis, increasing clockwise in a range of [0, 360] degrees.
- int orientationAngle = (int) Math.round(
- -Math.atan2(-x, y) * RADIANS_TO_DEGREES);
- if (orientationAngle < 0) {
- // atan2 returns [-180, 180]; normalize to [0, 360]
- orientationAngle += 360;
- }
-
- // Find the nearest orientation.
- // An orientation of 0 can have a nearest angle of 0 or 360 depending
- // on which is closer to the measured orientation angle. We leave the
- // nearest angle at 360 in that case since it makes the delta calculation
- // for orientation angle confidence easier below.
- int nearestOrientation = (orientationAngle + 45) / 90;
- int nearestOrientationAngle = nearestOrientation * 90;
- if (nearestOrientation == 4) {
- nearestOrientation = 0;
- }
-
- // Determine the proposed orientation.
- // The confidence of the proposal is 1.0 when it is ideal and it
- // decays exponentially as the proposal moves further from the ideal
- // angle, tilt and magnitude of the proposed orientation.
- if (isTiltAngleAcceptable(nearestOrientation, tiltAngle)
- && isOrientationAngleAcceptable(nearestOrientation,
- orientationAngle)) {
- proposedOrientation = nearestOrientation;
-
- final float idealOrientationAngle = nearestOrientationAngle;
- final float orientationConfidence = confidence(orientationAngle,
- idealOrientationAngle, ORIENTATION_ANGLE_CONFIDENCE_SCALE);
-
- final float idealTiltAngle = 0;
- final float tiltConfidence = confidence(tiltAngle,
- idealTiltAngle, TILT_ANGLE_CONFIDENCE_SCALE);
-
- final float idealMagnitude = SensorManager.STANDARD_GRAVITY;
- final float magnitudeConfidence = confidence(magnitude,
- idealMagnitude, MAGNITUDE_CONFIDENCE_SCALE);
-
- combinedConfidence = orientationConfidence
- * tiltConfidence * magnitudeConfidence;
-
- if (log) {
- Slog.v(TAG, "Proposal: "
- + "magnitude=" + magnitude
- + ", tiltAngle=" + tiltAngle
- + ", orientationAngle=" + orientationAngle
- + ", proposedOrientation=" + proposedOrientation
- + ", combinedConfidence=" + combinedConfidence
- + ", orientationConfidence=" + orientationConfidence
- + ", tiltConfidence=" + tiltConfidence
- + ", magnitudeConfidence=" + magnitudeConfidence);
- }
- } else {
- if (log) {
- Slog.v(TAG, "Ignoring sensor data, no proposal: "
- + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle
- + ", orientationAngle=" + orientationAngle);
- }
- }
- }
- }
-
- // Sum up the orientation confidence weights.
- // Detect an orientation change when the sum reaches 1.0.
- final float confidenceAmount = combinedConfidence * timeDeltaMS
- / ORIENTATION_SETTLE_TIME_MS;
- for (int i = 0; i < 4; i++) {
- if (i == proposedOrientation) {
- mConfidence[i] += confidenceAmount;
- if (mConfidence[i] >= 1.0f) {
- mConfidence[i] = 1.0f;
-
- if (i != mRotation) {
- if (log) {
- Slog.v(TAG, "Orientation changed! rotation=" + i);
- }
- mRotation = i;
- orientationChanged = true;
- }
+ final int tiltAngle = (int) Math.round(
+ Math.asin(z / magnitude) * RADIANS_TO_DEGREES);
+
+ // If the tilt angle is too close to horizontal then we cannot determine
+ // the orientation angle of the screen.
+ if (Math.abs(tiltAngle) > MAX_TILT) {
+ if (log) {
+ Slog.v(TAG, "Ignoring sensor data, tilt angle too high: "
+ + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle);
}
+ clearProposal();
} else {
- mConfidence[i] -= confidenceAmount;
- if (mConfidence[i] < 0.0f) {
- mConfidence[i] = 0.0f;
+ // Calculate the orientation angle.
+ // This is the angle between the x-y projection of the up vector onto
+ // the +y-axis, increasing clockwise in a range of [0, 360] degrees.
+ int orientationAngle = (int) Math.round(
+ -Math.atan2(-x, y) * RADIANS_TO_DEGREES);
+ if (orientationAngle < 0) {
+ // atan2 returns [-180, 180]; normalize to [0, 360]
+ orientationAngle += 360;
+ }
+
+ // Find the nearest rotation.
+ int nearestRotation = (orientationAngle + 45) / 90;
+ if (nearestRotation == 4) {
+ nearestRotation = 0;
+ }
+
+ // Determine the proposed orientation.
+ // The confidence of the proposal is 1.0 when it is ideal and it
+ // decays exponentially as the proposal moves further from the ideal
+ // angle, tilt and magnitude of the proposed orientation.
+ if (!isTiltAngleAcceptable(nearestRotation, tiltAngle)
+ || !isOrientationAngleAcceptable(nearestRotation,
+ orientationAngle)) {
+ if (log) {
+ Slog.v(TAG, "Ignoring sensor data, no proposal: "
+ + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle
+ + ", orientationAngle=" + orientationAngle);
+ }
+ clearProposal();
+ } else {
+ if (log) {
+ Slog.v(TAG, "Proposal: "
+ + "magnitude=" + magnitude
+ + ", tiltAngle=" + tiltAngle
+ + ", orientationAngle=" + orientationAngle
+ + ", proposalRotation=" + mProposalRotation);
+ }
+ updateProposal(nearestRotation, now / 1000000L,
+ magnitude, tiltAngle, orientationAngle);
}
}
}
}
// Write final statistics about where we are in the orientation detection process.
+ final int proposedRotation = getProposedRotation();
if (log) {
- Slog.v(TAG, "Result: rotation=" + mRotation
- + ", confidence=["
- + mConfidence[0] + ", "
- + mConfidence[1] + ", "
- + mConfidence[2] + ", "
- + mConfidence[3] + "], timeDeltaMS=" + timeDeltaMS);
+ final float proposalConfidence = Math.min(
+ mProposalAgeMS * 1.0f / SETTLE_TIME_MS, 1.0f);
+ Slog.v(TAG, "Result: currentRotation=" + mOrientationListener.mCurrentRotation
+ + ", proposedRotation=" + proposedRotation
+ + ", timeDeltaMS=" + timeDeltaMS
+ + ", proposalRotation=" + mProposalRotation
+ + ", proposalAgeMS=" + mProposalAgeMS
+ + ", proposalConfidence=" + proposalConfidence);
}
// Tell the listener.
- if (orientationChanged) {
- mOrientationListener.onOrientationChanged(mRotation);
+ if (proposedRotation != oldProposedRotation && proposedRotation >= 0) {
+ if (log) {
+ Slog.v(TAG, "Proposed rotation changed! proposedRotation=" + proposedRotation
+ + ", oldProposedRotation=" + oldProposedRotation);
+ }
+ mOrientationListener.onProposedRotationChanged(proposedRotation);
}
}
@@ -542,33 +494,34 @@ public abstract class WindowOrientationListener {
* Returns true if the tilt angle is acceptable for a proposed
* orientation transition.
*/
- private boolean isTiltAngleAcceptable(int proposedOrientation,
+ private boolean isTiltAngleAcceptable(int proposedRotation,
int tiltAngle) {
- return tiltAngle >= TILT_TOLERANCE[proposedOrientation][0]
- && tiltAngle <= TILT_TOLERANCE[proposedOrientation][1];
+ return tiltAngle >= TILT_TOLERANCE[proposedRotation][0]
+ && tiltAngle <= TILT_TOLERANCE[proposedRotation][1];
}
/**
* Returns true if the orientation angle is acceptable for a proposed
* orientation transition.
+ *
* This function takes into account the gap between adjacent orientations
* for hysteresis.
*/
- private boolean isOrientationAngleAcceptable(int proposedOrientation,
- int orientationAngle) {
- final int currentOrientation = mRotation;
-
+ private boolean isOrientationAngleAcceptable(int proposedRotation, int orientationAngle) {
// If there is no current rotation, then there is no gap.
- if (currentOrientation != ROTATION_UNKNOWN) {
- // If the proposed orientation is the same or is counter-clockwise adjacent,
+ // The gap is used only to introduce hysteresis among advertised orientation
+ // changes to avoid flapping.
+ final int currentRotation = mOrientationListener.mCurrentRotation;
+ if (currentRotation >= 0) {
+ // If the proposed rotation is the same or is counter-clockwise adjacent,
// then we set a lower bound on the orientation angle.
- // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_90,
+ // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_90,
// then we want to check orientationAngle > 45 + GAP / 2.
- if (proposedOrientation == currentOrientation
- || proposedOrientation == (currentOrientation + 1) % 4) {
- int lowerBound = proposedOrientation * 90 - 45
+ if (proposedRotation == currentRotation
+ || proposedRotation == (currentRotation + 1) % 4) {
+ int lowerBound = proposedRotation * 90 - 45
+ ADJACENT_ORIENTATION_ANGLE_GAP / 2;
- if (proposedOrientation == 0) {
+ if (proposedRotation == 0) {
if (orientationAngle >= 315 && orientationAngle < lowerBound + 360) {
return false;
}
@@ -579,15 +532,15 @@ public abstract class WindowOrientationListener {
}
}
- // If the proposed orientation is the same or is clockwise adjacent,
+ // If the proposed rotation is the same or is clockwise adjacent,
// then we set an upper bound on the orientation angle.
- // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_270,
+ // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_270,
// then we want to check orientationAngle < 315 - GAP / 2.
- if (proposedOrientation == currentOrientation
- || proposedOrientation == (currentOrientation + 3) % 4) {
- int upperBound = proposedOrientation * 90 + 45
+ if (proposedRotation == currentRotation
+ || proposedRotation == (currentRotation + 3) % 4) {
+ int upperBound = proposedRotation * 90 + 45
- ADJACENT_ORIENTATION_ANGLE_GAP / 2;
- if (proposedOrientation == 0) {
+ if (proposedRotation == 0) {
if (orientationAngle <= 45 && orientationAngle > upperBound) {
return false;
}
@@ -601,21 +554,58 @@ public abstract class WindowOrientationListener {
return true;
}
- /**
- * Calculate an exponentially weighted confidence value in the range [0.0, 1.0].
- * The further the value is from the target, the more the confidence trends to 0.
- */
- private static float confidence(float value, float target, float scale) {
- return (float) Math.exp(-Math.abs(value - target) * scale);
+ private void clearProposal() {
+ mProposalRotation = -1;
+ mProposalAgeMS = 0;
}
- /**
- * Calculate a scale factor for the confidence weight exponent.
- * The scale value is chosen such that confidence(value, target, scale) == 0.5
- * whenever abs(value - target) == cutoffDelta.
- */
- private static float confidenceScaleFromDelta(float cutoffDelta) {
- return (float) -Math.log(0.5) / cutoffDelta;
+ private void updateProposal(int rotation, long timestampMS,
+ float magnitude, int tiltAngle, int orientationAngle) {
+ if (mProposalRotation != rotation) {
+ mProposalRotation = rotation;
+ mHistoryIndex = 0;
+ mHistoryLength = 0;
+ }
+
+ final int index = mHistoryIndex;
+ mHistoryTimestampMS[index] = timestampMS;
+ mHistoryMagnitudes[index] = magnitude;
+ mHistoryTiltAngles[index] = tiltAngle;
+ mHistoryOrientationAngles[index] = orientationAngle;
+ mHistoryIndex = (index + 1) % HISTORY_SIZE;
+ if (mHistoryLength < HISTORY_SIZE) {
+ mHistoryLength += 1;
+ }
+
+ long age = 0;
+ for (int i = 1; i < mHistoryLength; i++) {
+ final int olderIndex = (index + HISTORY_SIZE - i) % HISTORY_SIZE;
+ if (Math.abs(mHistoryMagnitudes[olderIndex] - magnitude)
+ > SETTLE_MAGNITUDE_MAX_DELTA) {
+ break;
+ }
+ if (angleAbsoluteDelta(mHistoryTiltAngles[olderIndex],
+ tiltAngle) > SETTLE_TILT_ANGLE_MAX_DELTA) {
+ break;
+ }
+ if (angleAbsoluteDelta(mHistoryOrientationAngles[olderIndex],
+ orientationAngle) > SETTLE_ORIENTATION_ANGLE_MAX_DELTA) {
+ break;
+ }
+ age = timestampMS - mHistoryTimestampMS[olderIndex];
+ if (age >= SETTLE_TIME_MS) {
+ break;
+ }
+ }
+ mProposalAgeMS = age;
+ }
+
+ private static int angleAbsoluteDelta(int a, int b) {
+ int delta = Math.abs(a - b);
+ if (delta > 180) {
+ delta = 360 - delta;
+ }
+ return delta;
}
}
}
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java
index 01587aac7d2a..b06c112cdf54 100644
--- a/core/java/android/view/textservice/TextServicesManager.java
+++ b/core/java/android/view/textservice/TextServicesManager.java
@@ -223,7 +223,7 @@ public final class TextServicesManager {
try {
sService.setSpellCheckerEnabled(enabled);
} catch (RemoteException e) {
- Log.e(TAG, "Error in setSpellCheckerSubtype:" + e);
+ Log.e(TAG, "Error in setSpellCheckerEnabled:" + e);
}
}
@@ -234,7 +234,7 @@ public final class TextServicesManager {
try {
return sService.isSpellCheckerEnabled();
} catch (RemoteException e) {
- Log.e(TAG, "Error in setSpellCheckerSubtype:" + e);
+ Log.e(TAG, "Error in isSpellCheckerEnabled:" + e);
return false;
}
}
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 309857d033e0..28f54aa08e7c 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -1159,51 +1159,49 @@ class BrowserFrame extends Handler {
}
/**
- * Called by JNI when the native HTTPS stack gets an invalid cert chain.
+ * Called by JNI when the Chromium HTTP stack gets an invalid certificate chain.
*
* We delegate the request to CallbackProxy, and route its response to
* {@link #nativeSslCertErrorProceed(int)} or
* {@link #nativeSslCertErrorCancel(int, int)}.
*/
- private void reportSslCertError(
- final int handle, final int cert_error, byte cert_der[], String url) {
- final SslError ssl_error;
+ private void reportSslCertError(final int handle, final int certError, byte certDER[],
+ String url) {
+ final SslError sslError;
try {
- X509Certificate cert = new X509CertImpl(cert_der);
+ X509Certificate cert = new X509CertImpl(certDER);
SslCertificate sslCert = new SslCertificate(cert);
if (JniUtil.useChromiumHttpStack()) {
- ssl_error = SslError.SslErrorFromChromiumErrorCode(cert_error, sslCert,
+ sslError = SslError.SslErrorFromChromiumErrorCode(certError, sslCert,
new URL(url).getHost());
} else {
- ssl_error = new SslError(cert_error, cert, url);
+ sslError = new SslError(certError, cert, url);
}
} catch (IOException e) {
// Can't get the certificate, not much to do.
Log.e(LOGTAG, "Can't get the certificate from WebKit, canceling");
- nativeSslCertErrorCancel(handle, cert_error);
+ nativeSslCertErrorCancel(handle, certError);
return;
}
- SslErrorHandler handler = new SslErrorHandler() {
+ if (SslCertLookupTable.getInstance().isAllowed(sslError)) {
+ nativeSslCertErrorProceed(handle);
+ return;
+ }
+ SslErrorHandler handler = new SslErrorHandler() {
@Override
public void proceed() {
- SslCertLookupTable.getInstance().Allow(ssl_error);
+ SslCertLookupTable.getInstance().setIsAllowed(sslError, true);
nativeSslCertErrorProceed(handle);
}
-
@Override
public void cancel() {
- SslCertLookupTable.getInstance().Deny(ssl_error);
- nativeSslCertErrorCancel(handle, cert_error);
+ SslCertLookupTable.getInstance().setIsAllowed(sslError, false);
+ nativeSslCertErrorCancel(handle, certError);
}
};
-
- if (SslCertLookupTable.getInstance().IsAllowed(ssl_error)) {
- nativeSslCertErrorProceed(handle);
- } else {
- mCallbackProxy.onReceivedSslError(handler, ssl_error);
- }
+ mCallbackProxy.onReceivedSslError(handler, sslError);
}
/**
@@ -1416,7 +1414,7 @@ class BrowserFrame extends Handler {
private native void nativeAuthenticationCancel(int handle);
private native void nativeSslCertErrorProceed(int handle);
- private native void nativeSslCertErrorCancel(int handle, int cert_error);
+ private native void nativeSslCertErrorCancel(int handle, int certError);
native void nativeSslClientCert(int handle,
byte[] pkcs8EncodedPrivateKey,
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 88583df47ce3..5ee90a4fdab6 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -165,8 +165,6 @@ class CallbackProxy extends Handler {
/**
* Get the WebViewClient.
* @return the current WebViewClient instance.
- *
- *@hide pending API council approval.
*/
public WebViewClient getWebViewClient() {
return mWebViewClient;
@@ -907,11 +905,9 @@ class CallbackProxy extends Handler {
*/
public void onPageStarted(String url, Bitmap favicon) {
- // Do an unsynchronized quick check to avoid posting if no callback has
- // been set.
- if (mWebViewClient == null) {
- return;
- }
+ // We need to send the message even if no WebViewClient is set, because we need to call
+ // WebView.onPageStarted().
+
// Performance probe
if (PERF_PROBE) {
mWebCoreThreadTime = SystemClock.currentThreadTimeMillis();
@@ -1013,10 +1009,6 @@ class CallbackProxy extends Handler {
sendMessage(msg);
}
- /**
- * @hide - hide this because it contains a parameter of type SslError.
- * SslError is located in a hidden package.
- */
public void onReceivedSslError(SslErrorHandler handler, SslError error) {
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
@@ -1031,9 +1023,7 @@ class CallbackProxy extends Handler {
msg.obj = map;
sendMessage(msg);
}
- /**
- * @hide
- */
+
public void onReceivedClientCertRequest(ClientCertRequestHandler handler, String host_and_port) {
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
@@ -1048,17 +1038,8 @@ class CallbackProxy extends Handler {
msg.obj = map;
sendMessage(msg);
}
- /**
- * @hide - hide this because it contains a parameter of type SslCertificate,
- * which is located in a hidden package.
- */
public void onReceivedCertificate(SslCertificate certificate) {
- // Do an unsynchronized quick check to avoid posting if no callback has
- // been set.
- if (mWebViewClient == null) {
- return;
- }
// here, certificate can be null (if the site is not secure)
sendMessage(obtainMessage(RECEIVED_CERTIFICATE, certificate));
}
diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java
index 313f7558bfe7..a6998006e895 100644
--- a/core/java/android/webkit/CookieSyncManager.java
+++ b/core/java/android/webkit/CookieSyncManager.java
@@ -88,6 +88,10 @@ public final class CookieSyncManager extends WebSyncManager {
*/
public static synchronized CookieSyncManager createInstance(
Context context) {
+ if (context == null) {
+ throw new IllegalArgumentException("Invalid context argument");
+ }
+
JniUtil.setContext(context);
Context appContext = context.getApplicationContext();
if (sRef == null) {
diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java
index 1e958549809d..3600d09732e9 100644
--- a/core/java/android/webkit/HTML5Audio.java
+++ b/core/java/android/webkit/HTML5Audio.java
@@ -23,6 +23,7 @@ import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.util.Log;
@@ -33,7 +34,11 @@ import java.util.Timer;
import java.util.TimerTask;
/**
- * <p>HTML5 support class for Audio.
+ * HTML5 support class for Audio.
+ *
+ * This class runs almost entirely on the WebCore thread. The exception is when
+ * accessing the WebView object to determine whether private browsing is
+ * enabled.
*/
class HTML5Audio extends Handler
implements MediaPlayer.OnBufferingUpdateListener,
@@ -49,7 +54,7 @@ class HTML5Audio extends Handler
// The C++ MediaPlayerPrivateAndroid object.
private int mNativePointer;
// The private status of the view that created this player
- private boolean mIsPrivate;
+ private IsPrivateBrowsingEnabledGetter mIsPrivateBrowsingEnabledGetter;
private static int IDLE = 0;
private static int INITIALIZED = 1;
@@ -82,6 +87,35 @@ class HTML5Audio extends Handler
}
}
+ // Helper class to determine whether private browsing is enabled in the
+ // given WebView. Queries the WebView on the UI thread. Calls to get()
+ // block until the data is available.
+ private class IsPrivateBrowsingEnabledGetter {
+ private boolean mIsReady;
+ private boolean mIsPrivateBrowsingEnabled;
+ IsPrivateBrowsingEnabledGetter(Looper uiThreadLooper, final WebView webView) {
+ new Handler(uiThreadLooper).post(new Runnable() {
+ @Override
+ public void run() {
+ synchronized(IsPrivateBrowsingEnabledGetter.this) {
+ mIsPrivateBrowsingEnabled = webView.isPrivateBrowsingEnabled();
+ mIsReady = true;
+ IsPrivateBrowsingEnabledGetter.this.notify();
+ }
+ }
+ });
+ }
+ synchronized boolean get() {
+ while (!mIsReady) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ return mIsPrivateBrowsingEnabled;
+ }
+ };
+
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -149,7 +183,8 @@ class HTML5Audio extends Handler
// Save the native ptr
mNativePointer = nativePtr;
resetMediaPlayer();
- mIsPrivate = webViewCore.getWebView().isPrivateBrowsingEnabled();
+ mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter(
+ webViewCore.getContext().getMainLooper(), webViewCore.getWebView());
}
private void resetMediaPlayer() {
@@ -177,13 +212,14 @@ class HTML5Audio extends Handler
if (mState != IDLE) {
resetMediaPlayer();
}
- String cookieValue = CookieManager.getInstance().getCookie(url, mIsPrivate);
+ String cookieValue = CookieManager.getInstance().getCookie(
+ url, mIsPrivateBrowsingEnabledGetter.get());
Map<String, String> headers = new HashMap<String, String>();
if (cookieValue != null) {
headers.put(COOKIE, cookieValue);
}
- if (mIsPrivate) {
+ if (mIsPrivateBrowsingEnabledGetter.get()) {
headers.put(HIDE_URL_LOGS, "true");
}
diff --git a/core/java/android/webkit/HTML5VideoInline.java b/core/java/android/webkit/HTML5VideoInline.java
index 97dc2918a2c9..42581c2fa51d 100644
--- a/core/java/android/webkit/HTML5VideoInline.java
+++ b/core/java/android/webkit/HTML5VideoInline.java
@@ -1,6 +1,8 @@
package android.webkit;
+import android.Manifest.permission;
+import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.webkit.HTML5VideoView;
@@ -52,7 +54,12 @@ public class HTML5VideoInline extends HTML5VideoView{
public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) {
super.prepareDataAndDisplayMode(proxy);
setFrameAvailableListener(proxy);
- mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK);
+ // TODO: This is a workaround, after b/5375681 fixed, we should switch
+ // to the better way.
+ if (mProxy.getContext().checkCallingOrSelfPermission(permission.WAKE_LOCK)
+ == PackageManager.PERMISSION_GRANTED) {
+ mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK);
+ }
}
// Pause the play and update the play/pause button
diff --git a/core/java/android/webkit/JniUtil.java b/core/java/android/webkit/JniUtil.java
index ef1641de73aa..7759ff37053e 100644
--- a/core/java/android/webkit/JniUtil.java
+++ b/core/java/android/webkit/JniUtil.java
@@ -39,25 +39,21 @@ class JniUtil {
private static Boolean sUseChromiumHttpStack;
private static Context sContext;
- private static boolean initialized = false;
-
private static void checkInitialized() {
- if (!initialized) {
+ if (sContext == null) {
throw new IllegalStateException("Call CookieSyncManager::createInstance() or create a webview before using this class");
}
}
protected static synchronized void setContext(Context context) {
- if (initialized)
+ if (sContext != null) {
return;
+ }
sContext = context.getApplicationContext();
- initialized = true;
}
protected static synchronized Context getContext() {
- if (!initialized)
- return null;
return sContext;
}
@@ -68,8 +64,9 @@ class JniUtil {
private static synchronized String getDatabaseDirectory() {
checkInitialized();
- if (sDatabaseDirectory == null)
+ if (sDatabaseDirectory == null) {
sDatabaseDirectory = sContext.getDatabasePath("dummy").getParent();
+ }
return sDatabaseDirectory;
}
@@ -81,8 +78,9 @@ class JniUtil {
private static synchronized String getCacheDirectory() {
checkInitialized();
- if (sCacheDirectory == null)
+ if (sCacheDirectory == null) {
sCacheDirectory = sContext.getCacheDir().getAbsolutePath();
+ }
return sCacheDirectory;
}
diff --git a/core/java/android/webkit/SslCertLookupTable.java b/core/java/android/webkit/SslCertLookupTable.java
index faff110aae8a..052244f95f89 100644
--- a/core/java/android/webkit/SslCertLookupTable.java
+++ b/core/java/android/webkit/SslCertLookupTable.java
@@ -20,14 +20,15 @@ import android.os.Bundle;
import android.net.http.SslError;
/**
- * A simple class to store the wrong certificates that user is aware but
- * chose to proceed.
+ * Stores the user's decision of whether to allow or deny an invalid certificate.
+ *
+ * This class is not threadsafe. It is used only on the WebCore thread.
*/
final class SslCertLookupTable {
private static SslCertLookupTable sTable;
private final Bundle table;
- public static synchronized SslCertLookupTable getInstance() {
+ public static SslCertLookupTable getInstance() {
if (sTable == null) {
sTable = new SslCertLookupTable();
}
@@ -38,15 +39,15 @@ final class SslCertLookupTable {
table = new Bundle();
}
- public void Allow(SslError ssl_error) {
- table.putBoolean(ssl_error.toString(), true);
+ public void setIsAllowed(SslError sslError, boolean allow) {
+ table.putBoolean(sslError.toString(), allow);
}
- public void Deny(SslError ssl_error) {
- table.putBoolean(ssl_error.toString(), false);
+ public boolean isAllowed(SslError sslError) {
+ return table.getBoolean(sslError.toString());
}
- public boolean IsAllowed(SslError ssl_error) {
- return table.getBoolean(ssl_error.toString());
+ public void clear() {
+ table.clear();
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 600c89931d9f..370cce40b704 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -644,7 +644,7 @@ public class WebView extends AbsoluteLayout
private Drawable mSelectHandleLeft;
private Drawable mSelectHandleRight;
- static final boolean USE_WEBKIT_RINGS = true;
+ static final boolean USE_WEBKIT_RINGS = false;
// the color used to highlight the touch rectangles
private static final int HIGHLIGHT_COLOR = 0x6633b5e5;
// the round corner for the highlight path
@@ -730,6 +730,7 @@ public class WebView extends AbsoluteLayout
static final int SELECT_AT = 135;
static final int SCREEN_ON = 136;
static final int ENTER_FULLSCREEN_VIDEO = 137;
+ static final int UPDATE_SELECTION = 138;
private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID;
private static final int LAST_PACKAGE_MSG_ID = SET_TOUCH_HIGHLIGHT_RECTS;
@@ -1054,6 +1055,10 @@ public class WebView extends AbsoluteLayout
super(context, attrs, defStyle);
checkThread();
+ if (context == null) {
+ throw new IllegalArgumentException("Invalid context argument");
+ }
+
// Used by the chrome stack to find application paths
JniUtil.setContext(context);
@@ -1803,6 +1808,8 @@ public class WebView extends AbsoluteLayout
/**
* Restore the display data that was save in {@link #savePicture}. Used in
* conjunction with {@link #restoreState}.
+ *
+ * Note that this will not work if the WebView is hardware accelerated.
* @param b A Bundle containing the saved display data.
* @param src The file where the picture data was stored.
* @return True if the picture was successfully restored.
@@ -2385,6 +2392,12 @@ public class WebView extends AbsoluteLayout
return mZoomManager.getScale();
}
+ // Called by JNI. Returns the scale to apply to the text selection handles
+ /* package */ float getTextHandleScale() {
+ float density = mContext.getResources().getDisplayMetrics().density;
+ return density / getScale();
+ }
+
/**
* Return the reading level scale of the WebView
* @return The reading level scale.
@@ -4062,8 +4075,11 @@ public class WebView extends AbsoluteLayout
// state.
// If mNativeClass is 0, we should not reach here, so we do not
// need to check it again.
+ boolean pressed = (mTouchMode == TOUCH_SHORTPRESS_START_MODE
+ || mTouchMode == TOUCH_INIT_MODE
+ || mTouchMode == TOUCH_SHORTPRESS_MODE);
nativeRecordButtons(hasFocus() && hasWindowFocus(),
- (mTouchMode == TOUCH_SHORTPRESS_START_MODE && !USE_WEBKIT_RINGS)
+ (pressed && !USE_WEBKIT_RINGS)
|| mTrackballDown || mGotCenterDown, false);
drawCoreAndCursorRing(canvas, mBackgroundColor,
mDrawCursorRing && drawRings);
@@ -4280,7 +4296,6 @@ public class WebView extends AbsoluteLayout
}
nativeSetExtendSelection();
mDrawSelectionPointer = false;
- mSelectionStarted = true;
mTouchMode = TOUCH_DRAG_MODE;
return true;
}
@@ -4293,6 +4308,7 @@ public class WebView extends AbsoluteLayout
selectionDone();
}
mOrientation = newConfig.orientation;
+ mWebViewCore.sendMessage(EventHub.CLEAR_CONTENT);
}
/**
@@ -6532,6 +6548,8 @@ public class WebView extends AbsoluteLayout
mLastTouchTime = eventTime;
mVelocityTracker = VelocityTracker.obtain();
mSnapScrollMode = SNAP_NONE;
+ mPrivateHandler.sendEmptyMessageDelayed(UPDATE_SELECTION,
+ ViewConfiguration.getTapTimeout());
}
private void startDrag() {
@@ -7161,6 +7179,14 @@ public class WebView extends AbsoluteLayout
}
/**
+ * Return the overview scale of the WebView
+ * @return The overview scale.
+ */
+ float getZoomOverviewScale() {
+ return mZoomManager.getZoomOverviewScale();
+ }
+
+ /**
* @return TRUE if the WebView can be zoomed in.
*/
public boolean canZoomIn() {
@@ -7194,10 +7220,15 @@ public class WebView extends AbsoluteLayout
return mZoomManager.zoomOut();
}
+ /**
+ * This selects the best clickable target at mLastTouchX and mLastTouchY
+ * and calls showCursorTimed on the native side
+ */
private void updateSelection() {
if (mNativeClass == 0) {
return;
}
+ mPrivateHandler.removeMessages(UPDATE_SELECTION);
// mLastTouchX and mLastTouchY are the point in the current viewport
int contentX = viewToContentX(mLastTouchX + mScrollX);
int contentY = viewToContentY(mLastTouchY + mScrollY);
@@ -7297,6 +7328,7 @@ public class WebView extends AbsoluteLayout
return;
}
mTouchMode = TOUCH_DONE_MODE;
+ updateSelection();
switchOutDrawHistory();
// mLastTouchX and mLastTouchY are the point in the current viewport
int contentX = viewToContentX(mLastTouchX + mScrollX);
@@ -8187,6 +8219,14 @@ public class WebView extends AbsoluteLayout
SCROLL_SELECT_TEXT, SELECT_SCROLL_INTERVAL);
break;
}
+ case UPDATE_SELECTION: {
+ if (mTouchMode == TOUCH_INIT_MODE
+ || mTouchMode == TOUCH_SHORTPRESS_MODE
+ || mTouchMode == TOUCH_SHORTPRESS_START_MODE) {
+ updateSelection();
+ }
+ break;
+ }
case SWITCH_TO_SHORTPRESS: {
mInitialHitTestResult = null; // set by updateSelection()
if (mTouchMode == TOUCH_INIT_MODE) {
@@ -9249,13 +9289,13 @@ public class WebView extends AbsoluteLayout
private static void checkThread() {
if (Looper.myLooper() != Looper.getMainLooper()) {
- RuntimeException exception = new RuntimeException(
- "A WebView method was called on thread '" +
+ Throwable throwable = new Throwable(
+ "Warning: A WebView method was called on thread '" +
Thread.currentThread().getName() + "'. " +
"All WebView methods must be called on the UI thread. " +
"Future versions of WebView may not support use on other threads.");
- Log.e(LOGTAG, Log.getStackTraceString(exception));
- StrictMode.onWebViewMethodCalledOnWrongThread(exception);
+ Log.w(LOGTAG, Log.getStackTraceString(throwable));
+ StrictMode.onWebViewMethodCalledOnWrongThread(throwable);
}
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 48359d44daca..63c4d032ddab 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1349,8 +1349,14 @@ public final class WebViewCore {
}
case CLEAR_SSL_PREF_TABLE:
- Network.getInstance(mContext)
- .clearUserSslPrefTable();
+ if (JniUtil.useChromiumHttpStack()) {
+ // FIXME: This will not work for connections currently in use, as
+ // they cache the certificate responses. See http://b/5324235.
+ SslCertLookupTable.getInstance().clear();
+ nativeCloseIdleConnections();
+ } else {
+ Network.getInstance(mContext).clearUserSslPrefTable();
+ }
break;
case TOUCH_UP:
@@ -2225,6 +2231,8 @@ public final class WebViewCore {
mRepaintScheduled = false;
}
+ // Gets the WebView corresponding to this WebViewCore. Note that the
+ // WebView object must only be used on the UI thread.
/* package */ WebView getWebView() {
return mWebView;
}
@@ -2512,10 +2520,13 @@ public final class WebViewCore {
// called by JNI
private void restoreScale(float scale, float textWrapScale) {
if (mBrowserFrame.firstLayoutDone() == false) {
- final float defaultScale = mWebView.getDefaultZoomScale();
- mRestoredScale = (scale <= 0.0) ? defaultScale : scale;
+ // If restored scale and textWrapScale are 0, set them to
+ // overview and reading level scale respectively.
+ mRestoredScale = (scale <= 0.0)
+ ? mWebView.getZoomOverviewScale() : scale;
if (mSettings.getUseWideViewPort()) {
- mRestoredTextWrapScale = (textWrapScale <= 0.0) ? defaultScale : textWrapScale;
+ mRestoredTextWrapScale = (textWrapScale <= 0.0)
+ ? mWebView.getReadingLevelScale() : textWrapScale;
}
}
}
@@ -2623,8 +2634,7 @@ public final class WebViewCore {
}
}
- // called by JNI
- private Context getContext() {
+ Context getContext() {
return mContext;
}
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 7ca6aeba87fe..7f526e7e7c1b 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -1128,12 +1128,6 @@ class ZoomManager {
mTextWrapScale = Math.max(mTextWrapScale, overviewScale);
}
reflowText = exceedsMinScaleIncrement(mTextWrapScale, scale);
- } else {
- // In case of restored scale, treat defaultScale as overview since
- // it usually means the previous scale is not saved.
- if (scale == mDefaultScale && settings.getLoadWithOverviewMode()) {
- scale = overviewScale;
- }
}
mInitialZoomOverview = settings.getLoadWithOverviewMode() &&
!exceedsMinScaleIncrement(scale, overviewScale);
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index ba89ef3e6cbd..7b8c7f218ddc 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1304,16 +1304,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
}
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- // Do not append text content to scroll events they are fired frequently
- // and the client has already received another event type with the text.
- if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SCROLLED) {
- super.dispatchPopulateAccessibilityEvent(event);
- }
- return false;
- }
-
/**
* Indicates whether the children's drawing cache is used during a scroll.
* By default, the drawing cache is enabled but this will consume more memory.
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 312303d5dc0e..c37cc5223830 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -16,6 +16,8 @@
package android.widget;
+import com.android.internal.R;
+
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -23,19 +25,16 @@ import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
-import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
+import android.view.ActionProvider;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ActivityChooserModel.ActivityChooserModelClient;
-import com.android.internal.R;
-
/**
* This class is a view for choosing an activity for handling a given {@link Intent}.
* <p>
@@ -107,6 +106,11 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
private final int mListPopupMaxWidth;
/**
+ * The ActionProvider hosting this view, if applicable.
+ */
+ ActionProvider mProvider;
+
+ /**
* Observer for the model data.
*/
private final DataSetObserver mModelDataSetOberver = new DataSetObserver() {
@@ -131,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
getListPopupWindow().dismiss();
} else {
getListPopupWindow().show();
+ if (mProvider != null) {
+ mProvider.subUiVisibilityChanged(true);
+ }
}
}
}
@@ -262,6 +269,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
}
/**
+ * Set the provider hosting this view, if applicable.
+ * @hide Internal use only
+ */
+ public void setProvider(ActionProvider provider) {
+ mProvider = provider;
+ }
+
+ /**
* Shows the popup window with activities.
*
* @return True if the popup was shown, false if already showing.
@@ -287,26 +302,33 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
- mAdapter.setMaxActivityCount(maxActivityCount);
+ final boolean defaultActivityButtonShown =
+ mDefaultActivityButton.getVisibility() == VISIBLE;
final int activityCount = mAdapter.getActivityCount();
+ final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0;
if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED
- && activityCount > maxActivityCount + 1) {
+ && activityCount > maxActivityCount + maxActivityCountOffset) {
mAdapter.setShowFooterView(true);
+ mAdapter.setMaxActivityCount(maxActivityCount - 1);
} else {
mAdapter.setShowFooterView(false);
+ mAdapter.setMaxActivityCount(maxActivityCount);
}
ListPopupWindow popupWindow = getListPopupWindow();
if (!popupWindow.isShowing()) {
- if (mIsSelectingDefaultActivity) {
- mAdapter.setShowDefaultActivity(true);
+ if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) {
+ mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown);
} else {
- mAdapter.setShowDefaultActivity(false);
+ mAdapter.setShowDefaultActivity(false, false);
}
final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth);
popupWindow.setContentWidth(contentWidth);
popupWindow.show();
+ if (mProvider != null) {
+ mProvider.subUiVisibilityChanged(true);
+ }
}
}
@@ -476,8 +498,10 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
mAdapter.getDataModel().setDefaultActivity(position);
}
} else {
- // The first item in the model is default action => adjust index
- Intent launchIntent = mAdapter.getDataModel().chooseActivity(position + 1);
+ // If the default target is not shown in the list, the first
+ // item in the model is default action => adjust index
+ position = mAdapter.getShowDefaultActivity() ? position : position + 1;
+ Intent launchIntent = mAdapter.getDataModel().chooseActivity(position);
if (launchIntent != null) {
mContext.startActivity(launchIntent);
}
@@ -523,6 +547,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
// PopUpWindow.OnDismissListener#onDismiss
public void onDismiss() {
notifyOnDismissListener();
+ if (mProvider != null) {
+ mProvider.subUiVisibilityChanged(false);
+ }
}
private void notifyOnDismissListener() {
@@ -553,6 +580,8 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
private boolean mShowDefaultActivity;
+ private boolean mHighlightDefaultActivity;
+
private boolean mShowFooterView;
public void setDataModel(ActivityChooserModel dataModel) {
@@ -640,7 +669,7 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
TextView titleView = (TextView) convertView.findViewById(R.id.title);
titleView.setText(activity.loadLabel(packageManager));
// Highlight the default.
- if (mShowDefaultActivity && position == 0) {
+ if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) {
convertView.setActivated(true);
} else {
convertView.setActivated(false);
@@ -709,11 +738,18 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
return mDataModel;
}
- public void setShowDefaultActivity(boolean showDefaultActivity) {
- if (mShowDefaultActivity != showDefaultActivity) {
+ public void setShowDefaultActivity(boolean showDefaultActivity,
+ boolean highlightDefaultActivity) {
+ if (mShowDefaultActivity != showDefaultActivity
+ || mHighlightDefaultActivity != highlightDefaultActivity) {
mShowDefaultActivity = showDefaultActivity;
+ mHighlightDefaultActivity = highlightDefaultActivity;
notifyDataSetChanged();
}
}
+
+ public boolean getShowDefaultActivity() {
+ return mShowDefaultActivity;
+ }
}
}
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 72db8e8225f8..a4b4e783def9 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -277,10 +277,11 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
* called, false otherwise is returned.
*/
public boolean performItemClick(View view, int position, long id) {
- view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
-
if (mOnItemClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
+ if (view != null) {
+ view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
+ }
mOnItemClickListener.onItemClick(this, view, position, id);
return true;
}
@@ -338,8 +339,10 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
*/
public interface OnItemSelectedListener {
/**
- * Callback method to be invoked when an item in this view has been
- * selected.
+ * <p>Callback method to be invoked when an item in this view has been
+ * selected. This callback is invoked only when the newly selected
+ * position is different from the previously selected position or if
+ * there was no selected item.</p>
*
* Impelmenters can call getItemAtPosition(position) if they need to access the
* data associated with the selected item.
@@ -878,31 +881,30 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- // This is an exceptional case which occurs when a window gets the
- // focus and sends a focus event via its focused child to announce
- // current focus/selection. AdapterView fires selection but not focus
- // events so we change the event type here.
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
- event.setEventType(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ final int eventType = event.getEventType();
+ switch (eventType) {
+ case AccessibilityEvent.TYPE_VIEW_SCROLLED:
+ // Do not populate the text of scroll events.
+ return true;
+ case AccessibilityEvent.TYPE_VIEW_FOCUSED:
+ // This is an exceptional case which occurs when a window gets the
+ // focus and sends a focus event via its focused child to announce
+ // current focus/selection. AdapterView fires selection but not focus
+ // events so we change the event type here.
+ if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
+ event.setEventType(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ }
+ break;
}
View selectedView = getSelectedView();
if (selectedView != null && selectedView.getVisibility() == VISIBLE) {
- // We first get a chance to populate the event.
- onPopulateAccessibilityEvent(event);
+ getSelectedView().dispatchPopulateAccessibilityEvent(event);
}
return false;
}
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
- // We send selection events only from AdapterView to avoid
- // generation of such event for each child.
- getSelectedView().dispatchPopulateAccessibilityEvent(event);
- }
-
- @Override
public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
if (super.onRequestSendAccessibilityEvent(child, event)) {
// Add a record for ourselves as well.
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 27610b9fe5c2..07523e3a17c3 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
@@ -38,6 +36,8 @@ import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.R;
+
/**
* <p>An editable text view that shows completion suggestions automatically
@@ -744,7 +744,6 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
if (mFilter != null) {
mPopupCanBeUpdated = true;
performFiltering(getText(), mLastKeyCode);
- buildImeCompletions();
}
} else {
// drop down is automatically dismissed when enough characters
@@ -837,10 +836,6 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
@Override
public void onCommitCompletion(CompletionInfo completion) {
if (isPopupShowing()) {
- mBlockCompletion = true;
- replaceText(completion.getText());
- mBlockCompletion = false;
-
mPopup.performItemClick(completion.getPosition());
}
}
@@ -938,7 +933,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
*/
final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible();
- if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter()) {
+ final boolean enoughToFilter = enoughToFilter();
+ if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter) {
if (hasFocus() && hasWindowFocus() && mPopupCanBeUpdated) {
showDropDown();
}
@@ -1049,6 +1045,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
* <p>Displays the drop down on screen.</p>
*/
public void showDropDown() {
+ buildImeCompletions();
+
if (mPopup.getAnchorView() == null) {
if (mDropDownAnchorId != View.NO_ID) {
mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId));
@@ -1064,7 +1062,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
mPopup.show();
mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
}
-
+
/**
* Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is
* false, we allow outside touch to dismiss the dropdown. If this is set to true, then we
@@ -1075,7 +1073,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch);
}
-
+
private void buildImeCompletions() {
final ListAdapter adapter = mAdapter;
if (adapter != null) {
@@ -1090,8 +1088,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
realCount++;
Object item = adapter.getItem(i);
long id = adapter.getItemId(i);
- completions[i] = new CompletionInfo(id, i,
- convertSelectionToString(item));
+ completions[i] = new CompletionInfo(id, i, convertSelectionToString(item));
}
}
diff --git a/core/java/android/widget/BaseAdapter.java b/core/java/android/widget/BaseAdapter.java
index 532fd766ec66..401fcb83499d 100644
--- a/core/java/android/widget/BaseAdapter.java
+++ b/core/java/android/widget/BaseAdapter.java
@@ -43,13 +43,18 @@ public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
}
/**
- * Notifies the attached View that the underlying data has been changed
- * and it should refresh itself.
+ * Notifies the attached observers that the underlying data has been changed
+ * and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
-
+
+ /**
+ * Notifies the attached observers that the underlying data is no longer valid
+ * or available. Once invoked this adapter is no longer valid and should
+ * not report further data set changes.
+ */
public void notifyDataSetInvalidated() {
mDataSetObservable.notifyInvalidated();
}
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 1b713c3786d4..9cbe8db412b1 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -339,10 +339,8 @@ public class CalendarView extends FrameLayout {
// initialization based on locale
setCurrentLocale(Locale.getDefault());
- TypedValue calendarViewStyle = new TypedValue();
- context.getTheme().resolveAttribute(R.attr.calendarViewStyle, calendarViewStyle, true);
- TypedArray attributesArray = context.obtainStyledAttributes(calendarViewStyle.resourceId,
- R.styleable.CalendarView);
+ TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.CalendarView,
+ R.attr.calendarViewStyle, 0);
mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber,
DEFAULT_SHOW_WEEK_NUMBER);
mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek,
@@ -355,6 +353,9 @@ public class CalendarView extends FrameLayout {
if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) {
parseDate(DEFAULT_MAX_DATE, mMaxDate);
}
+ if (mMaxDate.before(mMinDate)) {
+ throw new IllegalArgumentException("Max date cannot be before min date.");
+ }
mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount,
DEFAULT_SHOWN_WEEK_COUNT);
mSelectedWeekBackgroundColor = attributesArray.getColor(
@@ -407,9 +408,16 @@ public class CalendarView extends FrameLayout {
setUpListView();
setUpAdapter();
- // go to today now
+ // go to today or whichever is close to today min or max date
mTempDate.setTimeInMillis(System.currentTimeMillis());
- goTo(mTempDate, false, true, true);
+ if (mTempDate.before(mMinDate)) {
+ goTo(mMinDate, false, true, true);
+ } else if (mMaxDate.before(mTempDate)) {
+ goTo(mMaxDate, false, true, true);
+ } else {
+ goTo(mTempDate, false, true, true);
+ }
+
invalidate();
}
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 390002b6ba30..fb9047b35b28 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -87,19 +87,26 @@ import static java.lang.Math.min;
* layout parameters. When the
* {@link GridLayout#setUseDefaultMargins(boolean) useDefaultMargins}
* property is set, default margins around children are automatically
- * allocated based on the child's visual characteristics. Each of the
- * margins so defined may be independently overridden by an assignment
+ * allocated based on the prevailing UI style guide for the platform.
+ * Each of the margins so defined may be independently overridden by an assignment
* to the appropriate layout parameter.
+ * Default values will generally produce a reasonable spacing between components
+ * but values may change between different releases of the platform.
*
* <h4>Excess Space Distribution</h4>
*
+ * GridLayout's distribution of excess space is based on <em>priority</em>
+ * rather than <em>weight</em>.
+ * <p>
* A child's ability to stretch is inferred from the alignment properties of
* its row and column groups (which are typically set by setting the
* {@link LayoutParams#setGravity(int) gravity} property of the child's layout parameters).
* If alignment was defined along a given axis then the component
- * is taken as flexible in along that axis. If no alignment was set,
- * the component is instead assumed to be inflexible. Multiple components in
- * the same row or column group are considered to act in <em>parallel</em>. Such a
+ * is taken as <em>flexible</em> in that direction. If no alignment was set,
+ * the component is instead assumed to be <em>inflexible</em>.
+ * <p>
+ * Multiple components in the same row or column group are
+ * considered to act in <em>parallel</em>. Such a
* group is flexible only if <em>all</em> of the components
* within it are flexible. Row and column groups that sit either side of a common boundary
* are instead considered to act in <em>series</em>. The composite group made of these two
@@ -109,6 +116,23 @@ import static java.lang.Math.min;
* gravity. To prevent a column from stretching, ensure that one of the components
* in the column does not define a gravity.
* <p>
+ * When the principle of flexibility does not provide complete disambiguation,
+ * GridLayout's algorithms favour rows and columns that are closer to its <em>right</em>
+ * and <em>bottom</em> edges.
+ *
+ * <h5>Limitations</h5>
+ *
+ * GridLayout does not provide support for the principle of <em>weight</em>, as defined in
+ * {@link LinearLayout.LayoutParams#weight}. In general, it is not therefore possible
+ * to configure a GridLayout to distribute excess space in non-trivial proportions between
+ * multiple rows or columns.
+ * <p>
+ * Some common use-cases may nevertheless be accommodated as follows.
+ * To place equal amounts of space around a component in a cell group;
+ * use {@link #CENTER} alignment (or {@link LayoutParams#setGravity(int) gravity}).
+ * For complete control over excess space distribution in a row or column;
+ * use a {@link LinearLayout} subview to hold the components in the associated cell group.
+ * When using either of these techniques, bear in mind that cell groups may be defined to overlap.
* <p>
* See {@link GridLayout.LayoutParams} for a full description of the
* layout parameters used by GridLayout.
@@ -180,9 +204,11 @@ public class GridLayout extends ViewGroup {
// Misc constants
- private static final String TAG = GridLayout.class.getName();
- private static boolean DEBUG = false;
- private static final int PRF = 1;
+ static final String TAG = GridLayout.class.getName();
+ static final boolean DEBUG = false;
+ static final int PRF = 1;
+ static final int MAX_SIZE = 100000;
+ static final int DEFAULT_CONTAINER_MARGIN = 0;
// Defaults
@@ -191,8 +217,6 @@ public class GridLayout extends ViewGroup {
private static final boolean DEFAULT_USE_DEFAULT_MARGINS = false;
private static final boolean DEFAULT_ORDER_PRESERVED = true;
private static final int DEFAULT_ALIGNMENT_MODE = ALIGN_MARGINS;
- private static final int DEFAULT_CONTAINER_MARGIN = 0;
- private static final int MAX_SIZE = 100000;
// TypedArray indices
@@ -206,13 +230,13 @@ public class GridLayout extends ViewGroup {
// Instance variables
- private final Axis mHorizontalAxis = new Axis(true);
- private final Axis mVerticalAxis = new Axis(false);
- private boolean mLayoutParamsValid = false;
- private int mOrientation = DEFAULT_ORIENTATION;
- private boolean mUseDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS;
- private int mAlignmentMode = DEFAULT_ALIGNMENT_MODE;
- private int mDefaultGap;
+ final Axis horizontalAxis = new Axis(true);
+ final Axis verticalAxis = new Axis(false);
+ boolean layoutParamsValid = false;
+ int orientation = DEFAULT_ORIENTATION;
+ boolean useDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS;
+ int alignmentMode = DEFAULT_ALIGNMENT_MODE;
+ int defaultGap;
// Constructors
@@ -224,7 +248,7 @@ public class GridLayout extends ViewGroup {
if (DEBUG) {
setWillNotDraw(false);
}
- mDefaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap);
+ defaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridLayout);
try {
setRowCount(a.getInt(ROW_COUNT, DEFAULT_COUNT));
@@ -266,13 +290,12 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_orientation
*/
public int getOrientation() {
- return mOrientation;
+ return orientation;
}
/**
- * The orientation property does not affect layout. Orientation is used
- * only to generate default row/column indices when they are not specified
- * by a component's layout parameters.
+ * Orientation is used only to generate default row/column indices when
+ * they are not specified by a component's layout parameters.
* <p>
* The default value of this property is {@link #HORIZONTAL}.
*
@@ -283,8 +306,9 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_orientation
*/
public void setOrientation(int orientation) {
- if (mOrientation != orientation) {
- mOrientation = orientation;
+ if (this.orientation != orientation) {
+ this.orientation = orientation;
+ invalidateStructure();
requestLayout();
}
}
@@ -302,13 +326,12 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_rowCount
*/
public int getRowCount() {
- return mVerticalAxis.getCount();
+ return verticalAxis.getCount();
}
/**
- * The rowCount property does not affect layout. RowCount is used
- * only to generate default row/column indices when they are not specified
- * by a component's layout parameters.
+ * RowCount is used only to generate default row/column indices when
+ * they are not specified by a component's layout parameters.
*
* @param rowCount the number of rows
*
@@ -318,7 +341,9 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_rowCount
*/
public void setRowCount(int rowCount) {
- mVerticalAxis.setCount(rowCount);
+ verticalAxis.setCount(rowCount);
+ invalidateStructure();
+ requestLayout();
}
/**
@@ -334,13 +359,12 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_columnCount
*/
public int getColumnCount() {
- return mHorizontalAxis.getCount();
+ return horizontalAxis.getCount();
}
/**
- * The columnCount property does not affect layout. ColumnCount is used
- * only to generate default column/column indices when they are not specified
- * by a component's layout parameters.
+ * ColumnCount is used only to generate default column/column indices when
+ * they are not specified by a component's layout parameters.
*
* @param columnCount the number of columns.
*
@@ -350,7 +374,9 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_columnCount
*/
public void setColumnCount(int columnCount) {
- mHorizontalAxis.setCount(columnCount);
+ horizontalAxis.setCount(columnCount);
+ invalidateStructure();
+ requestLayout();
}
/**
@@ -364,7 +390,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_useDefaultMargins
*/
public boolean getUseDefaultMargins() {
- return mUseDefaultMargins;
+ return useDefaultMargins;
}
/**
@@ -394,7 +420,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_useDefaultMargins
*/
public void setUseDefaultMargins(boolean useDefaultMargins) {
- mUseDefaultMargins = useDefaultMargins;
+ this.useDefaultMargins = useDefaultMargins;
requestLayout();
}
@@ -411,7 +437,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_alignmentMode
*/
public int getAlignmentMode() {
- return mAlignmentMode;
+ return alignmentMode;
}
/**
@@ -430,7 +456,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_alignmentMode
*/
public void setAlignmentMode(int alignmentMode) {
- mAlignmentMode = alignmentMode;
+ this.alignmentMode = alignmentMode;
requestLayout();
}
@@ -445,7 +471,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_rowOrderPreserved
*/
public boolean isRowOrderPreserved() {
- return mVerticalAxis.isOrderPreserved();
+ return verticalAxis.isOrderPreserved();
}
/**
@@ -465,7 +491,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_rowOrderPreserved
*/
public void setRowOrderPreserved(boolean rowOrderPreserved) {
- mVerticalAxis.setOrderPreserved(rowOrderPreserved);
+ verticalAxis.setOrderPreserved(rowOrderPreserved);
invalidateStructure();
requestLayout();
}
@@ -481,7 +507,7 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_columnOrderPreserved
*/
public boolean isColumnOrderPreserved() {
- return mHorizontalAxis.isOrderPreserved();
+ return horizontalAxis.isOrderPreserved();
}
/**
@@ -501,14 +527,14 @@ public class GridLayout extends ViewGroup {
* @attr ref android.R.styleable#GridLayout_columnOrderPreserved
*/
public void setColumnOrderPreserved(boolean columnOrderPreserved) {
- mHorizontalAxis.setOrderPreserved(columnOrderPreserved);
+ horizontalAxis.setOrderPreserved(columnOrderPreserved);
invalidateStructure();
requestLayout();
}
// Static utility methods
- private static int max2(int[] a, int valueIfEmpty) {
+ static int max2(int[] a, int valueIfEmpty) {
int result = valueIfEmpty;
for (int i = 0, N = a.length; i < N; i++) {
result = Math.max(result, a[i]);
@@ -517,14 +543,14 @@ public class GridLayout extends ViewGroup {
}
@SuppressWarnings("unchecked")
- private static <T> T[] append(T[] a, T[] b) {
+ static <T> T[] append(T[] a, T[] b) {
T[] result = (T[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length);
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
return result;
}
- private static Alignment getAlignment(int gravity, boolean horizontal) {
+ static Alignment getAlignment(int gravity, boolean horizontal) {
int mask = horizontal ? HORIZONTAL_GRAVITY_MASK : VERTICAL_GRAVITY_MASK;
int shift = horizontal ? AXIS_X_SHIFT : AXIS_Y_SHIFT;
int flags = (gravity & mask) >> shift;
@@ -547,7 +573,7 @@ public class GridLayout extends ViewGroup {
if (c.getClass() == Space.class) {
return 0;
}
- return mDefaultGap / 2;
+ return defaultGap / 2;
}
private int getDefaultMargin(View c, boolean isAtEdge, boolean horizontal, boolean leading) {
@@ -555,18 +581,18 @@ public class GridLayout extends ViewGroup {
}
private int getDefaultMarginValue(View c, LayoutParams p, boolean horizontal, boolean leading) {
- if (!mUseDefaultMargins) {
+ if (!useDefaultMargins) {
return 0;
}
Spec spec = horizontal ? p.columnSpec : p.rowSpec;
- Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
+ Axis axis = horizontal ? horizontalAxis : verticalAxis;
Interval span = spec.span;
boolean isAtEdge = leading ? (span.min == 0) : (span.max == axis.getCount());
return getDefaultMargin(c, isAtEdge, horizontal, leading);
}
- private int getMargin1(View view, boolean horizontal, boolean leading) {
+ int getMargin1(View view, boolean horizontal, boolean leading) {
LayoutParams lp = getLayoutParams(view);
int margin = horizontal ?
(leading ? lp.leftMargin : lp.rightMargin) :
@@ -575,10 +601,10 @@ public class GridLayout extends ViewGroup {
}
private int getMargin(View view, boolean horizontal, boolean leading) {
- if (mAlignmentMode == ALIGN_MARGINS) {
+ if (alignmentMode == ALIGN_MARGINS) {
return getMargin1(view, horizontal, leading);
} else {
- Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
+ Axis axis = horizontal ? horizontalAxis : verticalAxis;
int[] margins = leading ? axis.getLeadingMargins() : axis.getTrailingMargins();
LayoutParams lp = getLayoutParams(view);
Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
@@ -591,10 +617,6 @@ public class GridLayout extends ViewGroup {
return getMargin(child, horizontal, true) + getMargin(child, horizontal, false);
}
- private static int valueIfDefined(int value, int defaultValue) {
- return (value != UNDEFINED) ? value : defaultValue;
- }
-
private static boolean fits(int[] a, int value, int start, int end) {
if (end > a.length) {
return false;
@@ -629,9 +651,9 @@ public class GridLayout extends ViewGroup {
// install default indices for cells that don't define them
private void validateLayoutParams() {
- final boolean horizontal = (mOrientation == HORIZONTAL);
- final int axisCount = horizontal ? mHorizontalAxis.count : mVerticalAxis.count;
- final int count = valueIfDefined(axisCount, 0);
+ final boolean horizontal = (orientation == HORIZONTAL);
+ final Axis axis = horizontal ? horizontalAxis : verticalAxis;
+ final int count = (axis.definedCount != UNDEFINED) ? axis.definedCount : 0;
int major = 0;
int minor = 0;
@@ -640,15 +662,17 @@ public class GridLayout extends ViewGroup {
for (int i = 0, N = getChildCount(); i < N; i++) {
LayoutParams lp = getLayoutParams1(getChildAt(i));
- final Interval majorRange = (horizontal ? lp.rowSpec : lp.columnSpec).span;
- final boolean majorWasDefined = (majorRange.min != UNDEFINED);
+ final Spec majorSpec = horizontal ? lp.rowSpec : lp.columnSpec;
+ final Interval majorRange = majorSpec.span;
+ final boolean majorWasDefined = majorSpec.startDefined;
final int majorSpan = majorRange.size();
if (majorWasDefined) {
major = majorRange.min;
}
- final Interval minorRange = (horizontal ? lp.columnSpec : lp.rowSpec).span;
- final boolean minorWasDefined = (minorRange.min != UNDEFINED);
+ final Spec minorSpec = horizontal ? lp.columnSpec : lp.rowSpec;
+ final Interval minorRange = minorSpec.span;
+ final boolean minorWasDefined = minorSpec.startDefined;
final int minorSpan = clip(minorRange, minorWasDefined, count);
if (minorWasDefined) {
minor = minorRange.min;
@@ -685,9 +709,9 @@ public class GridLayout extends ViewGroup {
}
private void invalidateStructure() {
- mLayoutParamsValid = false;
- mHorizontalAxis.invalidateStructure();
- mVerticalAxis.invalidateStructure();
+ layoutParamsValid = false;
+ horizontalAxis.invalidateStructure();
+ verticalAxis.invalidateStructure();
// This can end up being done twice. Better twice than not at all.
invalidateValues();
}
@@ -695,9 +719,9 @@ public class GridLayout extends ViewGroup {
private void invalidateValues() {
// Need null check because requestLayout() is called in View's initializer,
// before we are set up.
- if (mHorizontalAxis != null && mVerticalAxis != null) {
- mHorizontalAxis.invalidateValues();
- mVerticalAxis.invalidateValues();
+ if (horizontalAxis != null && verticalAxis != null) {
+ horizontalAxis.invalidateValues();
+ verticalAxis.invalidateValues();
}
}
@@ -705,10 +729,10 @@ public class GridLayout extends ViewGroup {
return (LayoutParams) c.getLayoutParams();
}
- private LayoutParams getLayoutParams(View c) {
- if (!mLayoutParamsValid) {
+ final LayoutParams getLayoutParams(View c) {
+ if (!layoutParamsValid) {
validateLayoutParams();
- mLayoutParamsValid = true;
+ layoutParamsValid = true;
}
return getLayoutParams1(c);
}
@@ -752,7 +776,7 @@ public class GridLayout extends ViewGroup {
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.argb(50, 255, 255, 255));
- int[] xs = mHorizontalAxis.locations;
+ int[] xs = horizontalAxis.locations;
if (xs != null) {
for (int i = 0, length = xs.length; i < length; i++) {
int x = xs[i];
@@ -760,7 +784,7 @@ public class GridLayout extends ViewGroup {
}
}
- int[] ys = mVerticalAxis.locations;
+ int[] ys = verticalAxis.locations;
if (ys != null) {
for (int i = 0, length = ys.length; i < length; i++) {
int y = ys[i];
@@ -822,36 +846,69 @@ public class GridLayout extends ViewGroup {
// Measurement
- private boolean isGone(View c) {
+ final boolean isGone(View c) {
return c.getVisibility() == View.GONE;
}
- private void measureChildWithMargins(View child, int widthMeasureSpec, int heightMeasureSpec) {
- LayoutParams lp = getLayoutParams(child);
- int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
- mPaddingLeft + mPaddingRight + getTotalMargin(child, true), lp.width);
- int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
- mPaddingTop + mPaddingBottom + getTotalMargin(child, false), lp.height);
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ private void measureChildWithMargins2(View child, int parentWidthSpec, int parentHeightSpec,
+ int childWidth, int childHeight) {
+ int childWidthSpec = getChildMeasureSpec(parentWidthSpec,
+ mPaddingLeft + mPaddingRight + getTotalMargin(child, true), childWidth);
+ int childHeightSpec = getChildMeasureSpec(parentHeightSpec,
+ mPaddingTop + mPaddingBottom + getTotalMargin(child, false), childHeight);
+ child.measure(childWidthSpec, childHeightSpec);
}
- private void measureChildrenWithMargins(int widthMeasureSpec, int heightMeasureSpec) {
+ private void measureChildrenWithMargins(int widthSpec, int heightSpec, boolean firstPass) {
for (int i = 0, N = getChildCount(); i < N; i++) {
View c = getChildAt(i);
if (isGone(c)) continue;
- measureChildWithMargins(c, widthMeasureSpec, heightMeasureSpec);
+ LayoutParams lp = getLayoutParams(c);
+ if (firstPass) {
+ measureChildWithMargins2(c, widthSpec, heightSpec, lp.width, lp.height);
+ } else {
+ Spec spec = (orientation == HORIZONTAL) ? lp.columnSpec : lp.rowSpec;
+ if (spec.alignment == FILL) {
+ Interval span = spec.span;
+ Axis axis = (orientation == HORIZONTAL) ? horizontalAxis : verticalAxis;
+ int[] locations = axis.getLocations();
+ int size = locations[span.max] - locations[span.min];
+ if (orientation == HORIZONTAL) {
+ measureChildWithMargins2(c, widthSpec, heightSpec, size, lp.height);
+ } else {
+ measureChildWithMargins2(c, widthSpec, heightSpec, lp.width, size);
+ }
+ }
+ }
}
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
- measureChildrenWithMargins(widthSpec, heightSpec);
+ /** If we have been called by {@link View#measure(int, int)}, one of width or height
+ * is likely to have changed. We must invalidate if so. */
+ invalidateValues();
- int width = getPaddingLeft() + mHorizontalAxis.getMeasure(widthSpec) + getPaddingRight();
- int height = getPaddingTop() + mVerticalAxis.getMeasure(heightSpec) + getPaddingBottom();
+ measureChildrenWithMargins(widthSpec, heightSpec, true);
- int measuredWidth = Math.max(width, getSuggestedMinimumWidth());
- int measuredHeight = Math.max(height, getSuggestedMinimumHeight());
+ int width, height;
+
+ // Use the orientation property to decide which axis should be laid out first.
+ if (orientation == HORIZONTAL) {
+ width = horizontalAxis.getMeasure(widthSpec);
+ measureChildrenWithMargins(widthSpec, heightSpec, false);
+ height = verticalAxis.getMeasure(heightSpec);
+ } else {
+ height = verticalAxis.getMeasure(heightSpec);
+ measureChildrenWithMargins(widthSpec, heightSpec, false);
+ width = horizontalAxis.getMeasure(widthSpec);
+ }
+
+ int hPadding = getPaddingLeft() + getPaddingRight();
+ int vPadding = getPaddingTop() + getPaddingBottom();
+
+ int measuredWidth = Math.max(hPadding + width, getSuggestedMinimumWidth());
+ int measuredHeight = Math.max(vPadding + height, getSuggestedMinimumHeight());
setMeasuredDimension(
resolveSizeAndState(measuredWidth, widthSpec, 0),
@@ -866,7 +923,7 @@ public class GridLayout extends ViewGroup {
return horizontal ? c.getMeasuredWidth() : c.getMeasuredHeight();
}
- private int getMeasurementIncludingMargin(View c, boolean horizontal) {
+ final int getMeasurementIncludingMargin(View c, boolean horizontal) {
if (isGone(c)) {
return 0;
}
@@ -879,7 +936,7 @@ public class GridLayout extends ViewGroup {
invalidateValues();
}
- private Alignment getAlignment(Alignment alignment, boolean horizontal) {
+ final Alignment getAlignment(Alignment alignment, boolean horizontal) {
return (alignment != UNDEFINED_ALIGNMENT) ? alignment :
(horizontal ? LEFT : BASELINE);
}
@@ -908,11 +965,11 @@ public class GridLayout extends ViewGroup {
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();
- mHorizontalAxis.layout(targetWidth - paddingLeft - paddingRight);
- mVerticalAxis.layout(targetHeight - paddingTop - paddingBottom);
+ horizontalAxis.layout(targetWidth - paddingLeft - paddingRight);
+ verticalAxis.layout(targetHeight - paddingTop - paddingBottom);
- int[] hLocations = mHorizontalAxis.getLocations();
- int[] vLocations = mVerticalAxis.getLocations();
+ int[] hLocations = horizontalAxis.getLocations();
+ int[] vLocations = verticalAxis.getLocations();
for (int i = 0, N = getChildCount(); i < N; i++) {
View c = getChildAt(i);
@@ -941,8 +998,8 @@ public class GridLayout extends ViewGroup {
int dx, dy;
- Bounds colBounds = mHorizontalAxis.getGroupBounds().getValue(i);
- Bounds rowBounds = mVerticalAxis.getGroupBounds().getValue(i);
+ Bounds colBounds = horizontalAxis.getGroupBounds().getValue(i);
+ Bounds rowBounds = verticalAxis.getGroupBounds().getValue(i);
// Gravity offsets: the location of the alignment group relative to its cell group.
//noinspection NullableProblems
@@ -990,18 +1047,15 @@ public class GridLayout extends ViewGroup {
distinguished by the "horizontal" flag which is true for the horizontal axis and false
for the vertical one.
*/
- private class Axis {
- private static final int MIN_VALUE = -1000000;
-
+ final class Axis {
private static final int NEW = 0;
private static final int PENDING = 1;
private static final int COMPLETE = 2;
public final boolean horizontal;
- public int count = UNDEFINED;
- public boolean countValid = false;
- public boolean countWasExplicitySet = false;
+ public int definedCount = UNDEFINED;
+ private int maxIndex = UNDEFINED;
PackedMap<Spec, Bounds> groupBounds;
public boolean groupBoundsValid = false;
@@ -1024,7 +1078,7 @@ public class GridLayout extends ViewGroup {
public int[] locations;
public boolean locationsValid = false;
- private boolean mOrderPreserved = DEFAULT_ORDER_PRESERVED;
+ boolean orderPreserved = DEFAULT_ORDER_PRESERVED;
private MutableInt parentMin = new MutableInt(0);
private MutableInt parentMax = new MutableInt(-MAX_SIZE);
@@ -1033,38 +1087,41 @@ public class GridLayout extends ViewGroup {
this.horizontal = horizontal;
}
- private int maxIndex() {
- // note the number Integer.MIN_VALUE + 1 comes up in undefined cells
- int count = -1;
+ private int calculateMaxIndex() {
+ // the number Integer.MIN_VALUE + 1 comes up in undefined cells
+ int result = -1;
for (int i = 0, N = getChildCount(); i < N; i++) {
View c = getChildAt(i);
LayoutParams params = getLayoutParams(c);
Spec spec = horizontal ? params.columnSpec : params.rowSpec;
- count = max(count, spec.span.min);
- count = max(count, spec.span.max);
+ Interval span = spec.span;
+ result = max(result, span.min);
+ result = max(result, span.max);
}
- return count == -1 ? UNDEFINED : count;
+ return result == -1 ? UNDEFINED : result;
}
- public int getCount() {
- if (!countValid) {
- count = max(0, maxIndex()); // if there are no cells, the count is zero
- countValid = true;
+ private int getMaxIndex() {
+ if (maxIndex == UNDEFINED) {
+ maxIndex = max(0, calculateMaxIndex()); // use zero when there are no children
}
- return count;
+ return maxIndex;
+ }
+
+ public int getCount() {
+ return max(definedCount, getMaxIndex());
}
public void setCount(int count) {
- this.count = count;
- this.countWasExplicitySet = count != UNDEFINED;
+ this.definedCount = count;
}
public boolean isOrderPreserved() {
- return mOrderPreserved;
+ return orderPreserved;
}
public void setOrderPreserved(boolean orderPreserved) {
- mOrderPreserved = orderPreserved;
+ this.orderPreserved = orderPreserved;
invalidateStructure();
}
@@ -1093,7 +1150,7 @@ public class GridLayout extends ViewGroup {
}
}
- private PackedMap<Spec, Bounds> getGroupBounds() {
+ public PackedMap<Spec, Bounds> getGroupBounds() {
if (groupBounds == null) {
groupBounds = createGroupBounds();
}
@@ -1154,7 +1211,7 @@ public class GridLayout extends ViewGroup {
}
private void include(List<Arc> arcs, Interval key, MutableInt size,
- boolean ignoreIfAlreadyPresent) {
+ boolean ignoreIfAlreadyPresent) {
/*
Remove self referential links.
These appear:
@@ -1183,7 +1240,7 @@ public class GridLayout extends ViewGroup {
// Group arcs by their first vertex, returning an array of arrays.
// This is linear in the number of arcs.
- private Arc[][] groupArcsByFirstVertex(Arc[] arcs) {
+ Arc[][] groupArcsByFirstVertex(Arc[] arcs) {
int N = getCount() + 1; // the number of vertices
Arc[][] result = new Arc[N][];
int[] sizes = new int[N];
@@ -1262,7 +1319,7 @@ public class GridLayout extends ViewGroup {
addComponentSizes(maxs, getBackwardLinks());
// Add ordering constraints to prevent row/col sizes from going negative
- if (mOrderPreserved) {
+ if (orderPreserved) {
// Add a constraint for every row/col
for (int i = 0; i < getCount(); i++) {
include(mins, new Interval(i, i + 1), new MutableInt(0));
@@ -1315,6 +1372,47 @@ public class GridLayout extends ViewGroup {
return false;
}
+ private void init(int[] locations) {
+ Arrays.fill(locations, 0);
+ }
+
+ private String arcsToString(List<Arc> arcs) {
+ String var = horizontal ? "x" : "y";
+ StringBuilder result = new StringBuilder();
+ boolean first = true;
+ for (Arc arc : arcs) {
+ if (first) {
+ first = false;
+ } else {
+ result = result.append(", ");
+ }
+ int src = arc.span.min;
+ int dst = arc.span.max;
+ int value = arc.value.value;
+ result.append((src < dst) ?
+ var + dst + " - " + var + src + " > " + value :
+ var + src + " - " + var + dst + " < " + -value);
+
+ }
+ return result.toString();
+ }
+
+ private void logError(String axisName, Arc[] arcs, boolean[] culprits0) {
+ List<Arc> culprits = new ArrayList<Arc>();
+ List<Arc> removed = new ArrayList<Arc>();
+ for (int c = 0; c < arcs.length; c++) {
+ Arc arc = arcs[c];
+ if (culprits0[c]) {
+ culprits.add(arc);
+ }
+ if (!arc.valid) {
+ removed.add(arc);
+ }
+ }
+ Log.d(TAG, axisName + " constraints: " + arcsToString(culprits) + " are inconsistent; "
+ + "permanently removing: " + arcsToString(removed) + ". ");
+ }
+
/*
Bellman-Ford variant - modified to reduce typical running time from O(N^2) to O(N)
@@ -1350,51 +1448,50 @@ public class GridLayout extends ViewGroup {
completes in O(N) steps with very low constants.
*/
private void solve(Arc[] arcs, int[] locations) {
- String axis = horizontal ? "horizontal" : "vertical";
+ String axisName = horizontal ? "horizontal" : "vertical";
int N = getCount() + 1; // The number of vertices is the number of columns/rows + 1.
+ boolean[] originalCulprits = null;
- // We take one extra pass over traditional Bellman-Ford (and omit their final step)
- for (int i = 0; i < N; i++) {
- boolean changed = false;
- for (int j = 0, length = arcs.length; j < length; j++) {
- changed |= relax(locations, arcs[j]);
- }
- if (!changed) {
- if (DEBUG) {
- Log.v(TAG, axis + " iteration completed in " + (1 + i) + " steps of " + N);
+ for (int p = 0; p < arcs.length; p++) {
+ init(locations);
+
+ // We take one extra pass over traditional Bellman-Ford (and omit their final step)
+ for (int i = 0; i < N; i++) {
+ boolean changed = false;
+ for (int j = 0, length = arcs.length; j < length; j++) {
+ changed |= relax(locations, arcs[j]);
+ }
+ if (!changed) {
+ if (originalCulprits != null) {
+ logError(axisName, arcs, originalCulprits);
+ }
+ return;
}
- return;
}
- }
- Log.d(TAG, "The " + axis + " constraints contained a contradiction. Resolving... ");
- Log.d(TAG, Arrays.toString(arcs));
+ boolean[] culprits = new boolean[arcs.length];
+ for (int i = 0; i < N; i++) {
+ for (int j = 0, length = arcs.length; j < length; j++) {
+ culprits[j] |= relax(locations, arcs[j]);
+ }
+ }
- boolean[] culprits = new boolean[arcs.length];
- for (int i = 0; i < N; i++) {
- for (int j = 0, length = arcs.length; j < length; j++) {
- culprits[j] |= relax(locations, arcs[j]);
+ if (p == 0) {
+ originalCulprits = culprits;
}
- }
- for (int i = 0; i < culprits.length; i++) {
- if (culprits[i]) {
- Arc arc = arcs[i];
- // Only remove max values, min values alone cannot be inconsistent
- if (arc.span.min < arc.span.max) {
- continue;
+
+ for (int i = 0; i < arcs.length; i++) {
+ if (culprits[i]) {
+ Arc arc = arcs[i];
+ // Only remove max values, min values alone cannot be inconsistent
+ if (arc.span.min < arc.span.max) {
+ continue;
+ }
+ arc.valid = false;
+ break;
}
- Log.d(TAG, "Removing: " + arc);
- arc.valid = false;
- break;
}
}
- solve1(arcs, locations);
- }
-
- private void solve1(Arc[] arcs, int[] a) {
- Arrays.fill(a, MIN_VALUE);
- a[0] = 0;
- solve(arcs, a);
}
private void computeMargins(boolean leading) {
@@ -1410,7 +1507,9 @@ public class GridLayout extends ViewGroup {
}
}
- private int[] getLeadingMargins() {
+ // External entry points
+
+ public int[] getLeadingMargins() {
if (leadingMargins == null) {
leadingMargins = new int[getCount() + 1];
}
@@ -1421,7 +1520,7 @@ public class GridLayout extends ViewGroup {
return leadingMargins;
}
- private int[] getTrailingMargins() {
+ public int[] getTrailingMargins() {
if (trailingMargins == null) {
trailingMargins = new int[getCount() + 1];
}
@@ -1433,10 +1532,22 @@ public class GridLayout extends ViewGroup {
}
private void computeLocations(int[] a) {
- solve1(getArcs(), a);
+ solve(getArcs(), a);
+ if (!orderPreserved) {
+ // Solve returns the smallest solution to the constraint system for which all
+ // values are positive. One value is therefore zero - though if the row/col
+ // order is not preserved this may not be the first vertex. For consistency,
+ // translate all the values so that they measure the distance from a[0]; the
+ // leading edge of the parent. After this transformation some values may be
+ // negative.
+ int a0 = a[0];
+ for (int i = 0, N = a.length; i < N; i++) {
+ a[i] = a[i] - a0;
+ }
+ }
}
- private int[] getLocations() {
+ public int[] getLocations() {
if (locations == null) {
int N = getCount() + 1;
locations = new int[N];
@@ -1448,10 +1559,11 @@ public class GridLayout extends ViewGroup {
return locations;
}
- // External entry points
-
private int size(int[] locations) {
- return max2(locations, 0) - locations[0];
+ // The parental edges are attached to vertices 0 and N - even when order is not
+ // being preserved and other vertices fall outside this range. Measure the distance
+ // between vertices 0 and N, assuming that locations[0] = 0.
+ return locations[getCount()];
}
private void setParentConstraints(int min, int max) {
@@ -1465,7 +1577,7 @@ public class GridLayout extends ViewGroup {
return size(getLocations());
}
- private int getMeasure(int measureSpec) {
+ public int getMeasure(int measureSpec) {
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
switch (mode) {
@@ -1485,13 +1597,13 @@ public class GridLayout extends ViewGroup {
}
}
- private void layout(int size) {
+ public void layout(int size) {
setParentConstraints(size, size);
getLocations();
}
- private void invalidateStructure() {
- countValid = false;
+ public void invalidateStructure() {
+ maxIndex = UNDEFINED;
groupBounds = null;
forwardLinks = null;
@@ -1506,7 +1618,7 @@ public class GridLayout extends ViewGroup {
invalidateValues();
}
- private void invalidateValues() {
+ public void invalidateValues() {
groupBoundsValid = false;
forwardLinksValid = false;
backwardLinksValid = false;
@@ -1536,9 +1648,22 @@ public class GridLayout extends ViewGroup {
* both aspects of alignment within the cell group. It is also possible to specify a child's
* alignment within its cell group by using the {@link GridLayout.LayoutParams#setGravity(int)}
* method.
- * <p>
- * See {@link GridLayout} for a description of the conventions used by GridLayout
- * in reference to grid indices.
+ *
+ * <h4>WRAP_CONTENT and MATCH_PARENT</h4>
+ *
+ * Because the default values of the {@link #width} and {@link #height}
+ * properties are both {@link #WRAP_CONTENT}, this value never needs to be explicitly
+ * declared in the layout parameters of GridLayout's children. In addition,
+ * GridLayout does not distinguish the special size value {@link #MATCH_PARENT} from
+ * {@link #WRAP_CONTENT}. A component's ability to expand to the size of the parent is
+ * instead controlled by the principle of <em>flexibility</em>,
+ * as discussed in {@link GridLayout}.
+ *
+ * <h4>Summary</h4>
+ *
+ * You should not need to use either of the special size values:
+ * {@code WRAP_CONTENT} or {@code MATCH_PARENT} when configuring the children of
+ * a GridLayout.
*
* <h4>Default values</h4>
*
@@ -1561,12 +1686,17 @@ public class GridLayout extends ViewGroup {
* {@link GridLayout#setUseDefaultMargins(boolean) useDefaultMargins} is
* {@code false}; otherwise {@link #UNDEFINED}, to
* indicate that a default value should be computed on demand. </li>
- * <li>{@link #rowSpec}{@code .span} = {@code [0, 1]} </li>
- * <li>{@link #rowSpec}{@code .alignment} = {@link #BASELINE} </li>
- * <li>{@link #columnSpec}{@code .span} = {@code [0, 1]} </li>
- * <li>{@link #columnSpec}{@code .alignment} = {@link #LEFT} </li>
+ * <li>{@link #rowSpec}<code>.row</code> = {@link #UNDEFINED} </li>
+ * <li>{@link #rowSpec}<code>.rowSpan</code> = 1 </li>
+ * <li>{@link #rowSpec}<code>.alignment</code> = {@link #BASELINE} </li>
+ * <li>{@link #columnSpec}<code>.column</code> = {@link #UNDEFINED} </li>
+ * <li>{@link #columnSpec}<code>.columnSpan</code> = 1 </li>
+ * <li>{@link #columnSpec}<code>.alignment</code> = {@link #LEFT} </li>
* </ul>
*
+ * See {@link GridLayout} for a more complete description of the conventions
+ * used by GridLayout in the interpretation of the properties of this class.
+ *
* @attr ref android.R.styleable#GridLayout_Layout_layout_row
* @attr ref android.R.styleable#GridLayout_Layout_layout_rowSpan
* @attr ref android.R.styleable#GridLayout_Layout_layout_column
@@ -1606,15 +1736,16 @@ public class GridLayout extends ViewGroup {
// Instance variables
/**
- * The spec that specifies the vertical characteristics of the cell group
+ * The spec that defines the vertical characteristics of the cell group
* described by these layout parameters.
*/
- public Spec rowSpec;
+ public Spec rowSpec = Spec.UNDEFINED;
+
/**
- * The spec that specifies the horizontal characteristics of the cell group
+ * The spec that defines the horizontal characteristics of the cell group
* described by these layout parameters.
*/
- public Spec columnSpec;
+ public Spec columnSpec = Spec.UNDEFINED;
// Constructors
@@ -1646,7 +1777,7 @@ public class GridLayout extends ViewGroup {
* Constructs a new LayoutParams with default values as defined in {@link LayoutParams}.
*/
public LayoutParams() {
- this(spec(UNDEFINED), spec(UNDEFINED));
+ this(Spec.UNDEFINED, Spec.UNDEFINED);
}
// Copying constructors
@@ -1670,8 +1801,8 @@ public class GridLayout extends ViewGroup {
*/
public LayoutParams(LayoutParams that) {
super(that);
- this.rowSpec = new Spec(that.rowSpec);
- this.columnSpec = new Spec(that.columnSpec);
+ this.rowSpec = that.rowSpec;
+ this.columnSpec = that.columnSpec;
}
// AttributeSet constructors
@@ -1750,11 +1881,11 @@ public class GridLayout extends ViewGroup {
this.height = attributes.getLayoutDimension(heightAttr, DEFAULT_HEIGHT);
}
- private void setRowSpecSpan(Interval span) {
+ final void setRowSpecSpan(Interval span) {
rowSpec = rowSpec.copyWriteSpan(span);
}
- private void setColumnSpecSpan(Interval span) {
+ final void setColumnSpecSpan(Interval span) {
columnSpec = columnSpec.copyWriteSpan(span);
}
}
@@ -1763,7 +1894,7 @@ public class GridLayout extends ViewGroup {
In place of a HashMap from span to Int, use an array of key/value pairs - stored in Arcs.
Add the mutables completesCycle flag to avoid creating another hash table for detecting cycles.
*/
- private static class Arc {
+ final static class Arc {
public final Interval span;
public final MutableInt value;
public boolean valid = true;
@@ -1781,18 +1912,18 @@ public class GridLayout extends ViewGroup {
// A mutable Integer - used to avoid heap allocation during the layout operation
- private static class MutableInt {
+ final static class MutableInt {
public int value;
- private MutableInt() {
+ public MutableInt() {
reset();
}
- private MutableInt(int value) {
+ public MutableInt(int value) {
this.value = value;
}
- private void reset() {
+ public void reset() {
value = Integer.MIN_VALUE;
}
@@ -1802,7 +1933,7 @@ public class GridLayout extends ViewGroup {
}
}
- private static class Assoc<K, V> extends ArrayList<Pair<K, V>> {
+ final static class Assoc<K, V> extends ArrayList<Pair<K, V>> {
private final Class<K> keyType;
private final Class<V> valueType;
@@ -1811,7 +1942,7 @@ public class GridLayout extends ViewGroup {
this.valueType = valueType;
}
- private static <K, V> Assoc<K, V> of(Class<K> keyType, Class<V> valueType) {
+ public static <K, V> Assoc<K, V> of(Class<K> keyType, Class<V> valueType) {
return new Assoc<K, V>(keyType, valueType);
}
@@ -1847,7 +1978,7 @@ public class GridLayout extends ViewGroup {
rather than using (and storing) an implementation of Map<Key, ?>.
*/
@SuppressWarnings(value = "unchecked")
- private static class PackedMap<K, V> {
+ final static class PackedMap<K, V> {
public final int[] index;
public final K[] keys;
public final V[] values;
@@ -1859,7 +1990,7 @@ public class GridLayout extends ViewGroup {
this.values = compact(values, index);
}
- private V getValue(int i) {
+ public V getValue(int i) {
return values[index[i]];
}
@@ -1907,7 +2038,7 @@ public class GridLayout extends ViewGroup {
group to Bounds and to loop through all Views in the group taking the maximum
of the values for each View.
*/
- private static class Bounds {
+ static class Bounds {
public int before;
public int after;
public int flexibility; // we're flexible iff all included specs are flexible
@@ -1969,7 +2100,7 @@ public class GridLayout extends ViewGroup {
* Intervals are often written as {@code [min, max]} and represent the set of values
* {@code x} such that {@code min <= x < max}.
*/
- static class Interval {
+ final static class Interval {
/**
* The minimum value.
*/
@@ -1995,11 +2126,11 @@ public class GridLayout extends ViewGroup {
this.max = max;
}
- private int size() {
+ int size() {
return max - min;
}
- private Interval inverse() {
+ Interval inverse() {
return new Interval(max, min);
}
@@ -2050,8 +2181,8 @@ public class GridLayout extends ViewGroup {
/**
* A Spec defines the horizontal or vertical characteristics of a group of
- * cells. Each spec. defines the <em>grid indices</em>, <em>alignment</em> and
- * <em>flexibility</em> along the appropriate axis.
+ * cells. Each spec. defines the <em>grid indices</em> and <em>alignment</em>
+ * along the appropriate axis.
* <p>
* The <em>grid indices</em> are the leading and trailing edges of this cell group.
* See {@link GridLayout} for a description of the conventions used by GridLayout
@@ -2060,34 +2191,42 @@ public class GridLayout extends ViewGroup {
* The <em>alignment</em> property specifies how cells should be aligned in this group.
* For row groups, this specifies the vertical alignment.
* For column groups, this specifies the horizontal alignment.
+ * <p>
+ * Use the following static methods to create specs:
+ * <ul>
+ * <li>{@link #spec(int)}</li>
+ * <li>{@link #spec(int, int)}</li>
+ * <li>{@link #spec(int, Alignment)}</li>
+ * <li>{@link #spec(int, int, Alignment)}</li>
+ * </ul>
+ *
*/
public static class Spec {
+ static final Spec UNDEFINED = spec(GridLayout.UNDEFINED);
+
+ final boolean startDefined;
final Interval span;
final Alignment alignment;
- private Spec(Interval span, Alignment alignment) {
+ private Spec(boolean startDefined, Interval span, Alignment alignment) {
+ this.startDefined = startDefined;
this.span = span;
this.alignment = alignment;
}
- /* Copying constructor */
- private Spec(Spec that) {
- this(that.span, that.alignment);
- }
-
- private Spec(int start, int size, Alignment alignment) {
- this(new Interval(start, start + size), alignment);
+ private Spec(boolean startDefined, int start, int size, Alignment alignment) {
+ this(startDefined, new Interval(start, start + size), alignment);
}
- private Spec copyWriteSpan(Interval span) {
- return new Spec(span, alignment);
+ final Spec copyWriteSpan(Interval span) {
+ return new Spec(startDefined, span, alignment);
}
- private Spec copyWriteAlignment(Alignment alignment) {
- return new Spec(span, alignment);
+ final Spec copyWriteAlignment(Alignment alignment) {
+ return new Spec(startDefined, span, alignment);
}
- int getFlexibility() {
+ final int getFlexibility() {
return (alignment == UNDEFINED_ALIGNMENT) ? INFLEXIBLE : CAN_STRETCH;
}
@@ -2143,7 +2282,7 @@ public class GridLayout extends ViewGroup {
* @param alignment the alignment
*/
public static Spec spec(int start, int size, Alignment alignment) {
- return new Spec(start, size, alignment);
+ return new Spec(start != UNDEFINED, start, size, alignment);
}
/**
@@ -2246,7 +2385,7 @@ public class GridLayout extends ViewGroup {
}
}
- private static final Alignment UNDEFINED_ALIGNMENT = new Alignment() {
+ static final Alignment UNDEFINED_ALIGNMENT = new Alignment() {
public int getAlignmentValue(View view, int viewSize) {
return UNDEFINED;
}
@@ -2367,7 +2506,7 @@ public class GridLayout extends ViewGroup {
}
};
- private static boolean canStretch(int flexibility) {
+ static boolean canStretch(int flexibility) {
return (flexibility & CAN_STRETCH) != 0;
}
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 9ce8fe077582..1bbc50152a8d 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -569,7 +569,7 @@ public class HorizontalScrollView extends FrameLayout {
final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
(overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
- if (canOverscroll && overScrollBy(deltaX, 0, mScrollX, 0, range, 0,
+ if (overScrollBy(deltaX, 0, mScrollX, 0, range, 0,
mOverscrollDistance, 0, true)) {
// Break our velocity if we hit a scroll barrier.
mVelocityTracker.clear();
@@ -602,16 +602,12 @@ public class HorizontalScrollView extends FrameLayout {
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId);
- final int right = getScrollRange();
- final int overscrollMode = getOverScrollMode();
- final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && right > 0);
-
- if (getChildCount() > 0 && canOverscroll) {
+ if (getChildCount() > 0) {
if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
fling(-initialVelocity);
} else {
- if (mScroller.springBack(mScrollX, mScrollY, 0, right, 0, 0)) {
+ if (mScroller.springBack(mScrollX, mScrollY, 0,
+ getScrollRange(), 0, 0)) {
invalidate();
}
}
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index 690164c11430..f2ea3fc1d6d2 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -75,6 +75,7 @@ public class MediaController extends FrameLayout {
private WindowManager mWindowManager;
private Window mWindow;
private View mDecor;
+ private WindowManager.LayoutParams mDecorLayoutParams;
private ProgressBar mProgress;
private TextView mEndTime, mCurrentTime;
private boolean mShowing;
@@ -112,14 +113,12 @@ public class MediaController extends FrameLayout {
super(context);
mContext = context;
mUseFastForward = useFastForward;
+ initFloatingWindowLayout();
initFloatingWindow();
}
public MediaController(Context context) {
- super(context);
- mContext = context;
- mUseFastForward = true;
- initFloatingWindow();
+ this(context, true);
}
private void initFloatingWindow() {
@@ -142,6 +141,48 @@ public class MediaController extends FrameLayout {
requestFocus();
}
+ // Allocate and initialize the static parts of mDecorLayoutParams. Must
+ // also call updateFloatingWindowLayout() to fill in the dynamic parts
+ // (y and width) before mDecorLayoutParams can be used.
+ private void initFloatingWindowLayout() {
+ mDecorLayoutParams = new WindowManager.LayoutParams();
+ WindowManager.LayoutParams p = mDecorLayoutParams;
+ p.gravity = Gravity.TOP;
+ p.height = LayoutParams.WRAP_CONTENT;
+ p.x = 0;
+ p.format = PixelFormat.TRANSLUCENT;
+ p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
+ p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
+ p.token = null;
+ p.windowAnimations = 0; // android.R.style.DropDownAnimationDown;
+ }
+
+ // Update the dynamic parts of mDecorLayoutParams
+ // Must be called with mAnchor != NULL.
+ private void updateFloatingWindowLayout() {
+ int [] anchorPos = new int[2];
+ mAnchor.getLocationOnScreen(anchorPos);
+
+ WindowManager.LayoutParams p = mDecorLayoutParams;
+ p.width = mAnchor.getWidth();
+ p.y = anchorPos[1] + mAnchor.getHeight();
+ }
+
+ // This is called whenever mAnchor's layout bound changes
+ private OnLayoutChangeListener mLayoutChangeListener =
+ new OnLayoutChangeListener() {
+ public void onLayoutChange(View v, int left, int top, int right,
+ int bottom, int oldLeft, int oldTop, int oldRight,
+ int oldBottom) {
+ updateFloatingWindowLayout();
+ if (mShowing) {
+ mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams);
+ }
+ }
+ };
+
private OnTouchListener mTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
@@ -164,7 +205,13 @@ public class MediaController extends FrameLayout {
* @param view The view to which to anchor the controller when it is visible.
*/
public void setAnchorView(View view) {
+ if (mAnchor != null) {
+ mAnchor.removeOnLayoutChangeListener(mLayoutChangeListener);
+ }
mAnchor = view;
+ if (mAnchor != null) {
+ mAnchor.addOnLayoutChangeListener(mLayoutChangeListener);
+ }
FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -279,30 +326,14 @@ public class MediaController extends FrameLayout {
* the controller until hide() is called.
*/
public void show(int timeout) {
-
if (!mShowing && mAnchor != null) {
setProgress();
if (mPauseButton != null) {
mPauseButton.requestFocus();
}
disableUnsupportedButtons();
-
- int [] anchorpos = new int[2];
- mAnchor.getLocationOnScreen(anchorpos);
-
- WindowManager.LayoutParams p = new WindowManager.LayoutParams();
- p.gravity = Gravity.TOP;
- p.width = mAnchor.getWidth();
- p.height = LayoutParams.WRAP_CONTENT;
- p.x = 0;
- p.y = anchorpos[1] + mAnchor.getHeight() - p.height;
- p.format = PixelFormat.TRANSLUCENT;
- p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
- p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
- p.token = null;
- p.windowAnimations = 0; // android.R.style.DropDownAnimationDown;
- mWindowManager.addView(mDecor, p);
+ updateFloatingWindowLayout();
+ mWindowManager.addView(mDecor, mDecorLayoutParams);
mShowing = true;
}
updatePausePlay();
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 5345fa4d722b..b4c844b121f9 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -16,13 +16,10 @@
package android.widget;
-import com.android.internal.R;
-
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
import android.annotation.Widget;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -30,8 +27,8 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
-import android.graphics.Rect;
import android.graphics.Paint.Align;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.InputFilter;
import android.text.InputType;
@@ -43,16 +40,18 @@ import android.util.SparseArray;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import android.view.LayoutInflater.Filter;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
-import android.view.LayoutInflater.Filter;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.R;
+
/**
* A widget that enables the user to select a number form a predefined range.
* The widget presents an input filed and up and down buttons for selecting the
@@ -91,6 +90,12 @@ public class NumberPicker extends LinearLayout {
private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800;
/**
+ * The duration of scrolling to the next/previous value while changing
+ * the current value by one, i.e. increment or decrement.
+ */
+ private static final int CHANGE_CURRENT_BY_ONE_SCROLL_DURATION = 300;
+
+ /**
* The the delay for showing the input controls after a single tap on the
* input text.
*/
@@ -98,24 +103,59 @@ public class NumberPicker extends LinearLayout {
.getDoubleTapTimeout();
/**
- * The update step for incrementing the current value.
+ * The strength of fading in the top and bottom while drawing the selector.
*/
- private static final int UPDATE_STEP_INCREMENT = 1;
+ private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f;
/**
- * The update step for decrementing the current value.
+ * The default unscaled height of the selection divider.
*/
- private static final int UPDATE_STEP_DECREMENT = -1;
+ private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2;
/**
- * The strength of fading in the top and bottom while drawing the selector.
+ * In this state the selector wheel is not shown.
*/
- private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f;
+ private static final int SELECTOR_WHEEL_STATE_NONE = 0;
/**
- * The default unscaled height of the selection divider.
+ * In this state the selector wheel is small.
+ */
+ private static final int SELECTOR_WHEEL_STATE_SMALL = 1;
+
+ /**
+ * In this state the selector wheel is large.
+ */
+ private static final int SELECTOR_WHEEL_STATE_LARGE = 2;
+
+ /**
+ * The alpha of the selector wheel when it is bright.
*/
- private final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2;
+ private static final int SELECTOR_WHEEL_BRIGHT_ALPHA = 255;
+
+ /**
+ * The alpha of the selector wheel when it is dimmed.
+ */
+ private static final int SELECTOR_WHEEL_DIM_ALPHA = 60;
+
+ /**
+ * The alpha for the increment/decrement button when it is transparent.
+ */
+ private static final int BUTTON_ALPHA_TRANSPARENT = 0;
+
+ /**
+ * The alpha for the increment/decrement button when it is opaque.
+ */
+ private static final int BUTTON_ALPHA_OPAQUE = 1;
+
+ /**
+ * The property for setting the selector paint.
+ */
+ private static final String PROPERTY_SELECTOR_PAINT_ALPHA = "selectorPaintAlpha";
+
+ /**
+ * The property for setting the increment/decrement button alpha.
+ */
+ private static final String PROPERTY_BUTTON_ALPHA = "alpha";
/**
* The numbers accepted by the input text's {@link Filter}
@@ -168,6 +208,11 @@ public class NumberPicker extends LinearLayout {
private final int mTextSize;
/**
+ * The height of the gap between text elements if the selector wheel.
+ */
+ private int mSelectorTextGapHeight;
+
+ /**
* The values to be displayed instead the indices.
*/
private String[] mDisplayedValues;
@@ -223,7 +268,7 @@ public class NumberPicker extends LinearLayout {
/**
* The {@link Paint} for drawing the selector.
*/
- private final Paint mSelectorPaint;
+ private final Paint mSelectorWheelPaint;
/**
* The height of a selector element (text + gap).
@@ -266,10 +311,10 @@ public class NumberPicker extends LinearLayout {
private AdjustScrollerCommand mAdjustScrollerCommand;
/**
- * Handle to the reusable command for updating the current value from long
- * press.
+ * Handle to the reusable command for changing the current value from long
+ * press by one.
*/
- private UpdateValueFromLongPressCommand mUpdateFromLongPressCommand;
+ private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand;
/**
* {@link Animator} for showing the up/down arrows.
@@ -277,6 +322,11 @@ public class NumberPicker extends LinearLayout {
private final AnimatorSet mShowInputControlsAnimator;
/**
+ * {@link Animator} for dimming the selector wheel.
+ */
+ private final Animator mDimSelectorWheelAnimator;
+
+ /**
* The Y position of the last down event.
*/
private float mLastDownEventY;
@@ -297,9 +347,9 @@ public class NumberPicker extends LinearLayout {
private boolean mAdjustScrollerOnUpEvent;
/**
- * Flag if to draw the selector wheel.
+ * The state of the selector wheel.
*/
- private boolean mDrawSelectorWheel;
+ private int mSelectorWheelState;
/**
* Determines speed during touch scrolling.
@@ -362,6 +412,11 @@ public class NumberPicker extends LinearLayout {
private final long mShowInputControlsAnimimationDuration;
/**
+ * Flag whether the scoll wheel and the fading edges have been initialized.
+ */
+ private boolean mScrollWheelAndFadingEdgesInitialized;
+
+ /**
* Interface to listen for changes of the current value.
*/
public interface OnValueChangeListener {
@@ -473,7 +528,7 @@ public class NumberPicker extends LinearLayout {
// the fading edge effect implemented by View and we need our
// draw() method to be called. Therefore, we declare we will draw.
setWillNotDraw(false);
- setDrawScrollWheel(false);
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_NONE);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -483,9 +538,9 @@ public class NumberPicker extends LinearLayout {
public void onClick(View v) {
mInputText.clearFocus();
if (v.getId() == R.id.increment) {
- changeCurrent(mValue + 1);
+ changeCurrentByOne(true);
} else {
- changeCurrent(mValue - 1);
+ changeCurrentByOne(false);
}
}
};
@@ -494,9 +549,9 @@ public class NumberPicker extends LinearLayout {
public boolean onLongClick(View v) {
mInputText.clearFocus();
if (v.getId() == R.id.increment) {
- postUpdateValueFromLongPress(UPDATE_STEP_INCREMENT);
+ postChangeCurrentByOneFromLongPress(true);
} else {
- postUpdateValueFromLongPress(UPDATE_STEP_DECREMENT);
+ postChangeCurrentByOneFromLongPress(false);
}
return true;
}
@@ -516,10 +571,17 @@ public class NumberPicker extends LinearLayout {
mInputText = (EditText) findViewById(R.id.numberpicker_input);
mInputText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
if (hasFocus) {
mInputText.selectAll();
+ if (inputMethodManager != null) {
+ inputMethodManager.showSoftInput(mInputText, 0);
+ }
} else {
mInputText.setSelection(0, 0);
+ if (inputMethodManager != null) {
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ }
validateInputTextView(v);
}
}
@@ -548,16 +610,17 @@ public class NumberPicker extends LinearLayout {
ColorStateList colors = mInputText.getTextColors();
int color = colors.getColorForState(ENABLED_STATE_SET, Color.WHITE);
paint.setColor(color);
- mSelectorPaint = paint;
+ mSelectorWheelPaint = paint;
// create the animator for showing the input controls
- final ValueAnimator fadeScroller = ObjectAnimator.ofInt(this, "selectorPaintAlpha", 255, 0);
+ mDimSelectorWheelAnimator = ObjectAnimator.ofInt(this, PROPERTY_SELECTOR_PAINT_ALPHA,
+ SELECTOR_WHEEL_BRIGHT_ALPHA, SELECTOR_WHEEL_DIM_ALPHA);
final ObjectAnimator showIncrementButton = ObjectAnimator.ofFloat(mIncrementButton,
- "alpha", 0, 1);
+ PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE);
final ObjectAnimator showDecrementButton = ObjectAnimator.ofFloat(mDecrementButton,
- "alpha", 0, 1);
+ PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE);
mShowInputControlsAnimator = new AnimatorSet();
- mShowInputControlsAnimator.playTogether(fadeScroller, showIncrementButton,
+ mShowInputControlsAnimator.playTogether(mDimSelectorWheelAnimator, showIncrementButton,
showDecrementButton);
mShowInputControlsAnimator.addListener(new AnimatorListenerAdapter() {
private boolean mCanceled = false;
@@ -566,11 +629,9 @@ public class NumberPicker extends LinearLayout {
public void onAnimationEnd(Animator animation) {
if (!mCanceled) {
// if canceled => we still want the wheel drawn
- setDrawScrollWheel(false);
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL);
}
mCanceled = false;
- mSelectorPaint.setAlpha(255);
- invalidate();
}
@Override
@@ -588,20 +649,28 @@ public class NumberPicker extends LinearLayout {
updateInputTextView();
updateIncrementAndDecrementButtonsVisibilityState();
- if (mFlingable && !isInEditMode()) {
- // Start with shown selector wheel and hidden controls. When made
- // visible hide the selector and fade-in the controls to suggest
- // fling interaction.
- setDrawScrollWheel(true);
- hideInputControls();
+ if (mFlingable) {
+ if (isInEditMode()) {
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL);
+ } else {
+ // Start with shown selector wheel and hidden controls. When made
+ // visible hide the selector and fade-in the controls to suggest
+ // fling interaction.
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE);
+ hideInputControls();
+ }
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- // need to do this when we know our size
- initializeScrollWheel();
+ if (!mScrollWheelAndFadingEdgesInitialized) {
+ mScrollWheelAndFadingEdgesInitialized = true;
+ // need to do all this when we know our size
+ initializeSelectorWheel();
+ initializeFadingEdges();
+ }
}
@Override
@@ -614,9 +683,10 @@ public class NumberPicker extends LinearLayout {
mLastMotionEventY = mLastDownEventY = event.getY();
removeAllCallbacks();
mShowInputControlsAnimator.cancel();
+ mDimSelectorWheelAnimator.cancel();
mBeginEditOnUpEvent = false;
mAdjustScrollerOnUpEvent = true;
- if (mDrawSelectorWheel) {
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) {
boolean scrollersFinished = mFlingScroller.isFinished()
&& mAdjustScroller.isFinished();
if (!scrollersFinished) {
@@ -635,7 +705,7 @@ public class NumberPicker extends LinearLayout {
|| (!mDecrementButton.isShown()
&& isEventInViewHitRect(event, mDecrementButton))) {
mAdjustScrollerOnUpEvent = false;
- setDrawScrollWheel(true);
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE);
hideInputControls();
return true;
}
@@ -646,7 +716,7 @@ public class NumberPicker extends LinearLayout {
if (deltaDownY > mTouchSlop) {
mBeginEditOnUpEvent = false;
onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
- setDrawScrollWheel(true);
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE);
hideInputControls();
return true;
}
@@ -683,12 +753,9 @@ public class NumberPicker extends LinearLayout {
break;
case MotionEvent.ACTION_UP:
if (mBeginEditOnUpEvent) {
- setDrawScrollWheel(false);
+ setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL);
showInputControls(mShowInputControlsAnimimationDuration);
mInputText.requestFocus();
- InputMethodManager imm = (InputMethodManager) getContext().getSystemService(
- Context.INPUT_METHOD_SERVICE);
- imm.showSoftInput(mInputText, 0);
return true;
}
VelocityTracker velocityTracker = mVelocityTracker;
@@ -715,10 +782,18 @@ public class NumberPicker extends LinearLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
- int action = event.getActionMasked();
- if ((action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP)
- && !isEventInViewHitRect(event, mInputText)) {
- removeAllCallbacks();
+ final int action = event.getActionMasked();
+ switch (action) {
+ case MotionEvent.ACTION_MOVE:
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) {
+ removeAllCallbacks();
+ forceCompleteChangeCurrentByOneViaScroll();
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ removeAllCallbacks();
+ break;
}
return super.dispatchTouchEvent(event);
}
@@ -743,7 +818,7 @@ public class NumberPicker extends LinearLayout {
@Override
public void computeScroll() {
- if (!mDrawSelectorWheel) {
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) {
return;
}
Scroller scroller = mFlingScroller;
@@ -777,7 +852,10 @@ public class NumberPicker extends LinearLayout {
@Override
public void scrollBy(int x, int y) {
- int[] selectorIndices = getSelectorIndices();
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) {
+ return;
+ }
+ int[] selectorIndices = mSelectorIndices;
if (!mWrapSelectorWheel && y > 0
&& selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
@@ -789,19 +867,19 @@ public class NumberPicker extends LinearLayout {
return;
}
mCurrentScrollOffset += y;
- while (mCurrentScrollOffset - mInitialScrollOffset >= mSelectorElementHeight) {
+ while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) {
mCurrentScrollOffset -= mSelectorElementHeight;
decrementSelectorIndices(selectorIndices);
changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]);
- if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
+ if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
}
}
- while (mCurrentScrollOffset - mInitialScrollOffset <= -mSelectorElementHeight) {
+ while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) {
mCurrentScrollOffset += mSelectorElementHeight;
- incrementScrollSelectorIndices(selectorIndices);
+ incrementSelectorIndices(selectorIndices);
changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]);
- if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
+ if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
mCurrentScrollOffset = mInitialScrollOffset;
}
}
@@ -847,7 +925,7 @@ public class NumberPicker extends LinearLayout {
return;
}
mFormatter = formatter;
- resetSelectorWheelIndices();
+ initializeSelectorWheelIndices();
updateInputTextView();
}
@@ -890,8 +968,10 @@ public class NumberPicker extends LinearLayout {
value = mWrapSelectorWheel ? mMinValue : mMaxValue;
}
mValue = value;
+ initializeSelectorWheelIndices();
updateInputTextView();
updateIncrementAndDecrementButtonsVisibilityState();
+ invalidate();
}
/**
@@ -981,7 +1061,7 @@ public class NumberPicker extends LinearLayout {
}
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
setWrapSelectorWheel(wrapSelectorWheel);
- resetSelectorWheelIndices();
+ initializeSelectorWheelIndices();
updateInputTextView();
}
@@ -1012,7 +1092,7 @@ public class NumberPicker extends LinearLayout {
}
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
setWrapSelectorWheel(wrapSelectorWheel);
- resetSelectorWheelIndices();
+ initializeSelectorWheelIndices();
updateInputTextView();
}
@@ -1043,7 +1123,7 @@ public class NumberPicker extends LinearLayout {
mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
}
updateInputTextView();
- resetSelectorWheelIndices();
+ initializeSelectorWheelIndices();
}
@Override
@@ -1080,18 +1160,19 @@ public class NumberPicker extends LinearLayout {
@Override
public void draw(Canvas canvas) {
// Dispatch draw to our children only if we are not currently running
- // the animation for simultaneously fading out the scroll wheel and
+ // the animation for simultaneously dimming the scroll wheel and
// showing in the buttons. This class takes advantage of the View
// implementation of fading edges effect to draw the selector wheel.
// However, in View.draw(), the fading is applied after all the children
// have been drawn and we do not want this fading to be applied to the
- // buttons which are currently showing in. Therefore, we draw our
- // children after we have completed drawing ourselves.
+ // buttons. Therefore, we draw our children after we have completed
+ // drawing ourselves.
super.draw(canvas);
// Draw our children if we are not showing the selector wheel of fading
// it out
- if (mShowInputControlsAnimator.isRunning() || !mDrawSelectorWheel) {
+ if (mShowInputControlsAnimator.isRunning()
+ || mSelectorWheelState != SELECTOR_WHEEL_STATE_LARGE) {
long drawTime = getDrawingTime();
for (int i = 0, count = getChildCount(); i < count; i++) {
View child = getChildAt(i);
@@ -1105,25 +1186,32 @@ public class NumberPicker extends LinearLayout {
@Override
protected void onDraw(Canvas canvas) {
- // we only draw the selector wheel
- if (!mDrawSelectorWheel) {
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) {
return;
}
+
float x = (mRight - mLeft) / 2;
float y = mCurrentScrollOffset;
+ final int restoreCount = canvas.save();
+
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_SMALL) {
+ Rect clipBounds = canvas.getClipBounds();
+ clipBounds.inset(0, mSelectorElementHeight);
+ canvas.clipRect(clipBounds);
+ }
+
// draw the selector wheel
- int[] selectorIndices = getSelectorIndices();
+ int[] selectorIndices = mSelectorIndices;
for (int i = 0; i < selectorIndices.length; i++) {
int selectorIndex = selectorIndices[i];
String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex);
- canvas.drawText(scrollSelectorValue, x, y, mSelectorPaint);
+ canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint);
y += mSelectorElementHeight;
}
// draw the selection dividers (only if scrolling and drawable specified)
if (mSelectionDivider != null) {
- mSelectionDivider.setAlpha(mSelectorPaint.getAlpha());
// draw the top divider
int topOfTopDivider =
(getHeight() - mSelectorElementHeight - mSelectionDividerHeight) / 2;
@@ -1137,6 +1225,8 @@ public class NumberPicker extends LinearLayout {
mSelectionDivider.setBounds(0, topOfBottomDivider, mRight, bottomOfBottomDivider);
mSelectionDivider.draw(canvas);
}
+
+ canvas.restoreToCount(restoreCount);
}
@Override
@@ -1149,11 +1239,17 @@ public class NumberPicker extends LinearLayout {
* Resets the selector indices and clear the cached
* string representation of these indices.
*/
- private void resetSelectorWheelIndices() {
+ private void initializeSelectorWheelIndices() {
mSelectorIndexToStringCache.clear();
- int[] selectorIdices = getSelectorIndices();
- for (int i = 0; i < selectorIdices.length; i++) {
- selectorIdices[i] = Integer.MIN_VALUE;
+ int[] selectorIdices = mSelectorIndices;
+ int current = getValue();
+ for (int i = 0; i < mSelectorIndices.length; i++) {
+ int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX);
+ if (mWrapSelectorWheel) {
+ selectorIndex = getWrappedSelectorIndex(selectorIndex);
+ }
+ mSelectorIndices[i] = selectorIndex;
+ ensureCachedScrollSelectorValue(mSelectorIndices[i]);
}
}
@@ -1179,16 +1275,59 @@ public class NumberPicker extends LinearLayout {
}
/**
+ * Changes the current value by one which is increment or
+ * decrement based on the passes argument.
+ *
+ * @param increment True to increment, false to decrement.
+ */
+ private void changeCurrentByOne(boolean increment) {
+ if (mFlingable) {
+ mDimSelectorWheelAnimator.cancel();
+ mInputText.setVisibility(View.INVISIBLE);
+ mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA);
+ mPreviousScrollerY = 0;
+ forceCompleteChangeCurrentByOneViaScroll();
+ if (increment) {
+ mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight,
+ CHANGE_CURRENT_BY_ONE_SCROLL_DURATION);
+ } else {
+ mFlingScroller.startScroll(0, 0, 0, mSelectorElementHeight,
+ CHANGE_CURRENT_BY_ONE_SCROLL_DURATION);
+ }
+ invalidate();
+ } else {
+ if (increment) {
+ changeCurrent(mValue + 1);
+ } else {
+ changeCurrent(mValue - 1);
+ }
+ }
+ }
+
+ /**
+ * Ensures that if we are in the process of changing the current value
+ * by one via scrolling the scroller gets to its final state and the
+ * value is updated.
+ */
+ private void forceCompleteChangeCurrentByOneViaScroll() {
+ Scroller scroller = mFlingScroller;
+ if (!scroller.isFinished()) {
+ final int yBeforeAbort = scroller.getCurrY();
+ scroller.abortAnimation();
+ final int yDelta = scroller.getCurrY() - yBeforeAbort;
+ scrollBy(0, yDelta);
+ }
+ }
+
+ /**
* Sets the <code>alpha</code> of the {@link Paint} for drawing the selector
* wheel.
*/
@SuppressWarnings("unused")
- // Called by ShowInputControlsAnimator via reflection
+ // Called via reflection
private void setSelectorPaintAlpha(int alpha) {
- mSelectorPaint.setAlpha(alpha);
- if (mDrawSelectorWheel) {
- invalidate();
- }
+ mSelectorWheelPaint.setAlpha(alpha);
+ invalidate();
}
/**
@@ -1200,14 +1339,15 @@ public class NumberPicker extends LinearLayout {
}
/**
- * Sets if to <code>drawSelectionWheel</code>.
+ * Sets the <code>selectorWheelState</code>.
*/
- private void setDrawScrollWheel(boolean drawSelectorWheel) {
- mDrawSelectorWheel = drawSelectorWheel;
- // do not fade if the selector wheel not shown
- setVerticalFadingEdgeEnabled(drawSelectorWheel);
+ private void setSelectorWheelState(int selectorWheelState) {
+ mSelectorWheelState = selectorWheelState;
+ if (selectorWheelState == SELECTOR_WHEEL_STATE_LARGE) {
+ mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA);
+ }
- if (mFlingable && mDrawSelectorWheel
+ if (mFlingable && selectorWheelState == SELECTOR_WHEEL_STATE_LARGE
&& AccessibilityManager.getInstance(mContext).isEnabled()) {
AccessibilityManager.getInstance(mContext).interrupt();
String text = mContext.getString(R.string.number_picker_increment_scroll_action);
@@ -1217,16 +1357,14 @@ public class NumberPicker extends LinearLayout {
}
}
- private void initializeScrollWheel() {
- if (mInitialScrollOffset != Integer.MIN_VALUE) {
- return;
- }
- int[] selectorIndices = getSelectorIndices();
+ private void initializeSelectorWheel() {
+ initializeSelectorWheelIndices();
+ int[] selectorIndices = mSelectorIndices;
int totalTextHeight = selectorIndices.length * mTextSize;
float totalTextGapHeight = (mBottom - mTop) - totalTextHeight;
float textGapCount = selectorIndices.length - 1;
- int selectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f);
- mSelectorElementHeight = mTextSize + selectorTextGapHeight;
+ mSelectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f);
+ mSelectorElementHeight = mTextSize + mSelectorTextGapHeight;
// Ensure that the middle item is positioned the same as the text in mInputText
int editTextTextPosition = mInputText.getBaseline() + mInputText.getTop();
mInitialScrollOffset = editTextTextPosition -
@@ -1235,13 +1373,23 @@ public class NumberPicker extends LinearLayout {
updateInputTextView();
}
+ private void initializeFadingEdges() {
+ setVerticalFadingEdgeEnabled(true);
+ setFadingEdgeLength((mBottom - mTop - mTextSize) / 2);
+ }
+
/**
* Callback invoked upon completion of a given <code>scroller</code>.
*/
private void onScrollerFinished(Scroller scroller) {
if (scroller == mFlingScroller) {
- postAdjustScrollerCommand(0);
- onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
+ if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) {
+ postAdjustScrollerCommand(0);
+ onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
+ } else {
+ updateInputTextView();
+ fadeSelectorWheel(mShowInputControlsAnimimationDuration);
+ }
} else {
updateInputTextView();
showInputControls(mShowInputControlsAnimimationDuration);
@@ -1312,6 +1460,17 @@ public class NumberPicker extends LinearLayout {
}
/**
+ * Fade the selector wheel via an animation.
+ *
+ * @param animationDuration The duration of the animation.
+ */
+ private void fadeSelectorWheel(long animationDuration) {
+ mInputText.setVisibility(VISIBLE);
+ mDimSelectorWheelAnimator.setDuration(animationDuration);
+ mDimSelectorWheelAnimator.start();
+ }
+
+ /**
* Updates the visibility state of the increment and decrement buttons.
*/
private void updateIncrementAndDecrementButtonsVisibilityState() {
@@ -1328,25 +1487,6 @@ public class NumberPicker extends LinearLayout {
}
/**
- * @return The selector indices array with proper values with the current as
- * the middle one.
- */
- private int[] getSelectorIndices() {
- int current = getValue();
- if (mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] != current) {
- for (int i = 0; i < mSelectorIndices.length; i++) {
- int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX);
- if (mWrapSelectorWheel) {
- selectorIndex = getWrappedSelectorIndex(selectorIndex);
- }
- mSelectorIndices[i] = selectorIndex;
- ensureCachedScrollSelectorValue(mSelectorIndices[i]);
- }
- }
- return mSelectorIndices;
- }
-
- /**
* @return The wrapped index <code>selectorIndex</code> value.
*/
private int getWrappedSelectorIndex(int selectorIndex) {
@@ -1362,7 +1502,7 @@ public class NumberPicker extends LinearLayout {
* Increments the <code>selectorIndices</code> whose string representations
* will be displayed in the selector.
*/
- private void incrementScrollSelectorIndices(int[] selectorIndices) {
+ private void incrementSelectorIndices(int[] selectorIndices) {
for (int i = 0; i < selectorIndices.length - 1; i++) {
selectorIndices[i] = selectorIndices[i + 1];
}
@@ -1467,25 +1607,26 @@ public class NumberPicker extends LinearLayout {
}
/**
- * Posts a command for updating the current value every <code>updateMillis
- * </code>.
+ * Posts a command for changing the current value by one.
+ *
+ * @param increment Whether to increment or decrement the value.
*/
- private void postUpdateValueFromLongPress(int updateMillis) {
+ private void postChangeCurrentByOneFromLongPress(boolean increment) {
mInputText.clearFocus();
removeAllCallbacks();
- if (mUpdateFromLongPressCommand == null) {
- mUpdateFromLongPressCommand = new UpdateValueFromLongPressCommand();
+ if (mChangeCurrentByOneFromLongPressCommand == null) {
+ mChangeCurrentByOneFromLongPressCommand = new ChangeCurrentByOneFromLongPressCommand();
}
- mUpdateFromLongPressCommand.setUpdateStep(updateMillis);
- post(mUpdateFromLongPressCommand);
+ mChangeCurrentByOneFromLongPressCommand.setIncrement(increment);
+ post(mChangeCurrentByOneFromLongPressCommand);
}
/**
* Removes all pending callback from the message queue.
*/
private void removeAllCallbacks() {
- if (mUpdateFromLongPressCommand != null) {
- removeCallbacks(mUpdateFromLongPressCommand);
+ if (mChangeCurrentByOneFromLongPressCommand != null) {
+ removeCallbacks(mChangeCurrentByOneFromLongPressCommand);
}
if (mAdjustScrollerCommand != null) {
removeCallbacks(mAdjustScrollerCommand);
@@ -1658,17 +1799,17 @@ public class NumberPicker extends LinearLayout {
}
/**
- * Command for updating the current value from a long press.
+ * Command for changing the current value from a long press by one.
*/
- class UpdateValueFromLongPressCommand implements Runnable {
- private int mUpdateStep = 0;
+ class ChangeCurrentByOneFromLongPressCommand implements Runnable {
+ private boolean mIncrement;
- private void setUpdateStep(int updateStep) {
- mUpdateStep = updateStep;
+ private void setIncrement(boolean increment) {
+ mIncrement = increment;
}
public void run() {
- changeCurrent(mValue + mUpdateStep);
+ changeCurrentByOne(mIncrement);
postDelayed(this, mLongPressUpdateInterval);
}
}
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index e5719981e648..6aee5a07e030 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -584,10 +584,10 @@ public class OverScroller {
// A device specific coefficient adjusted to physical values.
private static float PHYSICAL_COEF;
- private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math.log(0.9));
- private static final float INFLEXION = 0.4f; // Tension lines cross at (INFLEXION, 1)
- private static final float START_TENSION = 1.0f;
- private static final float END_TENSION = 0.6666f;
+ private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
+ private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1)
+ private static final float START_TENSION = 0.5f;
+ private static final float END_TENSION = 1.0f;
private static final float P1 = START_TENSION * INFLEXION;
private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION);
diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java
index 17512d8c93d2..6a6d76766113 100644
--- a/core/java/android/widget/PopupMenu.java
+++ b/core/java/android/widget/PopupMenu.java
@@ -157,6 +157,8 @@ public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback {
* @hide
*/
public boolean onOpenSubMenu(MenuBuilder subMenu) {
+ if (subMenu == null) return false;
+
if (!subMenu.hasVisibleItems()) {
return true;
}
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 4d45c2fee094..8ba7beed3ffd 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -92,6 +92,7 @@ public class PopupWindow {
private boolean mClipToScreen;
private boolean mAllowScrollingAnchorParent = true;
private boolean mLayoutInsetDecor = false;
+ private boolean mNotTouchModal;
private OnTouchListener mTouchInterceptor;
@@ -694,6 +695,15 @@ public class PopupWindow {
}
/**
+ * Set whether this window is touch modal or if outside touches will be sent to
+ * other windows behind it.
+ * @hide
+ */
+ public void setTouchModal(boolean touchModal) {
+ mNotTouchModal = !touchModal;
+ }
+
+ /**
* <p>Change the width and height measure specs that are given to the
* window manager by the popup. By default these are 0, meaning that
* the current width or height is requested as an explicit size from
@@ -796,6 +806,21 @@ public class PopupWindow {
* @param y the popup's y location offset
*/
public void showAtLocation(View parent, int gravity, int x, int y) {
+ showAtLocation(parent.getWindowToken(), gravity, x, y);
+ }
+
+ /**
+ * Display the content view in a popup window at the specified location.
+ *
+ * @param token Window token to use for creating the new window
+ * @param gravity the gravity which controls the placement of the popup window
+ * @param x the popup's x location offset
+ * @param y the popup's y location offset
+ *
+ * @hide Internal use only. Applications should use
+ * {@link #showAtLocation(View, int, int, int)} instead.
+ */
+ public void showAtLocation(IBinder token, int gravity, int x, int y) {
if (isShowing() || mContentView == null) {
return;
}
@@ -805,7 +830,7 @@ public class PopupWindow {
mIsShowing = true;
mIsDropdown = false;
- WindowManager.LayoutParams p = createPopupLayout(parent.getWindowToken());
+ WindowManager.LayoutParams p = createPopupLayout(token);
p.windowAnimations = computeAnimationResource();
preparePopup(p);
@@ -1033,6 +1058,9 @@ public class PopupWindow {
if (mLayoutInsetDecor) {
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
}
+ if (mNotTouchModal) {
+ curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ }
return curFlags;
}
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index e033d2d0558f..df88fecc0618 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -937,7 +937,8 @@ public class ProgressBar extends View {
int left = 0;
if (mIndeterminateDrawable != null) {
- if (mOnlyIndeterminate) {
+ // Aspect ratio logic does not apply to AnimationDrawables
+ if (mOnlyIndeterminate && !(mIndeterminateDrawable instanceof AnimationDrawable)) {
// Maintain aspect ratio. Certain kinds of animated drawables
// get very confused otherwise.
final int intrinsicWidth = mIndeterminateDrawable.getIntrinsicWidth();
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 6edfd5923973..12a93ac888dc 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -212,6 +212,11 @@ public class RelativeLayout extends ViewGroup {
* Describes how the child views are positioned. Defaults to
* <code>Gravity.LEFT | Gravity.TOP</code>.
*
+ * <p>Note that since RelativeLayout considers the positioning of each child
+ * relative to one another to be significant, setting gravity will affect
+ * the positioning of all children as a single unit within the parent.
+ * This happens after children have been relatively positioned.</p>
+ *
* @param gravity See {@link android.view.Gravity}
*
* @see #setHorizontalGravity(int)
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index d91eeb2d7d81..61ea5c9c211a 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -583,7 +583,7 @@ public class ScrollView extends FrameLayout {
final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
(overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
- if (canOverscroll && overScrollBy(0, deltaY, 0, mScrollY,
+ if (overScrollBy(0, deltaY, 0, mScrollY,
0, range, 0, mOverscrollDistance, true)) {
// Break our velocity if we hit a scroll barrier.
mVelocityTracker.clear();
@@ -616,16 +616,12 @@ public class ScrollView extends FrameLayout {
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId);
- final int bottom = getScrollRange();
- final int overscrollMode = getOverScrollMode();
- final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && bottom > 0);
-
- if (getChildCount() > 0 && canOverscroll) {
+ if (getChildCount() > 0) {
if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
fling(-initialVelocity);
} else {
- if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, bottom)) {
+ if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0,
+ getScrollRange())) {
invalidate();
}
}
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index f230031908cf..adf2b7b7a3f9 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -120,6 +120,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
private CharSequence mOldQueryText;
private CharSequence mUserQuery;
private boolean mExpandedInActionView;
+ private int mCollapsedImeOptions;
private SearchableInfo mSearchable;
private Bundle mAppSearchData;
@@ -1166,6 +1167,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setText("");
+ mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
@@ -1175,6 +1177,8 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
@Override
public void onActionViewExpanded() {
mExpandedInActionView = true;
+ mCollapsedImeOptions = mQueryTextView.getImeOptions();
+ mQueryTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN);
setIconified(false);
}
diff --git a/core/java/android/widget/ShareActionProvider.java b/core/java/android/widget/ShareActionProvider.java
index 6e29024bcef4..36278907cea2 100644
--- a/core/java/android/widget/ShareActionProvider.java
+++ b/core/java/android/widget/ShareActionProvider.java
@@ -169,6 +169,7 @@ public class ShareActionProvider extends ActionProvider {
mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId);
activityChooserView.setExpandActivityOverflowButtonDrawable(drawable);
+ activityChooserView.setProvider(this);
return activityChooserView;
}
diff --git a/core/java/android/widget/Space.java b/core/java/android/widget/Space.java
index d7b2ec27fee4..bb53a7732f10 100644
--- a/core/java/android/widget/Space.java
+++ b/core/java/android/widget/Space.java
@@ -32,20 +32,24 @@ public final class Space extends View {
*/
public Space(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ if (getVisibility() == VISIBLE) {
+ setVisibility(INVISIBLE);
+ }
}
/**
* {@inheritDoc}
*/
public Space(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
/**
* {@inheritDoc}
*/
public Space(Context context) {
- super(context);
+ //noinspection NullableProblems
+ this(context, null);
}
/**
@@ -58,22 +62,6 @@ public final class Space extends View {
}
/**
- * {@inheritDoc}
- */
- @Override
- public ViewGroup.LayoutParams getLayoutParams() {
- return super.getLayoutParams();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setLayoutParams(ViewGroup.LayoutParams params) {
- super.setLayoutParams(params);
- }
-
- /**
* Compare to: {@link View#getDefaultSize(int, int)}
* If mode is AT_MOST, return the child size instead of the parent size
* (unless it is too big).
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index 14cbf6fe42d5..e9eec100cab3 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -22,7 +22,6 @@ import android.text.Selection;
import android.text.Spanned;
import android.text.style.SpellCheckSpan;
import android.text.style.SuggestionSpan;
-import android.util.Log;
import android.view.textservice.SpellCheckerSession;
import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
import android.view.textservice.SuggestionsInfo;
@@ -40,23 +39,21 @@ import java.util.Locale;
* @hide
*/
public class SpellChecker implements SpellCheckerSessionListener {
- private static final String LOG_TAG = "SpellChecker";
- private static final boolean DEBUG_SPELL_CHECK = false;
- private static final int DELAY_BEFORE_SPELL_CHECK = 400; // milliseconds
private final TextView mTextView;
final SpellCheckerSession mSpellCheckerSession;
final int mCookie;
- // Paired arrays for the (id, spellCheckSpan) pair. mIndex is the next available position
+ // Paired arrays for the (id, spellCheckSpan) pair. A negative id means the associated
+ // SpellCheckSpan has been recycled and can be-reused.
+ // May contain null SpellCheckSpans after a given index.
private int[] mIds;
private SpellCheckSpan[] mSpellCheckSpans;
- // The actual current number of used slots in the above arrays
+ // The mLength first elements of the above arrays have been initialized
private int mLength;
private int mSpanSequenceCounter = 0;
- private Runnable mChecker;
public SpellChecker(TextView textView) {
mTextView = textView;
@@ -64,84 +61,77 @@ public class SpellChecker implements SpellCheckerSessionListener {
final TextServicesManager textServicesManager = (TextServicesManager) textView.getContext().
getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
mSpellCheckerSession = textServicesManager.newSpellCheckerSession(
- null /* not currently used by the textServicesManager */, Locale.getDefault(),
+ null /* not currently used by the textServicesManager */,
+ null /* null locale means use the languages defined in Settings
+ if referToSpellCheckerLanguageSettings is true */,
this, true /* means use the languages defined in Settings */);
mCookie = hashCode();
// Arbitrary: 4 simultaneous spell check spans. Will automatically double size on demand
- final int size = ArrayUtils.idealObjectArraySize(4);
+ final int size = ArrayUtils.idealObjectArraySize(1);
mIds = new int[size];
mSpellCheckSpans = new SpellCheckSpan[size];
mLength = 0;
}
- public void addSpellCheckSpan(SpellCheckSpan spellCheckSpan) {
- int length = mIds.length;
- if (mLength >= length) {
- final int newSize = length * 2;
+ /**
+ * @return true if a spell checker session has successfully been created. Returns false if not,
+ * for instance when spell checking has been disabled in settings.
+ */
+ public boolean isSessionActive() {
+ return mSpellCheckerSession != null;
+ }
+
+ public void closeSession() {
+ if (mSpellCheckerSession != null) {
+ mSpellCheckerSession.close();
+ }
+ }
+
+ private int nextSpellCheckSpanIndex() {
+ for (int i = 0; i < mLength; i++) {
+ if (mIds[i] < 0) return i;
+ }
+
+ if (mLength == mSpellCheckSpans.length) {
+ final int newSize = mLength * 2;
int[] newIds = new int[newSize];
SpellCheckSpan[] newSpellCheckSpans = new SpellCheckSpan[newSize];
- System.arraycopy(mIds, 0, newIds, 0, length);
- System.arraycopy(mSpellCheckSpans, 0, newSpellCheckSpans, 0, length);
+ System.arraycopy(mIds, 0, newIds, 0, mLength);
+ System.arraycopy(mSpellCheckSpans, 0, newSpellCheckSpans, 0, mLength);
mIds = newIds;
mSpellCheckSpans = newSpellCheckSpans;
}
- mIds[mLength] = mSpanSequenceCounter++;
- mSpellCheckSpans[mLength] = spellCheckSpan;
+ mSpellCheckSpans[mLength] = new SpellCheckSpan();
mLength++;
+ return mLength - 1;
+ }
- if (DEBUG_SPELL_CHECK) {
- final Editable mText = (Editable) mTextView.getText();
- int start = mText.getSpanStart(spellCheckSpan);
- int end = mText.getSpanEnd(spellCheckSpan);
- if (start >= 0 && end >= 0) {
- Log.d(LOG_TAG, "Schedule check " + mText.subSequence(start, end));
- } else {
- Log.d(LOG_TAG, "Schedule check EMPTY!");
- }
- }
-
- scheduleSpellCheck();
+ public void addSpellCheckSpan(int wordStart, int wordEnd) {
+ final int index = nextSpellCheckSpanIndex();
+ ((Editable) mTextView.getText()).setSpan(mSpellCheckSpans[index], wordStart, wordEnd,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ mIds[index] = mSpanSequenceCounter++;
}
public void removeSpellCheckSpan(SpellCheckSpan spellCheckSpan) {
for (int i = 0; i < mLength; i++) {
if (mSpellCheckSpans[i] == spellCheckSpan) {
- removeAtIndex(i);
+ mSpellCheckSpans[i].setSpellCheckInProgress(false);
+ mIds[i] = -1;
return;
}
}
}
- private void removeAtIndex(int i) {
- System.arraycopy(mIds, i + 1, mIds, i, mLength - i - 1);
- System.arraycopy(mSpellCheckSpans, i + 1, mSpellCheckSpans, i, mLength - i - 1);
- mLength--;
- }
-
public void onSelectionChanged() {
- scheduleSpellCheck();
+ spellCheck();
}
- private void scheduleSpellCheck() {
- if (mLength == 0) return;
+ public void spellCheck() {
if (mSpellCheckerSession == null) return;
- if (mChecker != null) {
- mTextView.removeCallbacks(mChecker);
- }
- if (mChecker == null) {
- mChecker = new Runnable() {
- public void run() {
- spellCheck();
- }
- };
- }
- mTextView.postDelayed(mChecker, DELAY_BEFORE_SPELL_CHECK);
- }
-
- private void spellCheck() {
final Editable editable = (Editable) mTextView.getText();
final int selectionStart = Selection.getSelectionStart(editable);
final int selectionEnd = Selection.getSelectionEnd(editable);
@@ -150,8 +140,7 @@ public class SpellChecker implements SpellCheckerSessionListener {
int textInfosCount = 0;
for (int i = 0; i < mLength; i++) {
- SpellCheckSpan spellCheckSpan = mSpellCheckSpans[i];
-
+ final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[i];
if (spellCheckSpan.isSpellCheckInProgress()) continue;
final int start = editable.getSpanStart(spellCheckSpan);
@@ -160,7 +149,7 @@ public class SpellChecker implements SpellCheckerSessionListener {
// Do not check this word if the user is currently editing it
if (start >= 0 && end > start && (selectionEnd < start || selectionStart > end)) {
final String word = editable.subSequence(start, end).toString();
- spellCheckSpan.setSpellCheckInProgress();
+ spellCheckSpan.setSpellCheckInProgress(true);
textInfos[textInfosCount++] = new TextInfo(word, mCookie, mIds[i]);
}
}
@@ -182,27 +171,18 @@ public class SpellChecker implements SpellCheckerSessionListener {
for (int i = 0; i < results.length; i++) {
SuggestionsInfo suggestionsInfo = results[i];
if (suggestionsInfo.getCookie() != mCookie) continue;
-
final int sequenceNumber = suggestionsInfo.getSequence();
- // Starting from the end, to limit the number of array copy while removing
- for (int j = mLength - 1; j >= 0; j--) {
+
+ for (int j = 0; j < mLength; j++) {
+ final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[j];
+
if (sequenceNumber == mIds[j]) {
- SpellCheckSpan spellCheckSpan = mSpellCheckSpans[j];
final int attributes = suggestionsInfo.getSuggestionsAttributes();
boolean isInDictionary =
((attributes & SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY) > 0);
boolean looksLikeTypo =
((attributes & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO) > 0);
- if (DEBUG_SPELL_CHECK) {
- final int start = editable.getSpanStart(spellCheckSpan);
- final int end = editable.getSpanEnd(spellCheckSpan);
- Log.d(LOG_TAG, "Result sequence=" + suggestionsInfo.getSequence() + " " +
- editable.subSequence(start, end) +
- "\t" + (isInDictionary?"IN_DICT" : "NOT_DICT") +
- "\t" + (looksLikeTypo?"TYPO" : "NOT_TYPO"));
- }
-
if (!isInDictionary && looksLikeTypo) {
String[] suggestions = getSuggestions(suggestionsInfo);
if (suggestions.length > 0) {
@@ -216,13 +196,6 @@ public class SpellChecker implements SpellCheckerSessionListener {
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// TODO limit to the word rectangle region
mTextView.invalidate();
-
- if (DEBUG_SPELL_CHECK) {
- String suggestionsString = "";
- for (String s : suggestions) { suggestionsString += s + "|"; }
- Log.d(LOG_TAG, " Suggestions for " + sequenceNumber + " " +
- editable.subSequence(start, end)+ " " + suggestionsString);
- }
}
}
editable.removeSpan(spellCheckSpan);
@@ -232,9 +205,10 @@ public class SpellChecker implements SpellCheckerSessionListener {
}
private static String[] getSuggestions(SuggestionsInfo suggestionsInfo) {
+ // A negative suggestion count is possible
final int len = Math.max(0, suggestionsInfo.getSuggestionsCount());
String[] suggestions = new String[len];
- for (int j = 0; j < len; ++j) {
+ for (int j = 0; j < len; j++) {
suggestions[j] = suggestionsInfo.getSuggestionAt(j);
}
return suggestions;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index e1f94ac3b44b..b74f9b63de56 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -3250,7 +3250,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
sendOnTextChanged(text, 0, oldlen, textLength);
onTextChanged(text, 0, oldlen, textLength);
- if (startSpellCheck) {
+ if (startSpellCheck && mSpellChecker != null) {
+ // This view has to have been previously attached for mSpellChecker to exist
updateSpellCheckSpans(0, textLength);
}
@@ -4412,6 +4413,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
// Resolve drawables as the layout direction has been resolved
resolveDrawables();
+
+ updateSpellCheckSpans(0, mText.length());
}
@Override
@@ -4443,6 +4446,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
hideControllers();
resetResolvedDrawables();
+
+ if (mSpellChecker != null) {
+ mSpellChecker.closeSession();
+ removeMisspelledSpans();
+ // Forces the creation of a new SpellChecker next time this window is created.
+ // Will handle the cases where the settings has been changed in the meantime.
+ mSpellChecker = null;
+ }
}
@Override
@@ -5526,7 +5537,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override public boolean onCheckIsTextEditor() {
return mInputType != EditorInfo.TYPE_NULL;
}
-
+
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
if (onCheckIsTextEditor() && isEnabled()) {
if (mInputMethodState == null) {
@@ -6130,7 +6141,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
TruncateAt effectiveEllipsize = mEllipsize;
if (mEllipsize == TruncateAt.MARQUEE &&
mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {
- effectiveEllipsize = TruncateAt.END;
+ effectiveEllipsize = TruncateAt.END_SMALL;
}
if (mTextDir == null) {
@@ -6242,7 +6253,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
result = new DynamicLayout(mText, mTransformed, mTextPaint, w,
alignment, mTextDir, mSpacingMult,
mSpacingAdd, mIncludePad, mInput == null ? effectiveEllipsize : null,
- ellipsisWidth);
+ ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
} else {
if (boring == UNKNOWN_BORING) {
boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, mBoring);
@@ -7481,9 +7492,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
protected void onSelectionChanged(int selStart, int selEnd) {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED);
- if (mSpellChecker != null) {
- mSpellChecker.onSelectionChanged();
- }
}
/**
@@ -7542,6 +7550,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
for (int i = 0; i < length; i++) {
final int s = text.getSpanStart(spans[i]);
final int e = text.getSpanEnd(spans[i]);
+ // Spans that are adjacent to the edited region will be handled in
+ // updateSpellCheckSpans. Result depends on what will be added (space or text)
if (e == start || s == end) break;
text.removeSpan(spans[i]);
}
@@ -7595,7 +7605,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
ims.mChangedDelta += after-before;
}
-
+
sendOnTextChanged(buffer, start, before, after);
onTextChanged(buffer, start, before, after);
@@ -7724,12 +7734,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
- if (what instanceof SpellCheckSpan) {
- if (newStart < 0) {
- getSpellChecker().removeSpellCheckSpan((SpellCheckSpan) what);
- } else if (oldStart < 0) {
- getSpellChecker().addSpellCheckSpan((SpellCheckSpan) what);
- }
+ if (newStart < 0 && what instanceof SpellCheckSpan) {
+ getSpellChecker().removeSpellCheckSpan((SpellCheckSpan) what);
}
}
@@ -7737,9 +7743,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* Create new SpellCheckSpans on the modified region.
*/
private void updateSpellCheckSpans(int start, int end) {
- if (!(mText instanceof Editable) || !isSuggestionsEnabled()) return;
- Editable text = (Editable) mText;
+ if (!isTextEditable() || !isSuggestionsEnabled() || !getSpellChecker().isSessionActive())
+ return;
+ Editable text = (Editable) mText;
WordIterator wordIterator = getWordIterator();
wordIterator.setCharSequence(text);
@@ -7758,57 +7765,75 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return;
}
+ // We need to expand by one character because we want to include the spans that end/start
+ // at position start/end respectively.
+ SpellCheckSpan[] spellCheckSpans = text.getSpans(start - 1, end + 1, SpellCheckSpan.class);
+ SuggestionSpan[] suggestionSpans = text.getSpans(start - 1, end + 1, SuggestionSpan.class);
+ final int numberOfSpellCheckSpans = spellCheckSpans.length;
+
// Iterate over the newly added text and schedule new SpellCheckSpans
while (wordStart <= end) {
if (wordEnd >= start) {
- // A word across the interval boundaries must remove boundary edition spans
+ // A new word has been created across the interval boundaries. Remove previous spans
if (wordStart < start && wordEnd > start) {
- removeEditionSpansAt(start, text);
+ removeSpansAt(start, spellCheckSpans, text);
+ removeSpansAt(start, suggestionSpans, text);
}
if (wordStart < end && wordEnd > end) {
- removeEditionSpansAt(end, text);
+ removeSpansAt(end, spellCheckSpans, text);
+ removeSpansAt(end, suggestionSpans, text);
}
// Do not create new boundary spans if they already exist
boolean createSpellCheckSpan = true;
if (wordEnd == start) {
- SpellCheckSpan[] spellCheckSpans = text.getSpans(start, start,
- SpellCheckSpan.class);
- if (spellCheckSpans.length > 0) createSpellCheckSpan = false;
+ for (int i = 0; i < numberOfSpellCheckSpans; i++) {
+ final int spanEnd = text.getSpanEnd(spellCheckSpans[i]);
+ if (spanEnd == start) {
+ createSpellCheckSpan = false;
+ break;
+ }
+ }
}
if (wordStart == end) {
- SpellCheckSpan[] spellCheckSpans = text.getSpans(end, end,
- SpellCheckSpan.class);
- if (spellCheckSpans.length > 0) createSpellCheckSpan = false;
+ for (int i = 0; i < numberOfSpellCheckSpans; i++) {
+ final int spanStart = text.getSpanEnd(spellCheckSpans[i]);
+ if (spanStart == end) {
+ createSpellCheckSpan = false;
+ break;
+ }
+ }
}
if (createSpellCheckSpan) {
- text.setSpan(new SpellCheckSpan(), wordStart, wordEnd,
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ mSpellChecker.addSpellCheckSpan(wordStart, wordEnd);
}
}
// iterate word by word
wordEnd = wordIterator.following(wordEnd);
- if (wordEnd == BreakIterator.DONE) return;
+ if (wordEnd == BreakIterator.DONE) break;
wordStart = wordIterator.getBeginning(wordEnd);
if (wordStart == BreakIterator.DONE) {
Log.e(LOG_TAG, "Unable to find word beginning from " + wordEnd + "in " + mText);
- return;
+ break;
}
}
+
+ mSpellChecker.spellCheck();
}
- private static void removeEditionSpansAt(int offset, Editable text) {
- SuggestionSpan[] suggestionSpans = text.getSpans(offset, offset, SuggestionSpan.class);
- for (int i = 0; i < suggestionSpans.length; i++) {
- text.removeSpan(suggestionSpans[i]);
- }
- SpellCheckSpan[] spellCheckSpans = text.getSpans(offset, offset, SpellCheckSpan.class);
- for (int i = 0; i < spellCheckSpans.length; i++) {
- text.removeSpan(spellCheckSpans[i]);
+ private static <T> void removeSpansAt(int offset, T[] spans, Editable text) {
+ final int length = spans.length;
+ for (int i = 0; i < length; i++) {
+ final T span = spans[i];
+ final int start = text.getSpanStart(span);
+ if (start > offset) continue;
+ final int end = text.getSpanEnd(span);
+ if (end < offset) continue;
+ text.removeSpan(span);
}
}
@@ -8369,6 +8394,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
boolean selectAllGotFocus = mSelectAllOnFocus && didTouchFocusSelect();
hideControllers();
if (!selectAllGotFocus && mText.length() > 0) {
+ if (mSpellChecker != null) {
+ // When the cursor moves, the word that was typed may need spell check
+ mSpellChecker.onSelectionChanged();
+ }
if (isCursorInsideEasyCorrectionSpan()) {
showSuggestions();
} else if (hasInsertionController()) {
@@ -8427,13 +8456,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int flags = suggestionSpans[i].getFlags();
if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0
&& (flags & SuggestionSpan.FLAG_MISSPELLED) == 0) {
- flags = flags & ~SuggestionSpan.FLAG_EASY_CORRECT;
+ flags &= ~SuggestionSpan.FLAG_EASY_CORRECT;
suggestionSpans[i].setFlags(flags);
}
}
}
}
+ /**
+ * Removes the suggestion spans for misspelled words.
+ */
+ private void removeMisspelledSpans() {
+ if (mText instanceof Spannable) {
+ Spannable spannable = (Spannable) mText;
+ SuggestionSpan[] suggestionSpans = spannable.getSpans(0,
+ spannable.length(), SuggestionSpan.class);
+ for (int i = 0; i < suggestionSpans.length; i++) {
+ int flags = suggestionSpans[i].getFlags();
+ if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0
+ && (flags & SuggestionSpan.FLAG_MISSPELLED) != 0) {
+ spannable.removeSpan(suggestionSpans[i]);
+ }
+ }
+ }
+ }
+
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
if (mMovement != null && mText instanceof Spannable && mLayout != null) {
@@ -8944,13 +8991,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword) {
- CharSequence text = getText();
- if (TextUtils.isEmpty(text)) {
- text = getHint();
- }
- if (TextUtils.isEmpty(text)) {
- text = getContentDescription();
- }
+ CharSequence text = getTextForAccessibility();
if (!TextUtils.isEmpty(text)) {
event.getText().add(text);
}
@@ -8977,7 +9018,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword) {
- info.setText(getText());
+ info.setText(getTextForAccessibility());
}
info.setPassword(isPassword);
}
@@ -8993,6 +9034,20 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
super.sendAccessibilityEvent(eventType);
}
+ /**
+ * Gets the text reported for accessibility purposes. It is the
+ * text if not empty or the hint.
+ *
+ * @return The accessibility text.
+ */
+ private CharSequence getTextForAccessibility() {
+ CharSequence text = getText();
+ if (TextUtils.isEmpty(text)) {
+ text = getHint();
+ }
+ return text;
+ }
+
void sendAccessibilityEventTypeViewTextChanged(CharSequence beforeText,
int fromIndex, int removedCount, int addedCount) {
AccessibilityEvent event =
@@ -9425,8 +9480,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return false;
}
- int posX = mPositionX + positionX;
- int posY = mPositionY + positionY;
+ int posX = mPositionX + positionX - getScrollX();
+ int posY = mPositionY + positionY - getScrollY();
// Offset by 1 to take into account 0.5 and int rounding around getPrimaryHorizontal.
return posX >= clip.left - 1 && posX <= clip.right + 1 &&
@@ -9558,6 +9613,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private class SuggestionsPopupWindow extends PinnedPopupWindow implements OnItemClickListener {
private static final int MAX_NUMBER_SUGGESTIONS = SuggestionSpan.SUGGESTIONS_MAX_SIZE;
+ private static final int ADD_TO_DICTIONARY = -1;
+ private static final int DELETE_TEXT = -2;
private SuggestionInfo[] mSuggestionInfos;
private int mNumberOfSuggestions;
private boolean mCursorWasVisibleBeforeSuggestions;
@@ -9565,7 +9622,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private final Comparator<SuggestionSpan> mSuggestionSpanComparator;
private final HashMap<SuggestionSpan, Integer> mSpansLengths;
-
private class CustomPopupWindow extends PopupWindow {
public CustomPopupWindow(Context context, int defStyle) {
super(context, null, defStyle);
@@ -9577,9 +9633,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
TextView.this.getPositionListener().removeSubscriber(SuggestionsPopupWindow.this);
- if ((mText instanceof Spannable)) {
- ((Spannable) mText).removeSpan(mSuggestionRangeSpan);
- }
+ // Safe cast since show() checks that mText is an Editable
+ ((Spannable) mText).removeSpan(mSuggestionRangeSpan);
setCursorVisible(mCursorWasVisibleBeforeSuggestions);
if (hasInsertionController()) {
@@ -9611,9 +9666,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
listView.setOnItemClickListener(this);
mContentView = listView;
- // Inflate the suggestion items once and for all. +1 for add to dictionary
- mSuggestionInfos = new SuggestionInfo[MAX_NUMBER_SUGGESTIONS + 1];
- for (int i = 0; i < MAX_NUMBER_SUGGESTIONS + 1; i++) {
+ // Inflate the suggestion items once and for all. + 2 for add to dictionary and delete
+ mSuggestionInfos = new SuggestionInfo[MAX_NUMBER_SUGGESTIONS + 2];
+ for (int i = 0; i < mSuggestionInfos.length; i++) {
mSuggestionInfos[i] = new SuggestionInfo();
}
}
@@ -9629,8 +9684,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
void removeMisspelledFlag() {
int suggestionSpanFlags = suggestionSpan.getFlags();
if ((suggestionSpanFlags & SuggestionSpan.FLAG_MISSPELLED) > 0) {
- suggestionSpanFlags &= ~(SuggestionSpan.FLAG_MISSPELLED);
- suggestionSpanFlags &= ~(SuggestionSpan.FLAG_EASY_CORRECT);
+ suggestionSpanFlags &= ~SuggestionSpan.FLAG_MISSPELLED;
+ suggestionSpanFlags &= ~SuggestionSpan.FLAG_EASY_CORRECT;
suggestionSpan.setFlags(suggestionSpanFlags);
}
}
@@ -9664,7 +9719,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
false);
}
- textView.setText(mSuggestionInfos[position].text);
+ final SuggestionInfo suggestionInfo = mSuggestionInfos[position];
+ textView.setText(suggestionInfo.text);
+
+ if (suggestionInfo.suggestionIndex == ADD_TO_DICTIONARY) {
+ textView.setCompoundDrawablesWithIntrinsicBounds(
+ com.android.internal.R.drawable.ic_suggestions_add, 0, 0, 0);
+ } else if (suggestionInfo.suggestionIndex == DELETE_TEXT) {
+ textView.setCompoundDrawablesWithIntrinsicBounds(
+ com.android.internal.R.drawable.ic_suggestions_delete, 0, 0, 0);
+ } else {
+ textView.setCompoundDrawables(null, null, null, null);
+ }
+
return textView;
}
}
@@ -9715,11 +9782,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public void show() {
if (!(mText instanceof Editable)) return;
- if (updateSuggestions()) {
- mCursorWasVisibleBeforeSuggestions = mCursorVisible;
- setCursorVisible(false);
- super.show();
- }
+ updateSuggestions();
+ mCursorWasVisibleBeforeSuggestions = mCursorVisible;
+ setCursorVisible(false);
+ super.show();
}
@Override
@@ -9734,6 +9800,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
View view = null;
for (int i = 0; i < mNumberOfSuggestions; i++) {
view = mSuggestionsAdapter.getView(i, view, mContentView);
+ view.getLayoutParams().width = LayoutParams.WRAP_CONTENT;
view.measure(horizontalMeasure, verticalMeasure);
width = Math.max(width, view.getMeasuredWidth());
}
@@ -9774,7 +9841,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
super.hide();
}
- private boolean updateSuggestions() {
+ private void updateSuggestions() {
Spannable spannable = (Spannable) TextView.this.mText;
SuggestionSpan[] suggestionSpans = getSuggestionSpans();
@@ -9823,13 +9890,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
highlightTextDifferences(mSuggestionInfos[i], spanUnionStart, spanUnionEnd);
}
+ // Add to dictionary item is there a span with the misspelled flag
if (misspelledSpan != null) {
final int misspelledStart = spannable.getSpanStart(misspelledSpan);
final int misspelledEnd = spannable.getSpanEnd(misspelledSpan);
if (misspelledStart >= 0 && misspelledEnd > misspelledStart) {
SuggestionInfo suggestionInfo = mSuggestionInfos[mNumberOfSuggestions];
suggestionInfo.suggestionSpan = misspelledSpan;
- suggestionInfo.suggestionIndex = -1;
+ suggestionInfo.suggestionIndex = ADD_TO_DICTIONARY;
suggestionInfo.text.replace(0, suggestionInfo.text.length(),
getContext().getString(com.android.internal.R.string.addToDictionary));
@@ -9837,7 +9905,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
- if (mNumberOfSuggestions == 0) return false;
+ // Delete item
+ SuggestionInfo suggestionInfo = mSuggestionInfos[mNumberOfSuggestions];
+ suggestionInfo.suggestionSpan = null;
+ suggestionInfo.suggestionIndex = DELETE_TEXT;
+ suggestionInfo.text.replace(0, suggestionInfo.text.length(),
+ getContext().getString(com.android.internal.R.string.deleteText));
+ mNumberOfSuggestions++;
if (mSuggestionRangeSpan == null) mSuggestionRangeSpan = new SuggestionRangeSpan();
if (underlineColor == 0) {
@@ -9853,8 +9927,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mSuggestionsAdapter.notifyDataSetChanged();
-
- return true;
}
private void highlightTextDifferences(SuggestionInfo suggestionInfo, int unionStart,
@@ -9879,77 +9951,94 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- hide();
-
- if (view instanceof TextView) {
- TextView textView = (TextView) view;
- Editable editable = (Editable) mText;
-
- SuggestionInfo suggestionInfo = mSuggestionInfos[position];
- final int spanStart = editable.getSpanStart(suggestionInfo.suggestionSpan);
- final int spanEnd = editable.getSpanEnd(suggestionInfo.suggestionSpan);
- if (spanStart < 0 || spanEnd < 0) return; // Span has been removed
- final String originalText = mText.subSequence(spanStart, spanEnd).toString();
-
- if (suggestionInfo.suggestionIndex < 0) {
- Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_INSERT);
- intent.putExtra("word", originalText);
- intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
- getContext().startActivity(intent);
- suggestionInfo.removeMisspelledFlag();
- } else {
- // SuggestionSpans are removed by replace: save them before
- SuggestionSpan[] suggestionSpans = editable.getSpans(spanStart, spanEnd,
- SuggestionSpan.class);
- final int length = suggestionSpans.length;
- int[] suggestionSpansStarts = new int[length];
- int[] suggestionSpansEnds = new int[length];
- int[] suggestionSpansFlags = new int[length];
- for (int i = 0; i < length; i++) {
- final SuggestionSpan suggestionSpan = suggestionSpans[i];
- suggestionSpansStarts[i] = editable.getSpanStart(suggestionSpan);
- suggestionSpansEnds[i] = editable.getSpanEnd(suggestionSpan);
- suggestionSpansFlags[i] = editable.getSpanFlags(suggestionSpan);
- }
+ TextView textView = (TextView) view;
+ Editable editable = (Editable) mText;
- final int suggestionStart = suggestionInfo.suggestionStart;
- final int suggestionEnd = suggestionInfo.suggestionEnd;
- final String suggestion = textView.getText().subSequence(
- suggestionStart, suggestionEnd).toString();
- editable.replace(spanStart, spanEnd, suggestion);
+ SuggestionInfo suggestionInfo = mSuggestionInfos[position];
- suggestionInfo.removeMisspelledFlag();
+ if (suggestionInfo.suggestionIndex == DELETE_TEXT) {
+ final int spanUnionStart = editable.getSpanStart(mSuggestionRangeSpan);
+ int spanUnionEnd = editable.getSpanEnd(mSuggestionRangeSpan);
+ // Do not leave two adjacent spaces after deletion, or one at beginning of text
+ if (spanUnionEnd < editable.length() &&
+ Character.isSpaceChar(editable.charAt(spanUnionEnd)) &&
+ (spanUnionStart == 0 ||
+ Character.isSpaceChar(editable.charAt(spanUnionStart - 1)))) {
+ spanUnionEnd = spanUnionEnd + 1;
+ }
+ editable.replace(spanUnionStart, spanUnionEnd, "");
+ hide();
+ return;
+ }
- // Notify source IME of the suggestion pick. Do this before swaping texts.
- if (!TextUtils.isEmpty(
- suggestionInfo.suggestionSpan.getNotificationTargetClassName())) {
- InputMethodManager imm = InputMethodManager.peekInstance();
- imm.notifySuggestionPicked(suggestionInfo.suggestionSpan, originalText,
- suggestionInfo.suggestionIndex);
- }
+ final int spanStart = editable.getSpanStart(suggestionInfo.suggestionSpan);
+ final int spanEnd = editable.getSpanEnd(suggestionInfo.suggestionSpan);
+ if (spanStart < 0 || spanEnd < 0) {
+ // Span has been removed
+ hide();
+ return;
+ }
+ final String originalText = mText.subSequence(spanStart, spanEnd).toString();
- // Swap text content between actual text and Suggestion span
- String[] suggestions = suggestionInfo.suggestionSpan.getSuggestions();
- suggestions[suggestionInfo.suggestionIndex] = originalText;
-
- // Restore previous SuggestionSpans
- final int lengthDifference = suggestion.length() - (spanEnd - spanStart);
- for (int i = 0; i < length; i++) {
- // Only spans that include the modified region make sense after replacement
- // Spans partially included in the replaced region are removed, there is no
- // way to assign them a valid range after replacement
- if (suggestionSpansStarts[i] <= spanStart &&
- suggestionSpansEnds[i] >= spanEnd) {
- editable.setSpan(suggestionSpans[i], suggestionSpansStarts[i],
- suggestionSpansEnds[i] + lengthDifference,
- suggestionSpansFlags[i]);
- }
+ if (suggestionInfo.suggestionIndex == ADD_TO_DICTIONARY) {
+ Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_INSERT);
+ intent.putExtra("word", originalText);
+ intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
+ getContext().startActivity(intent);
+ suggestionInfo.removeMisspelledFlag();
+ } else {
+ // SuggestionSpans are removed by replace: save them before
+ SuggestionSpan[] suggestionSpans = editable.getSpans(spanStart, spanEnd,
+ SuggestionSpan.class);
+ final int length = suggestionSpans.length;
+ int[] suggestionSpansStarts = new int[length];
+ int[] suggestionSpansEnds = new int[length];
+ int[] suggestionSpansFlags = new int[length];
+ for (int i = 0; i < length; i++) {
+ final SuggestionSpan suggestionSpan = suggestionSpans[i];
+ suggestionSpansStarts[i] = editable.getSpanStart(suggestionSpan);
+ suggestionSpansEnds[i] = editable.getSpanEnd(suggestionSpan);
+ suggestionSpansFlags[i] = editable.getSpanFlags(suggestionSpan);
+ }
+
+ final int suggestionStart = suggestionInfo.suggestionStart;
+ final int suggestionEnd = suggestionInfo.suggestionEnd;
+ final String suggestion = textView.getText().subSequence(
+ suggestionStart, suggestionEnd).toString();
+ editable.replace(spanStart, spanEnd, suggestion);
+
+ suggestionInfo.removeMisspelledFlag();
+
+ // Notify source IME of the suggestion pick. Do this before swaping texts.
+ if (!TextUtils.isEmpty(
+ suggestionInfo.suggestionSpan.getNotificationTargetClassName())) {
+ InputMethodManager imm = InputMethodManager.peekInstance();
+ imm.notifySuggestionPicked(suggestionInfo.suggestionSpan, originalText,
+ suggestionInfo.suggestionIndex);
+ }
+
+ // Swap text content between actual text and Suggestion span
+ String[] suggestions = suggestionInfo.suggestionSpan.getSuggestions();
+ suggestions[suggestionInfo.suggestionIndex] = originalText;
+
+ // Restore previous SuggestionSpans
+ final int lengthDifference = suggestion.length() - (spanEnd - spanStart);
+ for (int i = 0; i < length; i++) {
+ // Only spans that include the modified region make sense after replacement
+ // Spans partially included in the replaced region are removed, there is no
+ // way to assign them a valid range after replacement
+ if (suggestionSpansStarts[i] <= spanStart &&
+ suggestionSpansEnds[i] >= spanEnd) {
+ editable.setSpan(suggestionSpans[i], suggestionSpansStarts[i],
+ suggestionSpansEnds[i] + lengthDifference, suggestionSpansFlags[i]);
}
-
- // Move cursor at the end of the replacement word
- Selection.setSelection(editable, spanEnd + lengthDifference);
}
+
+ // Move cursor at the end of the replacement word
+ Selection.setSelection(editable, spanEnd + lengthDifference);
}
+
+ hide();
}
}
@@ -10514,9 +10603,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public abstract int getCurrentCursorOffset();
- protected void updateSelection(int offset) {
- updateDrawable();
- }
+ protected abstract void updateSelection(int offset);
public abstract void updatePosition(float x, float y);
@@ -10790,8 +10877,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public void updateSelection(int offset) {
- super.updateSelection(offset);
Selection.setSelection((Spannable) mText, offset, getSelectionEnd());
+ updateDrawable();
}
@Override
@@ -10832,8 +10919,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public void updateSelection(int offset) {
- super.updateSelection(offset);
Selection.setSelection((Spannable) mText, getSelectionStart(), offset);
+ updateDrawable();
}
@Override
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 88a0e0130473..8e438ffe4678 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -456,13 +456,6 @@ public class VideoView extends SurfaceView implements MediaPlayerControl {
seekTo(mSeekWhenPrepared);
}
start();
- if (mMediaController != null) {
- if (mMediaController.isShowing()) {
- // ensure the controller will get repositioned later
- mMediaController.hide();
- }
- mMediaController.show();
- }
}
}
diff --git a/core/java/com/android/internal/policy/IFaceLockCallback.aidl b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
index 1eadc412810b..4f76c7131f48 100644
--- a/core/java/com/android/internal/policy/IFaceLockCallback.aidl
+++ b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
@@ -21,5 +21,4 @@ import android.os.IBinder;
oneway interface IFaceLockCallback {
void unlock();
void cancel();
- void sleepDevice();
}
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 159929b19f7a..3d229295ca7a 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -133,4 +133,13 @@ public class ArrayUtils
}
return false;
}
+
+ public static boolean contains(int[] array, int value) {
+ for (int element : array) {
+ if (element == value) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
index fba6a5a3a049..aabea2c91458 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
@@ -24,6 +24,7 @@ import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseBooleanArray;
+import android.view.ActionProvider;
import android.view.MenuItem;
import android.view.SoundEffectConstants;
import android.view.View;
@@ -40,7 +41,8 @@ import java.util.ArrayList;
/**
* MenuPresenter for building action menus as seen in the action bar and action modes.
*/
-public class ActionMenuPresenter extends BaseMenuPresenter {
+public class ActionMenuPresenter extends BaseMenuPresenter
+ implements ActionProvider.SubUiVisibilityListener {
private static final String TAG = "ActionMenuPresenter";
private View mOverflowButton;
@@ -187,8 +189,30 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
public void updateMenuView(boolean cleared) {
super.updateMenuView(cleared);
- final boolean hasOverflow = mReserveOverflow && mMenu != null &&
- mMenu.getNonActionItems().size() > 0;
+ if (mMenu != null) {
+ final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems();
+ final int count = actionItems.size();
+ for (int i = 0; i < count; i++) {
+ final ActionProvider provider = actionItems.get(i).getActionProvider();
+ if (provider != null) {
+ provider.setSubUiVisibilityListener(this);
+ }
+ }
+ }
+
+ final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ?
+ mMenu.getNonActionItems() : null;
+
+ boolean hasOverflow = false;
+ if (mReserveOverflow && nonActionItems != null) {
+ final int count = nonActionItems.size();
+ if (count == 1) {
+ hasOverflow = !nonActionItems.get(0).isActionViewExpanded();
+ } else {
+ hasOverflow = count > 0;
+ }
+ }
+
if (hasOverflow) {
if (mOverflowButton == null) {
mOverflowButton = new OverflowMenuButton(mContext);
@@ -483,6 +507,16 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
}
}
+ @Override
+ public void onSubUiVisibilityChanged(boolean isVisible) {
+ if (isVisible) {
+ // Not a submenu, but treat it like one.
+ super.onSubMenuSelected(null);
+ } else {
+ mMenu.close(false);
+ }
+ }
+
private static class SavedState implements Parcelable {
public int openSubMenuId;
@@ -590,7 +624,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
@Override
public void onDismiss() {
super.onDismiss();
- mSubMenu.close();
mActionButtonPopup = null;
mOpenSubMenuId = 0;
}
@@ -600,12 +633,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
@Override
public boolean onOpenSubMenu(MenuBuilder subMenu) {
+ if (subMenu == null) return false;
+
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
return false;
}
@Override
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
+ if (menu instanceof SubMenuBuilder) {
+ ((SubMenuBuilder) menu).getRootMenu().close(false);
+ }
}
}
diff --git a/core/java/com/android/internal/view/menu/IconMenuPresenter.java b/core/java/com/android/internal/view/menu/IconMenuPresenter.java
index d1b1dae80315..24ddad668ac3 100644
--- a/core/java/com/android/internal/view/menu/IconMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/IconMenuPresenter.java
@@ -187,7 +187,9 @@ public class IconMenuPresenter extends BaseMenuPresenter {
@Override
public boolean onOpenSubMenu(MenuBuilder subMenu) {
- mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
+ if (subMenu != null) {
+ mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
+ }
return false;
}
diff --git a/core/java/com/android/internal/view/menu/ListMenuPresenter.java b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
index 014142729dc1..a331bec53dc4 100644
--- a/core/java/com/android/internal/view/menu/ListMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
@@ -17,6 +17,7 @@
package com.android.internal.view.menu;
import android.content.Context;
+import android.database.DataSetObserver;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -47,7 +48,7 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick
int mItemLayoutRes;
private Callback mCallback;
- private MenuAdapter mAdapter;
+ MenuAdapter mAdapter;
private int mId;
@@ -216,14 +217,29 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick
}
private class MenuAdapter extends BaseAdapter {
+ private int mExpandedIndex = -1;
+
+ public MenuAdapter() {
+ registerDataSetObserver(new ExpandedIndexObserver());
+ findExpandedIndex();
+ }
+
public int getCount() {
ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
- return items.size() - mItemIndexOffset;
+ int count = items.size() - mItemIndexOffset;
+ if (mExpandedIndex < 0) {
+ return count;
+ }
+ return count - 1;
}
public MenuItemImpl getItem(int position) {
ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
- return items.get(position + mItemIndexOffset);
+ position += mItemIndexOffset;
+ if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
+ position++;
+ }
+ return items.get(position);
}
public long getItemId(int position) {
@@ -241,5 +257,28 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick
itemView.initialize(getItem(position), 0);
return convertView;
}
+
+ void findExpandedIndex() {
+ final MenuItemImpl expandedItem = mMenu.getExpandedItem();
+ if (expandedItem != null) {
+ final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
+ final int count = items.size();
+ for (int i = 0; i < count; i++) {
+ final MenuItemImpl item = items.get(i);
+ if (item == expandedItem) {
+ mExpandedIndex = i;
+ return;
+ }
+ }
+ }
+ mExpandedIndex = -1;
+ }
+ }
+
+ private class ExpandedIndexObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ mAdapter.findExpandedIndex();
+ }
}
}
diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java
index c30e83b670ed..9fbca824f202 100644
--- a/core/java/com/android/internal/view/menu/MenuBuilder.java
+++ b/core/java/com/android/internal/view/menu/MenuBuilder.java
@@ -1258,4 +1258,8 @@ public class MenuBuilder implements Menu {
}
return collapsed;
}
+
+ public MenuItemImpl getExpandedItem() {
+ return mExpandedItem;
+ }
}
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index 626561894bfc..329b457b56c9 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -18,6 +18,7 @@ package com.android.internal.view.menu;
import android.content.Context;
import android.content.res.Resources;
+import android.database.DataSetObserver;
import android.os.Parcelable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -286,22 +287,45 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
return false;
}
+ @Override
+ public int getId() {
+ return 0;
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ return null;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ }
+
private class MenuAdapter extends BaseAdapter {
private MenuBuilder mAdapterMenu;
+ private int mExpandedIndex = -1;
public MenuAdapter(MenuBuilder menu) {
mAdapterMenu = menu;
+ registerDataSetObserver(new ExpandedIndexObserver());
+ findExpandedIndex();
}
public int getCount() {
ArrayList<MenuItemImpl> items = mOverflowOnly ?
mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
- return items.size();
+ if (mExpandedIndex < 0) {
+ return items.size();
+ }
+ return items.size() - 1;
}
public MenuItemImpl getItem(int position) {
ArrayList<MenuItemImpl> items = mOverflowOnly ?
mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
+ if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
+ position++;
+ }
return items.get(position);
}
@@ -323,19 +347,28 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
itemView.initialize(getItem(position), 0);
return convertView;
}
- }
-
- @Override
- public int getId() {
- return 0;
- }
- @Override
- public Parcelable onSaveInstanceState() {
- return null;
+ void findExpandedIndex() {
+ final MenuItemImpl expandedItem = mMenu.getExpandedItem();
+ if (expandedItem != null) {
+ final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
+ final int count = items.size();
+ for (int i = 0; i < count; i++) {
+ final MenuItemImpl item = items.get(i);
+ if (item == expandedItem) {
+ mExpandedIndex = i;
+ return;
+ }
+ }
+ }
+ mExpandedIndex = -1;
+ }
}
- @Override
- public void onRestoreInstanceState(Parcelable state) {
+ private class ExpandedIndexObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ mAdapter.findExpandedIndex();
+ }
}
}
diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index 6c11288deb61..06f5158f43e4 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -35,6 +35,8 @@ public abstract class AbsActionBarView extends ViewGroup {
protected ActionMenuView mMenuView;
protected ActionMenuPresenter mActionMenuPresenter;
protected ActionBarContainer mSplitView;
+ protected boolean mSplitActionBar;
+ protected boolean mSplitWhenNarrow;
protected int mContentHeight;
protected Animator mVisibilityAnim;
@@ -66,11 +68,31 @@ public abstract class AbsActionBarView extends ViewGroup {
com.android.internal.R.attr.actionBarStyle, 0);
setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0));
a.recycle();
+ if (mSplitWhenNarrow) {
+ setSplitActionBar(getContext().getResources().getBoolean(
+ com.android.internal.R.bool.split_action_bar_is_narrow));
+ }
if (mActionMenuPresenter != null) {
mActionMenuPresenter.onConfigurationChanged(newConfig);
}
}
+ /**
+ * Sets whether the bar should be split right now, no questions asked.
+ * @param split true if the bar should split
+ */
+ public void setSplitActionBar(boolean split) {
+ mSplitActionBar = split;
+ }
+
+ /**
+ * Sets whether the bar should split if we enter a narrow screen configuration.
+ * @param splitWhenNarrow true if the bar should check to split after a config change
+ */
+ public void setSplitWhenNarrow(boolean splitWhenNarrow) {
+ mSplitWhenNarrow = splitWhenNarrow;
+ }
+
public void setContentHeight(int height) {
mContentHeight = height;
requestLayout();
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 7bc33c73baab..acffa5c16d1b 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -93,6 +93,39 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi
a.recycle();
}
+ @Override
+ public void setSplitActionBar(boolean split) {
+ if (mSplitActionBar != split) {
+ if (mActionMenuPresenter != null) {
+ // Mode is already active; move everything over and adjust the menu itself.
+ final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.MATCH_PARENT);
+ if (!split) {
+ mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+ mMenuView.setBackgroundDrawable(null);
+ final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
+ if (oldParent != null) oldParent.removeView(mMenuView);
+ addView(mMenuView, layoutParams);
+ } else {
+ // Allow full screen width in split mode.
+ mActionMenuPresenter.setWidthLimit(
+ getContext().getResources().getDisplayMetrics().widthPixels, true);
+ // No limit to the item count; use whatever will fit.
+ mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
+ // Span the whole width
+ layoutParams.width = LayoutParams.MATCH_PARENT;
+ layoutParams.height = mContentHeight;
+ mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+ mMenuView.setBackgroundDrawable(mSplitBackground);
+ final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
+ if (oldParent != null) oldParent.removeView(mMenuView);
+ mSplitView.addView(mMenuView, layoutParams);
+ }
+ }
+ super.setSplitActionBar(split);
+ }
+ }
+
public void setContentHeight(int height) {
mContentHeight = height;
}
@@ -179,7 +212,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi
final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT);
- if (mSplitView == null) {
+ if (!mSplitActionBar) {
menu.addMenuPresenter(mActionMenuPresenter);
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
mMenuView.setBackgroundDrawable(null);
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index bbecb6c89af4..6d2e8232156b 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -113,7 +113,6 @@ public class ActionBarView extends AbsActionBarView {
private int mProgressStyle;
private int mIndeterminateProgressStyle;
- private boolean mSplitActionBar;
private boolean mUserTitle;
private boolean mIncludeTabs;
private boolean mIsCollapsable;
@@ -133,6 +132,8 @@ public class ActionBarView extends AbsActionBarView {
private ExpandedActionViewMenuPresenter mExpandedMenuPresenter;
View mExpandedActionView;
+ Window.Callback mWindowCallback;
+
private final AdapterView.OnItemSelectedListener mNavItemSelectedListener =
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View view, int position, long id) {
@@ -157,11 +158,7 @@ public class ActionBarView extends AbsActionBarView {
private final OnClickListener mUpClickListener = new OnClickListener() {
public void onClick(View v) {
- Context context = getContext();
- if (context instanceof Activity) {
- Activity activity = (Activity) context;
- activity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem);
- }
+ mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem);
}
};
@@ -276,6 +273,14 @@ public class ActionBarView extends AbsActionBarView {
}
}
+ /**
+ * Set the window callback used to invoke menu items; used for dispatching home button presses.
+ * @param cb Window callback to dispatch to
+ */
+ public void setWindowCallback(Window.Callback cb) {
+ mWindowCallback = cb;
+ }
+
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
@@ -301,6 +306,7 @@ public class ActionBarView extends AbsActionBarView {
addView(mIndeterminateProgressView);
}
+ @Override
public void setSplitActionBar(boolean splitActionBar) {
if (mSplitActionBar != splitActionBar) {
if (mMenuView != null) {
@@ -316,7 +322,10 @@ public class ActionBarView extends AbsActionBarView {
addView(mMenuView);
}
}
- mSplitActionBar = splitActionBar;
+ if (mSplitView != null) {
+ mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE);
+ }
+ super.setSplitActionBar(splitActionBar);
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index c6b2cc7b00f0..81e7c34709a3 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -756,24 +756,36 @@ public class LockPatternUtils {
}
/**
- * @return Whether the lock password is enabled.
+ * @return Whether the lock password is enabled, or if it is set as a backup for biometric weak
*/
public boolean isLockPasswordEnabled() {
long mode = getLong(PASSWORD_TYPE_KEY, 0);
- return savedPasswordExists() &&
- (mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX);
+ long backupMode = getLong(PASSWORD_TYPE_ALTERNATE_KEY, 0);
+ final boolean passwordEnabled = mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+ final boolean backupEnabled = backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+
+ return savedPasswordExists() && (passwordEnabled ||
+ (isBiometricEnabled() && backupEnabled));
}
/**
- * @return Whether the lock pattern is enabled.
+ * @return Whether the lock pattern is enabled, or if it is set as a backup for biometric weak
*/
public boolean isLockPatternEnabled() {
+ final boolean backupEnabled =
+ getLong(PASSWORD_TYPE_ALTERNATE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
+ == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+
return getBoolean(Settings.Secure.LOCK_PATTERN_ENABLED)
- && getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
- == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ && (getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
+ == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING ||
+ (isBiometricEnabled() && backupEnabled));
}
/**
@@ -923,8 +935,7 @@ public class LockPatternUtils {
|| mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
|| mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
final boolean secure = isPattern && isLockPatternEnabled() && savedPatternExists()
- || isPassword && savedPasswordExists()
- || usingBiometricWeak() && isBiometricEnabled();
+ || isPassword && savedPasswordExists();
return secure;
}
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index c03f91cc7ef2..ebd355aa272c 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -114,6 +114,13 @@ public class MultiWaveView extends View {
}
};
+ private AnimatorListener mResetListenerWithPing = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ ping();
+ switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
+ }
+ };
+
private AnimatorUpdateListener mUpdateListener = new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
invalidateGlobalRegion(mHandleDrawable);
@@ -421,7 +428,7 @@ public class MultiWaveView extends View {
"x", mWaveCenterX,
"y", mWaveCenterY,
"onUpdate", mUpdateListener,
- "onComplete", mResetListener);
+ "onComplete", mDragging ? mResetListenerWithPing : mResetListener);
}
setGrabbedState(OnTriggerListener.NO_HANDLE);
diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/core/java/com/android/server/NetworkManagementSocketTagger.java
index 9f6ab315c304..8445ad10ae4f 100644
--- a/core/java/com/android/server/NetworkManagementSocketTagger.java
+++ b/core/java/com/android/server/NetworkManagementSocketTagger.java
@@ -75,30 +75,20 @@ public final class NetworkManagementSocketTagger extends SocketTagger {
Log.d(TAG, "tagSocket(" + fd.getInt$() + ") with statsTag=0x"
+ Integer.toHexString(options.statsTag) + ", statsUid=" + options.statsUid);
}
- try {
- // TODO: skip tagging when options would be no-op
- tagSocketFd(fd, options.statsTag, options.statsUid);
- } catch (IOException e) {
- throw new SocketException("Problem tagging socket", e);
- }
+ // TODO: skip tagging when options would be no-op
+ tagSocketFd(fd, options.statsTag, options.statsUid);
}
- private void tagSocketFd(FileDescriptor fd, int tag, int uid) throws IOException {
- final int fdNum = fd.getInt$();
- if (fdNum == -1 || (tag == -1 && uid == -1)) return;
-
- String cmd = "t " + fdNum;
- if (tag == -1) {
- // Case where just the uid needs adjusting. But probably the caller
- // will want to track his own name here, just in case.
- cmd += " 0";
- } else {
- cmd += " " + tagToKernel(tag);
- }
- if (uid != -1) {
- cmd += " " + uid;
+ private void tagSocketFd(FileDescriptor fd, int tag, int uid) {
+ int errno;
+ if (tag == -1 && uid == -1) return;
+
+ errno = native_tagSocketFd(fd, tag, uid);
+ if (errno < 0) {
+ Log.i(TAG, "tagSocketFd(" + fd.getInt$() + ", "
+ + tag + ", " +
+ + uid + ") failed with errno" + errno);
}
- internalModuleCtrl(cmd);
}
@Override
@@ -106,19 +96,18 @@ public final class NetworkManagementSocketTagger extends SocketTagger {
if (LOGD) {
Log.i(TAG, "untagSocket(" + fd.getInt$() + ")");
}
- try {
- unTagSocketFd(fd);
- } catch (IOException e) {
- throw new SocketException("Problem untagging socket", e);
- }
+ unTagSocketFd(fd);
}
- private void unTagSocketFd(FileDescriptor fd) throws IOException {
- int fdNum = fd.getInt$();
+ private void unTagSocketFd(FileDescriptor fd) {
final SocketTags options = threadSocketTags.get();
- if (fdNum == -1 || (options.statsTag == -1 && options.statsUid == -1)) return;
- String cmd = "u " + fdNum;
- internalModuleCtrl(cmd);
+ int errno;
+ if (options.statsTag == -1 && options.statsUid == -1) return;
+
+ errno = native_untagSocketFd(fd);
+ if (errno < 0) {
+ Log.w(TAG, "untagSocket(" + fd.getInt$() + ") failed with errno " + errno);
+ }
}
public static class SocketTags {
@@ -127,69 +116,20 @@ public final class NetworkManagementSocketTagger extends SocketTagger {
}
public static void setKernelCounterSet(int uid, int counterSet) {
- final StringBuilder command = new StringBuilder();
- command.append("s ").append(counterSet).append(" ").append(uid);
- try {
- internalModuleCtrl(command.toString());
- } catch (IOException e) {
- Slog.w(TAG, "problem changing counter set for uid " + uid + " : " + e);
+ int errno = native_setCounterSet(counterSet, uid);
+ if (errno < 0) {
+ Log.w(TAG, "setKernelCountSet(" + uid + ", " + counterSet + ") failed with errno " + errno);
}
}
public static void resetKernelUidStats(int uid) {
- final StringBuilder command = new StringBuilder();
- command.append("d 0 ").append(uid);
- try {
- internalModuleCtrl(command.toString());
- } catch (IOException e) {
- Slog.w(TAG, "problem clearing counters for uid " + uid + " : " + e);
+ int errno = native_deleteTagData(0, uid);
+ if (errno < 0) {
+ Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno);
}
}
/**
- * Sends commands to the kernel netfilter module.
- *
- * @param cmd command string for the qtaguid netfilter module. May not be null.
- * <p>Supports:
- * <ul><li>tag a socket:<br>
- * <code>t <i>sock_fd</i> <i>acct_tag</i> [<i>uid_in_case_caller_is_acting_on_behalf_of</i>]</code><br>
- * <code>*_tag</code> defaults to default_policy_tag_from_uid(uid_of_caller)<br>
- * <code>acct_tag</code> is either 0 or greater that 2^32.<br>
- * <code>uid_*</code> is only settable by privileged UIDs (DownloadManager,...)
- * </li>
- * <li>untag a socket, preserving counters:<br>
- * <code>u <i>sock_fd</i></code>
- * </li></ul>
- * <p>Notes:<br>
- * <ul><li><i>sock_fd</i> is withing the callers process space.</li>
- * <li><i>*_tag</i> are 64bit values</li></ul>
- *
- */
- private static void internalModuleCtrl(String cmd) throws IOException {
- if (!SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) return;
-
- // TODO: migrate to native library for tagging commands
- FileOutputStream procOut = null;
- try {
- procOut = new FileOutputStream("/proc/net/xt_qtaguid/ctrl");
- procOut.write(cmd.getBytes(Charsets.US_ASCII));
- } finally {
- IoUtils.closeQuietly(procOut);
- }
- }
-
- /**
- * Convert {@link Integer} tag to {@code /proc/} format. Assumes unsigned
- * base-10 format like {@code 2147483647}. Currently strips signed bit to
- * avoid using {@link BigInteger}.
- */
- public static String tagToKernel(int tag) {
- // TODO: eventually write in hex, since that's what proc exports
- // TODO: migrate to direct integer instead of odd shifting
- return Long.toString((((long) tag) << 32) & 0x7FFFFFFF00000000L);
- }
-
- /**
* Convert {@code /proc/} tag format to {@link Integer}. Assumes incoming
* format like {@code 0x7fffffff00000000}.
*/
@@ -197,4 +137,9 @@ public final class NetworkManagementSocketTagger extends SocketTagger {
// TODO: migrate to direct integer instead of odd shifting
return (int) (Long.decode(string) >> 32);
}
+
+ private static native int native_tagSocketFd(FileDescriptor fd, int tag, int uid);
+ private static native int native_untagSocketFd(FileDescriptor fd);
+ private static native int native_setCounterSet(int uid, int counterSetNum);
+ private static native int native_deleteTagData(int tag, int uid);
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index aece5f0b6e7e..59a03e7833c5 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -143,6 +143,7 @@ LOCAL_SRC_FILES:= \
android_server_BluetoothService.cpp \
android_server_BluetoothEventLoop.cpp \
android_server_BluetoothA2dpService.cpp \
+ android_server_NetworkManagementSocketTagger.cpp \
android_server_Watchdog.cpp \
android_ddm_DdmHandleNativeHeap.cpp \
com_android_internal_os_ZygoteInit.cpp \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index dd7dd867d5f2..12ec1b65da94 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -155,6 +155,7 @@ extern int register_android_bluetooth_BluetoothSocket(JNIEnv *env);
extern int register_android_server_BluetoothService(JNIEnv* env);
extern int register_android_server_BluetoothEventLoop(JNIEnv *env);
extern int register_android_server_BluetoothA2dpService(JNIEnv* env);
+extern int register_android_server_NetworkManagementSocketTagger(JNIEnv* env);
extern int register_android_server_Watchdog(JNIEnv* env);
extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env);
extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env);
@@ -1178,6 +1179,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_server_BluetoothService),
REG_JNI(register_android_server_BluetoothEventLoop),
REG_JNI(register_android_server_BluetoothA2dpService),
+ REG_JNI(register_android_server_NetworkManagementSocketTagger),
REG_JNI(register_android_server_Watchdog),
REG_JNI(register_android_ddm_DdmHandleNativeHeap),
REG_JNI(register_android_backup_BackupDataInput),
diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp
index 9313d0afce2b..02c5bb3a2885 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -758,21 +758,7 @@ public:
jfloat x, jfloat y, int flags, SkPaint* paint) {
jint count = end - start;
- sp<TextLayoutCacheValue> value;
-#if USE_TEXT_LAYOUT_CACHE
- value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count,
- end, flags);
- if (value == NULL) {
- LOGE("Cannot get TextLayoutCache value");
- return ;
- }
-#else
- value = new TextLayoutCacheValue();
- value->computeValues(paint, textArray, start, count, end, flags);
-#endif
-
- doDrawGlyphs(canvas, value->getGlyphs(), 0, value->getGlyphsCount(),
- x, y, flags, paint);
+ drawTextWithGlyphs(canvas, textArray + start, 0, count, count, x, y, flags, paint);
}
static void drawTextWithGlyphs(SkCanvas* canvas, const jchar* textArray,
@@ -781,19 +767,20 @@ public:
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
- value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count,
- contextCount, flags);
+ value = TextLayoutCache::getInstance().getValue(paint, textArray, contextCount, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;
}
#else
value = new TextLayoutCacheValue();
- value->computeValues(paint, textArray, start, count, contextCount, flags);
+ value->computeValues(paint, textArray, contextCount, flags);
#endif
-
- doDrawGlyphs(canvas, value->getGlyphs(), 0, value->getGlyphsCount(),
- x, y, flags, paint);
+ size_t startIndex = 0;
+ size_t glyphsCount = 0;
+ value->getGlyphsIndexAndCount(start, count, &startIndex, &glyphsCount);
+ const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount);
+ doDrawGlyphs(canvas, glyphs, 0, glyphsCount, x, y, flags, paint);
}
static void doDrawGlyphs(SkCanvas* canvas, const jchar* glyphArray, int index, int count,
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 7d222f639392..3daf7d0273cd 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -352,7 +352,7 @@ public:
jfloat result = 0;
#if RTL_USE_HARFBUZZ
TextLayout::getTextRunAdvances(paint, textArray, index, count, textLength,
- paint->getFlags(), NULL /* dont need all advances */, result);
+ paint->getFlags(), NULL /* dont need all advances */, &result);
#else
// we double count, since measureText wants a byteLength
SkScalar width = paint->measureText(textArray + index, count << 1);
@@ -382,7 +382,7 @@ public:
#if RTL_USE_HARFBUZZ
TextLayout::getTextRunAdvances(paint, textArray, start, count, textLength,
- paint->getFlags(), NULL /* dont need all advances */, width);
+ paint->getFlags(), NULL /* dont need all advances */, &width);
#else
width = SkScalarToFloat(paint->measureText(textArray + start, count << 1));
@@ -406,7 +406,7 @@ public:
#if RTL_USE_HARFBUZZ
TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength,
- paint->getFlags(), NULL /* dont need all advances */, width);
+ paint->getFlags(), NULL /* dont need all advances */, &width);
#else
width = SkScalarToFloat(paint->measureText(textArray, textLength << 1));
#endif
@@ -435,10 +435,8 @@ public:
jfloat* widthsArray = autoWidths.ptr();
#if RTL_USE_HARFBUZZ
- jfloat totalAdvance;
-
TextLayout::getTextRunAdvances(paint, text, 0, count, count,
- paint->getFlags(), widthsArray, totalAdvance);
+ paint->getFlags(), widthsArray, NULL /* dont need totalAdvance */);
#else
SkScalar* scalarArray = (SkScalar*)widthsArray;
@@ -533,7 +531,7 @@ public:
jfloat totalAdvance = 0;
TextLayout::getTextRunAdvances(paint, text, start, count, contextCount, flags,
- advancesArray, totalAdvance);
+ advancesArray, &totalAdvance);
if (advances != NULL) {
env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray);
@@ -604,10 +602,9 @@ public:
jint count, jint flags, jint offset, jint opt) {
#if RTL_USE_HARFBUZZ
jfloat scalarArray[count];
- jfloat totalAdvance = 0;
TextLayout::getTextRunAdvances(paint, text, start, count, count, flags,
- scalarArray, totalAdvance);
+ scalarArray, NULL /* dont need totalAdvance */);
#else
SkScalar scalarArray[count];
jchar buffer[count];
diff --git a/core/jni/android/graphics/TextLayout.cpp b/core/jni/android/graphics/TextLayout.cpp
index fa9a7b740fc1..ae17aed1a8e0 100644
--- a/core/jni/android/graphics/TextLayout.cpp
+++ b/core/jni/android/graphics/TextLayout.cpp
@@ -253,37 +253,30 @@ void TextLayout::drawTextRun(SkPaint* paint, const jchar* chars,
void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint start,
jint count, jint contextCount, jint dirFlags,
- jfloat* resultAdvances, jfloat& resultTotalAdvance) {
+ jfloat* resultAdvances, jfloat* resultTotalAdvance) {
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
// Return advances from the cache. Compute them if needed
- value = TextLayoutCache::getInstance().getValue(
- paint, chars, start, count, contextCount, dirFlags);
+ value = TextLayoutCache::getInstance().getValue(paint, chars, contextCount, dirFlags);
#else
value = new TextLayoutCacheValue();
- value->computeValues(paint, chars, start, count, contextCount, dirFlags);
+ value->computeValues(paint, chars, contextCount, dirFlags);
#endif
if (value != NULL) {
if (resultAdvances != NULL) {
- memcpy(resultAdvances, value->getAdvances(), value->getAdvancesCount() * sizeof(jfloat));
+ value->getAdvances(start, count, resultAdvances);
+ }
+ if (resultTotalAdvance) {
+ *resultTotalAdvance = value->getTotalAdvance(start, count);
}
- resultTotalAdvance = value->getTotalAdvance();
}
}
-void TextLayout::getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start,
- jint count, jint contextCount, jint dirFlags,
- jfloat* resultAdvances, jfloat& resultTotalAdvance) {
- // Compute advances and return them
- TextLayoutCacheValue::computeValuesWithHarfbuzz(paint, chars, start, count, contextCount,
- dirFlags, resultAdvances, &resultTotalAdvance, NULL, NULL);
-}
-
void TextLayout::getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint start,
jint count, jint contextCount, jint dirFlags,
jfloat* resultAdvances, jfloat& resultTotalAdvance) {
// Compute advances and return them
- TextLayoutCacheValue::computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags,
+ computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags,
resultAdvances, &resultTotalAdvance);
}
@@ -321,4 +314,73 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count,
}
}
+void TextLayout::computeAdvancesWithICU(SkPaint* paint, const UChar* chars,
+ size_t start, size_t count, size_t contextCount, int dirFlags,
+ jfloat* outAdvances, jfloat* outTotalAdvance) {
+ SkAutoSTMalloc<CHAR_BUFFER_SIZE, jchar> tempBuffer(contextCount);
+ jchar* buffer = tempBuffer.get();
+ SkScalar* scalarArray = (SkScalar*)outAdvances;
+
+ // this is where we'd call harfbuzz
+ // for now we just use ushape.c
+ size_t widths;
+ const jchar* text;
+ if (dirFlags & 0x1) { // rtl, call arabic shaping in case
+ UErrorCode status = U_ZERO_ERROR;
+ // Use fixed length since we need to keep start and count valid
+ u_shapeArabic(chars, contextCount, buffer, contextCount,
+ U_SHAPE_LENGTH_FIXED_SPACES_NEAR |
+ U_SHAPE_TEXT_DIRECTION_LOGICAL | U_SHAPE_LETTERS_SHAPE |
+ U_SHAPE_X_LAMALEF_SUB_ALTERNATE, &status);
+ // we shouldn't fail unless there's an out of memory condition,
+ // in which case we're hosed anyway
+ for (int i = start, e = i + count; i < e; ++i) {
+ if (buffer[i] == UNICODE_NOT_A_CHAR) {
+ buffer[i] = UNICODE_ZWSP; // zero-width-space for skia
+ }
+ }
+ text = buffer + start;
+ widths = paint->getTextWidths(text, count << 1, scalarArray);
+ } else {
+ text = chars + start;
+ widths = paint->getTextWidths(text, count << 1, scalarArray);
+ }
+
+ jfloat totalAdvance = 0;
+ if (widths < count) {
+#if DEBUG_ADVANCES
+ LOGD("ICU -- count=%d", widths);
+#endif
+ // Skia operates on code points, not code units, so surrogate pairs return only
+ // one value. Expand the result so we have one value per UTF-16 code unit.
+
+ // Note, skia's getTextWidth gets confused if it encounters a surrogate pair,
+ // leaving the remaining widths zero. Not nice.
+ for (size_t i = 0, p = 0; i < widths; ++i) {
+ totalAdvance += outAdvances[p++] = SkScalarToFloat(scalarArray[i]);
+ if (p < count &&
+ text[p] >= UNICODE_FIRST_LOW_SURROGATE &&
+ text[p] < UNICODE_FIRST_PRIVATE_USE &&
+ text[p-1] >= UNICODE_FIRST_HIGH_SURROGATE &&
+ text[p-1] < UNICODE_FIRST_LOW_SURROGATE) {
+ outAdvances[p++] = 0;
+ }
+#if DEBUG_ADVANCES
+ LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance);
+#endif
+ }
+ } else {
+#if DEBUG_ADVANCES
+ LOGD("ICU -- count=%d", count);
+#endif
+ for (size_t i = 0; i < count; i++) {
+ totalAdvance += outAdvances[i] = SkScalarToFloat(scalarArray[i]);
+#if DEBUG_ADVANCES
+ LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance);
+#endif
+ }
+ }
+ *outTotalAdvance = totalAdvance;
+}
+
}
diff --git a/core/jni/android/graphics/TextLayout.h b/core/jni/android/graphics/TextLayout.h
index 0a29d7876a9d..9df38296e329 100644
--- a/core/jni/android/graphics/TextLayout.h
+++ b/core/jni/android/graphics/TextLayout.h
@@ -71,16 +71,12 @@ public:
static void getTextRunAdvances(SkPaint* paint, const jchar* chars, jint start,
jint count, jint contextCount, jint dirFlags,
- jfloat* resultAdvances, jfloat& resultTotalAdvance);
+ jfloat* resultAdvances, jfloat* resultTotalAdvance);
static void getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint start,
jint count, jint contextCount, jint dirFlags,
jfloat* resultAdvances, jfloat& resultTotalAdvance);
- static void getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start,
- jint count, jint contextCount, jint dirFlags,
- jfloat* resultAdvances, jfloat& resultTotalAdvance);
-
static void drawText(SkPaint* paint, const jchar* text, jsize len,
jint bidiFlags, jfloat x, jfloat y, SkCanvas* canvas);
@@ -106,5 +102,9 @@ private:
UErrorCode &status);
static void handleText(SkPaint* paint, const jchar* text, jsize len,
int bidiFlags, jfloat x, jfloat y, SkCanvas* canvas, SkPath* path);
+
+ static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars,
+ size_t start, size_t count, size_t contextCount, int dirFlags,
+ jfloat* outAdvances, jfloat* outTotalAdvance);
};
} // namespace android
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index d04e05977fb1..86ae7d2ae05f 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -52,13 +52,7 @@ void TextLayoutCache::init() {
mCacheStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
if (mDebugEnabled) {
- LOGD("Start time: %lld", mCacheStartTime);
-#if RTL_USE_HARFBUZZ
- LOGD("Using HARFBUZZ");
-#else
- LOGD("Using ICU");
-#endif
- LOGD("Initialization is done");
+ LOGD("Initialization is done - Start time: %lld", mCacheStartTime);
}
mInitialized = true;
@@ -112,7 +106,7 @@ void TextLayoutCache::clear() {
* Caching
*/
sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
- const jchar* text, jint start, jint count, jint contextCount, jint dirFlags) {
+ const jchar* text, jint count, jint dirFlags) {
AutoMutex _l(mLock);
nsecs_t startTime = 0;
if (mDebugEnabled) {
@@ -120,7 +114,7 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
}
// Create the key
- TextLayoutCacheKey key(paint, text, start, count, contextCount, dirFlags);
+ TextLayoutCacheKey key(paint, text, count, dirFlags);
// Get value from cache if possible
sp<TextLayoutCacheValue> value = mCache.get(key);
@@ -134,7 +128,7 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
value = new TextLayoutCacheValue();
// Compute advances and store them
- value->computeValues(paint, text, start, count, contextCount, dirFlags);
+ value->computeValues(paint, text, count, dirFlags);
nsecs_t endTime = systemTime(SYSTEM_TIME_MONOTONIC);
@@ -163,20 +157,20 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
// Update timing information for statistics
value->setElapsedTime(endTime - startTime);
- LOGD("CACHE MISS: Added entry with start=%d, count=%d, "
- "contextCount=%d, entry size %d bytes, remaining space %d bytes"
+ LOGD("CACHE MISS: Added entry with "
+ "count=%d, entry size %d bytes, remaining space %d bytes"
" - Compute time in nanos: %d - Text='%s' ",
- start, count, contextCount, size, mMaxSize - mSize, value->getElapsedTime(),
- String8(text, contextCount).string());
+ count, size, mMaxSize - mSize, value->getElapsedTime(),
+ String8(text, count).string());
}
} else {
if (mDebugEnabled) {
LOGD("CACHE MISS: Calculated but not storing entry because it is too big "
- "with start=%d, count=%d, contextCount=%d, "
+ "with count=%d, "
"entry size %d bytes, remaining space %d bytes"
" - Compute time in nanos: %lld - Text='%s'",
- start, count, contextCount, size, mMaxSize - mSize, endTime,
- String8(text, contextCount).string());
+ count, size, mMaxSize - mSize, endTime,
+ String8(text, count).string());
}
value.clear();
}
@@ -190,12 +184,12 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
if (value->getElapsedTime() > 0) {
float deltaPercent = 100 * ((value->getElapsedTime() - elapsedTimeThruCacheGet)
/ ((float)value->getElapsedTime()));
- LOGD("CACHE HIT #%d with start=%d, count=%d, contextCount=%d "
+ LOGD("CACHE HIT #%d with count=%d "
"- Compute time in nanos: %d - "
"Cache get time in nanos: %lld - Gain in percent: %2.2f - Text='%s' ",
- mCacheHitCount, start, count, contextCount,
+ mCacheHitCount, count,
value->getElapsedTime(), elapsedTimeThruCacheGet, deltaPercent,
- String8(text, contextCount).string());
+ String8(text, count).string());
}
if (mCacheHitCount % DEFAULT_DUMP_STATS_CACHE_HIT_INTERVAL == 0) {
dumpCacheStats();
@@ -224,15 +218,14 @@ void TextLayoutCache::dumpCacheStats() {
/**
* TextLayoutCacheKey
*/
-TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), start(0), count(0), contextCount(0),
+TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), count(0),
dirFlags(0), typeface(NULL), textSize(0), textSkewX(0), textScaleX(0), flags(0),
hinting(SkPaint::kNo_Hinting) {
}
TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint,
- const UChar* text, size_t start, size_t count,
- size_t contextCount, int dirFlags) :
- text(text), start(start), count(count), contextCount(contextCount),
+ const UChar* text, size_t count, int dirFlags) :
+ text(text), count(count),
dirFlags(dirFlags) {
typeface = paint->getTypeface();
textSize = paint->getTextSize();
@@ -242,20 +235,33 @@ TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint,
hinting = paint->getHinting();
}
+TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) :
+ text(NULL),
+ textCopy(other.textCopy),
+ count(other.count),
+ dirFlags(other.dirFlags),
+ typeface(other.typeface),
+ textSize(other.textSize),
+ textSkewX(other.textSkewX),
+ textScaleX(other.textScaleX),
+ flags(other.flags),
+ hinting(other.hinting) {
+ if (other.text) {
+ textCopy.setTo(other.text);
+ }
+}
+
bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const {
LTE_INT(count) {
- LTE_INT(contextCount) {
- LTE_INT(start) {
- LTE_INT(typeface) {
- LTE_FLOAT(textSize) {
- LTE_FLOAT(textSkewX) {
- LTE_FLOAT(textScaleX) {
- LTE_INT(flags) {
- LTE_INT(hinting) {
- LTE_INT(dirFlags) {
- return strncmp16(text, rhs.text, contextCount) < 0;
- }
- }
+ LTE_INT(typeface) {
+ LTE_FLOAT(textSize) {
+ LTE_FLOAT(textSkewX) {
+ LTE_FLOAT(textScaleX) {
+ LTE_INT(flags) {
+ LTE_INT(hinting) {
+ LTE_INT(dirFlags) {
+ return memcmp(getText(), rhs.getText(),
+ count * sizeof(UChar)) < 0;
}
}
}
@@ -268,25 +274,19 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const {
}
void TextLayoutCacheKey::internalTextCopy() {
- textCopy.setTo(text, contextCount);
- text = textCopy.string();
+ textCopy.setTo(text, count);
+ text = NULL;
}
size_t TextLayoutCacheKey::getSize() {
- return sizeof(TextLayoutCacheKey) + sizeof(UChar) * contextCount;
+ return sizeof(TextLayoutCacheKey) + sizeof(UChar) * count;
}
/**
* TextLayoutCacheValue
*/
TextLayoutCacheValue::TextLayoutCacheValue() :
- mAdvances(NULL), mTotalAdvance(0), mAdvancesCount(0),
- mGlyphs(NULL), mGlyphsCount(0), mElapsedTime(0) {
-}
-
-TextLayoutCacheValue::~TextLayoutCacheValue() {
- delete[] mAdvances;
- delete[] mGlyphs;
+ mTotalAdvance(0), mElapsedTime(0) {
}
void TextLayoutCacheValue::setElapsedTime(uint32_t time) {
@@ -297,28 +297,23 @@ uint32_t TextLayoutCacheValue::getElapsedTime() {
return mElapsedTime;
}
-void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars, size_t start,
- size_t count, size_t contextCount, int dirFlags) {
- mAdvancesCount = count;
- mAdvances = new float[count];
+void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars,
+ size_t contextCount, int dirFlags) {
+ // Give a hint for advances, glyphs and log clusters vectors size
+ mAdvances.setCapacity(contextCount);
+ mGlyphs.setCapacity(contextCount);
+ mLogClusters.setCapacity(contextCount);
-#if RTL_USE_HARFBUZZ
- computeValuesWithHarfbuzz(paint, chars, start, count, contextCount, dirFlags,
- mAdvances, &mTotalAdvance, &mGlyphs, &mGlyphsCount);
-#else
- computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags,
- mAdvances, &mTotalAdvance);
-#endif
+ computeValuesWithHarfbuzz(paint, chars, contextCount, dirFlags,
+ &mAdvances, &mTotalAdvance, &mGlyphs, &mLogClusters);
#if DEBUG_ADVANCES
- LOGD("Advances - count=%d - countextCount=%d - totalAdvance=%f - "
- "adv[0]=%f adv[1]=%f adv[2]=%f adv[3]=%f", count, contextCount, mTotalAdvance,
- mAdvances[0], mAdvances[1], mAdvances[2], mAdvances[3]);
+ LOGD("Advances - countextCount=%d - totalAdvance=%f", contextCount, mTotalAdvance);
#endif
}
size_t TextLayoutCacheValue::getSize() {
- return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvancesCount +
- sizeof(jchar) * mGlyphsCount;
+ return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvances.capacity() +
+ sizeof(jchar) * mGlyphs.capacity() + sizeof(unsigned short) * mLogClusters.capacity();
}
void TextLayoutCacheValue::setupShaperItem(HB_ShaperItem* shaperItem, HB_FontRec* font,
@@ -389,27 +384,10 @@ void TextLayoutCacheValue::shapeWithHarfbuzz(HB_ShaperItem* shaperItem, HB_FontR
}
}
-struct GlyphRun {
- inline GlyphRun() {}
- inline GlyphRun(jchar* glyphs, size_t glyphsCount, bool isRTL) :
- glyphs(glyphs), glyphsCount(glyphsCount), isRTL(isRTL) { }
- jchar* glyphs;
- size_t glyphsCount;
- int isRTL;
-};
-
-void static reverseGlyphArray(jchar* glyphs, size_t count) {
- for (size_t i = 0; i < count / 2; i++) {
- jchar temp = glyphs[i];
- glyphs[i] = glyphs[count - 1 - i];
- glyphs[count - 1 - i] = temp;
- }
-}
-
void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars,
- size_t start, size_t count, size_t contextCount, int dirFlags,
- jfloat* outAdvances, jfloat* outTotalAdvance,
- jchar** outGlyphs, size_t* outGlyphsCount) {
+ size_t contextCount, int dirFlags,
+ Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
+ Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters) {
UBiDiLevel bidiReq = 0;
bool forceLTR = false;
@@ -429,12 +407,8 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
LOGD("computeValuesWithHarfbuzz -- forcing run with LTR=%d RTL=%d",
forceLTR, forceRTL);
#endif
- computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, forceRTL,
- outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
-
- if (forceRTL && *outGlyphsCount > 1) {
- reverseGlyphArray(*outGlyphs, *outGlyphsCount);
- }
+ computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount, forceRTL,
+ outAdvances, outTotalAdvance, outGlyphs, outLogClusters);
} else {
UBiDi* bidi = ubidi_open();
if (bidi) {
@@ -453,42 +427,16 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
bool isRTL = (paraDir == 1);
#if DEBUG_GLYPHS
LOGD("computeValuesWithHarfbuzz -- processing SINGLE run "
- "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
+ "-- run-start=%d run-len=%d isRTL=%d", 0, contextCount, isRTL);
#endif
- computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount,
- isRTL, outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
-
- if (isRTL && *outGlyphsCount > 1) {
- reverseGlyphArray(*outGlyphs, *outGlyphsCount);
- }
+ computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount,
+ isRTL, outAdvances, outTotalAdvance, outGlyphs, outLogClusters);
} else {
- Vector<GlyphRun> glyphRuns;
- jchar* runGlyphs;
- size_t runGlyphsCount = 0;
- int32_t end = start + count;
for (size_t i = 0; i < rc; ++i) {
int32_t startRun;
int32_t lengthRun;
UBiDiDirection runDir = ubidi_getVisualRun(bidi, i, &startRun, &lengthRun);
- if (startRun >= end) {
- break;
- }
-
- int32_t endRun = startRun + lengthRun;
- if (endRun <= start) {
- continue;
- }
-
- if (startRun < start) {
- startRun = start;
- }
- if (endRun > end) {
- endRun = end;
- }
-
- lengthRun = endRun - startRun;
-
bool isRTL = (runDir == UBIDI_RTL);
jfloat runTotalAdvance = 0;
#if DEBUG_GLYPHS
@@ -498,34 +446,9 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
computeRunValuesWithHarfbuzz(paint, chars, startRun,
lengthRun, contextCount, isRTL,
outAdvances, &runTotalAdvance,
- &runGlyphs, &runGlyphsCount);
+ outGlyphs, outLogClusters);
- outAdvances += lengthRun;
*outTotalAdvance += runTotalAdvance;
- *outGlyphsCount += runGlyphsCount;
-#if DEBUG_GLYPHS
- LOGD("computeValuesWithHarfbuzz -- run=%d run-glyphs-count=%d",
- i, runGlyphsCount);
- for (size_t j = 0; j < runGlyphsCount; j++) {
- LOGD(" -- glyphs[%d]=%d", j, runGlyphs[j]);
- }
-#endif
- glyphRuns.push(GlyphRun(runGlyphs, runGlyphsCount, isRTL));
- }
- *outGlyphs = new jchar[*outGlyphsCount];
-
- jchar* glyphs = *outGlyphs;
- for (size_t i = 0; i < glyphRuns.size(); i++) {
- const GlyphRun& glyphRun = glyphRuns.itemAt(i);
- if (glyphRun.isRTL) {
- for (size_t n = 0; n < glyphRun.glyphsCount; n++) {
- glyphs[glyphRun.glyphsCount - n - 1] = glyphRun.glyphs[n];
- }
- } else {
- memcpy(glyphs, glyphRun.glyphs, glyphRun.glyphsCount * sizeof(jchar));
- }
- glyphs += glyphRun.glyphsCount;
- delete[] glyphRun.glyphs;
}
}
}
@@ -535,25 +458,21 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
bool isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
#if DEBUG_GLYPHS
LOGD("computeValuesWithHarfbuzz -- cannot run BiDi, considering a SINGLE Run "
- "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
+ "-- run-start=%d run-len=%d isRTL=%d", 0, contextCount, isRTL);
#endif
- computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, isRTL,
- outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
-
- if (isRTL && *outGlyphsCount > 1) {
- reverseGlyphArray(*outGlyphs, *outGlyphsCount);
- }
+ computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount, isRTL,
+ outAdvances, outTotalAdvance, outGlyphs, outLogClusters);
}
}
#if DEBUG_GLYPHS
- LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", *outGlyphsCount);
+ LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", outGlyphs->size());
#endif
}
static void logGlyphs(HB_ShaperItem shaperItem) {
LOGD("Got glyphs - count=%d", shaperItem.num_glyphs);
for (size_t i = 0; i < shaperItem.num_glyphs; i++) {
- LOGD(" glyphs[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i],
+ LOGD(" glyph[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i],
HBFixedToFloat(shaperItem.offsets[i].x),
HBFixedToFloat(shaperItem.offsets[i].y));
}
@@ -561,12 +480,13 @@ static void logGlyphs(HB_ShaperItem shaperItem) {
void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars,
size_t start, size_t count, size_t contextCount, bool isRTL,
- jfloat* outAdvances, jfloat* outTotalAdvance,
- jchar** outGlyphs, size_t* outGlyphsCount) {
+ Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
+ Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters) {
HB_ShaperItem shaperItem;
HB_FontRec font;
FontData fontData;
+
shapeWithHarfbuzz(&shaperItem, &font, &fontData, paint, chars, start, count,
contextCount, isRTL);
@@ -583,30 +503,28 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC
#if DEBUG_GLYPHS
LOGD("HARFBUZZ -- advances array is empty or num_glypth = 0");
#endif
- for (size_t i = 0; i < count; i++) {
- outAdvances[i] = 0;
- }
+ outAdvances->insertAt(0, outAdvances->size(), count);
*outTotalAdvance = 0;
- if (outGlyphs) {
- *outGlyphsCount = 0;
- *outGlyphs = new jchar[0];
- }
-
// Cleaning
deleteGlyphArrays(&shaperItem);
HB_FreeFace(shaperItem.face);
return;
}
+
// Get Advances and their total
- jfloat totalAdvance = outAdvances[0] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]);
+ jfloat currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]);
+ jfloat totalAdvance = currentAdvance;
+ outAdvances->add(currentAdvance);
for (size_t i = 1; i < count; i++) {
size_t clusterPrevious = shaperItem.log_clusters[i - 1];
size_t cluster = shaperItem.log_clusters[i];
if (cluster == clusterPrevious) {
- outAdvances[i] = 0;
+ outAdvances->add(0);
} else {
- totalAdvance += outAdvances[i] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]);
+ currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]);
+ totalAdvance += currentAdvance;
+ outAdvances->add(currentAdvance);
}
}
*outTotalAdvance = totalAdvance;
@@ -614,91 +532,38 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC
#if DEBUG_ADVANCES
for (size_t i = 0; i < count; i++) {
LOGD("hb-adv[%d] = %f - log_clusters = %d - total = %f", i,
- outAdvances[i], shaperItem.log_clusters[i], totalAdvance);
+ (*outAdvances)[i], shaperItem.log_clusters[i], totalAdvance);
}
#endif
- // Get Glyphs
+ // Get Glyphs and reverse them in place if RTL
if (outGlyphs) {
- *outGlyphsCount = shaperItem.num_glyphs;
- *outGlyphs = new jchar[shaperItem.num_glyphs];
- for (size_t i = 0; i < shaperItem.num_glyphs; i++) {
- (*outGlyphs)[i] = (jchar) shaperItem.glyphs[i];
- }
- }
-
- // Cleaning
- deleteGlyphArrays(&shaperItem);
- HB_FreeFace(shaperItem.face);
-}
-
-void TextLayoutCacheValue::computeAdvancesWithICU(SkPaint* paint, const UChar* chars,
- size_t start, size_t count, size_t contextCount, int dirFlags,
- jfloat* outAdvances, jfloat* outTotalAdvance) {
- SkAutoSTMalloc<CHAR_BUFFER_SIZE, jchar> tempBuffer(contextCount);
- jchar* buffer = tempBuffer.get();
- SkScalar* scalarArray = (SkScalar*)outAdvances;
-
- // this is where we'd call harfbuzz
- // for now we just use ushape.c
- size_t widths;
- const jchar* text;
- if (dirFlags & 0x1) { // rtl, call arabic shaping in case
- UErrorCode status = U_ZERO_ERROR;
- // Use fixed length since we need to keep start and count valid
- u_shapeArabic(chars, contextCount, buffer, contextCount,
- U_SHAPE_LENGTH_FIXED_SPACES_NEAR |
- U_SHAPE_TEXT_DIRECTION_LOGICAL | U_SHAPE_LETTERS_SHAPE |
- U_SHAPE_X_LAMALEF_SUB_ALTERNATE, &status);
- // we shouldn't fail unless there's an out of memory condition,
- // in which case we're hosed anyway
- for (int i = start, e = i + count; i < e; ++i) {
- if (buffer[i] == UNICODE_NOT_A_CHAR) {
- buffer[i] = UNICODE_ZWSP; // zero-width-space for skia
- }
+ size_t countGlyphs = shaperItem.num_glyphs;
+ for (size_t i = 0; i < countGlyphs; i++) {
+ jchar glyph = (jchar) shaperItem.glyphs[(!isRTL) ? i : countGlyphs - 1 - i];
+#if DEBUG_GLYPHS
+ LOGD("HARFBUZZ -- glyph[%d]=%d", i, glyph);
+#endif
+ outGlyphs->add(glyph);
}
- text = buffer + start;
- widths = paint->getTextWidths(text, count << 1, scalarArray);
- } else {
- text = chars + start;
- widths = paint->getTextWidths(text, count << 1, scalarArray);
}
- jfloat totalAdvance = 0;
- if (widths < count) {
-#if DEBUG_ADVANCES
- LOGD("ICU -- count=%d", widths);
-#endif
- // Skia operates on code points, not code units, so surrogate pairs return only
- // one value. Expand the result so we have one value per UTF-16 code unit.
-
- // Note, skia's getTextWidth gets confused if it encounters a surrogate pair,
- // leaving the remaining widths zero. Not nice.
- for (size_t i = 0, p = 0; i < widths; ++i) {
- totalAdvance += outAdvances[p++] = SkScalarToFloat(scalarArray[i]);
- if (p < count &&
- text[p] >= UNICODE_FIRST_LOW_SURROGATE &&
- text[p] < UNICODE_FIRST_PRIVATE_USE &&
- text[p-1] >= UNICODE_FIRST_HIGH_SURROGATE &&
- text[p-1] < UNICODE_FIRST_LOW_SURROGATE) {
- outAdvances[p++] = 0;
- }
-#if DEBUG_ADVANCES
- LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance);
-#endif
- }
- } else {
-#if DEBUG_ADVANCES
- LOGD("ICU -- count=%d", count);
-#endif
+ // Get LogClusters
+ if (outLogClusters) {
+ size_t countLogClusters = outLogClusters->size();
for (size_t i = 0; i < count; i++) {
- totalAdvance += outAdvances[i] = SkScalarToFloat(scalarArray[i]);
-#if DEBUG_ADVANCES
- LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance);
+ // As there may be successive runs, we need to shift the log clusters
+ unsigned short logCluster = shaperItem.log_clusters[i] + countLogClusters;
+#if DEBUG_GLYPHS
+ LOGD("HARFBUZZ -- logCluster[%d] relative=%d - absolute=%d", i, shaperItem.log_clusters[i], logCluster);
#endif
+ outLogClusters->add(logCluster);
}
}
- *outTotalAdvance = totalAdvance;
+
+ // Cleaning
+ deleteGlyphArrays(&shaperItem);
+ HB_FreeFace(shaperItem.face);
}
void TextLayoutCacheValue::deleteGlyphArrays(HB_ShaperItem* shaperItem) {
@@ -726,5 +591,57 @@ void TextLayoutCacheValue::resetGlyphArrays(HB_ShaperItem* shaperItem) {
memset(shaperItem->offsets, 0, size * sizeof(shaperItem->offsets[0]));
}
+void TextLayoutCacheValue::getAdvances(size_t start, size_t count, jfloat* outAdvances) const {
+ memcpy(outAdvances, mAdvances.array() + start, count * sizeof(jfloat));
+#if DEBUG_ADVANCES
+ LOGD("getAdvances - start=%d count=%d", start, count);
+ for (size_t i = 0; i < count; i++) {
+ LOGD(" adv[%d] = %f", i, outAdvances[i]);
+ }
+#endif
+}
+
+jfloat TextLayoutCacheValue::getTotalAdvance(size_t start, size_t count) const {
+ jfloat outTotalAdvance = 0;
+ for (size_t i = start; i < start + count; i++) {
+ outTotalAdvance += mAdvances[i];
+ }
+#if DEBUG_ADVANCES
+ LOGD("getTotalAdvance - start=%d count=%d - total=%f", start, count, outTotalAdvance);
+#endif
+ return outTotalAdvance;
+}
+
+void TextLayoutCacheValue::getGlyphsIndexAndCount(size_t start, size_t count, size_t* outStartIndex,
+ size_t* outGlyphsCount) const {
+ *outStartIndex = 0;
+ if (count == 0) {
+ *outGlyphsCount = 0;
+ return;
+ }
+ *outStartIndex = mLogClusters[start];
+ *outGlyphsCount = mLogClusters[start + count - 1] - mLogClusters[start] + 1;
+#if DEBUG_GLYPHS
+ LOGD("getGlyphsIndexes - start=%d count=%d - startIndex=%d count=%d", start, count,
+ *outStartIndex, *outGlyphsCount);
+ for(size_t i = 0; i < mGlyphs.size(); i++) {
+ LOGD("getGlyphs - all - glyph[%d] = %d", i, mGlyphs[i]);
+ }
+ for(size_t i = 0; i < mAdvances.size(); i++) {
+ LOGD("getGlyphs - all - logcl[%d] = %d", i, mLogClusters[i]);
+ }
+#endif
+}
+
+const jchar* TextLayoutCacheValue::getGlyphs(size_t startIndex, size_t count) {
+ const jchar* glyphs = mGlyphs.array() + startIndex;
+#if DEBUG_GLYPHS
+ LOGD("getGlyphs - with startIndex = %d count = %d", startIndex, count);
+ for (size_t i = 0; i < count; i++) {
+ LOGD("getGlyphs - result - glyph[%d] = %d", i, glyphs[i]);
+ }
+#endif
+ return glyphs;
+}
} // namespace android
diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h
index 0d8d71fe7c26..35dd6fd8ed17 100644
--- a/core/jni/android/graphics/TextLayoutCache.h
+++ b/core/jni/android/graphics/TextLayoutCache.h
@@ -68,9 +68,9 @@ class TextLayoutCacheKey {
public:
TextLayoutCacheKey();
- TextLayoutCacheKey(const SkPaint* paint,
- const UChar* text, size_t start, size_t count,
- size_t contextCount, int dirFlags);
+ TextLayoutCacheKey(const SkPaint* paint, const UChar* text, size_t count, int dirFlags);
+
+ TextLayoutCacheKey(const TextLayoutCacheKey& other);
bool operator<(const TextLayoutCacheKey& rhs) const;
@@ -86,11 +86,9 @@ public:
size_t getSize();
private:
- const UChar* text;
+ const UChar* text; // if text is NULL, use textCopy
String16 textCopy;
- size_t start;
size_t count;
- size_t contextCount;
int dirFlags;
SkTypeface* typeface;
SkScalar textSize;
@@ -98,29 +96,29 @@ private:
SkScalar textScaleX;
uint32_t flags;
SkPaint::Hinting hinting;
+
+ inline const UChar* getText() const {
+ return text ? text : textCopy.string();
+ }
}; // TextLayoutCacheKey
/*
* TextLayoutCacheValue is the Cache value
*/
class TextLayoutCacheValue : public RefBase {
-protected:
- ~TextLayoutCacheValue();
-
public:
TextLayoutCacheValue();
void setElapsedTime(uint32_t time);
uint32_t getElapsedTime();
- void computeValues(SkPaint* paint, const UChar* chars, size_t start, size_t count,
- size_t contextCount, int dirFlags);
+ void computeValues(SkPaint* paint, const UChar* chars, size_t contextCount, int dirFlags);
- inline const jfloat* getAdvances() const { return mAdvances; }
- inline size_t getAdvancesCount() const { return mAdvancesCount; }
- inline jfloat getTotalAdvance() const { return mTotalAdvance; }
- inline const jchar* getGlyphs() const { return mGlyphs; }
- inline size_t getGlyphsCount() const { return mGlyphsCount; }
+ void getAdvances(size_t start, size_t count, jfloat* outAdvances) const;
+ jfloat getTotalAdvance(size_t start, size_t count) const;
+ void getGlyphsIndexAndCount(size_t start, size_t count, size_t* outStartIndex,
+ size_t* outGlyphsCount) const;
+ const jchar* getGlyphs(size_t startIndex, size_t count);
/**
* Get the size of the Cache entry
@@ -135,20 +133,16 @@ public:
SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount,
bool isRTL);
- static void computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start,
- size_t count, size_t contextCount, int dirFlags,
- jfloat* outAdvances, jfloat* outTotalAdvance,
- jchar** outGlyphs, size_t* outGlyphsCount);
-
- static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars, size_t start,
- size_t count, size_t contextCount, int dirFlags,
- jfloat* outAdvances, jfloat* outTotalAdvance);
+ static void computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars,
+ size_t contextCount, int dirFlags,
+ Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
+ Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters);
private:
/**
- * Advances array
+ * Advances vector
*/
- jfloat* mAdvances;
+ Vector<jfloat> mAdvances;
/**
* Total number of advances
@@ -156,19 +150,14 @@ private:
jfloat mTotalAdvance;
/**
- * Allocated size for advances array
- */
- size_t mAdvancesCount;
-
- /**
- * Glyphs array
+ * Glyphs vector
*/
- jchar* mGlyphs;
+ Vector<jchar> mGlyphs;
/**
- * Total number of glyphs
+ * Harfbuzz Log Clusters
*/
- size_t mGlyphsCount;
+ Vector<unsigned short> mLogClusters;
/**
* Time for computing the values (in milliseconds)
@@ -181,8 +170,8 @@ private:
static void computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start,
size_t count, size_t contextCount, bool isRTL,
- jfloat* outAdvances, jfloat* outTotalAdvance,
- jchar** outGlyphs, size_t* outGlyphsCount);
+ Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
+ Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters);
}; // TextLayoutCacheValue
/**
@@ -206,8 +195,8 @@ public:
*/
void operator()(TextLayoutCacheKey& text, sp<TextLayoutCacheValue>& desc);
- sp<TextLayoutCacheValue> getValue(SkPaint* paint,
- const jchar* text, jint start, jint count, jint contextCount, jint dirFlags);
+ sp<TextLayoutCacheValue> getValue(SkPaint* paint, const jchar* text, jint count,
+ jint dirFlags);
/**
* Clear the cache
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index 84a50f029e67..84c636b0ede5 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -402,30 +402,6 @@ static jint android_net_wifi_getRssiHelper(const char *cmd)
return (jint)rssi;
}
-static jint android_net_wifi_getRssiCommand(JNIEnv* env, jobject)
-{
- return android_net_wifi_getRssiHelper("DRIVER RSSI");
-}
-
-static jint android_net_wifi_getRssiApproxCommand(JNIEnv* env, jobject)
-{
- return android_net_wifi_getRssiHelper("DRIVER RSSI-APPROX");
-}
-
-static jint android_net_wifi_getLinkSpeedCommand(JNIEnv* env, jobject)
-{
- char reply[BUF_SIZE];
- int linkspeed;
-
- if (doCommand("DRIVER LINKSPEED", reply, sizeof(reply)) != 0) {
- return (jint)-1;
- }
- // reply comes back in the form "LinkSpeed XX" where XX is the
- // number we're interested in.
- sscanf(reply, "%*s %u", &linkspeed);
- return (jint)linkspeed;
-}
-
static jstring android_net_wifi_getMacAddressCommand(JNIEnv* env, jobject)
{
char reply[BUF_SIZE];
@@ -625,10 +601,6 @@ static JNINativeMethod gWifiMethods[] = {
(void*) android_net_wifi_setBluetoothCoexistenceModeCommand },
{ "setBluetoothCoexistenceScanModeCommand", "(Z)Z",
(void*) android_net_wifi_setBluetoothCoexistenceScanModeCommand },
- { "getRssiCommand", "()I", (void*) android_net_wifi_getRssiCommand },
- { "getRssiApproxCommand", "()I",
- (void*) android_net_wifi_getRssiApproxCommand},
- { "getLinkSpeedCommand", "()I", (void*) android_net_wifi_getLinkSpeedCommand },
{ "getMacAddressCommand", "()Ljava/lang/String;", (void*) android_net_wifi_getMacAddressCommand },
{ "saveConfigCommand", "()Z", (void*) android_net_wifi_saveConfigCommand },
{ "reloadConfigCommand", "()Z", (void*) android_net_wifi_reloadConfigCommand },
diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp
new file mode 100644
index 000000000000..c279cedc40e6
--- /dev/null
+++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "NMST_QTagUidNative"
+#include <utils/Log.h>
+
+#include "JNIHelp.h"
+
+#include "jni.h"
+#include <utils/misc.h>
+#include <cutils/qtaguid.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+namespace android {
+
+static jint QTagUid_tagSocketFd(JNIEnv* env, jclass,
+ jobject fileDescriptor,
+ jint tagNum, jint uid) {
+ int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ LOGE("Can't get FileDescriptor num");
+ return (jint)-1;
+ }
+
+ int res = qtaguid_tagSocket(userFd, tagNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static int QTagUid_untagSocketFd(JNIEnv* env, jclass,
+ jobject fileDescriptor) {
+ int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ LOGE("Can't get FileDescriptor num");
+ return (jint)-1;
+ }
+
+ int res = qtaguid_untagSocket(userFd);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static jint QTagUid_setCounterSet(JNIEnv* env, jclass,
+ jint setNum, jint uid) {
+
+ int res = qtaguid_setCounterSet(setNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static jint QTagUid_deleteTagData(JNIEnv* env, jclass,
+ jint tagNum, jint uid) {
+
+ int res = qtaguid_deleteTagData(tagNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static JNINativeMethod gQTagUidMethods[] = {
+ { "native_tagSocketFd", "(Ljava/io/FileDescriptor;II)I", (void*)QTagUid_tagSocketFd},
+ { "native_untagSocketFd", "(Ljava/io/FileDescriptor;)I", (void*)QTagUid_untagSocketFd},
+ { "native_setCounterSet", "(II)I", (void*)QTagUid_setCounterSet},
+ { "native_deleteTagData", "(II)I", (void*)QTagUid_deleteTagData},
+};
+
+int register_android_server_NetworkManagementSocketTagger(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "com/android/server/NetworkManagementSocketTagger", gQTagUidMethods, NELEM(gQTagUidMethods));
+}
+
+};
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 395e417aee39..e542a4717b88 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -477,19 +477,21 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
#if RTL_USE_HARFBUZZ
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
- value = TextLayoutCache::getInstance().getValue(paint, text, 0, count, count, flags);
+ value = TextLayoutCache::getInstance().getValue(paint, text, count, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;
}
#else
value = new TextLayoutCacheValue();
- value->computeValues(paint, text, 0, count, count, flags);
+ value->computeValues(paint, text, count, flags);
#endif
- const jchar* glyphArray = value->getGlyphs();
- int glyphCount = value->getGlyphsCount();
- int bytesCount = glyphCount * sizeof(jchar);
- renderer->drawText((const char*) glyphArray, bytesCount, glyphCount, x, y, paint);
+ size_t startIndex = 0;
+ size_t glyphsCount = 0;
+ value->getGlyphsIndexAndCount(0, count, &startIndex, &glyphsCount);
+ const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount);
+ int bytesCount = glyphsCount * sizeof(jchar);
+ renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint);
#else
const jchar *workText;
jchar* buffer = NULL;
@@ -507,19 +509,21 @@ static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
#if RTL_USE_HARFBUZZ
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
- value = TextLayoutCache::getInstance().getValue(paint, text, start, count, contextCount, flags);
+ value = TextLayoutCache::getInstance().getValue(paint, text, contextCount, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;
}
#else
value = new TextLayoutCacheValue();
- value->computeValues(paint, text, start, count, contextCount, flags);
+ value->computeValues(paint, text, contextCount, flags);
#endif
- const jchar* glyphArray = value->getGlyphs();
- int glyphCount = value->getGlyphsCount();
- int bytesCount = glyphCount * sizeof(jchar);
- renderer->drawText((const char*) glyphArray, bytesCount, glyphCount, x, y, paint);
+ size_t startIndex = 0;
+ size_t glyphsCount = 0;
+ value->getGlyphsIndexAndCount(start, count, &startIndex, &glyphsCount);
+ const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount);
+ int bytesCount = glyphsCount * sizeof(jchar);
+ renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint);
#else
uint8_t rtl = flags & 0x1;
if (rtl) {
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
index 671ca318da41..52a9800130a6 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
index b024da420760..49a2aeb42313 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
index cba1ff5da67f..e6ebb43fbcec 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
index 62537b0e19c8..7069fc5b5623 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
index 5d559e114879..ec2a7e30f014 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
index 5041ff99309d..486334f7c8a6 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo.png b/core/res/res/drawable-hdpi/btn_check_on_holo.png
index 4c1bfbcb27ab..1f11a7867580 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
index 3492b8a1fc48..a17100cf5007 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
index 49e837c6e5b2..130ab4f24596 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
index 0d4e8b30ab13..96abcda92024 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
index c4283b65b7f1..0a22f02a9cd4 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
index 94098902e928..28b25781b7da 100644
--- a/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
index 55acc9ae968d..66cb1eca1c05 100644
--- a/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
index 34762f8cc252..824b45ac7d4b 100644
--- a/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
index 34762f8cc252..824b45ac7d4b 100644
--- a/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
index 0d2eb4b990d5..34ec825d9e6c 100644
--- a/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
index 7de8d9be4ca6..f7680ab862db 100644
--- a/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
index 3c1001495999..8906c4d86c15 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
index 93177761c23c..2bcb98ede035 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
index 8e92f715bb38..2e36821d5300 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
index 54ec8ee7cb2f..6a50bd82dada 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
index cdb1f71f37eb..8595dd0025f5 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
index ff7848decff6..1dda090f8afd 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
index 98705f777cf6..942722e29582 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
index 0d3147f579ae..e46f035313ad 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
index 01c54e69e95b..5cfe146716ae 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
index fe3225fcb7b8..20d0eb3c0bec 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
index c25fe90dff81..3b478d63375d 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
index 4185d719cbe8..52a9f442ea9b 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
index e95f4ab965d5..9810029e50f1 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
index 7ed0fab91897..445af7bd35a0 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
index c9e99e8237c2..d3884f618b96 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
index f8a36b331747..eea174aacd86 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
index 8bfd65abd214..fecb1afc7686 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
index ba942947e84b..58b2b0989364 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
index 9112ed6b455f..a39a6200b7ed 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
index a29f69eb4463..1ffe7fe2c5a6 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png b/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
index a529487092c8..3dfe6c2eea81 100644
--- a/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png b/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
index e3641b5a8d59..ea38ebbb390c 100644
--- a/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_angel.png b/core/res/res/drawable-hdpi/emo_im_angel.png
index e9d4983647ce..2cbb7dacedb4 100644
--- a/core/res/res/drawable-hdpi/emo_im_angel.png
+++ b/core/res/res/drawable-hdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_cool.png b/core/res/res/drawable-hdpi/emo_im_cool.png
index c8464b59c28a..3813bc6a278f 100644
--- a/core/res/res/drawable-hdpi/emo_im_cool.png
+++ b/core/res/res/drawable-hdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_crying.png b/core/res/res/drawable-hdpi/emo_im_crying.png
index 94a2b9a826c1..3982d7052f75 100644
--- a/core/res/res/drawable-hdpi/emo_im_crying.png
+++ b/core/res/res/drawable-hdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_embarrassed.png b/core/res/res/drawable-hdpi/emo_im_embarrassed.png
index fe9138db8bac..982f0ae215f0 100644
--- a/core/res/res/drawable-hdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-hdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
index 98471773d6f9..d40fb90d7ff2 100644
--- a/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_happy.png b/core/res/res/drawable-hdpi/emo_im_happy.png
index eba9debca83b..f1e47237f579 100644
--- a/core/res/res/drawable-hdpi/emo_im_happy.png
+++ b/core/res/res/drawable-hdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_kissing.png b/core/res/res/drawable-hdpi/emo_im_kissing.png
index ff19711a312f..21e5d304fd13 100644
--- a/core/res/res/drawable-hdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-hdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_laughing.png b/core/res/res/drawable-hdpi/emo_im_laughing.png
index b1d4d6a02ae1..03aa60a7794c 100644
--- a/core/res/res/drawable-hdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-hdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
index e47cf2ae8b98..14edaeb8e8e5 100644
--- a/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_money_mouth.png b/core/res/res/drawable-hdpi/emo_im_money_mouth.png
index 82f80f25e3d1..957bc906bfd8 100644
--- a/core/res/res/drawable-hdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-hdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_sad.png b/core/res/res/drawable-hdpi/emo_im_sad.png
index b5959ec8bac6..bcfe71b4c5d7 100644
--- a/core/res/res/drawable-hdpi/emo_im_sad.png
+++ b/core/res/res/drawable-hdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_surprised.png b/core/res/res/drawable-hdpi/emo_im_surprised.png
index dbe1c3873bcf..961a9bbfcfcf 100644
--- a/core/res/res/drawable-hdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-hdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
index fb5f9adf0887..7a1235c78596 100644
--- a/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_undecided.png b/core/res/res/drawable-hdpi/emo_im_undecided.png
index b7edef7086f2..72bf2f2eddbd 100644
--- a/core/res/res/drawable-hdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-hdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_winking.png b/core/res/res/drawable-hdpi/emo_im_winking.png
index 6fe1027dea42..b8fd6d9e32bd 100644
--- a/core/res/res/drawable-hdpi/emo_im_winking.png
+++ b/core/res/res/drawable-hdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_wtf.png b/core/res/res/drawable-hdpi/emo_im_wtf.png
index 1d4a99bfd9e8..b22179523d5a 100644
--- a/core/res/res/drawable-hdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-hdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_yelling.png b/core/res/res/drawable-hdpi/emo_im_yelling.png
index 99d694ba7b76..59798cbe0fae 100644
--- a/core/res/res/drawable-hdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-hdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
index 6bb4d1e691d0..73ff79fd9ddb 100644
--- a/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_close_holo_light.9.png b/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
index 3fb3eb1bbb47..290c24d77ab4 100644
--- a/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
index a679da5b391b..754032eb5bbb 100644
--- a/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_open_holo_light.9.png b/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
index 175ce17ffd50..e32c7c74a856 100644
--- a/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
index 0a1bca862400..769cb125f4b1 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
index fd5b18d1c3b1..c5372a81f280 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
index 97d61f43c069..1dee51b5c385 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
index 9afd6ab99752..3c1e25adc194 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
index 5cd1ac7b51ab..707414d059f0 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
index 5cd1ac7b51ab..707414d059f0 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
index 9a7e5aeca66a..4d810dd50823 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
index 9a7e5aeca66a..64fa147a87d4 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_ring_notif.png b/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
index 1df685865dbd..a89f45f5b970 100644
--- a/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
index fae02f9a765a..d03badea7849 100644
--- a/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_input_delete.png b/core/res/res/drawable-hdpi/ic_input_delete.png
index f35f89f69000..5d638bd511ed 100644
--- a/core/res/res/drawable-hdpi/ic_input_delete.png
+++ b/core/res/res/drawable-hdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
index 639529489422..683a57510e91 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
index 74fda0f31a14..bdece9fc942f 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
index 1558a0a9c177..6a8ab241718d 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
index 0ccf36189085..f2fceaabc6d1 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
index 14a684e93354..e005ffc18c03 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png
index 1b7f499aa7de..f41ad95abb58 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png b/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
index 399aa1cdba80..98ab6e919c6a 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
index b79dbbaa2606..651b83709aa4 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
index 86325458d7a6..babab1d22381 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
index e25c7a0db9db..d000866c8502 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
index 701fa42b5c3a..82133d02a259 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png b/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
index c8de3a31995f..26df6b2a87a2 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
index e3009436ca44..9e36918974d6 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index da7734014a07..000000000000
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
index 7db46c1a8c86..39608932b3e6 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_embed_play.png b/core/res/res/drawable-hdpi/ic_media_embed_play.png
index 23ac7e45e426..05778c181f6f 100644
--- a/core/res/res/drawable-hdpi/ic_media_embed_play.png
+++ b/core/res/res/drawable-hdpi/ic_media_embed_play.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_notification_ime_default.png b/core/res/res/drawable-hdpi/ic_notification_ime_default.png
index ac598190a0b8..369c88d31707 100644
--- a/core/res/res/drawable-hdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-hdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_suggestions_add.png b/core/res/res/drawable-hdpi/ic_suggestions_add.png
new file mode 100644
index 000000000000..79c017ac498e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_suggestions_add.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_suggestions_delete.png b/core/res/res/drawable-hdpi/ic_suggestions_delete.png
new file mode 100644
index 000000000000..1ae6b96f3683
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_suggestions_delete.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 6560696c8edf..000000000000
--- a/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
index 237011c16b44..28b25781b7da 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
index 24180178097d..545cc09c036d 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
index 2120bad70380..9176b3372c4c 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
index 30b3a4d4dc6d..fb34a6deab6c 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
index 0e8ac15b284e..87b2ad67cfea 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
index 762e4b07be7f..1655feacd3c4 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
index 4d3dc683e7fe..61cfe7a24887 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
index fcf3565bee3b..43e2e89fbd77 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
index 12fb9701d9b7..7d80ff6e748f 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
index a82fd1732965..cc21a1c9ff29 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
index a82fd1732965..cc21a1c9ff29 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
index 32845065ab13..3c9c192d8c34 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
index 6afc2d09efd6..6511cd20e4c1 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
index e414e330c004..7b135ea67912 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
index e414e330c004..7b135ea67912 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
index 828c07962271..b6a85a2f66af 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
index e7e22c3862a7..50d979e86143 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
index a2a773b8a467..608dd529f17f 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
index 0b1b1893bf5f..96ff781a213d 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
index ca12894242cf..a48bf2e58c88 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
index 52f8b38d9c59..b69589b21517 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
index 5f9411ab9039..5adfb04fb890 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
index 5f9411ab9039..5adfb04fb890 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
index cdc1775dfb65..ff34463d12db 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
index b4981d45ddb5..0bcfd67e913e 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
index e124a1868b55..00092cc83db6 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
index e124a1868b55..00092cc83db6 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
index 416b456ba425..1b4fed88c462 100644
--- a/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png b/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
index ddd242ba8d0c..c8b3177ceabd 100644
--- a/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/presence_away.png b/core/res/res/drawable-hdpi/presence_away.png
index b25b8212eef8..fe5b880f49af 100644
--- a/core/res/res/drawable-hdpi/presence_away.png
+++ b/core/res/res/drawable-hdpi/presence_away.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png
index 1d33e47591fb..bf3cabb6395d 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png
index 81fe0850bf5b..c4f00be47d59 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png
index cf864d231414..935e44ff5940 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png
index 583e0c920d57..03ae28be2a39 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png
index 357b66035055..b68981f24239 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png
index 0add340610c5..678b7726f558 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png
index e1a8a63fdb3e..0aeb0a6cda4f 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png
index 934d6d17a3a5..1bd731270537 100644
--- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png
+++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
index 64eee9345e8d..e3131b115503 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
index 8817efe997c9..cdc94a135bec 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
index 5a447880c11f..d83522ac67bc 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
index d47f63a8a25c..2af7814d1aef 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
index 947ac178aac8..e4b766d72456 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
index 6b2588d55bd3..edd264a37281 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
index 4a02a23cfff1..65f673d762d8 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
index e73bdcca02a7..3ff3bbd60410 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
index e96936c28590..b8bca18154c7 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
index 76b9c189d0e0..ce9fc2502714 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
index cfcf62928c90..1b7fe776ca1d 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
index a7d5af8a8252..a6fdcff49c2f 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
index 946cdfdc51c0..4fb14f934afd 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
index d046838760c1..667b8e280789 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
index 6f1ffe874d73..e19cf7aa4e9c 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
index 6286fcd85afc..8886006d0176 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
index a53b62727e58..bc5d3dba0d12 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
index dc102a99058a..104100844c75 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
index e0f55bf2d694..d4b3209e2162 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
index 7b264f147308..ec7303e12e39 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
index c3a5f7dc2a5c..19526fee8648 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
index 6fa4e00b90b0..e8f9eefbe00b 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_16_inner_holo.png b/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
index b59b492576b7..01669381af25 100644
--- a/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_16_outer_holo.png b/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
index 57b8b31ec6d3..ffdb78af9040 100644
--- a/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_20_inner_holo.png b/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
index 14d26a5818d8..ffad7209e470 100644
--- a/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_20_outer_holo.png b/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
index e457a6685094..f2523f4b0c17 100644
--- a/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_48_inner_holo.png b/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
index 86c036d7a7d6..f8e3fef633cc 100644
--- a/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_48_outer_holo.png b/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
index ddd3e74cad87..04c5fb5a26ee 100644
--- a/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_76_inner_holo.png b/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
index 74e7e2ed2886..a28a6d1607c8 100644
--- a/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_76_outer_holo.png b/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
index 989a18c0bc36..3d5aa46b7f58 100644
--- a/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
index 3128fd9278ce..51a5226b644e 100644
--- a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
index 924a93b7a4e0..a24da9104e03 100644
--- a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_notify_error.png b/core/res/res/drawable-hdpi/stat_notify_error.png
index dbaf94433b45..deb38726301b 100644
--- a/core/res/res/drawable-hdpi/stat_notify_error.png
+++ b/core/res/res/drawable-hdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
index 716ba9da439c..f3aaa276fc8a 100644
--- a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_adb.png b/core/res/res/drawable-hdpi/stat_sys_adb.png
index 8e15aba2c69a..ddb8a71d76fe 100644
--- a/core/res/res/drawable-hdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-hdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
index e65f21a3f54f..e88681261aa3 100644
--- a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
index 76c54841f073..3e92cf0ede3a 100644
--- a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
index 80a7ef1d9bd1..962cefb380fb 100644
--- a/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
index bd11555ae568..e05b345f0e2c 100644
--- a/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
index 1fba7ee14b44..933d99b6796c 100644
--- a/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
index 5a484dfc8c68..7abe99a5f544 100644
--- a/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
index 152c33889d47..0bce7679a709 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
index 9c44d4b77750..3b9c048cbd28 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
index cb456485fac8..a4bd07454f4c 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
index 13dd09aeffb4..587bf4e5c836 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
index e72f42853938..a86be03cad88 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
index 84504eb4e053..e3b0729e34fc 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
index 44a4baa4cc16..4b56420a0a0a 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
index 5c5ee814c304..741674d5218c 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_bottom_holo.9.png b/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
index 9286c7a93e8e..8abf2baeb886 100644
--- a/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
+++ b/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus.9.png b/core/res/res/drawable-hdpi/tab_focus.9.png
index 89a1c0bcb27c..8862fc72615e 100644
--- a/core/res/res/drawable-hdpi/tab_focus.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
index e879e37808e7..7f40d36703fd 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
index e879e37808e7..7f40d36703fd 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press.9.png b/core/res/res/drawable-hdpi/tab_press.9.png
index 4c34188426b2..4650d6828453 100644
--- a/core/res/res/drawable-hdpi/tab_press.9.png
+++ b/core/res/res/drawable-hdpi/tab_press.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
index c5f44f3ece38..b43c592932c0 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
index c5f44f3ece38..b43c592932c0 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_pressed_holo.9.png b/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
index 2adb22ca101e..6d057358eb6e 100644
--- a/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
+++ b/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected.9.png b/core/res/res/drawable-hdpi/tab_selected.9.png
index 46a331f5a159..d5d3cee6fc01 100644
--- a/core/res/res/drawable-hdpi/tab_selected.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
index 53efbb4b7d87..c1f950c95355 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
index 53efbb4b7d87..c1f950c95355 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_unselected.9.png b/core/res/res/drawable-hdpi/tab_unselected.9.png
index 74181af4b43c..cdc7a4ad2aa9 100644
--- a/core/res/res/drawable-hdpi/tab_unselected.9.png
+++ b/core/res/res/drawable-hdpi/tab_unselected.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_left.png b/core/res/res/drawable-hdpi/text_select_handle_left.png
index e980857544ef..5adc2e119fd6 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_middle.png b/core/res/res/drawable-hdpi/text_select_handle_middle.png
index 603f497dd4ac..b7a472a76fa9 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_right.png b/core/res/res/drawable-hdpi/text_select_handle_right.png
index a5efe304f806..cf94179ef0e3 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/vpn_connected.png b/core/res/res/drawable-hdpi/vpn_connected.png
index 65fc6db787bf..c3547e855744 100644
--- a/core/res/res/drawable-hdpi/vpn_connected.png
+++ b/core/res/res/drawable-hdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/vpn_disconnected.png b/core/res/res/drawable-hdpi/vpn_disconnected.png
index 2440c6909ef5..10a9065cabdd 100644
--- a/core/res/res/drawable-hdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-hdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 0bc86c36a70a..000000000000
--- a/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 9c8610fce53f..000000000000
--- a/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_adb.png b/core/res/res/drawable-ldpi/stat_sys_adb.png
index aec8d90238fe..86b945b5f16b 100644
--- a/core/res/res/drawable-ldpi/stat_sys_adb.png
+++ b/core/res/res/drawable-ldpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
index 5435438399c3..ac83494fff86 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
index b350144ead23..6c247a820a3e 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
index 5010bffac72f..7710165da106 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
index 20f8d3d4951b..15d0c803a4b8 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
index 96a9548ff34c..f1d8aec579bf 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
index 8871519ddd93..0d95a00ffddd 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo.png b/core/res/res/drawable-mdpi/btn_check_on_holo.png
index 38ab51ac8c30..2737d8c858e1 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
index 4738e5ab8e8b..4dd94529f9fb 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
index db93b6d01bb9..38abce61f6b8 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
index b47b5dde63e6..b70db89b26a2 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
index ad6947ad8d93..21d54a627786 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_default.png b/core/res/res/drawable-mdpi/btn_code_lock_default.png
index f524317d33f8..206f9b3bc3b7 100755..100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_default.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
index 82fc3b2d331f..4c4adf2cfe34 100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_touched.png b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
index 5cd436c0b889..98a3b6d5a928 100755..100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_touched.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
index d1fe1adb6550..ef701ed67d1c 100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
index 290b9776963e..db2eae1dff94 100644
--- a/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
index 290b9776963e..db2eae1dff94 100644
--- a/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
index ffc11b78201e..67b5e4ee757b 100644
--- a/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
index 8b5d036ef486..154726710e0a 100644
--- a/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
index ebea1db0906d..816e14615bde 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
index 761c9361a351..4f4eff2270e8 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
index c505d3d659ea..afaa8ca8d666 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
index 99a71ef3a03e..b7d90791e841 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
index 3c48fa10e16f..994eb0c90afb 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
index c1923e4cb02e..f4a1cbc321ac 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
index 08f4ca7b567e..79ca527b9e43 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
index 5696511feef3..33d130828d0e 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
index b090127e916c..9672415371c6 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
index 9f46b757178a..94d3784d5a70 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
index b4bf9c9bb23c..9f3ce4efcdd1 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
index 98c176cfbcb5..05563bffe827 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
index 16708fd40baa..ee166bc09fd2 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
index 9e946db549e7..4bc4a30bd4f1 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
index 875ec01baebd..dd14aec49268 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
index a72fe324d36a..becc09132876 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
index 545899a14014..e49dbab41c42 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
index aca83b03bf29..61837f842549 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
index 2ff492eb650c..19f139f0c6aa 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
index 816af011b9c4..9fed6b5a7bfe 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
index 66ea0c75156d..d52dbb7e57f4 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
index 3ffc6ca0038d..c0c6b49e7da2 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
index e580075b0eb8..237f7e7dc547 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
index 20d4ab4232ef..2f1f004001f2 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
index b31449576cdd..4bea36bff24a 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_angel.png b/core/res/res/drawable-mdpi/emo_im_angel.png
index 297fcf0f0e50..3efea42df152 100644
--- a/core/res/res/drawable-mdpi/emo_im_angel.png
+++ b/core/res/res/drawable-mdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_cool.png b/core/res/res/drawable-mdpi/emo_im_cool.png
index 9ee1d5dda643..650ed8f62feb 100644
--- a/core/res/res/drawable-mdpi/emo_im_cool.png
+++ b/core/res/res/drawable-mdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_crying.png b/core/res/res/drawable-mdpi/emo_im_crying.png
index 42ec8db47d12..ad1e50f585a6 100644
--- a/core/res/res/drawable-mdpi/emo_im_crying.png
+++ b/core/res/res/drawable-mdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_embarrassed.png b/core/res/res/drawable-mdpi/emo_im_embarrassed.png
index 048f4b1363e0..8a343213f03f 100644
--- a/core/res/res/drawable-mdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-mdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
index db5c801e4204..9607ff735312 100644
--- a/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_happy.png b/core/res/res/drawable-mdpi/emo_im_happy.png
index e85af7db84dd..a32472096452 100644
--- a/core/res/res/drawable-mdpi/emo_im_happy.png
+++ b/core/res/res/drawable-mdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_kissing.png b/core/res/res/drawable-mdpi/emo_im_kissing.png
index 6c2458c57c3b..f18a391b3e2c 100644
--- a/core/res/res/drawable-mdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-mdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_laughing.png b/core/res/res/drawable-mdpi/emo_im_laughing.png
index 268c8642eb32..963a4ba68f77 100644
--- a/core/res/res/drawable-mdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-mdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
index a838158cdead..58bd1387aeac 100644
--- a/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_money_mouth.png b/core/res/res/drawable-mdpi/emo_im_money_mouth.png
index 56fcce4be7f4..718c7e3a63cf 100644
--- a/core/res/res/drawable-mdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-mdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_sad.png b/core/res/res/drawable-mdpi/emo_im_sad.png
index c5245cc6c26c..7daac6c0e39b 100644
--- a/core/res/res/drawable-mdpi/emo_im_sad.png
+++ b/core/res/res/drawable-mdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_surprised.png b/core/res/res/drawable-mdpi/emo_im_surprised.png
index 231ccb1f606a..b4b614dc55de 100644
--- a/core/res/res/drawable-mdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-mdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
index 93847189758f..9fa6534c90f7 100644
--- a/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_undecided.png b/core/res/res/drawable-mdpi/emo_im_undecided.png
index 9927af90f9ba..8b2577af738b 100644
--- a/core/res/res/drawable-mdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-mdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_winking.png b/core/res/res/drawable-mdpi/emo_im_winking.png
index a9b39bd3aa90..069e9e33f95d 100644
--- a/core/res/res/drawable-mdpi/emo_im_winking.png
+++ b/core/res/res/drawable-mdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_wtf.png b/core/res/res/drawable-mdpi/emo_im_wtf.png
index 17806523e089..0d963ec826bf 100644
--- a/core/res/res/drawable-mdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-mdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_yelling.png b/core/res/res/drawable-mdpi/emo_im_yelling.png
index 18e47153e42f..836f60f68bd2 100644
--- a/core/res/res/drawable-mdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-mdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
index 6fa069fac957..036ffb7bbd98 100644
--- a/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_close_holo_light.9.png b/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
index b9067933008e..9f9dd7013c7a 100644
--- a/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
index 5c7fa382727c..867f36d1d7d4 100644
--- a/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_open_holo_light.9.png b/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
index c392ecbfef4d..7f5ca483c59f 100644
--- a/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
index b3fd908915d5..94b944d0705c 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
index a64d4d1a2fb1..987c097065c0 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
index 6469fcaafef6..8d87032affe1 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
index fca2e25a78e9..b29042a30276 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
index 55f17c2f5cca..eb2b8bdc2224 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
index 55f17c2f5cca..eb2b8bdc2224 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
index 34e126b26625..6fb59b6f47ca 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
index 34e126b26625..1a63f5dfc316 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_ring_notif.png b/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
index b9b7c7b79a32..1ce4f52d36dc 100644
--- a/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
index cbe5021fa6ab..cb17415d4aa3 100644
--- a/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_input_delete.png b/core/res/res/drawable-mdpi/ic_input_delete.png
index ee4c911349aa..47c8708782a2 100644
--- a/core/res/res/drawable-mdpi/ic_input_delete.png
+++ b/core/res/res/drawable-mdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
index 754d7bc830e5..1d547e118c5b 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
index 0d3f756cb99a..68409c5b37f9 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index 6f51447744a2..000000000000
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
index dd255f57c7ee..52866f258e32 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_embed_play.png b/core/res/res/drawable-mdpi/ic_media_embed_play.png
index fc5d8c622f6a..3576ce53e421 100644
--- a/core/res/res/drawable-mdpi/ic_media_embed_play.png
+++ b/core/res/res/drawable-mdpi/ic_media_embed_play.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_ff.png b/core/res/res/drawable-mdpi/ic_media_ff.png
index 892772eb13e4..170dd2daaa75 100644
--- a/core/res/res/drawable-mdpi/ic_media_ff.png
+++ b/core/res/res/drawable-mdpi/ic_media_ff.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_fullscreen.png b/core/res/res/drawable-mdpi/ic_media_fullscreen.png
index 1c60e1586477..960aa851053e 100644
--- a/core/res/res/drawable-mdpi/ic_media_fullscreen.png
+++ b/core/res/res/drawable-mdpi/ic_media_fullscreen.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_next.png b/core/res/res/drawable-mdpi/ic_media_next.png
index bbe311b76fda..a6feed0e9e38 100644
--- a/core/res/res/drawable-mdpi/ic_media_next.png
+++ b/core/res/res/drawable-mdpi/ic_media_next.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_pause.png b/core/res/res/drawable-mdpi/ic_media_pause.png
index e4e8d86b62a6..548ba0219311 100644
--- a/core/res/res/drawable-mdpi/ic_media_pause.png
+++ b/core/res/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_play.png b/core/res/res/drawable-mdpi/ic_media_play.png
index 8eaf96240ed2..0fe680647e94 100644
--- a/core/res/res/drawable-mdpi/ic_media_play.png
+++ b/core/res/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_previous.png b/core/res/res/drawable-mdpi/ic_media_previous.png
index e9abc7f3bd81..0163d094596d 100644
--- a/core/res/res/drawable-mdpi/ic_media_previous.png
+++ b/core/res/res/drawable-mdpi/ic_media_previous.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_rew.png b/core/res/res/drawable-mdpi/ic_media_rew.png
index a5eb94a25460..5489180eb16e 100644
--- a/core/res/res/drawable-mdpi/ic_media_rew.png
+++ b/core/res/res/drawable-mdpi/ic_media_rew.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_notification_ime_default.png b/core/res/res/drawable-mdpi/ic_notification_ime_default.png
index 67269e824947..7d97eb575f2a 100644
--- a/core/res/res/drawable-mdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-mdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_suggestions_add.png b/core/res/res/drawable-mdpi/ic_suggestions_add.png
new file mode 100644
index 000000000000..f91951b6e47c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_suggestions_add.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_suggestions_delete.png b/core/res/res/drawable-mdpi/ic_suggestions_delete.png
new file mode 100644
index 000000000000..98eb56538872
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_suggestions_delete.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 7ddeba529748..000000000000
--- a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
index f6d9f1bf7986..05c194bf63e2 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
index a627cda96b02..4c4adf2cfe34 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
index b7262d17ff1e..8f24832f1149 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
index 308624bce110..cb5b31a06457 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
index 6c451ec5389a..843474124846 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
index 0329d5855832..1f29da2a25f5 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
index d17ca1c095b6..a27f5aac026f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
index c41e4b863b24..34268af0076e 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
index 846c2e8af797..304f800edae3 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
index 5543ac6979c1..583542b41f41 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
index 65e7c87fe9ee..d15bd16bc99f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
index 50a4167f4878..9a5d79f9d9db 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
index 50a4167f4878..9a5d79f9d9db 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
index 025b27e837fb..8051d64610b5 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
index 7dd30e983fde..bcd34e95d6c1 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
index 25c22b6b6daf..cf4bdb6f9bcc 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
index 25c22b6b6daf..cf4bdb6f9bcc 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
index c32596ce3321..0535ff7a8f25 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
index 4b862657640a..360284d48114 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
index e47ff9c3c091..1e0e92c9a296 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
index b5e32d8e1107..14bcce93e556 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
index 543d3e3486b8..6ed2cf01081a 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
index 6b395ddc568d..015a8cf9dc65 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
index f0cd69fb54ec..8bb44f2eead8 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
index f0cd69fb54ec..8bb44f2eead8 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
index bf8136c6950b..6ab5f231d3ed 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
index 2c2bef35c03b..65ec302ac586 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
index 394f063a0272..34d3228b320f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
index 394f063a0272..34d3228b320f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
index c64da8d0e712..8c51b013d22c 100644
--- a/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/popup_inline_error.9.png b/core/res/res/drawable-mdpi/popup_inline_error.9.png
index 2d62071ad29a..17fbe4a690d9 100644
--- a/core/res/res/drawable-mdpi/popup_inline_error.9.png
+++ b/core/res/res/drawable-mdpi/popup_inline_error.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
index a318891f258c..1d9381740b44 100644
--- a/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
+++ b/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png
index 4cab1a15ea2c..1e5d956c8fd1 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png
index 2692bd17f6d7..d0c0200f120e 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png
index d83cad902dc9..bfdc5ea503f1 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png
index 4ef84a11e344..1440bc8b4877 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png
index f661b11bb3cc..4f645fa80217 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png
index 69df8e0ff065..21966fdbd41e 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png
index c34f0a5f7442..7ca15ed78637 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png
index 2258b202eb8c..369d0ace8a52 100644
--- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png
+++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
index 593af6e7c3f7..dac51dfd7882 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
index 3dc3aed1a5e5..441dbf7b7b72 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
index 3650f003c099..cde1fb934fbe 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
index 107e0fb34085..8ecf0f95be02 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
index 2b9d79dfa558..0674db311627 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
index c1196838e299..01179196e5cf 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
index 7dc749db5be7..f2ce7abeea02 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
index 22e2a6692b48..48bcf85518e3 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
index 24adc5bfc298..d2e7ab696fc0 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
index d309d27981ba..69824eb8a87f 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
index af8c4740727c..b3b801675db7 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
index 9f030769eb13..84ca715cebf7 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
index 6b5f41cb5bf5..56a62d2f710c 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
index db84cc71bec3..83b7c1ca8987 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
index 6819f81c7e56..b70244b99b8c 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
index 8b45582a56f9..bb5c08cedf33 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
index 25f6df840b4c..444e88207d6f 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
index 0d34be92a139..7dba5290d90c 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
index a035f6f44bca..6f58ef0a1cf8 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
index 5c9720fb0593..3d8f1347d3c9 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
index 2497716c56e9..d480c550cf53 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
index 5fc3ca23974f..6a414fa006b7 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_16_inner_holo.png b/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
index c0f1b2052832..eeef0c834acf 100644
--- a/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_16_outer_holo.png b/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
index 0492a629ff75..7cc2b54b4894 100644
--- a/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_20_inner_holo.png b/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
index 5e141d835f61..4569faedaeba 100644
--- a/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_20_outer_holo.png b/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
index 07ba3f38e5d8..9287dd7c87b2 100644
--- a/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_48_inner_holo.png b/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
index 8c27069a08c4..9458668f0230 100644
--- a/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_48_outer_holo.png b/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
index d5f04903dd3f..4ce73edce72e 100644
--- a/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_76_inner_holo.png b/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
index 3e263e83840f..cba1300d3a8f 100644
--- a/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_76_outer_holo.png b/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
index 6eb6d10ab7e2..99a5ebbfa69d 100644
--- a/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
index dda29986727a..6255e2eb9c61 100644
--- a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
index 951301dfa062..1085248704ab 100644
--- a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_error.png b/core/res/res/drawable-mdpi/stat_notify_error.png
index 168f8f6ff88e..78d59aa1c12c 100644
--- a/core/res/res/drawable-mdpi/stat_notify_error.png
+++ b/core/res/res/drawable-mdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
index 3bf0d3560156..747cb97a5a36 100644
--- a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_adb.png b/core/res/res/drawable-mdpi/stat_sys_adb.png
index ebedfa3137a5..730d96f7acc9 100644
--- a/core/res/res/drawable-mdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-mdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
index b8dd5450a2bc..a161b03a05b3 100644
--- a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
index 11b84265fb5f..c637dd1e55e9 100644
--- a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
index c9481fa4efb1..680d1a06a672 100644
--- a/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
index eb08c872ef74..70da7b343682 100644
--- a/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
index 429d73de7ab0..b5582b553cc9 100644
--- a/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
index 693ee3311903..a2af2b5e2001 100644
--- a/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
index bf4b1617e32e..3d786c01a66a 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
index 45359935bc32..2bad2b8f2df8 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
index c56f49dc78df..f6ed0bf0af0d 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
index 5272f08f4e96..a430b7782f13 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
index 9b7380461fde..6312c599e380 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
index bcd503f8e80c..208672267053 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
index 9c948a5c98b2..e44b1d819b14 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
index b035f427c5a8..ee7e37b06d26 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/tab_selected_v4.9.png b/core/res/res/drawable-mdpi/tab_selected_v4.9.png
index 3c1c4ebca4b4..e8e112a5a7e6 100644
--- a/core/res/res/drawable-mdpi/tab_selected_v4.9.png
+++ b/core/res/res/drawable-mdpi/tab_selected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/tab_unselected_v4.9.png b/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
index bb383371a10e..229f5037ae39 100644
--- a/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
+++ b/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_left.png b/core/res/res/drawable-mdpi/text_select_handle_left.png
index 0c3a0ccfc797..750cdea505da 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_middle.png b/core/res/res/drawable-mdpi/text_select_handle_middle.png
index f488bdd2d924..3cdca907c958 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_right.png b/core/res/res/drawable-mdpi/text_select_handle_right.png
index d3880c6ce620..fc3d14497fdb 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/vpn_connected.png b/core/res/res/drawable-mdpi/vpn_connected.png
index 0d1a0262154d..7e167f84dfa4 100644
--- a/core/res/res/drawable-mdpi/vpn_connected.png
+++ b/core/res/res/drawable-mdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/vpn_disconnected.png b/core/res/res/drawable-mdpi/vpn_disconnected.png
index d16d7fbd1db0..a08c42a2702a 100644
--- a/core/res/res/drawable-mdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-mdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png
new file mode 100644
index 000000000000..cc46f19b19b2
--- /dev/null
+++ b/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/platlogo.png b/core/res/res/drawable-nodpi/platlogo.png
index faabda158a9b..e619ed59bf1e 100644
--- a/core/res/res/drawable-nodpi/platlogo.png
+++ b/core/res/res/drawable-nodpi/platlogo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disable.png b/core/res/res/drawable-xhdpi/btn_check_on_disable.png
index 179f191c8e71..11917b5fe54d 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
index 02e4254d2d7a..041663af8e18 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
index 7e61802c8e3b..ca0dadbfe2a4 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
index cc6326e7e46b..4960b5799501 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
index f468781a07bc..ce1dd23554c4 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
index 1e2536416aaf..0a31fbcdd5d8 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
index fc1af9f8128a..62f6336cce74 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo.png b/core/res/res/drawable-xhdpi/btn_check_on_holo.png
index 75f66521e81a..65dd58d7fa58 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
index c327f56b57c5..dc2379c942af 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
index 74a2ea343a3f..cbb26fd822b3 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
index f84a5b040635..995775e67400 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
index 48a6431f3456..9c160affd7dd 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
index 5defddfe322b..eb8521825363 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_selected.png b/core/res/res/drawable-xhdpi/btn_check_on_selected.png
index 963c68ea9e9f..a46f2f4f0266 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_default.png b/core/res/res/drawable-xhdpi/btn_code_lock_default.png
index a644014d58b6..c1358a21ad74 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_default.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
index f6072516b8c8..db1cbe6ca16c 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_touched.png b/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
index 67faad25eb90..0fafc3ef0436 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
index e057cdd51c59..073c3ac91296 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_normal.9.png
index 4ca0b374b4f0..708090584023 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png b/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
index f7af2a477302..704bb554f391 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png b/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
index ab7084ec6b0e..7f64c753f00a 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_pressed.9.png b/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
index 02f5bb82704a..849cd48e62d2 100644
--- a/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_selected.9.png b/core/res/res/drawable-xhdpi/btn_default_selected.9.png
index 0375a18e011e..2be8da670761 100644
--- a/core/res/res/drawable-xhdpi/btn_default_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
index d3680731e02c..5b7a3bdb1e5f 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
index 6d1eb481efbf..36cbd3e5f08d 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
index f4783d4e06c3..3ce0038d3bc8 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png b/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
index 0df43d7d7a09..5874b8c7f14f 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
index 44123463f3f3..fb2fbf5e4431 100644
--- a/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
index 0e0e0d15193c..1e4cec3de39a 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
index a47ad5a6df5d..aab7658d373f 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
index a3851a85e4f1..4a1ddf3fd2f1 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
index 80e4d0410cc1..cdae834e2e0a 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
index ef9262fca75e..981cad99fcd0 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
index 6715afddd4f9..22522931fcb5 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
index 8ffddcf25dcc..4db7078bfd19 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
index 5a52bbc07431..04e7ea127cd6 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
index 77c6d7822070..95e91e8fe58e 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
index ed73f09ab9f7..cdd47d584a53 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
index 08021f99672b..1f3a6b3c08fe 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
index 41c8ccb2954b..2a9b6f49ef05 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
index 546ccbc43b48..096d6e9e9f2a 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
index 802b22eb846b..20852d654b6c 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
index d317f94bd798..271c6b41621f 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
index 80b50a11199f..e72ec794fb74 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
index 76202a4dd684..e08dcc508095 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
index e9b2d7e1bd89..fd512d9cf011 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
index 8db4f8e20739..b18642d58c85 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
index b835a07248ed..134c4a9fe6d1 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
index 07cb53c08c8a..0a12dc991a88 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
index d3ccef89098d..35ad67cf324b 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
index c553c58e6501..2f9af47261ea 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
index f478c4694df8..d3c770930d37 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
index ea5e50999f14..0c4f0da112c4 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
index a46f0edebc91..2e2f587d08e6 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off.png b/core/res/res/drawable-xhdpi/btn_star_big_off.png
index 4ed5142bbcbb..f60eb48a8778 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png b/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
index cc52dec15d97..8e0858d512e6 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png b/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
index fea77171eae5..f77e08c142cb 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png b/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
index 503a5b260425..3f9695ed32df 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png b/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
index 8470723c0725..b2e82da6eb01 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on.png b/core/res/res/drawable-xhdpi/btn_star_big_on.png
index a094406f091a..7cda08992e47 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png b/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
index bbf7d170b60e..da50266146da 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png b/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
index a46ea6942ac5..df07003b12c5 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png b/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
index 7e45f2a733d9..d56f46d027df 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png b/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
index 0607b78abb0b..5a62f47a6bce 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
index 7b479404b58c..f31cf2702dda 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
index 6a819900a74b..9b28db852cb3 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
index 5f6ff354781f..bec293cc9bdf 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
index 3a0f83de6bff..eec89dfadc5b 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
index 6fb25b569f28..757908e51311 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
index 44e87c46a254..c58bd5c6b6f7 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
index 01d4a9ae8a48..c591caefa2ae 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
index 967ca90f3eef..b3e981a17cc4 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
index ebb80ee29e83..85253f7b5317 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
index 9f32c30b4b30..efd26b0ee8f2 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
index ffe47dedf2ef..25fd6bb96421 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
index ed3670719ba7..fcd06afb7f19 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
index fd9da6c67ef8..641f79bf4fc2 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
index f5908dadc685..9e47d8b2ad24 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
index 7e76adf1f3f2..8f14270a2943 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
index b64a8d55c33d..1d5567020ad9 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
index 48d89f09bb67..032e89f734a4 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
index ae4f9394b211..ef59ce2403a8 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
index 4f052cffa28b..e2305cb51c99 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
index ea92177b2d82..6643deb2a6c3 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/code_lock_top.9.png b/core/res/res/drawable-xhdpi/code_lock_top.9.png
index 6f5cf6261797..31517e4a58b1 100644
--- a/core/res/res/drawable-xhdpi/code_lock_top.9.png
+++ b/core/res/res/drawable-xhdpi/code_lock_top.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/contact_header_bg.9.png b/core/res/res/drawable-xhdpi/contact_header_bg.9.png
index aee15b83ffeb..bde1d5670c04 100644
--- a/core/res/res/drawable-xhdpi/contact_header_bg.9.png
+++ b/core/res/res/drawable-xhdpi/contact_header_bg.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png b/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
index 93507893f75b..9666f7355473 100644
--- a/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png b/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
index e0f6e0adc35e..026017bda180 100644
--- a/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_angel.png b/core/res/res/drawable-xhdpi/emo_im_angel.png
index b4123ffe86c1..8853cbe570fc 100644
--- a/core/res/res/drawable-xhdpi/emo_im_angel.png
+++ b/core/res/res/drawable-xhdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_cool.png b/core/res/res/drawable-xhdpi/emo_im_cool.png
index 0efacf895c87..82cbd55d5b5e 100644
--- a/core/res/res/drawable-xhdpi/emo_im_cool.png
+++ b/core/res/res/drawable-xhdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_crying.png b/core/res/res/drawable-xhdpi/emo_im_crying.png
index 7de7bf040b50..315112590f08 100644
--- a/core/res/res/drawable-xhdpi/emo_im_crying.png
+++ b/core/res/res/drawable-xhdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_embarrassed.png b/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
index baa07653146b..ef2fded97fb7 100644
--- a/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
index afb22bb4382d..c41b19d5b377 100644
--- a/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_happy.png b/core/res/res/drawable-xhdpi/emo_im_happy.png
index 08a242d2b0fc..a2702b26749a 100644
--- a/core/res/res/drawable-xhdpi/emo_im_happy.png
+++ b/core/res/res/drawable-xhdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_kissing.png b/core/res/res/drawable-xhdpi/emo_im_kissing.png
index c643a3cfbfc2..7afd2f69a8ab 100644
--- a/core/res/res/drawable-xhdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-xhdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_laughing.png b/core/res/res/drawable-xhdpi/emo_im_laughing.png
index 0301f808a245..abc3700da6b4 100644
--- a/core/res/res/drawable-xhdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-xhdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
index 594e5e7359f5..60592fb85b73 100644
--- a/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_money_mouth.png b/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
index df9283a7c123..8efcf0b6fa61 100644
--- a/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_sad.png b/core/res/res/drawable-xhdpi/emo_im_sad.png
index f42f0a91e1a4..81e94b1ec704 100644
--- a/core/res/res/drawable-xhdpi/emo_im_sad.png
+++ b/core/res/res/drawable-xhdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_surprised.png b/core/res/res/drawable-xhdpi/emo_im_surprised.png
index 6b057fa2521b..7b7aabf1f1f7 100644
--- a/core/res/res/drawable-xhdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-xhdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
index ef128c551377..1b6a98531ae9 100644
--- a/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_undecided.png b/core/res/res/drawable-xhdpi/emo_im_undecided.png
index fcc0f4276f37..2c2cfa6bbf04 100644
--- a/core/res/res/drawable-xhdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-xhdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_winking.png b/core/res/res/drawable-xhdpi/emo_im_winking.png
index 687b62b4a1fb..6c9cb0e247b2 100644
--- a/core/res/res/drawable-xhdpi/emo_im_winking.png
+++ b/core/res/res/drawable-xhdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_wtf.png b/core/res/res/drawable-xhdpi/emo_im_wtf.png
index cb75a18d662e..34861e4093fb 100644
--- a/core/res/res/drawable-xhdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-xhdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_yelling.png b/core/res/res/drawable-xhdpi/emo_im_yelling.png
index 32a7028a705e..0583178a5aaf 100644
--- a/core/res/res/drawable-xhdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-xhdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
index 8005de74ab9c..f56ef3118273 100644
--- a/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png b/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
index 333dd24db2ea..e1570248abf3 100644
--- a/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png b/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
index 6eed88a1fda7..598b75b59bca 100644
--- a/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
+++ b/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png b/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
index 0683be681584..396f41382dcc 100644
--- a/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
+++ b/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
index 4a56a80eb3f5..d2e8ae851fe8 100644
--- a/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png b/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
index 67ed4c0a130f..35fb75a442d4 100644
--- a/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
index dfc5e6b6f9a0..6e0244f79eaa 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
index eab0cb91ff92..6478a112ebad 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
index e3e0cde4be4e..0330b172e07d 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
index b2bd5ca878c9..57539e450472 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
index c727bd44627b..751e0d5a85aa 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
index c727bd44627b..751e0d5a85aa 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
index f2c6b42031e0..c9427a997b76 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
index f2c6b42031e0..b495fbd7ea1a 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
index 915fbed3340b..a6bb25afaf1f 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
index 13ea0067944f..85d65faa710f 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
index f9471444dd4d..1dadee661704 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png b/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
index 3fa419734bf3..0df19342106c 100644
--- a/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
index e8e7fcc4b0ea..85acb93db2b5 100644
--- a/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_input_delete.png b/core/res/res/drawable-xhdpi/ic_input_delete.png
index 34c5f3939bb7..8b822d9e37c2 100644
--- a/core/res/res/drawable-xhdpi/ic_input_delete.png
+++ b/core/res/res/drawable-xhdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
index 544924e4bcf9..b09071b705c2 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
index 73d7af3cd51b..8a0331d8359d 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index d067ab8d29fd..000000000000
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
index 1a53c630c5b0..0422117f72d3 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_notification_ime_default.png b/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
index 4d0f074c3910..900801a4d3d7 100644
--- a/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png b/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
index 010852f86121..a7a8bb3e1dff 100644
--- a/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
+++ b/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_suggestions_add.png b/core/res/res/drawable-xhdpi/ic_suggestions_add.png
new file mode 100644
index 000000000000..aac038cbed27
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_suggestions_add.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_suggestions_delete.png b/core/res/res/drawable-xhdpi/ic_suggestions_delete.png
new file mode 100644
index 000000000000..077e9fcbec95
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_suggestions_delete.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png b/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
index b26180dfa075..cdc37f1e23dc 100644
--- a/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
+++ b/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/icon_highlight_square.9.png b/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
index f45f1c51794e..cc2ab8c0ff96 100644
--- a/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
+++ b/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index a89b8d5d5609..000000000000
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
index 997d6a5eec08..0812cb58107f 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
index d98a126327c2..db1cbe6ca16c 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
index 2eb69f676109..3ab2e99785c3 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
index 4491f02f9b5f..de4ca916ca58 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
index 6e91fbcdf62a..853b0f0ced00 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png b/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
index 4412331cd5e4..6cb42c1b5bca 100644
--- a/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png b/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
index d0cba8d761a0..f646a4135bd0 100644
--- a/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_background.9.png b/core/res/res/drawable-xhdpi/menu_background.9.png
index b784f711c9b9..3aa8ccbfd5cb 100644
--- a/core/res/res/drawable-xhdpi/menu_background.9.png
+++ b/core/res/res/drawable-xhdpi/menu_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png b/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
index ab43013078e7..af08de2e16a1 100644
--- a/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
+++ b/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_separator.9.png b/core/res/res/drawable-xhdpi/menu_separator.9.png
index 3251f9587a50..3c3722cbc72f 100644
--- a/core/res/res/drawable-xhdpi/menu_separator.9.png
+++ b/core/res/res/drawable-xhdpi/menu_separator.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_submenu_background.9.png b/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
index 54b2be68553a..4a8b2ad873d2 100644
--- a/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
+++ b/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
index b8220ceb7ec4..62b267e6159d 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
index 7f4f0937419c..5f38c35c1faf 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
index beae86df3cfe..1c2f33e14803 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
index 1f5b745be6fd..4e688bcd1abc 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
index cee62f8d6873..dc422f2f95b3 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
index 367dad4b66ba..afc02db78ce1 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
index 66b4807f338a..3604013f00e4 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
index b99572cad02d..a16cd38ec2be 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
index 37cd3ce74d39..b975b6398696 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
index 37cd3ce74d39..b975b6398696 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
index c10b671f16d3..b1d3e7b3f9de 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
index 18e7c8e18709..39cdb93f8854 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
index 5ddece8f9633..2a14ac559895 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
index bfae684ddfd3..e61c469afd12 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
index 7459f478fa5b..4827377c244a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
index 7459f478fa5b..4827377c244a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
index 945163094d69..ed0c0160b73e 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
index 01cc01a98987..279087c4c868 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
index b4d9c7f33102..1b3467acf57e 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
index 5f3d98225eff..930415e7a4f3 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
index 434f05fbbab3..5240d0874c9c 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
index 0c329945d58e..4b7911279146 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
index cba1e76cb088..6c2f397175cd 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
index b13f8e8d0715..97ea0b5fe4b3 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
index b71cc03081ac..e59e2a7e18b7 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
index 982f6255d87a..3b8fa7fda9fa 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
index fd3fa74afa1a..77a1dd4cb885 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
index 57dcf2785a6b..24c2d8445fa8 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
index eff8c2204b73..b2566dc3e486 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
index 15bed2c60f7b..7075af79495a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
index 15bed2c60f7b..7075af79495a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
index ee270b44aea3..699a9f5f7556 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
index 74bc6dfbda75..11b60a96e043 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
index 8fe215974c85..074fae59b4cb 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
index 297f77c768a6..5504fee0ea3a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
index 97cdcb13f115..2310f830ecf0 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
index 97cdcb13f115..2310f830ecf0 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
index e5d512699c33..585cf304efc6 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/panel_background.9.png b/core/res/res/drawable-xhdpi/panel_background.9.png
index 2ceae602f6b0..f3a3a9d9c6bd 100644
--- a/core/res/res/drawable-xhdpi/panel_background.9.png
+++ b/core/res/res/drawable-xhdpi/panel_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png b/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
index c171b7c7bc03..9bdf3f1665c7 100644
--- a/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/password_field_default.9.png b/core/res/res/drawable-xhdpi/password_field_default.9.png
index cf8329e3862d..9aa677695ea8 100644
--- a/core/res/res/drawable-xhdpi/password_field_default.9.png
+++ b/core/res/res/drawable-xhdpi/password_field_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png b/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
index 65ea61bc7869..7f951300667e 100644
--- a/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
+++ b/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_center_bright.9.png b/core/res/res/drawable-xhdpi/popup_center_bright.9.png
index b1a8e3e182a1..97614e396a98 100644
--- a/core/res/res/drawable-xhdpi/popup_center_bright.9.png
+++ b/core/res/res/drawable-xhdpi/popup_center_bright.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_full_bright.9.png b/core/res/res/drawable-xhdpi/popup_full_bright.9.png
index 114faa0e1b8c..f10dd85af9cb 100644
--- a/core/res/res/drawable-xhdpi/popup_full_bright.9.png
+++ b/core/res/res/drawable-xhdpi/popup_full_bright.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_full_dark.9.png b/core/res/res/drawable-xhdpi/popup_full_dark.9.png
index 996beaa6e94b..7de3e9d8c793 100644
--- a/core/res/res/drawable-xhdpi/popup_full_dark.9.png
+++ b/core/res/res/drawable-xhdpi/popup_full_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_inline_error.9.png b/core/res/res/drawable-xhdpi/popup_inline_error.9.png
index 2784c3066ff9..a24e607821f7 100644
--- a/core/res/res/drawable-xhdpi/popup_inline_error.9.png
+++ b/core/res/res/drawable-xhdpi/popup_inline_error.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png b/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
index f26be8c70711..e382712de9e2 100644
--- a/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
+++ b/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png
index f96a4a60e056..ca2450239fde 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png
index 3a6554f6b44b..5653118c7645 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png
index 30bd7ada7629..438b1b5c9c7f 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png
index 209036be79ae..efe3fed5b863 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png
index 830820b10c56..cb7931c873f5 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png
index 39eb2048d5f5..8ff7ee999ce2 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png
index a2d4dc254129..ce07298ada97 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png
index 1772aeae36e8..87e9d8fbeef6 100644
--- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png
+++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
index 622095bfca75..3f23144632c6 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
index bf8cf4c5870e..41848dd92978 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
index 3e155decb26d..b2a1d8c230cf 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
index 1c1974ab4cf0..27218f2cf833 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
index 52d95afa8dab..49d1ed5c305e 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
index 2613e0d954d2..8be8ac80f283 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
index b7986e7c4681..3f9e4aabfb5f 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
index e964b39467bb..46f3640c1a54 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half.png b/core/res/res/drawable-xhdpi/rate_star_big_half.png
index 68c77a879467..2ecb3b5e1f91 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
index 637c727fa6fc..f9d3cecc7d69 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
index 50f06ddf30ed..bbdc70d320ca 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off.png b/core/res/res/drawable-xhdpi/rate_star_big_off.png
index 2389fff3af6a..8dae7140c003 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
index 96c96fbce424..34b94dbcb3fb 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
index 9e8cd54f9ab2..34cb926b024d 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on.png b/core/res/res/drawable-xhdpi/rate_star_big_on.png
index 39467dd052f9..43633e15ccac 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
index 1e42698a2f26..273fd16da5e9 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
index 538e1a835d69..dbd11bd68636 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half.png b/core/res/res/drawable-xhdpi/rate_star_med_half.png
index 6c6011428122..44178c9ab3aa 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
index c35d9a4986a6..013543e004f6 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
index f74ea469f573..801703f29494 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off.png b/core/res/res/drawable-xhdpi/rate_star_med_off.png
index 3428a3b63d3e..101692d4017f 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
index be309705d625..d411e25ea5a3 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
index 1d19a88e0e81..39f0fa2e8297 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on.png b/core/res/res/drawable-xhdpi/rate_star_med_on.png
index 0acddec3b15d..a650d0d08d94 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
index d9122b4adefe..fdfe9322a88e 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
index 106ae7791f74..ca88d284623f 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half.png b/core/res/res/drawable-xhdpi/rate_star_small_half.png
index b7a5709617fc..a7e97a58e636 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
index fc09cd697d7e..3d2a77404a2e 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
index 663332f6f96d..9221829f7526 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off.png b/core/res/res/drawable-xhdpi/rate_star_small_off.png
index 2516cccc7a75..71140ac81e5d 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
index 8fc525fc13d1..346daa31fd46 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
index 59b50605fcce..4c2b62c3f76d 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on.png b/core/res/res/drawable-xhdpi/rate_star_small_on.png
index 327fd1ffa7fa..ddfb876d25e9 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
index 09bb66b083a0..9bf24666dea9 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
index b1ee6eb17c84..187eeded5e50 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
index fdbf4dd925f0..3cf84a5a8d19 100644
--- a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png b/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
index 4f6391f53613..24789a5c2a1f 100644
--- a/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
+++ b/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
index d70151af4142..4715cfb7cb36 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
index 017688fb124d..d41d5a38678e 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
index 727fcf1af8dd..4f0e06dd710c 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
index 6d03e42ff043..5d9f860e636a 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/search_plate.9.png b/core/res/res/drawable-xhdpi/search_plate.9.png
index 2ad7615df04b..f917cb66ce02 100644
--- a/core/res/res/drawable-xhdpi/search_plate.9.png
+++ b/core/res/res/drawable-xhdpi/search_plate.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/settings_header_raw.9.png b/core/res/res/drawable-xhdpi/settings_header_raw.9.png
index 41e6c31a8371..c248237858ba 100644
--- a/core/res/res/drawable-xhdpi/settings_header_raw.9.png
+++ b/core/res/res/drawable-xhdpi/settings_header_raw.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
index 7294519fd012..9afd52fae827 100644
--- a/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
index d43da4e14e5f..afd4bb921f57 100644
--- a/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
index eecac27d655c..76e9428beb16 100644
--- a/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
index eb91b2c729fe..6f693d631535 100644
--- a/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
index b1b8232e5cbc..19517c4b0aee 100644
--- a/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
index 0c15e128690f..14143c51c351 100644
--- a/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
index 6215e95aa2d4..4c92e956fe8c 100644
--- a/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
index 0a67fff8efb2..fe1d615a2ddc 100644
--- a/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
index 9ee1f8ceb778..5253673642fb 100644
--- a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
index e3e8656c3afe..cfb4a9cb4c16 100644
--- a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png b/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
index b4352186ff81..7814354d1cd9 100644
--- a/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png b/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
index a45c7617715c..17ee05c6c5bc 100644
--- a/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_normal.9.png b/core/res/res/drawable-xhdpi/spinner_normal.9.png
index 71b65ddca777..1ecf8978acc6 100644
--- a/core/res/res/drawable-xhdpi/spinner_normal.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_press.9.png b/core/res/res/drawable-xhdpi/spinner_press.9.png
index d7233baa19ad..87af85cf46c3 100644
--- a/core/res/res/drawable-xhdpi/spinner_press.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_press.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_select.9.png b/core/res/res/drawable-xhdpi/spinner_select.9.png
index a1b11e0b12ac..15b7a902f65b 100644
--- a/core/res/res/drawable-xhdpi/spinner_select.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_select.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_error.png b/core/res/res/drawable-xhdpi/stat_notify_error.png
index c7ac11ff7fa2..2d0283e7e8d7 100644
--- a/core/res/res/drawable-xhdpi/stat_notify_error.png
+++ b/core/res/res/drawable-xhdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
index 1909183366fd..6bb7512cbf82 100644
--- a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_adb.png b/core/res/res/drawable-xhdpi/stat_sys_adb.png
index 92f8dd4a0a54..01eb61d38874 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-xhdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/status_bar_header_background.9.png b/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
index d03720f81ae7..efd3e97e35d0 100644
--- a/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
+++ b/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
index cf10fb92da83..ea53b5f3f1b4 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
index fe7a441e83fe..8a4b61aa89ec 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
index 54ae97993197..6a280dc6cd14 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
index 305cc356a23c..34a93041ac0f 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
index 05dfedeaec58..757fdd4ff02e 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
index 63bbc4166e8b..8873ccca1cec 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
index d830a99af538..d22226ed6c75 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
index 17802601e8de..c94248c01b1a 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/tab_selected_v4.9.png b/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
index e867f90df55b..f1f4ec6a96de 100644
--- a/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
+++ b/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png b/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
index 60b980737cce..1df8c3a0b784 100644
--- a/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
+++ b/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_left.png b/core/res/res/drawable-xhdpi/text_select_handle_left.png
index 5fcbc528ff11..98d10c92928b 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_middle.png b/core/res/res/drawable-xhdpi/text_select_handle_middle.png
index 05c2ca71a2a5..058b30b731bc 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_right.png b/core/res/res/drawable-xhdpi/text_select_handle_right.png
index ebf97c40c2a3..b3a0c9f47ec3 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_default.9.png b/core/res/res/drawable-xhdpi/textfield_default.9.png
index 20b1a098451a..f084f47dfc41 100644
--- a/core/res/res/drawable-xhdpi/textfield_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_disabled.9.png b/core/res/res/drawable-xhdpi/textfield_disabled.9.png
index 794dce806376..1940051f7acd 100644
--- a/core/res/res/drawable-xhdpi/textfield_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png b/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
index b708d8241894..335bee64b4ec 100644
--- a/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_default.9.png b/core/res/res/drawable-xhdpi/textfield_search_default.9.png
index 0ed71f7e0022..ad4b935c69f5 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
index 290dd38cc515..0c60f9edccea 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
index bf20153b7bbd..741bed9731c1 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
index 18406a39bb1e..24ea6cfbc935 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png b/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
index 0913c23ada57..815785c3dd2f 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_selected.9.png b/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
index 7ba4d61f5543..f009cdbd6f35 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_selected.9.png b/core/res/res/drawable-xhdpi/textfield_selected.9.png
index 275d6283c23b..963efdebb00f 100644
--- a/core/res/res/drawable-xhdpi/textfield_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_medium.9.png b/core/res/res/drawable-xhdpi/title_bar_medium.9.png
index 4ef531c22a4d..109c01754f9b 100644
--- a/core/res/res/drawable-xhdpi/title_bar_medium.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_medium.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_portrait.9.png b/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
index eb607c7cb995..3c91a4a69200 100644
--- a/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_tall.9.png b/core/res/res/drawable-xhdpi/title_bar_tall.9.png
index 4beb1d7fee46..e986db113ae1 100644
--- a/core/res/res/drawable-xhdpi/title_bar_tall.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_tall.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/vpn_connected.png b/core/res/res/drawable-xhdpi/vpn_connected.png
index 5d37ffc47ff9..1f46be2cea5d 100644
--- a/core/res/res/drawable-xhdpi/vpn_connected.png
+++ b/core/res/res/drawable-xhdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/vpn_disconnected.png b/core/res/res/drawable-xhdpi/vpn_disconnected.png
index dd9ba929ad3d..847d3f52701f 100644
--- a/core/res/res/drawable-xhdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-xhdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/zoom_plate.9.png b/core/res/res/drawable-xhdpi/zoom_plate.9.png
index 5229b5fa6ff3..797215b6595a 100644
--- a/core/res/res/drawable-xhdpi/zoom_plate.9.png
+++ b/core/res/res/drawable-xhdpi/zoom_plate.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index c605607222ae..000000000000
--- a/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/btn_cab_done_holo_dark.xml b/core/res/res/drawable/btn_cab_done_holo_dark.xml
index 2cdb60509239..65d3496a550d 100644
--- a/core/res/res/drawable/btn_cab_done_holo_dark.xml
+++ b/core/res/res/drawable/btn_cab_done_holo_dark.xml
@@ -14,9 +14,8 @@
limitations under the License.
-->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/btn_cab_done_default_holo_dark" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_pressed="true"
android:drawable="@drawable/btn_cab_done_pressed_holo_dark" />
<item android:state_focused="true" android:state_enabled="true"
diff --git a/core/res/res/drawable/btn_cab_done_holo_light.xml b/core/res/res/drawable/btn_cab_done_holo_light.xml
index 81add4c5da04..f6a63f430793 100644
--- a/core/res/res/drawable/btn_cab_done_holo_light.xml
+++ b/core/res/res/drawable/btn_cab_done_holo_light.xml
@@ -14,9 +14,8 @@
limitations under the License.
-->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/btn_cab_done_default_holo_light" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_pressed="true"
android:drawable="@drawable/btn_cab_done_pressed_holo_light" />
<item android:state_focused="true" android:state_enabled="true"
diff --git a/core/res/res/drawable/item_background_holo_dark.xml b/core/res/res/drawable/item_background_holo_dark.xml
index 2d4f20aa7eb1..f188df79af6b 100644
--- a/core/res/res/drawable/item_background_holo_dark.xml
+++ b/core/res/res/drawable/item_background_holo_dark.xml
@@ -17,8 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
- <item android:state_window_focused="false" android:drawable="@color/transparent" />
-
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_dark" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_dark" />
diff --git a/core/res/res/drawable/item_background_holo_light.xml b/core/res/res/drawable/item_background_holo_light.xml
index c616d86a1d3a..ee3f4d898154 100644
--- a/core/res/res/drawable/item_background_holo_light.xml
+++ b/core/res/res/drawable/item_background_holo_light.xml
@@ -17,8 +17,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
- <item android:state_window_focused="false" android:drawable="@color/transparent" />
-
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_light" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_light" />
diff --git a/core/res/res/layout/keyguard_screen_glogin_unlock.xml b/core/res/res/layout/keyguard_screen_glogin_unlock.xml
index 0e5fe78c5209..35d113c899df 100644
--- a/core/res/res/layout/keyguard_screen_glogin_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_glogin_unlock.xml
@@ -119,7 +119,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
+ android:drawablePadding="4dip"
android:text="@android:string/lockscreen_emergency_call"
/>
diff --git a/core/res/res/layout/keyguard_screen_lock.xml b/core/res/res/layout/keyguard_screen_lock.xml
index 6e4fa7df1f5b..43867f4dfdf3 100644
--- a/core/res/res/layout/keyguard_screen_lock.xml
+++ b/core/res/res/layout/keyguard_screen_lock.xml
@@ -211,7 +211,7 @@
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
+ android:drawablePadding="4dip"
android:text="@android:string/lockscreen_emergency_call"
/>
diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml
index 694db50a84ee..8bc5f34a84a6 100644
--- a/core/res/res/layout/keyguard_screen_password_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_password_landscape.xml
@@ -170,6 +170,7 @@
<com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
android:layout_width="270dip"
android:layout_height="wrap_content"
+ android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:background="#40000000"
android:layout_marginTop="5dip"
@@ -190,4 +191,17 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="0"
+ android:layout_column="2"
+ android:layout_rowSpan="8"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/layout/keyguard_screen_password_portrait.xml b/core/res/res/layout/keyguard_screen_password_portrait.xml
index cf3bd4239a06..2a66d7dba841 100644
--- a/core/res/res/layout/keyguard_screen_password_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_password_portrait.xml
@@ -132,7 +132,7 @@
<!-- Numeric keyboard -->
<com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:paddingTop="4dip"
android:paddingBottom="4dip"
@@ -178,4 +178,17 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="3"
+ android:layout_column="0"
+ android:layout_rowSpan="2"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
index dff2a3fdb9a7..59065e11cbfc 100644
--- a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml
@@ -113,7 +113,7 @@
android:layout_marginLeft="8dip"
android:textSize="18sp"
android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
+ android:drawablePadding="4dip"
/>
</LinearLayout>
diff --git a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
index d8bea5693ade..6e8a6458e5ba 100644
--- a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml
@@ -111,7 +111,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@android:drawable/ic_emergency"
- android:drawablePadding="8dip"
+ android:drawablePadding="4dip"
android:text="@android:string/lockscreen_emergency_call"
/>
</LinearLayout>
diff --git a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml
index 11a6e12bd1f4..b662e8278b32 100644
--- a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml
@@ -175,7 +175,7 @@
android:layout_marginLeft="8dip"
android:textSize="18sp"
android:drawableLeft="@drawable/ic_emergency"
- android:drawablePadding="8dip"
+ android:drawablePadding="4dip"
/>
</LinearLayout>
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml
index 03685300ea12..4349c5bb0e87 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml
@@ -29,7 +29,8 @@
android:gravity="center_horizontal">
<com.android.internal.widget.DigitalClock android:id="@+id/time"
- android:layout_marginBottom="18dip"
+ android:layout_marginTop="@dimen/keyguard_lockscreen_status_line_clockfont_top_margin"
+ android:layout_marginBottom="12dip"
android:layout_marginRight="@dimen/keyguard_lockscreen_status_line_font_right_margin"
android:layout_gravity="right">
@@ -149,7 +150,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_marginBottom="8dip"
+ android:layout_marginBottom="12dip"
android:gravity="center_horizontal"
android:singleLine="true"
android:ellipsize="marquee"
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
index 2849376c7f5b..294f91e89997 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
@@ -104,6 +104,7 @@
android:id="@+id/carrier"
android:layout_width="0dip"
android:layout_gravity="fill_horizontal"
+ android:layout_marginBottom="12dip"
android:gravity="right"
android:singleLine="true"
android:ellipsize="marquee"
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index d71dbffd8f9d..2778f4e8446d 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -160,4 +160,18 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="0"
+ android:layout_column="1"
+ android:layout_rowSpan="7"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_marginLeft="8dip"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
index 64c479f32c52..03fc79e81671 100644
--- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
@@ -28,7 +28,8 @@
android:gravity="center_horizontal">
<com.android.internal.widget.DigitalClock android:id="@+id/time"
- android:layout_marginBottom="18dip"
+ android:layout_marginTop="@dimen/keyguard_lockscreen_status_line_clockfont_top_margin"
+ android:layout_marginBottom="12dip"
android:layout_marginRight="@dimen/keyguard_lockscreen_status_line_font_right_margin"
android:layout_gravity="right">
@@ -171,4 +172,19 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="4"
+ android:layout_column="0"
+ android:layout_rowSpan="1"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_marginTop="8dip"
+ android:layout_marginBottom="8dip"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml
index f2f524caf813..807daf2b2dae 100644
--- a/core/res/res/layout/number_picker.xml
+++ b/core/res/res/layout/number_picker.xml
@@ -23,8 +23,6 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/numberPickerUpButtonStyle"
- android:paddingTop="22dip"
- android:paddingBottom="22dip"
android:contentDescription="@string/number_picker_increment_button" />
<EditText android:id="@+id/numberpicker_input"
@@ -36,8 +34,6 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/numberPickerDownButtonStyle"
- android:paddingTop="22dip"
- android:paddingBottom="22dip"
android:contentDescription="@string/number_picker_decrement_button" />
</merge>
diff --git a/core/res/res/layout/status_bar_latest_event_content_large_icon.xml b/core/res/res/layout/status_bar_latest_event_content_large_icon.xml
index ac4d1e43f7c4..f3f19574a636 100644
--- a/core/res/res/layout/status_bar_latest_event_content_large_icon.xml
+++ b/core/res/res/layout/status_bar_latest_event_content_large_icon.xml
@@ -4,8 +4,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
+ android:paddingLeft="12dp"
+ android:paddingRight="12dp"
>
<TextView android:id="@+id/title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
diff --git a/core/res/res/layout/text_edit_suggestion_item.xml b/core/res/res/layout/text_edit_suggestion_item.xml
index 082c5ec031c0..1fdc1bf3edca 100644
--- a/core/res/res/layout/text_edit_suggestion_item.xml
+++ b/core/res/res/layout/text_edit_suggestion_item.xml
@@ -15,7 +15,7 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dip"
android:paddingRight="16dip"
@@ -23,6 +23,7 @@
android:paddingBottom="8dip"
android:layout_gravity="left|center_vertical"
android:singleLine="true"
+ android:drawablePadding="8dip"
android:ellipsize="marquee"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/dim_foreground_light" />
diff --git a/core/res/res/layout/volume_adjust.xml b/core/res/res/layout/volume_adjust.xml
index ea4e1f9a6036..c16a12cec025 100644
--- a/core/res/res/layout/volume_adjust.xml
+++ b/core/res/res/layout/volume_adjust.xml
@@ -21,7 +21,6 @@
android:id="@+id/visible_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="80dp"
android:background="@android:drawable/dialog_full_holo_dark"
android:orientation="horizontal"
>
diff --git a/core/res/res/layout/webview_find.xml b/core/res/res/layout/webview_find.xml
index 4cf2df51b136..a628ac8cf730 100644
--- a/core/res/res/layout/webview_find.xml
+++ b/core/res/res/layout/webview_find.xml
@@ -26,7 +26,7 @@
android:scrollHorizontally="true"
android:inputType="text"
android:hint="@string/find_on_page"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi|flagNoFullscreen"
android:layout_marginRight="10dip"
/>
<TextView android:id="@+id/matches"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 979ab84a7580..dfd8ff809e21 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1109,9 +1109,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Ontdoen die uitvee."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Doen vir eers niks."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Kies \'n rekening"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Voeg \'n rekening by"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Watter rekening wil jy gebruik?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Voeg rekening by"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Verhoging"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Verminder"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tik en hou."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 58788349dd6e..ddb1bafa2e26 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -62,7 +62,7 @@
<string name="RuacMmi" msgid="7827887459138308886">"የሚያበሳጭ የማይፈለጉ ጥሪዎች አለመቀበል።"</string>
<string name="CndMmi" msgid="3116446237081575808">"መደወያ ቁጥር አስረከበ"</string>
<string name="DndMmi" msgid="1265478932418334331">"አትረብሽ"</string>
- <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች። ቀጥሎ ጥሪ፡ ተከልክሏል"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች።ቀጥሎ ጥሪ፡ ተከልክሏል"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች።ቀጥሎ ጥሪ፡ አልተከለከለም"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"የደዋይ ID ወደ አልተከለከለም ነባሪዎች።ቀጥሎ ጥሪ፡ ተከልክሏል"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"የደዋይ ID ነባሪዎች ወደአልተከለከለም። ቀጥሎ ጥሪ፡አልተከለከለም"</string>
@@ -221,7 +221,7 @@
<string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"ትግበራ ምንም እንኳ ማህደረ ትውስታ አነስተኛ ባይሆንም ሌላ ትግበራዎች የዳራ ሂደታቸውን ለማቆም ይፈቅዳል።"</string>
<string name="permlab_forceStopPackages" msgid="1447830113260156236">"ሌላ ትግበራዎችን በኃይል አቁም"</string>
<string name="permdesc_forceStopPackages" msgid="7263036616161367402">"ትግበራ ሌሎች ትግበራዎችን በኃይል ለማስቆም ይፈቅዳል።"</string>
- <string name="permlab_forceBack" msgid="1804196839880393631">"ትግበራ እንዲዘጋ አስገድድ"</string>
+ <string name="permlab_forceBack" msgid="1804196839880393631">"ትግበራ እንዲዘጋአስገድድ"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"ትግበራ ማንኛውም ቅድመገፅ እንቅስቃሴ በግድ ለመዝጋት እና ለመመለስ ይፈቅዳል። ለመደበኛ ትግበራዎች በፍፁም አያስፈልግም።"</string>
<string name="permlab_dump" msgid="1681799862438954752">"የስርዓት የውስጥ ሁኔታን ሰርስረህ አውጣ"</string>
<string name="permdesc_dump" msgid="2198776174276275220">"ትግበራ የስረዓት ውስጣዊ ሁኔታ ሰርስረው ሊያወጡ ይፈቅዳል። ተንኮል አዘል ትግበራዎች በፍፁም የማያስፈልጋቸውን የተለያዩ ሰፋ ያለ የግል እና የተጠበቀ መረጃ ሰርስረ ው ሊያወጡይችላሉ።"</string>
@@ -841,7 +841,7 @@
<string name="years" msgid="6881577717993213522">"ዓመታት"</string>
<string name="VideoView_error_title" msgid="3359437293118172396">"ቪዲዮ ማጫወት አልተቻለም።"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="897920883624437033">"ይቅርታ፣ ይህ ቪዲዮ በዚህ መሣሪያ ለመልቀቅ ትክክል አይደለም።"</string>
- <string name="VideoView_error_text_unknown" msgid="710301040038083944">"ይቅርታ፣ ይህ ቪዲዮ መጫወት አልቻለም።"</string>
+ <string name="VideoView_error_text_unknown" msgid="710301040038083944">"ይቅርታ፣ ይህ ቪዲዮመጫወት አልቻለም።"</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"እሺ"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="noon" msgid="7245353528818587908">"ቀትር"</string>
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"የURL ቅጂ"</string>
<string name="selectTextMode" msgid="6738556348861347240">"ፅሁፍ ምረጥ"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"የፅሁፍ ምርጫ"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"ወደ መዝገበ ቃላት አክል"</string>
- <string name="deleteText" msgid="7070985395199629156">"ሰርዝ"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"ግቤት ሜተድ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"የፅሁፍ እርምጃዎች"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"ቦታ አንሷል"</string>
@@ -1042,8 +1046,8 @@
<string name="ime_action_done" msgid="8971516117910934605">"ተከናውኗል"</string>
<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>
+ <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>
<string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"የሚከተለው ወይም ተጨማሪ ትግበራዎች ወደ መለያዎ ለመድረስ አሁን እና ወደፊት ፈቃድ ይጠይቃል።"</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ይህን ጥየቃ መፍቀድ ይፈልጋሉ?"</string>
<string name="grant_permissions_header_text" msgid="2722567482180797717">"የድረስ መጠይቅ"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"ስርዞቹን ቀልብስ።"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"ለአሁን ምንም አታድርግ።"</string>
<string name="choose_account_label" msgid="4191313562041125787">"መለያ ምረጥ"</string>
- <string name="add_account_label" msgid="2935267344849993553">"መለያ አክል"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"የትኛውን መለያ መጠቀም ትፈልጋለህ?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"መለያ አክል"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"ጨምር"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"ቀንስ"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> አንዴ ንካ እና ያዝ"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"የUSB ማከማቻ"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"አርትእ..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"የውሂብ አጠቃቀም ማስጠንቀቂየ"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"ቅንጅቶችን እና አጠቃቀምን ለማየት ንካ"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G ውሂብ ቦዝኗል"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G ውሂብ ቦዝኗል"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"የተንቀሳቃሽ ውሂብ ቦዝኗል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 00c1ec16a166..0386ab484634 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"نسخ عنوان URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"تحديد نص..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"تحديد النص"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"إضافة إلى القاموس"</string>
- <string name="deleteText" msgid="7070985395199629156">"حذف"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"المساحة منخفضة"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"التراجع عن عمليات الحذف"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"عدم تنفيذ أي شيء الآن"</string>
<string name="choose_account_label" msgid="4191313562041125787">"حدد حسابًا."</string>
- <string name="add_account_label" msgid="2935267344849993553">"إضافة حساب"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"ما الحساب الذي تريد استخدامه؟"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"إضافة حساب"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"زيادة"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"تناقص"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> انقر مع الاستمرار."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"وحدة تخزين USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"تعديل..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"تحذير استخدام البيانات"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"المس لعرض الاستخدام والإعدادات"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"تم تعطيل بيانات شبكات الجيل الثاني والجيل الثالث"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"تم تعطيل بيانات شبكة الجيل الرابع"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"تم تعطيل بيانات الجوال"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index b1a6aa4ae118..c55322be1eff 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Копиране на URL адреса"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Избиране на текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Избиране на текст"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"добавяне към речника"</string>
- <string name="deleteText" msgid="7070985395199629156">"изтриване"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мястото не достига"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Отмяна на изтриванията."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Да не се прави нищо засега."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Избор на профил"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Добавяне на профил"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Кой профил искате да използвате?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Добавяне на профил"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличаване"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Намаляване"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Докоснете <xliff:g id="VALUE">%s</xliff:g> път/и и задръжте."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB хранилище"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Редактиране..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Предупрежд. за ползване на данни"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Ползване и настройки: Докоснете"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G данните са деактивирани"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G данните са деактивирани"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобилните данни са деактивирани"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 83eec4a7e033..1ee5c74eea8e 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1109,9 +1109,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Desfés les supressions."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"No facis res de moment."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Selecciona un compte"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Addició d\'un compte"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Quin compte vols fer servir?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Afegeix un compte"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementa"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminueix"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> mantén premut."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 45b025508e80..2190b7ec2e7f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"přidat do slovníku"</string>
- <string name="deleteText" msgid="7070985395199629156">"smazat"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metoda zadávání dat"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operace s textem"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Málo paměti"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátit mazání zpět."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Neprovádět akci."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Vybrat účet"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Přidat účet"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Který účet chcete použít?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Přidat účet"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšení"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Snížení"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – Klepněte a podržte."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Úložiště USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Upravit..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornění na využití dat"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Dotykem zobraz. využití a nast."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datové přenosy 2G a 3G zakázány"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datové přenosy 4G jsou zakázány"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilní data jsou zakázána"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 6d798e4878f1..f5a984630c25 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopier webadresse"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstmarkering"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"føj til ordbog"</string>
- <string name="deleteText" msgid="7070985395199629156">"slet"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Der er ikke så meget plads tilbage"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Fortryd sletningerne."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Gør ikke noget lige nu."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Vælg en konto"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Tilføj en konto"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Hvilken konto vil du bruge?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Tilføj konto"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Optælling"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Nedtælling"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tryk og hold <xliff:g id="VALUE">%s</xliff:g> nede."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-lager"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Rediger..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel om dataforbrug"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Tryk for at få vist brug og indstillinger"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G-data er deaktiveret"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-data er deaktiveret"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata er deaktiveret"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index c883905dcbe1..d376fd92bfb3 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"URL kopieren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Text auswählen..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textauswahl"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"Zum Wörterbuch hinzufügen"</string>
- <string name="deleteText" msgid="7070985395199629156">"Löschen"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textaktionen"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Geringer Speicher"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Löschen rückgängig machen"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Im Moment nichts unternehmen"</string>
<string name="choose_account_label" msgid="4191313562041125787">"Konto auswählen"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Konto hinzufügen"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Welches Konto möchten Sie verwenden?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Konto hinzufügen"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Erhöhen"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Verringern"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tippen und halten"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-Speicher"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Bearbeiten..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Warnung zu Datennutzung"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Für Nutzung/Einstellungen berühren"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-Daten deaktiviert"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobile Daten deaktiviert"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 6f7fb468fd5a..601a0545f425 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -151,7 +151,7 @@
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ο ήχος είναι ενεργοποιημένος"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Λειτουργία πτήσης"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Λειτ. πτήσης είναι ανενεργή"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Η λειτουργία πτήσης είναι απενεργοποιημένη"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string>
<string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string>
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Αντιγραφή διεύθυνσης URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Επιλογή κειμένου..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Επιλογή κειμένου"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"προσθήκη στο λεξικό"</string>
- <string name="deleteText" msgid="7070985395199629156">"διαγραφή"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ενέργειες κειμένου"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Απομένει λίγος ελεύθερος χώρος"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Αναίρεση των διαγραφών."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Να μην γίνει καμία ενέργεια τώρα."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Επιλογή λογαριασμού"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Προσθήκη λογαριασμού"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Ποιον λογαριασμό θέλετε να χρησιμοποιήσετε;"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Προσθήκη λογαριασμού"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Αύξηση"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Μείωση"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Πατήστε και κρατήστε πατημένο το <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Χώρος αποθήκευσης USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Επεξεργασία..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Προειδοποίηση χρήσης δεδομένων"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Αγγ.για προβ.της χρ.και των ρυθ."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Τα δεδ. 2G-3G απενεργοποιήθηκαν"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Τα δεδομένα 4G απενεργοποιήθηκαν"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Τα δεδομ. κιν. τηλεφ. απενεργοπ."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 975707be8c0e..82e97e00a0e4 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1109,9 +1109,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Undo the deletions."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Do nothing for now."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Select an account"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Add an account"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Which account would you like to use?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Add account"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Increment"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tap and hold."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 9c7cf79d1e10..721b0c722f90 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"Agregar al diccionario"</string>
- <string name="deleteText" msgid="7070985395199629156">"Eliminar"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio de almacenamiento"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer eliminaciones."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"No hagas nada por el momento."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Agregar una cuenta"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"¿Qué cuenta deseas usar?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Agregar una cuenta"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Decremento"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantenga presionado <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Toca para ver uso y config."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datos de 2 GB - 3 GB desactivados"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datos de 4 GB desactivados"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datos móviles desactivados"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 6a721d7042a4..dc3a630a6ae3 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"añadir al diccionario"</string>
- <string name="deleteText" msgid="7070985395199629156">"eliminar"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer las eliminaciones"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"No hacer nada por ahora"</string>
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Añadir una cuenta"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"¿Qué cuenta quieres usar?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Añadir cuenta"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminuir"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantén pulsado <xliff:g id="VALUE">%s</xliff:g>"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Tocar para ver el uso y ajustes"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datos 2G-3G inhabilitados"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datos 4G inhabilitados"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datos móviles inhabilitados"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 886cb9a7719b..d40c6d777671 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"انتخاب متن..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"انتخاب متن"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"افزودن به فرهنگ لغت"</string>
- <string name="deleteText" msgid="7070985395199629156">"حذف"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"عملکردهای متنی"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"فضا کم است"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"لغو موارد حذف شده."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"اکنون هیچ کاری انجام نشود."</string>
<string name="choose_account_label" msgid="4191313562041125787">"انتخاب یک حساب"</string>
- <string name="add_account_label" msgid="2935267344849993553">"افزودن یک حساب"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"از کدام حساب می‌خواهید استفاده کنید؟"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"افزودن حساب"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"افزایش"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"کاهش"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ضربه بزنید و نگه دارید."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"حافظه USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"ویرایش..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"هشدار میزان استفاده از داده"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"لمس برای مشاهده استفاده و تنظیمات"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"داده های 2G-3G غیرفعال شد"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"داده 4G غیر فعال شده است"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"داده های تلفن همراه غیرفعال شد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 4845868cbe78..1462df4b1eec 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopioi URL-osoite"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Tekstin valinta..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstin valinta"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"lisää sanakirjaan"</string>
- <string name="deleteText" msgid="7070985395199629156">"poista"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Syöttötapa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoiminnot"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Tila vähissä"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Kumoa poistot."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Älä tee mitään."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Valitse tili"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Lisää tili"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Mitä tiliä haluaisit käyttää?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Lisää tili"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Lisää"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähennä"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> kosketa pitkään."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-tallennustila"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Muokkaa..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Tiedonsiirtovaroitus"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Näytä käyttö ja asetukset"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G-tiedonsiirto pois käytöstä"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-tiedonsiirto pois käytöstä"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobiilitiedonsiirto pois käytöstä"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index c67fba813961..c5e692b9013f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"ajouter au dictionnaire"</string>
- <string name="deleteText" msgid="7070985395199629156">"supprimer"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Espace disponible faible"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Annuler les suppressions"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Ne rien faire pour l\'instant"</string>
<string name="choose_account_label" msgid="4191313562041125787">"Sélectionner un compte"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Ajouter un compte"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Quel compte souhaitez-vous utiliser ?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Ajouter un compte"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Augmenter"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuer"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> appuyez de manière prolongée."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Modifier..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avertissement utilisation données"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Appuyez pour voir utilis./param."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Données 2G-3G désactivées"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Données 4G désactivées"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Données mobiles désactivées"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 88c07c792b5b..ab6eb932d471 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Odabir teksta..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Odabir teksta"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"dodaj u rječnik"</string>
- <string name="deleteText" msgid="7070985395199629156">"izbriši"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje s tekstom"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Prostora ima sve manje"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Poništi brisanja."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Za sad nemoj ništa učiniti."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Odaberite račun"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Dodajte račun"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Koji račun želite upotrebljavati?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Povećaj"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Smanji"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotaknite i držite."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB pohrana"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Uređivanje..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozorenje o upotrebi podataka"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Dodirnite za pregled upotrebe i postavki"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G podaci su onemogućeni"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G podaci su onemogućeni"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilni podaci su onemogućeni"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 3aa348ea8b01..3e2ae7f35324 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"URL másolása"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Szöveg kijelölése..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Szöveg kijelölése"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"hozzáadás a szótárhoz"</string>
- <string name="deleteText" msgid="7070985395199629156">"törlés"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Beviteli mód"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Műveletek szöveggel"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Kevés a hely"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Törlés visszavonása."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Most nem."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Fiók kiválasztása"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Fiók hozzáadása"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Melyik alkalmazást szeretné használni?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Fiók hozzáadása"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Növelés"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Csökkentés"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> érintse meg és tartsa"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-tár"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Szerkesztés..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Adathasználati figyelmeztetés"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Érintse meg az adatokért"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G adatforgalom letiltva"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G adatforgalom letiltva"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil adatforgalom letiltva"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index cdcf600cb1b9..aea1a4c6f8f8 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"tambahkan ke kamus"</string>
- <string name="deleteText" msgid="7070985395199629156">"hapus"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metode masukan"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Ruang penyimpanan tinggal sedikit"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Urungkan penghapusan."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Jangan lakukan apa pun untuk saat ini."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Pilih akun"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Tambahkan akun"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Akun mana yang ingin Anda gunakan?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Penambahan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Pengurangan"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketuk dan tahan."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Penyimpanan USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Edit..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Peringatan penggunaan data"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Sentuh utk mlht pnggnaan dan stln"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data 2G-3G dinonaktifkan"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data 4G dinonaktifkan"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Data seluler dinonaktifkan"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 6e9c9d0c4a10..419caf40e09e 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1109,9 +1109,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Annulla le eliminazioni."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Non fare nulla per ora."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Seleziona un account"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Aggiungi un account"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Quale account desideri utilizzare?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Aggiungi account"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumenta"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuisci"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tocca e tieni premuto il numero <xliff:g id="VALUE">%s</xliff:g>."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 02ad8fd41907..c0c1695a4bc1 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string>
<string name="selectTextMode" msgid="6738556348861347240">"בחר טקסט..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"הוסף למילון"</string>
- <string name="deleteText" msgid="7070985395199629156">"מחק"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"חסר שטח"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"בטל את המחיקות."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"אל תעשה דבר בינתיים."</string>
<string name="choose_account_label" msgid="4191313562041125787">"בחר חשבון"</string>
- <string name="add_account_label" msgid="2935267344849993553">"הוסף חשבון"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"באיזה חשבון ברצונך להשתמש?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"הוסף חשבון"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"הגדל"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"הפחת"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> הקש והחזק."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"אמצעי אחסון מסוג USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"ערוך..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"אזהרת שימוש בנתונים"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"גע כדי להציג נתוני שימוש והגדרות"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"נתוני 2G-3G מושבתים"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"נתוני 4G מושבתים"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"נתונים לנייד מושבתים"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 53c361fcc3f5..793e947822db 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"URLをコピー"</string>
<string name="selectTextMode" msgid="6738556348861347240">"テキストを選択..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"テキスト選択"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"辞書に追加"</string>
- <string name="deleteText" msgid="7070985395199629156">"削除"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"入力方法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"テキスト操作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"空き容量低下"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"削除を元に戻す"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"今は何もしない"</string>
<string name="choose_account_label" msgid="4191313562041125787">"アカウントを選択"</string>
- <string name="add_account_label" msgid="2935267344849993553">"アカウントを追加"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"どのアカウントを使用しますか?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"アカウントを追加"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"増やす"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"減らす"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g>回タップして押し続けます。"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USBストレージ"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"編集..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"データ使用の警告"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"タップして使用状況と設定を表示"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G~3Gデータが無効になりました"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4Gデータが無効になりました"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"モバイルデータが無効になりました"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 7472f9dd1cbe..42a6e3715c91 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"URL 복사"</string>
<string name="selectTextMode" msgid="6738556348861347240">"텍스트 선택..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"텍스트 선택"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"사전에 추가"</string>
- <string name="deleteText" msgid="7070985395199629156">"삭제"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"텍스트 작업"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"저장공간 부족"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"삭제 실행취소"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"나중에 작업"</string>
<string name="choose_account_label" msgid="4191313562041125787">"계정 선택"</string>
- <string name="add_account_label" msgid="2935267344849993553">"계정 추가"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"어떤 계정을 사용하시겠습니까?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"계정 추가"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"올리기"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"줄이기"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 길게 탭하세요."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB 저장소"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"수정..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"데이터 사용 경고"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"사용량 및 설정을 보려면 터치하세요."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G 데이터 사용중지됨"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G 데이터 사용중지됨"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"모바일 데이터 사용중지됨"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7cfea8f3b27c..3a3011437444 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopijuoti URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pasirinkti tekstą..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksto pasirinkimas"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"pridėti prie žodyno"</string>
- <string name="deleteText" msgid="7070985395199629156">"ištrinti"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Įvesties būdas"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mažai vietos"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Anuliuoti ištrynimus."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Kol kas nieko nedaryti."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Pasirinkti paskyrą"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Pridėti paskyrą"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Kurią paskyrą norite naudoti?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Pridėti paskyrą"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Padidinti"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Sumažinti"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Palieskite <xliff:g id="VALUE">%s</xliff:g> ir laikykite palietę."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB atmintis"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Redaguoti..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Įspėjimas dėl duomenų naudojimo"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Palieskite ir žr. naud. ir nust."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G duomenys neleidžiami"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G duomenys neleidžiami"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilieji duomenys neleidžiami"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 1fc5c637807c..e9a01e99d86a 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopēt URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Atlasīt tekstu..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksta atlase"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"pievienot vārdnīcai"</string>
- <string name="deleteText" msgid="7070985395199629156">"dzēst"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Ievades metode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksta darbības"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Maz brīvas vietas"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Atsauciet dzēšanu."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Pagaidām neveiciet nekādas darbības."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Atlasīt kontu"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Pievienot kontu"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Kuru kontu vēlaties izmantot?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Pievienot kontu"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Palielināt"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Samazināt"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g>: pieskarieties un turiet nospiestu."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB atmiņa"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Rediģēt..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Datu izmantošanas brīdinājums"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Piesk., lai sk. lietoš. un iest."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G dati ir atspējoti"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G dati ir atspējoti"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilie dati ir atspējoti"</string>
diff --git a/core/res/res/values-mcc204-cs/strings.xml b/core/res/res/values-mcc204-cs/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-da/strings.xml b/core/res/res/values-mcc204-da/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-de/strings.xml b/core/res/res/values-mcc204-de/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-el/strings.xml b/core/res/res/values-mcc204-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc204-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-es-rUS/strings.xml b/core/res/res/values-mcc204-es-rUS/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-es/strings.xml b/core/res/res/values-mcc204-es/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-fr/strings.xml b/core/res/res/values-mcc204-fr/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-it/strings.xml b/core/res/res/values-mcc204-it/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-ja/strings.xml b/core/res/res/values-mcc204-ja/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-ko/strings.xml b/core/res/res/values-mcc204-ko/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-nl/strings.xml b/core/res/res/values-mcc204-nl/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-pl/strings.xml b/core/res/res/values-mcc204-pl/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-pt-rPT/strings.xml b/core/res/res/values-mcc204-pt-rPT/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-pt/strings.xml b/core/res/res/values-mcc204-pt/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-ru/strings.xml b/core/res/res/values-mcc204-ru/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-sv/strings.xml b/core/res/res/values-mcc204-sv/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-tr/strings.xml b/core/res/res/values-mcc204-tr/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-zh-rCN/strings.xml b/core/res/res/values-mcc204-zh-rCN/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-zh-rTW/strings.xml b/core/res/res/values-mcc204-zh-rTW/strings.xml
new file mode 100644
index 000000000000..7d962307a3de
--- /dev/null
+++ b/core/res/res/values-mcc204-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-cs/strings.xml b/core/res/res/values-mcc230-cs/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-da/strings.xml b/core/res/res/values-mcc230-da/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-de/strings.xml b/core/res/res/values-mcc230-de/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-el/strings.xml b/core/res/res/values-mcc230-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc230-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-es-rUS/strings.xml b/core/res/res/values-mcc230-es-rUS/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-es/strings.xml b/core/res/res/values-mcc230-es/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-fr/strings.xml b/core/res/res/values-mcc230-fr/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-it/strings.xml b/core/res/res/values-mcc230-it/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-ja/strings.xml b/core/res/res/values-mcc230-ja/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-ko/strings.xml b/core/res/res/values-mcc230-ko/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-nl/strings.xml b/core/res/res/values-mcc230-nl/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-pl/strings.xml b/core/res/res/values-mcc230-pl/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-pt-rPT/strings.xml b/core/res/res/values-mcc230-pt-rPT/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-pt/strings.xml b/core/res/res/values-mcc230-pt/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-ru/strings.xml b/core/res/res/values-mcc230-ru/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-sv/strings.xml b/core/res/res/values-mcc230-sv/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-tr/strings.xml b/core/res/res/values-mcc230-tr/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-zh-rCN/strings.xml b/core/res/res/values-mcc230-zh-rCN/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-zh-rTW/strings.xml b/core/res/res/values-mcc230-zh-rTW/strings.xml
new file mode 100644
index 000000000000..d3ecdbba28ed
--- /dev/null
+++ b/core/res/res/values-mcc230-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-cs/strings.xml b/core/res/res/values-mcc232-cs/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-da/strings.xml b/core/res/res/values-mcc232-da/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-de/strings.xml b/core/res/res/values-mcc232-de/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-el/strings.xml b/core/res/res/values-mcc232-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc232-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-es-rUS/strings.xml b/core/res/res/values-mcc232-es-rUS/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-es/strings.xml b/core/res/res/values-mcc232-es/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-fr/strings.xml b/core/res/res/values-mcc232-fr/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-it/strings.xml b/core/res/res/values-mcc232-it/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-ja/strings.xml b/core/res/res/values-mcc232-ja/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-ko/strings.xml b/core/res/res/values-mcc232-ko/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-nl/strings.xml b/core/res/res/values-mcc232-nl/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-pl/strings.xml b/core/res/res/values-mcc232-pl/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-pt-rPT/strings.xml b/core/res/res/values-mcc232-pt-rPT/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-pt/strings.xml b/core/res/res/values-mcc232-pt/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-ru/strings.xml b/core/res/res/values-mcc232-ru/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-sv/strings.xml b/core/res/res/values-mcc232-sv/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-tr/strings.xml b/core/res/res/values-mcc232-tr/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-zh-rCN/strings.xml b/core/res/res/values-mcc232-zh-rCN/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-zh-rTW/strings.xml b/core/res/res/values-mcc232-zh-rTW/strings.xml
new file mode 100644
index 000000000000..4773838f9c47
--- /dev/null
+++ b/core/res/res/values-mcc232-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-cs/strings.xml b/core/res/res/values-mcc234-cs/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-da/strings.xml b/core/res/res/values-mcc234-da/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-de/strings.xml b/core/res/res/values-mcc234-de/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-el/strings.xml b/core/res/res/values-mcc234-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc234-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-es-rUS/strings.xml b/core/res/res/values-mcc234-es-rUS/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-es/strings.xml b/core/res/res/values-mcc234-es/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-fr/strings.xml b/core/res/res/values-mcc234-fr/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-it/strings.xml b/core/res/res/values-mcc234-it/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-ja/strings.xml b/core/res/res/values-mcc234-ja/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-ko/strings.xml b/core/res/res/values-mcc234-ko/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-nl/strings.xml b/core/res/res/values-mcc234-nl/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-pl/strings.xml b/core/res/res/values-mcc234-pl/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-pt-rPT/strings.xml b/core/res/res/values-mcc234-pt-rPT/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-pt/strings.xml b/core/res/res/values-mcc234-pt/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-ru/strings.xml b/core/res/res/values-mcc234-ru/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-sv/strings.xml b/core/res/res/values-mcc234-sv/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-tr/strings.xml b/core/res/res/values-mcc234-tr/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-zh-rCN/strings.xml b/core/res/res/values-mcc234-zh-rCN/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-zh-rTW/strings.xml b/core/res/res/values-mcc234-zh-rTW/strings.xml
new file mode 100644
index 000000000000..2538b7329239
--- /dev/null
+++ b/core/res/res/values-mcc234-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-cs/strings.xml b/core/res/res/values-mcc260-cs/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-da/strings.xml b/core/res/res/values-mcc260-da/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-de/strings.xml b/core/res/res/values-mcc260-de/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-el/strings.xml b/core/res/res/values-mcc260-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc260-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-es-rUS/strings.xml b/core/res/res/values-mcc260-es-rUS/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-es/strings.xml b/core/res/res/values-mcc260-es/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-fr/strings.xml b/core/res/res/values-mcc260-fr/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-it/strings.xml b/core/res/res/values-mcc260-it/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-ja/strings.xml b/core/res/res/values-mcc260-ja/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-ko/strings.xml b/core/res/res/values-mcc260-ko/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-nl/strings.xml b/core/res/res/values-mcc260-nl/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-pl/strings.xml b/core/res/res/values-mcc260-pl/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-pt-rPT/strings.xml b/core/res/res/values-mcc260-pt-rPT/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-pt/strings.xml b/core/res/res/values-mcc260-pt/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-ru/strings.xml b/core/res/res/values-mcc260-ru/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-sv/strings.xml b/core/res/res/values-mcc260-sv/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-tr/strings.xml b/core/res/res/values-mcc260-tr/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-zh-rCN/strings.xml b/core/res/res/values-mcc260-zh-rCN/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-zh-rTW/strings.xml b/core/res/res/values-mcc260-zh-rTW/strings.xml
new file mode 100644
index 000000000000..1161f9a6356f
--- /dev/null
+++ b/core/res/res/values-mcc260-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-cs/strings.xml b/core/res/res/values-mcc262-cs/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-da/strings.xml b/core/res/res/values-mcc262-da/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-de/strings.xml b/core/res/res/values-mcc262-de/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-el/strings.xml b/core/res/res/values-mcc262-el/strings.xml
new file mode 100644
index 000000000000..97bfe651ee52
--- /dev/null
+++ b/core/res/res/values-mcc262-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-es-rUS/strings.xml b/core/res/res/values-mcc262-es-rUS/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-es-rUS/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-es/strings.xml b/core/res/res/values-mcc262-es/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-fr/strings.xml b/core/res/res/values-mcc262-fr/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-it/strings.xml b/core/res/res/values-mcc262-it/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-ja/strings.xml b/core/res/res/values-mcc262-ja/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-ja/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-ko/strings.xml b/core/res/res/values-mcc262-ko/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-ko/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-nl/strings.xml b/core/res/res/values-mcc262-nl/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-pl/strings.xml b/core/res/res/values-mcc262-pl/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-pt-rPT/strings.xml b/core/res/res/values-mcc262-pt-rPT/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-pt/strings.xml b/core/res/res/values-mcc262-pt/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-pt/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-ru/strings.xml b/core/res/res/values-mcc262-ru/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-ru/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-sv/strings.xml b/core/res/res/values-mcc262-sv/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-tr/strings.xml b/core/res/res/values-mcc262-tr/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-zh-rCN/strings.xml b/core/res/res/values-mcc262-zh-rCN/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-zh-rCN/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-zh-rTW/strings.xml b/core/res/res/values-mcc262-zh-rTW/strings.xml
new file mode 100644
index 000000000000..9505cf4b4226
--- /dev/null
+++ b/core/res/res/values-mcc262-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index ec49be79dcba..bdb43eebac5b 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -859,7 +859,10 @@
<string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string>
- <!-- outdated translation 2839899368418071843 --> <string name="addToDictionary" msgid="9090375111134433012">"+ tambah ke kamus"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
<!-- no translation found for deleteText (7070985395199629156) -->
<skip />
<string name="inputMethod" msgid="1653630062304567879">"Kaedah input"</string>
@@ -1110,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Buat asal pemadaman."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Jangan lakukan apa-apa sekarang."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Pilih akaun"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Tambah akaun"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Akaun mana yang anda ingin gunakan?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Tambah akaun"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Kenaikan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Penyusutan"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketik dan tahan."</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index f01bedc3cddd..e879f9b228fd 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopier URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Merket tekst"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"legg til i ordliste"</string>
- <string name="deleteText" msgid="7070985395199629156">"slett"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Lite plass"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Opphev slettinger."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Ikke gjør noe nå."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Velg en konto"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Legg til en konto"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Hvilken konto vil du bruke?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Legg til konto"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Øke"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Senke"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> trykk og hold inne."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Rediger"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel for høyt dataforbruk"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Berør for å se bruk og innst."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G-data er deaktivert"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-data er deaktivert"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata er deaktivert"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 0fbe538b818e..5d22f64631ca 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"URL kopiëren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Tekst selecteren..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstselectie"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"toevoegen aan woordenboek"</string>
- <string name="deleteText" msgid="7070985395199629156">"verwijderen"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstacties"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Weinig ruimte"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Verwijderingen ongedaan maken."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Nu niets doen."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Selecteer een account"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Een account toevoegen"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Welk account wilt u gebruiken?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Account toevoegen"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Hoger"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Lager"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tik <xliff:g id="VALUE">%s</xliff:g> keer en blijf aanraken."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-opslag"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Bewerken..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Waarschuwing v. gegevensgebruik"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Aanraken: gebruik/inst. bekijken"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-gegevens uitgeschakeld"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-gegevens uitgeschakeld"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobiele gegevens uitgeschakeld"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d2cf3e5077a0..56553cd4e7b5 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"dodaj do słownika"</string>
- <string name="deleteText" msgid="7070985395199629156">"usuń"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Sposób wprowadzania tekstu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Działania na tekście"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mało miejsca"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Cofnij usunięcie."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Nie wykonuj teraz żadnych czynności."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Wybierz konto"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Dodaj konto"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Którego konta chcesz użyć?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj konto"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zwiększ"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmniejsz"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotknij i przytrzymaj."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Nośnik USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Edytuj..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Ostrzeżenie o transmisji danych"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Zobacz wykorzystanie i ustawienia"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Wyłączono transmisję danych 2G/3G"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Wyłączono transmisję danych 4G"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Wyłączono komórkową transm. danych"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 962405b74ebb..e60a3c8788ad 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"adicionar ao dicionário"</string>
- <string name="deleteText" msgid="7070985395199629156">"eliminar"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acções de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço livre"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Anular as eliminações."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por agora."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar conta"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Que conta gostaria de utilizar?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuir"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Toque sem soltar em <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso de utilização de dados"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Toque para ver a utilização e as definições"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Os dados 2G-3G estão desativados"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Os dados 4G estão desativados"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Os dados móveis estão desativados"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 9dc709867514..de8266b8463d 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"adicionar ao dicionário"</string>
- <string name="deleteText" msgid="7070985395199629156">"excluir"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ações de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Desfazer as exclusões."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por enquanto."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Selecione uma conta"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Que conta você gostaria de usar?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Redução"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> toque e mantenha pressionado."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso sobre uso de dados"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Tocar p/ ver uso e configurações"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Dados 2G e 3G desativados"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Dados 4G desativados"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Dados móveis desativados"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 47acf80959e2..c5384507c7f7 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Copiaţi adresa URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selectaţi text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selectare text"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"adăugaţi în dicţionar"</string>
- <string name="deleteText" msgid="7070985395199629156">"ştergeţi"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metodă de intrare"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acţiuni pentru text"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Spaţiu de stocare redus"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Anulaţi aceste ştergeri."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Pentru moment, nu efectuaţi nicio acţiune."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Selectaţi un cont"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Adăugaţi un cont"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Ce cont doriţi să utilizaţi?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Adăugaţi un cont"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementaţi"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrementaţi"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Apăsaţi şi ţineţi apăsat <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Dsipozitiv de stocare USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Editaţi..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avertisment de utiliz. a datelor"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Ating. pt. afiş. utiliz./setări"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datele 2G-3G au fost dezactivate"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datele 4G au fost dezactivate"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datele mobile au fost dezactiv."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 15318834ad30..2ca256ff88a6 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -671,10 +671,10 @@
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Количество неудачных попыток ввода PIN-кода: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. После нескольких неудачных попыток (<xliff:g id="NUMBER_1">%d</xliff:g>) вам будет предложено разблокировать планшетный ПК с помощью учетных данных Google."\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> с."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. После <xliff:g id="NUMBER_1">%d</xliff:g> неудачных попыток вам будет предложено разблокировать телефон с помощью учетных данных Google. "\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> с."</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Не удалось разблокировать планшетный ПК (число попыток: <xliff:g id="NUMBER_0">%d</xliff:g>). Осталось попыток: <xliff:g id="NUMBER_1">%d</xliff:g>. После этого будут установлены настройки по умолчанию, что приведет к удалению всех пользовательских данных."</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Не удалось разблокировать телефон (число попыток: <xliff:g id="NUMBER_0">%d</xliff:g>). Осталось попыток: <xliff:g id="NUMBER_1">%d</xliff:g>. После этого будут установлены настройки по умолчанию, что приведет к удалению всех пользовательских данных."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Не удалось разблокировать планшетный ПК (число попыток: <xliff:g id="NUMBER">%d</xliff:g>). Будут установлены настройки по умолчанию."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Не удалось разблокировать телефон (число попыток: <xliff:g id="NUMBER">%d</xliff:g>). Будут установлены настройки по умолчанию."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Количество неудачных попыток разблокировать планшетный ПК: <xliff:g id="NUMBER_0">%d</xliff:g>. Осталось попыток: <xliff:g id="NUMBER_1">%d</xliff:g>. После этого настройки будут сброшены до заводских, а данные пользователя потеряны."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Количество неудачных попыток разблокировать телефон: <xliff:g id="NUMBER_0">%d</xliff:g>. Осталось попыток: <xliff:g id="NUMBER_1">%d</xliff:g>. После этого настройки будут сброшены до заводских, а данные пользователя потеряны."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Количество неудачных попыток разблокировать планшетный ПК: <xliff:g id="NUMBER">%d</xliff:g>. Настройки будут сброшены до заводских."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Количество неудачных попыток разблокировать телефон: <xliff:g id="NUMBER">%d</xliff:g>. Настройки будут сброшены до заводских."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> с."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Забыли графический ключ?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Снятие блокировки аккаунта"</string>
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Копировать URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Выбрать текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Выбор текста"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"добавить в словарь"</string>
- <string name="deleteText" msgid="7070985395199629156">"удалить"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Операции с текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недостаточно места"</string>
@@ -881,8 +885,8 @@
<string name="chooseUsbActivity" msgid="7892597146032121735">"Выбор приложения для USB-устройства"</string>
<string name="noApplications" msgid="1691104391758345586">"Это действие не может выполнять ни одно приложение."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"В приложении \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" произошла ошибка."</string>
- <string name="aerr_process" msgid="4507058997035697579">"В приложении \"<xliff:g id="PROCESS">%1$s</xliff:g>\" произошла ошибка."</string>
+ <string name="aerr_application" msgid="932628488013092776">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> остановилось."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"Процесс \"<xliff:g id="PROCESS">%1$s</xliff:g>\" остановился."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="8339738283149696827">"Приложение \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" не отвечает."\n\n"Закрыть его?"</string>
<string name="anr_activity_process" msgid="7018289416670457797">"Приложение \"<xliff:g id="ACTIVITY">%1$s</xliff:g>\" не отвечает."\n\n"Закрыть его?"</string>
@@ -986,7 +990,7 @@
<string name="usb_storage_stop_error_message" msgid="143881914840412108">"При выключении USB-накопителя произошла неполадка. Убедитесь, что USB-хост отключен, и повторите попытку."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Включение USB-накопителя"</string>
<string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"При включении USB-накопителя некоторые используемые приложения могут прекратить работу и оставаться недоступными до отключения USB-накопителя."</string>
- <string name="dlg_error_title" msgid="7323658469626514207">"Ошибка при подключении USB"</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"Сбой подключения USB"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ОК"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Подключен как устройство хранения данных"</string>
<string name="usb_ptp_notification_title" msgid="1960817192216064833">"Подключен как камера"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Отменить удаления."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Ничего не делать сейчас."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Выберите аккаунт"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Добавить аккаунт"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Выберите аккаунт"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Добавить аккаунт"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличить"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Уменьшить"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Нажмите и удерживайте <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1136,7 +1143,7 @@
<string name="switch_off" msgid="7249798614327155088">"Выкл."</string>
<string name="togglebutton_pressed" msgid="4180411746647422233">"нажато"</string>
<string name="togglebutton_not_pressed" msgid="4495147725636134425">"не нажато"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Клавиша ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Клавиша Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Отмена"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Клавиша удаления"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"Готово"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-накопитель"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Изменить..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Осталось мало трафика"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Проверить трафик и настройки"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Передача данных 2G/3G отключена"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Передача данных 4G отключена"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобильный Интернет отключен"</string>
@@ -1190,7 +1200,7 @@
<string name="sha1_fingerprint" msgid="7930330235269404581">"Отпечаток SHA-1:"</string>
<string name="activity_chooser_view_see_all" msgid="180268188117163072">"Просмотреть все"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="3325054276356556835">"Выбор действия"</string>
- <string name="share_action_provider_share_with" msgid="1791316789651185229">"Настройка доступа"</string>
+ <string name="share_action_provider_share_with" msgid="1791316789651185229">"Поделиться с..."</string>
<string name="status_bar_device_locked" msgid="3092703448690669768">"Устройство заблокировано."</string>
<string name="list_delimeter" msgid="3975117572185494152">", "</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 2e9d2c3f685b..9cf846f03cb7 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Skopírovať adresu URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Vybrať text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Výber textu"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"pridať do slovníka"</string>
- <string name="deleteText" msgid="7070985395199629156">"odstrániť"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metóda vstupu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operácie s textom"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nedostatok pamäte"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátiť späť odstránenia."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Nevykonať akciu."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Vybrať účet"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Pridať účet"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Ktorý účet chcete použiť?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Pridať účet"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšenie"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zníženie"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Klepnite a podržte <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Ukladací priestor USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Upraviť..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornenie o využití dát"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Zobr. využívania dát a nastavení"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Dátové prenosy 2G a 3G zakázané"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Dátové prenosy 4G zakázané"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilné dátové prenosy zakázané"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index fdd0bd5aaeb4..5aa14486f2e6 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Izbiranje besedila ..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Izbrano besedilo"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"dodaj v slovar"</string>
- <string name="deleteText" msgid="7070985395199629156">"izbriši"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Način vnosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Besedilna dejanja"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Zmanjkuje pomnilnika"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Razveljavi brisanje."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Zaenkrat ne naredi ničesar."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Izberite račun"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Dodajanje računa"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Kateri račun želite uporabiti?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Povečaj"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmanjšaj"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tapnite in pridržite <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Pomnilnik USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Urejanje ..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Opozorilo o uporabi podatkov"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Dotik za prikaz uporabe in nast."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Podatki 2G-3G so onemogočeni"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Podatki 4G so onemogočeni"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilni podatki so onemogočeni"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 1cd49f23c5c4..f60e212d2d8e 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Копирај URL адресу"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Изабери текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Избор текста"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"додај у речник"</string>
- <string name="deleteText" msgid="7070985395199629156">"избриши"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мало простора"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Опозови брисања."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Не ради ништа за сада."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Избор налога"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Додај налог"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Који налог желите да користите?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Додај налог"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Повећање"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Смањење"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> додирните и задржите."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB меморија"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Измени..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Упозорење о потрошњи података"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Додир за коришћење и подешавања"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G подаци су онемогућени"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G подаци су онемогућени"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Подаци мобилне мреже су онемогућени"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 0e04ea9a1262..9a42ff33afab 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopiera webbadress"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Markera text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textmarkering"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"lägg till i ordlista"</string>
- <string name="deleteText" msgid="7070985395199629156">"ta bort"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Indatametod"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textåtgärder"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Dåligt med utrymme"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Ångra borttagningarna."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Gör ingenting just nu."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Välj ett konto"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Lägg till ett konto"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Vilket konto vill du använda?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Lägg till konto"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Öka"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Minska"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> knacka lätt och håll kvar."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Redigera..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Varning angående dataanvändning"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Tryck om du vill visa användning och inställningar"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data via 2G-3G har inaktiverats"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data via 4G har inaktiverats"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata har inaktiverats"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 133bd8121b96..f0f90c63f261 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -49,7 +49,7 @@
<string name="invalidPuk" msgid="8761456210898036513">"Andika PUK ambayo ina urefu wa nambari 8 au zaidi."</string>
<string name="needPuk" msgid="919668385956251611">"Kadi yako ya SIM imefungwa na PUK. Anika msimbo wa PUK ili kuifungua."</string>
<string name="needPuk2" msgid="4526033371987193070">"Chapisha PUK2 ili kufungua kadi ya SIM."</string>
- <string name="ClipMmi" msgid="6952821216480289285">"Kitambulisho cha Mpigaji wa Simu Inayoingia"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"ID ya Mpigaji simu Inayoingia"</string>
<string name="ClirMmi" msgid="7784673673446833091">"ID ya Mpigaji simu Inayotoka nje"</string>
<string name="CfMmi" msgid="5123218989141573515">"Kusambaza simu"</string>
<string name="CwMmi" msgid="9129678056795016867">"Simu inasubiriwa"</string>
@@ -63,7 +63,7 @@
<string name="CndMmi" msgid="3116446237081575808">"Uwasilishaji nambari ya kupiga simu"</string>
<string name="DndMmi" msgid="1265478932418334331">"Usisumbue"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo:Imezuiliwa"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Huduma haitathminiwi."</string>
@@ -131,8 +131,8 @@
<string name="me" msgid="6545696007631404292">"Mimi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Chaguo za kompyuta ndogo"</string>
<string name="power_dialog" product="default" msgid="1319919075463988638">"Machaguo ya simu"</string>
- <string name="silent_mode" msgid="7167703389802618663">"Hali ya kimya"</string>
- <string name="turn_on_radio" msgid="3912793092339962371">"Washa mtandao-hewa"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"Muundo wa kimya"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"Fungua bila waya"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"Zima pasiwaya"</string>
<string name="screen_lock" msgid="799094655496098153">"Funga skrini"</string>
<string name="power_off" msgid="4266614107412865048">"Nishati imezimwa"</string>
@@ -148,7 +148,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"Nishati imezimwa"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string>
- <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imefunguliwa"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"gumzo ya ndege"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndege IMEWASHWA"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"gumzo ya ndege IMEZIMWA"</string>
@@ -662,7 +662,7 @@
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"Kadi yako ya SIM imelemazwa kabisa. "\n" tafadhali wasiliana na mtoa huduma wako wa psiwaya ili kupata kadi nyingine ya SIM."</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Simu za dharura pekee"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Mtandao umefungwa"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Kadi ya SIM imefungwa na PUK."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Kadi ya SIM imefungwana PUK."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Tafadhali angalia Mwongozo wa Mtumiaji au wasiliana na Huduma kwa Wateja."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Kadi ya SIM imefungwa."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Inafungua kadi ya SIM..."</string>
@@ -680,7 +680,7 @@
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Fungua akaunti"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Majaribio mengi ya mchoro!"</string>
<string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"Kufungua, ingia na akaunti yako ya Google"</string>
- <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Jina la mtumiaji (barua pepe)"</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Jina la mtumiaji/Barua pepe)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Nenosiri"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Ingia"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Jina batili la mtumiaji au nywila"</string>
@@ -697,7 +697,7 @@
<string name="factorytest_failed" msgid="5410270329114212041">"Jaribio la kiwanda limeshindikana"</string>
<string name="factorytest_not_system" msgid="4435201656767276723">"Tendo la JARIBIO_LA KIWANDA linahimiliwa tu kwa furushi zilizosakinishwa katika /system/app."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"Hakuna furushi lililopatikana ambalo linatoa tendo la JARIBIO_LA KIWANDA."</string>
- <string name="factorytest_reboot" msgid="6320168203050791643">"Washa tena"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"Fungua upya"</string>
<string name="js_dialog_title" msgid="8143918455087008109">"Ukurasa ulio \'<xliff:g id="TITLE">%s</xliff:g>\' unasema:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"HatiJava"</string>
<string name="js_dialog_before_unload" msgid="1901675448179653089">"Toka kwa ukurasa huu?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Chagua Sawa ili kuendelea, au Ghairi ili kubaki kwenye ukurasa wa sasa."</string>
@@ -740,7 +740,7 @@
<string name="save_password_notnow" msgid="6389675316706699758">"Si Sasa"</string>
<string name="save_password_remember" msgid="6491879678996749466">"Kumbuka"</string>
<string name="save_password_never" msgid="8274330296785855105">"Katu"</string>
- <string name="open_permission_deny" msgid="5661861460947222274">"Huna idhini ya kufungua ukurasa huu."</string>
+ <string name="open_permission_deny" msgid="5661861460947222274">"Huna idhini ya kuona ukurasa huu."</string>
<string name="text_copied" msgid="4985729524670131385">"Maandishi yamenakiliwa kwenye ubao klipu."</string>
<string name="more_item_label" msgid="4650918923083320495">"Zaidi"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
@@ -830,7 +830,7 @@
<string name="day" msgid="8144195776058119424">"siku"</string>
<string name="days" msgid="4774547661021344602">"siku"</string>
<string name="hour" msgid="2126771916426189481">"saa"</string>
- <string name="hours" msgid="894424005266852993">"masaa"</string>
+ <string name="hours" msgid="894424005266852993">"saa"</string>
<string name="minute" msgid="9148878657703769868">"dakika"</string>
<string name="minutes" msgid="5646001005827034509">"Dakika"</string>
<string name="second" msgid="3184235808021478">"sekunde"</string>
@@ -859,11 +859,15 @@
<string name="copyUrl" msgid="2538211579596067402">"Nakili URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Chagua maandishi"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Uchaguzi wa maandishi?"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"ongeza kwa kamusi"</string>
- <string name="deleteText" msgid="7070985395199629156">"futa"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Mbinu ya uingizaji"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Vitendo vya maandishi"</string>
- <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nafasi ni ndogo"</string>
+ <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nafasi kidogo"</string>
<string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">" Nafasi ya hifadhi ya kompyuta ndogo inaisha."</string>
<string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Nafasi ya hifadhi ya simu inaisha."</string>
<string name="ok" msgid="5970060430562524910">"Sawa"</string>
@@ -930,7 +934,7 @@
<string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toni mlio chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="4440324407807468713">"Kimya"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"Toni za mlio"</string>
- <string name="ringtone_unknown" msgid="5477919988701784788">"Mlio amabo haujulikani"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"Mkirizo amabo haujulikani"</string>
<plurals name="wifi_available">
<item quantity="one" msgid="6654123987418168693">"Mtandao wa Wi-Fi unapatikana"</item>
<item quantity="other" msgid="4192424489168397386">"Mitandao ya Wi-Fi inapatikana"</item>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Tendua ufutaji."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Usifanye chochote kwa sasa."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Chagua akaunti"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Ongeza akaunti"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Akaunti gani ungependa kutumia?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Ongeza akaunti"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Ongezeko"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Punguza"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> gonga na shikilia"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Hifadhi ya USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Hariri..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Onyo la matumizi ya data"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Gusa ili kuangalia matumizi na mipangilio"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data ya 2G-3G imelemazwa"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data ya 4G imelemazwa"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Data ya simu imelemazwa"</string>
diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml
index 13bbac60f5c8..7fa76589957d 100644
--- a/core/res/res/values-sw600dp/config.xml
+++ b/core/res/res/values-sw600dp/config.xml
@@ -32,5 +32,8 @@
<!-- see comment in values/config.xml -->
<dimen name="config_prefDialogWidth">580dp</dimen>
+ <!-- If true, the screen can be rotated via the accelerometer in all 4
+ rotations as the default behavior. -->
+ <bool name="config_allowAllRotations">true</bool>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index ebeee42cc423..f535cae510f5 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"คัดลอก URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"เลือกข้อความ..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"การเลือกข้อความ"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"เพิ่มในพจนานุกรม"</string>
- <string name="deleteText" msgid="7070985395199629156">"ลบ"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"เหลือที่ว่างน้อย"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"เลิกทำการลบ"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"ไม่ต้องทำอะไรในขณะนี้"</string>
<string name="choose_account_label" msgid="4191313562041125787">"เลือกบัญชี"</string>
- <string name="add_account_label" msgid="2935267344849993553">"เพิ่มบัญชี"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"คุณต้องการใช้บัญชีใด"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"เพิ่มบัญชี"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"การเพิ่ม"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"การลด"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"แตะ <xliff:g id="VALUE">%s</xliff:g> ค้างไว้"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"ที่เก็บข้อมูล USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"แก้ไข..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"คำเตือนการใช้ข้อมูล"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"แตะเพื่อดูการใช้งานและการตั้งค่า"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"ปิดใช้งานข้อมูล 2G-3G"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"ปิดใช้งานข้อมูล 4G"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"ปิดใช้งานข้อมูลมือถือ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 4946c4d99aa1..3803181b2a9b 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopyahin ang URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pumili ng teksto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pagpili ng teksto"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"idagdag sa diksyunaryo"</string>
- <string name="deleteText" msgid="7070985395199629156">"tanggalin"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mababa sa espasyo"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"I-undo ang mga pagtanggal."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Walang gawin sa ngayon."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Pumili ng account"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Magdagdag ng account"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Aling account ang gusto mong gamitin?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Magdagdag ng account"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Taasan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Babaan"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tapikin at pindutin nang matagal."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"I-edit..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Babala sa paggamit ng data"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Pindutin upang tingnan ang paggamit at mga setting"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Di pinagana ang data ng 2G-3G"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Di pinagana ang data ng 4G"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Di pinagana ang data ng mobile"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 46eb1ed067b9..637cbd6f75d3 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -859,8 +859,12 @@
<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>
- <string name="addToDictionary" msgid="9090375111134433012">"sözlüğe ekle"</string>
- <string name="deleteText" msgid="7070985395199629156">"sil"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Giriş yöntemi"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Metin eylemleri"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Yer az"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Silme işlemlerini geri alın."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Şimdilik bir şey yapma."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Bir hesap seçin"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Hesap ekleyin"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Hangi hesabı kullanmak istersiniz?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Hesap ekle"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Artır"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Azalt"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> hafifçe vurun ve basılı tutun."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB depolama birimi"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Düzenle..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Veri kullanım uyarısı"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Kullanımı ve ayarları görmek için dokunun"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G verileri devre dışı"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G verileri devre dışı"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil veriler devre dışı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 8d2b826491db..1eb5ed0558f5 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Копіюв. URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Вибрати текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Вибір тексту"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"додати в словник"</string>
- <string name="deleteText" msgid="7070985395199629156">"видалити"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недост. місця"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Скасувати видалення."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Наразі нічого не робіть."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Вибрати обліковий запис"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Додати обліковий запис"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Який обліковий запис потрібно використовувати?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Додати облік. запис"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Додати"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Відняти"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – торкніться й утримуйте."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Носій USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Редагувати..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Застереження про використ. даних"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Торкн.для перегл.викор.і налашт."</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Дані 2G–3G вимкнено"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Дані 4G вимкнено"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобільне передав. даних вимкнено"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index a36e8a77c2b2..e4d342325159 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Sao chép URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Chọn văn bản..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Lựa chọn văn bản"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"thêm vào từ điển"</string>
- <string name="deleteText" msgid="7070985395199629156">"xóa"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Phương thức nhập"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tác vụ văn bản"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Còn ít dung lượng"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Hoàn tác các tác vụ xóa."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Ngay bây giờ bạn không cần làm gì cả."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Chọn tài khoản"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Thêm tài khoản"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Bạn muốn sử dụng tài khoản nào?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Thêm tài khoản"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Tăng dần"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Giảm dần"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Bấm và giữ <xliff:g id="VALUE">%s</xliff:g>."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Bộ lưu trữ USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Chỉnh sửa..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Cảnh báo sử dụng dữ liệu"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Chạm để xem việc s.dụng và c.đặt"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Đã tắt dữ liệu 2G-3G"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G dữ liệu bị vô hiệu hóa"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Dữ liệu di động bị vô hiệu hóa"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fb9d4c8b7d49..a306d6794dda 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"复制网址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"选择文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"文字选择"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"添加到词典"</string>
- <string name="deleteText" msgid="7070985395199629156">"删除"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"输入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"存储空间不足"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"撤消删除。"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"目前不进行任何操作。"</string>
<string name="choose_account_label" msgid="4191313562041125787">"选择帐户"</string>
- <string name="add_account_label" msgid="2935267344849993553">"添加帐户"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"您希望使用哪个帐户?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"添加帐户"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"减少"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"点按 <xliff:g id="VALUE">%s</xliff:g> 次并按住。"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB 存储器"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"编辑..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"数据使用情况警告"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"触摸可查看使用情况和设置"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G 数据已停用"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G 数据已停用"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"移动数据已停用"</string>
diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
index 06c9bccc5c27..a43f8572850b 100644
--- a/core/res/res/values-zh-rTW/donottranslate-cldr.xml
+++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
@@ -61,21 +61,21 @@
<string name="day_of_week_long_friday">星期五</string>
<string name="day_of_week_long_saturday">星期六</string>
- <string name="day_of_week_medium_sunday">周日</string>
- <string name="day_of_week_medium_monday">周一</string>
- <string name="day_of_week_medium_tuesday">周二</string>
- <string name="day_of_week_medium_wednesday">周三</string>
- <string name="day_of_week_medium_thursday">周四</string>
- <string name="day_of_week_medium_friday">周五</string>
- <string name="day_of_week_medium_saturday">周六</string>
+ <string name="day_of_week_medium_sunday">週日</string>
+ <string name="day_of_week_medium_monday">週一</string>
+ <string name="day_of_week_medium_tuesday">週二</string>
+ <string name="day_of_week_medium_wednesday">週三</string>
+ <string name="day_of_week_medium_thursday">週四</string>
+ <string name="day_of_week_medium_friday">週五</string>
+ <string name="day_of_week_medium_saturday">週六</string>
- <string name="day_of_week_short_sunday">周日</string>
- <string name="day_of_week_short_monday">周一</string>
- <string name="day_of_week_short_tuesday">周二</string>
- <string name="day_of_week_short_wednesday">周三</string>
- <string name="day_of_week_short_thursday">周四</string>
- <string name="day_of_week_short_friday">周五</string>
- <string name="day_of_week_short_saturday">周六</string>
+ <string name="day_of_week_short_sunday">週日</string>
+ <string name="day_of_week_short_monday">週一</string>
+ <string name="day_of_week_short_tuesday">週二</string>
+ <string name="day_of_week_short_wednesday">週三</string>
+ <string name="day_of_week_short_thursday">週四</string>
+ <string name="day_of_week_short_friday">週五</string>
+ <string name="day_of_week_short_saturday">週六</string>
<string name="day_of_week_shortest_sunday">日</string>
<string name="day_of_week_shortest_monday">一</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 37f4b3940a3a..6b13a9500d65 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"複製網址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"選取文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"新增至字典"</string>
- <string name="deleteText" msgid="7070985395199629156">"刪除"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"輸入方式"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"儲存空間即將不足"</string>
@@ -1109,9 +1113,12 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"復原刪除。"</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"暫不執行。"</string>
<string name="choose_account_label" msgid="4191313562041125787">"選取帳戶"</string>
- <string name="add_account_label" msgid="2935267344849993553">"新增帳戶"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"您要使用哪個帳戶?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"新增帳戶"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"減少"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 持續輕按。"</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"編輯..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"資料用量警告"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"輕觸即可查看使用量和設定"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"已停用 2G-3G 數據"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"已停用 4G 數據"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"已停用行動數據"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 845d4b10c075..f7dde4f3444c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -21,11 +21,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
- <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"I-KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"I-MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"I-GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"I-TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"I-PB"</string>
<string name="fileSizeSuffix" msgid="7670819340156489359">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="6071602020171759109">"&lt;untitled&gt;"</string>
<string name="ellipsis" msgid="7899829516048813237">"..."</string>
@@ -80,11 +80,11 @@
<string name="serviceClassVoice" msgid="1258393812335258019">"Izwi"</string>
<string name="serviceClassData" msgid="872456782077937893">"Idatha"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"Ifeksi"</string>
- <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"I-SMS"</string>
<string name="serviceClassDataAsync" msgid="4523454783498551468">"Vumelanisa"</string>
<string name="serviceClassDataSync" msgid="7530000519646054776">"Vumelanisa"</string>
<string name="serviceClassPacket" msgid="6991006557993423453">"Iphakethe"</string>
- <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"I-PAD"</string>
<string name="roamingText0" msgid="7170335472198694945">"Isikhombisi Sokuzulazula Sivuliwe"</string>
<string name="roamingText1" msgid="5314861519752538922">"Isibonisi Sokuzulazula Sivaliwe"</string>
<string name="roamingText2" msgid="8969929049081268115">"Isikhombisi Sokuzulazula Siyafulesha"</string>
@@ -285,7 +285,7 @@
<string name="permlab_deletePackages" msgid="3343439331576348805">"susa izinhlelo zokusebenza"</string>
<string name="permdesc_deletePackages" msgid="3634943677518723314">"Ivumela izinhlelo zokusebenza ukususa amaphakheji e-Android. Izinhlelo zokusebenza ezinonya zingase zisebenzise lokhu ukususa izinhlelo zokusebenza ezibalulekile."</string>
<string name="permlab_clearAppUserData" msgid="2192134353540277878">"susa enye idatha yezinhlelo zokusebenza"</string>
- <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Ivumela uhlelo lokusebenza ukuthi lisule idatha yomsebenzisi."</string>
+ <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Ivumela uhlelo lokusebenza ukuba lisule idatha yomsebenzisi."</string>
<string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"susa ezinye izilondolozi zesikhashana zezinhlelo zokusebenza"</string>
<string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"Ivumela uhlelo lokusebenza ukususa amafayela okulondoloza okwesikhashana."</string>
<string name="permlab_getPackageSize" msgid="4799785352306641460">"linganisa isikhala sokugcina uhlelo lokusebenza"</string>
@@ -336,7 +336,7 @@
<string name="permdesc_writeCalendar" msgid="5368129321997977226">"Ivumela uhlelo lokusebenza ukuthumela izimemo njengomnikazi wekhalenda futhi ufake, ukhiphe, ushintshe izenzakalo ongakwazi ukuziguqula kwidivaysi yakho, kuhlanganise lezo zabangani noma osebenza nabo. Uhlelo lokusebenza olu-malicious olunalemvume lungase luthumele ama-imeyili angafuneki ukuba aphume kubanikazi bekhalenda, luguqule izenzakalo ngaphandle kolwazi lomnikazi, noma lufake izenzakalo mbumbulu ezintsha."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"lungisela imithombo yendawo ukuhlolwa"</string>
<string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Yenza imithombo yendawo ukuhlola. Izinhlelo ezinonya zingase zisebenzise lokhu ukukhipha indawo futhi/noma isimo esibuyiswe imithombo yendawo yangempela njengabahlinzeki be-GPS noma Inethiwekhi."</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"finyelela kweminye imiyalo yokunikeza indawo"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"finyelela eminye imiyalo yokunikeza indawo"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Finyelela kweminye imiyalo yendawo eyengeziwe. Izinhlelo ezinonya zingase zisebenzise lokhu ukuphazamaisa ukusebenza kwe-GPS noma eminye imithombo yezinye izindawo."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"imvume yokufaka umhlinzeki wendawo"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Yenza imithombo yokudlala ukuhlola. Izinhlelo ezinonya zingase zisebenzise lokhu ukukhipha indawo futhi/noma isimo esibuyiswe imithombo yendawo yangempela njenge-GPS noma abahlinzeki Benethiwekhi noma zigade futhi zibike indawo yakho njengomthombo wangaphandle."</string>
@@ -397,7 +397,7 @@
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Ivumela uhlelo lokusebenza ukuqalisa amalungiselelo e-CDMA. Izinhlelo ezinonya ngokungadingekile zingaqalisa amalungiselelo e-CDMA."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"lawula izaziso zokubuyekeza indawo"</string>
<string name="permdesc_locationUpdates" msgid="2300018303720930256">"Ivumela ukuvula/ukuvimbela izaziso zesibuyekezo sendawo kusuka emsakazweni. Akumele isebenziswe izinhlelo zokusebenza ezivamile."</string>
- <string name="permlab_checkinProperties" msgid="7855259461268734914">"finyelela kwizakhiwo zokuhlola"</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"finyelela izakhiwo zokuhlola"</string>
<string name="permdesc_checkinProperties" msgid="7150307006141883832">"Ivumela ukufinyelela kokufunda/ukubhalela ezicini ezilayishwe insizakalo zokuhlola. Akuyona eyokusebenziswa izinhlelo zokusebenza ezivamile."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"khetha izinqunjwana"</string>
<string name="permdesc_bindGadget" msgid="2098697834497452046">"Ivumela uhlelo lokusebenza ukutshela isistimu ukuthi yimaphi amawijethi angasebenziswa yiziphi izinhlelo zokusebenza. Ngalemvume, izinhlelo zokusebenza zinganikeza ukufinyelela idatha yomuntu siqu kwezinye izinhlelo zokusebenza. Ayisebenziswa izinhlelo zokusebenza ezivamile."</string>
@@ -678,7 +678,7 @@
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Zama futhi emizuzwini engu <xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ukhohlwe iphethini?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Ukuvulwa kwe-akhawunti"</string>
- <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Kunemizamo eminingi kakhulu yephathini!"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Kunemizama eminingi kakhulu yephathini!"</string>
<string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"Ukuvula, ngena ngemvumekwi-akhawunti ye-Google"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Igama lomsebenzisi (i-imeyli)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"I-password"</string>
@@ -859,8 +859,12 @@
<string name="copyUrl" msgid="2538211579596067402">"Kopisha i-URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Khetha umbhalo..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Inketho yombhalo"</string>
- <string name="addToDictionary" msgid="9090375111134433012">"Faka esichazinimazwi"</string>
- <string name="deleteText" msgid="7070985395199629156">"susa"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (9090375111134433012) -->
+ <skip />
+ <!-- no translation found for deleteText (7070985395199629156) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Indlela yokufakwayo"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Izenzo zombhalo"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Isikhala sincane"</string>
@@ -876,9 +880,9 @@
<string name="capital_off" msgid="6815870386972805832">"VALIWE"</string>
<string name="whichApplication" msgid="4533185947064773386">"Qedela isenzo usebenzisa"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Sebenzisa ngokuzenzakalelayo kulesenzo."</string>
- <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Sula okuzenzakalelayo Emalungiselelweni Asekhaya; Uhlelo Lokusebenza; Phatha izinhlelo zokusebenza"</string>
+ <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Sula okuzenzakalelayo Emalungiselelweni Asekhaya &gt; Uhlelo Lokusebenza &gt; Phatha izinhlelo zokusebenza"</string>
<string name="chooseActivity" msgid="1009246475582238425">"Khetha isenzo"</string>
- <string name="chooseUsbActivity" msgid="7892597146032121735">"Khethela idivayisi ye-USB uhlelo lokusebenza"</string>
+ <string name="chooseUsbActivity" msgid="7892597146032121735">"Khethela idivayisi ye-USB uhlelolokusebenza"</string>
<string name="noApplications" msgid="1691104391758345586">"Azikho izinhlelo zokusebenza ezingenza lesi sinyathelo."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"Ngeshwa, <xliff:g id="APPLICATION">%1$s</xliff:g> kumile."</string>
@@ -1109,11 +1113,14 @@
<string name="sync_undo_deletes" msgid="8610996708225006328">"Guqula okususiwe."</string>
<string name="sync_do_nothing" msgid="8717589462945226869">"Ungenzi lutho okwamanje."</string>
<string name="choose_account_label" msgid="4191313562041125787">"Khetha i-akhawunti"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Yengeza i-akhawunti"</string>
- <string name="choose_account_text" msgid="6891230675141555481">"Ikuphi ongathanda ukukusebenzisa?"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Engeza i-akhawunti"</string>
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for choose_account_text (6891230675141555481) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
<string name="number_picker_increment_button" msgid="4830170763103463443">"Nciphisa"</string>
- <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string>
+ <string name="number_picker_decrement_button" msgid="2576606679160067262">"i-Descrement"</string>
<string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> chofoza bese ucindezela."</string>
<string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Shishilizisa kwenyuke kuye ekwenyusweni kwehle kuye ekwehlisweni."</string>
<string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Umzuzu wokwenyusa."</string>
@@ -1161,7 +1168,10 @@
<string name="storage_usb" msgid="3017954059538517278">"Isitoreji se-USB"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Hlela..."</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Isexwayiso sokusetshenziswa kwedatha"</string>
- <string name="data_usage_warning_body" msgid="7217480745540055170">"Thinta ze ubone ukusebenza kanye nezisetho"</string>
+ <!-- unknown placeholder SIZE in data_usage_warning_body -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (7217480745540055170) -->
+ <skip />
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Idatha ye-2G-3G ikhubasekisiwe"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Idatha ye-4G ikhubazekisiwe"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Idatha yeselula ikhubazekile"</string>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 11531fc65d5f..727c6ea36d58 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -710,11 +710,12 @@
<enum name="preferExternal" value="2" />
</attr>
- <!-- Extra options for an activity's UI. If specified on the application
+ <!-- Extra options for an activity's UI. Applies to either the {@code &lt;activity&gt;} or
+ {@code &lt;application&gt;} tag. If specified on the {@code &lt;application&gt;}
tag these will be considered defaults for all activities in the
application. -->
<attr name="uiOptions">
- <!-- No extra UI options. -->
+ <!-- No extra UI options. This is the default. -->
<flag name="none" value="0" />
<!-- Split the options menu into a separate bar at the bottom of
the screen when severely constrained for horizontal space.
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index ddb99426c56e..f0c6d09acc0c 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -112,6 +112,9 @@
<color name="lockscreen_clock_am_pm">#ff9a9a9a</color>
<color name="lockscreen_owner_info">#ff9a9a9a</color>
+ <!-- FaceLock -->
+ <color name="facelock_color_background">#000000</color>
+
<!-- For holo theme -->
<drawable name="screen_background_holo_light">#fff3f3f3</drawable>
<drawable name="screen_background_holo_dark">#ff000000</drawable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 8fea35f7dea7..ae39760a2a01 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -138,6 +138,18 @@
<item>"0,1"</item>
</string-array>
+ <!-- Set of NetworkInfo.getType() that reflect data usage. -->
+ <integer-array translatable="false" name="config_data_usage_network_types">
+ <item>0</item> <!-- TYPE_MOBILE -->
+ <item>2</item> <!-- TYPE_MOBILE_MMS -->
+ <item>3</item> <!-- TYPE_MOBILE_SUPL -->
+ <item>4</item> <!-- TYPE_MOBILE_DUN -->
+ <item>5</item> <!-- TYPE_MOBILE_HIPRI -->
+ <item>10</item> <!-- TYPE_MOBILE_FOTA -->
+ <item>11</item> <!-- TYPE_MOBILE_IMS -->
+ <item>12</item> <!-- TYPE_MOBILE_CBS -->
+ </integer-array>
+
<!-- The maximum duration (in milliseconds) we expect a network transition to take -->
<integer name="config_networkTransitionTimeout">60000</integer>
@@ -231,7 +243,7 @@
<!-- If true, the screen can be rotated via the accelerometer in all 4
rotations as the default behavior. -->
- <bool name="config_allowAllRotations">true</bool>
+ <bool name="config_allowAllRotations">false</bool>
<!-- If true, the direction rotation is applied to get to an application's requested
orientation is reversed. Normally, the model is that landscape is
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index f1fc42c60db9..1cd39117c450 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -158,7 +158,10 @@
<dimen name="keyguard_lockscreen_status_line_font_size">14sp</dimen>
<!-- Size of right margin on Unsecure unlock LockScreen -->
- <dimen name="keyguard_lockscreen_status_line_font_right_margin">45dip</dimen>
+ <dimen name="keyguard_lockscreen_status_line_font_right_margin">42dip</dimen>
+
+ <!-- Size of top margin on Clock font to edge on unlock LockScreen -->
+ <dimen name="keyguard_lockscreen_status_line_clockfont_top_margin">24dip</dimen>
<!-- Minimum popup width for selecting an activity in ActivityChooserDialog/ActivityChooserView. -->
<dimen name="activity_chooser_popup_min_width">200dip</dimen>
@@ -178,4 +181,6 @@
<!-- Default width for a textview error popup -->
<dimen name="textview_error_popup_default_width">240dip</dimen>
+ <!-- Volume panel y offset -->
+ <dimen name="volume_panel_top">80dp</dimen>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e093fa97d3cc..2d5d4cc8ff29 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -41,9 +41,13 @@
<string name="untitled">&lt;untitled&gt;</string>
<!-- Used to replace a range of characters in text that is too wide
- for the space allocated to it. -->
+ for the space allocated to it (three dots). -->
<string name="ellipsis">\u2026</string>
+ <!-- Used to replace a range of characters in text that is too wide
+ for the space allocated to it (two dots). -->
+ <string name="ellipsis_two_dots">\u2025</string>
+
<!-- How to display the lack of a phone number -->
<string name="emptyPhoneNumber">(No phone number)</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 346a3d299f5c..b6e213c79f27 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -250,7 +250,7 @@ please see styles_device_defaults.xml.
</style>
<style name="TextAppearance.EasyCorrectSuggestion" parent="TextAppearance.Suggestion">
- <item name="android:textUnderlineColor">@color/holo_blue_dark</item>
+ <item name="android:textUnderlineColor">#ff888888</item>
</style>
<style name="TextAppearance.MisspelledSuggestion" parent="TextAppearance.Suggestion">
@@ -524,10 +524,14 @@ please see styles_device_defaults.xml.
<style name="Widget.ImageButton.NumberPickerUpButton">
<item name="android:background">@android:drawable/numberpicker_up_btn</item>
+ <item name="android:paddingTop">22dip</item>
+ <item name="android:paddingBottom">22dip</item>
</style>
<style name="Widget.ImageButton.NumberPickerDownButton">
<item name="android:background">@android:drawable/numberpicker_down_btn</item>
+ <item name="android:paddingTop">22dip</item>
+ <item name="android:paddingBottom">22dip</item>
</style>
<style name="Widget.EditText.NumberPickerInputText">
@@ -1651,15 +1655,15 @@ please see styles_device_defaults.xml.
<style name="Widget.Holo.ImageButton.NumberPickerUpButton">
<item name="android:background">@null</item>
<item name="android:src">@android:drawable/numberpicker_up_btn_holo_dark</item>
- <item name="android:paddingTop">26dip</item>
- <item name="android:paddingBottom">26dip</item>
+ <item name="android:paddingTop">16dip</item>
+ <item name="android:paddingBottom">36dip</item>
</style>
<style name="Widget.Holo.ImageButton.NumberPickerDownButton">
<item name="android:background">@null</item>
<item name="android:src">@android:drawable/numberpicker_down_btn_holo_dark</item>
- <item name="android:paddingTop">26dip</item>
- <item name="android:paddingBottom">26dip</item>
+ <item name="android:paddingTop">36dip</item>
+ <item name="android:paddingBottom">16dip</item>
</style>
<style name="Widget.Holo.EditText.NumberPickerInputText">
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 3378dc85f7c2..1987d999d9a7 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -94,7 +94,7 @@ please see themes_device_defaults.xml.
<item name="textAppearanceButton">@android:style/TextAppearance.Widget.Button</item>
- <item name="editTextColor">?android:attr/textColorPrimaryInverse</item>
+ <item name="editTextColor">@android:color/primary_text_light</item>
<item name="editTextBackground">@android:drawable/edit_text</item>
<item name="candidatesTextStyleSpans">@android:string/candidates_style</item>
@@ -410,7 +410,7 @@ please see themes_device_defaults.xml.
<item name="textColorLink">@android:color/link_text_light</item>
<item name="textColorLinkInverse">@android:color/link_text_dark</item>
- <item name="editTextColor">?android:attr/textColorPrimary</item>
+ <item name="editTextColor">@android:color/primary_text_light</item>
<item name="listChoiceBackgroundIndicator">@android:drawable/list_selector_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
diff --git a/core/tests/bandwidthtests/Android.mk b/core/tests/bandwidthtests/Android.mk
index 3d56141afd43..6871efd7dc01 100644
--- a/core/tests/bandwidthtests/Android.mk
+++ b/core/tests/bandwidthtests/Android.mk
@@ -27,4 +27,4 @@ LOCAL_PACKAGE_NAME := BandwidthTests
include $(BUILD_PACKAGE)
-include $(call all-makefiles-under,$(LOCAL_PATH))
+include $(call all-makefiles-under,$(LOCAL_PATH)) \ No newline at end of file
diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java
index be740d3ec529..9eee2f0f1a99 100644
--- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java
+++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java
@@ -120,6 +120,42 @@ public class BandwidthTest extends InstrumentationTestCase {
}
/**
+ * Ensure that downloading on wifi reports reasonable stats.
+ */
+ @LargeTest
+ public void testWifiUpload() {
+ assertTrue(setDeviceWifiAndAirplaneMode(mSsid));
+ // Download a file from the server.
+ String ts = Long.toString(System.currentTimeMillis());
+ String targetUrl = BandwidthTestUtil.buildDownloadUrl(
+ mTestServer, FILE_SIZE, mDeviceId, ts);
+ File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME);
+ assertTrue(BandwidthTestUtil.DownloadFromUrl(targetUrl, tmpSaveFile));
+
+ ts = Long.toString(System.currentTimeMillis());
+ NetworkStats pre_test_stats = fetchDataFromProc(mUid);
+ TrafficStats.startDataProfiling(mContext);
+ assertTrue(BandwidthTestUtil.postFileToServer(mTestServer, mDeviceId, ts, tmpSaveFile));
+ NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext);
+ Log.d(LOG_TAG, prof_stats.toString());
+ NetworkStats post_test_stats = fetchDataFromProc(mUid);
+ NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats);
+
+ // Output measurements to instrumentation out, so that it can be compared to that of
+ // the server.
+ Bundle results = new Bundle();
+ results.putString("device_id", mDeviceId);
+ results.putString("timestamp", ts);
+ results.putInt("size", FILE_SIZE);
+ AddStatsToResults(PROF_LABEL, prof_stats, results);
+ AddStatsToResults(PROC_LABEL, proc_stats, results);
+ getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results);
+
+ // Clean up.
+ assertTrue(cleanUpFile(tmpSaveFile));
+ }
+
+ /**
* We want to make sure that if we use the Download Manager to download stuff,
* accounting still goes to the app making the call and that the numbers still make sense.
*/
diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java
index d850169bbad8..577767c4871c 100644
--- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java
+++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java
@@ -18,6 +18,15 @@ package com.android.bandwidthtest.util;
import android.util.Log;
+import com.android.internal.http.multipart.FilePart;
+import com.android.internal.http.multipart.MultipartEntity;
+import com.android.internal.http.multipart.Part;
+import com.android.internal.http.multipart.StringPart;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.ByteArrayBuffer;
import java.io.BufferedInputStream;
@@ -80,7 +89,7 @@ public class BandwidthTestUtil {
* Download a given file from a target url to a given destination file.
* @param targetUrl the url to download
* @param file the {@link File} location where to save to
- * @return true if it succeeded.
+ * @return true if it succeeded
*/
public static boolean DownloadFromUrl(String targetUrl, File file) {
try {
@@ -106,4 +115,39 @@ public class BandwidthTestUtil {
return true;
}
+ /**
+ * Post a given file for a given device and timestamp to the server.
+ * @param server {@link String} url of test server
+ * @param deviceId {@link String} device id that is uploading
+ * @param timestamp {@link String} timestamp
+ * @param file {@link File} to upload
+ * @return true if it succeeded
+ */
+ public static boolean postFileToServer(String server, String deviceId, String timestamp,
+ File file) {
+ try {
+ Log.d(LOG_TAG, "Uploading begining");
+ HttpClient httpClient = new DefaultHttpClient();
+ String uri = server;
+ if (!uri.endsWith("/")) {
+ uri += "/";
+ }
+ uri += "upload";
+ Log.d(LOG_TAG, "Upload url:" + uri);
+ HttpPost postRequest = new HttpPost(uri);
+ Part[] parts = {
+ new StringPart("device_id", deviceId),
+ new StringPart("timestamp", timestamp),
+ new FilePart("file", file)
+ };
+ MultipartEntity reqEntity = new MultipartEntity(parts, postRequest.getParams());
+ postRequest.setEntity(reqEntity);
+ HttpResponse res = httpClient.execute(postRequest);
+ res.getEntity().getContent().close();
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Could not upload file with error: " + e);
+ return false;
+ }
+ return true;
+ }
}
diff --git a/core/tests/coretests/apks/install_verifier_bad/Android.mk b/core/tests/coretests/apks/install_verifier_bad/Android.mk
new file mode 100644
index 000000000000..b50cfd0410d1
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/Android.mk
@@ -0,0 +1,11 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_bad
+
+include $(BUILD_PACKAGE)
+
diff --git a/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml
new file mode 100644
index 000000000000..0170cdd01c03
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.install_verifier_bad">
+
+ <package-verifier android:name="com.android.frameworks.coretests.nonexistent" android:publicKey="Zm9vYmFy" />
+
+ <application android:hasCode="false">
+ </application>
+</manifest>
diff --git a/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml
new file mode 100644
index 000000000000..3b8b3b1af9b5
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Just need this dummy file to have something to build. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummy">dummy</string>
+</resources>
diff --git a/core/tests/coretests/apks/install_verifier_good/Android.mk b/core/tests/coretests/apks/install_verifier_good/Android.mk
new file mode 100644
index 000000000000..a48a80e2c92e
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_good
+
+include $(BUILD_PACKAGE)
diff --git a/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml
new file mode 100644
index 000000000000..90135a5c01e7
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.install_verifier_bad">
+
+ <package-verifier android:name="com.android.frameworks.coretests" android:publicKey="MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAnHgFkqwNXTgc3qpl7MimAG42SAxtcgexIBG+UIY6q+K1XQCa33FG1vIgIoDHzU172yYkO4qAbCazSxN1I6SSaCJJBNwBST58Cs8aBch09psDe2AwnZB00kKA4WutKoc0NhlR6vcqSC0JsgSxh14SrJjBqnc9aAC56v3lbVi+2OjaFvmjYAmcN6g0pt/tt7a0SgSeB6Jp/M8sVJbyzzbWTfkKO42PNKO6q0z1M3GrJ3GbO6WHVK0MU/wU4dtF1R4jT7vpPJuk7fnOVCYTUOxTVge/aaL/SqB9tffqIA0JpsG0niFAL4ntEZCJOqtakYDxUugvhaRXU89fwZBxxe7IJwIBAw==" />
+
+ <application android:hasCode="false">
+ </application>
+</manifest>
diff --git a/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml
new file mode 100644
index 000000000000..3b8b3b1af9b5
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Just need this dummy file to have something to build. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummy">dummy</string>
+</resources>
diff --git a/core/tests/coretests/src/android/net/http/AbstractProxyTest.java b/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
index ee4ce95202fd..48912329438d 100644
--- a/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
+++ b/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
@@ -219,6 +219,23 @@ public abstract class AbstractProxyTest extends TestCase {
assertEquals("GET /bar HTTP/1.1", recordedRequest.getRequestLine());
}
+ // http://b/5372438
+ public void testRetryWithProxy() throws Exception {
+ server.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START));
+ server.play();
+
+ HttpClient httpProxyClient = newHttpClient();
+ HttpGet request = new HttpGet("http://android.com/foo");
+ ProxyConfig.REQUEST_PARAMETER.configure(server, httpProxyClient, request);
+
+ try {
+ httpProxyClient.execute(request);
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
enum ProxyConfig {
PROXY_SYSTEM_PROPERTY() {
@Override void configure(MockWebServer server, HttpClient client, HttpRequest request) {
diff --git a/docs/html/guide/appendix/media-formats.jd b/docs/html/guide/appendix/media-formats.jd
index e128a1cc0347..ccc63a214a64 100644
--- a/docs/html/guide/appendix/media-formats.jd
+++ b/docs/html/guide/appendix/media-formats.jd
@@ -37,11 +37,16 @@ page.title=Android Supported Media Formats
<ul>
<li>RTSP (RTP, SDP)</li>
- <li>HTTP progressive streaming</li>
- <li>HTTP live streaming <a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming-05">draft protocol</a> (Android 3.0 and above)</li>
+ <li>HTTP/HTTPS progressive streaming</li>
+ <li>HTTP/HTTPS live streaming <a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming">draft protocol</a>: <ul>
+ <li>MPEG-2 TS media files only</li>
+ <li>Protocol version 3 (Android 4.0 and above)</li>
+ <li>Protocol version 2 (Android 3.x)</li>
+ <li>Not supported before Android 3.0</li>
+ </ul></li>
</ul>
-<p class="note"><strong>Note:</strong> HTTPS is not supported at this time.</p>
+<p class="note"><strong>Note:</strong> HTTPS is not supported before Android 3.1.</p>
<h2 id="core">Core Media Formats</h2>
@@ -71,7 +76,11 @@ page.title=Android Supported Media Formats
<td style="text-align: center;"><big>&bull;</big></td>
<td rowspan="3">Mono/Stereo content in any combination of standard bit
rates up to 160 kbps and sampling rates from 8 to 48kHz</td>
-<td rowspan="3">3GPP (.3gp), and MPEG-4 (.mp4, .m4a). ADTS raw AAC (.aac, decode only, ADIF not supported, Android 3.1+). </td>
+<td rowspan="3">
+ &bull; 3GPP (.3gp)<br>
+ &bull; MPEG-4 (.mp4, .m4a)<br>
+ &bull; ADTS raw AAC (.aac, decode in Android 3.1+, encode in Android 4.0+, ADIF not supported)<br>
+ &bull; MPEG-TS (.ts, not seekable, Android 3.0+)</td>
</tr>
<tr>
@@ -91,8 +100,8 @@ rates up to 160 kbps and sampling rates from 8 to 48kHz</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>4.75 to 12.2 kbps sampled @ 8kHz</td>
-<td>3GPP (.3gp)
-</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
@@ -100,19 +109,21 @@ rates up to 160 kbps and sampling rates from 8 to 48kHz</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz</td>
-<td>3GPP (.3gp)</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
<td>FLAC</td>
<td>&nbsp;</td>
-<td style="text-align: center;"><big>&bull;</big><br><small>(Android 3.1+)</small></td>
+<td style="text-align: center;" nowrap><big>&bull;</big><br><small>(Android 3.1+)</small></td>
<td>Mono/Stereo (no multichannel). Sample rates up to 48 kHz (but up to 44.1
kHz is recommended on devices with 44.1 kHz output, as the 48 to 44.1 kHz
downsampler does not include a low-pass filter). 16-bit recommended;
no dither applied for 24-bit.
</td>
-<td>FLAC (.flac) only</td>
+<td>
+ FLAC (.flac) only</td>
</tr>
<tr>
@@ -121,7 +132,8 @@ no dither applied for 24-bit.
<td style="text-align: center;"><big>&bull;</big></td>
<td>Mono/Stereo 8-320Kbps constant (CBR) or variable bit-rate (VBR)
</td>
-<td>MP3 (.mp3)</td>
+<td>
+ MP3 (.mp3)</td>
</tr>
<tr>
@@ -129,15 +141,21 @@ no dither applied for 24-bit.
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for ringtone formats RTTTL/RTX, OTA, and iMelody </td>
-<td>Type 0 and 1 (.mid, .xmf, .mxmf). Also RTTTL/RTX (.rtttl, .rtx), OTA (.ota), and iMelody (.imy)</td>
+<td>
+ &bull; Type 0 and 1 (.mid, .xmf, .mxmf)<br>
+ &bull; RTTTL/RTX (.rtttl, .rtx)<br>
+ &bull; OTA (.ota)<br>
+ &bull; iMelody (.imy)</td>
</tr>
<tr>
-<td>Ogg Vorbis</td>
+<td>Vorbis</td>
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>Ogg (.ogg)</td>
+<td>
+ &bull; Ogg (.ogg)<br>
+ &bull; Matroska (.mkv, Android 4.0+)</td>
</tr>
<tr>
@@ -145,16 +163,18 @@ no dither applied for 24-bit.
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>8- and 16-bit linear PCM (rates up to limit of hardware)</td>
-<td>WAVE (.wav)</td>
+<td>
+ WAVE (.wav)</td>
</tr>
<tr>
-<td rowspan="4">Image</td>
+<td rowspan="5">Image</td>
<td>JPEG</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>Base+progressive</td>
-<td>JPEG (.jpg)</td>
+<td>
+ JPEG (.jpg)</td>
</tr>
<tr>
@@ -162,7 +182,8 @@ no dither applied for 24-bit.
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>GIF (.gif)</td>
+<td>
+ GIF (.gif)</td>
</tr>
<tr>
@@ -170,7 +191,8 @@ no dither applied for 24-bit.
<td style="text-align: center;"><big>&bull;</big></td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>PNG (.png)</td>
+<td>
+ PNG (.png)</td>
</tr>
<tr>
@@ -178,7 +200,17 @@ no dither applied for 24-bit.
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>BMP (.bmp)</td>
+<td>
+ BMP (.bmp)</td>
+</tr>
+
+<tr>
+<td>WEBP</td>
+<td style="text-align: center;" nowrap><big>&bull;</big><br><small>(Android 4.0+)</small></td>
+<td style="text-align: center;" nowrap><big>&bull;</big><br><small>(Android 4.0+)</small></td>
+<td>&nbsp;</td>
+<td>
+ WebP (.webp)</td>
</tr>
@@ -188,15 +220,20 @@ no dither applied for 24-bit.
<td style="text-align: center;"><big>&bull;</big></td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>3GPP (.3gp) and MPEG-4 (.mp4)</td>
+<td>
+ &bull; 3GPP (.3gp)<br>
+ &bull; MPEG-4 (.mp4)</td>
</tr>
<tr>
<td>H.264 AVC</td>
<td style="text-align: center;" nowrap><big>&bull;</big><br><small>(Android 3.0+)</small></td>
-<td style="text-align: center;"><big>&bull;</big></td>
+<td style="text-align: center;" nowrap><big>&bull;</big></td>
<td>Baseline Profile (BP)</td>
-<td>3GPP (.3gp) and MPEG-4 (.mp4). MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)</td>
+<td>
+ &bull; 3GPP (.3gp)<br>
+ &bull; MPEG-4 (.mp4)<br>
+ &bull; MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)</td>
</tr>
<tr>
@@ -204,15 +241,18 @@ no dither applied for 24-bit.
<td>&nbsp;</td>
<td style="text-align: center;"><big>&bull;</big></td>
<td>&nbsp;</td>
-<td>3GPP (.3gp)</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
<td>VP8</td>
<td>&nbsp;</td>
-<td style="text-align: center;"><big>&bull;</big><br><small>(Android 2.3.3+)</small></td>
-<td>&nbsp;</td>
-<td><a href="http://www.webmproject.org/">WebM</a> (.webm)</td>
+<td style="text-align: center;" nowrap><big>&bull;</big><br><small>(Android 2.3.3+)</small></td>
+<td>Streamable only in Android 4.0 and above</td>
+<td>
+ &bull; <a href="http://www.webmproject.org/">WebM</a> (.webm)<br>
+ &bull; Matroska (.mkv, Android 4.0+)</td>
</tr>
</tbody></table>
@@ -220,7 +260,7 @@ no dither applied for 24-bit.
<h2 id="recommendations">Video Encoding Recommendations</h2>
-<p>Table 2, below, lists examples of video encoding profiles and parameters that the Android media framework supports for playback. In addition to these encoding parameter recommendations, a device's available video recording profiles can be used as a proxy for media playback capabilities. These profiles can be inspected using the {@link android.media.CamcorderProfile CamcorderProfile} class, which is available since API level 8.</p>
+<p>Table 2, below, lists examples of video encoding profiles and parameters that the Android media framework supports for playback. In addition to these encoding parameter recommendations, a device's available <em>video recording</em> profiles can be used as a proxy for media playback capabilities. These profiles can be inspected using the {@link android.media.CamcorderProfile CamcorderProfile} class, which is available since API level 8.</p>
<p class="table-caption" id="encoding-recommendations-table"><strong>Table 2.</strong> Examples of supported video encoding parameters.</p>
@@ -228,45 +268,53 @@ no dither applied for 24-bit.
<thead>
<tr>
<th>&nbsp;</th>
- <th style="background-color:#f3f3f3;font-weight:normal">Lower quality</th>
- <th style="background-color:#f3f3f3;font-weight:normal">Higher quality</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="Standard definition">SD</a> (Low quality)</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="Standard definition">SD</a> (High quality)</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="High definition">HD</a> (Not available on all devices)</th>
</tr>
</thead>
<tbody>
<tr>
<th>Video codec</th>
- <td>H.264 Baseline Profile</th>
- <td>H.264 Baseline Profile</th>
+ <td>H.264 Baseline Profile</td>
+ <td>H.264 Baseline Profile</td>
+ <td>H.264 Baseline Profile</td>
</tr>
<tr>
<th>Video resolution</th>
- <td>176 x 144 px</th>
- <td>480 x 360 px</th>
+ <td>176 x 144 px</td>
+ <td>480 x 360 px</td>
+ <td>1280 x 720 px</td>
</tr>
<tr>
<th>Video frame rate</th>
- <td>12 fps</th>
- <td>30 fps</th>
+ <td>12 fps</td>
+ <td>30 fps</td>
+ <td>30 fps</td>
</tr>
<tr>
<th>Video bitrate</th>
- <td>56 Kbps</th>
- <td>500 Kbps</th>
+ <td>56 Kbps</td>
+ <td>500 Kbps</td>
+ <td>2 Mbps</td>
</tr>
<tr>
<th>Audio codec</th>
- <td>AAC-LC</th>
- <td>AAC-LC</th>
+ <td>AAC-LC</td>
+ <td>AAC-LC</td>
+ <td>AAC-LC</td>
</tr>
<tr>
<th>Audio channels</th>
- <td>1 (mono)</th>
- <td>2 (stereo)</th>
+ <td>1 (mono)</td>
+ <td>2 (stereo)</td>
+ <td>2 (stereo)</td>
</tr>
<tr>
<th>Audio bitrate</th>
- <td>24 Kbps</th>
- <td>128 Kbps</th>
+ <td>24 Kbps</td>
+ <td>128 Kbps</td>
+ <td>192 Kbps</td>
</tr>
</tbody>
</table>
@@ -274,7 +322,8 @@ no dither applied for 24-bit.
<p style="margin-top: 2em">For video content that is streamed over HTTP or RTSP, there are additional requirements:</p>
<ul>
- <li>For 3GPP and MPEG-4 containers, the <code>moov</code> atom must precede any <code>mdat</code> atoms.</li>
+ <li>For 3GPP and MPEG-4 containers, the <code>moov</code> atom must precede any <code>mdat</code> atoms, but must succeed the
+ <code>ftyp</code> atom.</li>
<li>For 3GPP, MPEG-4, and WebM containers, audio and video samples corresponding to the same time offset may be no more than 500 KB apart.
To minimize this audio/video drift, consider interleaving audio and video in smaller chunk sizes.</li>
</ul>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 9c3a0bea18e8..464430bb0bd9 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -222,8 +222,7 @@
<li><a href="<?cs var:toroot ?>guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/service-element.html">&lt;service&gt;</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/supports-gl-texture-element.html">&lt;supports-gl-texture&gt;</a></li>
- <li><a href="<?cs var:toroot ?>guide/topics/manifest/supports-screens-element.html">&lt;supports-screens&gt;</a>
- <span class="new">updated</span></li> <!-- ##api level 4## -->
+ <li><a href="<?cs var:toroot ?>guide/topics/manifest/supports-screens-element.html">&lt;supports-screens&gt;</a></li><!-- ##api level 4## -->
<li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-configuration-element.html">&lt;uses-configuration&gt;</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-feature-element.html">&lt;uses-feature&gt;</a></li> <!-- ##api level 4## -->
<li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-library-element.html">&lt;uses-library&gt;</a></li>
@@ -244,7 +243,7 @@
</a></li>
<li><a href="<?cs var:toroot ?>guide/topics/graphics/opengl.html">
<span class="en">3D with OpenGL</span>
- </a><span class="new">updated</span></li>
+ </a></li>
<li><a href="<?cs var:toroot ?>guide/topics/graphics/animation.html">
<span class="en">Property Animation</span>
</a></li>
@@ -271,7 +270,7 @@
<li><a href="<?cs var:toroot ?>guide/topics/media/index.html">
<span class="en">Media</span>
- </a><span class="new">updated</span></li>
+ </a></li>
<li>
<a href="<?cs var:toroot ?>guide/topics/clipboard/copy-paste.html">
<span class="en">Copy and Paste</span>
@@ -408,7 +407,6 @@
</li>
<li><a href="<?cs var:toroot ?>guide/market/publishing/multiple-apks.html">
<span class="en">Multiple APK Support</span></a>
- <span class="new">new!</span>
</li>
</ul>
</li>
@@ -569,7 +567,7 @@
</a></div>
<ul>
<li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html">adb</a></li>
- <li><a href="<?cs var:toroot ?>guide/developing/tools/adt.html">ADT</a> <span class="new">new!</span></li>
+ <li><a href="<?cs var:toroot ?>guide/developing/tools/adt.html">ADT</a></li>
<li><a href="<?cs var:toroot ?>guide/developing/tools/android.html">android</a></li>
<li><a href="<?cs var:toroot ?>guide/developing/tools/bmgr.html">bmgr</a>
<li><a href="<?cs var:toroot ?>guide/developing/tools/dmtracedump.html">dmtracedump</a></li>
@@ -672,14 +670,14 @@
<li class="toggle-list">
<div><a href="<?cs var:toroot ?>guide/practices/screens_support.html">
<span class="en">Supporting Multiple Screens</span>
- </a> <span class="new">updated</span></div>
+ </a></div>
<ul>
<li><a href="<?cs var:toroot ?>guide/practices/screens-distribution.html">
<span class="en">Distributing to Specific Screens</span>
</a></li>
<li><a href="<?cs var:toroot ?>guide/practices/screen-compat-mode.html">
<span class="en">Screen Compatibility Mode</span>
- </a> <span class="new">new!</span></li>
+ </a></li>
<li><a href="<?cs var:toroot ?>guide/practices/screens-support-1.5.html">
<span class="en">Strategies for Android 1.5</span>
</a></li>
@@ -719,7 +717,7 @@
</ul>
</li>
<li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html">
- <span class="en">App Widget Design</span>
+ <span class="en">App Widget Design <span class="new">updated</span></span>
</a></li>
<li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/activity_task_design.html">
<span class="en">Activity and Task Design</span>
@@ -737,11 +735,11 @@
<li class="toggle-list">
<div><a href="<?cs var:toroot ?>guide/practices/design/performance.html">
<span class="en">Designing for Performance</span>
- </a> <span class="new-child">new!</span></div>
+ </a></div>
<ul>
<li><a href="<?cs var:toroot ?>guide/practices/design/jni.html">
<span class="en">JNI Tips</span>
- </a> <span class="new">new!</span></li>
+ </a></li>
</ul>
</li>
<li><a href="<?cs var:toroot ?>guide/practices/design/responsiveness.html">
@@ -793,7 +791,7 @@
<span class="en">App Install Location</span>
</a></li>
<li><a href="<?cs var:toroot ?>guide/appendix/media-formats.html">
- <span class="en">Supported Media Formats</span>
+ <span class="en">Supported Media Formats <span class="new">updated</span></span>
</a></li>
<li><a href="<?cs var:toroot ?>guide/appendix/g-app-intents.html">
<span class="en">Intents List: Google Apps</span>
diff --git a/docs/html/guide/practices/design/jni.jd b/docs/html/guide/practices/design/jni.jd
index 6e984b00a881..9980efdf0c3f 100644
--- a/docs/html/guide/practices/design/jni.jd
+++ b/docs/html/guide/practices/design/jni.jd
@@ -26,9 +26,9 @@ page.title=JNI Tips
</div>
</div>
-<p>JNI is the Java Native Interface. It defines a way for code written in the
-Java programming language to interact with native
-code: functions written in C/C++. It's VM-neutral, has support for loading code from
+<p>JNI is the Java Native Interface. It defines a way for managed code
+(written in the Java programming language) to interact with native
+code (written in C/C++). It's vendor-neutral, has support for loading code from
dynamic shared libraries, and while cumbersome at times is reasonably efficient.</p>
<p>You really should read through the
@@ -46,13 +46,13 @@ There's a more detailed <a href="http://java.sun.com/docs/books/jni/html/jniTOC.
pointers to pointers to function tables. (In the C++ version, they're classes with a
pointer to a function table and a member function for each JNI function that indirects through
the table.) The JavaVM provides the "invocation interface" functions,
-which allow you to create and destroy the VM. In theory you can have multiple VMs per process,
-but Android's VM only allows one.</p>
+which allow you to create and destroy a JavaVM. In theory you can have multiple JavaVMs per process,
+but Android only allows one.</p>
<p>The JNIEnv provides most of the JNI functions. Your native functions all receive a JNIEnv as
the first argument.</p>
-<p>On some VMs, the JNIEnv is used for thread-local storage. For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
+<p>The JNIEnv is used for thread-local storage. For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
If a piece of code has no other way to get its JNIEnv, you should share
the JavaVM, and use <code>GetEnv</code> to discover the thread's JNIEnv. (Assuming it has one; see <code>AttachCurrentThread</code> below.)</p>
@@ -66,23 +66,22 @@ that header refers to JNIEnv.)</p>
<a name="threads" id="threads"></a>
<h2>Threads</h2>
-<p>All VM threads are Linux threads, scheduled by the kernel. They're usually
-started using Java language features (notably <code>Thread.start</code>),
-but they can also be created elsewhere and then attached to the VM. For
+<p>All threads are Linux threads, scheduled by the kernel. They're usually
+started from managed code (using <code>Thread.start</code>),
+but they can also be created elsewhere and then attached to the JavaVM. For
example, a thread started with <code>pthread_create</code> can be attached
with the JNI <code>AttachCurrentThread</code> or
<code>AttachCurrentThreadAsDaemon</code> functions. Until a thread is
-attached to the VM, it has no JNIEnv, and
-<strong>cannot make JNI calls</strong>.</p>
+attached, it has no JNIEnv, and <strong>cannot make JNI calls</strong>.</p>
-<p>Attaching a natively-created thread causes the VM to allocate and initialize
-a <code>Thread</code> object, add it to the "main" <code>ThreadGroup</code>,
-and add the thread to the set that is visible to the debugger. Calling
-<code>AttachCurrentThread</code> on an already-attached thread is a no-op.</p>
+<p>Attaching a natively-created thread causes a <code>java.lang.Thread</code>
+object to be constructed and added to the "main" <code>ThreadGroup</code>,
+making it visible to the debugger. Calling <code>AttachCurrentThread</code>
+on an already-attached thread is a no-op.</p>
-<p>The Dalvik VM does not suspend threads executing native code. If
+<p>Android does not suspend threads executing native code. If
garbage collection is in progress, or the debugger has issued a suspend
-request, the VM will pause the thread the next time it makes a JNI call.</p>
+request, Android will pause the thread the next time it makes a JNI call.</p>
<p>Threads attached through JNI <strong>must call
<code>DetachCurrentThread</code> before they exit</strong>.
@@ -108,12 +107,12 @@ the argument.)</p>
</ul>
<p>Similarly, to call a method, you'd first get a class object reference and then a method ID. The IDs are often just
-pointers to internal VM data structures. Looking them up may require several string
+pointers to internal runtime data structures. Looking them up may require several string
comparisons, but once you have them the actual call to get the field or invoke the method
is very quick.</p>
<p>If performance is important, it's useful to look the values up once and cache the results
-in your native code. Because there is a limit of one VM per process, it's reasonable
+in your native code. Because there is a limit of one JavaVM per process, it's reasonable
to store this data in a static local structure.</p>
<p>The class references, field IDs, and method IDs are guaranteed valid until the class is unloaded. Classes
@@ -145,13 +144,17 @@ then reloaded, it will be executed again.</p>
<a name="local_and_global_references" id="local_and_global_references"></a>
<h2>Local and Global References</h2>
-<p>Every object that JNI returns is a "local reference". This means that it's valid for the
+<p>Every argument passed to a native method, and almost every object returned
+by a JNI function is a "local reference". This means that it's valid for the
duration of the current native method in the current thread.
-<strong>Even if the object itself continues to live on after the native method returns, the reference is not valid.</strong>
-This applies to all sub-classes of <code>jobject</code>, including
+<strong>Even if the object itself continues to live on after the native method
+returns, the reference is not valid.</strong>
+<p>This applies to all sub-classes of <code>jobject</code>, including
<code>jclass</code>, <code>jstring</code>, and <code>jarray</code>.
-(Dalvik VM will warn you about most reference mis-uses when extended JNI
+(The runtime will warn you about most reference mis-uses when extended JNI
checks are enabled.)</p>
+<p>The only way to get non-local references is via the functions
+<code>NewGlobalRef</code> and <code>NewWeakGlobalRef</code>.
<p>If you want to hold on to a reference for a longer period, you must use
a "global" reference. The <code>NewGlobalRef</code> function takes the
@@ -159,7 +162,7 @@ local reference as an argument and returns a global one.
The global reference is guaranteed to be valid until you call
<code>DeleteGlobalRef</code>.</p>
-<p>This pattern is commonly used when caching copies of class objects obtained
+<p>This pattern is commonly used when caching a jclass returned
from <code>FindClass</code>, e.g.:</p>
<pre>jclass localClass = env-&gt;FindClass("MyClass");
jclass globalClass = reinterpret_cast&lt;jclass&gt;(env-&gt;NewGlobalRef(localClass));</pre>
@@ -181,22 +184,25 @@ not use <code>jobject</code> values as keys.</p>
<p>Programmers are required to "not excessively allocate" local references. In practical terms this means
that if you're creating large numbers of local references, perhaps while running through an array of
-Objects, you should free them manually with
+objects, you should free them manually with
<code>DeleteLocalRef</code> instead of letting JNI do it for you. The
-VM is only required to reserve slots for
+implementation is only required to reserve slots for
16 local references, so if you need more than that you should either delete as you go or use
-<code>EnsureLocalCapacity</code> to reserve more.</p>
+<code>EnsureLocalCapacity</code>/<code>PushLocalFrame</code> to reserve more.</p>
-<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are just integers, not object
-references, and should not be passed to <code>NewGlobalRef</code>. The raw data
+<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are opaque
+types, not object references, and should not be passed to
+<code>NewGlobalRef</code>. The raw data
pointers returned by functions like <code>GetStringUTFChars</code>
-and <code>GetByteArrayElements</code> are also not objects.</p>
+and <code>GetByteArrayElements</code> are also not objects. (They may be passed
+between threads, and are valid until the matching Release call.)</p>
<p>One unusual case deserves separate mention. If you attach a native
-thread to the VM with <code>AttachCurrentThread</code>, the code you are running will
-never "return" to the VM until the thread detaches from the VM. Any local
-references you create will have to be deleted manually unless you're going
-to detach the thread soon.</p>
+thread with <code>AttachCurrentThread</code>, the code you are running will
+never automatically free local references until the thread detaches. Any local
+references you create will have to be deleted manually. In general, any native
+code that creates local references in a loop probably needs to do some manual
+deletion.</p>
<a name="UTF_8_and_UTF_16_strings" id="UTF_8_and_UTF_16_strings"></a>
<h2>UTF-8 and UTF-16 Strings</h2>
@@ -205,14 +211,15 @@ to detach the thread soon.</p>
modified encoding is useful for C code because it encodes \u0000 as 0xc0 0x80 instead of 0x00.
The nice thing about this is that you can count on having C-style zero-terminated strings,
suitable for use with standard libc string functions. The down side is that you cannot pass
-arbitrary UTF-8 data into the VM and expect it to work correctly.</p>
+arbitrary UTF-8 data to JNI and expect it to work correctly.</p>
-<p>It's usually best to operate with UTF-16 strings. With Android's current VMs, the
-<code>GetStringChars</code> method
-does not require a copy, whereas <code>GetStringUTFChars</code> requires a malloc and a UTF conversion. Note that
+<p>If possible, it's usually faster to operate with UTF-16 strings. Android
+currently does not require a copy in <code>GetStringChars</code>, whereas
+<code>GetStringUTFChars</code> requires an allocation and a conversion to
+UTF-8. Note that
<strong>UTF-16 strings are not zero-terminated</strong>, and \u0000 is allowed,
so you need to hang on to the string length as well as
-the string pointer.</p>
+the jchar pointer.</p>
<p><strong>Don't forget to <code>Release</code> the strings you <code>Get</code></strong>. The
string functions return <code>jchar*</code> or <code>jbyte*</code>, which
@@ -237,9 +244,8 @@ While arrays of objects must be accessed one entry at a time, arrays of
primitives can be read and written directly as if they were declared in C.</p>
<p>To make the interface as efficient as possible without constraining
-the VM implementation,
-the <code>Get&lt;PrimitiveType&gt;ArrayElements</code> family of calls
-allows the VM to either return a pointer to the actual elements, or
+the VM implementation, the <code>Get&lt;PrimitiveType&gt;ArrayElements</code>
+family of calls allows the runtime to either return a pointer to the actual elements, or
allocate some memory and make a copy. Either way, the raw pointer returned
is guaranteed to be valid until the corresponding <code>Release</code> call
is issued (which implies that, if the data wasn't copied, the array object
@@ -253,7 +259,7 @@ non-NULL pointer for the <code>isCopy</code> argument. This is rarely
useful.</p>
<p>The <code>Release</code> call takes a <code>mode</code> argument that can
-have one of three values. The actions performed by the VM depend upon
+have one of three values. The actions performed by the runtime depend upon
whether it returned a pointer to the actual data or a copy of it:</p>
<ul>
@@ -312,8 +318,9 @@ to do is copy data in or out. Consider the following:</p>
}</pre>
<p>This grabs the array, copies the first <code>len</code> byte
-elements out of it, and then releases the array. Depending upon the VM
-policies the <code>Get</code> call will either pin or copy the array contents.
+elements out of it, and then releases the array. Depending upon the
+implementation, the <code>Get</code> call will either pin or copy the array
+contents.
The code copies the data (for perhaps a second time), then calls <code>Release</code>; in this case
<code>JNI_ABORT</code> ensures there's no chance of a third copy.</p>
@@ -335,7 +342,7 @@ to copy data into an array, and <code>GetStringRegion</code> or
<a name="exceptions" id="exceptions"></a>
-<h2>Exception</h2>
+<h2>Exceptions</h2>
<p><strong>You must not call most JNI functions while an exception is pending.</strong>
Your code is expected to notice the exception (via the function's return value,
@@ -369,11 +376,11 @@ you call a method (using a function like <code>CallObjectMethod</code>),
you must always check for an exception, because the return value is not
going to be valid if an exception was thrown.</p>
-<p>Note that exceptions thrown by interpreted code do not "leap over" native code,
-and C++ exceptions thrown by native code are not handled by Dalvik.
+<p>Note that exceptions thrown by interpreted code do not unwind native stack
+frames, and Android does not yet support C++ exceptions.
The JNI <code>Throw</code> and <code>ThrowNew</code> instructions just
-set an exception pointer in the current thread. Upon returning to the VM from
-native code, the exception will be noted and handled appropriately.</p>
+set an exception pointer in the current thread. Upon returning to managed
+from native code, the exception will be noted and handled appropriately.</p>
<p>Native code can "catch" an exception by calling <code>ExceptionCheck</code> or
<code>ExceptionOccurred</code>, and clear it with
@@ -476,23 +483,19 @@ written in C++:</p>
shared library. For Android apps, you may find it useful to get the full
path to the application's private data storage area from the context object.</p>
-<p>This is the recommended approach, but not the only approach. The VM does
-not require explicit registration, nor that you provide a
+<p>This is the recommended approach, but not the only approach. Explicit
+registration is not required, nor is it necessary that you provide a
<code>JNI_OnLoad</code> function.
You can instead use "discovery" of native methods that are named in a
-specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">
- the JNI spec</a> for details), though this is less desirable.
-It requires more space in the shared object symbol table,
-loading is slower because it requires string searches through all of the
-loaded shared libraries, and if a method signature is wrong you won't know
+specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">the JNI spec</a> for details), though this is less desirable because if a method signature is wrong you won't know
about it until the first time the method is actually used.</p>
<p>One other note about <code>JNI_OnLoad</code>: any <code>FindClass</code>
calls you make from there will happen in the context of the class loader
that was used to load the shared library. Normally <code>FindClass</code>
uses the loader associated with the method at the top of the interpreted
-stack, or if there isn't one (because the thread was just attached to
-the VM) it uses the "system" class loader. This makes
+stack, or if there isn't one (because the thread was just attached) it uses
+the "system" class loader. This makes
<code>JNI_OnLoad</code> a convenient place to look up and cache class
object references.</p>
@@ -515,10 +518,9 @@ that use 64-bit pointers, <strong>you need to stash your native pointers in a
<p>All JNI 1.6 features are supported, with the following exceptions:</p>
<ul>
- <li><code>DefineClass</code> is not implemented. Dalvik does not use
+ <li><code>DefineClass</code> is not implemented. Android does not use
Java bytecodes or class files, so passing in binary class data
- doesn't work. Translation facilities may be added in a future
- version of the VM.</li>
+ doesn't work.</li>
<li>"Weak global" references are implemented, but may only be passed
to <code>NewLocalRef</code>, <code>NewGlobalRef</code>, and
<code>DeleteWeakGlobalRef</code>. (The spec strongly encourages
@@ -536,12 +538,16 @@ that use 64-bit pointers, <strong>you need to stash your native pointers in a
around this requires using explicit registration or moving the
native methods out of inner classes.
<li>Until Android 2.0 (Eclair), it was not possible to use a <code>pthread_key_create</code>
- destructor function to avoid the VM's "thread must be detached before
- exit" check. (The VM also uses a pthread key destructor function,
+ destructor function to avoid the "thread must be detached before
+ exit" check. (The runtime also uses a pthread key destructor function,
so it'd be a race to see which gets called first.)
<li>Until Android 2.2 (Froyo), weak global references were not implemented.
- Older VMs will vigorously reject attempts to use them. You can use
+ Older versions will vigorously reject attempts to use them. You can use
the Android platform version constants to test for support.
+ <li>Until Android 4.0 (Ice Cream Sandwich), JNI local references were
+ actually direct pointers. Ice Cream Sandwich added the indirection
+ necessary to support better garbage collectors, but this means that lots
+ of JNI bugs are undetectable on older releases.
</ul>
@@ -572,8 +578,8 @@ the details of the failure can be found in the exception's detail message.</p>
<p>In logcat, you'll see:</p>
<pre>W/dalvikvm( 880): No implementation found for native LFoo;.myfunc ()V</pre>
-<p>This means that the VM tried to find a matching method but was unsuccessful.
-Some common reasons for this are:</p>
+<p>This means that the runtime tried to find a matching method but was
+unsuccessful. Some common reasons for this are:</p>
<ul>
<li>The library isn't getting loaded. Check the logcat output for
messages about library loading.
@@ -581,10 +587,15 @@ Some common reasons for this are:</p>
is commonly caused by:
<ul>
<li>For lazy method lookup, failing to declare C++ functions
- with <code>extern "C"</code>. You can use <code>arm-eabi-nm</code>
+ with <code>extern "C"</code> and appropriate
+ visibility (<code>JNIEXPORT</code>). Note that prior to Ice Cream
+ Sandwich, the JNIEXPORT macro was incorrect, so using a new GCC with
+ an old <code>jni.h</code> won't work.
+ You can use <code>arm-eabi-nm</code>
to see the symbols as they appear in the library; if they look
mangled (something like <code>_Z15Java_Foo_myfuncP7_JNIEnvP7_jclass</code>
- rather than <code>Java_Foo_myfunc</code>) then you need to
+ rather than <code>Java_Foo_myfunc</code>), or if the symbol type is
+ a lowercase 't' rather than an uppercase 'T', then you need to
adjust the declaration.
<li>For explicit registration, minor errors when entering the
method signature. Make sure that what you're passing to the
@@ -612,7 +623,7 @@ must also wrap the class with 'L' and ';', so a one-dimensional array of
<p>If the class name looks right, you could be running into a class loader
issue. <code>FindClass</code> wants to start the class search in the
-class loader associated with your code. It examines the VM call stack,
+class loader associated with your code. It examines the call stack,
which will look something like:
<pre> Foo.myfunc(Native Method)
Foo.main(Foo.java:10)
@@ -623,14 +634,14 @@ finds the <code>ClassLoader</code> object associated with the <code>Foo</code>
class and uses that.</p>
<p>This usually does what you want. You can get into trouble if you
-create a thread outside the VM (perhaps by calling <code>pthread_create</code>
-and then attaching it to the VM with <code>AttachCurrentThread</code>).
+create a thread yourself (perhaps by calling <code>pthread_create</code>
+and then attaching it with <code>AttachCurrentThread</code>).
Now the stack trace looks like this:</p>
<pre> dalvik.system.NativeStart.run(Native Method)</pre>
<p>The topmost method is <code>NativeStart.run</code>, which isn't part of
your application. If you call <code>FindClass</code> from this thread, the
-VM will start in the "system" class loader instead of the one associated
+JavaVM will start in the "system" class loader instead of the one associated
with your application, so attempts to find app-specific classes will fail.</p>
<p>There are a few ways to work around this:</p>
@@ -656,12 +667,12 @@ with your application, so attempts to find app-specific classes will fail.</p>
<h2>FAQ: How do I share raw data with native code?</h2>
<p>You may find yourself in a situation where you need to access a large
-buffer of raw data from code written in Java and C/C++. Common examples
+buffer of raw data from both managed and native code. Common examples
include manipulation of bitmaps or sound samples. There are two
basic approaches.</p>
<p>You can store the data in a <code>byte[]</code>. This allows very fast
-access from code written in Java. On the native side, however, you're
+access from managed code. On the native side, however, you're
not guaranteed to be able to access the data without having to copy it. In
some implementations, <code>GetByteArrayElements</code> and
<code>GetPrimitiveArrayCritical</code> will return actual pointers to the
@@ -674,8 +685,8 @@ the JNI <code>NewDirectByteBuffer</code> function. Unlike regular
byte buffers, the storage is not allocated on the managed heap, and can
always be accessed directly from native code (get the address
with <code>GetDirectBufferAddress</code>). Depending on how direct
-byte buffer access is implemented in the VM, accessing the data from code
-written in Java can be very slow.</p>
+byte buffer access is implemented, accessing the data from managed code
+can be very slow.</p>
<p>The choice of which to use depends on two factors:</p>
<ol>
@@ -688,5 +699,4 @@ written in Java can be very slow.</p>
</ol>
<p>If there's no clear winner, use a direct byte buffer. Support for them
-is built directly into JNI, and access to them from code written in
-Java can be made faster with VM improvements.</p>
+is built directly into JNI, and performance should improve in future releases.</p>
diff --git a/docs/html/guide/practices/ui_guidelines/widget_design.jd b/docs/html/guide/practices/ui_guidelines/widget_design.jd
index 49aa4981c581..de20e007f393 100644
--- a/docs/html/guide/practices/ui_guidelines/widget_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/widget_design.jd
@@ -1,4 +1,4 @@
-page.title=Widget Design Guidelines
+page.title=App Widget Design Guidelines
parent.title=UI Guidelines
parent.link=index.html
@jd:body
@@ -9,268 +9,322 @@ parent.link=index.html
<h2>Quickview</h2>
<ul>
-<li>Widgets have six standard sizes on the Home screen</li>
-<li>Widgets have standards for size, frames, shadows, and file format, which you can copy</li>
-<li>A few tricks make it easier to design widgets that fit graphically on the Home screen</li>
+ <li>App Widget layouts should be flexible, resizing to fit their parent container</li>
+ <li>As of Android 3.0, app widgets can depict collections of items and provide a representative
+ preview image for the widget gallery</li>
+ <li>As of Android 3.1, app widgets can be resizable horizontally and/or vertically</li>
+ <li>As of Android 4.0, app widgets have margins automatically applied</li>
</ul>
<h2>In this document</h2>
<ol>
-<li><a href="#anatomy">Standard widget anatomy</a></li>
-<li><a href="#design">Designing a widget</a></li>
-<li><a href="#sizes">Standard widget sizes</a></li>
-<li><a href="#frames">Standard widget frames</a></li>
-<li><a href="#shadows">Standard widget shadows</a></li>
-<li><a href="#tricks">Widget graphics tips and tricks</a></li>
-<li><a href="#file">Widget graphics file format</a></li>
+<li><a href="#anatomy">Standard Widget Anatomy</a></li>
+<li><a href="#design">Designing Widget Layouts and Background Graphics</a></li>
+<li><a href="#templates">Using the App Widget Templates Pack</a></li>
+</ol>
+
+<h2>Downloads</h2>
+
+<ol>
+<li><a href="{@docRoot}shareables/app_widget_templates-v4.0.zip">App Widget Templates Pack,
+ v4.0 &raquo;</a></li>
</ol>
<h2>See also</h2>
<ol>
<li><a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a></li>
-<li><a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AppWidgets blog post</a></li>
+<li>
+ <a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">
+ AppWidgets blog post</a></li>
</ol>
</div>
</div>
-<p>Widgets are a feature introduced in Android 1.5. A widget displays an
-application's most important or timely information at a glance, on a user's Home
-screen. The standard Android system image includes several examples of widgets,
-including widgets for Analog Clock, Music, and other applications.</p>
-
-<p>Users pick the widgets they want to display on their Home screens by touching
-&amp; holding an empty area of the Home screen, selecting Widgets from the menu,
-and then selecting the widget they want.</p>
-
-<p><img src="{@docRoot}images/widget_design/widget_examples.png" alt="Example
-Widgets"></p>
-
-<p>This document describes how to design a widget so it fits graphically with
-other widgets and with the other elements of the Android Home screen. It also
-describes some standards for widget artwork and some widget graphics tips and
-tricks from the Android team.<p>
-
-<p>For information about developing widgets, see the <a
-href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a> section of
-the <em>Developer's Guide</em> and the <a
-href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AppWidgets</a> blog post.</p>
-
-
-<h2 id="anatomy">Standard widget anatomy</h2>
+<p>App widgets (sometimes just "widgets") are a feature introduced in Android 1.5 and vastly
+improved in Android 3.0 and 3.1. A widget can display an application's most timely or otherwise
+relevant information at a glance, on a user's Home screen. The standard Android system image
+includes several widgets, including a widget for the Analog Clock, Music, and other
+applications.</p>
-<p>Typical Android widgets have three main components: A bounding box, a frame,
-and the widget's graphical controls and other elements. Well-designed widgets
-leave some padding between the edges of the bounding box and the frame, and
-between the inner edges of the frame and the widget's controls. Widgets designed
-to fit visually with other widgets on the Home screen take cues from the other
-elements on the Home screen for alignment; they also use standard shading
-effects. All of these details are described in this document.
-<p><strong>Standard Widget Sizes in Portrait Orientation</strong><br/>
-<img src="{@docRoot}images/widget_design/widget_sizes_portrait.png"
-alt="Standard Widget Sizes in Portrait Orientation"></p>
+<img src="{@docRoot}images/widget_design/widget_examples.png"
+ alt="Example app widgets in Android 4.0" id="widget_examples">
-<p>&nbsp;</p>
+<p class="img-caption"><strong>Figure 1.</strong> Example app widgets in Android 4.0.</p>
-<p><strong>Standard Widget Sizes in Landscape Orientation</strong><br/>
-<img src="{@docRoot}images/widget_design/widget_sizes_landscape.png"
-alt="Standard Widget Sizes in Landscape Orientation"></p>
-
-<h2 id="design">Designing a widget</h2>
+<p>This document describes how to design a widget so that it fits graphically with other widgets and
+with the other elements of the Android Home screen such as launcher icons and shortcuts. It also
+describes some standards for widget artwork and some widget graphics tips and tricks.<p>
-<ol>
-<li><strong>Select a bounding box size for your widget.</strong></li>
+<p>For information about developing widgets, see the <a
+href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a> section of the <em>Developer's
+Guide</em>.</p>
+
+
+<h2 id="anatomy">Standard Widget Anatomy</h2>
+
+<p>Typical Android app widgets have three main components: A bounding box, a frame, and the widget's
+graphical controls and other elements. App widgets can contain a subset of the View widgets in
+Android; supported controls include text labels, buttons, and images. For a full list of available
+Views, see the <a href="{@docRoot}guide/topics/appwidgets/index.html#CreatingLayout">Creating the
+App Widget Layout</a> section in the <em>Developer's Guide</em>. Well-designed widgets leave some
+margins between the edges of the bounding box and the frame, and padding between the inner edges of
+the frame and the widget's controls.</p>
+
+
+<img src="{@docRoot}images/widget_design/widget_terms.png"
+ alt="Widgets generally have margins and padding between bounding box, frame, and controls"
+ id="widget_terms">
+
+<p class="img-caption"><strong>Figure 2.</strong> Widgets generally have margins between the
+bounding box and frame, and padding between the frame and widget controls.</p>
+
+
+<p class="note"><strong>Note: </strong> As of Android 4.0, app widgets are automatically given
+margins between the widget frame and the app widget's bounding box to provide better alignment with
+other widgets and icons on the user's home screen. To take advantage of this strongly recommended
+behavior, set your application's <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a> to 14 or
+greater.</p>
+
+<p>Widgets designed to fit visually with other widgets on the Home screen take cues from the other
+elements on the Home screen for alignment; they also use standard shading effects. All of these
+details are described in this document.</p>
+
+
+<h3 id="anatomy_determining_size">Determining a size for your widget</h3>
+
+<p>Each widget must define a <code>minWidth</code> and <code>minHeight</code>, indicating the
+minimum amount of space it should consume by default. When users add a widget to their Home screen,
+it will generally occupy more than the minimum width and height you specify. Android Home screens
+offer users a grid of available spaces into which they can place widgets and icons. This grid can
+vary by device; for example, many handsets offer a 4x4 grid, and tablets can offer a larger, 8x7
+grid. <strong>When your widget is added, it will be stretched to occupy the minimum number of cells,
+horizontally and vertically, required to satisfy its <code>minWidth</code> and
+<code>minHeight</code> constraints.</strong> As we discuss in <a href="#design">Designing Widget
+Layouts and Background Graphics</a> below, using nine-patch backgrounds and flexible layouts for app
+widgets will allow your widget to gracefully adapt to the device's Home screen grid and remain
+usable and aesthetically awesome.</p>
+
+<p>While the width and height of a cell&mdash;as well as the amount of automatic margins applied to
+widgets&mdash;may vary across devices, you can use the table below to roughly estimate your widget's
+minimum dimensions, given the desired number of occupied grid cells:</p>
+
+<table id="cellstable">
+ <thead>
+ <tr>
+ <th># of Cells<br><small style="font-weight:normal">(Columns or Rows)</small></th>
+ <th>Available Size (dp)<br><small style="font-weight:normal">(<code>minWidth</code> or
+ <code>minHeight</code>)</small></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td>40dp</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>110dp</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>180dp</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>250dp</td>
+ </tr>
+ <tr>
+ <td>&hellip;</td>
+ <td>&hellip;</td>
+ </tr>
+ <tr>
+ <td><em>n</em></td>
+ <td>70 &times; <em>n</em> &minus; 30</td>
+ </tr>
+ </tbody>
+</table>
-<p>The most effective widgets display your application's most useful or timely
-data in the smallest widget size. Users will weigh the usefulness or your widget
-against the portion of the Home screen it covers, so the smaller the better.</p>
+<p>It is a good practice to be conservative with <code>minWidth</code> and <code>minHeight</code>,
+specifying the minimum size that renders the widget in a good default state. For an example of how
+to provide a <code>minWidth</code> and <code>minHeight</code>, suppose you have a music player
+widget that shows the currently playing song artist and title (vertically stacked), a
+<strong>Play</strong> button, and a <strong>Next</strong> button:</p>
-<p>All widgets must fit within the bounding box of one of the six supported
-widget sizes, or better yet, within a pair of portrait and landscape orientation
-sizes, so your widget looks good when the user switches screen
-orientations.</p>
-<p><a href="#sizes">Standard widget sizes</a> illustrates the bounding
-dimensions of the six widget sizes (three in portrait and three in landscape
-orientation).</p>
+<img src="{@docRoot}images/widget_design/music_example.png"
+ alt="An example music player widget" id="music_example">
+<p class="img-caption"><strong>Figure 3.</strong> An example music player widget.</p>
-<li><strong>Select a matching frame.</strong></li>
-<p><a href="#frames">Standard widget frames</a> illustrates the standard frames
-for the six widget sizes, with links so you can download copies for your own
-use. You don't have to use these frames for your widget, but if you do, your
-widgets are more likely to fit visually with other widgets.</p>
+<p>Your minimum height should be the height of your two TextViews for the artist and title, plus
+some text margins. Your minimum width should be the minimum usable widths of the
+<strong>Play</strong> and <strong>Next</strong> buttons, plus the minimum text width (say, the width
+of 10 characters), plus any horizontal text margins.</p>
-<li><strong>Apply standard shadow effect to your graphics.</strong></li>
-<p>Again, you don't have to use this effect, but <a href="#shadows">Standard
-widget shadows</a> shows the Photoshop settings used for standard widgets.</p>
+<img src="{@docRoot}images/widget_design/music_example_redline.png"
+alt="Example sizes and margins for minimum width/height calculations" id="music_example_redline">
-<li><strong>If your widget includes buttons, draw them in three states
-(default, pressed, and selected).</strong></li>
+<p class="img-caption"><strong>Figure 4.</strong> Example sizes and margins for
+<code>minWidth</code>/<code>minHeight</code> calculations. We chose 144dp as an example good minimum
+width for the text labels.</p>
-<p>You can <a
-href="{@docRoot}images/widget_design/Music_widget_button_states.psd">download a
-Photoshop file that contains the three states of the Play button</a>, taken from
-the Music widget, to analyze the Photoshop settings used for the three standard
-button effects.</p>
-<p><a href="{@docRoot}images/widget_design/Music_widget_button_states.psd"> <img
-src="{@docRoot}images/widget_design/buttons.png" alt="Click to download
-Photoshop template"></a></p>
-
-<li><strong>Finish drawing your artwork and then scale and align it to
-fit.</strong></li>
+<p>Example calculations are below:</p>
-<p><a href="#tricks">Widget alignment tips and tricks</a> describes some
-techniques for aligning your widget's graphics inside the standard frames, along
-with a few other widget graphics tricks.</p>
+<ul>
+ <li><code>minWidth</code> = 144dp + (2 &times; 8dp) + (2 &times; 56dp) =
+ <strong>272dp</strong></li>
+ <li><code>minHeight</code> = 48dp + (2 &times; 4dp) = <strong>56dp</strong></li>
+</ul>
-<li><strong>Save your widget with the correct graphics file
-settings.</strong></li>
+<p>If there is any inherent content padding in your widget background nine-patch, you should add to
+<code>minWidth</code> and <code>minHeight</code> accordingly.</p>
-<p><a href="#file">Windows graphics file format</a> describes the correct
-settings for your widget graphics files.</p>
-</ol>
+<h3 id="anatomy_resizable_widgets">Resizable widgets</h3>
+<p>Widgets can be resized horizontally and/or vertically as of Android 3.1, meaning that
+<code>minWidth</code> and <code>minHeight</code> effectively become the <em>default</em> size for
+the widget. You can specify the minimum widget size using <code>minResizeWidth</code> and
+<code>minResizeHeight</code>; these values should specify the size below which the widget would be
+illegible or otherwise unusable.</p>
-<h2 id="sizes">Standard widget sizes</h2>
+<p>This is generally a preferred feature for collection widgets such as those based on {@link
+android.widget.ListView} or {@link android.widget.GridView}.</p>
-<p>There are six standard widget sizes, based on a Home screen grid of 4 x 4
-(portrait) or 4 x 4 (landscape) cells. These dimensions are the bounding boxes
-for the six standard widget sizes. The contents of typical widgets don't draw to
-the edge of these dimensions, but fit inside a frame withing the bounding box,
-as described in <a href="#design">Designing a widget</a>.</p>
-<p>In portrait orientation, each cell is 80 pixels wide by 100 pixels tall (the
-diagram shows a cell in portrait orientation). The three supported widget sizes
-in portrait orientation are:<p>
+<h3 id="anatomy_adding_margins">Adding margins to your app widget</h3>
-<table>
-<tr><th>Cells</th><th>Pixels</th></tr>
-<tr><td>4 x 1</td><td>320 x 100</td></tr>
-<tr><td>3 x 3</td><td>240 x 300</td></tr>
-<tr><td>2 x 2</td><td>160 x 200</td></tr>
-</table>
+<p>As previously mentioned, Android 4.0 will automatically add small, standard margins to each edge
+of widgets on the Home screen, for applications that specify a <code>targetSdkVersion</code> of 14
+or greater. This helps to visually balance the Home screen, and thus <strong>we recommend that you
+do not add any extra margins outside of your app widget's background shape in Android
+4.0</strong>.</p>
-<p><img src="{@docRoot}images/widget_design/portrait_sizes.png" alt="Widget
-dimensions in portrait orientation"></p>
+<p>It's easy to write a single layout that has custom margins applied for earlier versions of the
+platform, and has no extra margins for Android 4.0 and greater. See <a
+href="{@docRoot}guide/topics/appwidgets/index.html#AddingMargins">Adding Margins to App Widgets</a>
+in the <em>Developer's Guide</em> for information on how to achieve this with layout XML.</p>
-<p>In landscape orientation, each cell is 106 pixels wide by 74 pixels tall. The
-three supported widget sizes in landscape orientation are:</p>
-<table>
-<tr><th>Cells</th><th>Pixels</th></tr>
-<tr><td>4 x 1</td><td>424 x 74</td></tr>
-<tr><td>3 x 3</td><td>318 x 222</td></tr>
-<tr><td>2 x 2</td><td>212 x 148</td></tr>
-</table>
+<h2 id="design">Designing Widget Layouts and Background Graphics</h2>
-<p><img src="{@docRoot}images/widget_design/landscape_sizes.png" alt="Widget
-dimensions in landscape orientation"></p>
+<p>Most widgets will have a solid background rectangle or rounded rectangle shape. It is a best
+practice to define this shape using nine patches; one for each screen density (see <a
+href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a> for details).
+Nine-patches can be created with the <a
+href="{@docRoot}guide/developing/tools/draw9patch.html">draw9patch</a> tool, or simply with a
+graphics editing program such as Adobe&reg; Photoshop. This will allow the widget background shape
+to take up the entire available space. The nine-patch should be edge-to-edge with no transparent
+pixels providing extra margins, save for perhaps a few border pixels for <strong>subtle</strong>
+drop shadows or other subtle effects.</p>
+<p class="note"><strong>Note: </strong> Just like with controls in activities, you should ensure
+that interactive controls have distinct visual focused and pressed states using <a
+href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list
+drawables</a>.</p>
-<h2 id="frames">Standard widget frames</h2>
-<p>For each of the six standard widget sizes there is a standard frame. You can
-click the images of the frames in this section to download a Photoshop file for
-that frame, which you can use for your own widgets.<p>
+<img src="{@docRoot}images/ninepatch_raw.png" alt="Nine-patch border pixels" id="ninepatch_raw">
-<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>4x1_Widget_Frame_Portrait.psd</p>
+<p class="img-caption"><strong>Figure 5.</strong> Nine-patch border pixels indicating stretchable
+regions and content padding.</p>
-<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>3x3_Widget_Frame_Portrait.psd</p>
-<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>2x2_Widget_Frame_Portrait.psd</p>
+<p>Some app widgets, such as those using a {@link android.widget.StackView}, have a transparent
+background. For this case, each individual item in the StackView should use a nine-patch background
+that is edge-to-edge with little or no border transparent pixels for margins.</p>
-<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>4x1_Widget_Frame_Landscape.psd</p>
+<p>For the contents of the widget, you should use flexible layouts such as {@link
+android.widget.RelativeLayout}, {@link android.widget.LinearLayout}, or {@link
+android.widget.FrameLayout}. Just as your activity layouts must adapt to different physical screen
+sizes, widget layouts must adapt to different Home screen grid cell sizes.</p>
-<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>3x3_Widget_Frame_Landscape.psd</p>
+<p>Below is an example layout that a music widget showing text information and two buttons can use.
+It builds upon the previous discussion of adding margins depending on OS version.</p>
-<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>2x2_Widget_Frame_Landscape.psd</p>
+<pre>
+&lt;FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="@dimen/widget_margin"&gt;
+ &lt;LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@drawable/my_widget_background"&gt;
-<h2 id="shadows">Standard widget shadows</h2>
+ &lt;TextView
+ android:id="@+id/song_info"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" /&gt;
-<p>You can apply a shadow effect to your widget's artwork, so it matches other
-standard Android widgets, using the following settings in the Photoshop Layer
-Style dialog box.</p>
+ &lt;Button
+ android:id="@+id/play_button"
+ android:layout_width="@dimen/my_button_width"
+ android:layout_height="match_parent" /&gt;
-<p><img src="{@docRoot}images/widget_design/Layer_Style.png" alt="Layer Style
-settings for standard shadows"></p>
+ &lt;Button
+ android:id="@+id/skip_button"
+ android:layout_width="@dimen/my_button_width"
+ android:layout_height="match_parent" /&gt;
+ &lt;/LinearLayout&gt;
+&lt;/FrameLayout&gt;
+</pre>
+<p>If you now take a look at the example music widget from the previous section, you can begin to
+use flexible layouts attributes like so:</p>
-<h2 id="tricks">Widget graphics tips and tricks</h2>
-<p>The Android team has developed a few tricks for aligning widget artwork
-within standard widget bounding boxes and frames, so the widget aligns visually
-with other widgets and the other elements of the Home screen, as well as other
-techniques for creating widgets.
+<img src="{@docRoot}images/widget_design/music_example_layouts.png"
+ alt="Excerpt flexible layouts and attributes for an example music widget"
+ id="music_example_layouts">
-<ul>
+<p class="img-caption"><strong>Figure 6.</strong> Excerpt flexible layouts and attributes.</p>
-<li>Use a screen shot from the Android SDK emulator to align both the shapes and
-shadows of your widget controls with the Search widget and with other elements
-on the Home screen.</li>
-<p>Cut the widget artwork asset" based on the full size of a cell, including any
-padding you want. (That is, for a 4 x 1 widget, cut the asset at 320 by 100
-pixels.)</p>
+<p>When a user adds the widget to their home screen, on an example Android 4.0 device where each
+grid cell is 80dp &times; 100dp in size and 16dp of margins are automatically applied on all sizes,
+the widget will be stretched, like so:</p>
-<p><img src="{@docRoot}images/widget_design/alignment.png" alt="Aligning widget
-graphics" ></p>
-<li>To reduce banding when exporting a widget, apply the following Photoshop Add
-Noise setting to your graphic.</li>
+<img src="{@docRoot}images/widget_design/music_example_stretched.png"
+ alt="Music widget sitting on an example 80dp x 100dp grid with 16dp of automatic margins
+ added by the system" id="music_example_stretched">
-<p><img src="{@docRoot}images/widget_design/Add_Noise.png" alt="Add Noise
-settings for widget graphics" ></p>
+<p class="img-caption"><strong>Figure 7.</strong> Music widget sitting on an example 80dp x 100dp
+grid with 16dp of automatic margins added by the system.</p>
-<li>Apply 9-patch techniques to shrink the graphic and set the padding of the
-content area. (<a href="{@docRoot}guide/developing/tools/draw9patch.html">See
-the detailed guide here.</a>)</li>
-<p><strong>Note:</strong> The current Android widget templates were designed
-using a custom gradient angle, which means the 9-patch techniques can't be used
-to optimize the size of the asset. However, 9-patch techniques were used to set
-the content area padding.</p>
+<h2 id="templates">Using the App Widget Templates Pack</h2>
-<li>In some cases, devices have low pixel depths that can cause visual banding
-and dithering issues. To solve this, application developers should pass assets
-through a "proxy" drawable defined as <code>XML:<nine-patch
-android:src="@drawable/background" android:dither="true" /></code>. This
-technique references the original artwork, in this case
-<code>"background.9.png"</code>, and instructs the device to dither it as
-needed.</li>
-
-</ul>
+<p>When starting to design a new widget, or updating an existing widget, it's a good idea to first
+look at the widget design templates below. The downloadable package below includes nine-patch
+background graphics, XML, and source Adobe&reg; Photoshop files for multiple screen densities, OS
+version widget styles, and widget colors. The template package also contains graphics useful for
+making your entire widget or parts of your widget (e.g. buttons) interactive.</p>
-<h2 id="file">Widget graphics file format</h2>
-<p>Save your widget artwork using the appropriate bounding box size in PNG-24
-format on a transparent background and in 8-bit color.</p>
+<img src="{@docRoot}images/widget_design/widget_template_excerpts.png"
+ alt="Widget template excerpts" id="widget_template_excerpts">
-<p><img src="{@docRoot}images/widget_design/file_format.png" alt="Widget graphics file format" ></p>
+<p class="img-caption"><strong>Figure 8.</strong> Excerpts from the App Widget Templates Pack
+(medium-density, dark, Android 4.0/previous styles, default/focused/pressed states).</p>
-
+<p>You can obtain the latest App Widget Templates Pack archive using the link below:</p>
+<p style="margin-left:2em"><a href="{@docRoot}shareables/app_widget_templates-v4.0.zip">
+ Download the App Widget Templates Pack for Android 4.0 &raquo;</a></p>
diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd
index 78b5b511b603..22283cdc306b 100644
--- a/docs/html/guide/topics/appwidgets/index.jd
+++ b/docs/html/guide/topics/appwidgets/index.jd
@@ -327,6 +327,49 @@ following layout classes:</p>
<p>Descendants of these classes are not supported.</p>
+<h3 id="AddingMargins">Adding margins to App Widgets</h3>
+
+<p>Widgets should not generally extend to screen edges and should not visually be flush with other widgets, so you should add margins on all sides around your widget frame.</p>
+
+<p>As of Android 4.0, app widgets are automatically given padding between the widget frame and the app widget's bounding box to provide better alignment with other widgets and icons on the user's home screen. To take advantage of this strongly recommended behavior, set your application's <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a> to 14 or greater.</p>
+
+<p>It's easy to write a single layout that has custom margins applied for earlier versions of the platform, and has no extra margins for Android 4.0 and greater:</p>
+
+<ol>
+ <li>Set your application's <code>targetSdkVersion</code> to 14 or greater.</li>
+ <li>Create a layout such as the one below, that references a <a href="{@docRoot}guide/topics/resources/more-resources.html#Dimension">dimension resource</a> for its margins:
+
+<pre>
+&lt;FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ <strong>android:layout_margin="@dimen/widget_margin"&gt;</strong>
+
+ &lt;LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@drawable/my_widget_background"&gt;
+ &hellip;
+ &lt;/LinearLayout&gt;
+
+&lt;/FrameLayout&gt;
+</pre>
+
+ </li>
+ <li>Create two dimensions resources, one in <code>res/values/</code> to provide the pre-Android 4.0 custom margins, and one in <code>res/values-v14/</code> to provide no extra padding for Android 4.0 widgets:
+
+ <p><strong>res/values/dimens.xml</strong>:<br>
+ <pre>&lt;dimen name="widget_margin"&gt;15dp&lt;/dimen&gt;</pre></p>
+
+ <p><strong>res/values-v14/dimens.xml</strong>:<br>
+ <pre>&lt;dimen name="widget_margin"&gt;0dp&lt;/dimen&gt;</pre></p>
+ </li>
+</ol>
+
+<p>Another option is to simply build extra margins into your <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">nine-patch</a> background assets by default, and provide different nine-patches with no margins for API level 14 or later.</p>
+
+
<h2 id="AppWidgetProvider">Using the AppWidgetProvider Class</h2>
<div class="sidebox-wrapper">
diff --git a/docs/html/guide/topics/resources/more-resources.jd b/docs/html/guide/topics/resources/more-resources.jd
index 5f4d5c2cace5..972eab97526c 100644
--- a/docs/html/guide/topics/resources/more-resources.jd
+++ b/docs/html/guide/topics/resources/more-resources.jd
@@ -698,7 +698,7 @@ Resources res = {@link android.content.Context#getResources()};
TypedArray icons = res.{@link android.content.res.Resources#obtainTypedArray(int) obtainTypedArray}(R.array.icons);
Drawable drawable = icons.{@link android.content.res.TypedArray#getDrawable(int) getDrawable}(0);
-TypedArray colors = res.{@link android.content.res.Resources#obtainTypedArray(int) obtainTypedArray}(R.array.icons);
+TypedArray colors = res.{@link android.content.res.Resources#obtainTypedArray(int) obtainTypedArray}(R.array.colors);
int color = colors.{@link android.content.res.TypedArray#getColor(int,int) getColor}(0,0);
</pre>
</dd> <!-- end example -->
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
index abc945ab6c36..f12c5eefc950 100644
--- a/docs/html/guide/topics/ui/notifiers/notifications.jd
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -12,7 +12,7 @@ without interupting their current activity</li>
<li>You can attach an intent to your notification that the system will initiate when the
user clicks it</li>
</ul>
-
+
<h2>In this document</h2>
<ol>
<li><a href="#Basics">The Basics</a></li>
@@ -26,7 +26,7 @@ user clicks it</li>
<li><a href="#More">More features</a></li>
</ol>
</li>
- <li><a href="#CustomExpandedView">Creating a Custom Expanded View</a></li>
+ <li><a href="#CustomExpandedView">Creating a Custom Notification Layout</a></li>
</ol>
<h2>Key classes</h2>
<ol>
@@ -36,57 +36,63 @@ user clicks it</li>
</div>
</div>
-<p>A status bar notification adds an icon to the system's status bar
-(with an optional ticker-text message) and an expanded message in the "Notifications" window.
-When the user selects the expanded message, Android fires an
-{@link android.content.Intent} that is defined by the notification (usually to launch an
-{@link android.app.Activity}).
+<p>A status bar notification adds an icon to the system's status bar
+(with an optional ticker-text message) and a notification message in the notifications window.
+When the user selects the notification, Android fires an
+{@link android.content.Intent} that is defined by the {@link android.app.Notification} (usually to
+launch an {@link android.app.Activity}).
You can also configure the notification to alert the user with a sound, a vibration, and flashing
lights on the device.</p>
<p>A status bar notification should be used for any case in
-which a background Service needs to alert the user about an event that requires a response. A background Service
-<strong>should never</strong> launch an Activity on its own in order to receive user interaction.
-The Service should instead create a status bar notification that will launch the Activity
+which a background service needs to alert the user about an event that requires a response. A
+background service
+<strong>should never</strong> launch an activity on its own in order to receive user interaction.
+The service should instead create a status bar notification that will launch the activity
when selected by the user.</p>
-<p>The screenshot below shows the status bar with a notification icon on the left side.</p>
+<p>Figure 1 shows the status bar with a notification icon on the left side.</p>
<img src="{@docRoot}images/status_bar.png" alt="" />
+<p class="img-caption"><strong>Figure 1.</strong> Status bar with a notification.</p>
+
+<p>Figure 2 shows the notification's message in the notifications window.</p>
-<p>The next screenshot shows the notification's expanded message in the "Notifications" window.
-The user can reveal the Notifications window by pulling down the status bar
-(or selecting <em>Notifications</em> from the Home options menu).</p>
<img src="{@docRoot}images/notifications_window.png" alt="" />
+<p class="img-caption"><strong>Figure 2.</strong> The notifications window.</p>
<h2 id="Basics">The Basics</h2>
-<p>An {@link android.app.Activity} or {@link android.app.Service} can initiate a status bar
-notification. Because an Activity can perform actions only while it is
-active and in focus, you should create your status bar notifications from a
-Service. This way, the notification can be created from the background,
+<p>An {@link android.app.Activity} or {@link android.app.Service} can initiate a status bar
+notification. Because an activity can perform actions only while it is
+running in the foreground and its window has focus, you will usually create status bar notifications
+from a
+service. This way, the notification can be created from the background,
while the user is using another application or
while the device is asleep. To create a notification, you must use two
classes: {@link android.app.Notification} and {@link android.app.NotificationManager}.</p>
-<p>Use an instance of the {@link android.app.Notification} class to define the properties of your
-status bar notification, such as the status bar icon, the expanded message, and extra settings such
-as a sound to play. The {@link android.app.NotificationManager} is an Android system service that
-executes and manages all Notifications. You do not instantiate the NotificationManager. In order
-to give it your Notification, you must retrieve a reference to the NotificationManager with
-{@link android.app.Activity#getSystemService(String) getSystemService()} and
-then, when you want to notify the user, pass it your Notification object with
+<p>Use an instance of the {@link android.app.Notification} class to define the properties of your
+status bar notification, such as the status bar icon, the notification message, and extra settings
+such as a sound to play. The {@link android.app.NotificationManager} is an Android system service
+that executes and manages all status bar notifications. You do not instantiate the
+{@link android.app.NotificationManager} directly. In order
+to give it your {@link android.app.Notification}, you must retrieve a reference to the
+{@link android.app.NotificationManager} with
+{@link android.app.Activity#getSystemService(String) getSystemService()} and
+then, when you want to notify the user, pass it your {@link android.app.Notification} with
{@link android.app.NotificationManager#notify(int,Notification) notify()}. </p>
<p>To create a status bar notification:</p>
<ol>
- <li>Get a reference to the NotificationManager:
+ <li>Get a reference to the {@link android.app.NotificationManager}:
<pre>
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
</pre>
</li>
- <li>Instantiate the Notification:
+ <!-- use Notification.Builder in 3.0 -->
+ <li>Instantiate the {@link android.app.Notification}:
<pre>
int icon = R.drawable.notification_icon;
CharSequence tickerText = "Hello";
@@ -95,7 +101,7 @@ long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
</pre>
</li>
- <li>Define the Notification's expanded message and Intent:
+ <li>Define the notification's message and {@link android.app.PendingIntent}:
<pre>
Context context = getApplicationContext();
CharSequence contentTitle = "My notification";
@@ -106,7 +112,7 @@ PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationInt
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
</pre>
</li>
- <li>Pass the Notification to the NotificationManager:
+ <li>Pass the {@link android.app.Notification} to the {@link android.app.NotificationManager}:
<pre>
private static final int HELLO_ID = 1;
@@ -121,38 +127,41 @@ mNotificationManager.notify(HELLO_ID, notification);
<p>The {@link android.app.NotificationManager} is a system service that manages all
notifications. You must retrieve a reference to it with the
-{@link android.app.Activity#getSystemService(String) getSystemService()} method.
+{@link android.app.Activity#getSystemService(String) getSystemService()} method.
For example:</p>
<pre>
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
</pre>
-<p>When you want to send your status bar notification, pass the Notification object
-to the NotificationManager with {@link android.app.NotificationManager#notify(int,Notification)}.
-The first parameter is the unique ID for the Notification and the second is the Notification object.
-The ID uniquely identifies the Notification from within your
-application. This is necessary if you need to update the Notification or (if
-your application manages different kinds of Notifications) select the appropriate action
-when the user returns to your application via the Intent defined in the Notification.</p>
+<p>When you want to deliver your status bar notification, pass the {@link android.app.Notification}
+to the {@link android.app.NotificationManager} with {@link
+android.app.NotificationManager#notify(int,Notification)}.
+The first parameter is the unique ID for the notification and the second is the {@link
+android.app.Notification} object.
+The ID uniquely identifies the notification from within your
+application. The ID is necessary if you need to update the notification or (if
+your application manages different kinds of notifications) select the appropriate action
+when the user returns to your application via the intent defined in the notification.</p>
-<p>To clear the status bar notification when the user selects it from the Notifications
-window, add the "FLAG_AUTO_CANCEL" flag to your Notification object. You can also clear it
-manually with {@link android.app.NotificationManager#cancel(int)}, passing it the notification ID,
-or clear all your Notifications with {@link android.app.NotificationManager#cancelAll()}.</p>
+<p>To clear the status bar notification when the user selects it from the notifications
+window, add the "FLAG_AUTO_CANCEL" flag to your {@link android.app.Notification}. You can
+also clear it manually with {@link android.app.NotificationManager#cancel(int)}, passing it the
+notification ID, or clear all your notifications with {@link
+android.app.NotificationManager#cancelAll()}.</p>
<h2 id="CreateANotification">Creating a Notification</h2>
<p>A {@link android.app.Notification} object defines the details of the notification
-message that is displayed in the status bar and "Notifications" window, and any other
+message that is displayed in the status bar and notifications window, and any other
alert settings, such as sounds and blinking lights.</p>
<p>A status bar notification <em>requires</em> all of the following:</p>
<ul>
<li>An icon for the status bar</li>
- <li>A title and expanded message for the expanded view (unless you define a
- <a href="#CustomExpandedView">custom expanded view</a>)</li>
+ <li>A title and message, unless you define a
+ <a href="#CustomExpandedView">custom notification layout</a></li>
<li>A {@link android.app.PendingIntent}, to be fired when the notification is selected</li>
</ul>
<p>Optional settings for the status bar notification include:</p>
@@ -163,18 +172,18 @@ alert settings, such as sounds and blinking lights.</p>
<li>A flashing LED setting</li>
</ul>
-<p>The starter-kit for a new Notification includes the
-{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the
-{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)}
-method. These define all the required settings for a Notification.
-The following snippet demonstrates a basic Notification setup:</p>
+<p>The starter-kit for a new notification includes the
+{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the
+{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)}
+method. These define all the required settings for a notification.
+The following snippet demonstrates a basic notification setup:</p>
<pre>
int icon = R.drawable.notification_icon; // icon from resources
CharSequence tickerText = "Hello"; // ticker-text
long when = System.currentTimeMillis(); // notification time
Context context = getApplicationContext(); // application Context
-CharSequence contentTitle = "My notification"; // expanded message title
-CharSequence contentText = "Hello World!"; // expanded message text
+CharSequence contentTitle = "My notification"; // message title
+CharSequence contentText = "Hello World!"; // message text
Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
@@ -187,32 +196,33 @@ notification.setLatestEventInfo(context, contentTitle, contentText, contentInten
<h3 id="Updating">Updating the notification</h3>
-<p>You can update the information in your status bar notification as events
-continue to occur in your application. For example, when a new SMS text message arrives
-before previous messages have been read, the Messaging application updates the existing
+<p>You can update the information in your status bar notification as events
+continue to occur in your application. For example, when a new SMS text message arrives
+before previous messages have been read, the Messaging application updates the existing
notification to display the total number of new messages received.
-This practice of updating an existing Notification is much better than adding new Notifications
-to the NotificationManager because it avoids clutter in the Notifications window.</p>
+This practice of updating an existing notification is much better than adding new
+notifications, because it avoids clutter in the notifications window.</p>
<p>Because each notification is uniquely identified
-by the NotificationManager with an integer ID, you can revise the notification by calling
-{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
-setLatestEventInfo()} with new values, change some field values of the Notification, and then call
+by the {@link android.app.NotificationManager} with an integer ID, you can revise the notification
+by calling {@link
+android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
+setLatestEventInfo()} with new values, change some field values of the notification, and then call
{@link android.app.NotificationManager#notify(int,Notification) notify()} again.</p>
<p>You can revise each property with the object member fields
-(except for the Context and the expanded message title and text). You should always
-revise the text message when you update the notification by calling
+(except for the {@link android.content.Context} and the notification title and text). You
+should always revise the text message when you update the notification by calling
{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
-setLatestEventInfo()} with new values for <var>contentTitle</var> and <var>contentText</var>.
-Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the
-notification. (Of course, if you've created a <a href="#CustomExpandedView">custom expanded
-view</a>, then updating these title and text values has no effect.)</p>
+setLatestEventInfo()} with new values for <var>contentTitle</var> and <var>contentText</var>.
+Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the
+notification. (Of course, if you've created a <a href="#CustomExpandedView">custom notification
+layout</a>, then updating these title and text values has no effect.)</p>
<h3 id="Sound">Adding a sound</h3>
-<p>You can alert the user with the default notification sound
+<p>You can alert the user with the default notification sound
(which is defined by the user) or with a sound specified by your application.</p>
<p>To use the user's default sound, add "DEFAULT_SOUND" to the <var>defaults</var> field:</p>
@@ -227,31 +237,35 @@ The following example uses a known audio file saved to the device SD card:</p>
notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
</pre>
-<p>In the next example, the audio file is chosen from the internal
+<p>In the next example, the audio file is chosen from the internal
{@link android.provider.MediaStore.Audio.Media MediaStore}'s {@link android.content.ContentProvider}:</p>
<pre>
notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
</pre>
-<p>In this case, the exact ID of the media file ("6") is known and appended to the content
+<p>In this case, the exact ID of the media file ("6") is known and appended to the content
{@link android.net.Uri}. If you don't know the exact ID, you must query all the
-media available in the MediaStore with a {@link android.content.ContentResolver}.
+media available in the {@link android.provider.MediaStore} with a {@link
+android.content.ContentResolver}.
See the <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>
documentation for more information on using a ContentResolver.</p>
<p>If you want the sound to continuously repeat until the user responds to the notification
-or the notification is cancelled, add "FLAG_INSISTENT" to the <var>flags</var> field.</p>
+or the notification is cancelled, add {@link android.app.Notification#FLAG_INSISTENT} to the
+<var>flags</var> field.</p>
-<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
-"DEFAULT_SOUND", then the default sound overrides any sound defined by the <var>sound</var> field.</p>
+<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
+{@link android.app.Notification#DEFAULT_SOUND}, then the default sound overrides any sound defined
+by the <var>sound</var> field.</p>
<h3 id="Vibration">Adding vibration</h3>
-<p>You can alert the user with the the default
+<p>You can alert the user with the the default
vibration pattern or with a vibration pattern defined by your application.</p>
-<p>To use the default pattern, add "DEFAULT_VIBRATE" to the <var>defaults</var> field:</p>
+<p>To use the default pattern, add {@link android.app.Notification#DEFAULT_VIBRATE} to the
+<var>defaults</var> field:</p>
<pre>
notification.defaults |= Notification.DEFAULT_VIBRATE;
</pre>
@@ -264,30 +278,32 @@ notification.vibrate = vibrate;
</pre>
<p>The long array defines the alternating pattern for the length of vibration off and on
-(in milliseconds). The first value is how long to wait (off) before beginning, the second
-value is the length of the first vibration, the third is the next length off, and so on.
+(in milliseconds). The first value is how long to wait (off) before beginning, the second
+value is the length of the first vibration, the third is the next length off, and so on.
The pattern can be as long as you like, but it can't be set to repeat.
</p>
-<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
-"DEFAULT_VIBRATE", then the default vibration overrides any vibration defined by the
+<p class="note"><strong>Note:</strong> If the <var>defaults</var> field includes
+{@link android.app.Notification#DEFAULT_VIBRATE}, then the default vibration overrides any vibration
+defined by the
<var>vibrate</var> field.</p>
<h3 id="Lights">Adding flashing lights</h3>
-<p>To alert the user by flashing LED lights, you can implement the default
+<p>To alert the user by flashing LED lights, you can implement the default
light pattern (if available), or define your own color and pattern for the lights.</p>
-<p>To use the default light setting, add "DEFAULT_LIGHTS" to the <var>defaults</var> field:</p>
+<p>To use the default light setting, add {@link android.app.Notification#DEFAULT_LIGHTS} to the
+<var>defaults</var> field:</p>
<pre>
notification.defaults |= Notification.DEFAULT_LIGHTS;
</pre>
<p>To define your own color and pattern, define a value for the <var>ledARGB</var> field
-(for the color), the <var>ledOffMS</var> field (length of time, in milliseconds, to
-keep the light off), the <var>ledOnMS</var> (length of time, in milliseconds, to keep the light on),
-and also add "FLAG_SHOW_LIGHTS" to the <var>flags</var> field:</p>
+(for the color), the <var>ledOffMS</var> field (length of time, in milliseconds, to
+keep the light off), the <var>ledOnMS</var> (length of time, in milliseconds, to keep the light on),
+and also add {@link android.app.Notification#FLAG_SHOW_LIGHTS} to the <var>flags</var> field:</p>
<pre>
notification.ledARGB = 0xff00ff00;
notification.ledOnMS = 300;
@@ -295,114 +311,161 @@ notification.ledOffMS = 1000;
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
</pre>
-<p>In this example, the green light repeatedly flashes on for 300 milliseconds and
-turns off for one second. Not every color in the spectrum is supported by the
-device LEDs, and not every device supports the same colors, so the hardware
+<p>In this example, the green light repeatedly flashes on for 300 milliseconds and
+turns off for one second. Not every color in the spectrum is supported by the
+device LEDs, and not every device supports the same colors, so the hardware
estimates to the best of its ability. Green is the most common notification color.</p>
<h3 id="More">More features</h3>
<p>You can add several more features to your notifications
-using Notification fields and flags. Some useful features include the following:</p>
+using {@link android.app.Notification} fields and flags. Some useful features include the
+following:</p>
<dl>
- <dt>"FLAG_AUTO_CANCEL" flag</dt>
+ <dt>{@link android.app.Notification#FLAG_AUTO_CANCEL} flag</dt>
<dd>Add this to the <var>flags</var> field to automatically cancel the notification
- after it is selected from the Notifications window.</dd>
- <dt>"FLAG_INSISTENT" flag</dt>
+ after it is selected from the notifications window.</dd>
+ <dt>{@link android.app.Notification#FLAG_INSISTENT} flag</dt>
<dd>Add this to the <var>flags</var> field to repeat the audio until the
user responds.</dd>
- <dt>"FLAG_ONGOING_EVENT" flag</dt>
+ <dt>{@link android.app.Notification#FLAG_ONGOING_EVENT} flag</dt>
<dd>Add this to the <var>flags</var> field to group the notification under the "Ongoing"
- title in the Notifications window. This indicates that the application is on-going &mdash;
- its processes is still running in the background, even when the application is not
+ title in the notifications window. This indicates that the application is on-going &mdash;
+ its processes are still running in the background, even when the application is not
visible (such as with music or a phone call).</dd>
- <dt>"FLAG_NO_CLEAR" flag</dt>
- <dd>Add this to the <var>flags</var> field to indicate that the notification should
- <em>not</em> be cleared by the "Clear notifications" button. This is particularly useful if
+ <dt>{@link android.app.Notification#FLAG_NO_CLEAR} flag</dt>
+ <dd>Add this to the <var>flags</var> field to indicate that the notification should
+ <em>not</em> be cleared by the "Clear notifications" button. This is particularly useful if
your notification is on-going.</dd>
- <dt><var>number</var> field</dt>
+ <dt>{@link android.app.Notification#number} field</dt>
<dd>This value indicates the current number of events represented by the notification.
The appropriate number is overlaid on top of the status bar icon.
If you intend to use this field, then you must start with "1" when the Notification is first
created. (If you change the value from zero to anything greater during an update, the number
is not shown.)</dd>
- <dt><var>iconLevel</var> field</dt>
- <dd>This value indicates the current level of a
+ <dt>{@link android.app.Notification#iconLevel} field</dt>
+ <dd>This value indicates the current level of a
{@link android.graphics.drawable.LevelListDrawable} that is used for the notification icon.
- You can animate the icon in the status bar by changing this value to correlate with the
+ You can animate the icon in the status bar by changing this value to correlate with the
drawable's defined in a LevelListDrawable. See the {@link android.graphics.drawable.LevelListDrawable}
reference for more information.</dd>
</dl>
-<p>See the {@link android.app.Notification} class reference for more information about additional
+<p>See the {@link android.app.Notification} class reference for more information about additional
features that you can customize for your application.</p>
-<h2 id="CustomExpandedView">Creating a Custom Expanded View</h2>
+<h2 id="CustomExpandedView">Creating a Custom Notification Layout</h2>
-<img src="{@docRoot}images/custom_message.png" alt="" style="float:right;" />
+<div class="figure" style="width:200px;margin-top:0">
+<img src="{@docRoot}images/custom_message.png" alt="" />
+<p class="img-caption"><strong>Figure 3.</strong> Notification with a custom layout.</p>
+</div>
-<p>By default, the expanded view used in the "Notifications" window includes a basic title and text
-message. These are defined by the <var>contentTitle</var> and <var>contentText</var>
+<p>By default, the notification that appears in the notifications window includes a title
+and the message text.
+These are defined by the <var>contentTitle</var> and <var>contentText</var>
parameters of the {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)
-setLatestEventInfo()} method. However, you can also define a custom layout for the expanded view using
-{@link android.widget.RemoteViews}. The screenshot to the right shows an example of a
-custom expanded view that uses an ImageView and TextView in a LinearLayout.</p>
+setLatestEventInfo()} method. However, you can also define a custom layout for the
+notification using
+{@link android.widget.RemoteViews}. Figure 3 shows an example of a
+custom notification layout. It looks similar to the default notification, but is
+actually created with a custom XML layout.</p>
-<p>To define your own layout for the expanded message,
-instantiate a {@link android.widget.RemoteViews} object and
-pass it to the <var>contentView</var> field of your Notification. Pass the
-{@link android.app.PendingIntent} to the <var>contentIntent</var> field.</p>
+<p>To define your own layout for the notification,
+instantiate a {@link android.widget.RemoteViews} object that inflates a custom layout file, then
+pass the {@link android.widget.RemoteViews} to the <var>contentView</var> field of your
+Notification.</p>
-<p>Creating a custom expanded view is best understood with an example:</p>
+<p>Creating a custom notification layout is best understood with an example:</p>
<ol>
- <li>Create the XML layout for the expanded view.
- For example, create a layout file called <code>custom_notification_layout.xml</code> and
- build it like so:
+ <li>Create the XML layout for the notification.
+ For example, the following layout is called <code>custom_notification.xml</code>:
<pre>
-&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="3dp"
- >
+&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="10dp" >
&lt;ImageView android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_marginRight="10dp"
- />
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_alignParentLeft="true"
+ android:layout_marginRight="10dp" />
+ &lt;TextView android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/image"
+ style="@style/NotificationTitle" />
&lt;TextView android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:textColor="#000"
- />
-&lt;/LinearLayout>
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/image"
+ android:layout_below="@id/title"
+ style="@style/NotificationText" />
+&lt;/RelativeLayout>
</pre>
- <p>This layout is used for the expanded view,
- but the content of the ImageView and TextView still needs to be defined by the application.
- RemoteViews offers some convenient methods that allow you to define this content...</p>
+ <p>Notice that the two {@link android.widget.TextView} elements include the {@code style}
+attribute. It's important that you use style resources for the text in your custom
+notifications, because the background color of the notification can vary across different
+devices and platform versions. Beginning with Android 2.3 (API level 9), the system defines a
+style for the text it uses for the default notification layouts. Thus, you should apply
+that style when running on Android 2.3 or higher to ensure that your text is visible against
+the background.</p>
+
+ <p>For example, to use the standard text colors on versions of Android lower than 2.3, you
+should use the following styles for {@code res/values/styles.xml}:</p>
+<pre>
+&lt;?xml version="1.0" encoding="utf-8"?>
+&lt;resources>
+ &lt;style name="NotificationText">
+ &lt;item name="android:textColor">?android:attr/textColorPrimary&lt;/item>
+ &lt;/style>
+ &lt;style name="NotificationTitle">
+ &lt;item name="android:textColor">?android:attr/textColorPrimary&lt;/item>
+ &lt;item name="android:textStyle">bold&lt;/item>
+ &lt;/style>
+ &lt;!-- If you want a slightly different color for some text,
+ consider using ?android:attr/textColorSecondary -->
+&lt;/resources>
+</pre>
+ <p>Then, to apply the system's default colors for notifications on Android
+2.3 and higher, use the following styles for {@code res/values-v9/styles.xml}:</p>
+<pre>
+&lt;?xml version="1.0" encoding="utf-8"?>
+&lt;resources>
+ &lt;style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />
+ &lt;style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />
+&lt;/resources>
+</pre>
+ <p>Now, when running on Android 2.3 (API level 9) or higher, the text in your custom view will
+use the same colors that the system does for default notifications. This is important because later
+versions of Android actually change the background color of the notifications to be dark. Inheriting
+the system's styles ensures that your text will be light in such cases, but also if the background
+is some other unexpected color, your text will also change as appropriate.</p>
</li>
- <li>In the application code, use the RemoveViews
+ <li>Now, in the application code, use the RemoveViews
methods to define the image and text. Then pass the RemoteViews object to the <var>contentView</var>
field of the Notification, as shown in this example:
<pre>
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image, R.drawable.notification_image);
-contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");
+contentView.setTextViewText(R.id.title, "Custom notification");
+contentView.setTextViewText(R.id.text, "This is a custom layout");
notification.contentView = contentView;
</pre>
- <p>As shown here, pass the application's package name and the layout
+ <p>As shown here, pass the application's package name and the layout
resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView,
using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()}
and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}.
In each case, pass the reference ID of the appropriate View object that you want to set, along with
- the value for that View. Finally, the RemoteViews object is passed to the Notification in the
+ the value for that View. Finally, the RemoteViews object is passed to the Notification in the
<var>contentView</var> field.</p>
</li>
@@ -416,23 +479,23 @@ PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationInt
notification.contentIntent = contentIntent;
</pre>
</li>
-
+
<li>The notification can now be sent as usual:
<pre>mNotificationManager.notify(CUSTOM_VIEW_ID, notification);</pre>
</li>
</ol>
-<p>The RemoteViews class also includes methods that you can use to easily add a
-{@link android.widget.Chronometer} or {@link android.widget.ProgressBar}
-in your notification's expanded view. For more information about creating custom layouts with
-RemoteViews, refer to the {@link android.widget.RemoteViews} class reference.</p>
+<p>The {@link android.widget.RemoteViews} class also includes methods that you can use to easily add
+a {@link android.widget.Chronometer} or {@link android.widget.ProgressBar}
+in your notification's layout. For more information about creating custom layouts for your
+notification, refer to the {@link android.widget.RemoteViews} class reference.</p>
-<p class="warning"><strong>Note:</strong>
-When creating a custom expanded view, you must take special care to ensure that your
-custom layout functions properly in different device orientations and resolutions. While this
+<p class="caution"><strong>Caution:</strong>
+When creating a custom notification layout, you must take special care to ensure that your
+custom layout functions properly in different device orientations and resolutions. While this
advice applies to all View layouts created on Android, it is especially important in this case
-because your layout real estate is very restricted. So don't make your custom layout too
+because your layout real estate is very restricted. So don't make your custom layout too
complex and be sure to test it in various configurations.</p>
diff --git a/docs/html/guide/topics/usb/adk.jd b/docs/html/guide/topics/usb/adk.jd
index 463ec9c2015a..120576bf5bc0 100644
--- a/docs/html/guide/topics/usb/adk.jd
+++ b/docs/html/guide/topics/usb/adk.jd
@@ -77,6 +77,10 @@ page.title=Android Open Accessory Development Kit
DIY Drones</a></li>
<li><a href=
+ "http://mbed.org/order/">
+ mbed</a></li>
+
+ <li><a href=
"http://www.microchip.com/android">
Microchip</a></li>
@@ -130,6 +134,11 @@ page.title=Android Open Accessory Development Kit
Drones</a> provides an Arduino-compatible board geared towards RC (radio controlled) and UAV
(unmanned aerial vehicle) enthusiasts.</li>
+ <li><a href="http://mbed.org/order/">mbed</a> provides a microcontroller and a library
+ to develop accessories that support the Android accessory protocol. For more information, see
+ <a href="http://mbed.org/cookbook/mbed-with-Android-ADK">mbed with the Android ADK</a>.
+ </li>
+
<li><a href="http://www.microchip.com/android">Microchip</a> provides a PIC based USB
microcontroller board.</li>
diff --git a/docs/html/images/custom_message.png b/docs/html/images/custom_message.png
index ea7c7160e020..00b763239c40 100755
--- a/docs/html/images/custom_message.png
+++ b/docs/html/images/custom_message.png
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
deleted file mode 100644
index a73a09a61f8d..000000000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
deleted file mode 100644
index cd869b5861f3..000000000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
deleted file mode 100644
index 95ac03118c42..000000000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
deleted file mode 100644
index 9f0a7b0cf3af..000000000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
deleted file mode 100644
index 14013dc0973d..000000000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
deleted file mode 100644
index 50a2b8ca0808..000000000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
deleted file mode 100644
index 22f99f8631b0..000000000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
deleted file mode 100644
index 591e963d6e02..000000000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
deleted file mode 100644
index c6a3f7adea71..000000000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
deleted file mode 100644
index ec811798ba05..000000000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
deleted file mode 100644
index 5cc8665cdb67..000000000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
deleted file mode 100644
index bad7ad126811..000000000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Add_Noise.png b/docs/html/images/widget_design/Add_Noise.png
deleted file mode 100644
index c323bb490c36..000000000000
--- a/docs/html/images/widget_design/Add_Noise.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Layer_Style.png b/docs/html/images/widget_design/Layer_Style.png
deleted file mode 100644
index 757780314244..000000000000
--- a/docs/html/images/widget_design/Layer_Style.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Music_widget_button_states.psd b/docs/html/images/widget_design/Music_widget_button_states.psd
deleted file mode 100644
index 17f3573d5097..000000000000
--- a/docs/html/images/widget_design/Music_widget_button_states.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/alignment.png b/docs/html/images/widget_design/alignment.png
deleted file mode 100644
index 2e794dde0ea0..000000000000
--- a/docs/html/images/widget_design/alignment.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/buttons.png b/docs/html/images/widget_design/buttons.png
deleted file mode 100644
index a6d1df275f99..000000000000
--- a/docs/html/images/widget_design/buttons.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/file_format.png b/docs/html/images/widget_design/file_format.png
deleted file mode 100644
index 26f0e562ab67..000000000000
--- a/docs/html/images/widget_design/file_format.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/landscape_sizes.png b/docs/html/images/widget_design/landscape_sizes.png
deleted file mode 100644
index 798bb159fd66..000000000000
--- a/docs/html/images/widget_design/landscape_sizes.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/music_example.png b/docs/html/images/widget_design/music_example.png
new file mode 100644
index 000000000000..885057e0a568
--- /dev/null
+++ b/docs/html/images/widget_design/music_example.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_layouts.png b/docs/html/images/widget_design/music_example_layouts.png
new file mode 100644
index 000000000000..31601b94452c
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_layouts.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_redline.png b/docs/html/images/widget_design/music_example_redline.png
new file mode 100644
index 000000000000..85794b8936b3
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_redline.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_stretched.png b/docs/html/images/widget_design/music_example_stretched.png
new file mode 100644
index 000000000000..28c2fb3cbfaf
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_stretched.png
Binary files differ
diff --git a/docs/html/images/widget_design/portrait_sizes.png b/docs/html/images/widget_design/portrait_sizes.png
deleted file mode 100644
index 9da252a4782c..000000000000
--- a/docs/html/images/widget_design/portrait_sizes.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_examples.png b/docs/html/images/widget_design/widget_examples.png
index e27ffbb24cfe..277b69a8bd53 100644
--- a/docs/html/images/widget_design/widget_examples.png
+++ b/docs/html/images/widget_design/widget_examples.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_landscape.png b/docs/html/images/widget_design/widget_sizes_landscape.png
deleted file mode 100644
index 052e28e24925..000000000000
--- a/docs/html/images/widget_design/widget_sizes_landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_portrait.png b/docs/html/images/widget_design/widget_sizes_portrait.png
deleted file mode 100644
index 31a240c052c4..000000000000
--- a/docs/html/images/widget_design/widget_sizes_portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_template_excerpts.png b/docs/html/images/widget_design/widget_template_excerpts.png
new file mode 100644
index 000000000000..aba09e248cd7
--- /dev/null
+++ b/docs/html/images/widget_design/widget_template_excerpts.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_terms.png b/docs/html/images/widget_design/widget_terms.png
new file mode 100644
index 000000000000..5c4d09d6a24a
--- /dev/null
+++ b/docs/html/images/widget_design/widget_terms.png
Binary files differ
diff --git a/docs/html/resources/articles/speech-input.jd b/docs/html/resources/articles/speech-input.jd
index 736087ecb2f4..0867ff26b023 100644
--- a/docs/html/resources/articles/speech-input.jd
+++ b/docs/html/resources/articles/speech-input.jd
@@ -87,8 +87,8 @@ while the "web search" model is used when users want to search by voice. </p>
regularly. You can use the
{@link android.speech.RecognizerIntent#ACTION_GET_LANGUAGE_DETAILS}
broadcast intent to query for the list of supported languages.
-The web search model is available in all three languages, while free-form has
-primarily been optimized for English. As we work hard to support more models in
+The web search model is available for all languages, while the free-form model
+may not be optimized for all languages. As we work hard to support more models in
more languages, and to improve the accuracy of the speech recognition technology
we use in our products, Android developers who integrate speech capabilities
directly into their applications can reap the benefits as well. </p>
diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js
index 720e14314c2a..6c5d882908d0 100644
--- a/docs/html/resources/resources-data.js
+++ b/docs/html/resources/resources-data.js
@@ -31,7 +31,8 @@ var ANDROID_TAGS = {
},
misc: {
'external': 'External',
- 'new': 'New'
+ 'new': 'New',
+ 'updated': 'Updated'
}
};
@@ -322,6 +323,16 @@ var ANDROID_RESOURCES = [
}
},
{
+ tags: ['article', 'accountsync', 'data'],
+ path: 'articles/contacts.html',
+ title: {
+ en: 'Using the Contacts API'
+ },
+ description: {
+ en: 'Android provides a Contacts API for managing and integrating contacts from multiple accounts and data sources and allows apps to read various information about individual contacts.'
+ }
+ },
+ {
tags: ['article', 'ui', 'web'],
path: 'articles/using-webviews.html',
title: {
@@ -377,7 +388,7 @@ var ANDROID_RESOURCES = [
///////////////////
{
- tags: ['sample', 'new'],
+ tags: ['sample'],
path: 'samples/AccelerometerPlay/index.html',
title: {
en: 'Accelerometer Play'
@@ -387,7 +398,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'accessibility'],
+ tags: ['sample', 'accessibility'],
path: 'samples/AccessibilityService/index.html',
title: {
en: 'Accessibility Service'
@@ -407,7 +418,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'layout', 'ui', 'fragment', 'loader', 'new'],
+ tags: ['sample', 'layout', 'ui', 'fragment', 'loader'],
path: 'samples/Support4Demos/index.html',
title: {
en: 'API 4+ Support Demos'
@@ -417,7 +428,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'layout', 'ui', 'new'],
+ tags: ['sample', 'layout', 'ui'],
path: 'samples/Support13Demos/index.html',
title: {
en: 'API 13+ Support Demos'
@@ -487,13 +498,13 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'newfeature', 'ui'],
+ tags: ['sample', 'updated', 'newfeature', 'ui'],
path: 'samples/HoneycombGallery/index.html',
title: {
en: 'Honeycomb Gallery'
},
description: {
- en: 'An image gallery application using APIs that are new in Android 3.0 (a.k.a. Honeycomb).'
+ en: 'An image gallery application that demonstrates a variety of new APIs in Android 3.0 (Honeycomb). In addition to providing a tablet-optimized design, it also supports handsets running Android 4.0 (Ice Cream Sandwich) and beyond, so is a good example of how to reuse Fragments to support different screen sizes.'
}
},
{
@@ -547,7 +558,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'media' ],
+ tags: ['sample', 'media' ],
path: 'samples/RandomMusicPlayer/index.html',
title: {
en: 'Random Music Player'
@@ -557,7 +568,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'newfeature', 'performance', 'gamedev', 'gl'],
+ tags: ['sample', 'newfeature', 'performance', 'gamedev', 'gl'],
path: 'samples/RenderScript/index.html',
title: {
en: 'RenderScript'
@@ -637,7 +648,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'newfeature', 'widgets'],
+ tags: ['sample', 'newfeature', 'widgets'],
path: 'samples/StackWidget/index.html',
title: {
en: 'StackView Widget'
@@ -667,7 +678,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'new', 'newfeature'],
+ tags: ['sample', 'newfeature'],
path: 'samples/USB/index.html',
title: {
en: 'USB'
@@ -683,7 +694,7 @@ var ANDROID_RESOURCES = [
en: 'Voicemail Provider Demo'
},
description: {
- en: 'A sample application to demonstrate how to use voicemail content provider APIs.'
+ en: 'A sample application to demonstrate how to use voicemail content provider APIs in Android 4.0.'
}
},
{
@@ -707,7 +718,7 @@ var ANDROID_RESOURCES = [
}
},
{
- tags: ['sample', 'widgets', 'newfeature', 'new'],
+ tags: ['sample', 'widgets', 'newfeature'],
path: 'samples/WeatherListWidget/index.html',
title: {
en: 'Weather List Widget'
@@ -733,7 +744,7 @@ var ANDROID_RESOURCES = [
en: 'Text To Speech Engine'
},
description: {
- en: 'An example Text To Speech engine written using the android text to speech engine API.'
+ en: 'An example Text To Speech engine written using the Android text to speech engine API in Android 4.0.'
}
},
diff --git a/docs/html/sdk/android-3.2.jd b/docs/html/sdk/android-3.2.jd
index 5618eaeb0aff..ea2b4ed6ad2e 100644
--- a/docs/html/sdk/android-3.2.jd
+++ b/docs/html/sdk/android-3.2.jd
@@ -166,7 +166,7 @@ in which the application UI will need to be drawn, not including screen areas
reserved by the system.
</li>
-<li>In constrast, a screen's <em>width</em> and <em>height</em> represent the
+<li>In contrast, a screen's <em>width</em> and <em>height</em> represent the
current horizontal or vertical space available for application layout, measured
in "dp" units, not including screen areas reserved by the system. The width and
height of a screen change when the user switches orientation between landscape
@@ -313,7 +313,7 @@ is designed to run. If the current screen is larger than the value specified,
the system forces the application into screen compatibility mode, to ensure best
display on the current screen.</li>
-<li><code>android:smallestWidthLimitDp="<em>numDp"</em></code> &mdash; This
+<li><code>android:requiresSmallestWidthDp="<em>numDp"</em></code> &mdash; This
attribute lets you specify the minimum smallestWidth on which the application
can run. If the current screen is smaller than the value specified, the system
considers the application incompatible with the device, but does not prevent it
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index 5cf37c120233..105c868f835c 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -1,21 +1,21 @@
page.title=Android SDK
sdk.redirect=0
-sdk.win_installer=installer_r12-windows.exe
-sdk.win_installer_bytes=36531492
-sdk.win_installer_checksum=367f0ed4ecd70aefc290d1f7dcb578ab
+sdk.win_installer=installer_r13-windows.exe
+sdk.win_installer_bytes=36533357
+sdk.win_installer_checksum=cd3a76fe2b8ed62b2d03cf1851692e2d
-sdk.win_download=android-sdk_r12-windows.zip
-sdk.win_bytes=36486190
-sdk.win_checksum=8d6c104a34cd2577c5506c55d981aebf
+sdk.win_download=android-sdk_r13-windows.zip
+sdk.win_bytes=36487911
+sdk.win_checksum=de8a039891e5e65b7742f188f07b992d
-sdk.mac_download=android-sdk_r12-mac_x86.zip
-sdk.mac_bytes=30231118
-sdk.mac_checksum=341544e4572b4b1afab123ab817086e7
+sdk.mac_download=android-sdk_r13-mac_x86.zip
+sdk.mac_bytes=30233944
+sdk.mac_checksum=f4002a0344b48856c09dec796acecd4d
-sdk.linux_download=android-sdk_r12-linux_x86.tgz
-sdk.linux_bytes=30034243
-sdk.linux_checksum=f8485275a8dee3d1929936ed538ee99a
+sdk.linux_download=android-sdk_r13-linux_x86.tgz
+sdk.linux_bytes=30034328
+sdk.linux_checksum=d80d7530a46c665644ae76084a9a0dc4
@jd:body
diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs
index a00ca125a6cf..8a57312a4690 100644
--- a/docs/html/sdk/sdk_toc.cs
+++ b/docs/html/sdk/sdk_toc.cs
@@ -77,7 +77,7 @@ class="new">new!</span></li>
<ul>
<li class="toggle-list">
<div><a href="<?cs var:toroot ?>sdk/android-3.2.html">
- <span class="en">Android 3.2 Platform</span></a> <span class="new">new!</span></div>
+ <span class="en">Android 3.2 Platform</span></a></div>
<ul>
<!-- <li><a href="<?cs var:toroot ?>sdk/android-3.2-highlights.html">Platform Highlights</a></li> -->
<li><a href="<?cs var:toroot ?>sdk/api_diff/13/changes.html">API Differences Report &raquo;</a></li>
@@ -142,11 +142,11 @@ class="new">new!</span></li>
</li>
</ul>
<ul>
- <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r12</a> <span
+ <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r13</a> <span
class="new">new!</span></li>
<li><a href="<?cs var:toroot ?>sdk/win-usb.html">Google USB Driver, r4</a></li>
<li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Compatibility Package,
-r3</a> <span class="new">new!</span></li>
+r3</a></li>
</ul>
</li>
<li>
@@ -169,7 +169,7 @@ r3</a> <span class="new">new!</span></li>
<span style="display:none" class="ja"></span>
<span style="display:none" class="zh-CN"></span>
<span style="display:none" class="zh-TW"></span></a>
- <span class="new">new!</span></li>
+ </li>
</ul>
</li>
<li>
@@ -183,8 +183,7 @@ r3</a> <span class="new">new!</span></li>
<span style="display:none" class="zh-TW"></span>
</h2>
<ul>
- <li><a href="<?cs var:toroot ?>sdk/ndk/index.html">Android NDK, r6b</a>
- <span class="new">new!</span>
+ <li><a href="<?cs var:toroot ?>sdk/ndk/index.html">Android NDK, r6b</a>
</li>
<li><a href="<?cs var:toroot ?>sdk/ndk/overview.html">What is the NDK?</a></li>
</ul>
diff --git a/docs/html/sdk/tools-notes.jd b/docs/html/sdk/tools-notes.jd
index 8c4d0378e79c..2179cec6036d 100644
--- a/docs/html/sdk/tools-notes.jd
+++ b/docs/html/sdk/tools-notes.jd
@@ -4,7 +4,7 @@ page.title=SDK Tools
<p>SDK Tools is a downloadable component for the Android SDK. It includes the
complete set of development and debugging tools for the Android SDK. </p>
-<p>If you are new to the Android SDK, the <a
+<p>If you are new to the Android SDK, the <a
href="{@docRoot}sdk/index.html">SDK starter package</a> installs the
latest revision of the SDK Tools in the <code>&lt;sdk&gt;/tools</code> directory.</p>
@@ -66,6 +66,35 @@ padding: .25em 1em;
<div class="toggleable opened">
<a href="#" onclick="return toggleDiv(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px" />
+SDK Tools, Revision 13</a> <em>(September 2011)</em>
+ <div class="toggleme">
+ <dl>
+<dt>Dependencies:</dt>
+<dd>
+<p>If you are developing in Eclipse with ADT, note that the SDK Tools r13 is designed for use with
+ADT 12.0.0 and later. If you haven't already, we highly recommend updating your <a
+href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin</a> to 12.0.0.</p>
+
+<p>If you are developing outside Eclipse, you must have <a href="http://ant.apache.org/">Apache
+Ant</a> 1.8 or later.</p>
+
+<dt>General notes:</dt>
+<dd>
+ <ul>
+ <li>Fix compilation issue in Ant (<code>dex</code> step) when paths have spaces.</li>
+ <li>Fix issue in emulator installation when paths have spaces.</li>
+ <li>Fix issue when AVD paths have spaces.</li>
+ <li>Fix rendering issue when using emulator scaling (<a href="http://code.google.com/p/android/issues/detail?id=18299">see more</a>).</li>
+ </ul>
+</dd>
+</dl>
+</div>
+</div>
+
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" width="9px" />
SDK Tools, Revision 12</a> <em>(July 2011)</em>
<div class="toggleme">
<dl>
@@ -396,7 +425,7 @@ install SDK Tools r4 in your SDK. </p></dd>
<dt>General notes:</dt>
<dd>
<ul>
-<li>Launcher script now forces GDK_NATIVE_WINDOW=true (linux only), to fix a
+<li>Launcher script now forces GDK_NATIVE_WINDOW=true (linux only), to fix a
compatibility issue between GTK and SWT.</li>
</ul>
</dd>
@@ -405,7 +434,7 @@ compatibility issue between GTK and SWT.</li>
<dd>
<ul>
<li>AVD Launch dialog now shows scale value.</li>
-<li>Fixes potential NPE in SDK Manager on AVD launch, for older AVD with no
+<li>Fixes potential NPE in SDK Manager on AVD launch, for older AVD with no
skin name specified.</li>
<li>Fixes XML validation issue in on older Java versions.</li>
<li>No longer forces the use of Java 1.5 on Mac OS X.</li>
@@ -470,7 +499,7 @@ display the trace.</li>
<dd>
<ul>
<li>Provides a new UI that lets you set options for controlling
-the emulator skin, screen size/density, and scale factor used when launching
+the emulator skin, screen size/density, and scale factor used when launching
an AVD.</li>
<li>Provides improved AVD creation UI, which lets you customize the hardware
properties of your AVDs.</li>
@@ -481,11 +510,11 @@ between SDK add-ons and platforms.</li>
<dt>Layoutopt, a new tool for optimizing layouts:</dt>
-<dd><p>The SDK Tools r3 package includes <code>layoutopt</code>, a new command-line
-tool that helps you optimize your layout hierarchies. When run against your
-layout files, the tool analyzes their hierarchies and notifies you of
-inefficiencies and other potential issues. The tool also provides simple
-solutions for the issues it finds. For usage, see <a
+<dd><p>The SDK Tools r3 package includes <code>layoutopt</code>, a new command-line
+tool that helps you optimize your layout hierarchies. When run against your
+layout files, the tool analyzes their hierarchies and notifies you of
+inefficiencies and other potential issues. The tool also provides simple
+solutions for the issues it finds. For usage, see <a
href="/guide/developing/tools/layoutopt.html">layoutopt</a>.</p>
</dd>
</dl>
diff --git a/docs/html/shareables/app_widget_templates-v4.0.zip b/docs/html/shareables/app_widget_templates-v4.0.zip
new file mode 100644
index 000000000000..b16ef127c204
--- /dev/null
+++ b/docs/html/shareables/app_widget_templates-v4.0.zip
Binary files differ
diff --git a/drm/drmserver/DrmManager.cpp b/drm/drmserver/DrmManager.cpp
index 3e4fe8c07d23..b2fa05378258 100644
--- a/drm/drmserver/DrmManager.cpp
+++ b/drm/drmserver/DrmManager.cpp
@@ -98,21 +98,27 @@ void DrmManager::removeUniqueId(int uniqueId) {
}
status_t DrmManager::loadPlugIns() {
+
+ String8 vendorPluginDirPath("/vendor/lib/drm");
+ loadPlugIns(vendorPluginDirPath);
+
String8 pluginDirPath("/system/lib/drm");
- return loadPlugIns(pluginDirPath);
+ loadPlugIns(pluginDirPath);
+ return DRM_NO_ERROR;
+
}
status_t DrmManager::loadPlugIns(const String8& plugInDirPath) {
- if (mSupportInfoToPlugInIdMap.isEmpty()) {
- mPlugInManager.loadPlugIns(plugInDirPath);
- Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
- for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
- String8 plugInPath = plugInPathList[i];
- DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
- if (NULL != info) {
+ mPlugInManager.loadPlugIns(plugInDirPath);
+ Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
+ for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
+ String8 plugInPath = plugInPathList[i];
+ DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
+ if (NULL != info) {
+ if (mSupportInfoToPlugInIdMap.indexOfKey(*info) < 0) {
mSupportInfoToPlugInIdMap.add(*info, plugInPath);
- delete info;
}
+ delete info;
}
}
return DRM_NO_ERROR;
diff --git a/graphics/java/android/renderscript/ProgramRaster.java b/graphics/java/android/renderscript/ProgramRaster.java
index bc0d928a4b0e..60d9698df411 100644
--- a/graphics/java/android/renderscript/ProgramRaster.java
+++ b/graphics/java/android/renderscript/ProgramRaster.java
@@ -84,14 +84,10 @@ public class ProgramRaster extends BaseObj {
public static class Builder {
RenderScript mRS;
boolean mPointSprite;
- boolean mPointSmooth;
- boolean mLineSmooth;
CullMode mCullMode;
public Builder(RenderScript rs) {
mRS = rs;
- mPointSmooth = false;
- mLineSmooth = false;
mPointSprite = false;
mCullMode = CullMode.BACK;
}
@@ -108,8 +104,7 @@ public class ProgramRaster extends BaseObj {
public ProgramRaster create() {
mRS.validate();
- int id = mRS.nProgramRasterCreate(mPointSmooth, mLineSmooth, mPointSprite,
- 1.f, mCullMode.mID);
+ int id = mRS.nProgramRasterCreate(mPointSprite, mCullMode.mID);
return new ProgramRaster(id, mRS);
}
}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 571b8952ebd6..e2950d5ed9f2 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -522,13 +522,10 @@ public class RenderScript {
dstMode, depthFunc);
}
- native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth,
- boolean pointSprite, float lineWidth, int cullMode);
- synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth,
- boolean pointSprite, float lineWidth, int cullMode) {
+ native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
+ synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
validate();
- return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite, lineWidth,
- cullMode);
+ return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
}
native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index d7ac5d8269d3..ec1f8dea7c7d 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -1053,12 +1053,10 @@ nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader,
// ---------------------------------------------------------------------------
static jint
-nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSmooth,
- jboolean lineSmooth, jboolean pointSprite, jfloat lineWidth, jint cull)
+nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
{
- LOG_API("nProgramRasterCreate, con(%p), pointSmooth(%i), lineSmooth(%i), pointSprite(%i)",
- con, pointSmooth, lineSmooth, pointSprite);
- return (jint)rsProgramRasterCreate(con, pointSmooth, lineSmooth, pointSprite, lineWidth, (RsCullMode)cull);
+ LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
+ return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
}
@@ -1295,7 +1293,7 @@ static JNINativeMethod methods[] = {
{"rsnProgramBindSampler", "(IIII)V", (void*)nProgramBindSampler },
{"rsnProgramFragmentCreate", "(ILjava/lang/String;[I)I", (void*)nProgramFragmentCreate },
-{"rsnProgramRasterCreate", "(IZZZFI)I", (void*)nProgramRasterCreate },
+{"rsnProgramRasterCreate", "(IZI)I", (void*)nProgramRasterCreate },
{"rsnProgramVertexCreate", "(ILjava/lang/String;[I)I", (void*)nProgramVertexCreate },
{"rsnContextBindRootScript", "(II)V", (void*)nContextBindRootScript },
diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h
index 493993d6d983..926eb9a82c17 100644
--- a/include/gui/SurfaceTexture.h
+++ b/include/gui/SurfaceTexture.h
@@ -25,8 +25,9 @@
#include <ui/GraphicBuffer.h>
-#include <utils/threads.h>
+#include <utils/String8.h>
#include <utils/Vector.h>
+#include <utils/threads.h>
#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture"
@@ -202,6 +203,10 @@ public:
// by OpenGL ES as a texture) then those buffer will remain allocated.
void abandon();
+ // set the name of the SurfaceTexture that will be used to identify it in
+ // log messages.
+ void setName(const String8& name);
+
// dump our state in a String
void dump(String8& result) const;
void dump(String8& result, const char* prefix, char* buffer, size_t SIZE) const;
@@ -444,6 +449,10 @@ private:
// all ISurfaceTexture methods capable of returning an error.
bool mAbandoned;
+ // mName is a string used to identify the SurfaceTexture in log messages.
+ // It is set by the setName method.
+ String8 mName;
+
// mMutex is the mutex used to prevent concurrent access to the member
// variables of SurfaceTexture objects. It must be locked whenever the
// member variables are accessed.
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index b7286e537319..5822877217c0 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -113,6 +113,7 @@ private:
Vector<BufferInfo> mBuffers[2];
bool mPortEOS[2];
+ status_t mInputEOSResult;
List<sp<AMessage> > mDeferredQueue;
@@ -150,6 +151,12 @@ private:
OMX_VIDEO_CODINGTYPE compressionFormat);
status_t setupAACDecoder(int32_t numChannels, int32_t sampleRate);
+ status_t setupAMRDecoder(bool isWAMR);
+ status_t setupG711Decoder(int32_t numChannels);
+
+ status_t setupRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
+
status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
status_t initNativeWindow();
diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/surfaceflinger/ISurfaceComposer.h
index 6b31ca4cb8bb..e0f4cf900adf 100644
--- a/include/surfaceflinger/ISurfaceComposer.h
+++ b/include/surfaceflinger/ISurfaceComposer.h
@@ -88,11 +88,6 @@ public:
eElectronBeamAnimationOff = 0x10
};
- // flags for setOrientation
- enum {
- eOrientationAnimationDisable = 0x00000001
- };
-
/* create connection with surface flinger, requires
* ACCESS_SURFACE_FLINGER permission
*/
@@ -112,7 +107,8 @@ public:
virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) = 0;
virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) = 0;
- /* Set display orientation. requires ACCESS_SURFACE_FLINGER permission */
+ /* Set display orientation. requires ACCESS_SURFACE_FLINGER permission
+ * No flags are currently defined. Set flags to 0. */
virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) = 0;
/* signal that we're done booting.
diff --git a/include/ui/Rect.h b/include/ui/Rect.h
index 4e65a2d0b9fe..9e98bc562026 100644
--- a/include/ui/Rect.h
+++ b/include/ui/Rect.h
@@ -27,7 +27,7 @@ namespace android {
class Rect : public ARect
{
public:
- typedef int32_t value_type;
+ typedef ARect::value_type value_type;
// we don't provide copy-ctor and operator= on purpose
// because we want the compiler generated versions
diff --git a/include/utils/threads.h b/include/utils/threads.h
index c68562505560..ab3e8cdb638d 100644
--- a/include/utils/threads.h
+++ b/include/utils/threads.h
@@ -143,6 +143,10 @@ extern int androidSetThreadSchedulingGroup(pid_t tid, int grp);
// in either case errno is set. Thread ID zero means current thread.
extern int androidSetThreadPriority(pid_t tid, int prio);
+// Get the current priority of a particular thread. Returns one of the
+// ANDROID_PRIORITY constants or a negative result in case of error.
+extern int androidGetThreadPriority(pid_t tid);
+
// Get the current scheduling group of a particular thread. Normally returns
// one of the ANDROID_TGROUP constants other than ANDROID_TGROUP_DEFAULT.
// Returns ANDROID_TGROUP_DEFAULT if no pthread support (e.g. on host) or if
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index 79a01a35122a..dac9418190c0 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -39,6 +39,12 @@
#define ALLOW_DEQUEUE_CURRENT_BUFFER false
+// Macros for including the SurfaceTexture name in log messages
+#define ST_LOGV(x, ...) LOGV("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGD(x, ...) LOGD("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGI(x, ...) LOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGW(x, ...) LOGW("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGE(x, ...) LOGE("[%s] "x, mName.string(), ##__VA_ARGS__)
namespace android {
@@ -82,6 +88,12 @@ static float mtxRot270[16] = {
static void mtxMul(float out[16], const float a[16], const float b[16]);
+// Get an ID that's unique within this process.
+static int32_t createProcessUniqueId() {
+ static volatile int32_t globalCounter = 0;
+ return android_atomic_inc(&globalCounter);
+}
+
SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode) :
mDefaultWidth(1),
mDefaultHeight(1),
@@ -99,15 +111,19 @@ SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode) :
mAllowSynchronousMode(allowSynchronousMode),
mConnectedApi(NO_CONNECTED_API),
mAbandoned(false) {
- LOGV("SurfaceTexture::SurfaceTexture");
+ // Choose a name using the PID and a process-unique ID.
+ mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());
+
+ ST_LOGV("SurfaceTexture::SurfaceTexture");
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
mGraphicBufferAlloc = composer->createGraphicBufferAlloc();
mNextCrop.makeInvalid();
- memcpy(mCurrentTransformMatrix, mtxIdentity, sizeof(mCurrentTransformMatrix));
+ memcpy(mCurrentTransformMatrix, mtxIdentity,
+ sizeof(mCurrentTransformMatrix));
}
SurfaceTexture::~SurfaceTexture() {
- LOGV("SurfaceTexture::~SurfaceTexture");
+ ST_LOGV("SurfaceTexture::~SurfaceTexture");
freeAllBuffersLocked();
}
@@ -151,22 +167,22 @@ status_t SurfaceTexture::setBufferCountServer(int bufferCount) {
}
status_t SurfaceTexture::setBufferCount(int bufferCount) {
- LOGV("SurfaceTexture::setBufferCount");
+ ST_LOGV("SurfaceTexture::setBufferCount");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setBufferCount: SurfaceTexture has been abandoned!");
+ ST_LOGE("setBufferCount: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (bufferCount > NUM_BUFFER_SLOTS) {
- LOGE("setBufferCount: bufferCount larger than slots available");
+ ST_LOGE("setBufferCount: bufferCount larger than slots available");
return BAD_VALUE;
}
// Error out if the user has dequeued buffers
for (int i=0 ; i<mBufferCount ; i++) {
if (mSlots[i].mBufferState == BufferSlot::DEQUEUED) {
- LOGE("setBufferCount: client owns some buffers");
+ ST_LOGE("setBufferCount: client owns some buffers");
return -EINVAL;
}
}
@@ -181,7 +197,7 @@ status_t SurfaceTexture::setBufferCount(int bufferCount) {
}
if (bufferCount < minBufferSlots) {
- LOGE("setBufferCount: requested buffer count (%d) is less than "
+ ST_LOGE("setBufferCount: requested buffer count (%d) is less than "
"minimum (%d)", bufferCount, minBufferSlots);
return BAD_VALUE;
}
@@ -200,7 +216,8 @@ status_t SurfaceTexture::setBufferCount(int bufferCount) {
status_t SurfaceTexture::setDefaultBufferSize(uint32_t w, uint32_t h)
{
if (!w || !h) {
- LOGE("setDefaultBufferSize: dimensions cannot be 0 (w=%d, h=%d)", w, h);
+ ST_LOGE("setDefaultBufferSize: dimensions cannot be 0 (w=%d, h=%d)",
+ w, h);
return BAD_VALUE;
}
@@ -211,14 +228,14 @@ status_t SurfaceTexture::setDefaultBufferSize(uint32_t w, uint32_t h)
}
status_t SurfaceTexture::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
- LOGV("SurfaceTexture::requestBuffer");
+ ST_LOGV("SurfaceTexture::requestBuffer");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("requestBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("requestBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (slot < 0 || mBufferCount <= slot) {
- LOGE("requestBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("requestBuffer: slot index out of range [0, %d]: %d",
mBufferCount, slot);
return BAD_VALUE;
}
@@ -229,10 +246,10 @@ status_t SurfaceTexture::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
uint32_t format, uint32_t usage) {
- LOGV("SurfaceTexture::dequeueBuffer");
+ ST_LOGV("SurfaceTexture::dequeueBuffer");
if ((w && !h) || (!w && h)) {
- LOGE("dequeueBuffer: invalid size: w=%u, h=%u", w, h);
+ ST_LOGE("dequeueBuffer: invalid size: w=%u, h=%u", w, h);
return BAD_VALUE;
}
@@ -245,7 +262,7 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
bool tryAgain = true;
while (tryAgain) {
if (mAbandoned) {
- LOGE("dequeueBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("dequeueBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -334,7 +351,8 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
// than allowed.
const int avail = mBufferCount - (dequeuedCount+1);
if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {
- LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
+ ST_LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded "
+ "(dequeued=%d)",
MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
dequeuedCount);
return -EBUSY;
@@ -391,7 +409,8 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
mGraphicBufferAlloc->createGraphicBuffer(
w, h, format, usage, &error));
if (graphicBuffer == 0) {
- LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer failed");
+ ST_LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer "
+ "failed");
return error;
}
if (updateFormat) {
@@ -413,7 +432,7 @@ status_t SurfaceTexture::setSynchronousMode(bool enabled) {
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setSynchronousMode: SurfaceTexture has been abandoned!");
+ ST_LOGE("setSynchronousMode: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -441,29 +460,29 @@ status_t SurfaceTexture::setSynchronousMode(bool enabled) {
status_t SurfaceTexture::queueBuffer(int buf, int64_t timestamp,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
- LOGV("SurfaceTexture::queueBuffer");
+ ST_LOGV("SurfaceTexture::queueBuffer");
sp<FrameAvailableListener> listener;
{ // scope for the lock
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("queueBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("queueBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (buf < 0 || buf >= mBufferCount) {
- LOGE("queueBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("queueBuffer: slot index out of range [0, %d]: %d",
mBufferCount, buf);
return -EINVAL;
} else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
- buf, mSlots[buf].mBufferState);
+ ST_LOGE("queueBuffer: slot %d is not owned by the client "
+ "(state=%d)", buf, mSlots[buf].mBufferState);
return -EINVAL;
} else if (buf == mCurrentTexture) {
- LOGE("queueBuffer: slot %d is current!", buf);
+ ST_LOGE("queueBuffer: slot %d is current!", buf);
return -EINVAL;
} else if (!mSlots[buf].mRequestBufferCalled) {
- LOGE("queueBuffer: slot %d was enqueued without requesting a "
+ ST_LOGE("queueBuffer: slot %d was enqueued without requesting a "
"buffer", buf);
return -EINVAL;
}
@@ -513,20 +532,20 @@ status_t SurfaceTexture::queueBuffer(int buf, int64_t timestamp,
}
void SurfaceTexture::cancelBuffer(int buf) {
- LOGV("SurfaceTexture::cancelBuffer");
+ ST_LOGV("SurfaceTexture::cancelBuffer");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGW("cancelBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGW("cancelBuffer: SurfaceTexture has been abandoned!");
return;
}
if (buf < 0 || buf >= mBufferCount) {
- LOGE("cancelBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("cancelBuffer: slot index out of range [0, %d]: %d",
mBufferCount, buf);
return;
} else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
+ ST_LOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
buf, mSlots[buf].mBufferState);
return;
}
@@ -535,10 +554,10 @@ void SurfaceTexture::cancelBuffer(int buf) {
}
status_t SurfaceTexture::setCrop(const Rect& crop) {
- LOGV("SurfaceTexture::setCrop");
+ ST_LOGV("SurfaceTexture::setCrop");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setCrop: SurfaceTexture has been abandoned!");
+ ST_LOGE("setCrop: SurfaceTexture has been abandoned!");
return NO_INIT;
}
mNextCrop = crop;
@@ -546,10 +565,10 @@ status_t SurfaceTexture::setCrop(const Rect& crop) {
}
status_t SurfaceTexture::setTransform(uint32_t transform) {
- LOGV("SurfaceTexture::setTransform");
+ ST_LOGV("SurfaceTexture::setTransform");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setTransform: SurfaceTexture has been abandoned!");
+ ST_LOGE("setTransform: SurfaceTexture has been abandoned!");
return NO_INIT;
}
mNextTransform = transform;
@@ -558,11 +577,11 @@ status_t SurfaceTexture::setTransform(uint32_t transform) {
status_t SurfaceTexture::connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
- LOGV("SurfaceTexture::connect(this=%p, %d)", this, api);
+ ST_LOGV("SurfaceTexture::connect(this=%p, %d)", this, api);
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("connect: SurfaceTexture has been abandoned!");
+ ST_LOGE("connect: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -573,7 +592,7 @@ status_t SurfaceTexture::connect(int api,
case NATIVE_WINDOW_API_MEDIA:
case NATIVE_WINDOW_API_CAMERA:
if (mConnectedApi != NO_CONNECTED_API) {
- LOGE("connect: already connected (cur=%d, req=%d)",
+ ST_LOGE("connect: already connected (cur=%d, req=%d)",
mConnectedApi, api);
err = -EINVAL;
} else {
@@ -591,11 +610,11 @@ status_t SurfaceTexture::connect(int api,
}
status_t SurfaceTexture::disconnect(int api) {
- LOGV("SurfaceTexture::disconnect(this=%p, %d)", this, api);
+ ST_LOGV("SurfaceTexture::disconnect(this=%p, %d)", this, api);
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("connect: SurfaceTexture has been abandoned!");
+ ST_LOGE("disconnect: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -613,7 +632,7 @@ status_t SurfaceTexture::disconnect(int api) {
mNextTransform = 0;
mDequeueCondition.signal();
} else {
- LOGE("disconnect: connected to another api (cur=%d, req=%d)",
+ ST_LOGE("disconnect: connected to another api (cur=%d, req=%d)",
mConnectedApi, api);
err = -EINVAL;
}
@@ -626,7 +645,7 @@ status_t SurfaceTexture::disconnect(int api) {
}
status_t SurfaceTexture::setScalingMode(int mode) {
- LOGV("SurfaceTexture::setScalingMode(%d)", mode);
+ ST_LOGV("SurfaceTexture::setScalingMode(%d)", mode);
switch (mode) {
case NATIVE_WINDOW_SCALING_MODE_FREEZE:
@@ -642,11 +661,11 @@ status_t SurfaceTexture::setScalingMode(int mode) {
}
status_t SurfaceTexture::updateTexImage() {
- LOGV("SurfaceTexture::updateTexImage");
+ ST_LOGV("SurfaceTexture::updateTexImage");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("calling updateTexImage() on an abandoned SurfaceTexture");
+ ST_LOGE("calling updateTexImage() on an abandoned SurfaceTexture");
return NO_INIT;
}
@@ -661,7 +680,7 @@ status_t SurfaceTexture::updateTexImage() {
if (image == EGL_NO_IMAGE_KHR) {
EGLDisplay dpy = eglGetCurrentDisplay();
if (mSlots[buf].mGraphicBuffer == 0) {
- LOGE("buffer at slot %d is null", buf);
+ ST_LOGE("buffer at slot %d is null", buf);
return BAD_VALUE;
}
image = createImage(dpy, mSlots[buf].mGraphicBuffer);
@@ -676,15 +695,16 @@ status_t SurfaceTexture::updateTexImage() {
GLint error;
while ((error = glGetError()) != GL_NO_ERROR) {
- LOGW("updateTexImage: clearing GL error: %#04x", error);
+ ST_LOGW("updateTexImage: clearing GL error: %#04x", error);
}
glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexName);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)image);
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,
+ (GLeglImageOES)image);
bool failed = false;
while ((error = glGetError()) != GL_NO_ERROR) {
- LOGE("error binding external texture image %p (slot %d): %#04x",
+ ST_LOGE("error binding external texture image %p (slot %d): %#04x",
image, buf, error);
failed = true;
}
@@ -750,7 +770,7 @@ void SurfaceTexture::getTransformMatrix(float mtx[16]) {
}
void SurfaceTexture::computeCurrentTransformMatrix() {
- LOGV("SurfaceTexture::computeCurrentTransformMatrix");
+ ST_LOGV("SurfaceTexture::computeCurrentTransformMatrix");
float xform[16];
for (int i = 0; i < 16; i++) {
@@ -841,14 +861,14 @@ void SurfaceTexture::computeCurrentTransformMatrix() {
}
nsecs_t SurfaceTexture::getTimestamp() {
- LOGV("SurfaceTexture::getTimestamp");
+ ST_LOGV("SurfaceTexture::getTimestamp");
Mutex::Autolock lock(mMutex);
return mCurrentTimestamp;
}
void SurfaceTexture::setFrameAvailableListener(
const sp<FrameAvailableListener>& listener) {
- LOGV("SurfaceTexture::setFrameAvailableListener");
+ ST_LOGV("SurfaceTexture::setFrameAvailableListener");
Mutex::Autolock lock(mMutex);
mFrameAvailableListener = listener;
}
@@ -892,11 +912,11 @@ status_t SurfaceTexture::drainQueueLocked() {
while (mSynchronousMode && !mQueue.isEmpty()) {
mDequeueCondition.wait(mMutex);
if (mAbandoned) {
- LOGE("drainQueueLocked: SurfaceTexture has been abandoned!");
+ ST_LOGE("drainQueueLocked: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (mConnectedApi == NO_CONNECTED_API) {
- LOGE("drainQueueLocked: SurfaceTexture is not connected!");
+ ST_LOGE("drainQueueLocked: SurfaceTexture is not connected!");
return NO_INIT;
}
}
@@ -926,7 +946,7 @@ EGLImageKHR SurfaceTexture::createImage(EGLDisplay dpy,
EGL_NATIVE_BUFFER_ANDROID, cbuf, attrs);
if (image == EGL_NO_IMAGE_KHR) {
EGLint error = eglGetError();
- LOGE("error creating EGLImage: %#x", error);
+ ST_LOGE("error creating EGLImage: %#x", error);
}
return image;
}
@@ -956,7 +976,7 @@ int SurfaceTexture::query(int what, int* outValue)
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("query: SurfaceTexture has been abandoned!");
+ ST_LOGE("query: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -991,6 +1011,10 @@ void SurfaceTexture::abandon() {
mDequeueCondition.signal();
}
+void SurfaceTexture::setName(const String8& name) {
+ mName = name;
+}
+
void SurfaceTexture::dump(String8& result) const
{
char buffer[1024];
@@ -1004,8 +1028,8 @@ void SurfaceTexture::dump(String8& result, const char* prefix,
snprintf(buffer, SIZE,
"%smBufferCount=%d, mSynchronousMode=%d, default-size=[%dx%d], "
"mPixelFormat=%d, mTexName=%d\n",
- prefix, mBufferCount, mSynchronousMode, mDefaultWidth, mDefaultHeight,
- mPixelFormat, mTexName);
+ prefix, mBufferCount, mSynchronousMode, mDefaultWidth,
+ mDefaultHeight, mPixelFormat, mTexName);
result.append(buffer);
String8 fifo;
@@ -1024,8 +1048,8 @@ void SurfaceTexture::dump(String8& result, const char* prefix,
prefix, mCurrentCrop.left,
mCurrentCrop.top, mCurrentCrop.right, mCurrentCrop.bottom,
mCurrentTransform, mCurrentTexture,
- prefix, mNextCrop.left, mNextCrop.top, mNextCrop.right, mNextCrop.bottom,
- mNextTransform, fifoSize, fifo.string()
+ prefix, mNextCrop.left, mNextCrop.top, mNextCrop.right,
+ mNextCrop.bottom, mNextTransform, fifoSize, fifo.string()
);
result.append(buffer);
@@ -1048,8 +1072,8 @@ void SurfaceTexture::dump(String8& result, const char* prefix,
"transform=0x%02x, timestamp=%lld",
prefix, (i==mCurrentTexture)?">":" ", i,
stateName(slot.mBufferState),
- slot.mCrop.left, slot.mCrop.top, slot.mCrop.right, slot.mCrop.bottom,
- slot.mTransform, slot.mTimestamp
+ slot.mCrop.left, slot.mCrop.top, slot.mCrop.right,
+ slot.mCrop.bottom, slot.mTransform, slot.mTimestamp
);
result.append(buffer);
@@ -1057,7 +1081,8 @@ void SurfaceTexture::dump(String8& result, const char* prefix,
if (buf != NULL) {
snprintf(buffer, SIZE,
", %p [%4ux%4u:%4u,%3X]",
- buf->handle, buf->width, buf->height, buf->stride, buf->format);
+ buf->handle, buf->width, buf->height, buf->stride,
+ buf->format);
result.append(buffer);
}
result.append("\n");
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index a3986733a64e..349b9e32268d 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -31,20 +31,16 @@ namespace uirenderer {
// Rendering
///////////////////////////////////////////////////////////////////////////////
-Rect* gHackDontCorruptRegisters;
-
void LayerRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) {
LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->getFbo());
- Rect dirty(left, top, right, bottom);
- gHackDontCorruptRegisters = &dirty;
-
glBindFramebuffer(GL_FRAMEBUFFER, mLayer->getFbo());
const float width = mLayer->layer.getWidth();
const float height = mLayer->layer.getHeight();
#if RENDER_LAYERS_AS_REGIONS
+ Rect dirty(left, top, right, bottom);
if (dirty.isEmpty() || (dirty.left <= 0 && dirty.top <= 0 &&
dirty.right >= width && dirty.bottom >= height)) {
mLayer->region.clear();
diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h
index 71951b7a3cc8..edc90e1f052f 100644
--- a/libs/hwui/Rect.h
+++ b/libs/hwui/Rect.h
@@ -28,7 +28,19 @@ namespace uirenderer {
// Structs
///////////////////////////////////////////////////////////////////////////////
-struct Rect {
+class Rect {
+ static inline float min(float a, float b) { return (a<b) ? a : b; }
+ static inline float max(float a, float b) { return (a>b) ? a : b; }
+ Rect intersectWith(float l, float t, float r, float b) const {
+ Rect tmp;
+ tmp.left = max(left, l);
+ tmp.top = max(top, t);
+ tmp.right = min(right, r);
+ tmp.bottom = min(bottom, b);
+ return tmp;
+ }
+
+public:
float left;
float top;
float right;
@@ -37,6 +49,9 @@ struct Rect {
// Used by Region
typedef float value_type;
+ // we don't provide copy-ctor and operator= on purpose
+ // because we want the compiler generated versions
+
inline Rect():
left(0),
top(0),
@@ -58,24 +73,6 @@ struct Rect {
bottom(height) {
}
- inline Rect(const Rect& r) {
- set(r);
- }
-
- inline Rect(Rect& r) {
- set(r);
- }
-
- Rect& operator=(const Rect& r) {
- set(r);
- return *this;
- }
-
- Rect& operator=(Rect& r) {
- set(r);
- return *this;
- }
-
friend int operator==(const Rect& a, const Rect& b) {
return !memcmp(&a, &b, sizeof(a));
}
@@ -89,7 +86,9 @@ struct Rect {
}
inline bool isEmpty() const {
- return left >= right || top >= bottom;
+ // this is written in such way this it'll handle NANs to return
+ // true (empty)
+ return !((left < right) && (top < bottom));
}
inline void setEmpty() {
@@ -115,27 +114,18 @@ struct Rect {
return bottom - top;
}
- bool intersects(float left, float top, float right, float bottom) const {
- return left < right && top < bottom &&
- this->left < this->right && this->top < this->bottom &&
- this->left < right && left < this->right &&
- this->top < bottom && top < this->bottom;
+ bool intersects(float l, float t, float r, float b) const {
+ return !intersectWith(l,t,r,b).isEmpty();
}
bool intersects(const Rect& r) const {
return intersects(r.left, r.top, r.right, r.bottom);
}
- bool intersect(float left, float top, float right, float bottom) {
- if (left < right && top < bottom && !this->isEmpty() &&
- this->left < right && left < this->right &&
- this->top < bottom && top < this->bottom) {
-
- if (this->left < left) this->left = left;
- if (this->top < top) this->top = top;
- if (this->right > right) this->right = right;
- if (this->bottom > bottom) this->bottom = bottom;
-
+ bool intersect(float l, float t, float r, float b) {
+ Rect tmp(intersectWith(l,t,r,b));
+ if (!tmp.isEmpty()) {
+ set(tmp);
return true;
}
return false;
@@ -182,7 +172,7 @@ struct Rect {
LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
}
-}; // struct Rect
+}; // class Rect
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/TextDropShadowCache.h b/libs/hwui/TextDropShadowCache.h
index 28dba13dec35..e2bdde1eca89 100644
--- a/libs/hwui/TextDropShadowCache.h
+++ b/libs/hwui/TextDropShadowCache.h
@@ -81,7 +81,7 @@ struct ShadowText {
LTE_INT(flags) {
LTE_INT(italicStyle) {
LTE_INT(scaleX) {
- return strncmp16(text, rhs.text, len >> 1) < 0;
+ return memcmp(text, rhs.text, len) < 0;
}
}
}
diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp
index a38fff778011..f8107d9ff633 100644
--- a/libs/rs/driver/rsdCore.cpp
+++ b/libs/rs/driver/rsdCore.cpp
@@ -219,7 +219,7 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
int cpu = sysconf(_SC_NPROCESSORS_ONLN);
- LOGV("RS Launching thread(s), reported CPU count %i", cpu);
+ LOGV("%p Launching thread(s), CPUs %i", rsc, cpu);
if (cpu < 2) cpu = 0;
dc->mWorkers.mCount = (uint32_t)cpu;
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
index c5b81db6c56a..98d9486a36bd 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -129,11 +129,8 @@ void rsdGLShutdown(const Context *rsc) {
dc->gl.shaderCache->cleanupAll();
delete dc->gl.shaderCache;
-
delete dc->gl.vertexArrayState;
- LOGV("%p, deinitEGL", rsc);
-
if (dc->gl.egl.context != EGL_NO_CONTEXT) {
RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@@ -363,7 +360,7 @@ bool rsdGLInit(const Context *rsc) {
dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs);
dc->gl.currentFrameBuffer = NULL;
- LOGV("initGLThread end %p", rsc);
+ LOGV("%p initGLThread end", rsc);
rsc->setWatchdogGL(NULL, 0, NULL);
return true;
}
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index f27758249a5d..20b1f52104da 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -329,10 +329,7 @@ ProgramStoreCreate {
ProgramRasterCreate {
direct
- param bool pointSmooth
- param bool lineSmooth
param bool pointSprite
- param float lineWidth
param RsCullMode cull
ret RsProgramRaster
}
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 948d51c77a36..53d497004fc6 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -37,11 +37,10 @@ pthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER;
bool Context::initGLThread() {
pthread_mutex_lock(&gInitMutex);
- LOGV("initGLThread start %p", this);
if (!mHal.funcs.initGraphics(this)) {
pthread_mutex_unlock(&gInitMutex);
- LOGE("%p, initGraphics failed", this);
+ LOGE("%p initGraphics failed", this);
return false;
}
@@ -50,7 +49,6 @@ bool Context::initGLThread() {
}
void Context::deinitEGL() {
- LOGV("%p, deinitEGL", this);
mHal.funcs.shutdownGraphics(this);
}
@@ -284,7 +282,7 @@ void * Context::threadProc(void *vrsc) {
}
}
- LOGV("%p, RS Thread exiting", rsc);
+ LOGV("%p RS Thread exiting", rsc);
if (rsc->mIsGraphicsContext) {
pthread_mutex_lock(&gInitMutex);
@@ -292,7 +290,7 @@ void * Context::threadProc(void *vrsc) {
pthread_mutex_unlock(&gInitMutex);
}
- LOGV("%p, RS Thread exited", rsc);
+ LOGV("%p RS Thread exited", rsc);
return NULL;
}
@@ -426,7 +424,7 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
}
Context::~Context() {
- LOGV("Context::~Context");
+ LOGV("%p Context::~Context", this);
if (!mIsContextLite) {
mIO.coreFlush();
@@ -450,7 +448,7 @@ Context::~Context() {
}
pthread_mutex_unlock(&gInitMutex);
}
- LOGV("Context::~Context done");
+ LOGV("%p Context::~Context done", this);
}
void Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) {
@@ -667,10 +665,10 @@ void rsi_ContextDestroyWorker(Context *rsc) {
}
void rsi_ContextDestroy(Context *rsc) {
- LOGV("rsContextDestroy %p", rsc);
+ LOGV("%p rsContextDestroy", rsc);
rsContextDestroyWorker(rsc);
delete rsc;
- LOGV("rsContextDestroy 2 %p", rsc);
+ LOGV("%p rsContextDestroy done", rsc);
}
@@ -701,7 +699,7 @@ void rsi_ContextDeinitToClient(Context *rsc) {
RsContext rsContextCreate(RsDevice vdev, uint32_t version,
uint32_t sdkVersion) {
- LOGV("rsContextCreate %p", vdev);
+ LOGV("rsContextCreate dev=%p", vdev);
Device * dev = static_cast<Device *>(vdev);
Context *rsc = Context::createContext(dev, NULL);
if (rsc) {
@@ -713,14 +711,14 @@ RsContext rsContextCreate(RsDevice vdev, uint32_t version,
RsContext rsContextCreateGL(RsDevice vdev, uint32_t version,
uint32_t sdkVersion, RsSurfaceConfig sc,
uint32_t dpi) {
- LOGV("rsContextCreateGL %p", vdev);
+ LOGV("rsContextCreateGL dev=%p", vdev);
Device * dev = static_cast<Device *>(vdev);
Context *rsc = Context::createContext(dev, &sc);
if (rsc) {
rsc->setTargetSdkVersion(sdkVersion);
rsc->setDPI(dpi);
}
- LOGV("rsContextCreateGL ret %p ", rsc);
+ LOGV("%p rsContextCreateGL ret", rsc);
return rsc;
}
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
index 945b5eca68fd..94bfe4275abe 100644
--- a/libs/rs/rsProgramRaster.cpp
+++ b/libs/rs/rsProgramRaster.cpp
@@ -21,19 +21,12 @@ using namespace android;
using namespace android::renderscript;
-ProgramRaster::ProgramRaster(Context *rsc, bool pointSmooth,
- bool lineSmooth, bool pointSprite,
- float lineWidth, RsCullMode cull)
+ProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull)
: ProgramBase(rsc) {
memset(&mHal, 0, sizeof(mHal));
-
- mHal.state.pointSmooth = pointSmooth;
- mHal.state.lineSmooth = lineSmooth;
mHal.state.pointSprite = pointSprite;
- mHal.state.lineWidth = lineWidth;
mHal.state.cull = cull;
-
rsc->mHal.funcs.raster.init(rsc, this);
}
@@ -74,8 +67,7 @@ ProgramRasterState::~ProgramRasterState() {
}
void ProgramRasterState::init(Context *rsc) {
- mDefault.set(ProgramRaster::getProgramRaster(rsc, false, false,
- false, 1.f, RS_CULL_BACK).get());
+ mDefault.set(ProgramRaster::getProgramRaster(rsc, false, RS_CULL_BACK).get());
}
void ProgramRasterState::deinit(Context *rsc) {
@@ -84,19 +76,13 @@ void ProgramRasterState::deinit(Context *rsc) {
}
ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull) {
ObjectBaseRef<ProgramRaster> returnRef;
ObjectBase::asyncLock();
for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) {
ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct];
- if (existing->mHal.state.pointSmooth != pointSmooth) continue;
- if (existing->mHal.state.lineSmooth != lineSmooth) continue;
if (existing->mHal.state.pointSprite != pointSprite) continue;
- if (existing->mHal.state.lineWidth != lineWidth) continue;
if (existing->mHal.state.cull != cull) continue;
returnRef.set(existing);
ObjectBase::asyncUnlock();
@@ -104,8 +90,7 @@ ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
}
ObjectBase::asyncUnlock();
- ProgramRaster *pr = new ProgramRaster(rsc, pointSmooth,
- lineSmooth, pointSprite, lineWidth, cull);
+ ProgramRaster *pr = new ProgramRaster(rsc, pointSprite, cull);
returnRef.set(pr);
ObjectBase::asyncLock();
@@ -118,10 +103,8 @@ ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
namespace android {
namespace renderscript {
-RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSmooth, bool lineSmooth,
- bool pointSprite, float lineWidth, RsCullMode cull) {
- ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSmooth, lineSmooth,
- pointSprite, lineWidth, cull);
+RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) {
+ ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull);
pr->incUserRef();
return pr.get();
}
diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h
index 09d7d5432c9a..20af30a1b90b 100644
--- a/libs/rs/rsProgramRaster.h
+++ b/libs/rs/rsProgramRaster.h
@@ -33,19 +33,13 @@ public:
static ProgramRaster *createFromStream(Context *rsc, IStream *stream);
static ObjectBaseRef<ProgramRaster> getProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull);
struct Hal {
mutable void *drv;
struct State {
- bool pointSmooth;
- bool lineSmooth;
bool pointSprite;
- float lineWidth;
RsCullMode cull;
};
State state;
@@ -58,10 +52,7 @@ protected:
private:
ProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull);
};
diff --git a/libs/utils/Android.mk b/libs/utils/Android.mk
index e4eadbd0046d..638f72f0b66a 100644
--- a/libs/utils/Android.mk
+++ b/libs/utils/Android.mk
@@ -100,12 +100,8 @@ LOCAL_LDLIBS += -lpthread
LOCAL_SHARED_LIBRARIES := \
libz \
liblog \
- libcutils
-
-ifeq ($(TARGET_OS)-$(TARGET_ARCH),linux-x86)
-# This is needed on x86 to bring in dl_iterate_phdr for CallStack.cpp
-LOCAL_SHARED_LIBRARIES += libdl
-endif # linux-x86
+ libcutils \
+ libdl
LOCAL_MODULE:= libutils
include $(BUILD_SHARED_LIBRARY)
diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp
index 02c380b0e5de..5dbcb75b0616 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -368,6 +368,14 @@ int androidSetThreadPriority(pid_t tid, int pri)
return rc;
}
+int androidGetThreadPriority(pid_t tid) {
+#if defined(HAVE_PTHREADS)
+ return getpriority(PRIO_PROCESS, tid);
+#else
+ return ANDROID_PRIORITY_NORMAL;
+#endif
+}
+
int androidGetThreadSchedulingGroup(pid_t tid)
{
int ret = ANDROID_TGROUP_DEFAULT;
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 8895c9e7348c..4f4f9297e614 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -2958,7 +2958,7 @@ public class AudioService extends IAudioService.Stub {
Log.w(TAG, " RemoteControlClient died");
// remote control client died, make sure the displays don't use it anymore
// by setting its remote control client to null
- registerRemoteControlClient(mMediaIntent, null, null/*ignored*/);
+ registerRemoteControlClient(mMediaIntent, null/*rcClient*/, null/*ignored*/);
}
public IBinder getBinder() {
@@ -3366,7 +3366,12 @@ public class AudioService extends IAudioService.Stub {
}
}
- /** see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...) */
+ /**
+ * see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...)
+ * Note: using this method with rcClient == null is a way to "disable" the IRemoteControlClient
+ * without modifying the RC stack, but while still causing the display to refresh (will
+ * become blank as a result of this)
+ */
public void registerRemoteControlClient(PendingIntent mediaIntent,
IRemoteControlClient rcClient, String callingPackageName) {
if (DEBUG_RC) Log.i(TAG, "Register remote control client rcClient="+rcClient);
@@ -3384,6 +3389,15 @@ public class AudioService extends IAudioService.Stub {
}
// save the new remote control client
rcse.mRcClient = rcClient;
+ rcse.mCallingPackageName = callingPackageName;
+ rcse.mCallingUid = Binder.getCallingUid();
+ if (rcClient == null) {
+ rcse.mRcClientDeathHandler = null;
+ break;
+ }
+
+ // there is a new (non-null) client:
+ // 1/ give the new client the current display (if any)
if (mRcDisplay != null) {
try {
rcse.mRcClient.plugRemoteControlDisplay(mRcDisplay);
@@ -3392,14 +3406,8 @@ public class AudioService extends IAudioService.Stub {
e.printStackTrace();
}
}
- rcse.mCallingPackageName = callingPackageName;
- rcse.mCallingUid = Binder.getCallingUid();
- if (rcClient == null) {
- rcse.mRcClientDeathHandler = null;
- break;
- }
- // monitor the new client's death
- IBinder b = rcClient.asBinder();
+ // 2/ monitor the new client's death
+ IBinder b = rcse.mRcClient.asBinder();
RcClientDeathHandler rcdh =
new RcClientDeathHandler(b, rcse.mMediaIntent);
try {
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 65818a1b50cc..2d927ad9c583 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -314,14 +314,14 @@ public class MediaScanner
// WARNING: Bulk inserts sounded like a great idea and gave us a good performance improvement,
// but unfortunately it also introduced a number of bugs. Many of those bugs were fixed,
- // but (at least) two problems are still outstanding:
+ // but (at least) one problem is still outstanding:
//
- // 1) Bulk inserts broke the code that sets the default ringtones on first boot
- // 2) Bulk inserts broke file based playlists in the case where the playlist is processed
- // at the same time the files in the playlist are inserted in the database
+ // - Bulk inserts broke the code that sets the default ringtones, notifications, and alarms
+ // on first boot
//
- // These problems might be solvable by moving the logic to the media provider instead,
- // but for now we are disabling bulk inserts until we have solid fixes for these problems.
+ // This problem might be solvable by moving the logic to the media provider or disabling bulk
+ // inserts only for those cases. For now, we are disabling bulk inserts until we have a solid
+ // fix for this problem.
private static final boolean ENABLE_BULK_INSERTS = false;
// used when scanning the image database so we know whether we have to prune
@@ -470,6 +470,8 @@ public class MediaScanner
private int mCompilation;
private boolean mIsDrm;
private boolean mNoMedia; // flag to suppress file from appearing in media tables
+ private int mWidth;
+ private int mHeight;
public FileCacheEntry beginFile(String path, String mimeType, long lastModified,
long fileSize, boolean isDirectory, boolean noMedia) {
@@ -545,6 +547,8 @@ public class MediaScanner
mWriter = null;
mCompilation = 0;
mIsDrm = false;
+ mWidth = 0;
+ mHeight = 0;
return entry;
}
@@ -583,6 +587,10 @@ public class MediaScanner
processFile(path, mimeType, this);
}
+ if (MediaFile.isImageFileType(mFileType)) {
+ processImageFile(path);
+ }
+
result = endFile(entry, ringtones, notifications, alarms, music, podcasts);
}
}
@@ -697,6 +705,18 @@ public class MediaScanner
return genreTagValue;
}
+ private void processImageFile(String path) {
+ try {
+ mBitmapOptions.outWidth = 0;
+ mBitmapOptions.outHeight = 0;
+ BitmapFactory.decodeFile(path, mBitmapOptions);
+ mWidth = mBitmapOptions.outWidth;
+ mHeight = mBitmapOptions.outHeight;
+ } catch (Throwable th) {
+ // ignore;
+ }
+ }
+
public void setMimeType(String mimeType) {
if ("audio/mp4".equals(mMimeType) &&
mimeType.startsWith("video")) {
@@ -725,6 +745,11 @@ public class MediaScanner
map.put(MediaStore.MediaColumns.MIME_TYPE, mMimeType);
map.put(MediaStore.MediaColumns.IS_DRM, mIsDrm);
+ if (mWidth > 0 && mHeight > 0) {
+ map.put(MediaStore.MediaColumns.WIDTH, mWidth);
+ map.put(MediaStore.MediaColumns.HEIGHT, mHeight);
+ }
+
if (!mNoMedia) {
if (MediaFile.isVideoFileType(mFileType)) {
map.put(Video.Media.ARTIST, (mArtist != null && mArtist.length() > 0
@@ -1439,7 +1464,22 @@ public class MediaScanner
}
try {
- // OK, now we need to add this to the database
+ // check rowid is set. Rowid may be missing if it is inserted by bulkInsert().
+ if (bestMatch.mRowId == 0) {
+ Cursor c = mMediaProvider.query(mAudioUri, ID_PROJECTION,
+ MediaStore.Files.FileColumns.DATA + "=?",
+ new String[] { bestMatch.mPath }, null);
+ if (c != null) {
+ if (c.moveToNext()) {
+ bestMatch.mRowId = c.getLong(0);
+ }
+ c.close();
+ }
+ if (bestMatch.mRowId == 0) {
+ return false;
+ }
+ }
+ // OK, now we are ready to add this to the database
values.clear();
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(index));
values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, Long.valueOf(bestMatch.mRowId));
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index 0ce35269bf39..8bb52332f82d 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -166,6 +166,9 @@ public class Ringtone {
}
private void openMediaPlayer() throws IOException {
+ if (mAudio != null) {
+ mAudio.release();
+ }
mAudio = new MediaPlayer();
if (mUri != null) {
mAudio.setDataSource(mContext, mUri);
@@ -203,7 +206,22 @@ public class Ringtone {
mUri = uri;
openMediaPlayer();
}
-
+
+ /** @hide */
+ public void setWakeMode(Context context, int mode) {
+ if (mAudio == null) {
+ try {
+ openMediaPlayer();
+ } catch (Exception ex) {
+ Log.e(TAG, "setWakeMode() caught ", ex);
+ mAudio = null;
+ }
+ }
+ if (mAudio != null) {
+ mAudio.setWakeMode(context, mode);
+ }
+ }
+
/**
* Plays the ringtone.
*/
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index c270f21a7b25..f3174fef2666 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -651,6 +651,10 @@ static void
android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
{
LOGV("native_finalize");
+ sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
+ if (mp != NULL) {
+ LOGW("MediaPlayer finalized without being released");
+ }
android_media_MediaPlayer_release(env, thiz);
}
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0386d4b65987..b5eef94a4c00 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -52,6 +52,7 @@
#include <media/Metadata.h>
#include <media/AudioTrack.h>
#include <media/MemoryLeakTrackUtil.h>
+#include <media/stagefright/MediaErrors.h>
#include <system/audio.h>
@@ -1132,7 +1133,11 @@ sp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, i
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();
@@ -1175,7 +1180,11 @@ sp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, u
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
index 605d056f3504..079f6fa01952 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
@@ -41,7 +41,7 @@ NuPlayer::HTTPLiveSource::HTTPLiveSource(
mUIDValid(uidValid),
mUID(uid),
mFlags(0),
- mEOS(false),
+ mFinalResult(OK),
mOffset(0) {
if (headers) {
mExtraHeaders = *headers;
@@ -95,9 +95,9 @@ sp<MetaData> NuPlayer::HTTPLiveSource::getFormat(bool audio) {
return source->getFormat();
}
-bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
- if (mEOS) {
- return false;
+status_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
+ if (mFinalResult != OK) {
+ return mFinalResult;
}
sp<LiveDataSource> source =
@@ -110,9 +110,13 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
if (n == -EWOULDBLOCK) {
break;
} else if (n < 0) {
- LOGI("input data EOS reached.");
+ if (n != ERROR_END_OF_STREAM) {
+ LOGI("input data EOS reached, error %ld", n);
+ } else {
+ LOGI("input data EOS reached.");
+ }
mTSParser->signalEOS(n);
- mEOS = true;
+ mFinalResult = n;
break;
} else {
if (buffer[0] == 0x00) {
@@ -129,7 +133,7 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
if (err != OK) {
LOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
- mEOS = true;
+ mFinalResult = err;
break;
}
}
@@ -138,7 +142,7 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
}
}
- return true;
+ return OK;
}
status_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
@@ -168,7 +172,7 @@ status_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) {
status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
// We need to make sure we're not seeking until we have seen the very first
// PTS timestamp in the whole stream (from the beginning of the stream).
- while (!mTSParser->PTSTimeDeltaEstablished() && feedMoreTSData()) {
+ while (!mTSParser->PTSTimeDeltaEstablished() && feedMoreTSData() == OK) {
usleep(100000);
}
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
index 36c67c501b38..f22af5bee607 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
@@ -35,8 +35,7 @@ struct NuPlayer::HTTPLiveSource : public NuPlayer::Source {
virtual void start();
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData();
+ virtual status_t feedMoreTSData();
virtual sp<MetaData> getFormat(bool audio);
virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
@@ -59,7 +58,7 @@ private:
bool mUIDValid;
uid_t mUID;
uint32_t mFlags;
- bool mEOS;
+ status_t mFinalResult;
off64_t mOffset;
sp<ALooper> mLiveLooper;
sp<LiveSession> mLiveSession;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index ee77f474b237..6b40528a160f 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -34,17 +34,21 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/ACodec.h>
+#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
#include <surfaceflinger/Surface.h>
#include <gui/ISurfaceTexture.h>
+#include "avc_utils.h"
+
namespace android {
////////////////////////////////////////////////////////////////////////////////
NuPlayer::NuPlayer()
: mUIDValid(false),
+ mVideoIsAVC(false),
mAudioEOS(false),
mVideoEOS(false),
mScanSourcesPending(false),
@@ -52,7 +56,12 @@ NuPlayer::NuPlayer()
mFlushingAudio(NONE),
mFlushingVideo(NONE),
mResetInProgress(false),
- mResetPostponed(false) {
+ mResetPostponed(false),
+ mSkipRenderingAudioUntilMediaTimeUs(-1ll),
+ mSkipRenderingVideoUntilMediaTimeUs(-1ll),
+ mVideoLateByUs(0ll),
+ mNumFramesTotal(0ll),
+ mNumFramesDropped(0ll) {
}
NuPlayer::~NuPlayer() {
@@ -185,10 +194,14 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
{
LOGV("kWhatStart");
+ mVideoIsAVC = false;
mAudioEOS = false;
mVideoEOS = false;
mSkipRenderingAudioUntilMediaTimeUs = -1;
mSkipRenderingVideoUntilMediaTimeUs = -1;
+ mVideoLateByUs = 0;
+ mNumFramesTotal = 0;
+ mNumFramesDropped = 0;
mSource->start();
@@ -222,11 +235,17 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
instantiateDecoder(true, &mAudioDecoder);
}
- if (!mSource->feedMoreTSData()) {
+ status_t err;
+ if ((err = mSource->feedMoreTSData()) != OK) {
if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
// We're not currently decoding anything (no audio or
// video tracks found) and we just ran out of input data.
- notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
+
+ if (err == ERROR_END_OF_STREAM) {
+ notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
+ } else {
+ notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
+ }
}
break;
}
@@ -254,12 +273,23 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
audio, codecRequest);
if (err == -EWOULDBLOCK) {
- if (mSource->feedMoreTSData()) {
+ if (mSource->feedMoreTSData() == OK) {
msg->post();
}
}
} else if (what == ACodec::kWhatEOS) {
- mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
+ int32_t err;
+ CHECK(codecRequest->findInt32("err", &err));
+
+ if (err == ERROR_END_OF_STREAM) {
+ LOGV("got %s decoder EOS", audio ? "audio" : "video");
+ } else {
+ LOGV("got %s decoder EOS w/ error %d",
+ audio ? "audio" : "video",
+ err);
+ }
+
+ mRenderer->queueEOS(audio, err);
} else if (what == ACodec::kWhatFlushCompleted) {
bool needShutdown;
@@ -269,6 +299,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
} else {
CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
mFlushingVideo = FLUSHED;
+
+ mVideoLateByUs = 0;
}
LOGV("decoder %s flush completed", audio ? "audio" : "video");
@@ -299,7 +331,12 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
sampleRate, numChannels);
mAudioSink->close();
- CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
+ CHECK_EQ(mAudioSink->open(
+ sampleRate,
+ numChannels,
+ AUDIO_FORMAT_PCM_16_BIT,
+ 8 /* bufferCount */),
+ (status_t)OK);
mAudioSink->start();
mRenderer->signalAudioSinkChanged();
@@ -377,7 +414,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
if (finalResult == ERROR_END_OF_STREAM) {
LOGV("reached %s EOS", audio ? "audio" : "video");
} else {
- LOGE("%s track encountered an error (0x%08x)",
+ LOGE("%s track encountered an error (%d)",
audio ? "audio" : "video", finalResult);
notifyListener(
@@ -392,13 +429,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
int64_t positionUs;
CHECK(msg->findInt64("positionUs", &positionUs));
+ CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
+
if (mDriver != NULL) {
sp<NuPlayerDriver> driver = mDriver.promote();
if (driver != NULL) {
driver->notifyPosition(positionUs);
+
+ driver->notifyFrameStats(
+ mNumFramesTotal, mNumFramesDropped);
}
}
- } else {
+ } else if (what == Renderer::kWhatFlushComplete) {
CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
int32_t audio;
@@ -560,6 +602,12 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
return -EWOULDBLOCK;
}
+ if (!audio) {
+ const char *mime;
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
+ mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
+ }
+
sp<AMessage> notify =
new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
id());
@@ -593,53 +641,70 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
}
sp<ABuffer> accessUnit;
- status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
- if (err == -EWOULDBLOCK) {
- return err;
- } else if (err != OK) {
- if (err == INFO_DISCONTINUITY) {
- int32_t type;
- CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
+ bool dropAccessUnit;
+ do {
+ status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
- bool formatChange =
- type == ATSParser::DISCONTINUITY_FORMATCHANGE;
+ if (err == -EWOULDBLOCK) {
+ return err;
+ } else if (err != OK) {
+ if (err == INFO_DISCONTINUITY) {
+ int32_t type;
+ CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
- LOGV("%s discontinuity (formatChange=%d)",
- audio ? "audio" : "video", formatChange);
+ bool formatChange =
+ type == ATSParser::DISCONTINUITY_FORMATCHANGE;
- if (audio) {
- mSkipRenderingAudioUntilMediaTimeUs = -1;
- } else {
- mSkipRenderingVideoUntilMediaTimeUs = -1;
- }
+ LOGV("%s discontinuity (formatChange=%d)",
+ audio ? "audio" : "video", formatChange);
- sp<AMessage> extra;
- if (accessUnit->meta()->findMessage("extra", &extra)
- && extra != NULL) {
- int64_t resumeAtMediaTimeUs;
- if (extra->findInt64(
- "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
- LOGI("suppressing rendering of %s until %lld us",
- audio ? "audio" : "video", resumeAtMediaTimeUs);
+ if (audio) {
+ mSkipRenderingAudioUntilMediaTimeUs = -1;
+ } else {
+ mSkipRenderingVideoUntilMediaTimeUs = -1;
+ }
- if (audio) {
- mSkipRenderingAudioUntilMediaTimeUs =
- resumeAtMediaTimeUs;
- } else {
- mSkipRenderingVideoUntilMediaTimeUs =
- resumeAtMediaTimeUs;
+ sp<AMessage> extra;
+ if (accessUnit->meta()->findMessage("extra", &extra)
+ && extra != NULL) {
+ int64_t resumeAtMediaTimeUs;
+ if (extra->findInt64(
+ "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
+ LOGI("suppressing rendering of %s until %lld us",
+ audio ? "audio" : "video", resumeAtMediaTimeUs);
+
+ if (audio) {
+ mSkipRenderingAudioUntilMediaTimeUs =
+ resumeAtMediaTimeUs;
+ } else {
+ mSkipRenderingVideoUntilMediaTimeUs =
+ resumeAtMediaTimeUs;
+ }
}
}
+
+ flushDecoder(audio, formatChange);
}
- flushDecoder(audio, formatChange);
+ reply->setInt32("err", err);
+ reply->post();
+ return OK;
}
- reply->setInt32("err", err);
- reply->post();
- return OK;
- }
+ if (!audio) {
+ ++mNumFramesTotal;
+ }
+
+ dropAccessUnit = false;
+ if (!audio
+ && mVideoLateByUs > 100000ll
+ && mVideoIsAVC
+ && !IsAVCReferenceFrame(accessUnit)) {
+ dropAccessUnit = true;
+ ++mNumFramesDropped;
+ }
+ } while (dropAccessUnit);
// LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h
index cf9185b814d9..a5382b498909 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h
@@ -70,19 +70,19 @@ private:
struct StreamingSource;
enum {
- kWhatSetDataSource,
- kWhatSetVideoNativeWindow,
- kWhatSetAudioSink,
- kWhatMoreDataQueued,
- kWhatStart,
- kWhatScanSources,
- kWhatVideoNotify,
- kWhatAudioNotify,
- kWhatRendererNotify,
- kWhatReset,
- kWhatSeek,
- kWhatPause,
- kWhatResume,
+ kWhatSetDataSource = '=DaS',
+ kWhatSetVideoNativeWindow = '=NaW',
+ kWhatSetAudioSink = '=AuS',
+ kWhatMoreDataQueued = 'more',
+ kWhatStart = 'strt',
+ kWhatScanSources = 'scan',
+ kWhatVideoNotify = 'vidN',
+ kWhatAudioNotify = 'audN',
+ kWhatRendererNotify = 'renN',
+ kWhatReset = 'rset',
+ kWhatSeek = 'seek',
+ kWhatPause = 'paus',
+ kWhatResume = 'rsme',
};
wp<NuPlayerDriver> mDriver;
@@ -92,6 +92,7 @@ private:
sp<NativeWindowWrapper> mNativeWindow;
sp<MediaPlayerBase::AudioSink> mAudioSink;
sp<Decoder> mVideoDecoder;
+ bool mVideoIsAVC;
sp<Decoder> mAudioDecoder;
sp<Renderer> mRenderer;
@@ -119,6 +120,9 @@ private:
int64_t mSkipRenderingAudioUntilMediaTimeUs;
int64_t mSkipRenderingVideoUntilMediaTimeUs;
+ int64_t mVideoLateByUs;
+ int64_t mNumFramesTotal, mNumFramesDropped;
+
status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index 81b41ef32cef..56c2773fa56b 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -59,8 +59,21 @@ void NuPlayer::Decoder::configure(const sp<MetaData> &meta) {
format->setObject("native-window", mNativeWindow);
}
+ // Current video decoders do not return from OMX_FillThisBuffer
+ // quickly, violating the OpenMAX specs, until that is remedied
+ // we need to invest in an extra looper to free the main event
+ // queue.
+ bool needDedicatedLooper = !strncasecmp(mime, "video/", 6);
+
mCodec = new ACodec;
- looper()->registerHandler(mCodec);
+
+ if (needDedicatedLooper && mCodecLooper == NULL) {
+ mCodecLooper = new ALooper;
+ mCodecLooper->setName("NuPlayerDecoder");
+ mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
+ }
+
+ (needDedicatedLooper ? mCodecLooper : looper())->registerHandler(mCodec);
mCodec->setNotificationMessage(notifyMsg);
mCodec->initiateSetup(format);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
index fabc606e69b8..3ab1fcf1765e 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
@@ -43,13 +43,14 @@ protected:
private:
enum {
- kWhatCodecNotify,
+ kWhatCodecNotify = 'cdcN',
};
sp<AMessage> mNotify;
sp<NativeWindowWrapper> mNativeWindow;
sp<ACodec> mCodec;
+ sp<ALooper> mCodecLooper;
Vector<sp<ABuffer> > mCSD;
size_t mCSDIndex;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index c6fca2c0aff0..b1e917d2abea 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -31,6 +31,8 @@ NuPlayerDriver::NuPlayerDriver()
: mResetInProgress(false),
mDurationUs(-1),
mPositionUs(-1),
+ mNumFramesTotal(0),
+ mNumFramesDropped(0),
mLooper(new ALooper),
mState(UNINITIALIZED),
mStartupSeekTimeUs(-1) {
@@ -292,4 +294,30 @@ void NuPlayerDriver::notifySeekComplete() {
sendEvent(MEDIA_SEEK_COMPLETE);
}
+void NuPlayerDriver::notifyFrameStats(
+ int64_t numFramesTotal, int64_t numFramesDropped) {
+ Mutex::Autolock autoLock(mLock);
+ mNumFramesTotal = numFramesTotal;
+ mNumFramesDropped = numFramesDropped;
+}
+
+status_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const {
+ Mutex::Autolock autoLock(mLock);
+
+ FILE *out = fdopen(dup(fd), "w");
+
+ fprintf(out, " NuPlayer\n");
+ fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), "
+ "percentageDropped(%.2f)\n",
+ mNumFramesTotal,
+ mNumFramesDropped,
+ mNumFramesTotal == 0
+ ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
+
+ fclose(out);
+ out = NULL;
+
+ return OK;
+}
+
} // namespace android
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
index 1bb7ca23f850..181c37dec4d6 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
@@ -60,16 +60,19 @@ struct NuPlayerDriver : public MediaPlayerInterface {
virtual status_t getMetadata(
const media::Metadata::Filter& ids, Parcel *records);
+ virtual status_t dump(int fd, const Vector<String16> &args) const;
+
void notifyResetComplete();
void notifyDuration(int64_t durationUs);
void notifyPosition(int64_t positionUs);
void notifySeekComplete();
+ void notifyFrameStats(int64_t numFramesTotal, int64_t numFramesDropped);
protected:
virtual ~NuPlayerDriver();
private:
- Mutex mLock;
+ mutable Mutex mLock;
Condition mCondition;
// The following are protected through "mLock"
@@ -77,6 +80,8 @@ private:
bool mResetInProgress;
int64_t mDurationUs;
int64_t mPositionUs;
+ int64_t mNumFramesTotal;
+ int64_t mNumFramesDropped;
// <<<
sp<ALooper> mLooper;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index bf838498695d..07e347ee1582 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -47,7 +47,8 @@ NuPlayer::Renderer::Renderer(
mHasVideo(false),
mSyncQueues(false),
mPaused(false),
- mLastPositionUpdateUs(-1ll) {
+ mLastPositionUpdateUs(-1ll),
+ mVideoLateByUs(0ll) {
}
NuPlayer::Renderer::~Renderer() {
@@ -118,9 +119,24 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
mDrainAudioQueuePending = false;
- onDrainAudioQueue();
+ if (onDrainAudioQueue()) {
+ uint32_t numFramesPlayed;
+ CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed),
+ (status_t)OK);
- postDrainAudioQueue();
+ uint32_t numFramesPendingPlayout =
+ mNumFramesWritten - numFramesPlayed;
+
+ // This is how long the audio sink will have data to
+ // play back.
+ int64_t delayUs =
+ mAudioSink->msecsPerFrame()
+ * numFramesPendingPlayout * 1000ll;
+
+ // Let's give it more data after about half that time
+ // has elapsed.
+ postDrainAudioQueue(delayUs / 2);
+ }
break;
}
@@ -182,7 +198,7 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
}
}
-void NuPlayer::Renderer::postDrainAudioQueue() {
+void NuPlayer::Renderer::postDrainAudioQueue(int64_t delayUs) {
if (mDrainAudioQueuePending || mSyncQueues || mPaused) {
return;
}
@@ -194,19 +210,33 @@ void NuPlayer::Renderer::postDrainAudioQueue() {
mDrainAudioQueuePending = true;
sp<AMessage> msg = new AMessage(kWhatDrainAudioQueue, id());
msg->setInt32("generation", mAudioQueueGeneration);
- msg->post();
+ msg->post(delayUs);
}
void NuPlayer::Renderer::signalAudioSinkChanged() {
(new AMessage(kWhatAudioSinkChanged, id()))->post();
}
-void NuPlayer::Renderer::onDrainAudioQueue() {
- for (;;) {
- if (mAudioQueue.empty()) {
- break;
- }
+bool NuPlayer::Renderer::onDrainAudioQueue() {
+ uint32_t numFramesPlayed;
+ CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
+
+ ssize_t numFramesAvailableToWrite =
+ mAudioSink->frameCount() - (mNumFramesWritten - numFramesPlayed);
+#if 0
+ if (numFramesAvailableToWrite == mAudioSink->frameCount()) {
+ LOGI("audio sink underrun");
+ } else {
+ LOGV("audio queue has %d frames left to play",
+ mAudioSink->frameCount() - numFramesAvailableToWrite);
+ }
+#endif
+
+ size_t numBytesAvailableToWrite =
+ numFramesAvailableToWrite * mAudioSink->frameSize();
+
+ while (numBytesAvailableToWrite > 0 && !mAudioQueue.empty()) {
QueueEntry *entry = &*mAudioQueue.begin();
if (entry->mBuffer == NULL) {
@@ -216,20 +246,7 @@ void NuPlayer::Renderer::onDrainAudioQueue() {
mAudioQueue.erase(mAudioQueue.begin());
entry = NULL;
- return;
- }
-
- uint32_t numFramesPlayed;
- CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
-
- ssize_t numFramesAvailableToWrite =
- mAudioSink->frameCount() - (mNumFramesWritten - numFramesPlayed);
-
- size_t numBytesAvailableToWrite =
- numFramesAvailableToWrite * mAudioSink->frameSize();
-
- if (numBytesAvailableToWrite == 0) {
- break;
+ return false;
}
if (entry->mOffset == 0) {
@@ -274,10 +291,14 @@ void NuPlayer::Renderer::onDrainAudioQueue() {
entry = NULL;
}
- mNumFramesWritten += copy / mAudioSink->frameSize();
+ numBytesAvailableToWrite -= copy;
+ size_t copiedFrames = copy / mAudioSink->frameSize();
+ mNumFramesWritten += copiedFrames;
}
notifyPosition();
+
+ return !mAudioQueue.empty();
}
void NuPlayer::Renderer::postDrainVideoQueue() {
@@ -337,15 +358,26 @@ void NuPlayer::Renderer::onDrainVideoQueue() {
mVideoQueue.erase(mVideoQueue.begin());
entry = NULL;
+
+ mVideoLateByUs = 0ll;
+
+ notifyPosition();
return;
}
-#if 0
int64_t mediaTimeUs;
CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));
- LOGI("rendering video at media time %.2f secs", mediaTimeUs / 1E6);
-#endif
+ int64_t realTimeUs = mediaTimeUs - mAnchorTimeMediaUs + mAnchorTimeRealUs;
+ mVideoLateByUs = ALooper::GetNowUs() - realTimeUs;
+
+ bool tooLate = (mVideoLateByUs > 40000);
+
+ if (tooLate) {
+ LOGV("video late by %lld us (%.2f secs)", lateByUs, lateByUs / 1E6);
+ } else {
+ LOGV("rendering video at media time %.2f secs", mediaTimeUs / 1E6);
+ }
entry->mNotifyConsumed->setInt32("render", true);
entry->mNotifyConsumed->post();
@@ -577,6 +609,7 @@ void NuPlayer::Renderer::notifyPosition() {
sp<AMessage> notify = mNotify->dup();
notify->setInt32("what", kWhatPosition);
notify->setInt64("positionUs", positionUs);
+ notify->setInt64("videoLateByUs", mVideoLateByUs);
notify->post();
}
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
index 3a641a22042d..268628bd8c61 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
@@ -45,9 +45,9 @@ struct NuPlayer::Renderer : public AHandler {
void resume();
enum {
- kWhatEOS,
- kWhatFlushComplete,
- kWhatPosition,
+ kWhatEOS = 'eos ',
+ kWhatFlushComplete = 'fluC',
+ kWhatPosition = 'posi',
};
protected:
@@ -57,14 +57,14 @@ protected:
private:
enum {
- kWhatDrainAudioQueue,
- kWhatDrainVideoQueue,
- kWhatQueueBuffer,
- kWhatQueueEOS,
- kWhatFlush,
- kWhatAudioSinkChanged,
- kWhatPause,
- kWhatResume,
+ kWhatDrainAudioQueue = 'draA',
+ kWhatDrainVideoQueue = 'draV',
+ kWhatQueueBuffer = 'queB',
+ kWhatQueueEOS = 'qEOS',
+ kWhatFlush = 'flus',
+ kWhatAudioSinkChanged = 'auSC',
+ kWhatPause = 'paus',
+ kWhatResume = 'resm',
};
struct QueueEntry {
@@ -101,9 +101,10 @@ private:
bool mPaused;
int64_t mLastPositionUpdateUs;
+ int64_t mVideoLateByUs;
- void onDrainAudioQueue();
- void postDrainAudioQueue();
+ bool onDrainAudioQueue();
+ void postDrainAudioQueue(int64_t delayUs = 0);
void onDrainVideoQueue();
void postDrainVideoQueue();
@@ -118,6 +119,7 @@ private:
void notifyEOS(bool audio, status_t finalResult);
void notifyFlushComplete(bool audio);
void notifyPosition();
+ void notifyVideoLateBy(int64_t lateByUs);
void flushQueue(List<QueueEntry> *queue);
bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
index 5e55487ae88a..8a7eece12050 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
@@ -29,8 +29,9 @@ struct NuPlayer::Source : public RefBase {
virtual void start() = 0;
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData() = 0;
+ // Returns OK iff more data was available,
+ // an error or ERROR_END_OF_STREAM if not.
+ virtual status_t feedMoreTSData() = 0;
virtual sp<MetaData> getFormat(bool audio) = 0;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h
index df0935d80664..1874d808a4e3 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h
@@ -41,8 +41,8 @@ struct NuPlayer::NuPlayerStreamListener : public BnStreamListener {
private:
enum {
- kNumBuffers = 16,
- kBufferSize = 188 * 20
+ kNumBuffers = 8,
+ kBufferSize = 188 * 10
};
struct QueueEntry {
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
index a741987fc045..f79565425665 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -34,7 +34,7 @@ namespace android {
NuPlayer::StreamingSource::StreamingSource(const sp<IStreamSource> &source)
: mSource(source),
- mEOS(false) {
+ mFinalResult(OK) {
}
NuPlayer::StreamingSource::~StreamingSource() {
@@ -47,12 +47,12 @@ void NuPlayer::StreamingSource::start() {
mStreamListener->start();
}
-bool NuPlayer::StreamingSource::feedMoreTSData() {
- if (mEOS) {
- return false;
+status_t NuPlayer::StreamingSource::feedMoreTSData() {
+ if (mFinalResult != OK) {
+ return mFinalResult;
}
- for (int32_t i = 0; i < 10; ++i) {
+ for (int32_t i = 0; i < 50; ++i) {
char buffer[188];
sp<AMessage> extra;
ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra);
@@ -60,7 +60,7 @@ bool NuPlayer::StreamingSource::feedMoreTSData() {
if (n == 0) {
LOGI("input data EOS reached.");
mTSParser->signalEOS(ERROR_END_OF_STREAM);
- mEOS = true;
+ mFinalResult = ERROR_END_OF_STREAM;
break;
} else if (n == INFO_DISCONTINUITY) {
ATSParser::DiscontinuityType type = ATSParser::DISCONTINUITY_SEEK;
@@ -92,14 +92,14 @@ bool NuPlayer::StreamingSource::feedMoreTSData() {
LOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
- mEOS = true;
+ mFinalResult = err;
break;
}
}
}
}
- return true;
+ return OK;
}
sp<MetaData> NuPlayer::StreamingSource::getFormat(bool audio) {
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.h b/media/libmediaplayerservice/nuplayer/StreamingSource.h
index 7abce84746cc..ca00ef91d2d9 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.h
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.h
@@ -31,8 +31,7 @@ struct NuPlayer::StreamingSource : public NuPlayer::Source {
virtual void start();
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData();
+ virtual status_t feedMoreTSData();
virtual sp<MetaData> getFormat(bool audio);
virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
@@ -42,7 +41,7 @@ protected:
private:
sp<IStreamSource> mSource;
- bool mEOS;
+ status_t mFinalResult;
sp<NuPlayerStreamListener> mStreamListener;
sp<ATSParser> mTSParser;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 2ba2273d378c..9cb18de26e24 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -323,6 +323,7 @@ ACodec::ACodec()
mFlushingState = new FlushingState(this);
mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
+ mInputEOSResult = OK;
changeState(mUninitializedState);
}
@@ -686,6 +687,8 @@ void ACodec::setComponentRole(
"audio_decoder.amrwb", "audio_encoder.amrwb" },
{ MEDIA_MIMETYPE_AUDIO_AAC,
"audio_decoder.aac", "audio_encoder.aac" },
+ { MEDIA_MIMETYPE_AUDIO_VORBIS,
+ "audio_decoder.vorbis", "audio_encoder.vorbis" },
{ MEDIA_MIMETYPE_VIDEO_AVC,
"video_decoder.avc", "video_encoder.avc" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4,
@@ -749,9 +752,19 @@ void ACodec::configureCodec(
CHECK(msg->findInt32("sample-rate", &sampleRate));
CHECK_EQ(setupAACDecoder(numChannels, sampleRate), (status_t)OK);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
- } else {
- TRESPASS();
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
+ CHECK_EQ(setupAMRDecoder(false /* isWAMR */), (status_t)OK);
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
+ CHECK_EQ(setupAMRDecoder(true /* isWAMR */), (status_t)OK);
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW)
+ || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) {
+ // These are PCM-like formats with a fixed sample rate but
+ // a variable number of channels.
+
+ int32_t numChannels;
+ CHECK(msg->findInt32("channel-count", &numChannels));
+
+ CHECK_EQ(setupG711Decoder(numChannels), (status_t)OK);
}
int32_t maxInputSize;
@@ -823,6 +836,84 @@ status_t ACodec::setupAACDecoder(int32_t numChannels, int32_t sampleRate) {
return err;
}
+status_t ACodec::setupAMRDecoder(bool isWAMR) {
+ OMX_AUDIO_PARAM_AMRTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = kPortIndexInput;
+
+ status_t err =
+ mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
+
+ def.eAMRBandMode =
+ isWAMR ? OMX_AUDIO_AMRBandModeWB0 : OMX_AUDIO_AMRBandModeNB0;
+
+ return mOMX->setParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def));
+}
+
+status_t ACodec::setupG711Decoder(int32_t numChannels) {
+ return setupRawAudioFormat(
+ kPortIndexInput, 8000 /* sampleRate */, numChannels);
+}
+
+status_t ACodec::setupRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) {
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = portIndex;
+
+ status_t err = mOMX->getParameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ def.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+
+ err = mOMX->setParameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
+ InitOMXParams(&pcmParams);
+ pcmParams.nPortIndex = portIndex;
+
+ err = mOMX->getParameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+
+ if (err != OK) {
+ return err;
+ }
+
+ pcmParams.nChannels = numChannels;
+ pcmParams.eNumData = OMX_NumericalDataSigned;
+ pcmParams.bInterleaved = OMX_TRUE;
+ pcmParams.nBitPerSample = 16;
+ pcmParams.nSamplingRate = sampleRate;
+ pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
+
+ if (numChannels == 1) {
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF;
+ } else {
+ CHECK_EQ(numChannels, 2);
+
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+ pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+ }
+
+ return mOMX->setParameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+}
+
status_t ACodec::setVideoPortFormatType(
OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE compressionFormat,
@@ -1347,7 +1438,10 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
case KEEP_BUFFERS:
{
if (buffer == NULL) {
- mCodec->mPortEOS[kPortIndexInput] = true;
+ if (!mCodec->mPortEOS[kPortIndexInput]) {
+ mCodec->mPortEOS[kPortIndexInput] = true;
+ mCodec->mInputEOSResult = err;
+ }
}
break;
}
@@ -1377,8 +1471,13 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
memcpy(info->mData->data(), buffer->data(), buffer->size());
}
- LOGV("[%s] calling emptyBuffer %p",
- mCodec->mComponentName.c_str(), bufferID);
+ if (flags & OMX_BUFFERFLAG_CODECCONFIG) {
+ LOGV("[%s] calling emptyBuffer %p w/ codec specific data",
+ mCodec->mComponentName.c_str(), bufferID);
+ } else {
+ LOGV("[%s] calling emptyBuffer %p w/ time %lld us",
+ mCodec->mComponentName.c_str(), bufferID, timeUs);
+ }
CHECK_EQ(mCodec->mOMX->emptyBuffer(
mCodec->mNode,
@@ -1393,10 +1492,16 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
getMoreInputDataIfPossible();
} else if (!mCodec->mPortEOS[kPortIndexInput]) {
- LOGV("[%s] Signalling EOS on the input port",
- mCodec->mComponentName.c_str());
+ if (err != ERROR_END_OF_STREAM) {
+ LOGV("[%s] Signalling EOS on the input port "
+ "due to error %d",
+ mCodec->mComponentName.c_str(), err);
+ } else {
+ LOGV("[%s] Signalling EOS on the input port",
+ mCodec->mComponentName.c_str());
+ }
- LOGV("[%s] calling emptyBuffer %p",
+ LOGV("[%s] calling emptyBuffer %p signalling EOS",
mCodec->mComponentName.c_str(), bufferID);
CHECK_EQ(mCodec->mOMX->emptyBuffer(
@@ -1411,6 +1516,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
mCodec->mPortEOS[kPortIndexInput] = true;
+ mCodec->mInputEOSResult = err;
}
break;
@@ -1457,8 +1563,8 @@ bool ACodec::BaseState::onOMXFillBufferDone(
int64_t timeUs,
void *platformPrivate,
void *dataPtr) {
- LOGV("[%s] onOMXFillBufferDone %p",
- mCodec->mComponentName.c_str(), bufferID);
+ LOGV("[%s] onOMXFillBufferDone %p time %lld us",
+ mCodec->mComponentName.c_str(), bufferID, timeUs);
ssize_t index;
BufferInfo *info =
@@ -1518,6 +1624,7 @@ bool ACodec::BaseState::onOMXFillBufferDone(
if (flags & OMX_BUFFERFLAG_EOS) {
sp<AMessage> notify = mCodec->mNotify->dup();
notify->setInt32("what", ACodec::kWhatEOS);
+ notify->setInt32("err", mCodec->mInputEOSResult);
notify->post();
mCodec->mPortEOS[kPortIndexOutput] = true;
@@ -1686,7 +1793,11 @@ void ACodec::UninitializedState::onSetup(
++matchIndex) {
componentName = matchingCodecs.itemAt(matchIndex).string();
+ pid_t tid = androidGetTid();
+ int prevPriority = androidGetThreadPriority(tid);
+ androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND);
status_t err = omx->allocateNode(componentName.c_str(), observer, &node);
+ androidSetThreadPriority(tid, prevPriority);
if (err == OK) {
break;
@@ -1712,6 +1823,8 @@ void ACodec::UninitializedState::onSetup(
mCodec->mPortEOS[kPortIndexInput] =
mCodec->mPortEOS[kPortIndexOutput] = false;
+ mCodec->mInputEOSResult = OK;
+
mCodec->configureCodec(mime.c_str(), msg);
sp<RefBase> obj;
@@ -2362,6 +2475,8 @@ void ACodec::FlushingState::changeStateIfWeOwnAllBuffers() {
mCodec->mPortEOS[kPortIndexInput] =
mCodec->mPortEOS[kPortIndexOutput] = false;
+ mCodec->mInputEOSResult = OK;
+
mCodec->changeState(mCodec->mExecutingState);
}
}
diff --git a/media/libstagefright/AVIExtractor.cpp b/media/libstagefright/AVIExtractor.cpp
index 4e464148b090..0be2ca40153d 100644
--- a/media/libstagefright/AVIExtractor.cpp
+++ b/media/libstagefright/AVIExtractor.cpp
@@ -18,6 +18,7 @@
#define LOG_TAG "AVIExtractor"
#include <utils/Log.h>
+#include "include/avc_utils.h"
#include "include/AVIExtractor.h"
#include <binder/ProcessState.h>
@@ -55,11 +56,36 @@ private:
MediaBufferGroup *mBufferGroup;
size_t mSampleIndex;
+ sp<MP3Splitter> mSplitter;
+
DISALLOW_EVIL_CONSTRUCTORS(AVISource);
};
////////////////////////////////////////////////////////////////////////////////
+struct AVIExtractor::MP3Splitter : public RefBase {
+ MP3Splitter();
+
+ void clear();
+ void append(MediaBuffer *buffer);
+ status_t read(MediaBuffer **buffer);
+
+protected:
+ virtual ~MP3Splitter();
+
+private:
+ bool mFindSync;
+ int64_t mBaseTimeUs;
+ int64_t mNumSamplesRead;
+ sp<ABuffer> mBuffer;
+
+ bool resync();
+
+ DISALLOW_EVIL_CONSTRUCTORS(MP3Splitter);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
AVIExtractor::AVISource::AVISource(
const sp<AVIExtractor> &extractor, size_t trackIndex)
: mExtractor(extractor),
@@ -83,6 +109,15 @@ status_t AVIExtractor::AVISource::start(MetaData *params) {
mBufferGroup->add_buffer(new MediaBuffer(mTrack.mMaxSampleSize));
mSampleIndex = 0;
+ const char *mime;
+ CHECK(mTrack.mMeta->findCString(kKeyMIMEType, &mime));
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
+ mSplitter = new MP3Splitter;
+ } else {
+ mSplitter.clear();
+ }
+
return OK;
}
@@ -92,6 +127,8 @@ status_t AVIExtractor::AVISource::stop() {
delete mBufferGroup;
mBufferGroup = NULL;
+ mSplitter.clear();
+
return OK;
}
@@ -115,39 +152,213 @@ status_t AVIExtractor::AVISource::read(
if (err != OK) {
return ERROR_END_OF_STREAM;
}
+
+ if (mSplitter != NULL) {
+ mSplitter->clear();
+ }
}
- off64_t offset;
- size_t size;
- bool isKey;
- int64_t timeUs;
- status_t err = mExtractor->getSampleInfo(
- mTrackIndex, mSampleIndex, &offset, &size, &isKey, &timeUs);
+ for (;;) {
+ if (mSplitter != NULL) {
+ status_t err = mSplitter->read(buffer);
+
+ if (err == OK) {
+ break;
+ } else if (err != -EAGAIN) {
+ return err;
+ }
+ }
+
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t timeUs;
+ status_t err = mExtractor->getSampleInfo(
+ mTrackIndex, mSampleIndex, &offset, &size, &isKey, &timeUs);
- ++mSampleIndex;
+ ++mSampleIndex;
- if (err != OK) {
- return ERROR_END_OF_STREAM;
+ if (err != OK) {
+ return ERROR_END_OF_STREAM;
+ }
+
+ MediaBuffer *out;
+ CHECK_EQ(mBufferGroup->acquire_buffer(&out), (status_t)OK);
+
+ ssize_t n = mExtractor->mDataSource->readAt(offset, out->data(), size);
+
+ if (n < (ssize_t)size) {
+ return n < 0 ? (status_t)n : (status_t)ERROR_MALFORMED;
+ }
+
+ out->set_range(0, size);
+
+ out->meta_data()->setInt64(kKeyTime, timeUs);
+
+ if (isKey) {
+ out->meta_data()->setInt32(kKeyIsSyncFrame, 1);
+ }
+
+ if (mSplitter == NULL) {
+ *buffer = out;
+ break;
+ }
+
+ mSplitter->append(out);
+ out->release();
+ out = NULL;
}
- MediaBuffer *out;
- CHECK_EQ(mBufferGroup->acquire_buffer(&out), (status_t)OK);
+ return OK;
+}
- ssize_t n = mExtractor->mDataSource->readAt(offset, out->data(), size);
+////////////////////////////////////////////////////////////////////////////////
- if (n < (ssize_t)size) {
- return n < 0 ? (status_t)n : (status_t)ERROR_MALFORMED;
+AVIExtractor::MP3Splitter::MP3Splitter()
+ : mFindSync(true),
+ mBaseTimeUs(-1ll),
+ mNumSamplesRead(0) {
+}
+
+AVIExtractor::MP3Splitter::~MP3Splitter() {
+}
+
+void AVIExtractor::MP3Splitter::clear() {
+ mFindSync = true;
+ mBaseTimeUs = -1ll;
+ mNumSamplesRead = 0;
+
+ if (mBuffer != NULL) {
+ mBuffer->setRange(0, 0);
+ }
+}
+
+void AVIExtractor::MP3Splitter::append(MediaBuffer *buffer) {
+ size_t prevCapacity = (mBuffer != NULL) ? mBuffer->capacity() : 0;
+
+ if (mBaseTimeUs < 0) {
+ CHECK(mBuffer == NULL || mBuffer->size() == 0);
+ CHECK(buffer->meta_data()->findInt64(kKeyTime, &mBaseTimeUs));
+ mNumSamplesRead = 0;
+ }
+
+ if (mBuffer != NULL && mBuffer->offset() > 0) {
+ memmove(mBuffer->base(), mBuffer->data(), mBuffer->size());
+ mBuffer->setRange(0, mBuffer->size());
+ }
+
+ if (mBuffer == NULL
+ || mBuffer->size() + buffer->range_length() > prevCapacity) {
+ size_t newCapacity =
+ (prevCapacity + buffer->range_length() + 1023) & ~1023;
+
+ sp<ABuffer> newBuffer = new ABuffer(newCapacity);
+ if (mBuffer != NULL) {
+ memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
+ newBuffer->setRange(0, mBuffer->size());
+ } else {
+ newBuffer->setRange(0, 0);
+ }
+ mBuffer = newBuffer;
+ }
+
+ memcpy(mBuffer->data() + mBuffer->size(),
+ (const uint8_t *)buffer->data() + buffer->range_offset(),
+ buffer->range_length());
+
+ mBuffer->setRange(0, mBuffer->size() + buffer->range_length());
+}
+
+bool AVIExtractor::MP3Splitter::resync() {
+ if (mBuffer == NULL) {
+ return false;
}
- out->set_range(0, size);
+ bool foundSync = false;
+ for (size_t offset = 0; offset + 3 < mBuffer->size(); ++offset) {
+ uint32_t firstHeader = U32_AT(mBuffer->data() + offset);
+
+ size_t frameSize;
+ if (!GetMPEGAudioFrameSize(firstHeader, &frameSize)) {
+ continue;
+ }
+
+ size_t subsequentOffset = offset + frameSize;
+ size_t i = 3;
+ while (i > 0) {
+ if (subsequentOffset + 3 >= mBuffer->size()) {
+ break;
+ }
+
+ static const uint32_t kMask = 0xfffe0c00;
+
+ uint32_t header = U32_AT(mBuffer->data() + subsequentOffset);
+ if ((header & kMask) != (firstHeader & kMask)) {
+ break;
+ }
+
+ if (!GetMPEGAudioFrameSize(header, &frameSize)) {
+ break;
+ }
+
+ subsequentOffset += frameSize;
+ --i;
+ }
- out->meta_data()->setInt64(kKeyTime, timeUs);
+ if (i == 0) {
+ foundSync = true;
+ memmove(mBuffer->data(),
+ mBuffer->data() + offset,
+ mBuffer->size() - offset);
- if (isKey) {
- out->meta_data()->setInt32(kKeyIsSyncFrame, 1);
+ mBuffer->setRange(0, mBuffer->size() - offset);
+ break;
+ }
}
- *buffer = out;
+ return foundSync;
+}
+
+status_t AVIExtractor::MP3Splitter::read(MediaBuffer **out) {
+ *out = NULL;
+
+ if (mFindSync) {
+ if (!resync()) {
+ return -EAGAIN;
+ }
+
+ mFindSync = false;
+ }
+
+ if (mBuffer->size() < 4) {
+ return -EAGAIN;
+ }
+
+ uint32_t header = U32_AT(mBuffer->data());
+ size_t frameSize;
+ int sampleRate;
+ int numSamples;
+ if (!GetMPEGAudioFrameSize(
+ header, &frameSize, &sampleRate, NULL, NULL, &numSamples)) {
+ return ERROR_MALFORMED;
+ }
+
+ if (mBuffer->size() < frameSize) {
+ return -EAGAIN;
+ }
+
+ MediaBuffer *mbuf = new MediaBuffer(frameSize);
+ memcpy(mbuf->data(), mBuffer->data(), frameSize);
+
+ int64_t timeUs = mBaseTimeUs + (mNumSamplesRead * 1000000ll) / sampleRate;
+ mNumSamplesRead += numSamples;
+
+ mbuf->meta_data()->setInt64(kKeyTime, timeUs);
+
+ mBuffer->setRange(
+ mBuffer->offset() + frameSize, mBuffer->size() - frameSize);
+
+ *out = mbuf;
return OK;
}
@@ -362,6 +573,13 @@ static const char *GetMIMETypeForHandler(uint32_t handler) {
case FOURCC('X', 'V', 'I', 'X'):
return MEDIA_MIMETYPE_VIDEO_MPEG4;
+ // from http://wiki.multimedia.cx/index.php?title=H264
+ case FOURCC('a', 'v', 'c', '1'):
+ case FOURCC('d', 'a', 'v', 'c'):
+ case FOURCC('x', '2', '6', '4'):
+ case FOURCC('v', 's', 's', 'h'):
+ return MEDIA_MIMETYPE_VIDEO_AVC;
+
default:
return NULL;
}
@@ -406,6 +624,14 @@ status_t AVIExtractor::parseStreamHeader(off64_t offset, size_t size) {
return ERROR_MALFORMED;
}
+ if (mime == NULL) {
+ LOGW("Unsupported video format '%c%c%c%c'",
+ (char)(handler >> 24),
+ (char)((handler >> 16) & 0xff),
+ (char)((handler >> 8) & 0xff),
+ (char)(handler & 0xff));
+ }
+
kind = Track::VIDEO;
} else if (type == FOURCC('a', 'u', 'd', 's')) {
if (mime && strncasecmp(mime, "audio/", 6)) {
@@ -433,6 +659,8 @@ status_t AVIExtractor::parseStreamHeader(off64_t offset, size_t size) {
track->mThumbnailSampleSize = 0;
track->mThumbnailSampleIndex = -1;
track->mMaxSampleSize = 0;
+ track->mAvgChunkSize = 1.0;
+ track->mFirstChunkSize = 0;
return OK;
}
@@ -451,8 +679,8 @@ status_t AVIExtractor::parseStreamFormat(off64_t offset, size_t size) {
bool isVideo = (track->mKind == Track::VIDEO);
- if ((isVideo && size < 40) || (!isVideo && size < 18)) {
- // Expected a BITMAPINFO or WAVEFORMATEX structure, respectively.
+ if ((isVideo && size < 40) || (!isVideo && size < 16)) {
+ // Expected a BITMAPINFO or WAVEFORMAT(EX) structure, respectively.
return ERROR_MALFORMED;
}
@@ -473,8 +701,11 @@ status_t AVIExtractor::parseStreamFormat(off64_t offset, size_t size) {
track->mMeta->setInt32(kKeyHeight, height);
} else {
uint32_t format = U16LE_AT(data);
+
if (format == 0x55) {
track->mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG);
+ } else {
+ LOGW("Unsupported audio format = 0x%04x", format);
}
uint32_t numChannels = U16LE_AT(&data[2]);
@@ -632,6 +863,47 @@ status_t AVIExtractor::parseIndex(off64_t offset, size_t size) {
for (size_t i = 0; i < mTracks.size(); ++i) {
Track *track = &mTracks.editItemAt(i);
+ if (track->mBytesPerSample > 0) {
+ // Assume all chunks are roughly the same size for now.
+
+ // Compute the avg. size of the first 128 chunks (if there are
+ // that many), but exclude the size of the first one, since
+ // it may be an outlier.
+ size_t numSamplesToAverage = track->mSamples.size();
+ if (numSamplesToAverage > 256) {
+ numSamplesToAverage = 256;
+ }
+
+ double avgChunkSize = 0;
+ size_t j;
+ for (j = 0; j <= numSamplesToAverage; ++j) {
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t dummy;
+
+ status_t err =
+ getSampleInfo(
+ i, j,
+ &offset, &size, &isKey, &dummy);
+
+ if (err != OK) {
+ return err;
+ }
+
+ if (j == 0) {
+ track->mFirstChunkSize = size;
+ continue;
+ }
+
+ avgChunkSize += size;
+ }
+
+ avgChunkSize /= numSamplesToAverage;
+
+ track->mAvgChunkSize = avgChunkSize;
+ }
+
int64_t durationUs;
CHECK_EQ((status_t)OK,
getSampleTime(i, track->mSamples.size() - 1, &durationUs));
@@ -646,37 +918,27 @@ status_t AVIExtractor::parseIndex(off64_t offset, size_t size) {
AString mime = tmp;
- if (!strncasecmp("video/", mime.c_str(), 6)
- && track->mThumbnailSampleIndex >= 0) {
- int64_t thumbnailTimeUs;
- CHECK_EQ((status_t)OK,
- getSampleTime(i, track->mThumbnailSampleIndex,
- &thumbnailTimeUs));
+ if (!strncasecmp("video/", mime.c_str(), 6)) {
+ if (track->mThumbnailSampleIndex >= 0) {
+ int64_t thumbnailTimeUs;
+ CHECK_EQ((status_t)OK,
+ getSampleTime(i, track->mThumbnailSampleIndex,
+ &thumbnailTimeUs));
- track->mMeta->setInt64(kKeyThumbnailTime, thumbnailTimeUs);
-
- if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_MPEG4)) {
- status_t err = addMPEG4CodecSpecificData(i);
-
- if (err != OK) {
- return err;
- }
+ track->mMeta->setInt64(kKeyThumbnailTime, thumbnailTimeUs);
}
- }
- if (track->mBytesPerSample != 0) {
- // Assume all chunks are the same size for now.
+ status_t err = OK;
- off64_t offset;
- size_t size;
- bool isKey;
- int64_t sampleTimeUs;
- CHECK_EQ((status_t)OK,
- getSampleInfo(
- i, 0,
- &offset, &size, &isKey, &sampleTimeUs));
+ if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_MPEG4)) {
+ err = addMPEG4CodecSpecificData(i);
+ } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) {
+ err = addH264CodecSpecificData(i);
+ }
- track->mRate *= size / track->mBytesPerSample;
+ if (err != OK) {
+ return err;
+ }
}
}
@@ -781,6 +1043,63 @@ status_t AVIExtractor::addMPEG4CodecSpecificData(size_t trackIndex) {
return OK;
}
+status_t AVIExtractor::addH264CodecSpecificData(size_t trackIndex) {
+ Track *track = &mTracks.editItemAt(trackIndex);
+
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t timeUs;
+
+ // Extract codec specific data from the first non-empty sample.
+
+ size_t sampleIndex = 0;
+ for (;;) {
+ status_t err =
+ getSampleInfo(
+ trackIndex, sampleIndex, &offset, &size, &isKey, &timeUs);
+
+ if (err != OK) {
+ return err;
+ }
+
+ if (size > 0) {
+ break;
+ }
+
+ ++sampleIndex;
+ }
+
+ sp<ABuffer> buffer = new ABuffer(size);
+ ssize_t n = mDataSource->readAt(offset, buffer->data(), buffer->size());
+
+ if (n < (ssize_t)size) {
+ return n < 0 ? (status_t)n : ERROR_MALFORMED;
+ }
+
+ sp<MetaData> meta = MakeAVCCodecSpecificData(buffer);
+
+ if (meta == NULL) {
+ LOGE("Unable to extract AVC codec specific data");
+ return ERROR_MALFORMED;
+ }
+
+ int32_t width, height;
+ CHECK(meta->findInt32(kKeyWidth, &width));
+ CHECK(meta->findInt32(kKeyHeight, &height));
+
+ uint32_t type;
+ const void *csd;
+ size_t csdSize;
+ CHECK(meta->findData(kKeyAVCC, &type, &csd, &csdSize));
+
+ track->mMeta->setInt32(kKeyWidth, width);
+ track->mMeta->setInt32(kKeyHeight, width);
+ track->mMeta->setData(kKeyAVCC, type, csd, csdSize);
+
+ return OK;
+}
+
status_t AVIExtractor::getSampleInfo(
size_t trackIndex, size_t sampleIndex,
off64_t *offset, size_t *size, bool *isKey,
@@ -823,6 +1142,18 @@ status_t AVIExtractor::getSampleInfo(
*isKey = info.mIsKey;
+ if (track.mBytesPerSample > 0) {
+ size_t sampleStartInBytes;
+ if (sampleIndex == 0) {
+ sampleStartInBytes = 0;
+ } else {
+ sampleStartInBytes =
+ track.mFirstChunkSize + track.mAvgChunkSize * (sampleIndex - 1);
+ }
+
+ sampleIndex = sampleStartInBytes / track.mBytesPerSample;
+ }
+
*sampleTimeUs = (sampleIndex * 1000000ll * track.mRate) / track.mScale;
return OK;
@@ -847,8 +1178,24 @@ status_t AVIExtractor::getSampleIndexAtTime(
const Track &track = mTracks.itemAt(trackIndex);
- ssize_t closestSampleIndex =
- timeUs / track.mRate * track.mScale / 1000000ll;
+ ssize_t closestSampleIndex;
+
+ if (track.mBytesPerSample > 0) {
+ size_t closestByteOffset =
+ (timeUs * track.mBytesPerSample)
+ / track.mRate * track.mScale / 1000000ll;
+
+ if (closestByteOffset <= track.mFirstChunkSize) {
+ closestSampleIndex = 0;
+ } else {
+ closestSampleIndex =
+ (closestByteOffset - track.mFirstChunkSize)
+ / track.mAvgChunkSize;
+ }
+ } else {
+ // Each chunk contains a single sample.
+ closestSampleIndex = timeUs / track.mRate * track.mScale / 1000000ll;
+ }
ssize_t numSamples = track.mSamples.size();
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index ba076f57bf0e..2581a62eca44 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -508,6 +508,9 @@ status_t AudioPlayer::seekTo(int64_t time_us) {
mReachedEOS = false;
mSeekTimeUs = time_us;
+ // Flush resets the number of played frames
+ mNumFramesPlayed = 0;
+
if (mAudioSink != NULL) {
mAudioSink->flush();
} else {
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 07a46bd20e6c..fa9417a50ebe 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -249,7 +249,7 @@ void AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
}
void AwesomePlayer::setUID(uid_t uid) {
- LOGI("AwesomePlayer running on behalf of uid %d", uid);
+ LOGV("AwesomePlayer running on behalf of uid %d", uid);
mUID = uid;
mUIDValid = true;
@@ -362,7 +362,7 @@ status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
if (!meta->findInt32(kKeyBitRate, &bitrate)) {
const char *mime;
CHECK(meta->findCString(kKeyMIMEType, &mime));
- LOGW("track of type '%s' does not publish bitrate", mime);
+ LOGV("track of type '%s' does not publish bitrate", mime);
totalBitRate = -1;
break;
@@ -1192,7 +1192,7 @@ void AwesomePlayer::shutdownVideoDecoder_l() {
usleep(1000);
}
IPCThreadState::self()->flushCommands();
- LOGI("video decoder shutdown completed");
+ LOGV("video decoder shutdown completed");
}
status_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
@@ -1202,7 +1202,7 @@ status_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
return OK;
}
- LOGI("attempting to reconfigure to use new surface");
+ LOGV("attempting to reconfigure to use new surface");
bool wasPlaying = (mFlags & PLAYING) != 0;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 6280f51c5db1..e94a8d712e2f 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1485,6 +1485,8 @@ void OMXCodec::setComponentRole(
"audio_decoder.amrwb", "audio_encoder.amrwb" },
{ MEDIA_MIMETYPE_AUDIO_AAC,
"audio_decoder.aac", "audio_encoder.aac" },
+ { MEDIA_MIMETYPE_AUDIO_VORBIS,
+ "audio_decoder.vorbis", "audio_encoder.vorbis" },
{ MEDIA_MIMETYPE_VIDEO_AVC,
"video_decoder.avc", "video_encoder.avc" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4,
@@ -1635,7 +1637,7 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
return err;
}
- CODEC_LOGI("allocating %lu buffers of size %lu on %s port",
+ CODEC_LOGV("allocating %lu buffers of size %lu on %s port",
def.nBufferCountActual, def.nBufferSize,
portIndex == kPortIndexInput ? "input" : "output");
@@ -1876,7 +1878,7 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
return err;
}
- CODEC_LOGI("allocating %lu buffers from a native window of size %lu on "
+ CODEC_LOGV("allocating %lu buffers from a native window of size %lu on "
"output port", def.nBufferCountActual, def.nBufferSize);
// Dequeue buffers and send them to OMX
@@ -3654,7 +3656,7 @@ status_t OMXCodec::stop() {
mSource->stop();
- CODEC_LOGI("stopped in state %d", mState);
+ CODEC_LOGV("stopped in state %d", mState);
return OK;
}
@@ -4219,14 +4221,14 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) {
inputFormat->findInt32(kKeySampleRate, &sampleRate);
if ((OMX_U32)numChannels != params.nChannels) {
- LOGW("Codec outputs a different number of channels than "
+ LOGV("Codec outputs a different number of channels than "
"the input stream contains (contains %d channels, "
"codec outputs %ld channels).",
numChannels, params.nChannels);
}
if (sampleRate != (int32_t)params.nSamplingRate) {
- LOGW("Codec outputs at different sampling rate than "
+ LOGV("Codec outputs at different sampling rate than "
"what the input stream contains (contains data at "
"%d Hz, codec outputs %lu Hz)",
sampleRate, params.nSamplingRate);
diff --git a/media/libstagefright/SampleTable.cpp b/media/libstagefright/SampleTable.cpp
index 2b9d99bdf52d..ebad3215802f 100644
--- a/media/libstagefright/SampleTable.cpp
+++ b/media/libstagefright/SampleTable.cpp
@@ -23,8 +23,8 @@
#include <arpa/inet.h>
+#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/DataSource.h>
-#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/Utils.h>
namespace android {
@@ -40,6 +40,71 @@ const uint32_t SampleTable::kSampleSizeTypeCompact = FOURCC('s', 't', 'z', '2');
////////////////////////////////////////////////////////////////////////////////
+struct SampleTable::CompositionDeltaLookup {
+ CompositionDeltaLookup();
+
+ void setEntries(
+ const uint32_t *deltaEntries, size_t numDeltaEntries);
+
+ uint32_t getCompositionTimeOffset(uint32_t sampleIndex);
+
+private:
+ Mutex mLock;
+
+ const uint32_t *mDeltaEntries;
+ size_t mNumDeltaEntries;
+
+ size_t mCurrentDeltaEntry;
+ size_t mCurrentEntrySampleIndex;
+
+ DISALLOW_EVIL_CONSTRUCTORS(CompositionDeltaLookup);
+};
+
+SampleTable::CompositionDeltaLookup::CompositionDeltaLookup()
+ : mDeltaEntries(NULL),
+ mNumDeltaEntries(0),
+ mCurrentDeltaEntry(0),
+ mCurrentEntrySampleIndex(0) {
+}
+
+void SampleTable::CompositionDeltaLookup::setEntries(
+ const uint32_t *deltaEntries, size_t numDeltaEntries) {
+ Mutex::Autolock autolock(mLock);
+
+ mDeltaEntries = deltaEntries;
+ mNumDeltaEntries = numDeltaEntries;
+ mCurrentDeltaEntry = 0;
+ mCurrentEntrySampleIndex = 0;
+}
+
+uint32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset(
+ uint32_t sampleIndex) {
+ Mutex::Autolock autolock(mLock);
+
+ if (mDeltaEntries == NULL) {
+ return 0;
+ }
+
+ if (sampleIndex < mCurrentEntrySampleIndex) {
+ mCurrentDeltaEntry = 0;
+ mCurrentEntrySampleIndex = 0;
+ }
+
+ while (mCurrentDeltaEntry < mNumDeltaEntries) {
+ uint32_t sampleCount = mDeltaEntries[2 * mCurrentDeltaEntry];
+ if (sampleIndex < mCurrentEntrySampleIndex + sampleCount) {
+ return mDeltaEntries[2 * mCurrentDeltaEntry + 1];
+ }
+
+ mCurrentEntrySampleIndex += sampleCount;
+ ++mCurrentDeltaEntry;
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
SampleTable::SampleTable(const sp<DataSource> &source)
: mDataSource(source),
mChunkOffsetOffset(-1),
@@ -56,6 +121,7 @@ SampleTable::SampleTable(const sp<DataSource> &source)
mSampleTimeEntries(NULL),
mCompositionTimeDeltaEntries(NULL),
mNumCompositionTimeDeltaEntries(0),
+ mCompositionDeltaLookup(new CompositionDeltaLookup),
mSyncSampleOffset(-1),
mNumSyncSamples(0),
mSyncSamples(NULL),
@@ -71,6 +137,9 @@ SampleTable::~SampleTable() {
delete[] mSyncSamples;
mSyncSamples = NULL;
+ delete mCompositionDeltaLookup;
+ mCompositionDeltaLookup = NULL;
+
delete[] mCompositionTimeDeltaEntries;
mCompositionTimeDeltaEntries = NULL;
@@ -318,6 +387,9 @@ status_t SampleTable::setCompositionTimeToSampleParams(
mCompositionTimeDeltaEntries[i] = ntohl(mCompositionTimeDeltaEntries[i]);
}
+ mCompositionDeltaLookup->setEntries(
+ mCompositionTimeDeltaEntries, mNumCompositionTimeDeltaEntries);
+
return OK;
}
@@ -430,8 +502,12 @@ void SampleTable::buildSampleEntriesTable() {
mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex;
+ uint32_t compTimeDelta =
+ mCompositionDeltaLookup->getCompositionTimeOffset(
+ sampleIndex);
+
mSampleTimeEntries[sampleIndex].mCompositionTime =
- sampleTime + getCompositionTimeOffset(sampleIndex);
+ sampleTime + compTimeDelta;
}
++sampleIndex;
@@ -739,25 +815,8 @@ status_t SampleTable::getMetaDataForSample(
return OK;
}
-uint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) const {
- if (mCompositionTimeDeltaEntries == NULL) {
- return 0;
- }
-
- uint32_t curSample = 0;
- for (size_t i = 0; i < mNumCompositionTimeDeltaEntries; ++i) {
- uint32_t sampleCount = mCompositionTimeDeltaEntries[2 * i];
-
- if (sampleIndex < curSample + sampleCount) {
- uint32_t sampleDelta = mCompositionTimeDeltaEntries[2 * i + 1];
-
- return sampleDelta;
- }
-
- curSample += sampleCount;
- }
-
- return 0;
+uint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) {
+ return mCompositionDeltaLookup->getCompositionTimeOffset(sampleIndex);
}
} // namespace android
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index 8a42e8b4b048..153ee3352c78 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -297,7 +297,7 @@ sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit) {
sp<MetaData> meta = new MetaData;
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
- meta->setData(kKeyAVCC, 0, csd->data(), csd->size());
+ meta->setData(kKeyAVCC, kTypeAVCC, csd->data(), csd->size());
meta->setInt32(kKeyWidth, width);
meta->setInt32(kKeyHeight, height);
@@ -329,6 +329,28 @@ bool IsIDR(const sp<ABuffer> &buffer) {
return foundIDR;
}
+bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) {
+ const uint8_t *data = accessUnit->data();
+ size_t size = accessUnit->size();
+
+ const uint8_t *nalStart;
+ size_t nalSize;
+ while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) {
+ CHECK_GT(nalSize, 0u);
+
+ unsigned nalType = nalStart[0] & 0x1f;
+
+ if (nalType == 5) {
+ return true;
+ } else if (nalType == 1) {
+ unsigned nal_ref_idc = (nalStart[0] >> 5) & 3;
+ return nal_ref_idc != 0;
+ }
+ }
+
+ return true;
+}
+
sp<MetaData> MakeAACCodecSpecificData(
unsigned profile, unsigned sampling_freq_index,
unsigned channel_configuration) {
diff --git a/media/libstagefright/chromium_http/support.cpp b/media/libstagefright/chromium_http/support.cpp
index de936c411edb..f15014ee400e 100644
--- a/media/libstagefright/chromium_http/support.cpp
+++ b/media/libstagefright/chromium_http/support.cpp
@@ -74,10 +74,32 @@ bool logMessageHandler(
return false;
}
+struct AutoPrioritySaver {
+ AutoPrioritySaver()
+ : mTID(androidGetTid()),
+ mPrevPriority(androidGetThreadPriority(mTID)) {
+ androidSetThreadPriority(mTID, ANDROID_PRIORITY_NORMAL);
+ }
+
+ ~AutoPrioritySaver() {
+ androidSetThreadPriority(mTID, mPrevPriority);
+ }
+
+private:
+ pid_t mTID;
+ int mPrevPriority;
+
+ DISALLOW_EVIL_CONSTRUCTORS(AutoPrioritySaver);
+};
static void InitializeNetworkThreadIfNecessary() {
Mutex::Autolock autoLock(gNetworkThreadLock);
+
if (gNetworkThread == NULL) {
+ // Make sure any threads spawned by the chromium framework are
+ // running at normal priority instead of inheriting this thread's.
+ AutoPrioritySaver saver;
+
gNetworkThread = new base::Thread("network");
base::Thread::Options options;
options.message_loop_type = MessageLoop::TYPE_IO;
diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp
index 582bdba94197..f039bc13ef6c 100644
--- a/media/libstagefright/foundation/AMessage.cpp
+++ b/media/libstagefright/foundation/AMessage.cpp
@@ -385,6 +385,15 @@ AString AMessage::debugString(int32_t indent) const {
item.u.refValue)->debugString(
indent + strlen(item.mName) + 14).c_str());
break;
+ case kTypeRect:
+ tmp = StringPrintf(
+ "Rect %s(%d, %d, %d, %d)",
+ item.mName,
+ item.u.rectValue.mLeft,
+ item.u.rectValue.mTop,
+ item.u.rectValue.mRight,
+ item.u.rectValue.mBottom);
+ break;
default:
TRESPASS();
}
diff --git a/media/libstagefright/include/AVIExtractor.h b/media/libstagefright/include/AVIExtractor.h
index b5753473804b..ff5dcb53ee0c 100644
--- a/media/libstagefright/include/AVIExtractor.h
+++ b/media/libstagefright/include/AVIExtractor.h
@@ -42,6 +42,7 @@ protected:
private:
struct AVISource;
+ struct MP3Splitter;
struct SampleInfo {
uint32_t mOffset;
@@ -70,6 +71,10 @@ private:
size_t mThumbnailSampleSize;
ssize_t mThumbnailSampleIndex;
size_t mMaxSampleSize;
+
+ // If mBytesPerSample > 0:
+ double mAvgChunkSize;
+ size_t mFirstChunkSize;
};
sp<DataSource> mDataSource;
@@ -101,6 +106,7 @@ private:
size_t *sampleIndex) const;
status_t addMPEG4CodecSpecificData(size_t trackIndex);
+ status_t addH264CodecSpecificData(size_t trackIndex);
static bool IsCorrectChunkType(
ssize_t trackIndex, Track::Kind kind, uint32_t chunkType);
diff --git a/media/libstagefright/include/SampleTable.h b/media/libstagefright/include/SampleTable.h
index a6a6524c06ad..847dff70bfa4 100644
--- a/media/libstagefright/include/SampleTable.h
+++ b/media/libstagefright/include/SampleTable.h
@@ -86,6 +86,8 @@ protected:
~SampleTable();
private:
+ struct CompositionDeltaLookup;
+
static const uint32_t kChunkOffsetType32;
static const uint32_t kChunkOffsetType64;
static const uint32_t kSampleSizeType32;
@@ -117,6 +119,7 @@ private:
uint32_t *mCompositionTimeDeltaEntries;
size_t mNumCompositionTimeDeltaEntries;
+ CompositionDeltaLookup *mCompositionDeltaLookup;
off64_t mSyncSampleOffset;
uint32_t mNumSyncSamples;
@@ -135,8 +138,7 @@ private:
friend struct SampleIterator;
status_t getSampleSize_l(uint32_t sample_index, size_t *sample_size);
-
- uint32_t getCompositionTimeOffset(uint32_t sampleIndex) const;
+ uint32_t getCompositionTimeOffset(uint32_t sampleIndex);
static int CompareIncreasingTime(const void *, const void *);
diff --git a/media/libstagefright/include/avc_utils.h b/media/libstagefright/include/avc_utils.h
index 15cd4d44d482..e4188224d23f 100644
--- a/media/libstagefright/include/avc_utils.h
+++ b/media/libstagefright/include/avc_utils.h
@@ -50,6 +50,7 @@ struct MetaData;
sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit);
bool IsIDR(const sp<ABuffer> &accessUnit);
+bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit);
const char *AVCProfileToString(uint8_t profile);
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp
index ffa335646ab7..20a25d7d2664 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -423,74 +423,88 @@ again:
MediaBuffer *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin());
- size_t size = frame->range_length();
-
if (mType != AVC) {
*out = frame;
return OK;
}
- if (size < mNALSizeLen) {
- frame->release();
- frame = NULL;
+ // Each input frame contains one or more NAL fragments, each fragment
+ // is prefixed by mNALSizeLen bytes giving the fragment length,
+ // followed by a corresponding number of bytes containing the fragment.
+ // We output all these fragments into a single large buffer separated
+ // by startcodes (0x00 0x00 0x00 0x01).
+
+ const uint8_t *srcPtr =
+ (const uint8_t *)frame->data() + frame->range_offset();
+
+ size_t srcSize = frame->range_length();
+
+ size_t dstSize = 0;
+ MediaBuffer *buffer = NULL;
+ uint8_t *dstPtr = NULL;
+
+ for (int32_t pass = 0; pass < 2; ++pass) {
+ size_t srcOffset = 0;
+ size_t dstOffset = 0;
+ while (srcOffset + mNALSizeLen <= srcSize) {
+ size_t NALsize;
+ switch (mNALSizeLen) {
+ case 1: NALsize = srcPtr[srcOffset]; break;
+ case 2: NALsize = U16_AT(srcPtr + srcOffset); break;
+ case 3: NALsize = U24_AT(srcPtr + srcOffset); break;
+ case 4: NALsize = U32_AT(srcPtr + srcOffset); break;
+ default:
+ TRESPASS();
+ }
- return ERROR_MALFORMED;
- }
+ if (srcOffset + mNALSizeLen + NALsize > srcSize) {
+ break;
+ }
- // In the case of AVC content, each NAL unit is prefixed by
- // mNALSizeLen bytes of length. We want to prefix the data with
- // a four-byte 0x00000001 startcode instead of the length prefix.
- // mNALSizeLen ranges from 1 through 4 bytes, so add an extra
- // 3 bytes of padding to the buffer start.
- static const size_t kPadding = 3;
+ if (pass == 1) {
+ memcpy(&dstPtr[dstOffset], "\x00\x00\x00\x01", 4);
- MediaBuffer *buffer = new MediaBuffer(size + kPadding);
+ memcpy(&dstPtr[dstOffset + 4],
+ &srcPtr[srcOffset + mNALSizeLen],
+ NALsize);
+ }
- int64_t timeUs;
- CHECK(frame->meta_data()->findInt64(kKeyTime, &timeUs));
- int32_t isSync;
- CHECK(frame->meta_data()->findInt32(kKeyIsSyncFrame, &isSync));
+ dstOffset += 4; // 0x00 00 00 01
+ dstOffset += NALsize;
- buffer->meta_data()->setInt64(kKeyTime, timeUs);
- buffer->meta_data()->setInt32(kKeyIsSyncFrame, isSync);
+ srcOffset += mNALSizeLen + NALsize;
+ }
- memcpy((uint8_t *)buffer->data() + kPadding,
- (const uint8_t *)frame->data() + frame->range_offset(),
- size);
+ if (srcOffset < srcSize) {
+ // There were trailing bytes or not enough data to complete
+ // a fragment.
- buffer->set_range(kPadding, size);
+ frame->release();
+ frame = NULL;
- frame->release();
- frame = NULL;
+ return ERROR_MALFORMED;
+ }
- uint8_t *data = (uint8_t *)buffer->data();
+ if (pass == 0) {
+ dstSize = dstOffset;
- size_t NALsize;
- switch (mNALSizeLen) {
- case 1: NALsize = data[kPadding]; break;
- case 2: NALsize = U16_AT(&data[kPadding]); break;
- case 3: NALsize = U24_AT(&data[kPadding]); break;
- case 4: NALsize = U32_AT(&data[kPadding]); break;
- default:
- TRESPASS();
- }
+ buffer = new MediaBuffer(dstSize);
- if (size < NALsize + mNALSizeLen) {
- buffer->release();
- buffer = NULL;
+ int64_t timeUs;
+ CHECK(frame->meta_data()->findInt64(kKeyTime, &timeUs));
+ int32_t isSync;
+ CHECK(frame->meta_data()->findInt32(kKeyIsSyncFrame, &isSync));
- return ERROR_MALFORMED;
- }
+ buffer->meta_data()->setInt64(kKeyTime, timeUs);
+ buffer->meta_data()->setInt32(kKeyIsSyncFrame, isSync);
- if (size > NALsize + mNALSizeLen) {
- LOGW("discarding %d bytes of data.", size - NALsize - mNALSizeLen);
+ dstPtr = (uint8_t *)buffer->data();
+ }
}
- // actual data starts at &data[kPadding + mNALSizeLen]
-
- memcpy(&data[mNALSizeLen - 1], "\x00\x00\x00\x01", 4);
- buffer->set_range(mNALSizeLen - 1, NALsize + 4);
+ frame->release();
+ frame = NULL;
*out = buffer;
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index bc24dbbe9366..33d3f309e5e7 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -85,7 +85,7 @@ OMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner)
: mOwner(owner),
mDone(false) {
mThread = new CallbackDispatcherThread(this);
- mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_AUDIO);
+ mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_FOREGROUND);
}
OMX::CallbackDispatcher::~CallbackDispatcher() {
diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
index f7330f3448db..b705d00d9e7f 100644
--- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
+++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
@@ -42,7 +42,7 @@ SimpleSoftOMXComponent::SimpleSoftOMXComponent(
mLooper->start(
false, // runOnCallingThread
false, // canCallJava
- PRIORITY_AUDIO);
+ ANDROID_PRIORITY_FOREGROUND);
}
void SimpleSoftOMXComponent::prepareForDestruction() {
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
index 6dbc8f2fb086..e3aa8cf86cf9 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
@@ -47,6 +47,10 @@ public class MediaBassBoostTest extends ActivityInstrumentationTestCase2<MediaFr
private final static int MIN_ENERGY_RATIO_2 = 3;
private final static short TEST_STRENGTH = 500;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private BassBoost mBassBoost = null;
private int mSession = -1;
@@ -202,14 +206,15 @@ public class MediaBassBoostTest extends ActivityInstrumentationTestCase2<MediaFr
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
+ mp.setLooping(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
getBassBoost(mp.getAudioSessionId());
mp.prepare();
@@ -220,7 +225,7 @@ public class MediaBassBoostTest extends ActivityInstrumentationTestCase2<MediaFr
int refEnergy1000 = probe.capture(1000);
mBassBoost.setStrength((short)1000);
mBassBoost.setEnabled(true);
- Thread.sleep(500);
+ Thread.sleep(4000);
// measure energy around 1kHz with band level at min
int energy200 = probe.capture(200);
int energy1000 = probe.capture(1000);
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
index 2c0124f60903..3c8d05a027e7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
@@ -50,6 +50,14 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr
private final static float DELAY_TOLERANCE = 1.05f;
// allow +/- 5% tolerance between set and get ratios
private final static float RATIO_TOLERANCE = 1.05f;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+ // Implementor UUID for environmental reverb effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID ENV_REVERB_EFFECT_UUID =
+ UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b");
private EnvironmentalReverb mReverb = null;
private int mSession = -1;
@@ -355,10 +363,10 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -425,10 +433,10 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -439,7 +447,7 @@ public class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFr
// auxiliary reverb will be chosen by the effect framework as we are on session 0
rvb = new AudioEffect(
AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b"),
+ ENV_REVERB_EFFECT_UUID,
0,
0);
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
index 1acc6111a416..ee91bbb34d76 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
@@ -50,6 +50,11 @@ public class MediaEqualizerTest extends ActivityInstrumentationTestCase2<MediaFr
private final static int TEST_FREQUENCY_MILLIHERTZ = 1000000;
private final static int MIN_NUMBER_OF_PRESETS = 4;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+
private Equalizer mEqualizer = null;
private int mSession = -1;
@@ -268,10 +273,10 @@ public class MediaEqualizerTest extends ActivityInstrumentationTestCase2<MediaFr
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
index cac09041ec8c..757bbc5fb394 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
@@ -44,6 +44,14 @@ import java.util.UUID;
*/
public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
private String TAG = "MediaPresetReverbTest";
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+ // Implementor UUID for preset reverb effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID PRESET_REVERB_EFFECT_UUID =
+ UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b");
private PresetReverb mReverb = null;
private int mSession = -1;
@@ -200,10 +208,10 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -268,24 +276,21 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- getReverb(mp.getAudioSessionId());
- mReverb.setPreset((short)PresetReverb.PRESET_PLATE);
- mReverb.setEnabled(true);
// create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary
// reverb will be chosen by the effect framework as we are on session 0
rvb = new AudioEffect(
AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b"),
+ PRESET_REVERB_EFFECT_UUID,
0,
0);
@@ -318,7 +323,6 @@ public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<Medi
loge(msg, "sleep() interrupted");
}
finally {
- releaseReverb();
if (mp != null) {
mp.release();
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
index d47f08f693ac..b74e52591cb7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
@@ -44,9 +44,13 @@ import java.util.UUID;
*/
public class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
private String TAG = "MediaVirtualizerTest";
- private final static int MIN_ENERGY_RATIO_2 = 3;
+ private final static int MIN_ENERGY_RATIO_2 = 2;
private final static short TEST_STRENGTH = 500;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private Virtualizer mVirtualizer = null;
private int mSession = -1;
@@ -203,14 +207,15 @@ public class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<Media
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
+ mp.setLooping(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
getVirtualizer(mp.getAudioSessionId());
mp.prepare();
@@ -221,7 +226,7 @@ public class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<Media
int refEnergy1000 = probe.capture(1000);
mVirtualizer.setStrength((short)1000);
mVirtualizer.setEnabled(true);
- Thread.sleep(500);
+ Thread.sleep(4000);
// measure energy around 1kHz with band level at min
int energy200 = probe.capture(200);
int energy1000 = probe.capture(1000);
@@ -231,7 +236,7 @@ public class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<Media
// audio file but is not the primary effect of the virtualizer. A better way would
// be to have a stereo PCM capture and check that a strongly paned input is centered
// when output. However, we cannot capture stereo with the visualizer.
- assertTrue(msg + ": virtiualizer has no effect",
+ assertTrue(msg + ": virtualizer has no effect",
((float)energy200/(float)energy1000) >
(MIN_ENERGY_RATIO_2 * ((float)refEnergy200/(float)refEnergy1000)));
result = true;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
index f264afaa1698..e0cf51d0a4d7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
@@ -47,6 +47,10 @@ public class MediaVisualizerTest extends ActivityInstrumentationTestCase2<MediaF
private final static int MAX_SAMPLING_RATE = 48000000;
private final static int MIN_CAPTURE_SIZE_MAX = 1024;
private final static int MAX_CAPTURE_SIZE_MIN = 128;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private Visualizer mVisualizer = null;
private int mSession = -1;
@@ -205,10 +209,10 @@ public class MediaVisualizerTest extends ActivityInstrumentationTestCase2<MediaF
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -281,10 +285,10 @@ public class MediaVisualizerTest extends ActivityInstrumentationTestCase2<MediaF
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
diff --git a/native/include/android/rect.h b/native/include/android/rect.h
index 3e81f531db81..64d487dc259a 100644
--- a/native/include/android/rect.h
+++ b/native/include/android/rect.h
@@ -23,6 +23,9 @@ extern "C" {
#endif
typedef struct ARect {
+#ifdef __cplusplus
+ typedef int32_t value_type;
+#endif
int32_t left;
int32_t top;
int32_t right;
diff --git a/opengl/java/android/opengl/Matrix.java b/opengl/java/android/opengl/Matrix.java
index 6d80bc60c94a..7c72ae470c52 100644
--- a/opengl/java/android/opengl/Matrix.java
+++ b/opengl/java/android/opengl/Matrix.java
@@ -39,6 +39,10 @@ package android.opengl;
*
*/
public class Matrix {
+
+ /** Temporary memory for operations that need temporary matrix data. */
+ private final static float[] sTemp = new float[32];
+
/**
* Multiply two 4x4 matrices together and store the result in a third 4x4
* matrix. In matrix notation: result = lhs x rhs. Due to the way
@@ -125,95 +129,120 @@ public class Matrix {
int mOffset) {
// Invert a 4 x 4 matrix using Cramer's Rule
- // array of transpose source matrix
- float[] src = new float[16];
-
// transpose matrix
- transposeM(src, 0, m, mOffset);
-
- // temp array for pairs
- float[] tmp = new float[12];
+ final float src0 = m[mOffset + 0];
+ final float src4 = m[mOffset + 1];
+ final float src8 = m[mOffset + 2];
+ final float src12 = m[mOffset + 3];
+
+ final float src1 = m[mOffset + 4];
+ final float src5 = m[mOffset + 5];
+ final float src9 = m[mOffset + 6];
+ final float src13 = m[mOffset + 7];
+
+ final float src2 = m[mOffset + 8];
+ final float src6 = m[mOffset + 9];
+ final float src10 = m[mOffset + 10];
+ final float src14 = m[mOffset + 11];
+
+ final float src3 = m[mOffset + 12];
+ final float src7 = m[mOffset + 13];
+ final float src11 = m[mOffset + 14];
+ final float src15 = m[mOffset + 15];
// calculate pairs for first 8 elements (cofactors)
- tmp[0] = src[10] * src[15];
- tmp[1] = src[11] * src[14];
- tmp[2] = src[9] * src[15];
- tmp[3] = src[11] * src[13];
- tmp[4] = src[9] * src[14];
- tmp[5] = src[10] * src[13];
- tmp[6] = src[8] * src[15];
- tmp[7] = src[11] * src[12];
- tmp[8] = src[8] * src[14];
- tmp[9] = src[10] * src[12];
- tmp[10] = src[8] * src[13];
- tmp[11] = src[9] * src[12];
-
- // Holds the destination matrix while we're building it up.
- float[] dst = new float[16];
+ final float atmp0 = src10 * src15;
+ final float atmp1 = src11 * src14;
+ final float atmp2 = src9 * src15;
+ final float atmp3 = src11 * src13;
+ final float atmp4 = src9 * src14;
+ final float atmp5 = src10 * src13;
+ final float atmp6 = src8 * src15;
+ final float atmp7 = src11 * src12;
+ final float atmp8 = src8 * src14;
+ final float atmp9 = src10 * src12;
+ final float atmp10 = src8 * src13;
+ final float atmp11 = src9 * src12;
// calculate first 8 elements (cofactors)
- dst[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7];
- dst[0] -= tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7];
- dst[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7];
- dst[1] -= tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7];
- dst[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7];
- dst[2] -= tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7];
- dst[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6];
- dst[3] -= tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6];
- dst[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3];
- dst[4] -= tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3];
- dst[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3];
- dst[5] -= tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3];
- dst[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3];
- dst[6] -= tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3];
- dst[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2];
- dst[7] -= tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2];
+ final float dst0 = (atmp0 * src5 + atmp3 * src6 + atmp4 * src7)
+ - (atmp1 * src5 + atmp2 * src6 + atmp5 * src7);
+ final float dst1 = (atmp1 * src4 + atmp6 * src6 + atmp9 * src7)
+ - (atmp0 * src4 + atmp7 * src6 + atmp8 * src7);
+ final float dst2 = (atmp2 * src4 + atmp7 * src5 + atmp10 * src7)
+ - (atmp3 * src4 + atmp6 * src5 + atmp11 * src7);
+ final float dst3 = (atmp5 * src4 + atmp8 * src5 + atmp11 * src6)
+ - (atmp4 * src4 + atmp9 * src5 + atmp10 * src6);
+ final float dst4 = (atmp1 * src1 + atmp2 * src2 + atmp5 * src3)
+ - (atmp0 * src1 + atmp3 * src2 + atmp4 * src3);
+ final float dst5 = (atmp0 * src0 + atmp7 * src2 + atmp8 * src3)
+ - (atmp1 * src0 + atmp6 * src2 + atmp9 * src3);
+ final float dst6 = (atmp3 * src0 + atmp6 * src1 + atmp11 * src3)
+ - (atmp2 * src0 + atmp7 * src1 + atmp10 * src3);
+ final float dst7 = (atmp4 * src0 + atmp9 * src1 + atmp10 * src2)
+ - (atmp5 * src0 + atmp8 * src1 + atmp11 * src2);
// calculate pairs for second 8 elements (cofactors)
- tmp[0] = src[2] * src[7];
- tmp[1] = src[3] * src[6];
- tmp[2] = src[1] * src[7];
- tmp[3] = src[3] * src[5];
- tmp[4] = src[1] * src[6];
- tmp[5] = src[2] * src[5];
- tmp[6] = src[0] * src[7];
- tmp[7] = src[3] * src[4];
- tmp[8] = src[0] * src[6];
- tmp[9] = src[2] * src[4];
- tmp[10] = src[0] * src[5];
- tmp[11] = src[1] * src[4];
+ final float btmp0 = src2 * src7;
+ final float btmp1 = src3 * src6;
+ final float btmp2 = src1 * src7;
+ final float btmp3 = src3 * src5;
+ final float btmp4 = src1 * src6;
+ final float btmp5 = src2 * src5;
+ final float btmp6 = src0 * src7;
+ final float btmp7 = src3 * src4;
+ final float btmp8 = src0 * src6;
+ final float btmp9 = src2 * src4;
+ final float btmp10 = src0 * src5;
+ final float btmp11 = src1 * src4;
// calculate second 8 elements (cofactors)
- dst[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15];
- dst[8] -= tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15];
- dst[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15];
- dst[9] -= tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15];
- dst[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15];
- dst[10] -= tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15];
- dst[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14];
- dst[11] -= tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14];
- dst[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9];
- dst[12] -= tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10];
- dst[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10];
- dst[13] -= tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8];
- dst[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8];
- dst[14] -= tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9];
- dst[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9];
- dst[15] -= tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8];
+ final float dst8 = (btmp0 * src13 + btmp3 * src14 + btmp4 * src15)
+ - (btmp1 * src13 + btmp2 * src14 + btmp5 * src15);
+ final float dst9 = (btmp1 * src12 + btmp6 * src14 + btmp9 * src15)
+ - (btmp0 * src12 + btmp7 * src14 + btmp8 * src15);
+ final float dst10 = (btmp2 * src12 + btmp7 * src13 + btmp10 * src15)
+ - (btmp3 * src12 + btmp6 * src13 + btmp11 * src15);
+ final float dst11 = (btmp5 * src12 + btmp8 * src13 + btmp11 * src14)
+ - (btmp4 * src12 + btmp9 * src13 + btmp10 * src14);
+ final float dst12 = (btmp2 * src10 + btmp5 * src11 + btmp1 * src9 )
+ - (btmp4 * src11 + btmp0 * src9 + btmp3 * src10);
+ final float dst13 = (btmp8 * src11 + btmp0 * src8 + btmp7 * src10)
+ - (btmp6 * src10 + btmp9 * src11 + btmp1 * src8 );
+ final float dst14 = (btmp6 * src9 + btmp11 * src11 + btmp3 * src8 )
+ - (btmp10 * src11 + btmp2 * src8 + btmp7 * src9 );
+ final float dst15 = (btmp10 * src10 + btmp4 * src8 + btmp9 * src9 )
+ - (btmp8 * src9 + btmp11 * src10 + btmp5 * src8 );
// calculate determinant
- float det =
- src[0] * dst[0] + src[1] * dst[1] + src[2] * dst[2] + src[3]
- * dst[3];
+ final float det =
+ src0 * dst0 + src1 * dst1 + src2 * dst2 + src3 * dst3;
if (det == 0.0f) {
-
+ return false;
}
// calculate matrix inverse
- det = 1 / det;
- for (int j = 0; j < 16; j++)
- mInv[j + mInvOffset] = dst[j] * det;
+ final float invdet = 1.0f / det;
+ mInv[ mInvOffset] = dst0 * invdet;
+ mInv[ 1 + mInvOffset] = dst1 * invdet;
+ mInv[ 2 + mInvOffset] = dst2 * invdet;
+ mInv[ 3 + mInvOffset] = dst3 * invdet;
+
+ mInv[ 4 + mInvOffset] = dst4 * invdet;
+ mInv[ 5 + mInvOffset] = dst5 * invdet;
+ mInv[ 6 + mInvOffset] = dst6 * invdet;
+ mInv[ 7 + mInvOffset] = dst7 * invdet;
+
+ mInv[ 8 + mInvOffset] = dst8 * invdet;
+ mInv[ 9 + mInvOffset] = dst9 * invdet;
+ mInv[10 + mInvOffset] = dst10 * invdet;
+ mInv[11 + mInvOffset] = dst11 * invdet;
+
+ mInv[12 + mInvOffset] = dst12 * invdet;
+ mInv[13 + mInvOffset] = dst13 * invdet;
+ mInv[14 + mInvOffset] = dst14 * invdet;
+ mInv[15 + mInvOffset] = dst15 * invdet;
return true;
}
@@ -488,9 +517,10 @@ public class Matrix {
public static void rotateM(float[] rm, int rmOffset,
float[] m, int mOffset,
float a, float x, float y, float z) {
- float[] r = new float[16];
- setRotateM(r, 0, a, x, y, z);
- multiplyMM(rm, rmOffset, m, mOffset, r, 0);
+ synchronized(sTemp) {
+ setRotateM(sTemp, 0, a, x, y, z);
+ multiplyMM(rm, rmOffset, m, mOffset, sTemp, 0);
+ }
}
/**
@@ -505,10 +535,11 @@ public class Matrix {
*/
public static void rotateM(float[] m, int mOffset,
float a, float x, float y, float z) {
- float[] temp = new float[32];
- setRotateM(temp, 0, a, x, y, z);
- multiplyMM(temp, 16, m, mOffset, temp, 0);
- System.arraycopy(temp, 16, m, mOffset, 16);
+ synchronized(sTemp) {
+ setRotateM(sTemp, 0, a, x, y, z);
+ multiplyMM(sTemp, 16, m, mOffset, sTemp, 0);
+ System.arraycopy(sTemp, 16, m, mOffset, 16);
+ }
}
/**
diff --git a/opengl/libs/EGL/egl_object.h b/opengl/libs/EGL/egl_object.h
index d2b737897af7..46f7139ad42e 100644
--- a/opengl/libs/EGL/egl_object.h
+++ b/opengl/libs/EGL/egl_object.h
@@ -130,7 +130,7 @@ protected:
if (window != NULL) {
native_window_set_buffers_format(window, 0);
if (native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL)) {
- LOGE("EGLNativeWindowType %p disconnected failed", window);
+ LOGW("EGLNativeWindowType %p disconnect failed", window);
}
}
}
diff --git a/opengl/libs/GLES2_dbg/Android.mk b/opengl/libs/GLES2_dbg/Android.mk
index c2b1142bc3a5..70853d8cffe8 100644
--- a/opengl/libs/GLES2_dbg/Android.mk
+++ b/opengl/libs/GLES2_dbg/Android.mk
@@ -31,6 +31,9 @@ ifeq ($(ARCH_ARM_HAVE_TLS_REGISTER),true)
LOCAL_CFLAGS += -DHAVE_ARM_TLS_REGISTER
endif
+LOCAL_CFLAGS += -DLOG_TAG=\"libGLES2_dbg\"
+
+
# we need to access the private Bionic header <bionic_tls.h>
# on ARM platforms, we need to mirror the ARCH_ARM_HAVE_TLS_REGISTER
# behavior from the bionic Android.mk file
diff --git a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
index 9e77665eba52..41061e1bc662 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -30,13 +30,11 @@ DbgContext * getDbgContextThreadSpecific() {
}
DbgContext::DbgContext(const unsigned version, const gl_hooks_t * const hooks,
- const unsigned MAX_VERTEX_ATTRIBS, const GLenum readFormat,
- const GLenum readType)
+ const unsigned MAX_VERTEX_ATTRIBS)
: lzf_buf(NULL), lzf_readIndex(0), lzf_refSize(0), lzf_refBufSize(0)
, version(version), hooks(hooks)
, MAX_VERTEX_ATTRIBS(MAX_VERTEX_ATTRIBS)
- , readFormat(readFormat), readType(readType)
- , readBytesPerPixel(GetBytesPerPixel(readFormat, readType))
+ , readBytesPerPixel(4)
, captureSwap(0), captureDraw(0)
, vertexAttribs(new VertexAttrib[MAX_VERTEX_ATTRIBS])
, hasNonVBOAttribs(false), indexBuffers(NULL), indexBuffer(NULL)
@@ -67,11 +65,7 @@ DbgContext* CreateDbgContext(const unsigned version, const gl_hooks_t * const ho
assert(GL_NO_ERROR == hooks->gl.glGetError());
GLint MAX_VERTEX_ATTRIBS = 0;
hooks->gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &MAX_VERTEX_ATTRIBS);
- GLint readFormat, readType;
- hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
- hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
- DbgContext* dbg = new DbgContext(version, hooks, MAX_VERTEX_ATTRIBS, readFormat, readType);
-
+ DbgContext* dbg = new DbgContext(version, hooks, MAX_VERTEX_ATTRIBS);
glesv2debugger::Message msg, cmd;
msg.set_context_id(reinterpret_cast<int>(dbg));
msg.set_expect_response(false);
@@ -100,33 +94,31 @@ unsigned GetBytesPerPixel(const GLenum format, const GLenum type)
{
switch (type) {
case GL_UNSIGNED_SHORT_5_6_5:
- return 2;
case GL_UNSIGNED_SHORT_4_4_4_4:
- return 2;
case GL_UNSIGNED_SHORT_5_5_5_1:
return 2;
case GL_UNSIGNED_BYTE:
break;
default:
- assert(0);
+ LOGE("GetBytesPerPixel: unknown type %x", type);
}
switch (format) {
case GL_ALPHA:
- return 1;
case GL_LUMINANCE:
return 1;
- break;
case GL_LUMINANCE_ALPHA:
return 2;
case GL_RGB:
return 3;
case GL_RGBA:
+ case 0x80E1: // GL_BGRA_EXT
return 4;
default:
- assert(0);
- return 0;
+ LOGE("GetBytesPerPixel: unknown format %x", format);
}
+
+ return 1; // in doubt...
}
void DbgContext::Fetch(const unsigned index, std::string * const data) const
diff --git a/opengl/libs/GLES2_dbg/src/egl.cpp b/opengl/libs/GLES2_dbg/src/egl.cpp
index eb28d0607693..bbea3bd5572a 100644
--- a/opengl/libs/GLES2_dbg/src/egl.cpp
+++ b/opengl/libs/GLES2_dbg/src/egl.cpp
@@ -41,11 +41,11 @@ EGLBoolean Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
void * pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
dbg->readBytesPerPixel);
dbg->hooks->gl.glReadPixels(viewport[0], viewport[1], viewport[2],
- viewport[3], dbg->readFormat, dbg->readType, pixels);
+ viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, pixels);
dbg->CompressReadPixelBuffer(msg.mutable_data());
msg.set_data_type(msg.ReferencedImage);
- msg.set_pixel_format(dbg->readFormat);
- msg.set_pixel_type(dbg->readType);
+ msg.set_pixel_format(GL_RGBA);
+ msg.set_pixel_type(GL_UNSIGNED_BYTE);
msg.set_image_width(viewport[2]);
msg.set_image_height(viewport[3]);
}
diff --git a/opengl/libs/GLES2_dbg/src/header.h b/opengl/libs/GLES2_dbg/src/header.h
index f2b1fa663598..49f3847f5dc2 100644
--- a/opengl/libs/GLES2_dbg/src/header.h
+++ b/opengl/libs/GLES2_dbg/src/header.h
@@ -87,7 +87,6 @@ public:
const unsigned int version; // 0 is GLES1, 1 is GLES2
const gl_hooks_t * const hooks;
const unsigned int MAX_VERTEX_ATTRIBS;
- const GLenum readFormat, readType; // implementation supported glReadPixels
const unsigned int readBytesPerPixel;
unsigned int captureSwap; // number of eglSwapBuffers to glReadPixels
@@ -124,8 +123,7 @@ public:
unsigned maxAttrib; // number of slots used by program
DbgContext(const unsigned version, const gl_hooks_t * const hooks,
- const unsigned MAX_VERTEX_ATTRIBS, const GLenum readFormat,
- const GLenum readType);
+ const unsigned MAX_VERTEX_ATTRIBS);
~DbgContext();
void Fetch(const unsigned index, std::string * const data) const;
diff --git a/opengl/libs/GLES2_dbg/src/vertex.cpp b/opengl/libs/GLES2_dbg/src/vertex.cpp
index 029ee3bf50a7..28a24206d659 100644
--- a/opengl/libs/GLES2_dbg/src/vertex.cpp
+++ b/opengl/libs/GLES2_dbg/src/vertex.cpp
@@ -77,7 +77,7 @@ void Debug_glDrawArrays(GLenum mode, GLint first, GLsizei count)
pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
dbg->readBytesPerPixel);
Debug_glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
- dbg->readFormat, dbg->readType, pixels);
+ GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
break;
case glesv2debugger::Message_Function_SKIP:
@@ -134,19 +134,22 @@ void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid*
msg.set_arg7(dbg->maxAttrib); // indicate capturing vertex data
std::string * const data = msg.mutable_data();
if (GL_UNSIGNED_BYTE == type) {
- if (dbg->indexBuffer)
+ if (dbg->indexBuffer) {
FetchIndexed(count, (unsigned char *)dbg->indexBuffer->data +
(unsigned long)indices, data, dbg);
- else
+ } else {
FetchIndexed(count, (unsigned char *)indices, data, dbg);
+ }
} else if (GL_UNSIGNED_SHORT == type) {
- if (dbg->indexBuffer)
+ if (dbg->indexBuffer) {
FetchIndexed(count, (unsigned short *)((char *)dbg->indexBuffer->data +
(unsigned long)indices), data, dbg);
- else
+ } else {
FetchIndexed(count, (unsigned short *)indices, data, dbg);
- } else
+ }
+ } else {
assert(0);
+ }
void * pixels = NULL;
int viewport[4] = {};
@@ -174,7 +177,7 @@ void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid*
Send(msg, cmd);
expectResponse = cmd.expect_response();
// TODO: pack glReadPixels data with vertex data instead of
- // relying on sperate call for transport, this would allow
+ // relying on separate call for transport, this would allow
// auto generated message loop using EXTEND_Debug macro
if (dbg->captureDraw > 0) {
dbg->captureDraw--;
@@ -182,7 +185,7 @@ void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid*
pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
dbg->readBytesPerPixel);
Debug_glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
- dbg->readFormat, dbg->readType, pixels);
+ GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
break;
case glesv2debugger::Message_Function_SKIP:
diff --git a/opengl/libs/GLES2_dbg/test/test_main.cpp b/opengl/libs/GLES2_dbg/test/test_main.cpp
index 058bea4d6f48..183bf8ecb760 100644
--- a/opengl/libs/GLES2_dbg/test/test_main.cpp
+++ b/opengl/libs/GLES2_dbg/test/test_main.cpp
@@ -29,7 +29,7 @@ protected:
gl_hooks_t hooks;
DbgContextTest()
- : dbg(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE) {
+ : dbg(1, &hooks, 32) {
// You can do set-up work for each test here.
hooks.gl.glGetError = GetError;
}
diff --git a/opengl/libs/GLES2_dbg/test/test_server.cpp b/opengl/libs/GLES2_dbg/test/test_server.cpp
index bbbe91305661..0ab87b08ef0b 100644
--- a/opengl/libs/GLES2_dbg/test/test_server.cpp
+++ b/opengl/libs/GLES2_dbg/test/test_server.cpp
@@ -151,7 +151,7 @@ protected:
virtual void SetUp() {
ServerFileTest::SetUp();
- dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
+ dbg = new DbgContext(1, &hooks, 32);
ASSERT_NE((void *)NULL, dbg);
for (unsigned int i = 0; i < sizeof(hooks) / sizeof(void *); i++)
((void **)&hooks)[i] = reinterpret_cast<void *>(glNoop);
diff --git a/opengl/libs/GLES2_dbg/test/test_socket.cpp b/opengl/libs/GLES2_dbg/test/test_socket.cpp
index b2148acf5248..9f815e211bb5 100644
--- a/opengl/libs/GLES2_dbg/test/test_socket.cpp
+++ b/opengl/libs/GLES2_dbg/test/test_socket.cpp
@@ -44,7 +44,7 @@ protected:
}
virtual void SetUp() {
- dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
+ dbg = new DbgContext(1, &hooks, 32);
ASSERT_TRUE(dbg != NULL);
for (unsigned int i = 0; i < sizeof(hooks) / sizeof(void *); i++)
((void **)&hooks)[i] = (void *)glNoop;
diff --git a/packages/BackupRestoreConfirmation/res/values-am/strings.xml b/packages/BackupRestoreConfirmation/res/values-am/strings.xml
index 41fa6a0a2f3c..43e4ccee0658 100644
--- a/packages/BackupRestoreConfirmation/res/values-am/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-am/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"ሙሉ ለሙሉ መጠባበቂያ"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"ሙሉ ለሙሉ እነበረበት መልስ"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"ሁሉንም ውሂብ በሙሉ መጠበቂያ ከተያያዘ የዴስክቶፕ ኮምፒዩተር ተጠይቋል። ይህ እንዲከሰት ለመፍቀድ ይፈልጋሉ? "\n\n"እርስዎ ራስዎ የመጠባበቂያውን ጥየቃ ካልጠየቁ ክወናው እንዲካሄድ አይፍቀዱ።"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"ውሂቤን መጠባበቂያ"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"መጠባበቂያ አታድርግ"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"እባክዎ የሙሉ ውሂብ መጠበቂያ ማመስጠር ለመጠቅም የይለፍ ቃል ያስገቡ። ይህም ባዶ ከሆነ፣ የእርስዎ የአሁኑ የመጠበቂያ ይለፍ ቃል ይወሰዳል፡"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"ሙሉ የውሂብ መጠበቂያ ለማመስጠር ከፈለጉ ከታች የይለፍ ቃል ያስገቡ፡"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"ውሂብ እነበረበት መልስ የተመሳጠረ ከሆነ፣ እባክዎ ከታች የይለፍ ቃል ያስገቡ"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"መጠባበቂያ በመጀመር ላይ..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"መጠባበቂያ ጨርሷል"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"እነበረበት መልስ በመጀመር ላይ..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"እነበረበት መመለስ ጨርሷል"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"ክንውን ጊዜው አልቋል"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ar/strings.xml b/packages/BackupRestoreConfirmation/res/values-ar/strings.xml
index 0d4cf97a8567..f946d4953ed1 100644
--- a/packages/BackupRestoreConfirmation/res/values-ar/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ar/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"نسخ احتياطي بالكامل"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"استعادة كاملة"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"تم طلب الاحتفاظ بنسخة احتياطية كاملة من البيانات على كمبيوتر سطح مكتب متصل. هل تريد السماح بإجراء ذلك؟"\n\n"إذا لم تطلب الاحتفاظ بنسخة احتياطية بنفسك، فلا تسمح بمتابعة العملية."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"الاحتفاظ بنسخة احتياطية من بياناتي"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"عدم النسخ الاحتياطي"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"الرجاء إدخال كلمة المرور للاستخدام لتشفير بيانات النسخة الاحتياطية بالكامل. إذا تم ترك هذا فارغًا، فسيتم استخدام كلمة مرور النسخ الاحتياطي الحالية:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"إذا كنت ترغب في تشفير بيانات النسخة الاحتياطية بالكامل، فأدخل كلمة المرور أدناه:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"إذا كانت بيانات الاسترداد مشفرة، فالرجاء إدخال كلمة المرور أدناه:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"جارٍ بدء النسخ الاحتياطي..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"انتهت عملية النسخ الاحتياطي"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"جارٍ بدء الاستعادة..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"انتهت عملية استعادة"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"انتهت مهلة العملية"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-bg/strings.xml b/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
index f90b66636387..6c6a90f9da8d 100644
--- a/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Пълно резервно копие"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Пълно възстановяване"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Бе поискано пълно резервно копие на всичките данни до свързан настолен компютър. Искате ли да разрешите това?"\n\n"Ако не сте заявили създаването на копие, не позволявайте операцията да продължи."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Резервно копие на данните ми"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Без резервно копие"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Моля, въведете парола, която да използвате за шифроване на пълното резервно копие на данните. Ако не е попълнена, ще бъде използвана текущата ви парола за резервно копие:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ако искате да шифровате пълното резервно копие на данните, въведете парола по-долу:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ако възстановените данни са шифровани, моля, въведете паролата по-долу:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Създаването на резервно копие се стартира..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Създаването на резервно копие завърши"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Възстановяването се стартира..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Възстановяването завърши"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Времето за изчакване на операцията изтече"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-cs/strings.xml b/packages/BackupRestoreConfirmation/res/values-cs/strings.xml
index cdccf59c7d42..0d8fa2be4158 100644
--- a/packages/BackupRestoreConfirmation/res/values-cs/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-cs/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Úplná záloha"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Úplné obnovení"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Obdrželi jsme požadavek na úplnou zálohu všech dat do připojeného počítače. Chcete tuto akci povolit? "\n\n"Pokud jste o zálohu nežádali, operaci nepovolujte."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Zálohovat data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nezálohovat"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Zadejte prosím heslo pro šifrování dat úplné zálohy. Pokud pole ponecháte prázdné, použije se aktuální heslo pro zálohy:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Chcete-li data úplné zálohy zašifrovat, zadejte heslo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Pokud jsou obnovená data šifrována, zadejte prosím heslo níže:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Spouští se zálohování..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Zálohování bylo dokončeno"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Spouští se obnovení..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Obnovení bylo dokončeno"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Časový limit operace vypršel"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-da/strings.xml b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
index 5cbaab48c3b5..63bc7ebc1047 100644
--- a/packages/BackupRestoreConfirmation/res/values-da/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Fuld sikkerhedskopiering"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Fuld genoprettelse"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Der er anmodet om en fuld sikkerhedskopiering af alle data til en tilsluttet stationær computer. Vil du tillade dette?"\n\n"Hvis du ikke har anmodet om sikkerhedskopiering, skal du ikke tillade denne handling."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhedskopier mine data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Undlad at sikkerhedskopiere"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Angiv en adgangskode, som skal bruges til kryptering af alle dine sikkerhedsdata. Hvis dette felt er tomt, bruges din aktuelle adgangskode til sikkerhedskopiering:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Hvis du ønsker at kryptere sikkerhedsdataene, skal du indtaste en adgangskode nedenfor:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Hvis gendannelsesdataene er krypteret, skal du angive adgangskoden nedenfor:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Sikkerhedskopiering begynder..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Sikkerhedskopiering er færdig"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Gendannelse begynder..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Gendannelse afsluttet"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Handling fik timeout"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-de/strings.xml b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
index e4bdb6b1b7bd..cba2b2697a55 100644
--- a/packages/BackupRestoreConfirmation/res/values-de/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Vollständige Sicherung"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Vollständige Wiederherstellung"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Es wurde eine vollständige Sicherung sämtlicher Daten auf einen verbundenen Desktop-Computer angefordert. Möchten Sie dies zulassen?"\n\n"Wenn Sie die Sicherung nicht selbst angefordert haben, sollten Sie dem Vorgang nicht zustimmen."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Meine Daten sichern"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nicht sichern"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Geben Sie ein Passwort für die Verschlüsselung der vollständigen Sicherungsdaten ein. Wenn Sie dieses Feld leer lassen, wird Ihr aktuelles Sicherungspasswort verwendet:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Wenn Sie die gesamten Sicherungsdaten verschlüsseln möchten, geben Sie unten ein Passwort ein:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Geben Sie das Passwort unten ein, wenn die Daten für die Wiederherstellung verschlüsselt sind:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Sicherung wird gestartet..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Sicherung abgeschlossen"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Wiederherstellung wird gestartet..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Wiederherstellung beendet"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Zeitüberschreitung bei Vorgang"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-el/strings.xml b/packages/BackupRestoreConfirmation/res/values-el/strings.xml
index 9eb455588c54..7ea104e053c4 100644
--- a/packages/BackupRestoreConfirmation/res/values-el/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-el/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Πλήρες αντίγραφο ασφαλείας"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Πλήρης επαναφορά"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Έχει ζητηθεί ένα πλήρες αντίγραφο ασφαλείας όλων των δεδομένων σε έναν συνδεδεμένο επιτραπέζιο υπολογιστή. Θέλετε να επιτραπεί αυτή η ενέργεια;"\n\n"Αν δεν έχετε ζητήσει οι ίδιοι αυτό το αντίγραφο ασφαλείας, μην επιτρέψετε την ενέργεια."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Δημιουργία αντιγράφων ασφαλείας για τα δεδομένα μου"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Να μην δημιουργείται αντίγραφο ασφαλείας"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Εισαγάγετε έναν κωδικό πρόσβασης για χρήση για την κωδικοποίηση του πλήρους αντιγράφου ασφαλείας δεδομένων. Αν μείνει κενό, θα χρησιμοποιηθεί ο τρέχων κωδικός σας πρόσβασης:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Αν θέλετε να κρυπτογραφήσετε τα πλήρη δεδομένα αντιγράφων ασφαλείας, πληκτρολογήστε έναν κωδικό πρόσβασης παρακάτω:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Εάν η επαναφορά των δεδομένων είναι κρυπτογραφημένη, εισάγετε τον κωδικό πρόσβασης παρακάτω:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Έναρξη διαδικασίας δημιουργίας αντιγράφου ασφαλείας..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Ολοκληρώθηκε η διαδικασία δημιουργίας αντιγράφου ασφαλείας"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Έναρξη διαδικασίας επαναφοράς..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Έληξε η διαδικασία επαναφοράς"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Λήξη χρονικού ορίου λειτουργίας"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml b/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
index 79f5a9a55409..2f1eb52fff08 100644
--- a/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Realización de la copia de seguridad completa"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restauración completa"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Se ha solicitado una copia de seguridad completa de todos los datos en una computadora de escritorio conectada. ¿Deseas permitirla?"\n\n"Si tú no has solicitado la copia de seguridad, no permitas que se realice la operación."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Copia de seguridad de mis datos"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"No realizar una copia de seguridad"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduce una contraseña para encriptar los datos de la copia de seguridad completa. Si dejas este campo en blanco, se utilizará tu contraseña actual de copia de seguridad:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Si deseas encriptar los datos de la copia de seguridad completa, introduce una contraseña a continuación:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Si los datos de recuperación están encriptados, vuelve a introducir la contraseña a continuación:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Realizando la copia de seguridad..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"La realización de la copia de seguridad finalizó."</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Restaurando..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"La restauración finalizó."</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Se agotó el tiempo de espera para la operación."</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-es/strings.xml b/packages/BackupRestoreConfirmation/res/values-es/strings.xml
index 8ae476285d89..359c54c9f049 100644
--- a/packages/BackupRestoreConfirmation/res/values-es/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-es/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Copia de seguridad completa"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restauración completa"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Se ha solicitado una copia de seguridad completa de todos los datos en un ordenador conectado. ¿Quieres permitir la copia de seguridad?"\n\n"No debes permitir la copia de seguridad si no has realizado tú la solicitud."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Copia de seguridad de datos"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"No hacer copia de seguridad"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduce la contraseña que quieras usar para cifrar los datos de la copia de seguridad completa. Si dejas este campo en blanco, se usará tu contraseña de copia de seguridad actual:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Si quieres cifrar los datos de la copia de seguridad completa, introduce la contraseña a continuación:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Si los datos de restauración están cifrados, introduce la contraseña a continuación:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Iniciando copia de seguridad..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Copia de seguridad finalizada"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Iniciando restauración..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Restauración finalizada"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Tiempo de espera de operación agotado"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-fa/strings.xml b/packages/BackupRestoreConfirmation/res/values-fa/strings.xml
index c4f8da4e8274..4fce490b8c5e 100644
--- a/packages/BackupRestoreConfirmation/res/values-fa/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-fa/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"پشتیبان‌گیری کامل"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"بازیابی کامل"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"درخواست پشتیبان گیری کامل از تمام داده‌ها به یک رایانه دسک‌تاپ متصل داده شده است. آیا می‌خواهید این عمل انجام شود؟"\n\n"اگر شما درخواست تهیه نسخه پشتیبان را نداده‌اید، اجازه‌ ادامه عملیات را ندهید."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"از داده‌های من نسخه پشتیبان تهیه شود"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"نسخه پشتیبان تهیه نشود"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"لطفاً یک گذرواژه برای رمزگذاری داده‌های کامل نسخه پشتیبانی وارد کنید. اگر این خالی بماند، گذرواژه فعلی نسخه پشتیبان مورد استفاده قرار خواهد گرفت:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"اگر می‌خواهید تمام نسخه پشتیبانی داده را رمزدار کنید، یک گذرواژه در زیر وارد کنید:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"اگر داده بازیابی شده رمزگذاری شده است، لطفاً گذرواژه را در زیر وارد کنید:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"شروع پشتیبان‌گیری..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"پشتیبان‌گیری پایان یافت"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"شروع بازیابی..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"بازیابی پایان یافت"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"مهلت عملیات تمام شد"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-fi/strings.xml b/packages/BackupRestoreConfirmation/res/values-fi/strings.xml
index f50ce6a043e9..7badc7c5256a 100644
--- a/packages/BackupRestoreConfirmation/res/values-fi/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-fi/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Täysi varmuuskopiointi"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Täysi palautus"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Kytketyn tietokoneen kaikista tiedoista on pyydetty täydellistä varmuuskopiota. Haluatko sallia tämän?"\n\n"Jos et ole itse pyytänyt varmuuskopiota, älä salli toimintoa."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Varmuuskopioi omat tiedot"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Älä varmuuskopioi"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Anna salasana kaikkien varmuuskopiotietojen salaamiseksi. Jos tämä jätetään tyhjäksi, nykyistä varmuuskopioinnin salasanaa käytetään:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jos haluat salata kaikki varmuuskopiotiedot, kirjoita salasana alle:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jos palautustiedot on salattu, anna salasana alla:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Varmuuskopiointi alkaa..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Varmuuskopiointi valmis"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Palautus alkaa..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Palautus päättyi"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Toiminnon aikakatkaisu"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-fr/strings.xml b/packages/BackupRestoreConfirmation/res/values-fr/strings.xml
index 31d1532d4fde..caa52a3037df 100644
--- a/packages/BackupRestoreConfirmation/res/values-fr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-fr/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Sauvegarde complète"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restauration complète"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Vous avez demandé une sauvegarde complète de l\'ensemble des données vers un ordinateur de bureau connecté. Voulez-vous l\'autoriser ?"\n\n"Si vous n\'avez pas demandé la sauvegarde vous-même, n\'autorisez pas la poursuite de l\'opération."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sauvegarder mes données"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ne pas sauvegarder"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Veuillez saisir un mot de passe à utiliser pour chiffrer les données de sauvegarde complète. Si ce champ n\'est pas renseigné, votre mot de passe de sauvegarde actuel sera utilisé :"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Si vous souhaitez chiffrer l\'ensemble des données de sauvegarde, veuillez saisir un mot de passe ci-dessous :"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Si les données de restauration sont chiffrées, veuillez saisir le mot de passe ci-dessous :"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Démarrage de la sauvegarde..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Sauvegarde terminée"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Démarrage de la restauration..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Restauration terminée"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"L\'opération a expiré."</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-hr/strings.xml b/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
index ce06db9fe2cb..26992d621210 100644
--- a/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Puna sigurnosna kopija"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Potpuno vraćanje"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Zatražena je potpuna sigurnosna kopija svih podataka na povezano stolno računalo. Želite li to dozvoliti?"\n\n"Ako niste vi zatražili sigurnosnu kopiju, ne dozvolite nastavak te radnje."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Izradi sigurnosnu kopiju mojih podataka"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ne radi sigurnosnu kopiju"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Unesite zaporku koju ćete upotrebljavati za kriptiranje podataka potpune sigurnosne kopije. Ako je ostavite praznom, bit će upotrijebljena vaša trenutačna zaporka za sigurnosno kopiranje:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ako želite kriptirati podatke potpune sigurnosne kopije, u nastavku unesite zaporku:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ako su podaci za vraćanje kriptirani, unesite zaporku u nastavku:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Započinje stvaranje sigurnosne kopije..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Sigurnosna kopija dovršena"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Započinje vraćanje..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Vraćanje završeno"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Isteklo je vrijeme operacije"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-hu/strings.xml b/packages/BackupRestoreConfirmation/res/values-hu/strings.xml
index b244f2636a8d..5d690796a069 100644
--- a/packages/BackupRestoreConfirmation/res/values-hu/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hu/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Teljes biztonsági mentés"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Teljes helyreállítás"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Kérés érkezett az összes adat biztonsági mentésére egy csatlakoztatott asztali számítógépre. Engedélyezi, hogy ez megtörténjen?"\n\n"Ha nem Ön kérte a mentést, ne engedélyezze a művelet folytatását."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Adatok biztonsági mentése"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ne mentsen"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Kérjük, írjon be egy jelszót a teljes biztonsági mentés adatainak titkosításához. Ha üresen hagyja, jelenlegi biztonsági jelszavát fogjuk használni:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ha minden mentett adatot szeretne titkosítani, adjon meg egy jelszót alább:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ha a visszaállítási adatok titkosítva vannak, kérjük, adja meg a jelszót alább:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Biztonsági mentés indítása..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"A biztonsági mentés befejeződött"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Helyreállítás indítása..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"A helyreállítás véget ért"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"A művelet túllépte az időkeretet"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-in/strings.xml b/packages/BackupRestoreConfirmation/res/values-in/strings.xml
index 5a26304f423b..adf66361099a 100644
--- a/packages/BackupRestoreConfirmation/res/values-in/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-in/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Pencadangan sepenuhnya"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Pemulihan sepenuhnya"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Cadangan lengkap semua data ke komputer yang tersambung telah diminta. Apakah Anda ingin mengizinkan hal ini dilakukan?"\n\n"Jika Anda tidak meminta pencadangan ini, jangan izinkan operasi dilanjutkan."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Cadangkan data saya"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Jangan mencadangkan"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Masukkan sandi yang digunakan untuk mengenkripsi data cadangan lengkap. Jika bidang ini dikosongkan, sandi cadangan Anda saat ini akan digunakan:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jika Anda ingin mengenkripsi data cadangan lengkap, masukkan sandi di bawah:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jika data pemulihan dienkripsi, masukkan sandi di bawah:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Pencadangan dimulai..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Pencadangan selesai"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Pemulihan dimulai..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Pemulihan berakhir"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Waktu tunggu operasi habis"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-iw/strings.xml b/packages/BackupRestoreConfirmation/res/values-iw/strings.xml
index 056b24532dc2..fe1aa27a207f 100644
--- a/packages/BackupRestoreConfirmation/res/values-iw/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-iw/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"גיבוי מלא"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"שחזור מלא"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"הוגשה בקשה לגיבוי מלא של כל הנתונים במחשב שולחני מחובר. האם אתה רוצה לאפשר פעולה זו? "\n\n"אם לא ביקשת את הגיבוי בעצמך, אל תאפשר לפעולה להמשיך."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"גבה את הנתונים שלי"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"אל תגבה"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"הזן סיסמה שתשמש להצפנה של נתוני הגיבוי המלא. אם תשאיר שדה זה ריק, ייעשה שימוש בסיסמת הגיבוי הנוכחית שלך:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"אם אתה רוצה להצפין את נתוני הגיבוי המלא, הזן סיסמה בהמשך:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"אם נתוני השחזור מוצפנים, הזן את הסיסמה למטה:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"מתחיל בגיבוי..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"הגיבוי הסתיים"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"מתחיל בשחזור..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"השחזור הסתיים"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"פרק הזמן שהוקצב לפעולה הסתיים"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ja/strings.xml b/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
index 9b575c9daa0b..646e69d4f6e0 100644
--- a/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"フルバックアップ"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"完全な復元"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"接続しているデスクトップパソコンに対してすべてのデータのフルバックアップを行うようリクエストされています。許可しますか?"\n\n"ご自分でバックアップをリクエストしていない場合は、この操作の続行を許可しないでください。"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"データをバックアップ"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"バックアップしない"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"フルバックアップデータの暗号化に使用するパスワードを入力してください。空白のままにした場合、現在のバックアップ用のパスワードが使用されます:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"フルバックアップのデータを暗号化する場合は、以下にパスワードを入力してください:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"復元するデータが暗号化されている場合、以下にパスワードを入力してください:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"バックアップを開始しています..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"バックアップが終了しました"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"復元を開始しています..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"復元が終了しました"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"操作がタイムアウトしました"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ko/strings.xml b/packages/BackupRestoreConfirmation/res/values-ko/strings.xml
index 0fca3cdadd29..12e044ebe319 100644
--- a/packages/BackupRestoreConfirmation/res/values-ko/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ko/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"전체 백업"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"전체 복원"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"연결된 데스크톱 컴퓨터에 대한 전체 데이터 백업을 요청했습니다. 백업을 실행하시겠습니까?"\n\n"직접 백업을 요청한 것이 아니라면 작업을 진행하지 마시기 바랍니다."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"데이터 백업"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"백업하지 않음"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"전체 백업 데이터를 암호화하려면 사용할 비밀번호를 입력하세요. 공백으로 남겨 두면 현재 백업 비밀번호가 사용됩니다."</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"전체 백업 데이터를 암호화하려면 아래에 비밀번호를 입력하세요."</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"복원 데이터가 암호화되어 있는 경우, 아래에 비밀번호를 입력하세요."</string>
- <string name="toast_backup_started" msgid="550354281452756121">"백업 시작 중..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"백업을 완료했습니다."</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"복원 시작 중..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"복원이 종료되었습니다."</string>
- <string name="toast_timeout" msgid="5276598587087626877">"작업 시간이 초과되었습니다."</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-lt/strings.xml b/packages/BackupRestoreConfirmation/res/values-lt/strings.xml
index bd49320142c2..fdd91f145790 100644
--- a/packages/BackupRestoreConfirmation/res/values-lt/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-lt/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Visos atsarginės kopijos kūrimas"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Visas atkūrimas"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Prijungtame staliniame kompiuteryje pageidauta sukurti visų duomenų atsarginę kopiją. Ar norite, kad tai būtų atlikta?"\n\n"Jei patys atsarginės kopijos kurti neprašėte, neleiskite pradėti operacijos."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Kurti atsarginę duomenų kopiją"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nekurti atsarginės kopijos"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Įveskite slaptažodį, kuris bus naudojamas visai atsarginei duomenų kopijai šifruoti. Jei reikšmės neįvesite, bus naudojamas dabartinis atsarginės kopijos slaptažodis:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jei norite užšifruoti visą atsarginę duomenų kopiją, įveskite slaptažodį:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jei atkūrimo duomenys užšifruoti, įveskite toliau nurodytą slaptažodį:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Pradedama kurti atsarginę kopiją..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Atsarginė kopija sukurta"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Pradedamas atkūrimas..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Atkurta"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Operacijos skirtasis laikas baigėsi"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-lv/strings.xml b/packages/BackupRestoreConfirmation/res/values-lv/strings.xml
index a6f3d6730c99..b53e50150f8d 100644
--- a/packages/BackupRestoreConfirmation/res/values-lv/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-lv/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Pilna dublēšana"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Pilna atjaunošana"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Ir pieprasīta visu datu pilnīga dublēšana savienotā galda datorā. Vai vēlaties to atļaut?"\n\n"Ja neesat pieprasījis dublēšanu, neatļaujiet turpināt šo darbību."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Dublēt manus datus"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Neveidot dublējumu"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Lūdzu, ievadiet paroli, kas tiks izmantota dublējuma datu pilnīgai šifrēšanai. Ja paroles lauciņu atstāsiet tukšu, tiks izmantota jūsu pašreizējā dublējuma parole:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ja vēlaties pilnībā šifrēt dublējuma datus, tālāk ievadiet paroli:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ja atjaunošanas dati ir šifrēti, lūdzu, ievadiet tālāk paroli:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Tiek sākta dublēšana..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Dublēšana ir pabeigta."</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Tiek sākta atjaunošana..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Atjaunošana tika beigta."</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Iestājās darbības noildze."</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-nb/strings.xml b/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
index a54138d08358..d0435df52aff 100644
--- a/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Fullstendig sikkerhetskopi"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Fullstendig gjenoppretting"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"En full sikkerhetskopi av alle dataene til en tilkoblet stasjonær datamaskin er forespurt. Vil du tillate dette?"\n\n"Hvis du ikke har bedt om sikkerhetskopieringen selv, må du ikke tillate at operasjonen fortsetter."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhetskopier dataene mine"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ikke sikkerhetskopiér"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Skriv inn et passord for kryptering av full sikkerhetskopi. Hvis feltet er tomt, brukes det gjeldende passordet ditt for sikkerhetskopiering:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Hvis du vil kryptere alle de sikkerhetskopierte dataene, skriver du inn et passord nedenfor:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Hvis de gjenopprettede dataene er krypterte, må du skrive inn passordet nedenfor:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Sikkerhetskopiering er i gang …"</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Sikkerhetskopieringen er fullført"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Gjenopprettingen er i gang …"</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Gjenopprettingen er fullført"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Handlingen ble tidsavbrutt"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-nl/strings.xml b/packages/BackupRestoreConfirmation/res/values-nl/strings.xml
index 24e6c3b2e600..f32ba27e4027 100644
--- a/packages/BackupRestoreConfirmation/res/values-nl/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-nl/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Volledige back-up"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Volledig herstel"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Er is een volledige back-up van alle gegevens naar een verbonden desktopcomputer aangevraagd. Wilt u dit toestaan?"\n\n"Als u de back-up zelf niet heeft aangevraagd, moet u niet toestaan dat de bewerking wordt uitgevoerd."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Back-up maken van mijn gegevens"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Geen back-up maken"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Geef een wachtwoord op dat u wilt gebruiken voor het coderen van de gegevens van de volledige back-up. Als u dit leeg laat, wordt uw huidige back-upwachtwoord gebruikt:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Als u de gegevens van de volledige back-up wilt coderen, geeft u daarvoor hieronder een wachtwoord op:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Als deze herstelgegevens zijn gecodeerd, geeft u hieronder het wachtwoord op:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Back-up starten..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Back-up voltooid"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Herstel starten..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Herstellen voltooid"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Time-out voor bewerking"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-pl/strings.xml b/packages/BackupRestoreConfirmation/res/values-pl/strings.xml
index 04552d6abba9..87961a981af5 100644
--- a/packages/BackupRestoreConfirmation/res/values-pl/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pl/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Pełna kopia zapasowa"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Pełne przywracanie"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Zażądano wykonania pełnej kopii zapasowej wszystkich danych na podłączonym komputerze stacjonarnym. Czy chcesz na to zezwolić?"\n\n"Jeśli żądanie utworzenia kopii zapasowej nie pochodzi od Ciebie, nie zezwalaj na kontynuowanie tej operacji."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Utwórz kopię zapasową danych"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nie twórz kopii zapasowej"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Wpisz hasło do zaszyfrowania pełnej kopii zapasowej. Jeśli pozostawisz puste pole, zostanie użyte aktualne hasło kopii zapasowej:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jeśli chcesz zaszyfrować pełną kopię zapasową, wprowadź poniżej hasło:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jeśli przywracane dane są zaszyfrowane, wpisz poniżej hasło:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Tworzenie kopii zapasowej..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Utworzono kopię zapasową"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Przywracanie..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Przywracanie zakończone"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Operacja przekroczyła czas oczekiwania"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml b/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml
index 3eca061a6589..309b8cec5b93 100644
--- a/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pt-rPT/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Cópia de segurança completa"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restauro completo"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Foi solicitada uma cópia de segurança completa de todos os dados para um computador de secretária. Pretende permitir esta operação?"\n\n"Caso não tenha solicitado a cópia de segurança, não permita que a operação prossiga."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Fazer cópia de seg. dos dados"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Não efetuar cópia de seg."</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduza uma palavra-passe a utilizar para encriptar os dados da cópia de segurança completa. Se deixar o campo em branco, será utilizada a palavra-passe de cópia de segurança atual."</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Se pretender encriptar os dados da cópia de segurança completa, introduza uma palavra-passe abaixo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Se os dados a restaurar estiverem encriptados, introduza a palavra-passe abaixo:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"A iniciar cópia de segurança..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Cópia de segurança concluída"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"A iniciar restauro..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Restauro concluído"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Tempo limite da operação excedido"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-pt/strings.xml b/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
index 680b538589b0..6be6fca069ba 100644
--- a/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Backup completo"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restauração completa"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Foi solicitado um backup completo de todos os dados para um computador conectado. Deseja permitir que isso aconteça?"\n\n"Caso você não tenha solicitado o backup, não permita que a operação prossiga."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Fazer backup de meus dados"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Não fazer backup"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Digite uma senha para usar para criptografar os dados de backup por completo. Se isso for deixado em branco, sua senha atual de backup será usada:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Se você deseja criptografar os dados de backup por completo, digite uma senha abaixo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Se os dados restaurados forem criptografada, digite a senha abaixo:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Iniciando backup..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"O backup foi concluído"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Iniciando restauração..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"A restauração foi concluída"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"A operação atingiu o tempo limite"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
index 715f312d1c4d..871fec55b595 100644
--- a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Copie de rezervă completă"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Restaurare completă"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"S-a solicitat crearea unei copii de rezervă complete a tuturor datelor pe un computer desktop conectat. Doriţi să permiteţi acest lucru?"\n\n"Dacă nu aţi solicitat dvs. copierea de rezervă, nu permiteţi ca operaţiunea să continue."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Creaţi copii de rezervă pentru datele dvs."</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nu creaţi copii de rezervă"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduceţi o parolă pentru a o utiliza la criptarea datelor copiei de rezervă complete. Dacă acest câmp rămâne necompletat, pentru copierea de rezervă se va utiliza parola dvs. actuală."</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Dacă doriţi să criptaţi datele copiei de rezervă complete, introduceţi o parolă mai jos:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Dacă datele pentru restabilire sunt criptate, introduceţi parola mai jos:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Se începe crearea copiei de rezervă..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Copia de rezervă a fost finalizată"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Se porneşte restaurarea..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Restaurarea s-a încheiat"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Operaţia a expirat"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ru/strings.xml b/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
index 91c57550e916..c064e46f9eba 100644
--- a/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Полное резервное копирование"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Полное восстановление"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Запрошено резервное копирование всех данных на подключенном компьютере. Разрешить?"\n\n"Если вы не запрашивали этого, не разрешайте выполнение операции."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Создать резервную копию данных"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Не создавать резервную копию"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Введите пароль для шифрования всех резервных данных. Если поле останется пустым, будет использован текущий пароль:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Чтобы зашифровать все резервные данные, введите пароль:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Если восстановленные данные зашифрованы, введите пароль:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Резервное копирование..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Резервное копирование завершено"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Восстановление..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Восстановление завершено"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Время ожидания истекло"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-sk/strings.xml b/packages/BackupRestoreConfirmation/res/values-sk/strings.xml
index bc8ff976366e..0314c910cbda 100644
--- a/packages/BackupRestoreConfirmation/res/values-sk/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-sk/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Úplná záloha"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Úplné obnovenie"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Bola vyžiadaná úplná záloha všetkých dát do pripojeného počítača. Chcete túto akciu povoliť?"\n\n"Ak ste zálohu nevyžiadali vy, túto operáciu nepovoľujte."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Zálohovať údaje"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nezálohovať"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Zadajte heslo, ktoré sa použije pri šifrovaní údajov úplnej zálohy. Ak pole ponecháte prázdne, použije sa vaše aktuálne heslo zálohy:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ak chcete šifrovať údaje úplnej zálohy, zadajte heslo nižšie:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ak sú údaje obnovenia šifrované, zadajte heslo nižšie:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Vytváranie zálohy..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Zálohovanie bolo dokončené"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Začína obnovenie..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Obnovenie bolo ukončené"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Časový limit operácie vypršal"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-sl/strings.xml b/packages/BackupRestoreConfirmation/res/values-sl/strings.xml
index 50a5d50bb387..7615042e7dfd 100644
--- a/packages/BackupRestoreConfirmation/res/values-sl/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-sl/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Popolna varnostna kopija"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Popolna obnova"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Zahtevano je popolno varnostno kopiranje vseh podatkov v povezanem računalniku. Ali želite to dovoliti?"\n\n"Če varnostnega kopiranja niste zahtevali, ne dovolite nadaljevanja postopka."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Varnostno kopiraj moje podatke"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Brez varnostnega kopiranja"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Vnesite geslo za šifriranje podatkov popolnega varnostnega kopiranja. Če to pustite prazno, bo uporabljeno trenutno geslo za varnostno kopiranje:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Če želite šifrirati vse varnostno kopirane podatke, spodaj vnesite geslo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Če so podatki za obnovitev šifrirani, spodaj vnesite geslo:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Varnostno kopiranje se začenja ..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Varnostno kopiranje je končano"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Obnova se začenja ..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Obnova je končana"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Časovna omejitev postopka je potekla"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-sr/strings.xml b/packages/BackupRestoreConfirmation/res/values-sr/strings.xml
index 1573dc78d5cb..094eb1229157 100644
--- a/packages/BackupRestoreConfirmation/res/values-sr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-sr/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Прављење резервне копије свих података"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Потпуно враћање"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Захтевана је потпуна резервна копија свих података на повезани стони рачунар. Да ли желите да дозволите то?"\n\n"Ако нисте лично захтевали резервну копију, не дозвољавајте наставак радње."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Направи резервну копију мојих података"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Не прави резервне копије"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Унесите лозинку коју ћете користити за шифровање података потпуне резервне копије. Ако то поље оставите празно, користиће се тренутна лозинка резервне копије:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ако желите да шифрујете податке потпуне резервне копије, унесите лозинку у наставку."</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ако су подаци за враћање шифровани, унесите лозинку у наставку:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Покретање прављења резервне копије..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Прављење резервне копије је завршено"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Покретање враћања..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Враћање је завршено"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Време за операцију је истекло"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-sv/strings.xml b/packages/BackupRestoreConfirmation/res/values-sv/strings.xml
index 4ac0a540b90c..8df6544949da 100644
--- a/packages/BackupRestoreConfirmation/res/values-sv/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-sv/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Fullständig säkerhetskopiering"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Fullständig återställning"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"En fullständig säkerhetskopia av alla data till en ansluten dator har begärts. Vill du tillåta detta?"\n\n"Om du inte själv begärde säkerhetskopian ska du inte tillåta detta."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Säkerhetskopiera mina data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Säkerhetskopiera inte"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Ange ett lösenord för kryptering av alla säkerhetskopierade data. Om det här lämnas tomt kommer ditt nuvarande lösenord för säkerhetskopior att användas:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Om du vill kryptera alla säkerhetskopierade data anger du ett lösenord nedan:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Om återställda data är krypterade anger du lösenordet nedan:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Säkerhetskopieringen har startat ..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Säkerhetskopieringen har slutförts"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Återställningen har startat ..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Återställningen har avslutats"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Tidsgränsen för åtgärden har överskridits"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-sw/strings.xml b/packages/BackupRestoreConfirmation/res/values-sw/strings.xml
index 2069d831a7ba..810ad4e83df3 100644
--- a/packages/BackupRestoreConfirmation/res/values-sw/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-sw/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Kuhifadhi kikamilifu"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Kurejeza kamili"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Chelezo kamili la data iliyounganishwa kwenye eneo kazi la kompyuta limeombwa. Unataka kuruhusu hii kutendeka?"\n\n" Ikiwa hukuomba chelezo mwenyewe, usikubali uendeshaji kuendelea."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Cheleza data yangu"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Usicheleze"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Tafadhali ingiza nenosiri la kutumia kwa usimbaji fiche wa chelezo ya data kamili. Ikiwa hii itawachwa wazi, nenosiri lako la sasa litatumika:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ikiwa unataka kusimba fiche data nzima ya kucheleza, ingiza nenosiri la hapo chini:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ikiwa data iliyorejeshwa upya, tafadhali ingiza nenosiri lililo hapo chini:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Inaanza kuhifadhi..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Imemaliza kuhifadhi"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Inaanza kurejeza..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Kurejeza kumekamilika"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Muda wa uendeshaji umeisha"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-th/strings.xml b/packages/BackupRestoreConfirmation/res/values-th/strings.xml
index 68af3b8228c8..3bc2ce667cd0 100644
--- a/packages/BackupRestoreConfirmation/res/values-th/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-th/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"การสำรองข้อมูลแบบเต็ม"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"การคืนค่าทั้งหมด"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"เราได้รับการขอให้ทำการสำรองข้อมูลทั้งหมดลงในคอมพิวเตอร์เดสก์ท็อปที่เชื่อมต่ออยู่ คุณต้องการอนุญาตให้ดำเนินการตามนี้หรือไม่"\n\n" หากคุณไม่ได้เป็นผู้ขอให้ทำการสำรองข้อมูลดังกล่าว โปรดอย่าอนุญาตให้ดำเนินการ"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"สำรองข้อมูลของฉัน"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"ไม่ต้องสำรองข้อมูล"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"โปรดป้อนรหัสผ่านเพื่อใช้สำหรับเข้ารหัสข้อมูลที่สำรองแบบเต็มรูปแบบ หากเว้นว่างไว้ รหัสผ่านการสำรองข้อมูลปัจจุบันของคุณจะถูกใช้:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"หากคุณต้องการเข้ารหัสข้อมูลที่สำรองเต็มรูปแบบ โปรดป้อนรหัสผ่านด้านล่างนี้:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"หากมีการเข้ารหัสข้อมูลที่คืนค่า โปรดป้อนรหัสผ่านด้านล่างนี้:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"กำลังเริ่มการสำรองข้อมูล..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"สำรองข้อมูลเสร็จแล้ว"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"กำลังเริ่มการคืนค่า..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"สิ้นสุดการคืนค่าแล้ว"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"หมดเวลาการดำเนินการ"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-tl/strings.xml b/packages/BackupRestoreConfirmation/res/values-tl/strings.xml
index 272b4064da9b..f54105d965fe 100644
--- a/packages/BackupRestoreConfirmation/res/values-tl/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-tl/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Ganap na pag-backup"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Ganap na pagpapanumbalik"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Hiniling ang isang buong pag-backup ng lahat ng data sa isang nakakonektang desktop computer. Gusto mo ba itong payagang maganap? "\n\n"Kung hindi ikaw mismo ang humiling ng pag-backup, huwag payagang magpatuloy ang pagpapatakbo."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"I-back up ang aking data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Huwag i-back up"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Mangyaring maglagay ng password na gamitin sa pag-e-encrypt ng buong data sa pag-backup. Kung iiwanan itong blangko, gagamitin ang iyong kasalukuyang backup na password:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Kung nais mong i-encrypt ang buong data ng backup, maglagay ng password sa ibaba:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Kung naka-encrypt ang data sa pagpapanumbalik, pakilagay ang password sa ibaba:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Sinisimulan ang pag-backup..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Tapos na ang pag-backup"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Sinisimulan ang pagpapanumbalik..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Natapos na ang pagpapanumbalik"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Naubusan ng oras ang pagpapatakbo"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-tr/strings.xml b/packages/BackupRestoreConfirmation/res/values-tr/strings.xml
index 2bbdd3397e15..0f610dd17a95 100644
--- a/packages/BackupRestoreConfirmation/res/values-tr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-tr/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Tam yedekleme"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Tam geri yükleme"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Tüm verilerin bağlı bir masaüstü bilgisayara tam olarak yedeklenmesi için istekte bulunuldu?"\n\n"Yedekleme isteğinde siz bulunmadıysanız, işlemin devam etmesine izin vermeyin."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Verilerimi yedekle"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Yedekleme"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Tam yedekleme verilerini şifrelemek için lütfen bir şifre girin. Boş bırakılırsa, mevcut yedekleme şifreniz kullanılır:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Yedeklenen tüm verileri şifrelemek isterseniz, aşağıya bir şifre girin:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Geri yükleme verileri şifreliyse, lütfen şifreyi aşağıya girin:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Yedekleme başlıyor..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Yedekleme işlemi sona erdi"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Geri yükleme başlıyor..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Geri yükleme işlemi sona erdi"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"İşlem zaman aşımına uğradı"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-uk/strings.xml b/packages/BackupRestoreConfirmation/res/values-uk/strings.xml
index a1c6f2cbb597..3c9fb97042e6 100644
--- a/packages/BackupRestoreConfirmation/res/values-uk/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-uk/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Повне резервне копіювання"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Повне відновлення"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Надійшов запит на повне резервне копіювання всіх даних на під’єднаний настільний комп’ютер. Дозволити це?"\n\n"Якщо ви не надсилали запит на резервне копіювання, не дозволяйте виконувати цю операцію."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Резервне копіювання даних"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Не створювати резервну копію"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Введіть пароль, який використовується для шифрування повного резервного копіювання даних. Якщо залишити це поле порожнім, буде використано поточний пароль резервного копіювання."</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Якщо ви хочете зашифрувати повне резервне копіювання даних, введіть пароль нижче:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Якщо дані для відновлення зашифровано, введіть пароль нижче:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Початок резервного копіювання..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Резервне копіювання закінчено"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Початок відновлення..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Відновлення закінчено"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Час виконання операції минув"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-vi/strings.xml b/packages/BackupRestoreConfirmation/res/values-vi/strings.xml
index ad98262839be..1a92acb68756 100644
--- a/packages/BackupRestoreConfirmation/res/values-vi/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-vi/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Sao lưu hoàn toàn"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Khôi phục hoàn toàn"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Đã yêu cầu sao lưu đầy đủ toàn bộ dữ liệu tới máy tính được kết nối. Bạn có muốn cho phép điều này xảy ra không?"\n\n"Nếu không phải bản thân bạn yêu cầu sao lưu, đừng cho phép thao tác này tiếp tục."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sao lưu dữ liệu của tôi"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Không sao lưu"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Vui lòng nhập mật khẩu dùng để mã hóa toàn bộ dữ liệu sao lưu. Nếu trường này bị bỏ trống, mật khẩu sao lưu hiện tại của bạn sẽ được sử dụng:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Nếu bạn muốn mã hóa toàn bộ dữ liệu sao lưu, hãy nhập mật khẩu bên dưới:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Nếu dữ liệu khôi phục được mã hóa, vui lòng nhập mật khẩu bên dưới:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Đang bắt đầu sao lưu..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Đã hoàn thành sao lưu"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Đang bắt đầu khôi phục..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Đã kết thúc quá trình khôi phục"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Thao tác hết thời gian chờ"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-zh-rCN/strings.xml b/packages/BackupRestoreConfirmation/res/values-zh-rCN/strings.xml
index dcaebd234236..bf44a0e76259 100644
--- a/packages/BackupRestoreConfirmation/res/values-zh-rCN/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-zh-rCN/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"完全备份"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"完全还原"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"系统请求将所有数据完整备份至已连接的桌面计算机。允许此操作吗?"\n\n"如果您本人未要求备份,请阻止该操作。"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"备份我的数据"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"不备份"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"请输入用于加密完整备份数据的密码。如果留空,系统将会使用您当前的备份密码:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"如果您想为整个备份数据加密,请在下方输入密码:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"如果恢复数据已加密,请在下方输入密码:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"开始备份..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"备份已完成"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"开始还原..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"还原已结束"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"操作超时"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml b/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
index 00c24df4f773..f61e44c7fcb7 100644
--- a/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"完整備份"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"完整還原"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"系統收到將所有資料完整備份至連線電腦的要求,請問您允許進行備份嗎?"\n\n"如果您本人並未提出備份要求,請勿允許繼續進行這項作業。"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"備份我的資料"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"不要備份"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"請輸入完整備份資料加密專用的密碼。如果您沒有輸入密碼,系統會使用您目前的備用密碼:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"如果您想要將完整備份資料進行加密,請在下面輸入一組密碼:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"如果還原的資料經過加密處理,請在下面輸入密碼:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"正在開始備份..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"備份完畢"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"正在開始還原..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"還原完畢"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"作業逾時"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-zu/strings.xml b/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
index 98e76cd822f7..822379f7d3a0 100644
--- a/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
@@ -16,8 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"Ukulondolozwa okuphelele"</string>
- <string name="restore_confirm_title" msgid="5469365809567486602">"Ukubuyisela okuphelele"</string>
+ <!-- no translation found for backup_confirm_title (827563724209303345) -->
+ <skip />
+ <!-- no translation found for restore_confirm_title (5469365809567486602) -->
+ <skip />
<string name="backup_confirm_text" msgid="1878021282758896593">"Kucelwe ukwesekelwa ngokulondoloza okuphelele kwayo yonke imininingo ekwi-desktop yekhompuyutha exhunyiwe. Angifuni ukuvumel alokhu ukuthi kwenzeke?"\n\n"Uma kuwukuthi awuzange ucele ukuthi kwesekelwe ngokulondoloza wena uqobo lwakho, ungavumeli ukuthi lolu hlelo luqhubekele phambili."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sekela ngokulondoloza imininingo yami"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ungenzi isipele"</string>
@@ -28,9 +30,14 @@
<string name="backup_enc_password_text" msgid="4981585714795233099">"Sicela ufake i-password ezosetshenziselwa ukubhala ngokufihlekileyo imininingo eyesekwe ngokulondoloza. Uma lokhu kushiywe kungabhalwe lutho, kuzosetshenziswa i-password yokweseka ngokulondoloza yamanje:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Uma ufuna ukufaka ikhowudi kwimininingo yonke eyesekelwe ngokulondoloza faka i-passowrd engezansi:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Uma insiza yokubuyiselwa esimweni kwmininingo ibhalwe ngokufihlekileyo, sicela ufake i-password ngezansi:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"Ukulondoloza kuyaqala..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"Ukulondoloza kuphelile"</string>
- <string name="toast_restore_started" msgid="7881679218971277385">"Ukubuyisa kuyaqala..."</string>
- <string name="toast_restore_ended" msgid="1764041639199696132">"Ukubuyiswa kuphelile"</string>
- <string name="toast_timeout" msgid="5276598587087626877">"Isikhathi senqubo siphelile"</string>
+ <!-- no translation found for toast_backup_started (550354281452756121) -->
+ <skip />
+ <!-- no translation found for toast_backup_ended (3818080769548726424) -->
+ <skip />
+ <!-- no translation found for toast_restore_started (7881679218971277385) -->
+ <skip />
+ <!-- no translation found for toast_restore_ended (1764041639199696132) -->
+ <skip />
+ <!-- no translation found for toast_timeout (5276598587087626877) -->
+ <skip />
</resources>
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 6e5f8567eea9..113f0f721d38 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -156,6 +156,7 @@ public class DefaultContainerService extends IntentService {
}
ret.packageName = pkg.packageName;
ret.installLocation = pkg.installLocation;
+ ret.verifiers = pkg.verifiers;
ret.recommendedInstallLocation = recommendAppInstallLocation(pkg.installLocation,
archiveFilePath, flags, threshold);
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
index 3137e7ee6e6f..908056fa1fd9 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
index b429222e2d67..69f3543d3a54 100644
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
index 5c98614016f8..9820a79d0bc9 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
index f5f2f7032db3..fb3098279da9 100644
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
index 7c6b8e5189e1..0b41317e4484 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/notification_row_bg.xml b/packages/SystemUI/res/drawable/notification_row_bg.xml
new file mode 100644
index 000000000000..dc626d18163c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/notification_row_bg.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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"
+ android:exitFadeDuration="@android:integer/config_mediumAnimTime">
+
+ <item android:state_pressed="true" android:drawable="@android:color/holo_blue_light" />
+ <item android:state_pressed="false" android:drawable="@drawable/notification_item_background_color" />
+</selector>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
index 167d362f3840..c6966f9b64a1 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -40,8 +40,8 @@
android:background="@drawable/recents_thumbnail_bg"
android:foreground="@drawable/recents_thumbnail_fg">
<ImageView android:id="@+id/app_thumbnail_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="@dimen/status_bar_recents_thumbnail_width"
+ android:layout_height="@dimen/status_bar_recents_thumbnail_height"
android:visibility="invisible"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
index de80a51adb52..586712f0cea9 100644
--- a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
@@ -38,8 +38,8 @@
android:background="@drawable/recents_thumbnail_bg"
android:foreground="@drawable/recents_thumbnail_fg">
<ImageView android:id="@+id/app_thumbnail_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="@dimen/status_bar_recents_thumbnail_width"
+ android:layout_height="@dimen/status_bar_recents_thumbnail_height"
android:visibility="invisible"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
index 07088d54546a..cd8ccd56e782 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
@@ -33,8 +33,8 @@
android:background="@drawable/recents_thumbnail_bg"
android:foreground="@drawable/recents_thumbnail_fg">
<ImageView android:id="@+id/app_thumbnail_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="@dimen/status_bar_recents_thumbnail_width"
+ android:layout_height="@dimen/status_bar_recents_thumbnail_height"
android:visibility="invisible"
/>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 41a30c79166a..eb644b3630b3 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -45,6 +45,12 @@
android:layout_gravity="center|bottom"
/>
</FrameLayout>
+ <View
+ android:layout_height="6dp"
+ android:layout_width="6dp"
+ android:visibility="gone"
+ android:id="@+id/spacer"
+ />
<FrameLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml
index ff8687838cf3..3220e62d3075 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_row.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml
@@ -23,6 +23,7 @@
android:layout_alignParentLeft="true"
android:scaleType="center"
android:clickable="true"
+ android:background="@*android:drawable/notify_panel_notification_icon_bg_tile"
/>
<com.android.systemui.statusbar.LatestItemView android:id="@+id/content"
@@ -33,14 +34,14 @@
android:layout_alignParentRight="true"
android:focusable="true"
android:clickable="true"
- android:background="@drawable/notification_item_background_color"
+ android:background="@drawable/notification_row_bg"
/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/notification_divider_height"
android:layout_alignParentBottom="true"
- android:background="@drawable/status_bar_notification_row_background_color"
+ android:background="@drawable/notification_item_background_color"
/>
</RelativeLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index f90c6cc459ed..fb0c3554be29 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Wys kennisgewings"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwyder uit lys"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Program Info"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Geen onlangse programme nie"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen kennisgewings"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Voortdurend"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Kennisgewings"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 4c4b3266f540..ed4cb9c6bd6f 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"ማሳወቂያዎች አሳይ"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ከዝርዝር አስወግድ"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"የትግበራ መረጃ"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ምንም የቅርብ ጊዜ ትግበራዎች የሉም"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ምንም ማሳወቂያዎች የሉም"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"በመካሄድ ላይ ያለ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ማሳወቂያዎች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index d418957e56d9..e0e464390ae0 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"إظهار التنبيهات"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"إزالة من القائمة"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"معلومات التطبيق"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ليس هناك تطبيقات حديثة"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 586b9762f8d7..b0172058aa84 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показване на известията"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Премахване от списъка"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информация за приложението"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Няма скорошни приложения"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Няма известия"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 275db6532299..c0f9f17bc6fa 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostra notificacions"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Elimina de la llista"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informació de l\'aplicació"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"No hi ha aplicacions recents"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 238a770e5424..902140947809 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Zobrazit upozornění"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odebrat ze seznamu"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informace o aplikaci"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Žádné nové aplikace"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žádná oznámení"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 1d004f9d5fb8..ea434e194106 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Vis meddelelser"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Oplysninger om appen"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Der er ingen seneste apps"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen meddelelser"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelelser"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index ee00670d6157..372b90378b08 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Benachrichtigungen zeigen"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Aus Liste entfernen"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-Info"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Keine neuen Apps"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Keine Benachrichtigungen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktuell"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 6db0d3c21a4a..803f7d982340 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Εμφάνιση ειδοποιήσεων"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Κατάργηση από τη λίστα"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Πληροφορίες εφαρμογής"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Δεν υπάρχουν πρόσφατες εφαρμογές"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Εν εξελίξει"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 61d497f94429..a66ed40cf78d 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Show notifications"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"No recent apps"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 050f72e52d70..bf0686dce6e2 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificaciones"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ninguna aplicación reciente"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No hay notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index f4c1be92cc0e..870a1662e119 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificaciones"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"No hay aplicaciones recientes."</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 04ff8bd0987f..0224983dd27d 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"نمایش اعلان ها"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"حذف از لیست"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"اطلاعات برنامه"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"برنامه جدیدی موجود نیست"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان ها"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index ce633e979240..73c36ceaa61e 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Näytä ilmoitukset"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Poista luettelosta"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Sovelluksen tiedot"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ei viimeisimpiä sovelluksia"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index b20142fcad97..b20c4be01a98 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Afficher les notifications"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer de la liste"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informations sur l\'application"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Aucune application récente."</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 07a9a653d051..9c99d28b55c7 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Prikaži obavijesti"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ukloni s popisa"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacije o aplikaciji"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nema nedavnih aplikacija"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bez obavijesti"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index fa2219dd905e..7bc1789e64f1 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Értesítések megjelenítése"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eltávolítás a listából"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Alkalmazásinformáció"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nincs újabb alkalmazás"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nincs értesítés"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 3347ce921c2a..999ea1d82902 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Tampilkan pemberitahuan"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Hapus dari daftar"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info apl"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Tidak ada apl terbaru"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 197d98988d03..becfe01e8dc3 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostra notifiche"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Rimuovi dall\'elenco"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informazioni applicazione"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nessuna applicazione recente"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nessuna notifica"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"In corso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 8194542cbe36..567f2b92bb9e 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"הצג התראות"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר מהרשימה"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי יישום"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"אין יישומים אחרונים"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין התראות"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתמשך"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index f2fb58b74dd2..ffb0227242fc 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"通知を表示"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"リストから削除"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"アプリ情報"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"最近使ったアプリはありません"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index ceceda4e6a44..417664d01ba9 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"알림 표시"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"목록에서 삭제"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"앱 정보"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"최근에 사용한 앱 없음"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 94fe4e67ab47..aff4f0869338 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rodyti pranešimus"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Pašalinti iš sąrašo"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Programos informacija"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nėra naujausių programų"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nėra įspėjimų"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Įspėjimai"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index b381f0561cf6..822639cf1255 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rādīt paziņojumus"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Noņemšana no saraksta"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Lietotnes informācija"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nav nesen izmantotu lietotņu."</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index cfdd68a20b7c..4bbae0136e49 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Tunjukkan pemberitahuan"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alih keluar dari senarai"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Maklumat aplikasi"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Tiada aplikasi terbaharu"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index b5ead99f4f52..e3c53b8b75ae 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Vis varslinger"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om app"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ingen nylige apper"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen varslinger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varslinger"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 44e1b546ee2b..d598e6132048 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Meldingen weergeven"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwijderen uit lijst"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-info"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Geen recente apps"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen meldingen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actief"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 58b852d4008b..a9bf53bc91d7 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Pokaż powiadomienia"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Usuń z listy"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacje o aplikacji"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Brak ostatnio uruchomionych aplikacji."</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Brak powiadomień"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index d2a6dc4899ca..f2d0c2a5b08d 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificações"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações da aplicação"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Não existem aplicações recentes"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index faa46a97e1a1..c9ed8f2475c4 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificações"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do aplicativo"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nenhum aplicativo recente"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index cdb7c26be55c..33dc26c01db6 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Afişaţi notificări"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminaţi din listă"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informaţii despre aplicaţie"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Nu există aplicaţii recente"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nicio notificare"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfăşurare"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index ff1fa0d4edcf..f1ede406cafb 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показать уведомления"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Удаление приложения из списка"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Сведения о приложении"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Нет данных"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 1b91da84c363..ac0bcda86039 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Zobraziť upozornenia"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrániť zo zoznamu"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informácie o aplikácii"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Žiadne nedávne aplikácie"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e95b241ee1f0..1f8d0d2a88cf 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Pokaži obvestila"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrani s seznama"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Podatki o programu"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ni nedavnih programov"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 08c0dd35170e..47f6884bfffe 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Приказуј упозорења"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Уклањање са листе"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информације о апликацији"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Нема недавних апликација"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема обавештења"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index a5ce417d38e2..dc1f56ba6fd3 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Visa aviseringar"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ta bort från listan"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om appen"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Inga nya appar"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelanden"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 3d708d84f6bc..bb8e740ce623 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Onyesha arifa"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ondoa kwenye orodha"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Taarifa za programu-matumizi"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Hakuna programu za sasa"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Hakuna arifa"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Inaendelea"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Arifa"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index b7c57b738db7..490760f4dfcf 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"แสดงการแจ้งเตือน"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ลบจากรายการ"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ข้อมูลแอปพลิเคชัน"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ไม่มีแอปพลิเคชันล่าสุด"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index b9748e1e88e7..f1de297d83e0 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Magpakita ng notification"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alisin mula sa listahan"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Impormasyon ng app"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Walang kamakailang apps"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 2383cbbeb4f2..4dae91192f40 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Bildirimleri göster"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Listeden kaldır"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Uygulama bilgileri"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Son uygulama yok"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildirim yok"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sürüyor"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirimler"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 95b2b36f3803..fc90f1348913 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показувати сповіщення"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Видалити зі списку"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Інформація про програму"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Немає останніх програм"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 16dc6d4ec296..a4108ac9af44 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Hiển thị thông báo"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Xóa khỏi danh sách"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Thông tin về ứng dụng"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Không có ứng dụng nào gần đây"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b728c13c09c8..b073ac2c616a 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"显示通知"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"从列表中删除"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"应用程序信息"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"最近没有运行任何应用程序"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 0359bcc86c87..1b697902add4 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"顯示通知"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"沒有最近使用的應用程式"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"沒有通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 51f14b1d9857..24c0145ee26c 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -25,7 +25,8 @@
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Bonisa izaziso"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Susa ohlwini"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ulwazi lwensiza"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Azikho izinhlelo zokusebenza zakamuva"</string>
+ <!-- no translation found for status_bar_no_recent_apps (6576392951053994640) -->
+ <skip />
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Azikho izaziso"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Izaziso"</string>
@@ -48,13 +49,13 @@
<string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"Misa izindlela zokufakwayo"</string>
<string name="status_bar_use_physical_keyboard" msgid="3695516942412442936">"Sebenzisa ikhibhodi ebangekayo"</string>
<string name="usb_device_permission_prompt" msgid="3816016361969816903">"Vumela uhlelo lokusebenza <xliff:g id="APPLICATION">%1$s</xliff:g> lufinyelele idivayisi ye-USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="6888598803988889959">"Vumela uhlelo lokusebenza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuze ufinyelele kwizinto eziphuma ne-USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="6888598803988889959">"Vumela uhlelo lokusebenza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuze ufinyelele izinto eziphuma ne-USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Vula <xliff:g id="ACTIVITY">%1$s</xliff:g> uma ledivayisi ye-USB ixhunyiwe?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Vula <xliff:g id="ACTIVITY">%1$s</xliff:g> uma le-accessory ye-USB ixhunyiwe"</string>
<string name="usb_accessory_uri_prompt" msgid="6332150684964235705">"Azikho izinhlelo zokusebenza zisebenze ngento ze-USB. Funda okwengeziwe ngalento<xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"ama-accessory e-USB"</string>
<string name="label_view" msgid="6304565553218192990">"Buka"</string>
- <string name="always_use_device" msgid="1450287437017315906">"Sebenzisa ngokuzenzakalelayo yale divayisi ye-USB"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Sebenzisa ngokuzenzakalelayo yaledivayisi ye-USB"</string>
<string name="always_use_accessory" msgid="1210954576979621596">"Sebenzisa ngokuzenzakalelayo kule-accessory ye-USB"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index e780ae62ccb7..5ba19084e066 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -25,7 +25,7 @@
<drawable name="status_bar_recents_app_thumbnail_background">#88000000</drawable>
<color name="status_bar_recents_app_label_color">#ffffffff</color>
<drawable name="status_bar_notification_row_background_color">#ff090909</drawable>
- <drawable name="notification_header_bg">#FF000000</drawable>
+ <drawable name="notification_header_bg">#d8000000</drawable>
<drawable name="notification_tracking_bg">#d8000000</drawable>
<color name="notification_list_shadow_top">#80000000</color>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index ee97af2e6857..54bc4e360b37 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -129,7 +129,7 @@ public class RecentsPanelView extends RelativeLayout
}
public void setThumbnail(Bitmap thumbnail) {
- mThumbnail = compositeBitmap(mDefaultThumbnailBackground, thumbnail);
+ mThumbnail = thumbnail;
}
public Bitmap getThumbnail() {
@@ -480,13 +480,10 @@ public class RecentsPanelView extends RelativeLayout
if (resolveInfo != null) {
final ActivityInfo info = resolveInfo.activityInfo;
final String title = info.loadLabel(pm).toString();
- // Drawable icon = info.loadIcon(pm);
Drawable icon = getFullResIcon(resolveInfo, pm);
if (title != null && title.length() > 0 && icon != null) {
if (DEBUG) Log.v(TAG, "creating activity desc for id="
+ recentInfo.id + ", label=" + title);
- ActivityManager.TaskThumbnails thumbs = am.getTaskThumbnails(
- recentInfo.persistentId);
ActivityDescription item = new ActivityDescription(recentInfo,
resolveInfo, intent, index, info.packageName);
activityDescriptions.add(item);
@@ -525,7 +522,9 @@ public class RecentsPanelView extends RelativeLayout
synchronized (ad) {
ad.mLabel = label;
ad.mIcon = icon;
- ad.setThumbnail(thumbs != null ? thumbs.mainThumbnail : mDefaultThumbnailBackground);
+ if (thumbs != null && thumbs.mainThumbnail != null) {
+ ad.setThumbnail(thumbs.mainThumbnail);
+ }
}
}
@@ -661,21 +660,6 @@ public class RecentsPanelView extends RelativeLayout
}
}
- private Bitmap compositeBitmap(Bitmap background, Bitmap thumbnail) {
- Bitmap outBitmap = background.copy(background.getConfig(), true);
- if (thumbnail != null) {
- Canvas canvas = new Canvas(outBitmap);
- Paint paint = new Paint();
- paint.setAntiAlias(true);
- paint.setFilterBitmap(true);
- paint.setAlpha(255);
- canvas.drawBitmap(thumbnail, null,
- new RectF(0, 0, outBitmap.getWidth(), outBitmap.getHeight()), paint);
- canvas.setBitmap(null);
- }
- return outBitmap;
- }
-
private void updateUiElements(Configuration config) {
final int items = mActivityDescriptions.size();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 65b022a7610b..59b09d49f9c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -29,6 +29,7 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.R;
+// Intimately tied to the design of res/layout/signal_cluster_view.xml
public class SignalClusterView
extends LinearLayout
implements NetworkController.SignalCluster {
@@ -42,9 +43,11 @@ public class SignalClusterView
private int mWifiStrengthId = 0, mWifiActivityId = 0;
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0;
+ private boolean mIsAirplaneMode = false;
ViewGroup mWifiGroup, mMobileGroup;
ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType;
+ View mSpacer;
public SignalClusterView(Context context) {
this(context, null);
@@ -74,6 +77,7 @@ public class SignalClusterView
mMobile = (ImageView) findViewById(R.id.mobile_signal);
mMobileActivity = (ImageView) findViewById(R.id.mobile_inout);
mMobileType = (ImageView) findViewById(R.id.mobile_type);
+ mSpacer = findViewById(R.id.spacer);
apply();
}
@@ -109,6 +113,10 @@ public class SignalClusterView
apply();
}
+ public void setIsAirplaneMode(boolean is) {
+ mIsAirplaneMode = is;
+ }
+
// Run after each indicator change.
private void apply() {
if (mWifiGroup == null) return;
@@ -135,6 +143,12 @@ public class SignalClusterView
mMobileGroup.setVisibility(View.GONE);
}
+ if (mMobileVisible && mWifiVisible && mIsAirplaneMode) {
+ mSpacer.setVisibility(View.INVISIBLE);
+ } else {
+ mSpacer.setVisibility(View.GONE);
+ }
+
if (DEBUG) Slog.d(TAG,
String.format("mobile: %s sig=%d act=%d typ=%d",
(mMobileVisible ? "VISIBLE" : "GONE"),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index c4e87d85ebcd..e5d4d22742f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -891,14 +891,6 @@ public class PhoneStatusBar extends StatusBar {
}
}
- void workAroundBadLayerDrawableOpacity(View v) {
- LayerDrawable d = (LayerDrawable)v.getBackground();
- if (d == null) return;
- 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;
@@ -910,7 +902,6 @@ public class PhoneStatusBar extends StatusBar {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
- workAroundBadLayerDrawableOpacity(row);
View vetoButton = row.findViewById(R.id.veto);
if (entry.notification.isClearable()) {
final String _pkg = sbn.pkg;
@@ -1603,6 +1594,9 @@ public class PhoneStatusBar extends StatusBar {
// the user switches to home. We know it is safe to do at this
// point, so make sure new activity switches are now allowed.
ActivityManagerNative.getDefault().resumeAppSwitches();
+ // Also, notifications can be launched from the lock screen,
+ // so dismiss the lock screen when the activity starts.
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
} catch (RemoteException e) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 4baf1afe84a5..c83c4708eac0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -142,6 +142,7 @@ public class NetworkController extends BroadcastReceiver {
void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon);
void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
int typeIcon);
+ void setIsAirplaneMode(boolean is);
}
/**
@@ -867,6 +868,7 @@ public class NetworkController extends BroadcastReceiver {
mPhoneSignalIconId,
mMobileActivityIconId,
mDataTypeIconId);
+ cluster.setIsAirplaneMode(mAirplaneMode);
}
}
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 c2f07d63f13e..435aa8c05d61 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -1308,6 +1308,9 @@ public class TabletStatusBar extends StatusBar implements
// the user switches to home. We know it is safe to do at this
// point, so make sure new activity switches are now allowed.
ActivityManagerNative.getDefault().resumeAppSwitches();
+ // Also, notifications can be launched from the lock screen,
+ // so dismiss the lock screen when the activity starts.
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
} catch (RemoteException e) {
}
diff --git a/packages/VpnDialogs/res/layout/confirm.xml b/packages/VpnDialogs/res/layout/confirm.xml
index 11a247a633aa..fef00c2203b4 100644
--- a/packages/VpnDialogs/res/layout/confirm.xml
+++ b/packages/VpnDialogs/res/layout/confirm.xml
@@ -15,46 +15,43 @@
limitations under the License.
-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="3mm">
-
- <ImageView android:id="@+id/icon"
- android:layout_width="@android:dimen/app_icon_size"
- android:layout_height="@android:dimen/app_icon_size"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginRight="1mm"/>
-
- <TextView android:id="@+id/warning"
- android:layout_width="fill_parent"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@id/icon"
- android:padding="3mm"
- android:text="@string/warning"
- android:textSize="18sp"/>
-
- <TextView android:id="@+id/prompt"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_toRightOf="@id/icon"
- android:layout_above="@id/warning"
- android:gravity="center_vertical"
- android:textSize="20sp"/>
-
- <CheckBox android:id="@+id/check"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@id/warning"
- android:text="@string/accept"
- android:textSize="20sp"
- android:checked="false"/>
-
-</RelativeLayout>
+ android:orientation="vertical"
+ android:padding="3mm">
+
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:paddingRight="1mm"/>
+
+ <TextView android:id="@+id/prompt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"/>
+ </LinearLayout>
+
+ <TextView android:id="@+id/warning"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="1mm"
+ android:paddingBottom="1mm"
+ android:text="@string/warning"
+ android:textSize="18sp"/>
+
+ <CheckBox android:id="@+id/check"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/accept"
+ android:textSize="20sp"
+ android:checked="false"/>
+ </LinearLayout>
+</ScrollView>
diff --git a/packages/VpnDialogs/res/values-am/strings.xml b/packages/VpnDialogs/res/values-am/strings.xml
index c13c56b572bd..45eaa0241f24 100644
--- a/packages/VpnDialogs/res/values-am/strings.xml
+++ b/packages/VpnDialogs/res/values-am/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"አለያይ"</string>
<string name="session" msgid="6470628549473641030">"ክፍለ ጊዜ፡"</string>
<string name="duration" msgid="3584782459928719435">"ጊዜ"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"ተልኳል ለ:"</string>
- <string name="data_received" msgid="4062776929376067820">"ተቀብሏል፡"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"ውሂብ ተላልፏል፡"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"ውሂብ ተቀብሏል"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ባይትስ / <xliff:g id="NUMBER_1">%2$s</xliff:g> ፓኬቶች"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-ar/strings.xml b/packages/VpnDialogs/res/values-ar/strings.xml
index cae60a854f73..17b993797f87 100644
--- a/packages/VpnDialogs/res/values-ar/strings.xml
+++ b/packages/VpnDialogs/res/values-ar/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"قطع الاتصال"</string>
<string name="session" msgid="6470628549473641030">"الجلسة"</string>
<string name="duration" msgid="3584782459928719435">"المدة:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"تم الإرسال:"</string>
- <string name="data_received" msgid="4062776929376067820">"مستلم:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"البيانات المنقولة:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"البيانات المستلمة:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> بايت / <xliff:g id="NUMBER_1">%2$s</xliff:g> من الحزم"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-bg/strings.xml b/packages/VpnDialogs/res/values-bg/strings.xml
index 5d186a3e04e4..fc8fbeb0955f 100644
--- a/packages/VpnDialogs/res/values-bg/strings.xml
+++ b/packages/VpnDialogs/res/values-bg/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Изключване"</string>
<string name="session" msgid="6470628549473641030">"Сесия:"</string>
<string name="duration" msgid="3584782459928719435">"Продължителност:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Изпратено:"</string>
- <string name="data_received" msgid="4062776929376067820">"Получено:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Предадени данни:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Получени данни:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> байта/ <xliff:g id="NUMBER_1">%2$s</xliff:g> пакета"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-cs/strings.xml b/packages/VpnDialogs/res/values-cs/strings.xml
index ee737a1a9f3c..00fbe2d97272 100644
--- a/packages/VpnDialogs/res/values-cs/strings.xml
+++ b/packages/VpnDialogs/res/values-cs/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Odpojit"</string>
<string name="session" msgid="6470628549473641030">"Relace:"</string>
<string name="duration" msgid="3584782459928719435">"Doba trvání:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Odesláno:"</string>
- <string name="data_received" msgid="4062776929376067820">"Přijato:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Odeslaná data:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Přijatá data:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bajtů / <xliff:g id="NUMBER_1">%2$s</xliff:g> paketů"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-da/strings.xml b/packages/VpnDialogs/res/values-da/strings.xml
index 2a48a904de36..436c5703c1f8 100644
--- a/packages/VpnDialogs/res/values-da/strings.xml
+++ b/packages/VpnDialogs/res/values-da/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Fjern tilknytning"</string>
<string name="session" msgid="6470628549473641030">"Session:"</string>
<string name="duration" msgid="3584782459928719435">"Varighed:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Sendt:"</string>
- <string name="data_received" msgid="4062776929376067820">"Modtaget:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Data sendt:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Data modtaget:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> pakker"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-de/strings.xml b/packages/VpnDialogs/res/values-de/strings.xml
index ff5f3f24c53a..51690da2eef4 100644
--- a/packages/VpnDialogs/res/values-de/strings.xml
+++ b/packages/VpnDialogs/res/values-de/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Verbindung trennen"</string>
<string name="session" msgid="6470628549473641030">"Sitzung:"</string>
<string name="duration" msgid="3584782459928719435">"Dauer:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Gesendet:"</string>
- <string name="data_received" msgid="4062776929376067820">"Erhalten:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Übertragene Daten:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Empfangene Daten:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> Byte/<xliff:g id="NUMBER_1">%2$s</xliff:g> Pakete"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-el/strings.xml b/packages/VpnDialogs/res/values-el/strings.xml
index 04a2bb37c287..58abede01e8c 100644
--- a/packages/VpnDialogs/res/values-el/strings.xml
+++ b/packages/VpnDialogs/res/values-el/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Αποσύνδεση"</string>
<string name="session" msgid="6470628549473641030">"Περίοδος σύνδεσης"</string>
<string name="duration" msgid="3584782459928719435">"Διάρκεια:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Στάλθηκε:"</string>
- <string name="data_received" msgid="4062776929376067820">"Έγινε λήψη:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Στοιχεία που μεταδόθηκαν:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Δεδομένα που λήφθηκαν:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> byte / <xliff:g id="NUMBER_1">%2$s</xliff:g> πακέτα"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-es-rUS/strings.xml b/packages/VpnDialogs/res/values-es-rUS/strings.xml
index 58e72d19bad3..7c563ae6b8ac 100644
--- a/packages/VpnDialogs/res/values-es-rUS/strings.xml
+++ b/packages/VpnDialogs/res/values-es-rUS/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Desconectar"</string>
<string name="session" msgid="6470628549473641030">"Sesión:"</string>
<string name="duration" msgid="3584782459928719435">"Duración:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Enviados:"</string>
- <string name="data_received" msgid="4062776929376067820">"Recibidos:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Datos transmitidos:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Datos recibidos:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> paquetes"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-es/strings.xml b/packages/VpnDialogs/res/values-es/strings.xml
index 79ad80cd5209..e957542e8cb7 100644
--- a/packages/VpnDialogs/res/values-es/strings.xml
+++ b/packages/VpnDialogs/res/values-es/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Desconectar"</string>
<string name="session" msgid="6470628549473641030">"Sesión:"</string>
<string name="duration" msgid="3584782459928719435">"Duración:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Enviado:"</string>
- <string name="data_received" msgid="4062776929376067820">"Recibido:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Datos transmitidos:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Datos recibidos:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> paquetes"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-fa/strings.xml b/packages/VpnDialogs/res/values-fa/strings.xml
index 8dba4016c4d3..d0fe3ff6df1b 100644
--- a/packages/VpnDialogs/res/values-fa/strings.xml
+++ b/packages/VpnDialogs/res/values-fa/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"قطع اتصال"</string>
<string name="session" msgid="6470628549473641030">"جلسه:"</string>
<string name="duration" msgid="3584782459928719435">"مدت زمان:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"ارسال شد:"</string>
- <string name="data_received" msgid="4062776929376067820">"دریافت شد:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"داده‌های منتقل شده:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"داده دریافت شده:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> بایت / <xliff:g id="NUMBER_1">%2$s</xliff:g> بسته"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-fi/strings.xml b/packages/VpnDialogs/res/values-fi/strings.xml
index c8d830c9c8e7..e2f30efe6929 100644
--- a/packages/VpnDialogs/res/values-fi/strings.xml
+++ b/packages/VpnDialogs/res/values-fi/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Katkaise yhteys"</string>
<string name="session" msgid="6470628549473641030">"Käyttökerta"</string>
<string name="duration" msgid="3584782459928719435">"Kesto:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Lähetetty:"</string>
- <string name="data_received" msgid="4062776929376067820">"Vastaanotettu:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Siirretyt tiedot:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Vastaanotetut tiedot:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> tavua / <xliff:g id="NUMBER_1">%2$s</xliff:g> pakettia"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-fr/strings.xml b/packages/VpnDialogs/res/values-fr/strings.xml
index e38c1a2bd700..16b8c8ff898b 100644
--- a/packages/VpnDialogs/res/values-fr/strings.xml
+++ b/packages/VpnDialogs/res/values-fr/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Déconnecter"</string>
<string name="session" msgid="6470628549473641030">"Session :"</string>
<string name="duration" msgid="3584782459928719435">"Durée :"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Envoyé :"</string>
- <string name="data_received" msgid="4062776929376067820">"Reçu :"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Données transmises :"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Données reçues :"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> octets / <xliff:g id="NUMBER_1">%2$s</xliff:g> paquets"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-hr/strings.xml b/packages/VpnDialogs/res/values-hr/strings.xml
index cdbffbc9a4f5..9eabfff90c3a 100644
--- a/packages/VpnDialogs/res/values-hr/strings.xml
+++ b/packages/VpnDialogs/res/values-hr/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Prekini vezu"</string>
<string name="session" msgid="6470628549473641030">"Sesija"</string>
<string name="duration" msgid="3584782459928719435">"Trajanje:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Poslano:"</string>
- <string name="data_received" msgid="4062776929376067820">"Primljeno:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Preneseno podataka:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Primljeni podaci:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"Bajtova: <xliff:g id="NUMBER_0">%1$s</xliff:g>/paketa: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-hu/strings.xml b/packages/VpnDialogs/res/values-hu/strings.xml
index a2684025f948..587204624ba0 100644
--- a/packages/VpnDialogs/res/values-hu/strings.xml
+++ b/packages/VpnDialogs/res/values-hu/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Kapcsolat bontása"</string>
<string name="session" msgid="6470628549473641030">"Munkamenet:"</string>
<string name="duration" msgid="3584782459928719435">"Időtartam:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Elküldve:"</string>
- <string name="data_received" msgid="4062776929376067820">"Érkezett:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Továbbított adatok:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Fogadott adatok:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bájt/<xliff:g id="NUMBER_1">%2$s</xliff:g> adatcsomag"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-in/strings.xml b/packages/VpnDialogs/res/values-in/strings.xml
index 1721d6872c10..9a985e601e1e 100644
--- a/packages/VpnDialogs/res/values-in/strings.xml
+++ b/packages/VpnDialogs/res/values-in/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Putuskan sambungan"</string>
<string name="session" msgid="6470628549473641030">"Sesi:"</string>
<string name="duration" msgid="3584782459928719435">"Durasi:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Terkirim:"</string>
- <string name="data_received" msgid="4062776929376067820">"Diterima:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Data yang Dikirimkan:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Data Diterima:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> byte / <xliff:g id="NUMBER_1">%2$s</xliff:g> paket"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-iw/strings.xml b/packages/VpnDialogs/res/values-iw/strings.xml
index 4b8d1254f402..093015afbe9e 100644
--- a/packages/VpnDialogs/res/values-iw/strings.xml
+++ b/packages/VpnDialogs/res/values-iw/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"נתק"</string>
<string name="session" msgid="6470628549473641030">"הפעלה"</string>
<string name="duration" msgid="3584782459928719435">"משך:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"נשלח:"</string>
- <string name="data_received" msgid="4062776929376067820">"התקבל:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"הנתונים המועברים:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"הנתונים שהתקבלו:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> בתים / <xliff:g id="NUMBER_1">%2$s</xliff:g> מנות"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-ja/strings.xml b/packages/VpnDialogs/res/values-ja/strings.xml
index 751162f8ff77..d5f97e5a84aa 100644
--- a/packages/VpnDialogs/res/values-ja/strings.xml
+++ b/packages/VpnDialogs/res/values-ja/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"切断"</string>
<string name="session" msgid="6470628549473641030">"セッション:"</string>
<string name="duration" msgid="3584782459928719435">"期間:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"送信:"</string>
- <string name="data_received" msgid="4062776929376067820">"受信:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"送信されたデータ:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"受信したデータ:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g>バイト/<xliff:g id="NUMBER_1">%2$s</xliff:g>パケット"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-ko/strings.xml b/packages/VpnDialogs/res/values-ko/strings.xml
index cfc4ffc45de8..6c99f7b65b1e 100644
--- a/packages/VpnDialogs/res/values-ko/strings.xml
+++ b/packages/VpnDialogs/res/values-ko/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"연결 끊기"</string>
<string name="session" msgid="6470628549473641030">"세션:"</string>
<string name="duration" msgid="3584782459928719435">"기간:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"보냄:"</string>
- <string name="data_received" msgid="4062776929376067820">"수신됨:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"전송된 데이터:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"수신된 데이터:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g>바이트/<xliff:g id="NUMBER_1">%2$s</xliff:g>패킷"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-lt/strings.xml b/packages/VpnDialogs/res/values-lt/strings.xml
index e70c5e837166..ae8573b52f87 100644
--- a/packages/VpnDialogs/res/values-lt/strings.xml
+++ b/packages/VpnDialogs/res/values-lt/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Atsijungti"</string>
<string name="session" msgid="6470628549473641030">"Sesija"</string>
<string name="duration" msgid="3584782459928719435">"Trukmė:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Išsiųsta"</string>
- <string name="data_received" msgid="4062776929376067820">"Gauta"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Duomenys perduodami:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Gauti duomenys:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"Baitų: <xliff:g id="NUMBER_0">%1$s</xliff:g> baitų / paketų: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-lv/strings.xml b/packages/VpnDialogs/res/values-lv/strings.xml
index 2e1a9f7c45d1..88ff8bb571a7 100644
--- a/packages/VpnDialogs/res/values-lv/strings.xml
+++ b/packages/VpnDialogs/res/values-lv/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Pārtraukt savienojumu"</string>
<string name="session" msgid="6470628549473641030">"Sesija:"</string>
<string name="duration" msgid="3584782459928719435">"Ilgums:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Nosūtīts:"</string>
- <string name="data_received" msgid="4062776929376067820">"Saņemts:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Nosūtītie dati:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Saņemtie dati:"</string>
<string name="blank_value" msgid="6278484582661984635">"—"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> baiti/<xliff:g id="NUMBER_1">%2$s</xliff:g> paketes"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-nb/strings.xml b/packages/VpnDialogs/res/values-nb/strings.xml
index fbd918577c79..f469cce1fd47 100644
--- a/packages/VpnDialogs/res/values-nb/strings.xml
+++ b/packages/VpnDialogs/res/values-nb/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Koble fra"</string>
<string name="session" msgid="6470628549473641030">"Økt:"</string>
<string name="duration" msgid="3584782459928719435">"Varighet:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Sendt:"</string>
- <string name="data_received" msgid="4062776929376067820">"Mottatt:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Data overført:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Data mottatt:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> byte / <xliff:g id="NUMBER_1">%2$s</xliff:g> pakker"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-nl/strings.xml b/packages/VpnDialogs/res/values-nl/strings.xml
index 7f6e0b1debf2..807704c280a4 100644
--- a/packages/VpnDialogs/res/values-nl/strings.xml
+++ b/packages/VpnDialogs/res/values-nl/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Verbinding verbreken"</string>
<string name="session" msgid="6470628549473641030">"Sessie:"</string>
<string name="duration" msgid="3584782459928719435">"Duur:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Verzonden:"</string>
- <string name="data_received" msgid="4062776929376067820">"Ontvangen:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Verzonden gegevens:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Ontvangen gegevens:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes/<xliff:g id="NUMBER_1">%2$s</xliff:g> pakketten"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-pl/strings.xml b/packages/VpnDialogs/res/values-pl/strings.xml
index 80c5a7c66d00..207c82de4e6d 100644
--- a/packages/VpnDialogs/res/values-pl/strings.xml
+++ b/packages/VpnDialogs/res/values-pl/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Rozłącz"</string>
<string name="session" msgid="6470628549473641030">"Sesja:"</string>
<string name="duration" msgid="3584782459928719435">"Czas trwania:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Wysłano:"</string>
- <string name="data_received" msgid="4062776929376067820">"Odebrano:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Dane przesłane:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Dane odebrane:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"Bajty: <xliff:g id="NUMBER_0">%1$s</xliff:g> / pakiety: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-pt-rPT/strings.xml b/packages/VpnDialogs/res/values-pt-rPT/strings.xml
index c57525d22e8a..960a10071890 100644
--- a/packages/VpnDialogs/res/values-pt-rPT/strings.xml
+++ b/packages/VpnDialogs/res/values-pt-rPT/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Desligar"</string>
<string name="session" msgid="6470628549473641030">"Sessão"</string>
<string name="duration" msgid="3584782459928719435">"Duração:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Enviado:"</string>
- <string name="data_received" msgid="4062776929376067820">"Recebido:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Dados Transmitidos:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Dados Recebidos:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> pacotes"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-pt/strings.xml b/packages/VpnDialogs/res/values-pt/strings.xml
index 8a16e87e05ac..92bd1a2640a5 100644
--- a/packages/VpnDialogs/res/values-pt/strings.xml
+++ b/packages/VpnDialogs/res/values-pt/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Desconectar"</string>
<string name="session" msgid="6470628549473641030">"Sessão:"</string>
<string name="duration" msgid="3584782459928719435">"Duração:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Enviado:"</string>
- <string name="data_received" msgid="4062776929376067820">"Recebido:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Dados transmitidos:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Dados recebidos:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes/<xliff:g id="NUMBER_1">%2$s</xliff:g> pacotes"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml
index 2791f732481d..fa79ae1a7c43 100644
--- a/packages/VpnDialogs/res/values-ro/strings.xml
+++ b/packages/VpnDialogs/res/values-ro/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Deconectaţi"</string>
<string name="session" msgid="6470628549473641030">"Sesiune:"</string>
<string name="duration" msgid="3584782459928719435">"Durată:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Trimis:"</string>
- <string name="data_received" msgid="4062776929376067820">"Primit:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Date transmise:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Date primite:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> (de) octeţi/<xliff:g id="NUMBER_1">%2$s</xliff:g> (de) pachete"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-ru/strings.xml b/packages/VpnDialogs/res/values-ru/strings.xml
index 411c51a0f050..a3888fcca2b4 100644
--- a/packages/VpnDialogs/res/values-ru/strings.xml
+++ b/packages/VpnDialogs/res/values-ru/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Разъединить"</string>
<string name="session" msgid="6470628549473641030">"Сеанс:"</string>
<string name="duration" msgid="3584782459928719435">"Продолжительность:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Отправлено:"</string>
- <string name="data_received" msgid="4062776929376067820">"Получено:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Отправлено:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Получено:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> Б; пакетов: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-sk/strings.xml b/packages/VpnDialogs/res/values-sk/strings.xml
index 733efd4dbebf..77090aa3be31 100644
--- a/packages/VpnDialogs/res/values-sk/strings.xml
+++ b/packages/VpnDialogs/res/values-sk/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Odpojiť"</string>
<string name="session" msgid="6470628549473641030">"Relácia"</string>
<string name="duration" msgid="3584782459928719435">"Trvanie:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Odoslané:"</string>
- <string name="data_received" msgid="4062776929376067820">"Prijaté:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Prenášané údaje:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Prijaté dáta:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> B/<xliff:g id="NUMBER_1">%2$s</xliff:g> paketov"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-sl/strings.xml b/packages/VpnDialogs/res/values-sl/strings.xml
index 92806fc92825..1dda8b2f0a19 100644
--- a/packages/VpnDialogs/res/values-sl/strings.xml
+++ b/packages/VpnDialogs/res/values-sl/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Prekini povezavo"</string>
<string name="session" msgid="6470628549473641030">"Seja:"</string>
<string name="duration" msgid="3584782459928719435">"Trajanje:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Poslano:"</string>
- <string name="data_received" msgid="4062776929376067820">"Prejeto:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Preneseni podatki:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Prejeti podatki:"</string>
<string name="blank_value" msgid="6278484582661984635">"-"</string>
<string name="data_value_format" msgid="2192466557826897580">"Št. bajtov: <xliff:g id="NUMBER_0">%1$s</xliff:g>/št. paketov: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-sr/strings.xml b/packages/VpnDialogs/res/values-sr/strings.xml
index 425ee89dae78..3274e5eab611 100644
--- a/packages/VpnDialogs/res/values-sr/strings.xml
+++ b/packages/VpnDialogs/res/values-sr/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Прекини везу"</string>
<string name="session" msgid="6470628549473641030">"Сесија:"</string>
<string name="duration" msgid="3584782459928719435">"Трајање:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Послато:"</string>
- <string name="data_received" msgid="4062776929376067820">"Примљенo:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Пренесени подаци:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Примљени подаци:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> бајт(ов)а / <xliff:g id="NUMBER_1">%2$s</xliff:g> пакета"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-sv/strings.xml b/packages/VpnDialogs/res/values-sv/strings.xml
index 7cec26c64ee7..3c9ef6a15471 100644
--- a/packages/VpnDialogs/res/values-sv/strings.xml
+++ b/packages/VpnDialogs/res/values-sv/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Koppla från"</string>
<string name="session" msgid="6470628549473641030">"Session:"</string>
<string name="duration" msgid="3584782459928719435">"Längd:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Skickat:"</string>
- <string name="data_received" msgid="4062776929376067820">"Mottaget:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Data som överförs:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Mottagna data:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> byte/<xliff:g id="NUMBER_1">%2$s</xliff:g> paket"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-sw/strings.xml b/packages/VpnDialogs/res/values-sw/strings.xml
index 46077281c5cf..87b592ce7fa2 100644
--- a/packages/VpnDialogs/res/values-sw/strings.xml
+++ b/packages/VpnDialogs/res/values-sw/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Tenganisha"</string>
<string name="session" msgid="6470628549473641030">"Kipindi:"</string>
<string name="duration" msgid="3584782459928719435">"Muda:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Zilizotumwa:"</string>
- <string name="data_received" msgid="4062776929376067820">"Imepokelewa:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Data Zilizopitishwa:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Data Iliyopokewa:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"baiti <xliff:g id="NUMBER_0">%1$s</xliff:g> / pakiti <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-th/strings.xml b/packages/VpnDialogs/res/values-th/strings.xml
index 9865382ca8f2..17360c871b2e 100644
--- a/packages/VpnDialogs/res/values-th/strings.xml
+++ b/packages/VpnDialogs/res/values-th/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"ยกเลิกการเชื่อมต่อ"</string>
<string name="session" msgid="6470628549473641030">"เซสชัน"</string>
<string name="duration" msgid="3584782459928719435">"ระยะเวลา:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"ส่งแล้ว:"</string>
- <string name="data_received" msgid="4062776929376067820">"ได้รับ:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"ข้อมูลที่ส่ง:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"ข้อมูลที่ได้รับ:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ไบต์/<xliff:g id="NUMBER_1">%2$s</xliff:g> แพ็คเก็ต"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-tl/strings.xml b/packages/VpnDialogs/res/values-tl/strings.xml
index 4826d8ff017b..7a6b3c031903 100644
--- a/packages/VpnDialogs/res/values-tl/strings.xml
+++ b/packages/VpnDialogs/res/values-tl/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Idiskonekta"</string>
<string name="session" msgid="6470628549473641030">"Session:"</string>
<string name="duration" msgid="3584782459928719435">"Tagal:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Ipinadala:"</string>
- <string name="data_received" msgid="4062776929376067820">"Natanggap:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Naipadalang Data:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Natanggap na Data:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> (na) byte / <xliff:g id="NUMBER_1">%2$s</xliff:g> (na) packet"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-tr/strings.xml b/packages/VpnDialogs/res/values-tr/strings.xml
index 843337865ac2..9e7d1e0a2a5f 100644
--- a/packages/VpnDialogs/res/values-tr/strings.xml
+++ b/packages/VpnDialogs/res/values-tr/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Bağlantıyı kes"</string>
<string name="session" msgid="6470628549473641030">"Oturum:"</string>
<string name="duration" msgid="3584782459928719435">"Süre:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Gönderildi:"</string>
- <string name="data_received" msgid="4062776929376067820">"Alındı:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"İletilen Veriler:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Alınan Veriler:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bayt / <xliff:g id="NUMBER_1">%2$s</xliff:g> paket"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-uk/strings.xml b/packages/VpnDialogs/res/values-uk/strings.xml
index a12bfea439ee..bdb24355ee57 100644
--- a/packages/VpnDialogs/res/values-uk/strings.xml
+++ b/packages/VpnDialogs/res/values-uk/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Від’єднати"</string>
<string name="session" msgid="6470628549473641030">"Сеанс:"</string>
<string name="duration" msgid="3584782459928719435">"Тривалість:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Надіслано:"</string>
- <string name="data_received" msgid="4062776929376067820">"Отримано:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Передані дані:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Отримані дані:"</string>
<string name="blank_value" msgid="6278484582661984635">"–"</string>
<string name="data_value_format" msgid="2192466557826897580">"Байтів: <xliff:g id="NUMBER_0">%1$s</xliff:g> / пакетів: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-vi/strings.xml b/packages/VpnDialogs/res/values-vi/strings.xml
index eab3812c731a..7e10a73cf8d8 100644
--- a/packages/VpnDialogs/res/values-vi/strings.xml
+++ b/packages/VpnDialogs/res/values-vi/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Ngắt kết nối"</string>
<string name="session" msgid="6470628549473641030">"Phiên"</string>
<string name="duration" msgid="3584782459928719435">"Thời lượng:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Đã gửi:"</string>
- <string name="data_received" msgid="4062776929376067820">"Đã nhận:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Đã truyền dữ liệu:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Đã nhận dữ liệu:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> byte / <xliff:g id="NUMBER_1">%2$s</xliff:g> gói"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-zh-rCN/strings.xml b/packages/VpnDialogs/res/values-zh-rCN/strings.xml
index 24774eb74188..f9294e30f4b4 100644
--- a/packages/VpnDialogs/res/values-zh-rCN/strings.xml
+++ b/packages/VpnDialogs/res/values-zh-rCN/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"断开连接"</string>
<string name="session" msgid="6470628549473641030">"会话:"</string>
<string name="duration" msgid="3584782459928719435">"时长:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"已发送:"</string>
- <string name="data_received" msgid="4062776929376067820">"已接收:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"传输的数据:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"收到的数据:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> 字节/<xliff:g id="NUMBER_1">%2$s</xliff:g> 个数据包"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-zh-rTW/strings.xml b/packages/VpnDialogs/res/values-zh-rTW/strings.xml
index 79e688799695..5a39ca564166 100644
--- a/packages/VpnDialogs/res/values-zh-rTW/strings.xml
+++ b/packages/VpnDialogs/res/values-zh-rTW/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"中斷連線"</string>
<string name="session" msgid="6470628549473641030">"工作階段:"</string>
<string name="duration" msgid="3584782459928719435">"持續時間:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"已傳送的資料:"</string>
- <string name="data_received" msgid="4062776929376067820">"已接收的資料:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"已傳輸的數據:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"已接收的數據:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> 位元組 / <xliff:g id="NUMBER_1">%2$s</xliff:g> 個封包"</string>
</resources>
diff --git a/packages/VpnDialogs/res/values-zu/strings.xml b/packages/VpnDialogs/res/values-zu/strings.xml
index 67eeeb9ffbac..492d3ff928bb 100644
--- a/packages/VpnDialogs/res/values-zu/strings.xml
+++ b/packages/VpnDialogs/res/values-zu/strings.xml
@@ -24,8 +24,8 @@
<string name="disconnect" msgid="971412338304200056">"Ayixhumekile kwi-inthanethi"</string>
<string name="session" msgid="6470628549473641030">"Iseshini:"</string>
<string name="duration" msgid="3584782459928719435">"Ubude besikhathi:"</string>
- <string name="data_transmitted" msgid="7988167672982199061">"Thunyelwe:"</string>
- <string name="data_received" msgid="4062776929376067820">"Okwamukelwe:"</string>
+ <!-- outdated translation 8239988320199846094 --> <string name="data_transmitted" msgid="7988167672982199061">"Idatha Ithunyelwe:"</string>
+ <!-- outdated translation 7431729884377019935 --> <string name="data_received" msgid="4062776929376067820">"Idatha Etholiwe:"</string>
<string name="blank_value" msgid="6278484582661984635">"--"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> amaphakethe/ <xliff:g id="NUMBER_1">%2$s</xliff:g> amabhayithi"</string>
</resources>
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index d668e98f0f27..7fb141709884 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -181,8 +181,10 @@ public class ManageDialog extends Activity implements Handler.Callback,
String line = in.readLine().trim();
if (line.startsWith(prefix)) {
String[] numbers = line.substring(prefix.length()).split(" +");
- if (numbers.length == 17) {
- return numbers;
+ for (int i = 1; i < 17; ++i) {
+ if (!numbers[i].equals("0")) {
+ return numbers;
+ }
}
break;
}
diff --git a/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java b/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
index f7d936c87050..a4baeed24c2a 100644
--- a/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
@@ -54,7 +54,7 @@ import java.io.IOException;
public class AccountUnlockScreen extends RelativeLayout implements KeyguardScreen,
View.OnClickListener, TextWatcher {
private static final String LOCK_PATTERN_PACKAGE = "com.android.settings";
- private static final String LOCK_PATTERN_CLASS = LOCK_PATTERN_PACKAGE + ".ChooseLockPattern";
+ private static final String LOCK_PATTERN_CLASS = LOCK_PATTERN_PACKAGE + ".ChooseLockGeneric";
/**
* The amount of millis to stay awake once this screen detects activity
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
index ec24f97a1a8c..10cf3aaf5c0f 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
@@ -593,4 +593,7 @@ public class KeyguardUpdateMonitor {
return mClockVisible;
}
+ public int getPhoneState() {
+ return mPhoneState;
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
index 2fcf1dc3ebc2..59b546ddecfe 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
@@ -99,6 +99,11 @@ public abstract class KeyguardViewBase extends FrameLayout {
abstract public void onScreenTurnedOn();
/**
+ * Called when the view needs to be shown.
+ */
+ abstract public void show();
+
+ /**
* Called when a key has woken the device to give us a chance to adjust our
* state according the the key. We are responsible for waking the device
* (by poking the wake lock) once we are ready.
@@ -127,15 +132,6 @@ public abstract class KeyguardViewBase extends FrameLayout {
*/
abstract public void cleanUp();
- /**
- * These were added to support FaceLock because the KeyguardViewManager needs to tell the
- * LockPatternKeyguardView when to bind and and unbind with FaceLock service. Although
- * implemented in LockPatternKeyguardView, these are not implemented in anything else
- * derived from KeyguardViewBase
- */
- abstract public void bindToFaceLock();
- abstract public void stopAndUnbindFromFaceLock();
-
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (shouldEventKeepScreenOnWhileKeyguardShowing(event)) {
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
index 91f152724b54..90972da1b591 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
@@ -167,7 +167,7 @@ public class KeyguardViewManager implements KeyguardWindowController {
mKeyguardHost.addView(mKeyguardView, lp);
if (mScreenOn) {
- mKeyguardView.onScreenTurnedOn();
+ mKeyguardView.show();
}
}
@@ -205,9 +205,6 @@ public class KeyguardViewManager implements KeyguardWindowController {
mScreenOn = false;
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOff();
-
- // When screen is turned off, need to unbind from FaceLock service if using FaceLock
- mKeyguardView.stopAndUnbindFromFaceLock();
}
}
@@ -218,9 +215,6 @@ public class KeyguardViewManager implements KeyguardWindowController {
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOn();
- // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
- mKeyguardView.bindToFaceLock();
-
// Caller should wait for this window to be shown before turning
// on the screen.
if (mKeyguardHost.getVisibility() == View.VISIBLE) {
@@ -277,12 +271,6 @@ public class KeyguardViewManager implements KeyguardWindowController {
public synchronized void hide() {
if (DEBUG) Log.d(TAG, "hide()");
- if (mKeyguardView != null) {
- // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
- // e.g., when device becomes unlocked
- mKeyguardView.stopAndUnbindFromFaceLock();
- }
-
if (mKeyguardHost != null) {
mKeyguardHost.setVisibility(View.GONE);
// Don't do this right away, so we can let the view continue to animate
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
index 6a48fc3bf674..886997c43ac8 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -31,9 +31,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
+import android.media.SoundPool;
import android.os.Handler;
import android.os.LocalPowerManager;
import android.os.Message;
@@ -253,6 +251,11 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
private boolean mWaitingUntilKeyguardVisible = false;
private LockPatternUtils mLockPatternUtils;
+ private SoundPool mLockSounds;
+ private int mLockSoundId;
+ private int mUnlockSoundId;
+ private int mLockSoundStreamId;
+
public KeyguardViewMediator(Context context, PhoneWindowManager callback,
LocalPowerManager powerManager) {
mContext = context;
@@ -298,6 +301,22 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
final ContentResolver cr = mContext.getContentResolver();
mShowLockIcon = (Settings.System.getInt(cr, "show_status_bar_lock", 0) == 1);
+
+ mLockSounds = new SoundPool(1, AudioManager.STREAM_SYSTEM, 0);
+ String soundPath = Settings.System.getString(cr, Settings.System.LOCK_SOUND);
+ if (soundPath != null) {
+ mLockSoundId = mLockSounds.load(soundPath, 1);
+ }
+ if (soundPath == null || mLockSoundId == 0) {
+ if (DEBUG) Log.d(TAG, "failed to load sound from " + soundPath);
+ }
+ soundPath = Settings.System.getString(cr, Settings.System.UNLOCK_SOUND);
+ if (soundPath != null) {
+ mUnlockSoundId = mLockSounds.load(soundPath, 1);
+ }
+ if (soundPath == null || mUnlockSoundId == 0) {
+ if (DEBUG) Log.d(TAG, "failed to load sound from " + soundPath);
+ }
}
/**
@@ -1044,28 +1063,11 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
final ContentResolver cr = mContext.getContentResolver();
if (Settings.System.getInt(cr, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) == 1)
{
- final String whichSound = locked
- ? Settings.System.LOCK_SOUND
- : Settings.System.UNLOCK_SOUND;
- final String soundPath = Settings.System.getString(cr, whichSound);
- if (soundPath != null) {
- final Uri soundUri = Uri.parse("file://" + soundPath);
- if (soundUri != null) {
- final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
- if (sfx != null) {
- sfx.setStreamType(AudioManager.STREAM_SYSTEM);
- sfx.play();
- } else {
- if (DEBUG) Log.d(TAG, "playSounds: failed to load ringtone from uri: "
- + soundUri);
- }
- } else {
- if (DEBUG) Log.d(TAG, "playSounds: could not parse Uri: " + soundPath);
- }
- } else {
- if (DEBUG) Log.d(TAG, "playSounds: whichSound = " + whichSound
- + "; soundPath was null");
- }
+ final int whichSound = locked
+ ? mLockSoundId
+ : mUnlockSoundId;
+ mLockSounds.stop(mLockSoundStreamId);
+ mLockSoundStreamId = mLockSounds.play(whichSound, 1.0f, 1.0f, 1, 0, 1.0f);
}
}
diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
index e2a114947043..f970ff3787be 100644
--- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -46,6 +46,8 @@ import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -74,7 +76,7 @@ import java.io.IOException;
* {@link com.android.internal.policy.impl.KeyguardViewManager}
* via its {@link com.android.internal.policy.impl.KeyguardViewCallback}, as appropriate.
*/
-public class LockPatternKeyguardView extends KeyguardViewBase {
+public class LockPatternKeyguardView extends KeyguardViewBase implements Handler.Callback {
private static final int TRANSPORT_USERACTIVITY_TIMEOUT = 10000;
@@ -103,9 +105,19 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
// The following were added to support FaceLock
private IFaceLockInterface mFaceLockService;
private boolean mBoundToFaceLockService = false;
- private boolean mFaceLockServiceRunning = false;
private View mFaceLockAreaView;
+ private boolean mFaceLockServiceRunning = false;
+ private final Object mFaceLockServiceRunningLock = new Object();
+
+ private Handler mHandler;
+ private final int MSG_SHOW_FACELOCK_AREA_VIEW = 0;
+ private final int MSG_HIDE_FACELOCK_AREA_VIEW = 1;
+
+ // Long enough to stay black while dialer comes up
+ // Short enough to not be black if the user goes back immediately
+ private final int FACELOCK_VIEW_AREA_EMERGENCY_HIDE_TIMEOUT = 1000;
+
/**
* The current {@link KeyguardScreen} will use this to communicate back to us.
*/
@@ -244,6 +256,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
KeyguardWindowController controller) {
super(context);
+ mHandler = new Handler(this);
mConfiguration = context.getResources().getConfiguration();
mEnableFallback = false;
mRequiresSim = TextUtils.isEmpty(SystemProperties.get("keyguard.no_require_sim"));
@@ -302,6 +315,13 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
}
public void takeEmergencyCallAction() {
+ // FaceLock must be stopped if it is running when emergency call is pressed
+ stopAndUnbindFromFaceLock();
+
+ // Delay hiding FaceLock area so unlock doesn't display while dialer is coming up
+ mHandler.sendEmptyMessageDelayed(MSG_HIDE_FACELOCK_AREA_VIEW,
+ FACELOCK_VIEW_AREA_EMERGENCY_HIDE_TIMEOUT);
+
pokeWakelock(EMERGENCY_CALL_TIMEOUT);
if (TelephonyManager.getDefault().getCallState()
== TelephonyManager.CALL_STATE_OFFHOOK) {
@@ -484,16 +504,38 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} else {
((KeyguardScreen) mUnlockScreen).onPause();
}
+
+ // When screen is turned off, need to unbind from FaceLock service if using FaceLock
+ stopAndUnbindFromFaceLock();
}
@Override
public void onScreenTurnedOn() {
mScreenOn = true;
+ show();
+
+ // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
+ // But only if not dealing with a call
+ if (mUpdateMonitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE) {
+ bindToFaceLock();
+ } else {
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
+ }
+ }
+
+ @Override
+ public void show() {
if (mMode == Mode.LockScreen) {
((KeyguardScreen) mLockScreen).onResume();
} else {
((KeyguardScreen) mUnlockScreen).onResume();
}
+
+ if (mLockPatternUtils.usingBiometricWeak()) {
+ mHandler.sendEmptyMessage(MSG_SHOW_FACELOCK_AREA_VIEW);
+ } else {
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
+ }
}
private void recreateLockScreen() {
@@ -523,6 +565,11 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
@Override
protected void onDetachedFromWindow() {
removeCallbacks(mRecreateRunnable);
+
+ // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
+ // e.g., when device becomes unlocked
+ stopAndUnbindFromFaceLock();
+
super.onDetachedFromWindow();
}
@@ -594,10 +641,6 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
}
private boolean isSecure() {
- // TODO: make this work with SIM and Account cases below.
- boolean usingBiometric = mLockPatternUtils.usingBiometricWeak();
- if (usingBiometric && mLockPatternUtils.isBiometricEnabled())
- return true;
UnlockMode unlockMode = getUnlockMode();
boolean secure = false;
switch (unlockMode) {
@@ -705,12 +748,6 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
mKeyguardScreenCallback,
mUpdateMonitor.getFailedAttempts());
view.setEnableFallback(mEnableFallback);
-
- // TODO(bcolonna): For pattern unlock, it can give us the view where the pattern is
- // displayed and FaceLock can draw in that area.
- // For other views it's not so simple and we should probably change how the FaceLock
- // area is determined.
- mFaceLockAreaView = view.getUnlockAreaView();
unlockView = view;
} else if (unlockMode == UnlockMode.SimPuk) {
unlockView = new SimPukUnlockScreen(
@@ -760,6 +797,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
throw new IllegalArgumentException("unknown unlock mode " + unlockMode);
}
initializeTransportControlView(unlockView);
+ initializeFaceLockAreaView(unlockView); // Only shows view if FaceLock is enabled
+
mUnlockScreenMode = unlockMode;
return unlockView;
}
@@ -939,6 +978,40 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
// Everything below pertains to FaceLock - might want to separate this out
+ // Only pattern and pin unlock screens actually have a view for the FaceLock area, so it's not
+ // uncommon for it to not exist. But if it does exist, we need to make sure it's shown (hiding
+ // the fallback) if FaceLock is enabled, and make sure it's hidden (showing the unlock) if
+ // FaceLock is disabled
+ private void initializeFaceLockAreaView(View view) {
+ mFaceLockAreaView = view.findViewById(R.id.faceLockAreaView);
+ if (mFaceLockAreaView == null) {
+ if (DEBUG) Log.d(TAG, "Layout does not have faceLockAreaView");
+ }
+ }
+
+ // Handles covering or exposing FaceLock area on the client side when FaceLock starts or stops
+ // This needs to be done in a handler because the call could be coming from a callback from the
+ // FaceLock service that is in a thread that can't modify the UI
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_SHOW_FACELOCK_AREA_VIEW:
+ if (mFaceLockAreaView != null) {
+ mFaceLockAreaView.setVisibility(View.VISIBLE);
+ }
+ break;
+ case MSG_HIDE_FACELOCK_AREA_VIEW:
+ if (mFaceLockAreaView != null) {
+ mFaceLockAreaView.setVisibility(View.GONE);
+ }
+ break;
+ default:
+ Log.w(TAG, "Unhandled message");
+ return false;
+ }
+ return true;
+ }
+
// Binds to FaceLock service, but does not tell it to start
public void bindToFaceLock() {
if (mLockPatternUtils.usingBiometricWeak()) {
@@ -950,9 +1023,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
if (DEBUG) Log.d(TAG, "after bind to FaceLock service");
mBoundToFaceLockService = true;
} else {
- // On startup I've seen onScreenTurnedOn() get called twice without
- // onScreenTurnedOff() being called in between, which can cause this (bcolonna)
- if (DEBUG) Log.w(TAG, "Attempt to bind to FaceLock when already bound");
+ Log.w(TAG, "Attempt to bind to FaceLock when already bound");
}
}
}
@@ -970,7 +1041,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} else {
// This could probably happen after the session when someone activates FaceLock
// because it wasn't active when the phone was turned on
- if (DEBUG) Log.w(TAG, "Attempt to unbind from FaceLock when not bound");
+ Log.w(TAG, "Attempt to unbind from FaceLock when not bound");
}
}
}
@@ -987,24 +1058,21 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
throw new RuntimeException("Remote exception");
}
- // TODO(bcolonna): Need to set location properly (only works for pattern view now)
if (mFaceLockAreaView != null) {
- int[] unlockLocationOnScreen = new int[2];
- mFaceLockAreaView.getLocationOnScreen(unlockLocationOnScreen);
- int x = unlockLocationOnScreen[0];
- int y = unlockLocationOnScreen[1];
- int w = mFaceLockAreaView.getWidth();
- int h = mFaceLockAreaView.getHeight();
- if (DEBUG) Log.d(TAG, "(x,y) (wxh): (" + x + "," + y + ") (" + w + "x" + h + ")");
- startFaceLock(mFaceLockAreaView.getWindowToken(), x, y, w, h);
+ startFaceLock(mFaceLockAreaView.getWindowToken(),
+ mFaceLockAreaView.getLeft(), mFaceLockAreaView.getTop(),
+ mFaceLockAreaView.getWidth(), mFaceLockAreaView.getHeight());
}
}
// Cleans up if FaceLock service unexpectedly disconnects
@Override
public void onServiceDisconnected(ComponentName className) {
- mFaceLockService = null;
- if (DEBUG) Log.w(TAG, "Unexpected disconnect from FaceLock service");
+ synchronized(mFaceLockServiceRunningLock) {
+ mFaceLockService = null;
+ mFaceLockServiceRunning = false;
+ }
+ Log.w(TAG, "Unexpected disconnect from FaceLock service");
}
};
@@ -1012,16 +1080,18 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
public void startFaceLock(IBinder windowToken, int x, int y, int h, int w)
{
if (mLockPatternUtils.usingBiometricWeak()) {
- if (!mFaceLockServiceRunning) {
- if (DEBUG) Log.d(TAG, "Starting FaceLock");
- try {
- mFaceLockService.startUi(windowToken, x, y, h, w);
- } catch (RemoteException e) {
- throw new RuntimeException("Remote exception");
+ synchronized (mFaceLockServiceRunningLock) {
+ if (!mFaceLockServiceRunning) {
+ if (DEBUG) Log.d(TAG, "Starting FaceLock");
+ try {
+ mFaceLockService.startUi(windowToken, x, y, h, w);
+ } catch (RemoteException e) {
+ throw new RuntimeException("Remote exception");
+ }
+ mFaceLockServiceRunning = true;
+ } else {
+ if (DEBUG) Log.w(TAG, "startFaceLock() attempted while running");
}
- mFaceLockServiceRunning = true;
- } else {
- if (DEBUG) Log.w(TAG, "startFaceLock() attempted while running");
}
}
}
@@ -1033,14 +1103,16 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
// Note that attempting to stop FaceLock when it's not running is not an issue.
// FaceLock can return, which stops it and then we try to stop it when the
// screen is turned off. That's why we check.
- if (mFaceLockServiceRunning) {
- try {
- if (DEBUG) Log.d(TAG, "Stopping FaceLock");
- mFaceLockService.stopUi();
- } catch (RemoteException e) {
- throw new RuntimeException("Remote exception");
+ synchronized (mFaceLockServiceRunningLock) {
+ if (mFaceLockServiceRunning) {
+ try {
+ if (DEBUG) Log.d(TAG, "Stopping FaceLock");
+ mFaceLockService.stopUi();
+ } catch (RemoteException e) {
+ throw new RuntimeException("Remote exception");
+ }
+ mFaceLockServiceRunning = false;
}
- mFaceLockServiceRunning = false;
}
}
}
@@ -1051,27 +1123,21 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
// Stops the FaceLock UI and indicates that the phone should be unlocked
@Override
public void unlock() {
- if (DEBUG) Log.d(TAG, "FaceLock unlock");
+ if (DEBUG) Log.d(TAG, "FaceLock unlock()");
+ mHandler.sendEmptyMessage(MSG_SHOW_FACELOCK_AREA_VIEW); // Keep fallback covered
stopFaceLock();
+
mKeyguardScreenCallback.keyguardDone(true);
mKeyguardScreenCallback.reportSuccessfulUnlockAttempt();
}
// Stops the FaceLock UI and exposes the backup method without unlocking
+ // This means either the user has cancelled out or FaceLock failed to recognize them
@Override
public void cancel() {
- // In this case, either the user has cancelled out, or FaceLock failed to recognize them
- if (DEBUG) Log.d(TAG, "FaceLock cancel");
- stopFaceLock();
- }
-
- // Stops the FaceLock UI and puts the phone to sleep
- @Override
- public void sleepDevice() {
- // In this case, it appears the phone has been turned on accidentally
- if (DEBUG) Log.d(TAG, "FaceLock accidental turn on");
+ if (DEBUG) Log.d(TAG, "FaceLock cancel()");
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW); // Expose fallback
stopFaceLock();
- // TODO(bcolonna): how do we put the phone back to sleep (i.e., turn off the screen)
}
};
}
diff --git a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
index e70892c1d88a..9a6d2cc67f46 100644
--- a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
@@ -199,12 +199,6 @@ class PatternUnlockScreen extends LinearLayoutWithDefaultTouchRecepient
setFocusableInTouchMode(true);
}
- // TODO(bcolonna): This is to tell FaceLock where to draw...but this covers up the wireless
- // service text, so we will want to change the way the area is specified
- public View getUnlockAreaView() {
- return mLockPatternView;
- }
-
public void setEnableFallback(boolean state) {
if (DEBUG) Log.d(TAG, "setEnableFallback(" + state + ")");
mEnableFallback = state;
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 903b405218af..9205b9ac2d15 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -43,6 +43,7 @@ import android.app.KeyguardManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
@@ -63,6 +64,7 @@ import android.util.Log;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.ActionMode;
+import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.IRotationWatcher;
import android.view.IWindowManager;
@@ -990,7 +992,23 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
* @return Whether the initialization was successful.
*/
protected boolean initializePanelMenu(final PanelFeatureState st) {
- final MenuBuilder menu = new MenuBuilder(getContext());
+ Context context = getContext();
+
+ // If we have an action bar, initialize the menu with a context themed for it.
+ if ((st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_ACTION_BAR) &&
+ mActionBar != null) {
+ TypedValue outValue = new TypedValue();
+ Resources.Theme currentTheme = context.getTheme();
+ currentTheme.resolveAttribute(com.android.internal.R.attr.actionBarWidgetTheme,
+ outValue, true);
+ final int targetThemeRes = outValue.resourceId;
+
+ if (targetThemeRes != 0 && context.getThemeResId() != targetThemeRes) {
+ context = new ContextThemeWrapper(context, targetThemeRes);
+ }
+ }
+
+ final MenuBuilder menu = new MenuBuilder(context);
menu.setCallback(this);
st.setMenu(menu);
@@ -2135,7 +2153,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
com.android.internal.R.attr.actionModePopupWindowStyle);
mActionModePopup.setLayoutInScreenEnabled(true);
mActionModePopup.setLayoutInsetDecor(true);
- mActionModePopup.setClippingEnabled(false);
+ mActionModePopup.setFocusable(true);
+ mActionModePopup.setOutsideTouchable(false);
+ mActionModePopup.setTouchModal(false);
+ mActionModePopup.setWindowLayoutType(
+ WindowManager.LayoutParams.TYPE_APPLICATION);
mActionModePopup.setContentView(mActionModeView);
mActionModePopup.setWidth(MATCH_PARENT);
@@ -2144,10 +2166,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
com.android.internal.R.attr.actionBarSize, heightValue, true);
final int height = TypedValue.complexToDimensionPixelSize(heightValue.data,
mContext.getResources().getDisplayMetrics());
- mActionModePopup.setHeight(height);
+ mActionModeView.setContentHeight(height);
+ mActionModePopup.setHeight(WRAP_CONTENT);
mShowActionModePopup = new Runnable() {
public void run() {
- mActionModePopup.showAtLocation(PhoneWindow.DecorView.this,
+ mActionModePopup.showAtLocation(
+ mActionModeView.getApplicationWindowToken(),
Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
}
};
@@ -2728,6 +2752,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
} else {
mActionBar = (ActionBarView) findViewById(com.android.internal.R.id.action_bar);
if (mActionBar != null) {
+ mActionBar.setWindowCallback(getCallback());
if (mActionBar.getTitle() == null) {
mActionBar.setWindowTitle(mTitle);
}
@@ -2740,28 +2765,30 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
boolean splitActionBar = false;
- if ((mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0) {
+ final boolean splitWhenNarrow =
+ (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
+ if (splitWhenNarrow) {
splitActionBar = getContext().getResources().getBoolean(
com.android.internal.R.bool.split_action_bar_is_narrow);
} else {
splitActionBar = getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowSplitActionBar, false);
}
- if (splitActionBar) {
- final ActionBarContainer splitView = (ActionBarContainer) findViewById(
- com.android.internal.R.id.split_action_bar);
- if (splitView != null) {
- splitView.setVisibility(View.VISIBLE);
- mActionBar.setSplitActionBar(splitActionBar);
- mActionBar.setSplitView(splitView);
-
- final ActionBarContextView cab = (ActionBarContextView) findViewById(
- com.android.internal.R.id.action_context_bar);
- cab.setSplitView(splitView);
- } else {
- Log.e(TAG, "Requested split action bar with " +
- "incompatible window decor! Ignoring request.");
- }
+ final ActionBarContainer splitView = (ActionBarContainer) findViewById(
+ com.android.internal.R.id.split_action_bar);
+ if (splitView != null) {
+ mActionBar.setSplitView(splitView);
+ mActionBar.setSplitActionBar(splitActionBar);
+ mActionBar.setSplitWhenNarrow(splitWhenNarrow);
+
+ final ActionBarContextView cab = (ActionBarContextView) findViewById(
+ com.android.internal.R.id.action_context_bar);
+ cab.setSplitView(splitView);
+ cab.setSplitActionBar(splitActionBar);
+ cab.setSplitWhenNarrow(splitWhenNarrow);
+ } else if (splitActionBar) {
+ Log.e(TAG, "Requested split action bar with " +
+ "incompatible window decor! Ignoring request.");
}
// Post the panel invalidate for later; avoid application onCreateOptionsMenu
@@ -3467,6 +3494,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
public boolean onOpenSubMenu(MenuBuilder subMenu) {
+ if (subMenu == null) return false;
+
// Set a simple callback for the submenu
subMenu.setCallback(this);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index c8c0041b2f95..968180ccf06d 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -280,7 +280,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mUserRotationMode = WindowManagerPolicy.USER_ROTATION_FREE;
int mUserRotation = Surface.ROTATION_0;
- boolean mAllowAllRotations;
+ int mAllowAllRotations = -1;
boolean mCarDockEnablesAccelerometer;
boolean mDeskDockEnablesAccelerometer;
int mLidKeyboardAccessibility;
@@ -385,9 +385,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mPortraitRotation = 0; // default portrait rotation
int mUpsideDownRotation = 0; // "other" portrait rotation
- // Nothing to see here, move along...
- int mFancyRotationAnimation;
-
// What we do when the user long presses on home
private int mLongPressOnHomeBehavior = -1;
@@ -439,12 +436,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override public void onChange(boolean selfChange) {
updateSettings();
- try {
- mWindowManager.setRotation(USE_LAST_ROTATION, false,
- mFancyRotationAnimation);
- } catch (RemoteException e) {
- // Ignore
- }
+ updateRotation(false);
}
}
@@ -454,48 +446,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
- public void onOrientationChanged(int rotation) {
- // Send updates based on orientation value
- if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation);
- try {
- mWindowManager.setRotation(rotation, false,
- mFancyRotationAnimation);
- } catch (RemoteException e) {
- // Ignore
-
- }
- }
+ public void onProposedRotationChanged(int rotation) {
+ if (localLOGV) Log.v(TAG, "onProposedRotationChanged, rotation=" + rotation);
+ updateRotation(false);
+ }
}
MyOrientationListener mOrientationListener;
- boolean useSensorForOrientationLp(int appOrientation) {
- // The app says use the sensor.
- if (appOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) {
- return true;
- }
- // The user preference says we can rotate, and the app is willing to rotate.
- if (mAccelerometerDefault != 0 &&
- (appOrientation == ActivityInfo.SCREEN_ORIENTATION_USER
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)) {
- return true;
- }
- // We're in a dock that has a rotation affinity, and the app is willing to rotate.
- if ((mCarDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_CAR)
- || (mDeskDockEnablesAccelerometer && mDockMode == Intent.EXTRA_DOCK_STATE_DESK)) {
- // Note we override the nosensor flag here.
- if (appOrientation == ActivityInfo.SCREEN_ORIENTATION_USER
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
- || appOrientation == ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) {
- return true;
- }
- }
- // Else, don't use the sensor.
- return false;
- }
-
/*
* We always let the sensor be switched on by default except when
* the user has explicitly disabled sensor based rotation or when the
@@ -696,6 +653,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager);
mHandler = new Handler();
mOrientationListener = new MyOrientationListener(mContext);
+ try {
+ mOrientationListener.setCurrentRotation(windowManager.getRotation());
+ } catch (RemoteException ex) { }
SettingsObserver settingsObserver = new SettingsObserver(mHandler);
settingsObserver.observe();
mShortcutManager = new ShortcutManager(context, mHandler);
@@ -723,8 +683,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
com.android.internal.R.integer.config_carDockRotation);
mDeskDockRotation = readRotation(
com.android.internal.R.integer.config_deskDockRotation);
- mAllowAllRotations = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_allowAllRotations);
mCarDockEnablesAccelerometer = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_carDockEnablesAccelerometer);
mDeskDockEnablesAccelerometer = mContext.getResources().getBoolean(
@@ -760,6 +718,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Controls rotation and the like.
initializeHdmiState();
+
+ // Match current screen state.
+ if (mPowerManager.isScreenOn()) {
+ screenTurningOn(null);
+ } else {
+ screenTurnedOff(WindowManagerPolicy.OFF_BECAUSE_OF_USER);
+ }
}
public void setInitialDisplaySize(int width, int height) {
@@ -826,8 +791,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mIncallPowerBehavior = Settings.Secure.getInt(resolver,
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT);
- mFancyRotationAnimation = Settings.System.getInt(resolver,
- "fancy_rotation_anim", 0) != 0 ? 0x80 : 0;
int accelerometerDefault = Settings.System.getInt(resolver,
Settings.System.ACCELEROMETER_ROTATION, DEFAULT_ACCELEROMETER_ROTATION);
@@ -882,7 +845,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
updateScreenSaverTimeoutLocked();
}
if (updateRotation) {
- updateRotation(0);
+ updateRotation(true);
}
if (addView != null) {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
@@ -1025,8 +988,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public void adjustConfigurationLw(Configuration config) {
readLidState();
-
- mPowerManager.setKeyboardVisibility(mLidOpen == LID_OPEN);
+ updateKeyboardVisibility();
if (config.keyboard == Configuration.KEYBOARD_NOKEYS) {
config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
@@ -2295,8 +2257,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
// lid changed state
mLidOpen = lidOpen ? LID_OPEN : LID_CLOSED;
+ updateKeyboardVisibility();
+
boolean awakeNow = mKeyguardMediator.doLidChangeTq(lidOpen);
- updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
+ updateRotation(true);
if (awakeNow) {
// If the lid is opening and we don't have to keep the
// keyguard up, then we can turn on the screen
@@ -2325,7 +2289,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
void setHdmiPlugged(boolean plugged) {
if (mHdmiPlugged != plugged) {
mHdmiPlugged = plugged;
- updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
+ updateRotation(true);
Intent intent = new Intent(ACTION_HDMI_PLUGGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
intent.putExtra(EXTRA_HDMI_PLUGGED_STATE, plugged);
@@ -2802,7 +2766,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} catch (RemoteException e) {
}
}
- updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
+ updateRotation(true);
updateOrientationListenerLp();
}
};
@@ -2825,31 +2789,42 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public void screenTurningOn(final ScreenOnListener screenOnListener) {
EventLog.writeEvent(70000, 1);
- //Slog.i(TAG, "Screen turning on...");
- mKeyguardMediator.onScreenTurnedOn(new KeyguardViewManager.ShowListener() {
- @Override public void onShown(IBinder windowToken) {
- if (windowToken != null) {
- try {
- mWindowManager.waitForWindowDrawn(windowToken, new IRemoteCallback.Stub() {
- @Override public void sendResult(Bundle data) {
- Slog.i(TAG, "Lock screen displayed!");
- screenOnListener.onScreenOn();
- synchronized (mLock) {
- mScreenOnFully = true;
+ if (false) {
+ RuntimeException here = new RuntimeException("here");
+ here.fillInStackTrace();
+ Slog.i(TAG, "Screen turning on...", here);
+ }
+ if (screenOnListener != null) {
+ mKeyguardMediator.onScreenTurnedOn(new KeyguardViewManager.ShowListener() {
+ @Override public void onShown(IBinder windowToken) {
+ if (windowToken != null) {
+ try {
+ mWindowManager.waitForWindowDrawn(windowToken,
+ new IRemoteCallback.Stub() {
+ @Override public void sendResult(Bundle data) {
+ Slog.i(TAG, "Lock screen displayed!");
+ screenOnListener.onScreenOn();
+ synchronized (mLock) {
+ mScreenOnFully = true;
+ }
}
- }
- });
- } catch (RemoteException e) {
- }
- } else {
- Slog.i(TAG, "No lock screen!");
- screenOnListener.onScreenOn();
- synchronized (mLock) {
- mScreenOnFully = true;
+ });
+ } catch (RemoteException e) {
+ }
+ } else {
+ Slog.i(TAG, "No lock screen!");
+ screenOnListener.onScreenOn();
+ synchronized (mLock) {
+ mScreenOnFully = true;
+ }
}
}
+ });
+ } else {
+ synchronized (mLock) {
+ mScreenOnFully = true;
}
- });
+ }
synchronized (mLock) {
mScreenOnEarly = true;
updateOrientationListenerLp();
@@ -2898,6 +2873,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mKeyguardMediator.isInputRestricted();
}
+ public void dismissKeyguardLw() {
+ if (!mKeyguardMediator.isSecure()) {
+ if (mKeyguardMediator.isShowing()) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ mKeyguardMediator.keyguardDone(false, true);
+ }
+ });
+ }
+ }
+ }
+
void sendCloseSystemWindows() {
sendCloseSystemWindows(mContext, null);
}
@@ -2914,10 +2901,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
}
-
- public int rotationForOrientationLw(int orientation, int lastRotation,
- boolean displayEnabled) {
+ @Override
+ public int rotationForOrientationLw(int orientation, int lastRotation) {
if (false) {
Slog.v(TAG, "rotationForOrientationLw(orient="
+ orientation + ", last=" + lastRotation
@@ -2928,128 +2914,142 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
synchronized (mLock) {
+ int sensorRotation = mOrientationListener.getProposedRotation(); // may be -1
+ if (sensorRotation < 0) {
+ sensorRotation = lastRotation;
+ }
+
+ int preferredRotation = -1;
+ if (mHdmiPlugged) {
+ // Ignore sensor when plugged into HDMI.
+ preferredRotation = mLandscapeRotation;
+ } else if (mLidOpen == LID_OPEN && mLidOpenRotation >= 0) {
+ // Ignore sensor when lid switch is open and rotation is forced.
+ preferredRotation = mLidOpenRotation;
+ } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR
+ && (mCarDockEnablesAccelerometer || mCarDockRotation >= 0)) {
+ // Ignore sensor when in car dock unless explicitly enabled.
+ // This case can override the behavior of NOSENSOR, and can also
+ // enable 180 degree rotation while docked.
+ preferredRotation = mCarDockEnablesAccelerometer
+ ? sensorRotation : mCarDockRotation;
+ } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK
+ && (mDeskDockEnablesAccelerometer || mDeskDockRotation >= 0)) {
+ // Ignore sensor when in desk dock unless explicitly enabled.
+ // This case can override the behavior of NOSENSOR, and can also
+ // enable 180 degree rotation while docked.
+ preferredRotation = mDeskDockEnablesAccelerometer
+ ? sensorRotation : mDeskDockRotation;
+ } else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
+ // Ignore sensor when user locked rotation.
+ preferredRotation = mUserRotation;
+ } else if ((mAccelerometerDefault != 0
+ && (orientation == ActivityInfo.SCREEN_ORIENTATION_USER
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED))
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) {
+ // Otherwise, use sensor only if requested by the application or enabled
+ // by default for USER or UNSPECIFIED modes. Does not apply to NOSENSOR.
+ if (mAllowAllRotations < 0) {
+ // Can't read this during init() because the context doesn't
+ // have display metrics at that time so we cannot determine
+ // tablet vs. phone then.
+ mAllowAllRotations = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowAllRotations) ? 1 : 0;
+ }
+ if (sensorRotation != Surface.ROTATION_180
+ || mAllowAllRotations == 1
+ || orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) {
+ preferredRotation = sensorRotation;
+ } else {
+ preferredRotation = lastRotation;
+ }
+ }
+
+ // TODO: Sometimes, we might want to override the application-requested
+ // orientation, such as when HDMI is plugged in or when docked.
+ // We can do that by modifying the appropriate cases above to return
+ // the preferred orientation directly instead of continuing on down here.
+
switch (orientation) {
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
- //always return portrait if orientation set to portrait
+ // Always return portrait if orientation set to portrait.
return mPortraitRotation;
+
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
- //always return landscape if orientation set to landscape
+ // Always return landscape if orientation set to landscape.
return mLandscapeRotation;
+
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
- //always return portrait if orientation set to portrait
+ // Always return portrait if orientation set to portrait.
return mUpsideDownRotation;
+
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
- //always return seascape if orientation set to reverse landscape
+ // Always return seascape if orientation set to reverse landscape.
return mSeascapeRotation;
+
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
- //return either landscape rotation based on the sensor
- return getCurrentLandscapeRotation(lastRotation);
- case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
- return getCurrentPortraitRotation(lastRotation);
- }
+ // Return either landscape rotation.
+ if (isLandscapeOrSeascape(preferredRotation)) {
+ return preferredRotation;
+ }
+ if (isLandscapeOrSeascape(lastRotation)) {
+ return lastRotation;
+ }
+ return mLandscapeRotation;
- // case for nosensor meaning ignore sensor and consider only lid
- // or orientation sensor disabled
- //or case.unspecified
- if (mHdmiPlugged) {
- return mLandscapeRotation;
- } else if (mLidOpen == LID_OPEN) {
- return mLidOpenRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) {
- return mCarDockRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK && mDeskDockRotation >= 0) {
- return mDeskDockRotation;
- } else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
- return mUserRotation;
- } else {
- if (useSensorForOrientationLp(orientation)) {
- // Disable 180 degree rotation unless allowed by default for the device
- // or explicitly requested by the application.
- int rotation = mOrientationListener.getCurrentRotation(lastRotation);
- if (rotation == Surface.ROTATION_180
- && !mAllowAllRotations
- && orientation != ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) {
+ case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
+ // Return either portrait rotation.
+ if (isAnyPortrait(preferredRotation)) {
+ return preferredRotation;
+ }
+ if (isAnyPortrait(lastRotation)) {
return lastRotation;
}
- return rotation;
- }
- return Surface.ROTATION_0;
- }
- }
- }
+ return mPortraitRotation;
- public int getLockedRotationLw() {
- synchronized (mLock) {
- if (false) {
- // Not yet working.
- if (mHdmiPlugged) {
+ default:
+ // For USER, UNSPECIFIED and NOSENSOR, just return the preferred
+ // orientation we already calculated.
+ if (preferredRotation >= 0) {
+ return preferredRotation;
+ }
return Surface.ROTATION_0;
- } else if (mLidOpen == LID_OPEN) {
- return mLidOpenRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) {
- return mCarDockRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK && mDeskDockRotation >= 0) {
- return mDeskDockRotation;
- } else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
- return mUserRotation;
- }
}
- return -1;
}
}
- private int getCurrentLandscapeRotation(int lastRotation) {
- // if the user has locked rotation, we ignore the sensor
- if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
- if (isLandscapeOrSeascape(mUserRotation)) {
- return mUserRotation;
- } else {
- // it seems odd to obey the sensor at all if rotation lock is enabled
- return mLandscapeRotation;
- }
- }
+ @Override
+ public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation) {
+ switch (orientation) {
+ case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
+ case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
+ case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
+ return isAnyPortrait(rotation);
+
+ case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
+ case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
+ case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
+ return isLandscapeOrSeascape(rotation);
- int sensorRotation = mOrientationListener.getCurrentRotation(lastRotation);
- if (isLandscapeOrSeascape(sensorRotation)) {
- return sensorRotation;
- }
- // try to preserve the old rotation if it was landscape
- if (isLandscapeOrSeascape(lastRotation)) {
- return lastRotation;
+ default:
+ return true;
}
- // default to one of the primary landscape rotation
- return mLandscapeRotation;
}
- private boolean isLandscapeOrSeascape(int sensorRotation) {
- return sensorRotation == mLandscapeRotation || sensorRotation == mSeascapeRotation;
+ @Override
+ public void setRotationLw(int rotation) {
+ mOrientationListener.setCurrentRotation(rotation);
}
- private int getCurrentPortraitRotation(int lastRotation) {
- // if the user has locked rotation, we ignore the sensor
- if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
- if (isAnyPortrait(mUserRotation)) {
- return mUserRotation;
- } else {
- // it seems odd to obey the sensor at all if rotation lock is enabled
- return mPortraitRotation;
- }
- }
-
- int sensorRotation = mOrientationListener.getCurrentRotation(lastRotation);
- if (isAnyPortrait(sensorRotation)) {
- return sensorRotation;
- }
- // try to preserve the old rotation if it was portrait
- if (isAnyPortrait(lastRotation)) {
- return lastRotation;
- }
- // default to one of the primary portrait rotations
- return mPortraitRotation;
+ private boolean isLandscapeOrSeascape(int rotation) {
+ return rotation == mLandscapeRotation || rotation == mSeascapeRotation;
}
- private boolean isAnyPortrait(int sensorRotation) {
- return sensorRotation == mPortraitRotation || sensorRotation == mUpsideDownRotation;
+ private boolean isAnyPortrait(int rotation) {
+ return rotation == mPortraitRotation || rotation == mUpsideDownRotation;
}
@@ -3298,26 +3298,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public void enableScreenAfterBoot() {
readLidState();
- updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
+ updateKeyboardVisibility();
+
+ updateRotation(true);
}
- void updateRotation(int animFlags) {
+ private void updateKeyboardVisibility() {
mPowerManager.setKeyboardVisibility(mLidOpen == LID_OPEN);
- int rotation = Surface.ROTATION_0;
- if (mHdmiPlugged) {
- rotation = Surface.ROTATION_0;
- } else if (mLidOpen == LID_OPEN) {
- rotation = mLidOpenRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) {
- rotation = mCarDockRotation;
- } else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK && mDeskDockRotation >= 0) {
- rotation = mDeskDockRotation;
- }
- //if lid is closed orientation will be portrait
+ }
+
+ void updateRotation(boolean alwaysSendConfiguration) {
try {
//set orientation on WindowManager
- mWindowManager.setRotation(rotation, true,
- mFancyRotationAnimation | animFlags);
+ mWindowManager.updateRotation(alwaysSendConfiguration);
} catch (RemoteException e) {
// Ignore
}
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index a58f64c3a989..01f5a6f433be 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -985,6 +985,10 @@ AudioFlinger::ThreadBase::~ThreadBase()
mNewParameters.clear();
// do not lock the mutex in destructor
releaseWakeLock_l();
+ if (mPowerManager != 0) {
+ sp<IBinder> binder = mPowerManager->asBinder();
+ binder->unlinkToDeath(mDeathRecipient);
+ }
}
void AudioFlinger::ThreadBase::exit()
@@ -7440,12 +7444,21 @@ void AudioFlinger::EffectChain::setEffectSuspendedAll_l(bool suspend)
}
}
+
+// The volume effect is used for automated tests only
+#ifndef OPENSL_ES_H_
+static const effect_uuid_t SL_IID_VOLUME_ = { 0x09e8ede0, 0xddde, 0x11db, 0xb4f6,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+const effect_uuid_t * const SL_IID_VOLUME = &SL_IID_VOLUME_;
+#endif //OPENSL_ES_H_
+
bool AudioFlinger::EffectChain::isEffectEligibleForSuspend(const effect_descriptor_t& desc)
{
// auxiliary effects and visualizer are never suspended on output mix
if ((mSessionId == AUDIO_SESSION_OUTPUT_MIX) &&
(((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) ||
- (memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0))) {
+ (memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) ||
+ (memcmp(&desc.type, SL_IID_VOLUME, sizeof(effect_uuid_t)) == 0))) {
return false;
}
return true;
diff --git a/services/audioflinger/AudioResampler.cpp b/services/audioflinger/AudioResampler.cpp
index dca795c40d9e..9ee5a3034533 100644
--- a/services/audioflinger/AudioResampler.cpp
+++ b/services/audioflinger/AudioResampler.cpp
@@ -434,9 +434,9 @@ void AudioResamplerOrder1::AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t
// the following loop works on 2 frames
- ".Y4L01:\n"
+ "1:\n"
" cmp r8, r2\n" // curOut - maxCurOut
- " bcs .Y4L02\n"
+ " bcs 2f\n"
#define MO_ONE_FRAME \
" add r0, r1, r7, asl #1\n" /* in + inputIndex */\
@@ -460,8 +460,8 @@ void AudioResamplerOrder1::AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t
MO_ONE_FRAME // frame 2
" cmp r7, r3\n" // inputIndex - maxInIdx
- " bcc .Y4L01\n"
- ".Y4L02:\n"
+ " bcc 1b\n"
+ "2:\n"
" bic r6, r6, #0xC0000000\n" // phaseFraction & ...
// save modified values
@@ -541,9 +541,9 @@ void AudioResamplerOrder1::AsmStereo16Loop(int16_t *in, int32_t* maxOutPt, int32
// r13 sp
// r14
- ".Y5L01:\n"
+ "3:\n"
" cmp r8, r2\n" // curOut - maxCurOut
- " bcs .Y5L02\n"
+ " bcs 4f\n"
#define ST_ONE_FRAME \
" bic r6, r6, #0xC0000000\n" /* phaseFraction & ... */\
@@ -577,8 +577,8 @@ void AudioResamplerOrder1::AsmStereo16Loop(int16_t *in, int32_t* maxOutPt, int32
ST_ONE_FRAME // frame 1
" cmp r7, r3\n" // inputIndex - maxInIdx
- " bcc .Y5L01\n"
- ".Y5L02:\n"
+ " bcc 3b\n"
+ "4:\n"
" bic r6, r6, #0xC0000000\n" // phaseFraction & ...
// save modified values
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index 5ffcdc50e800..b8c44d9cf99a 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -477,7 +477,7 @@ class AlarmManagerService extends IAlarmManager.Stub {
: bs.filterStats.entrySet()) {
pw.print(" "); pw.print(fe.getValue().count);
pw.print(" alarms: ");
- pw.println(fe.getKey().getIntent().toShortString(true, false));
+ pw.println(fe.getKey().getIntent().toShortString(false, true, false));
}
}
}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 2d24f992f310..fe49cd2bd4c8 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -34,6 +34,7 @@ import android.app.backup.IRestoreSession;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -3379,7 +3380,8 @@ class BackupManagerService extends IBackupManager.Stub {
Uri packageUri = Uri.fromFile(apkFile);
mInstallObserver.reset();
mPackageManager.installPackage(packageUri, mInstallObserver,
- PackageManager.INSTALL_REPLACE_EXISTING, installerPackage);
+ PackageManager.INSTALL_REPLACE_EXISTING | PackageManager.INSTALL_FROM_ADB,
+ installerPackage);
mInstallObserver.waitForCompletion();
if (mInstallObserver.getResult() != PackageManager.INSTALL_SUCCEEDED) {
@@ -4770,6 +4772,11 @@ class BackupManagerService extends IBackupManager.Stub {
}
}
+ boolean deviceIsProvisioned() {
+ final ContentResolver resolver = mContext.getContentResolver();
+ return (Settings.Secure.getInt(resolver, Settings.Secure.DEVICE_PROVISIONED, 0) != 0);
+ }
+
// Run a *full* backup pass for the given package, writing the resulting data stream
// to the supplied file descriptor. This method is synchronous and does not return
// to the caller until the backup has been completed.
@@ -4790,12 +4797,19 @@ class BackupManagerService extends IBackupManager.Stub {
}
}
- if (DEBUG) Slog.v(TAG, "Requesting full backup: apks=" + includeApks
- + " shared=" + includeShared + " all=" + doAllApps
- + " pkgs=" + pkgList);
-
long oldId = Binder.clearCallingIdentity();
try {
+ // Doesn't make sense to do a full backup prior to setup
+ if (!deviceIsProvisioned()) {
+ Slog.i(TAG, "Full backup not supported before setup");
+ return;
+ }
+
+ if (DEBUG) Slog.v(TAG, "Requesting full backup: apks=" + includeApks
+ + " shared=" + includeShared + " all=" + doAllApps
+ + " pkgs=" + pkgList);
+ Slog.i(TAG, "Beginning full backup...");
+
FullBackupParams params = new FullBackupParams(fd, includeApks, includeShared,
doAllApps, pkgList);
final int token = generateToken();
@@ -4827,17 +4841,25 @@ class BackupManagerService extends IBackupManager.Stub {
// just eat it
}
Binder.restoreCallingIdentity(oldId);
+ Slog.d(TAG, "Full backup processing complete.");
}
- if (MORE_DEBUG) Slog.d(TAG, "Full backup done; returning to caller");
}
public void fullRestore(ParcelFileDescriptor fd) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullRestore");
- Slog.i(TAG, "Beginning full restore...");
long oldId = Binder.clearCallingIdentity();
try {
+ // Check whether the device has been provisioned -- we don't handle
+ // full restores prior to completing the setup process.
+ if (!deviceIsProvisioned()) {
+ Slog.i(TAG, "Full restore not permitted before setup");
+ return;
+ }
+
+ Slog.i(TAG, "Beginning full restore...");
+
FullRestoreParams params = new FullRestoreParams(fd);
final int token = generateToken();
synchronized (mFullConfirmations) {
@@ -4868,7 +4890,7 @@ class BackupManagerService extends IBackupManager.Stub {
Slog.w(TAG, "Error trying to close fd after full restore: " + e);
}
Binder.restoreCallingIdentity(oldId);
- Slog.i(TAG, "Full restore completed");
+ Slog.i(TAG, "Full restore processing complete.");
}
}
@@ -5574,6 +5596,16 @@ class BackupManagerService extends IBackupManager.Stub {
}
private void dumpInternal(PrintWriter pw) {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump Backup Manager service from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid()
+ + " without permission "
+ + android.Manifest.permission.DUMP);
+ return;
+ }
+
synchronized (mQueueLock) {
pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled")
+ " / " + (!mProvisioned ? "not " : "") + "provisioned / "
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 0153613d61b9..8112b1d0d149 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -35,6 +35,7 @@ import android.net.EthernetDataTracker;
import android.net.IConnectivityManager;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
+import android.net.INetworkStatsService;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.LinkProperties.CompareResult;
@@ -306,8 +307,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// the set of network types that can only be enabled by system/sig apps
List mProtectedNetworks;
- public ConnectivityService(
- Context context, INetworkManagementService netd, INetworkPolicyManager policyManager) {
+ public ConnectivityService(Context context, INetworkManagementService netd,
+ INetworkStatsService statsService, INetworkPolicyManager policyManager) {
if (DBG) log("ConnectivityService starting up");
HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
@@ -319,7 +320,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
String id = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
if (id != null && id.length() > 0) {
- String name = new String("android_").concat(id);
+ String name = new String("android-").concat(id);
SystemProperties.set("net.hostname", name);
}
}
@@ -496,7 +497,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
INetworkManagementService nmService = INetworkManagementService.Stub.asInterface(b);
- mTethering = new Tethering(mContext, nmService, mHandler.getLooper());
+ mTethering = new Tethering(mContext, nmService, statsService, mHandler.getLooper());
mTetheringConfigValid = ((mTethering.getTetherableUsbRegexs().length != 0 ||
mTethering.getTetherableWifiRegexs().length != 0 ||
mTethering.getTetherableBluetoothRegexs().length != 0) &&
@@ -1974,8 +1975,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
Integer pid = (Integer)pids.get(j);
if (pid.intValue() == myPid) {
Collection<InetAddress> dnses = p.getDnses();
- String proto = determineProto(p);
- writePidDns(dnses, myPid, proto);
+ writePidDns(dnses, myPid);
if (doBump) {
bumpDns();
}
@@ -1985,9 +1985,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
// nothing found - delete
- if (SystemProperties.get("net.dnsproto." + myPid).length() != 0) {
- SystemProperties.set("net.dnsproto." + myPid, "");
- }
for (int i = 1; ; i++) {
String prop = "net.dns" + i + "." + myPid;
if (SystemProperties.get(prop).length() == 0) {
@@ -2001,7 +1998,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
// return true if results in a change
- private boolean writePidDns(Collection <InetAddress> dnses, int pid, String proto) {
+ private boolean writePidDns(Collection <InetAddress> dnses, int pid) {
int j = 1;
boolean changed = false;
for (InetAddress dns : dnses) {
@@ -2011,11 +2008,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress());
}
}
- if (dnses.size() > 0 && (changed || !proto.equals(SystemProperties.get("net.dnsproto." +
- pid)))) {
- changed = true;
- SystemProperties.set("net.dnsproto." + pid, proto);
- }
return changed;
}
@@ -2046,7 +2038,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// Caller must grab mDnsLock.
private boolean updateDns(String network, String iface,
- Collection<InetAddress> dnses, String domains, String proto) {
+ Collection<InetAddress> dnses, String domains) {
boolean changed = false;
int last = 0;
if (dnses.size() == 0 && mDefaultDns != null) {
@@ -2082,11 +2074,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
mNumDnsEntries = last;
- if (changed || !proto.equals(SystemProperties.get("net.dnsproto"))) {
- changed = true;
- SystemProperties.set("net.dnsproto", proto);
- }
-
if (changed) {
try {
mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses));
@@ -2110,14 +2097,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (p == null) return;
Collection<InetAddress> dnses = p.getDnses();
boolean changed = false;
- String proto = determineProto(p);
-
if (mNetConfigs[netType].isDefault()) {
String network = nt.getNetworkInfo().getTypeName();
synchronized (mDnsLock) {
if (!mDnsOverridden) {
- changed = updateDns(network, p.getInterfaceName(), dnses, "",
- proto);
+ changed = updateDns(network, p.getInterfaceName(), dnses, "");
}
}
} else {
@@ -2131,35 +2115,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
List pids = mNetRequestersPids[netType];
for (int y=0; y< pids.size(); y++) {
Integer pid = (Integer)pids.get(y);
- changed = writePidDns(dnses, pid.intValue(), proto);
+ changed = writePidDns(dnses, pid.intValue());
}
}
if (changed) bumpDns();
}
}
- private String determineProto(LinkProperties p) {
- boolean v4 = false;
- boolean v6 = false;
- for (RouteInfo r : p.getRoutes()) {
- if (r.getDestination().getAddress() instanceof Inet6Address) {
- v6 = true;
- } else {
- v4 = true;
- }
- }
- // secondary connections often don't have routes and we infer routes
- // to the dns servers. Look at the dns addrs too
- for (InetAddress i : p.getDnses()) {
- if (i instanceof Inet6Address) {
- v6 = true;
- } else {
- v4 = true;
- }
- }
- return (v4 ? "v4" : "") + (v6 ? "v6" : "");
- }
-
private int getRestoreDefaultNetworkDelay(int networkType) {
String restoreDefaultNetworkDelayStr = SystemProperties.get(
NETWORK_RESTORE_DELAY_PROP_NAME);
@@ -2881,7 +2843,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// Apply DNS changes.
boolean changed = false;
synchronized (mDnsLock) {
- changed = updateDns("VPN", "VPN", addresses, domains, "v4");
+ changed = updateDns("VPN", "VPN", addresses, domains);
mDnsOverridden = true;
}
if (changed) {
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 146bc944724d..bc145b1274d1 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -1362,13 +1362,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mInputShown = true;
res = true;
} else if (mHaveConnection && SystemClock.uptimeMillis()
- < (mLastBindTime+TIME_TO_RECONNECT)) {
+ >= (mLastBindTime+TIME_TO_RECONNECT)) {
// The client has asked to have the input method shown, but
// we have been sitting here too long with a connection to the
// service and no interface received, so let's disconnect/connect
// to try to prod things along.
EventLog.writeEvent(EventLogTags.IMF_FORCE_RECONNECT_IME, mCurMethodId,
SystemClock.uptimeMillis()-mLastBindTime,1);
+ Slog.w(TAG, "Force disconnect/connect to the IME in showCurrentInputLocked()");
mContext.unbindService(this);
mContext.bindService(mCurIntent, this, Context.BIND_AUTO_CREATE);
}
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 0934cd02f8bd..78dbbd6eb555 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -79,6 +79,8 @@ public class PowerManagerService extends IPowerManager.Stub
private static final String TAG = "PowerManagerService";
static final String PARTIAL_NAME = "PowerManagerService";
+ static final boolean DEBUG_SCREEN_ON = false;
+
private static final boolean LOG_PARTIAL_WL = false;
// Indicates whether touch-down cycles should be logged as part of the
@@ -162,6 +164,8 @@ public class PowerManagerService extends IPowerManager.Stub
private final int[] mBroadcastQueue = new int[] { -1, -1, -1 };
private final int[] mBroadcastWhy = new int[3];
private boolean mPreparingForScreenOn = false;
+ private boolean mSkippedScreenOn = false;
+ private boolean mInitialized = false;
private int mPartialCount = 0;
private int mPowerState;
// mScreenOffReason can be WindowManagerPolicy.OFF_BECAUSE_OF_USER,
@@ -557,6 +561,10 @@ public class PowerManagerService extends IPowerManager.Stub
nativeInit();
synchronized (mLocks) {
updateNativePowerStateLocked();
+ // We make sure to start out with the screen on due to user activity.
+ // (They did just boot their device, after all.)
+ forceUserActivityLocked();
+ mInitialized = true;
}
}
@@ -1123,7 +1131,8 @@ public class PowerManagerService extends IPowerManager.Stub
+ " " + ((mNextTimeout-now)/1000) + "s from now");
pw.println(" mDimScreen=" + mDimScreen
+ " mStayOnConditions=" + mStayOnConditions
- + " mPreparingForScreenOn=" + mPreparingForScreenOn);
+ + " mPreparingForScreenOn=" + mPreparingForScreenOn
+ + " mSkippedScreenOn=" + mSkippedScreenOn);
pw.println(" mScreenOffReason=" + mScreenOffReason
+ " mUserState=" + mUserState);
pw.println(" mBroadcastQueue={" + mBroadcastQueue[0] + ',' + mBroadcastQueue[1]
@@ -1312,8 +1321,23 @@ public class PowerManagerService extends IPowerManager.Stub
}
}
- private void sendNotificationLocked(boolean on, int why)
- {
+ private void sendNotificationLocked(boolean on, int why) {
+ if (!mInitialized) {
+ // No notifications sent until first initialization is done.
+ // This is so that when we are moving from our initial state
+ // which looks like the screen was off to it being on, we do not
+ // go through the process of waiting for the higher-level user
+ // space to be ready before turning up the display brightness.
+ // (And also do not send needless broadcasts about the screen.)
+ return;
+ }
+
+ if (DEBUG_SCREEN_ON) {
+ RuntimeException here = new RuntimeException("here");
+ here.fillInStackTrace();
+ Slog.i(TAG, "sendNotificationLocked: " + on, here);
+ }
+
if (!on) {
mStillNeedSleepNotification = false;
}
@@ -1360,7 +1384,9 @@ public class PowerManagerService extends IPowerManager.Stub
// The broadcast queue has changed; make sure the screen is on if it
// is now possible for it to be.
- updateNativePowerStateLocked();
+ if (mSkippedScreenOn) {
+ updateLightsLocked(mPowerState, SCREEN_ON_BIT);
+ }
// Now send the message.
if (index >= 0) {
@@ -1380,7 +1406,7 @@ public class PowerManagerService extends IPowerManager.Stub
synchronized (mLocks) {
if (mPreparingForScreenOn) {
mPreparingForScreenOn = false;
- updateNativePowerStateLocked();
+ updateLightsLocked(mPowerState, SCREEN_ON_BIT);
EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP,
4, mBroadcastWakeLock.mCount);
mBroadcastWakeLock.release();
@@ -1453,7 +1479,7 @@ public class PowerManagerService extends IPowerManager.Stub
synchronized (mLocks) {
EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3,
mBroadcastWakeLock.mCount);
- updateNativePowerStateLocked();
+ updateLightsLocked(mPowerState, SCREEN_ON_BIT);
mBroadcastWakeLock.release();
}
}
@@ -1646,6 +1672,11 @@ public class PowerManagerService extends IPowerManager.Stub
};
private int setScreenStateLocked(boolean on) {
+ if (DEBUG_SCREEN_ON) {
+ RuntimeException e = new RuntimeException("here");
+ e.fillInStackTrace();
+ Slog.i(TAG, "Set screen state: " + on, e);
+ }
int err = Power.setScreenState(on);
if (err == 0) {
mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0);
@@ -1696,7 +1727,7 @@ public class PowerManagerService extends IPowerManager.Stub
} else {
newState &= ~BATTERY_LOW_BIT;
}
- if (newState == mPowerState) {
+ if (newState == mPowerState && mInitialized) {
return;
}
@@ -1722,10 +1753,7 @@ public class PowerManagerService extends IPowerManager.Stub
+ " newBatteryLow=" + ((newState & BATTERY_LOW_BIT) != 0));
}
- if (mPowerState != newState) {
- updateLightsLocked(newState, 0);
- mPowerState = (mPowerState & ~LIGHTS_MASK) | (newState & LIGHTS_MASK);
- }
+ final boolean stateChanged = mPowerState != newState;
if (oldScreenOn != newScreenOn) {
if (newScreenOn) {
@@ -1777,10 +1805,24 @@ public class PowerManagerService extends IPowerManager.Stub
EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, reason,
mTotalTouchDownTime, mTouchCycles);
if (err == 0) {
- mPowerState |= SCREEN_ON_BIT;
sendNotificationLocked(true, -1);
+ // Update the lights *after* taking care of turning the
+ // screen on, so we do this after our notifications are
+ // enqueued and thus will delay turning on the screen light
+ // until the windows are correctly displayed.
+ if (stateChanged) {
+ updateLightsLocked(newState, 0);
+ }
+ mPowerState |= SCREEN_ON_BIT;
}
+
} else {
+ // Update the lights *before* taking care of turning the
+ // screen off, so we can initiate any animations that are desired.
+ if (stateChanged) {
+ updateLightsLocked(newState, 0);
+ }
+
// cancel light sensor task
mHandler.removeCallbacks(mAutoBrightnessTask);
mLightSensorPendingDecrease = false;
@@ -1803,30 +1845,18 @@ public class PowerManagerService extends IPowerManager.Stub
mLastTouchDown = 0;
}
}
+ } else if (stateChanged) {
+ // Screen on/off didn't change, but lights may have.
+ updateLightsLocked(newState, 0);
}
-
+
+ mPowerState = (mPowerState & ~LIGHTS_MASK) | (newState & LIGHTS_MASK);
+
updateNativePowerStateLocked();
}
}
-
+
private void updateNativePowerStateLocked() {
- if ((mPowerState & SCREEN_ON_BIT) != 0) {
- // Don't turn screen on until we know we are really ready to.
- // This is to avoid letting the screen go on before things like the
- // lock screen have been displayed.
- if (mPreparingForScreenOn) {
- // Currently waiting for confirmation from the policy that it
- // is okay to turn on the screen. Don't allow the screen to go
- // on until that is done.
- return;
- }
- for (int i=0; i<mBroadcastQueue.length; i++) {
- if (mBroadcastQueue[i] == 1) {
- // A screen on is currently enqueued.
- return;
- }
- }
- }
nativeSetPowerState(
(mPowerState & SCREEN_ON_BIT) != 0,
(mPowerState & SCREEN_BRIGHT) == SCREEN_BRIGHT);
@@ -1852,8 +1882,43 @@ public class PowerManagerService extends IPowerManager.Stub
mBatteryService.getBatteryLevel() <= Power.LOW_BATTERY_THRESHOLD);
}
+ private boolean shouldDeferScreenOnLocked() {
+ if (mPreparingForScreenOn) {
+ // Currently waiting for confirmation from the policy that it
+ // is okay to turn on the screen. Don't allow the screen to go
+ // on until that is done.
+ if (DEBUG_SCREEN_ON) Slog.i(TAG,
+ "updateLights: delaying screen on due to mPreparingForScreenOn");
+ return true;
+ } else {
+ // If there is a screen-on command in the notification queue, we
+ // can't turn the screen on until it has been processed (and we
+ // have set mPreparingForScreenOn) or it has been dropped.
+ for (int i=0; i<mBroadcastQueue.length; i++) {
+ if (mBroadcastQueue[i] == 1) {
+ if (DEBUG_SCREEN_ON) Slog.i(TAG,
+ "updateLights: delaying screen on due to notification queue");
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private void updateLightsLocked(int newState, int forceState) {
final int oldState = mPowerState;
+
+ // If the screen is not currently on, we will want to delay actually
+ // turning the lights on if we are still getting the UI put up.
+ if ((oldState&SCREEN_ON_BIT) == 0 || mSkippedScreenOn) {
+ // Don't turn screen on until we know we are really ready to.
+ // This is to avoid letting the screen go on before things like the
+ // lock screen have been displayed.
+ if ((mSkippedScreenOn=shouldDeferScreenOnLocked())) {
+ newState &= ~(SCREEN_ON_BIT|SCREEN_BRIGHT_BIT);
+ }
+ }
+
if ((newState & SCREEN_ON_BIT) != 0) {
// Only turn on the buttons or keyboard if the screen is also on.
// We should never see the buttons on but not the screen.
@@ -1960,6 +2025,13 @@ public class PowerManagerService extends IPowerManager.Stub
}
mScreenBrightness.setTargetLocked(brightness, steps,
INITIAL_SCREEN_BRIGHTNESS, nominalCurrentValue);
+ if (DEBUG_SCREEN_ON) {
+ RuntimeException e = new RuntimeException("here");
+ e.fillInStackTrace();
+ Slog.i(TAG, "Setting screen brightness: " + brightness, e);
+ mScreenBrightness.setTargetLocked(brightness, steps,
+ INITIAL_SCREEN_BRIGHTNESS, nominalCurrentValue);
+ }
}
if (mSpew) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index cdefa001a7d6..5006de757cd3 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -370,7 +370,8 @@ class ServerThread extends Thread {
try {
Slog.i(TAG, "Connectivity Service");
- connectivity = new ConnectivityService(context, networkManagement, networkPolicy);
+ connectivity = new ConnectivityService(
+ context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java
index c792b33bf2b4..ef48b9e2bc30 100644
--- a/services/java/com/android/server/TextServicesManagerService.java
+++ b/services/java/com/android/server/TextServicesManagerService.java
@@ -238,7 +238,8 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
}
} else if (scs.hashCode() == hashCode) {
if (DBG) {
- Slog.w(TAG, "Return subtype " + scs.hashCode());
+ Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale
+ + ", " + scs.getLocale());
}
return scs;
}
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index 6ceccafdbd6a..253e74159060 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -120,7 +120,8 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
notifyCallbacksLocked();
if (mWallpaperComponent == null || mImageWallpaperPending) {
mImageWallpaperPending = false;
- bindWallpaperComponentLocked(mImageWallpaperComponent, true);
+ bindWallpaperComponentLocked(mImageWallpaperComponent,
+ true, false);
saveSettingsLocked();
}
}
@@ -201,7 +202,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
if (!mWallpaperUpdating && (mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
> SystemClock.uptimeMillis()) {
Slog.w(TAG, "Reverting to built-in wallpaper!");
- bindWallpaperComponentLocked(null, true);
+ clearWallpaperLocked(true);
}
}
}
@@ -230,9 +231,23 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
mWallpaperUpdating = false;
ComponentName comp = mWallpaperComponent;
clearWallpaperComponentLocked();
- bindWallpaperComponentLocked(comp, false);
+ if (!bindWallpaperComponentLocked(comp, false, false)) {
+ Slog.w(TAG, "Wallpaper no longer available; reverting to default");
+ clearWallpaperLocked(false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPackageModified(String packageName) {
+ synchronized (mLock) {
+ if (mWallpaperComponent == null ||
+ !mWallpaperComponent.getPackageName().equals(packageName)) {
+ return;
}
}
+ doPackagesChanged(true);
}
@Override
@@ -265,7 +280,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
changed = true;
if (doit) {
Slog.w(TAG, "Wallpaper uninstalled, removing: " + mWallpaperComponent);
- clearWallpaperLocked();
+ clearWallpaperLocked(false);
}
}
}
@@ -283,7 +298,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
mWallpaperComponent, 0);
} catch (NameNotFoundException e) {
Slog.w(TAG, "Wallpaper component gone, removing: " + mWallpaperComponent);
- clearWallpaperLocked();
+ clearWallpaperLocked(false);
}
}
if (mNextWallpaperComponent != null
@@ -321,45 +336,51 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
public void systemReady() {
if (DEBUG) Slog.v(TAG, "systemReady");
synchronized (mLock) {
+ RuntimeException e = null;
try {
- bindWallpaperComponentLocked(mNextWallpaperComponent, false);
- } catch (RuntimeException e) {
- Slog.w(TAG, "Failure starting previous wallpaper", e);
- try {
- bindWallpaperComponentLocked(null, false);
- } catch (RuntimeException e2) {
- Slog.w(TAG, "Failure starting default wallpaper", e2);
- clearWallpaperComponentLocked();
+ if (bindWallpaperComponentLocked(mNextWallpaperComponent, false, false)) {
+ return;
}
+ } catch (RuntimeException e1) {
+ e = e1;
}
+ Slog.w(TAG, "Failure starting previous wallpaper", e);
+ clearWallpaperLocked(false);
}
}
public void clearWallpaper() {
if (DEBUG) Slog.v(TAG, "clearWallpaper");
synchronized (mLock) {
- clearWallpaperLocked();
+ clearWallpaperLocked(false);
}
}
- public void clearWallpaperLocked() {
+ public void clearWallpaperLocked(boolean defaultFailed) {
File f = WALLPAPER_FILE;
if (f.exists()) {
f.delete();
}
final long ident = Binder.clearCallingIdentity();
+ RuntimeException e = null;
try {
mImageWallpaperPending = false;
- bindWallpaperComponentLocked(null, false);
- } catch (IllegalArgumentException e) {
- // This can happen if the default wallpaper component doesn't
- // exist. This should be a system configuration problem, but
- // let's not let it crash the system and just live with no
- // wallpaper.
- Slog.e(TAG, "Default wallpaper component not found!", e);
+ if (bindWallpaperComponentLocked(defaultFailed
+ ? mImageWallpaperComponent : null, true, false)) {
+ return;
+ }
+ } catch (IllegalArgumentException e1) {
+ e = e1;
} finally {
Binder.restoreCallingIdentity(ident);
}
+
+ // This can happen if the default wallpaper component doesn't
+ // exist. This should be a system configuration problem, but
+ // let's not let it crash the system and just live with no
+ // wallpaper.
+ Slog.e(TAG, "Default wallpaper component not found!", e);
+ clearWallpaperComponentLocked();
}
public void setDimensionHints(int width, int height) throws RemoteException {
@@ -469,14 +490,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
final long ident = Binder.clearCallingIdentity();
try {
mImageWallpaperPending = false;
- bindWallpaperComponentLocked(name, false);
+ bindWallpaperComponentLocked(name, false, true);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
- void bindWallpaperComponentLocked(ComponentName componentName, boolean force) {
+ boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force, boolean fromUser) {
if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
// Has the component changed?
@@ -486,12 +507,12 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
if (componentName == null) {
if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
// Still using default wallpaper.
- return;
+ return true;
}
} else if (mWallpaperComponent.equals(componentName)) {
// Changing to same wallpaper.
if (DEBUG) Slog.v(TAG, "same wallpaper");
- return;
+ return true;
}
}
}
@@ -516,9 +537,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
ServiceInfo si = mContext.getPackageManager().getServiceInfo(componentName,
PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS);
if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
- throw new SecurityException("Selected service does not require "
+ String msg = "Selected service does not require "
+ android.Manifest.permission.BIND_WALLPAPER
- + ": " + componentName);
+ + ": " + componentName;
+ if (fromUser) {
+ throw new SecurityException(msg);
+ }
+ Slog.w(TAG, msg);
+ return false;
}
WallpaperInfo wi = null;
@@ -535,16 +561,29 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
try {
wi = new WallpaperInfo(mContext, ris.get(i));
} catch (XmlPullParserException e) {
- throw new IllegalArgumentException(e);
+ if (fromUser) {
+ throw new IllegalArgumentException(e);
+ }
+ Slog.w(TAG, e);
+ return false;
} catch (IOException e) {
- throw new IllegalArgumentException(e);
+ if (fromUser) {
+ throw new IllegalArgumentException(e);
+ }
+ Slog.w(TAG, e);
+ return false;
}
break;
}
}
if (wi == null) {
- throw new SecurityException("Selected service is not a wallpaper: "
- + componentName);
+ String msg = "Selected service is not a wallpaper: "
+ + componentName;
+ if (fromUser) {
+ throw new SecurityException(msg);
+ }
+ Slog.w(TAG, msg);
+ return false;
}
}
@@ -561,8 +600,13 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
0));
if (!mContext.bindService(intent, newConn,
Context.BIND_AUTO_CREATE)) {
- throw new IllegalArgumentException("Unable to bind service: "
- + componentName);
+ String msg = "Unable to bind service: "
+ + componentName;
+ if (fromUser) {
+ throw new IllegalArgumentException(msg);
+ }
+ Slog.w(TAG, msg);
+ return false;
}
clearWallpaperComponentLocked();
@@ -577,8 +621,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
}
} catch (PackageManager.NameNotFoundException e) {
- throw new IllegalArgumentException("Unknown component " + componentName);
+ String msg = "Unknown component " + componentName;
+ if (fromUser) {
+ throw new IllegalArgumentException(msg);
+ }
+ Slog.w(TAG, msg);
+ return false;
}
+ return true;
}
void clearWallpaperComponentLocked() {
@@ -611,7 +661,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
} catch (RemoteException e) {
Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
if (!mWallpaperUpdating) {
- bindWallpaperComponentLocked(null, false);
+ bindWallpaperComponentLocked(null, false, false);
}
}
}
@@ -765,13 +815,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
loadSettingsLocked();
if (mNextWallpaperComponent != null &&
!mNextWallpaperComponent.equals(mImageWallpaperComponent)) {
- try {
- bindWallpaperComponentLocked(mNextWallpaperComponent, false);
- } catch (IllegalArgumentException e) {
+ if (!bindWallpaperComponentLocked(mNextWallpaperComponent, false, false)) {
// No such live wallpaper or other failure; fall back to the default
// live wallpaper (since the profile being restored indicated that the
// user had selected a live rather than static one).
- bindWallpaperComponentLocked(null, false);
+ bindWallpaperComponentLocked(null, false, false);
}
success = true;
} else {
@@ -786,7 +834,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
}
if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
if (success) {
- bindWallpaperComponentLocked(null, false);
+ bindWallpaperComponentLocked(null, false, false);
}
}
}
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 6830055367e4..ed8fa40f9dc3 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -718,8 +718,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
*/
private void manageServicesLocked() {
populateEnabledServicesLocked(mEnabledServices);
- updateServicesStateLocked(mInstalledServices, mEnabledServices);
- disableAccessibilityIfNoEnabledServices(mEnabledServices);
+ final int enabledInstalledServicesCount = updateServicesStateLocked(mInstalledServices,
+ mEnabledServices);
+ // No enabled installed services => disable accessibility to avoid
+ // sending accessibility events with no recipient across processes.
+ if (mIsAccessibilityEnabled && enabledInstalledServicesCount == 0) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+ }
}
/**
@@ -771,13 +777,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
*
* @param installedServices All installed {@link AccessibilityService}s.
* @param enabledServices The {@link ComponentName}s of the enabled services.
+ * @return The number of enabled installed services.
*/
- private void updateServicesStateLocked(List<AccessibilityServiceInfo> installedServices,
+ private int updateServicesStateLocked(List<AccessibilityServiceInfo> installedServices,
Set<ComponentName> enabledServices) {
Map<ComponentName, Service> componentNameToServiceMap = mComponentNameToServiceMap;
boolean isEnabled = mIsAccessibilityEnabled;
+ int enabledInstalledServices = 0;
for (int i = 0, count = installedServices.size(); i < count; i++) {
AccessibilityServiceInfo installedService = installedServices.get(i);
ComponentName componentName = ComponentName.unflattenFromString(
@@ -790,6 +798,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
service = new Service(componentName, installedService, false);
}
service.bind();
+ enabledInstalledServices++;
} else {
if (service != null) {
service.unbind();
@@ -801,19 +810,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
}
- }
- /**
- * Disables accessibility if there are no enabled accessibility services which
- * to consume the generated accessibility events.
- *
- * @param enabledServices The set of enabled services.
- */
- private void disableAccessibilityIfNoEnabledServices(Set<ComponentName> enabledServices) {
- if (enabledServices.isEmpty()) {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_ENABLED, 0);
- }
+ return enabledInstalledServices;
}
/**
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 41af1373db06..2942c28a5a6e 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -1631,8 +1631,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (app.conProviders.size() > 0) {
for (ContentProviderRecord cpr : app.conProviders.keySet()) {
- if (cpr.app != null && cpr.app.lruSeq != mLruSeq) {
- updateLruProcessInternalLocked(cpr.app, oomAdj,
+ if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq) {
+ updateLruProcessInternalLocked(cpr.proc, oomAdj,
updateActivityTime, i+1);
}
}
@@ -3334,6 +3334,11 @@ public final class ActivityManagerService extends ActivityManagerNative
if ((samePackage || r.task == lastTask)
&& (r.app == null || evenPersistent || !r.app.persistent)) {
if (!doit) {
+ if (r.finishing) {
+ // If this activity is just finishing, then it is not
+ // interesting as far as something to stop.
+ continue;
+ }
return true;
}
didSomething = true;
@@ -3373,7 +3378,24 @@ public final class ActivityManagerService extends ActivityManagerNative
for (i=0; i<N; i++) {
bringDownServiceLocked(services.get(i), true);
}
-
+
+ ArrayList<ContentProviderRecord> providers = new ArrayList<ContentProviderRecord>();
+ for (ContentProviderRecord provider : mProvidersByClass.values()) {
+ if (provider.info.packageName.equals(name)
+ && (provider.proc == null || evenPersistent || !provider.proc.persistent)) {
+ if (!doit) {
+ return true;
+ }
+ didSomething = true;
+ providers.add(provider);
+ }
+ }
+
+ N = providers.size();
+ for (i=0; i<N; i++) {
+ removeDyingProviderLocked(null, providers.get(i));
+ }
+
if (doit) {
if (purgeCache) {
AttributeCache ac = AttributeCache.instance();
@@ -3382,6 +3404,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
mMainStack.resumeTopActivityLocked(null);
+ mMainStack.scheduleIdleLocked();
}
return didSomething;
@@ -3761,6 +3784,12 @@ public final class ActivityManagerService extends ActivityManagerNative
mWindowManager.showBootMessage(msg, always);
}
+ public void dismissKeyguardOnNextActivity() {
+ synchronized (this) {
+ mMainStack.dismissKeyguardOnNextActivityLocked();
+ }
+ }
+
final void finishBooting() {
IntentFilter pkgFilter = new IntentFilter();
pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
@@ -5485,7 +5514,7 @@ public final class ActivityManagerService extends ActivityManagerNative
ComponentName comp = new ComponentName(cpi.packageName, cpi.name);
ContentProviderRecord cpr = mProvidersByClass.get(comp);
if (cpr == null) {
- cpr = new ContentProviderRecord(cpi, app.info);
+ cpr = new ContentProviderRecord(cpi, app.info, comp);
mProvidersByClass.put(comp, cpr);
}
app.pubProviders.put(cpi.name, cpr);
@@ -5643,25 +5672,25 @@ public final class ActivityManagerService extends ActivityManagerNative
// return it right away.
final boolean countChanged = incProviderCount(r, cpr);
if (countChanged) {
- if (cpr.app != null && r.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
+ if (cpr.proc != null && r.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
// If this is a perceptible app accessing the provider,
// make sure to count it as being accessed and thus
// back up on the LRU list. This is good because
// content providers are often expensive to start.
- updateLruProcessLocked(cpr.app, false, true);
+ updateLruProcessLocked(cpr.proc, false, true);
}
}
- if (cpr.app != null) {
+ if (cpr.proc != null) {
if (false) {
if (cpr.name.flattenToShortString().equals(
"com.android.providers.calendar/.CalendarProvider2")) {
Slog.v(TAG, "****************** KILLING "
+ cpr.name.flattenToShortString());
- Process.killProcess(cpr.app.pid);
+ Process.killProcess(cpr.proc.pid);
}
}
- boolean success = updateOomAdjLocked(cpr.app);
+ boolean success = updateOomAdjLocked(cpr.proc);
if (DEBUG_PROVIDER) Slog.i(TAG, "Adjust success: " + success);
// NOTE: there is still a race here where a signal could be
// pending on the process even though we managed to update its
@@ -5676,7 +5705,7 @@ public final class ActivityManagerService extends ActivityManagerNative
"Existing provider " + cpr.name.flattenToShortString()
+ " is crashing; detaching " + r);
boolean lastRef = decProviderCount(r, cpr);
- appDiedLocked(cpr.app, cpr.app.pid, cpr.app.thread);
+ appDiedLocked(cpr.proc, cpr.proc.pid, cpr.proc.thread);
if (!lastRef) {
// This wasn't the last ref our process had on
// the provider... we have now been killed, bail.
@@ -5729,7 +5758,7 @@ public final class ActivityManagerService extends ActivityManagerNative
+ cpi.name);
return null;
}
- cpr = new ContentProviderRecord(cpi, ai);
+ cpr = new ContentProviderRecord(cpi, ai, comp);
} catch (RemoteException ex) {
// pm is in same process, this will never happen.
}
@@ -5864,7 +5893,7 @@ public final class ActivityManagerService extends ActivityManagerNative
//update content provider record entry info
ComponentName comp = new ComponentName(cpr.info.packageName, cpr.info.name);
ContentProviderRecord localCpr = mProvidersByClass.get(comp);
- if (localCpr.app == r) {
+ if (localCpr.proc == r) {
//should not happen. taken care of as a local provider
Slog.w(TAG, "removeContentProvider called on local provider: "
+ cpr.info.name + " in process " + r.processName);
@@ -5940,7 +5969,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
synchronized (dst) {
dst.provider = src.provider;
- dst.app = r;
+ dst.proc = r;
dst.notifyAll();
}
updateOomAdjLocked(r);
@@ -7884,6 +7913,8 @@ public final class ActivityManagerService extends ActivityManagerNative
if (dumpAll) {
pw.println(" mLastPausedActivity: " + mMainStack.mLastPausedActivity);
pw.println(" mSleepTimeout: " + mMainStack.mSleepTimeout);
+ pw.println(" mDismissKeyguardOnNextActivity: "
+ + mMainStack.mDismissKeyguardOnNextActivity);
}
if (mRecentTasks.size() > 0) {
@@ -8524,7 +8555,7 @@ public final class ActivityManagerService extends ActivityManagerNative
for (int i=0; i<N; i++) {
sb.setLength(0);
sb.append(" Intent: ");
- intents.get(i).toShortString(sb, true, false);
+ intents.get(i).toShortString(sb, false, true, false);
pw.println(sb.toString());
Bundle bundle = intents.get(i).getExtras();
if (bundle != null) {
@@ -8706,9 +8737,9 @@ public final class ActivityManagerService extends ActivityManagerNative
r.dump(pw, " ");
} else {
pw.print(" * "); pw.print(e.getKey().flattenToShortString());
- if (r.app != null) {
+ if (r.proc != null) {
pw.println(":");
- pw.print(" "); pw.println(r.app);
+ pw.print(" "); pw.println(r.proc);
} else {
pw.println();
}
@@ -8817,7 +8848,8 @@ public final class ActivityManagerService extends ActivityManagerNative
} else if (complete) {
// Complete + brief == give a summary. Isn't that obvious?!?
if (lastTask.intent != null) {
- pw.print(prefix); pw.print(" "); pw.println(lastTask.intent);
+ pw.print(prefix); pw.print(" ");
+ pw.println(lastTask.intent.toInsecureString());
}
}
}
@@ -8828,7 +8860,7 @@ public final class ActivityManagerService extends ActivityManagerNative
r.dump(pw, innerPrefix);
} else if (complete) {
// Complete + brief == give a summary. Isn't that obvious?!?
- pw.print(innerPrefix); pw.println(r.intent);
+ pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
if (r.app != null) {
pw.print(innerPrefix); pw.println(r.app);
}
@@ -9440,7 +9472,7 @@ public final class ActivityManagerService extends ActivityManagerNative
cpr.notifyAll();
}
- mProvidersByClass.remove(cpr.info.name);
+ mProvidersByClass.remove(cpr.name);
String names[] = cpr.info.authority.split(";");
for (int j = 0; j < names.length; j++) {
mProvidersByName.remove(names[j]);
@@ -9454,9 +9486,10 @@ public final class ActivityManagerService extends ActivityManagerNative
&& capp.pid != MY_PID) {
Slog.i(TAG, "Kill " + capp.processName
+ " (pid " + capp.pid + "): provider " + cpr.info.name
- + " in dying process " + proc.processName);
+ + " in dying process " + (proc != null ? proc.processName : "??"));
EventLog.writeEvent(EventLogTags.AM_KILL, capp.pid,
- capp.processName, capp.setAdj, "dying provider " + proc.processName);
+ capp.processName, capp.setAdj, "dying provider "
+ + cpr.name.toShortString());
Process.killProcessQuiet(capp.pid);
}
}
@@ -9515,7 +9548,7 @@ public final class ActivityManagerService extends ActivityManagerNative
while (it.hasNext()) {
ContentProviderRecord cpr = it.next();
cpr.provider = null;
- cpr.app = null;
+ cpr.proc = null;
// See if someone is waiting for this provider... in which
// case we don't remove it, but just let it restart.
@@ -10029,7 +10062,7 @@ public final class ActivityManagerService extends ActivityManagerNative
boolean created = false;
try {
mStringBuilder.setLength(0);
- r.intent.getIntent().toShortString(mStringBuilder, false, true);
+ r.intent.getIntent().toShortString(mStringBuilder, true, false, true);
EventLog.writeEvent(EventLogTags.AM_CREATE_SERVICE,
System.identityHashCode(r), r.shortName,
mStringBuilder.toString(), r.app.pid);
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 73ffafb66ec1..ce45bfb17ba9 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -122,7 +122,7 @@ final class ActivityRecord extends IApplicationToken.Stub {
pw.print(" processName="); pw.println(processName);
pw.print(prefix); pw.print("launchedFromUid="); pw.print(launchedFromUid);
pw.print(" app="); pw.println(app);
- pw.print(prefix); pw.println(intent);
+ pw.print(prefix); pw.println(intent.toInsecureString());
pw.print(prefix); pw.print("frontOfTask="); pw.print(frontOfTask);
pw.print(" task="); pw.println(task);
pw.print(prefix); pw.print("taskAffinity="); pw.println(taskAffinity);
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index a0aedf984473..7bc19ab43882 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -259,6 +259,11 @@ final class ActivityStack {
*/
boolean mSleepTimeout = false;
+ /**
+ * Dismiss the keyguard after the next activity is displayed?
+ */
+ boolean mDismissKeyguardOnNextActivity = false;
+
int mThumbnailWidth = -1;
int mThumbnailHeight = -1;
@@ -765,9 +770,7 @@ final class ActivityStack {
// Still need to tell some activities to stop; can't sleep yet.
if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
+ mStoppingActivities.size() + " activities");
- Message msg = Message.obtain();
- msg.what = IDLE_NOW_MSG;
- mHandler.sendMessage(msg);
+ scheduleIdleLocked();
return;
}
@@ -978,9 +981,7 @@ final class ActivityStack {
// then give up on things going idle and start clearing
// them out.
if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
- Message msg = Message.obtain();
- msg.what = IDLE_NOW_MSG;
- mHandler.sendMessage(msg);
+ scheduleIdleLocked();
} else {
checkReadyForSleepLocked();
}
@@ -2173,7 +2174,7 @@ final class ActivityStack {
}
if (err == START_SUCCESS) {
- Slog.i(TAG, "Starting: " + intent + " from pid "
+ Slog.i(TAG, "START {" + intent.toShortString(true, true, true) + "} from pid "
+ (callerApp != null ? callerApp.pid : callingPid));
}
@@ -2228,6 +2229,7 @@ final class ActivityStack {
resultRecord, resultWho, requestCode,
Activity.RESULT_CANCELED, null);
}
+ mDismissKeyguardOnNextActivity = false;
return err;
}
@@ -2239,6 +2241,7 @@ final class ActivityStack {
resultRecord, resultWho, requestCode,
Activity.RESULT_CANCELED, null);
}
+ mDismissKeyguardOnNextActivity = false;
String msg;
if (!aInfo.exported) {
msg = "Permission Denial: starting " + intent.toString()
@@ -2276,6 +2279,7 @@ final class ActivityStack {
}
// We pretend to the caller that it was really started, but
// they will just get a cancel result.
+ mDismissKeyguardOnNextActivity = false;
return START_SUCCESS;
}
}
@@ -2299,6 +2303,7 @@ final class ActivityStack {
pal.grantedMode = grantedMode;
pal.onlyIfNeeded = onlyIfNeeded;
mService.mPendingActivityLaunches.add(pal);
+ mDismissKeyguardOnNextActivity = false;
return START_SWITCHES_CANCELED;
}
}
@@ -2317,8 +2322,17 @@ final class ActivityStack {
mService.doPendingActivityLaunchesLocked(false);
}
- return startActivityUncheckedLocked(r, sourceRecord,
+ err = startActivityUncheckedLocked(r, sourceRecord,
grantedUriPermissions, grantedMode, onlyIfNeeded, true);
+ if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
+ // Someone asked to have the keyguard dismissed on the next
+ // activity start, but we are not actually doing an activity
+ // switch... just dismiss the keyguard now, because we
+ // probably want to see whatever is behind it.
+ mDismissKeyguardOnNextActivity = false;
+ mService.mWindowManager.dismissKeyguard();
+ }
+ return err;
}
final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
@@ -2987,6 +3001,11 @@ final class ActivityStack {
w.thisTime = w.totalTime;
}
mService.notifyAll();
+
+ if (mDismissKeyguardOnNextActivity) {
+ mDismissKeyguardOnNextActivity = false;
+ mService.mWindowManager.dismissKeyguard();
+ }
}
void sendActivityResultLocked(int callingUid, ActivityRecord r,
@@ -3103,6 +3122,12 @@ final class ActivityStack {
return stops;
}
+ final void scheduleIdleLocked() {
+ Message msg = Message.obtain();
+ msg.what = IDLE_NOW_MSG;
+ mHandler.sendMessage(msg);
+ }
+
final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
Configuration config) {
if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
@@ -3413,9 +3438,7 @@ final class ActivityStack {
// If we already have a few activities waiting to stop,
// then give up on things going idle and start clearing
// them out.
- Message msg = Message.obtain();
- msg.what = IDLE_NOW_MSG;
- mHandler.sendMessage(msg);
+ scheduleIdleLocked();
} else {
checkReadyForSleepLocked();
}
@@ -4126,4 +4149,8 @@ final class ActivityStack {
return true;
}
+
+ public void dismissKeyguardOnNextActivityLocked() {
+ mDismissKeyguardOnNextActivity = true;
+ }
}
diff --git a/services/java/com/android/server/am/ContentProviderRecord.java b/services/java/com/android/server/am/ContentProviderRecord.java
index db235ee849e2..9c55597530d2 100644
--- a/services/java/com/android/server/am/ContentProviderRecord.java
+++ b/services/java/com/android/server/am/ContentProviderRecord.java
@@ -32,15 +32,15 @@ class ContentProviderRecord extends ContentProviderHolder {
final ApplicationInfo appInfo;
final ComponentName name;
int externals; // number of non-framework processes supported by this provider
- ProcessRecord app; // if non-null, hosting application
+ ProcessRecord proc; // if non-null, hosting process.
ProcessRecord launchingApp; // if non-null, waiting for this app to be launched.
String stringName;
- public ContentProviderRecord(ProviderInfo _info, ApplicationInfo ai) {
+ public ContentProviderRecord(ProviderInfo _info, ApplicationInfo ai, ComponentName _name) {
super(_info);
uid = ai.uid;
appInfo = ai;
- name = new ComponentName(_info.packageName, _info.name);
+ name = _name;
noReleaseNeeded = uid == 0 || uid == Process.SYSTEM_UID;
}
@@ -61,7 +61,7 @@ class ContentProviderRecord extends ContentProviderHolder {
pw.print(prefix); pw.print("package=");
pw.print(info.applicationInfo.packageName);
pw.print(" process="); pw.println(info.processName);
- pw.print(prefix); pw.print("app="); pw.println(app);
+ pw.print(prefix); pw.print("proc="); pw.println(proc);
if (launchingApp != null) {
pw.print(prefix); pw.print("launchingApp="); pw.println(launchingApp);
}
diff --git a/services/java/com/android/server/am/IntentBindRecord.java b/services/java/com/android/server/am/IntentBindRecord.java
index 3a5ca669c827..2618c77e2b2d 100644
--- a/services/java/com/android/server/am/IntentBindRecord.java
+++ b/services/java/com/android/server/am/IntentBindRecord.java
@@ -54,7 +54,7 @@ class IntentBindRecord {
void dumpInService(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("intent={");
- pw.print(intent.getIntent().toShortString(true, false));
+ pw.print(intent.getIntent().toShortString(false, true, false));
pw.println('}');
pw.print(prefix); pw.print("binder="); pw.println(binder);
pw.print(prefix); pw.print("requested="); pw.print(requested);
@@ -89,7 +89,7 @@ class IntentBindRecord {
sb.append(service.shortName);
sb.append(':');
if (intent != null) {
- intent.getIntent().toShortString(sb, false, false);
+ intent.getIntent().toShortString(sb, false, false, false);
}
sb.append('}');
return stringName = sb.toString();
diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java
index 8ed0cc11abd8..abd2a1f1207d 100644
--- a/services/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/java/com/android/server/am/PendingIntentRecord.java
@@ -150,7 +150,8 @@ class PendingIntentRecord extends IIntentSender.Stub {
public String toString() {
return "Key{" + typeName() + " pkg=" + packageName
+ " intent="
- + (requestIntent != null ? requestIntent.toShortString(true, false) : "<null>")
+ + (requestIntent != null
+ ? requestIntent.toShortString(false, true, false) : "<null>")
+ " flags=0x" + Integer.toHexString(flags) + "}";
}
@@ -317,7 +318,7 @@ class PendingIntentRecord extends IIntentSender.Stub {
}
if (key.requestIntent != null) {
pw.print(prefix); pw.print("requestIntent=");
- pw.println(key.requestIntent.toShortString(true, true));
+ pw.println(key.requestIntent.toShortString(false, true, true));
}
if (sent || canceled) {
pw.print(prefix); pw.print("sent="); pw.print(sent);
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index 004e963b27fe..257113bbe671 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -192,7 +192,7 @@ class ServiceRecord extends Binder {
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("intent={");
- pw.print(intent.getIntent().toShortString(true, false));
+ pw.print(intent.getIntent().toShortString(false, true, false));
pw.println('}');
pw.print(prefix); pw.print("packageName="); pw.println(packageName);
pw.print(prefix); pw.print("processName="); pw.println(processName);
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 87129eaca73f..a86076344e8a 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -94,14 +94,14 @@ class TaskRecord extends ThumbnailHolder {
if (intent != null) {
StringBuilder sb = new StringBuilder(128);
sb.append(prefix); sb.append("intent={");
- intent.toShortString(sb, true, false);
+ intent.toShortString(sb, false, true, false);
sb.append('}');
pw.println(sb.toString());
}
if (affinityIntent != null) {
StringBuilder sb = new StringBuilder(128);
sb.append(prefix); sb.append("affinityIntent={");
- affinityIntent.toShortString(sb, true, false);
+ affinityIntent.toShortString(sb, false, true, false);
sb.append('}');
pw.println(sb.toString());
}
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 10f6d2ccdc5f..6b9c08852124 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -29,6 +29,7 @@ import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
+import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -88,7 +89,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
// upstream type list and the DUN_REQUIRED secure-setting
private int mPreferredUpstreamMobileApn = ConnectivityManager.TYPE_NONE;
- private INetworkManagementService mNMService;
+ private final INetworkManagementService mNMService;
+ private final INetworkStatsService mStatsService;
private Looper mLooper;
private HandlerThread mThread;
@@ -124,9 +126,11 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
private boolean mUsbTetherRequested; // true if USB tethering should be started
// when RNDIS is enabled
- public Tethering(Context context, INetworkManagementService nmService, Looper looper) {
+ public Tethering(Context context, INetworkManagementService nmService,
+ INetworkStatsService statsService, Looper looper) {
mContext = context;
mNMService = nmService;
+ mStatsService = statsService;
mLooper = looper;
mIfaces = new HashMap<String, TetherInterfaceSM>();
@@ -913,6 +917,9 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
case CMD_INTERFACE_DOWN:
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
@@ -957,6 +964,9 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
}
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
@@ -995,6 +1005,9 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
case CMD_TETHER_MODE_DEAD:
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index bc65205cbe10..aa46795b4fb9 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -24,8 +24,8 @@ import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.content.Intent.ACTION_SHUTDOWN;
import static android.content.Intent.ACTION_UID_REMOVED;
import static android.content.Intent.EXTRA_UID;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
@@ -43,9 +43,12 @@ import static android.provider.Settings.Secure.NETSTATS_POLL_INTERVAL;
import static android.provider.Settings.Secure.NETSTATS_TAG_MAX_HISTORY;
import static android.provider.Settings.Secure.NETSTATS_UID_BUCKET_DURATION;
import static android.provider.Settings.Secure.NETSTATS_UID_MAX_HISTORY;
+import static android.telephony.PhoneStateListener.LISTEN_DATA_CONNECTION_STATE;
+import static android.telephony.PhoneStateListener.LISTEN_NONE;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
+import static android.text.format.DateUtils.SECOND_IN_MILLIS;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.server.NetworkManagementService.LIMIT_GLOBAL_ALERT;
import static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats;
@@ -80,6 +83,7 @@ import android.os.PowerManager;
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.Settings;
+import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.EventLog;
import android.util.Log;
@@ -121,7 +125,7 @@ import libcore.io.IoUtils;
*/
public class NetworkStatsService extends INetworkStatsService.Stub {
private static final String TAG = "NetworkStats";
- private static final boolean LOGD = true;
+ private static final boolean LOGD = false;
private static final boolean LOGV = false;
/** File header magic number: "ANET" */
@@ -132,7 +136,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private static final int VERSION_UID_WITH_TAG = 3;
private static final int VERSION_UID_WITH_SET = 4;
- private static final int MSG_PERFORM_POLL = 0x1;
+ private static final int MSG_PERFORM_POLL = 1;
+ private static final int MSG_UPDATE_IFACES = 2;
/** Flags to control detail level of poll event. */
private static final int FLAG_PERSIST_NETWORK = 0x10;
@@ -144,6 +149,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private final INetworkManagementService mNetworkManager;
private final IAlarmManager mAlarmManager;
private final TrustedTime mTime;
+ private final TelephonyManager mTeleManager;
private final NetworkStatsSettings mSettings;
private final PowerManager.WakeLock mWakeLock;
@@ -227,6 +233,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mNetworkManager = checkNotNull(networkManager, "missing INetworkManagementService");
mAlarmManager = checkNotNull(alarmManager, "missing IAlarmManager");
mTime = checkNotNull(time, "missing TrustedTime");
+ mTeleManager = checkNotNull(TelephonyManager.getDefault(), "missing TelephonyManager");
mSettings = checkNotNull(settings, "missing NetworkStatsSettings");
final PowerManager powerManager = (PowerManager) context.getSystemService(
@@ -279,6 +286,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// ignored; service lives in system_server
}
+ // watch for networkType changes that aren't broadcast through
+ // CONNECTIVITY_ACTION_IMMEDIATE above.
+ mTeleManager.listen(mPhoneListener, LISTEN_DATA_CONNECTION_STATE);
+
registerPollAlarmLocked();
registerGlobalAlert();
@@ -288,10 +299,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private void shutdownLocked() {
mContext.unregisterReceiver(mConnReceiver);
+ mContext.unregisterReceiver(mTetherReceiver);
mContext.unregisterReceiver(mPollReceiver);
mContext.unregisterReceiver(mRemovedReceiver);
mContext.unregisterReceiver(mShutdownReceiver);
+ mTeleManager.listen(mPhoneListener, LISTEN_NONE);
+
writeNetworkStatsLocked();
if (mUidStatsLoaded) {
writeUidStatsLocked();
@@ -535,14 +549,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
public void onReceive(Context context, Intent intent) {
// on background handler thread, and verified CONNECTIVITY_INTERNAL
// permission above.
- synchronized (mStatsLock) {
- mWakeLock.acquire();
- try {
- updateIfacesLocked();
- } finally {
- mWakeLock.release();
- }
- }
+ updateIfaces();
}
};
@@ -619,6 +626,46 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
};
+ private int mLastPhoneState = TelephonyManager.DATA_UNKNOWN;
+ private int mLastPhoneNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+
+ /**
+ * Receiver that watches for {@link TelephonyManager} changes, such as
+ * transitioning between network types.
+ */
+ private PhoneStateListener mPhoneListener = new PhoneStateListener() {
+ @Override
+ public void onDataConnectionStateChanged(int state, int networkType) {
+ final boolean stateChanged = state != mLastPhoneState;
+ final boolean networkTypeChanged = networkType != mLastPhoneNetworkType;
+
+ if (networkTypeChanged && !stateChanged) {
+ // networkType changed without a state change, which means we
+ // need to roll our own update. delay long enough for
+ // ConnectivityManager to process.
+ // TODO: add direct event to ConnectivityService instead of
+ // relying on this delay.
+ if (LOGV) Slog.v(TAG, "triggering delayed updateIfaces()");
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_UPDATE_IFACES), SECOND_IN_MILLIS);
+ }
+
+ mLastPhoneState = state;
+ mLastPhoneNetworkType = networkType;
+ }
+ };
+
+ private void updateIfaces() {
+ synchronized (mStatsLock) {
+ mWakeLock.acquire();
+ try {
+ updateIfacesLocked();
+ } finally {
+ mWakeLock.release();
+ }
+ }
+ }
+
/**
* Inspect all current {@link NetworkState} to derive mapping from {@code
* iface} to {@link NetworkStatsHistory}. When multiple {@link NetworkInfo}
@@ -713,19 +760,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final long threshold = mSettings.getPersistThreshold();
try {
- // record network stats
- final NetworkStats networkSnapshot = mNetworkManager.getNetworkStatsSummary();
- performNetworkPollLocked(networkSnapshot, currentTime);
-
- // persist when enough network data has occurred
- final NetworkStats persistNetworkDelta = computeStatsDelta(
- mLastPersistNetworkSnapshot, networkSnapshot, true);
- final boolean networkPastThreshold = persistNetworkDelta.getTotalBytes() > threshold;
- if (persistForce || (persistNetwork && networkPastThreshold)) {
- writeNetworkStatsLocked();
- mLastPersistNetworkSnapshot = networkSnapshot;
- }
-
// record tethering stats; persisted during normal UID cycle below
final String[] ifacePairs = mConnManager.getTetheredIfacePairs();
final NetworkStats tetherSnapshot = mNetworkManager.getNetworkStatsTethering(
@@ -744,6 +778,19 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
writeUidStatsLocked();
mLastPersistUidSnapshot = uidSnapshot;
}
+
+ // record network stats
+ final NetworkStats networkSnapshot = mNetworkManager.getNetworkStatsSummary();
+ performNetworkPollLocked(networkSnapshot, currentTime);
+
+ // persist when enough network data has occurred
+ final NetworkStats persistNetworkDelta = computeStatsDelta(
+ mLastPersistNetworkSnapshot, networkSnapshot, true);
+ final boolean networkPastThreshold = persistNetworkDelta.getTotalBytes() > threshold;
+ if (persistForce || (persistNetwork && networkPastThreshold)) {
+ writeNetworkStatsLocked();
+ mLastPersistNetworkSnapshot = networkSnapshot;
+ }
} catch (IllegalStateException e) {
Log.wtf(TAG, "problem reading network stats", e);
} catch (RemoteException e) {
@@ -1356,6 +1403,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
performPoll(flags);
return true;
}
+ case MSG_UPDATE_IFACES: {
+ updateIfaces();
+ return true;
+ }
default: {
return false;
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 105e603769fe..eb135b7c41a0 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -72,6 +72,7 @@ import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.VerifierDeviceIdentity;
+import android.content.pm.VerifierInfo;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -113,6 +114,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.cert.CertificateException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -158,6 +161,7 @@ public class PackageManagerService extends IPackageManager.Stub {
private static final boolean DEBUG_INTENT_MATCHING = false;
private static final boolean DEBUG_PACKAGE_SCANNING = false;
private static final boolean DEBUG_APP_DIR_OBSERVER = false;
+ private static final boolean DEBUG_VERIFY = false;
static final boolean MULTIPLE_APPLICATION_UIDS = true;
private static final int RADIO_UID = Process.PHONE_UID;
@@ -208,6 +212,8 @@ public class PackageManagerService extends IPackageManager.Stub {
DEFAULT_CONTAINER_PACKAGE,
"com.android.defcontainer.DefaultContainerService");
+ private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
+
private static final String LIB_DIR_NAME = "lib";
static final String mTempContainerPrefix = "smdl2tmp";
@@ -349,7 +355,8 @@ public class PackageManagerService extends IPackageManager.Stub {
final HashSet<String> mProtectedBroadcasts = new HashSet<String>();
/** List of packages waiting for verification. */
- final SparseArray<InstallArgs> mPendingVerification = new SparseArray<InstallArgs>();
+ final SparseArray<PackageVerificationState> mPendingVerification
+ = new SparseArray<PackageVerificationState>();
final ArrayList<PackageParser.Package> mDeferredDexOpt =
new ArrayList<PackageParser.Package>();
@@ -427,6 +434,8 @@ public class PackageManagerService extends IPackageManager.Stub {
final SparseArray<PostInstallData> mRunningInstalls = new SparseArray<PostInstallData>();
int mNextInstallToken = 1; // nonzero; will be wrapped back to 1 when ++ overflows
+ private final String mRequiredVerifierPackage;
+
class PackageHandler extends Handler {
private boolean mBound = false;
final ArrayList<HandlerParams> mPendingInstalls =
@@ -740,9 +749,10 @@ public class PackageManagerService extends IPackageManager.Stub {
} break;
case CHECK_PENDING_VERIFICATION: {
final int verificationId = msg.arg1;
- final InstallArgs args = mPendingVerification.get(verificationId);
+ final PackageVerificationState state = mPendingVerification.get(verificationId);
- if (args != null) {
+ if (state != null) {
+ final InstallArgs args = state.getInstallArgs();
Slog.i(TAG, "Validation timed out for " + args.packageURI.toString());
mPendingVerification.remove(verificationId);
@@ -756,31 +766,38 @@ public class PackageManagerService extends IPackageManager.Stub {
}
case PACKAGE_VERIFIED: {
final int verificationId = msg.arg1;
- final boolean verified = msg.arg2 == 1 ? true : false;
- final InstallArgs args = mPendingVerification.get(verificationId);
- if (args == null) {
+ final PackageVerificationState state = mPendingVerification.get(verificationId);
+ if (state == null) {
Slog.w(TAG, "Invalid validation token " + verificationId + " received");
break;
}
- mPendingVerification.remove(verificationId);
+ final PackageVerificationResponse response = (PackageVerificationResponse) msg.obj;
- int ret;
- if (verified) {
- ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
- try {
- ret = args.copyApk(mContainerService, true);
- } catch (RemoteException e) {
- Slog.e(TAG, "Could not contact the ContainerService");
+ state.setVerifierResponse(response.callerUid, response.code);
+
+ if (state.isVerificationComplete()) {
+ mPendingVerification.remove(verificationId);
+
+ final InstallArgs args = state.getInstallArgs();
+
+ int ret;
+ if (state.isInstallAllowed()) {
+ ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ try {
+ ret = args.copyApk(mContainerService, true);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Could not contact the ContainerService");
+ }
+ } else {
+ ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
}
- } else {
- ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
- }
- processPendingInstall(args, ret);
+ processPendingInstall(args, ret);
- mHandler.sendEmptyMessage(MCS_UNBIND);
+ mHandler.sendEmptyMessage(MCS_UNBIND);
+ }
break;
}
@@ -945,7 +962,8 @@ public class PackageManagerService extends IPackageManager.Stub {
} catch (FileNotFoundException e) {
Slog.w(TAG, "Boot class path not found: " + paths[i]);
} catch (IOException e) {
- Slog.w(TAG, "Exception reading boot class path: " + paths[i], e);
+ Slog.w(TAG, "Cannot dexopt " + paths[i] + "; is it an APK or JAR? "
+ + e.getMessage());
}
}
} else {
@@ -968,7 +986,8 @@ public class PackageManagerService extends IPackageManager.Stub {
} catch (FileNotFoundException e) {
Slog.w(TAG, "Library not found: " + lib);
} catch (IOException e) {
- Slog.w(TAG, "Exception reading library: " + lib, e);
+ Slog.w(TAG, "Cannot dexopt " + lib + "; is it an APK or JAR? "
+ + e.getMessage());
}
}
}
@@ -1132,10 +1151,49 @@ public class PackageManagerService extends IPackageManager.Stub {
// are all flushed. Not really needed, but keeps things nice and
// tidy.
Runtime.getRuntime().gc();
+
+ mRequiredVerifierPackage = getRequiredVerifierLPr();
} // synchronized (mPackages)
} // synchronized (mInstallLock)
}
+ private String getRequiredVerifierLPr() {
+ final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
+ final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE,
+ PackageManager.GET_DISABLED_COMPONENTS);
+
+ String requiredVerifier = null;
+
+ final int N = receivers.size();
+ for (int i = 0; i < N; i++) {
+ final ResolveInfo info = receivers.get(i);
+
+ if (info.activityInfo == null) {
+ continue;
+ }
+
+ final String packageName = info.activityInfo.packageName;
+
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null) {
+ continue;
+ }
+
+ if (!ps.grantedPermissions
+ .contains(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT)) {
+ continue;
+ }
+
+ if (requiredVerifier != null) {
+ throw new RuntimeException("There can be only one required verifier");
+ }
+
+ requiredVerifier = packageName;
+ }
+
+ return requiredVerifier;
+ }
+
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
@@ -4350,7 +4408,10 @@ public class PackageManagerService extends IPackageManager.Stub {
if (p != null) {
PackageSetting ps = (PackageSetting)p.mExtras;
if (ps != null) {
- return ps.stopped;
+ // System apps are never considered stopped for purposes of
+ // filtering, because there may be no way for the user to
+ // actually re-launch them.
+ return ps.stopped && (ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0;
}
}
return false;
@@ -4522,7 +4583,10 @@ public class PackageManagerService extends IPackageManager.Stub {
if (p != null) {
PackageSetting ps = (PackageSetting)p.mExtras;
if (ps != null) {
- return ps.stopped;
+ // System apps are never considered stopped for purposes of
+ // filtering, because there may be no way for the user to
+ // actually re-launch them.
+ return ps.stopped && (ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0;
}
}
return false;
@@ -4849,17 +4913,110 @@ public class PackageManagerService extends IPackageManager.Stub {
}
@Override
- public void verifyPendingInstall(int id, int verificationCode)
- throws RemoteException {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, null);
-
+ public void verifyPendingInstall(int id, int verificationCode) throws RemoteException {
final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED);
+ final PackageVerificationResponse response = new PackageVerificationResponse(
+ verificationCode, Binder.getCallingUid());
msg.arg1 = id;
- msg.arg2 = verificationCode;
+ msg.obj = response;
mHandler.sendMessage(msg);
}
+ private ComponentName matchComponentForVerifier(String packageName,
+ List<ResolveInfo> receivers) {
+ ActivityInfo targetReceiver = null;
+
+ final int NR = receivers.size();
+ for (int i = 0; i < NR; i++) {
+ final ResolveInfo info = receivers.get(i);
+ if (info.activityInfo == null) {
+ continue;
+ }
+
+ if (packageName.equals(info.activityInfo.packageName)) {
+ targetReceiver = info.activityInfo;
+ break;
+ }
+ }
+
+ if (targetReceiver == null) {
+ return null;
+ }
+
+ return new ComponentName(targetReceiver.packageName, targetReceiver.name);
+ }
+
+ private List<ComponentName> matchVerifiers(PackageInfoLite pkgInfo,
+ List<ResolveInfo> receivers, final PackageVerificationState verificationState) {
+ if (pkgInfo.verifiers.length == 0) {
+ return null;
+ }
+
+ final int N = pkgInfo.verifiers.length;
+ final List<ComponentName> sufficientVerifiers = new ArrayList<ComponentName>(N + 1);
+ for (int i = 0; i < N; i++) {
+ final VerifierInfo verifierInfo = pkgInfo.verifiers[i];
+
+ final ComponentName comp = matchComponentForVerifier(verifierInfo.packageName,
+ receivers);
+ if (comp == null) {
+ continue;
+ }
+
+ final int verifierUid = getUidForVerifier(verifierInfo);
+ if (verifierUid == -1) {
+ continue;
+ }
+
+ if (DEBUG_VERIFY) {
+ Slog.d(TAG, "Added sufficient verifier " + verifierInfo.packageName
+ + " with the correct signature");
+ }
+ sufficientVerifiers.add(comp);
+ verificationState.addSufficientVerifier(verifierUid);
+ }
+
+ return sufficientVerifiers;
+ }
+
+ private int getUidForVerifier(VerifierInfo verifierInfo) {
+ synchronized (mPackages) {
+ final PackageParser.Package pkg = mPackages.get(verifierInfo.packageName);
+ if (pkg == null) {
+ return -1;
+ } else if (pkg.mSignatures.length != 1) {
+ Slog.i(TAG, "Verifier package " + verifierInfo.packageName
+ + " has more than one signature; ignoring");
+ return -1;
+ }
+
+ /*
+ * If the public key of the package's signature does not match
+ * our expected public key, then this is a different package and
+ * we should skip.
+ */
+
+ final byte[] expectedPublicKey;
+ try {
+ final Signature verifierSig = pkg.mSignatures[0];
+ final PublicKey publicKey = verifierSig.getPublicKey();
+ expectedPublicKey = publicKey.getEncoded();
+ } catch (CertificateException e) {
+ return -1;
+ }
+
+ final byte[] actualPublicKey = verifierInfo.publicKey.getEncoded();
+
+ if (!Arrays.equals(actualPublicKey, expectedPublicKey)) {
+ Slog.i(TAG, "Verifier package " + verifierInfo.packageName
+ + " does not have the expected public key; ignoring");
+ return -1;
+ }
+
+ return pkg.applicationInfo.uid;
+ }
+ }
+
public void finishPackageInstall(int token) {
enforceSystemOrRoot("Only the system is allowed to finish installs");
@@ -5229,9 +5386,11 @@ public class PackageManagerService extends IPackageManager.Stub {
*/
public void handleStartCopy() throws RemoteException {
int ret = PackageManager.INSTALL_SUCCEEDED;
- boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
- boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
- boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
+ final boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
+ final boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
+ final boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
+ PackageInfoLite pkgLite = null;
+
if (onInt && onSd) {
// Check if both bits are set.
Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");
@@ -5253,7 +5412,6 @@ public class PackageManagerService extends IPackageManager.Stub {
}
// Remote call to find out default install location
- final PackageInfoLite pkgLite;
try {
mContext.grantUriPermission(DEFAULT_CONTAINER_PACKAGE, packageURI,
Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -5296,21 +5454,27 @@ public class PackageManagerService extends IPackageManager.Stub {
}
final InstallArgs args = createInstallArgs(this);
+ mArgs = args;
+
if (ret == PackageManager.INSTALL_SUCCEEDED) {
/*
* Determine if we have any installed package verifiers. If we
* do, then we'll defer to them to verify the packages.
*/
- final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION,
- packageURI);
- verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-
- final List<ResolveInfo> receivers = queryIntentReceivers(verification, null,
- PackageManager.GET_DISABLED_COMPONENTS);
- if (isVerificationEnabled() && receivers.size() > 0) {
- if (DEBUG_INSTALL) {
+ final int requiredUid = mRequiredVerifierPackage == null ? -1
+ : getPackageUid(mRequiredVerifierPackage);
+ if (requiredUid != -1 && isVerificationEnabled()) {
+ final Intent verification = new Intent(
+ Intent.ACTION_PACKAGE_NEEDS_VERIFICATION, packageURI);
+ verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+
+ final List<ResolveInfo> receivers = queryIntentReceivers(verification, null,
+ PackageManager.GET_DISABLED_COMPONENTS);
+
+ if (DEBUG_VERIFY) {
Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent "
- + verification.toString());
+ + verification.toString() + " with " + pkgLite.verifiers.length
+ + " optional verifiers");
}
final int verificationId = mPendingVerificationToken++;
@@ -5327,35 +5491,70 @@ public class PackageManagerService extends IPackageManager.Stub {
verificationURI);
}
- mPendingVerification.append(verificationId, args);
+ final PackageVerificationState verificationState = new PackageVerificationState(
+ requiredUid, args);
+
+ mPendingVerification.append(verificationId, verificationState);
+
+ final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite,
+ receivers, verificationState);
/*
- * Send the intent to the registered verification agents,
- * but only start the verification timeout after the target
- * BroadcastReceivers have run.
+ * If any sufficient verifiers were listed in the package
+ * manifest, attempt to ask them.
*/
- mContext.sendOrderedBroadcast(verification,
- android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final Message msg = mHandler
- .obtainMessage(CHECK_PENDING_VERIFICATION);
- msg.arg1 = verificationId;
- mHandler.sendMessageDelayed(msg, getVerificationTimeout());
- }
- },
- null, 0, null, null);
+ if (sufficientVerifiers != null) {
+ final int N = sufficientVerifiers.size();
+ if (N == 0) {
+ Slog.i(TAG, "Additional verifiers required, but none installed.");
+ ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
+ } else {
+ for (int i = 0; i < N; i++) {
+ final ComponentName verifierComponent = sufficientVerifiers.get(i);
+
+ final Intent sufficientIntent = new Intent(verification);
+ sufficientIntent.setComponent(verifierComponent);
+
+ mContext.sendBroadcast(sufficientIntent);
+ }
+ }
+ }
+
+ final ComponentName requiredVerifierComponent = matchComponentForVerifier(
+ mRequiredVerifierPackage, receivers);
+ if (ret == PackageManager.INSTALL_SUCCEEDED
+ && mRequiredVerifierPackage != null) {
+ /*
+ * Send the intent to the required verification agent,
+ * but only start the verification timeout after the
+ * target BroadcastReceivers have run.
+ */
+ verification.setComponent(requiredVerifierComponent);
+ mContext.sendOrderedBroadcast(verification,
+ android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final Message msg = mHandler
+ .obtainMessage(CHECK_PENDING_VERIFICATION);
+ msg.arg1 = verificationId;
+ mHandler.sendMessageDelayed(msg, getVerificationTimeout());
+ }
+ }, null, 0, null, null);
+
+ /*
+ * We don't want the copy to proceed until verification
+ * succeeds, so null out this field.
+ */
+ mArgs = null;
+ }
} else {
- // Create copy only if we are not in an erroneous state.
- // Remote call to initiate copy using temporary file
- mArgs = args;
+ /*
+ * No package verification is enabled, so immediately start
+ * the remote call to initiate copy using temporary file.
+ */
ret = args.copyApk(mContainerService, true);
}
- } else {
- // There was an error, so let the processPendingInstall() break
- // the bad news... uh, through a call in handleReturnCode()
- mArgs = args;
}
mRet = ret;
@@ -7541,6 +7740,8 @@ public class PackageManagerService extends IPackageManager.Stub {
public static final int DUMP_PROVIDERS = 1 << 7;
+ public static final int DUMP_VERIFIERS = 1 << 8;
+
public static final int OPTION_SHOW_FILTERS = 1 << 0;
private int mTypes;
@@ -7633,6 +7834,7 @@ public class PackageManagerService extends IPackageManager.Stub {
pw.println(" p[ackages]: dump installed packages");
pw.println(" s[hared-users]: dump shared user IDs");
pw.println(" m[essages]: print collected runtime messages");
+ pw.println(" v[erifiers]: print package verifier info");
pw.println(" <package.name>: info about given package");
return;
} else if ("-f".equals(opt)) {
@@ -7665,11 +7867,24 @@ public class PackageManagerService extends IPackageManager.Stub {
dumpState.setDump(DumpState.DUMP_PROVIDERS);
} else if ("m".equals(cmd) || "messages".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_MESSAGES);
+ } else if ("v".equals(cmd) || "verifiers".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_VERIFIERS);
}
}
// reader
synchronized (mPackages) {
+ if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) {
+ if (dumpState.onTitlePrinted())
+ pw.println(" ");
+ pw.println("Verifiers:");
+ pw.print(" Required: ");
+ pw.print(mRequiredVerifierPackage);
+ pw.print(" (uid=");
+ pw.print(getPackageUid(mRequiredVerifierPackage));
+ pw.println(")");
+ }
+
if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) {
if (dumpState.onTitlePrinted())
pw.println(" ");
diff --git a/services/java/com/android/server/pm/PackageVerificationResponse.java b/services/java/com/android/server/pm/PackageVerificationResponse.java
new file mode 100644
index 000000000000..b2ae0dd433da
--- /dev/null
+++ b/services/java/com/android/server/pm/PackageVerificationResponse.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+public class PackageVerificationResponse {
+ public final int code;
+
+ public final int callerUid;
+
+ public PackageVerificationResponse(int code, int callerUid) {
+ this.code = code;
+ this.callerUid = callerUid;
+ }
+}
diff --git a/services/java/com/android/server/pm/PackageVerificationState.java b/services/java/com/android/server/pm/PackageVerificationState.java
new file mode 100644
index 000000000000..e5b89c1f08fe
--- /dev/null
+++ b/services/java/com/android/server/pm/PackageVerificationState.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import com.android.server.pm.PackageManagerService.InstallArgs;
+
+import android.content.pm.PackageManager;
+import android.util.SparseBooleanArray;
+
+/**
+ * Tracks the package verification state for a particular package. Each package
+ * verification has a required verifier and zero or more sufficient verifiers.
+ * Only one of the sufficient verifier list must return affirmative to allow the
+ * package to be considered verified. If there are zero sufficient verifiers,
+ * then package verification is considered complete.
+ */
+class PackageVerificationState {
+ private final InstallArgs mArgs;
+
+ private final SparseBooleanArray mSufficientVerifierUids;
+
+ private final int mRequiredVerifierUid;
+
+ private boolean mSufficientVerificationComplete;
+
+ private boolean mSufficientVerificationPassed;
+
+ private boolean mRequiredVerificationComplete;
+
+ private boolean mRequiredVerificationPassed;
+
+ /**
+ * Create a new package verification state where {@code requiredVerifierUid}
+ * is the user ID for the package that must reply affirmative before things
+ * can continue.
+ *
+ * @param requiredVerifierUid user ID of required package verifier
+ * @param args
+ */
+ public PackageVerificationState(int requiredVerifierUid, InstallArgs args) {
+ mRequiredVerifierUid = requiredVerifierUid;
+ mArgs = args;
+ mSufficientVerifierUids = new SparseBooleanArray();
+ }
+
+ public InstallArgs getInstallArgs() {
+ return mArgs;
+ }
+
+ /**
+ * Add a verifier which is added to our sufficient list.
+ *
+ * @param uid user ID of sufficient verifier
+ */
+ public void addSufficientVerifier(int uid) {
+ mSufficientVerifierUids.put(uid, true);
+ }
+
+ /**
+ * Should be called when a verification is received from an agent so the
+ * state of the package verification can be tracked.
+ *
+ * @param uid user ID of the verifying agent
+ * @return {@code true} if the verifying agent actually exists in our list
+ */
+ public boolean setVerifierResponse(int uid, int code) {
+ if (uid == mRequiredVerifierUid) {
+ mRequiredVerificationComplete = true;
+ switch (code) {
+ case PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT:
+ mSufficientVerifierUids.clear();
+ // fall through
+ case PackageManager.VERIFICATION_ALLOW:
+ mRequiredVerificationPassed = true;
+ break;
+ default:
+ mRequiredVerificationPassed = false;
+ }
+ return true;
+ } else {
+ if (mSufficientVerifierUids.get(uid)) {
+ if (code == PackageManager.VERIFICATION_ALLOW) {
+ mSufficientVerificationComplete = true;
+ mSufficientVerificationPassed = true;
+ }
+
+ mSufficientVerifierUids.delete(uid);
+ if (mSufficientVerifierUids.size() == 0) {
+ mSufficientVerificationComplete = true;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns whether verification is considered complete. This means that the
+ * required verifier and at least one of the sufficient verifiers has
+ * returned a positive verification.
+ *
+ * @return {@code true} when verification is considered complete
+ */
+ public boolean isVerificationComplete() {
+ if (!mRequiredVerificationComplete) {
+ return false;
+ }
+
+ if (mSufficientVerifierUids.size() == 0) {
+ return true;
+ }
+
+ return mSufficientVerificationComplete;
+ }
+
+ /**
+ * Returns whether installation should be allowed. This should only be
+ * called after {@link #isVerificationComplete()} returns {@code true}.
+ *
+ * @return {@code true} if installation should be allowed
+ */
+ public boolean isInstallAllowed() {
+ if (!mRequiredVerificationPassed) {
+ return false;
+ }
+
+ if (mSufficientVerificationComplete) {
+ return mSufficientVerificationPassed;
+ }
+
+ return true;
+ }
+}
diff --git a/services/java/com/android/server/wm/DragState.java b/services/java/com/android/server/wm/DragState.java
index dd440bf00d1e..f2e7485895fe 100644
--- a/services/java/com/android/server/wm/DragState.java
+++ b/services/java/com/android/server/wm/DragState.java
@@ -125,6 +125,12 @@ class DragState {
mDragWindowHandle.frameTop = 0;
mDragWindowHandle.frameRight = mService.mCurDisplayWidth;
mDragWindowHandle.frameBottom = mService.mCurDisplayHeight;
+
+ // Pause rotations before a drag.
+ if (WindowManagerService.DEBUG_ORIENTATION) {
+ Slog.d(WindowManagerService.TAG, "Pausing rotation during drag");
+ }
+ mService.pauseRotationLocked();
}
}
@@ -142,6 +148,12 @@ class DragState {
mDragWindowHandle = null;
mDragApplicationHandle = null;
+
+ // Resume rotations after a drag.
+ if (WindowManagerService.DEBUG_ORIENTATION) {
+ Slog.d(WindowManagerService.TAG, "Resuming rotation after drag");
+ }
+ mService.resumeRotationLocked();
}
}
@@ -257,13 +269,6 @@ class DragState {
// free our resources and drop all the object references
mService.mDragState.reset();
mService.mDragState = null;
-
- if (WindowManagerService.DEBUG_ORIENTATION) Slog.d(WindowManagerService.TAG, "Performing post-drag rotation");
- boolean changed = mService.setRotationUncheckedLocked(
- WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
- if (changed) {
- mService.mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
- }
}
void notifyMoveLw(float x, float y) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 30029be4ac77..3ea9e817a1d8 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -427,14 +427,11 @@ public class WindowManagerService extends IWindowManager.Stub
int mAppDisplayWidth = 0;
int mAppDisplayHeight = 0;
int mRotation = 0;
- int mRequestedRotation = 0;
int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
boolean mAltOrientation = false;
- int mLastRotationFlags;
ArrayList<IRotationWatcher> mRotationWatchers
= new ArrayList<IRotationWatcher>();
- int mDeferredRotation;
- int mDeferredRotationAnimFlags;
+ int mDeferredRotationPauseCount;
boolean mLayoutNeeded = true;
boolean mAnimationPending = false;
@@ -3414,9 +3411,7 @@ public class WindowManagerService extends IWindowManager.Stub
//send a message to Policy indicating orientation change to take
//action like disabling/enabling sensors etc.,
mPolicy.setCurrentOrientationLw(req);
- if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION,
- mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE,
- inTransaction)) {
+ if (updateRotationUncheckedLocked(inTransaction)) {
changed = true;
}
}
@@ -4530,6 +4525,16 @@ public class WindowManagerService extends IWindowManager.Stub
return mPolicy.isKeyguardSecure();
}
+ public void dismissKeyguard() {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires DISABLE_KEYGUARD permission");
+ }
+ synchronized(mWindowMap) {
+ mPolicy.dismissKeyguardLw();
+ }
+ }
+
public void closeSystemDialogs(String reason) {
synchronized(mWindowMap) {
for (int i=mWindows.size()-1; i>=0; i--) {
@@ -4823,8 +4828,7 @@ public class WindowManagerService extends IWindowManager.Stub
mPolicy.enableScreenAfterBoot();
// Make sure the last requested orientation has been applied.
- setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false,
- mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
+ updateRotationUnchecked(false);
}
public void showBootMessage(final CharSequence msg, final boolean always) {
@@ -5043,6 +5047,10 @@ public class WindowManagerService extends IWindowManager.Stub
return bm;
}
+ /**
+ * Freeze rotation changes. (Enable "rotation lock".)
+ * Persists across reboots.
+ */
public void freezeRotation() {
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
"freezeRotation()")) {
@@ -5052,9 +5060,13 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
- setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
+ updateRotationUnchecked(false);
}
+ /**
+ * Thaw rotation changes. (Disable "rotation lock".)
+ * Persists across reboots.
+ */
public void thawRotation() {
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
"thawRotation()")) {
@@ -5064,30 +5076,56 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
- setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
+ updateRotationUnchecked(false);
}
- public void setRotation(int rotation,
- boolean alwaysSendConfiguration, int animFlags) {
- if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
- "setRotation()")) {
- throw new SecurityException("Requires SET_ORIENTATION permission");
- }
+ /**
+ * Recalculate the current rotation.
+ *
+ * Called by the window manager policy whenever the state of the system changes
+ * such that the current rotation might need to be updated, such as when the
+ * device is docked or rotated into a new posture.
+ */
+ public void updateRotation(boolean alwaysSendConfiguration) {
+ updateRotationUnchecked(alwaysSendConfiguration);
+ }
- setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);
+ /**
+ * Temporarily pauses rotation changes until resumed.
+ *
+ * This can be used to prevent rotation changes from occurring while the user is
+ * performing certain operations, such as drag and drop.
+ *
+ * This call nests and must be matched by an equal number of calls to {@link #resumeRotation}.
+ */
+ void pauseRotationLocked() {
+ mDeferredRotationPauseCount += 1;
}
- public void setRotationUnchecked(int rotation,
- boolean alwaysSendConfiguration, int animFlags) {
- if(DEBUG_ORIENTATION) Slog.v(TAG,
- "setRotationUnchecked(rotation=" + rotation +
- " alwaysSendConfiguration=" + alwaysSendConfiguration +
- " animFlags=" + animFlags);
+ /**
+ * Resumes normal rotation changes after being paused.
+ */
+ void resumeRotationLocked() {
+ if (mDeferredRotationPauseCount > 0) {
+ mDeferredRotationPauseCount -= 1;
+ if (mDeferredRotationPauseCount == 0) {
+ boolean changed = updateRotationUncheckedLocked(false);
+ if (changed) {
+ mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
+ }
+ }
+ }
+ }
+
+ public void updateRotationUnchecked(
+ boolean alwaysSendConfiguration) {
+ if(DEBUG_ORIENTATION) Slog.v(TAG, "updateRotationUnchecked("
+ + "alwaysSendConfiguration=" + alwaysSendConfiguration + ")");
long origId = Binder.clearCallingIdentity();
boolean changed;
synchronized(mWindowMap) {
- changed = setRotationUncheckedLocked(rotation, animFlags, false);
+ changed = updateRotationUncheckedLocked(false);
}
if (changed || alwaysSendConfiguration) {
@@ -5098,152 +5136,114 @@ public class WindowManagerService extends IWindowManager.Stub
}
/**
- * Apply a new rotation to the screen, respecting the requests of
- * applications. Use WindowManagerPolicy.USE_LAST_ROTATION to simply
- * re-evaluate the desired rotation.
- *
- * Returns null if the rotation has been changed. In this case YOU
- * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN.
+ * Updates the current rotation.
+ *
+ * Returns true if the rotation has been changed. In this case YOU
+ * MUST CALL sendNewConfiguration() TO UNFREEZE THE SCREEN.
*/
- public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) {
- if (mDragState != null
- || (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating())) {
- // Potential rotation during a drag or while waiting for a previous orientation
- // change to finish (rotation animation will be dismissed).
- // Don't do the rotation now, but make a note to perform the rotation later.
- if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation.");
- if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) {
- mDeferredRotation = rotation;
- mDeferredRotationAnimFlags = animFlags;
- }
+ public boolean updateRotationUncheckedLocked(boolean inTransaction) {
+ if (mDeferredRotationPauseCount > 0) {
+ // Rotation updates have been paused temporarily. Defer the update until
+ // updates have been resumed.
+ if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, rotation is paused.");
return false;
}
- boolean changed;
- if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) {
- if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) {
- rotation = mDeferredRotation;
- mRequestedRotation = rotation;
- mLastRotationFlags = mDeferredRotationAnimFlags;
- }
- rotation = mRequestedRotation;
- } else {
- mRequestedRotation = rotation;
- mLastRotationFlags = animFlags;
- }
- mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION;
- if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation);
- rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
- mRotation, mDisplayEnabled);
- if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation);
-
- int desiredRotation = rotation;
- int lockedRotation = mPolicy.getLockedRotationLw();
- if (lockedRotation >= 0 && rotation != lockedRotation) {
- // We are locked in a rotation but something is requesting
- // a different rotation... we will either keep the locked
- // rotation if it results in the same orientation, or have to
- // switch into an emulated orientation mode.
-
- // First, we know that our rotation is actually going to be
- // the locked rotation.
- rotation = lockedRotation;
-
- // Now the difference between the desired and lockedRotation
- // may mean that the orientation is different... if that is
- // not the case, we can just make the desired rotation be the
- // same as the new locked rotation.
- switch (lockedRotation) {
- case Surface.ROTATION_0:
- if (rotation == Surface.ROTATION_180) {
- desiredRotation = lockedRotation;
- }
- break;
- case Surface.ROTATION_90:
- if (rotation == Surface.ROTATION_270) {
- desiredRotation = lockedRotation;
- }
- break;
- case Surface.ROTATION_180:
- if (rotation == Surface.ROTATION_0) {
- desiredRotation = lockedRotation;
- }
- break;
- case Surface.ROTATION_270:
- if (rotation == Surface.ROTATION_90) {
- desiredRotation = lockedRotation;
- }
- break;
- }
+ if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
+ // Rotation updates cannot be performed while the previous rotation change
+ // animation is still in progress. Skip this update. We will try updating
+ // again after the animation is finished and the display is unfrozen.
+ if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, animation in progress.");
+ return false;
}
- changed = mDisplayEnabled && mRotation != rotation;
- if (mAltOrientation != (rotation != desiredRotation)) {
- changed = true;
- mAltOrientation = rotation != desiredRotation;
+ if (!mDisplayEnabled) {
+ // No point choosing a rotation if the display is not enabled.
+ if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, display is not enabled.");
+ return false;
}
- if (changed) {
- if (DEBUG_ORIENTATION) Slog.v(TAG,
- "Rotation changed to " + rotation
- + " from " + mRotation
- + " (forceApp=" + mForcedAppOrientation
- + ", req=" + mRequestedRotation + ")");
- mRotation = rotation;
- mWindowsFreezingScreen = true;
- mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
- mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT),
- 2000);
- mWaitingForConfig = true;
- mLayoutNeeded = true;
- startFreezingDisplayLocked(inTransaction);
- //Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
- mInputManager.setDisplayOrientation(0, rotation);
- if (mDisplayEnabled) {
- // NOTE: We disable the rotation in the emulator because
- // it doesn't support hardware OpenGL emulation yet.
- if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
- && mScreenRotationAnimation.hasScreenshot()) {
- Surface.freezeDisplay(0);
- if (!inTransaction) {
- if (SHOW_TRANSACTIONS) Slog.i(TAG,
- ">>> OPEN TRANSACTION setRotationUnchecked");
- Surface.openTransaction();
- }
- try {
- if (mScreenRotationAnimation != null) {
- mScreenRotationAnimation.setRotation(rotation);
- }
- } finally {
- if (!inTransaction) {
- Surface.closeTransaction();
- if (SHOW_TRANSACTIONS) Slog.i(TAG,
- "<<< CLOSE TRANSACTION setRotationUnchecked");
- }
- }
- Surface.setOrientation(0, rotation, animFlags);
- Surface.unfreezeDisplay(0);
- } else {
- Surface.setOrientation(0, rotation, animFlags);
- }
- rebuildBlackFrame(inTransaction);
- }
+ // TODO: Implement forced rotation changes.
+ // Set mAltOrientation to indicate that the application is receiving
+ // an orientation that has different metrics than it expected.
+ // eg. Portrait instead of Landscape.
- for (int i=mWindows.size()-1; i>=0; i--) {
- WindowState w = mWindows.get(i);
- if (w.mSurface != null) {
- w.mOrientationChanging = true;
- }
+ int rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, mRotation);
+ boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
+ mForcedAppOrientation, rotation);
+
+ if (DEBUG_ORIENTATION) {
+ Slog.v(TAG, "Application requested orientation "
+ + mForcedAppOrientation + ", got rotation " + rotation
+ + " which has " + (altOrientation ? "incompatible" : "compatible")
+ + " metrics");
+ }
+
+ if (mRotation == rotation && mAltOrientation == altOrientation) {
+ // No change.
+ return false;
+ }
+
+ if (DEBUG_ORIENTATION) {
+ Slog.v(TAG,
+ "Rotation changed to " + rotation + (altOrientation ? " (alt)" : "")
+ + " from " + mRotation + (mAltOrientation ? " (alt)" : "")
+ + ", forceApp=" + mForcedAppOrientation);
+ }
+
+ mRotation = rotation;
+ mAltOrientation = altOrientation;
+ mPolicy.setRotationLw(mRotation);
+
+ mWindowsFreezingScreen = true;
+ mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
+ mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 2000);
+ mWaitingForConfig = true;
+ mLayoutNeeded = true;
+ startFreezingDisplayLocked(inTransaction);
+ mInputManager.setDisplayOrientation(0, rotation);
+
+ // NOTE: We disable the rotation in the emulator because
+ // it doesn't support hardware OpenGL emulation yet.
+ if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
+ && mScreenRotationAnimation.hasScreenshot()) {
+ Surface.freezeDisplay(0);
+ if (!inTransaction) {
+ if (SHOW_TRANSACTIONS) Slog.i(TAG,
+ ">>> OPEN TRANSACTION setRotationUnchecked");
+ Surface.openTransaction();
}
- for (int i=mRotationWatchers.size()-1; i>=0; i--) {
- try {
- mRotationWatchers.get(i).onRotationChanged(rotation);
- } catch (RemoteException e) {
+ try {
+ if (mScreenRotationAnimation != null) {
+ mScreenRotationAnimation.setRotation(rotation);
+ }
+ } finally {
+ if (!inTransaction) {
+ Surface.closeTransaction();
+ if (SHOW_TRANSACTIONS) Slog.i(TAG,
+ "<<< CLOSE TRANSACTION setRotationUnchecked");
}
}
- } //end if changed
+ Surface.setOrientation(0, rotation);
+ Surface.unfreezeDisplay(0);
+ } else {
+ Surface.setOrientation(0, rotation);
+ }
+ rebuildBlackFrame(inTransaction);
- return changed;
+ for (int i=mWindows.size()-1; i>=0; i--) {
+ WindowState w = mWindows.get(i);
+ if (w.mSurface != null) {
+ w.mOrientationChanging = true;
+ }
+ }
+ for (int i=mRotationWatchers.size()-1; i>=0; i--) {
+ try {
+ mRotationWatchers.get(i).onRotationChanged(rotation);
+ } catch (RemoteException e) {
+ }
+ }
+ return true;
}
public int getRotation() {
@@ -5732,9 +5732,9 @@ public class WindowManagerService extends IWindowManager.Stub
unrotDh = dh;
}
int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw, unrotDh);
- sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDw, unrotDh);
+ sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh, unrotDw);
sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw, unrotDh);
- sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDw, unrotDh);
+ sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh, unrotDw);
return sw;
}
@@ -8601,8 +8601,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (updateRotation) {
if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
- boolean changed = setRotationUncheckedLocked(
- WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
+ boolean changed = updateRotationUncheckedLocked(false);
if (changed) {
mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
} else {
@@ -9029,8 +9028,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (updateRotation) {
if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
- configChanged |= setRotationUncheckedLocked(
- WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
+ configChanged |= updateRotationUncheckedLocked(false);
}
if (configChanged) {
@@ -9403,12 +9401,10 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
pw.print(" mRotation="); pw.print(mRotation);
- pw.print(" mRequestedRotation="); pw.print(mRequestedRotation);
pw.print(" mAltOrientation="); pw.println(mAltOrientation);
pw.print(" mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation);
pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
- pw.print(" mDeferredRotation="); pw.print(mDeferredRotation);
- pw.print(", mDeferredRotationAnimFlags="); pw.println(mDeferredRotationAnimFlags);
+ pw.print(" mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount);
pw.print(" mAnimationPending="); pw.print(mAnimationPending);
pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index a8d1d79d8999..3640a15284b2 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -1101,7 +1101,20 @@ final class WindowState implements WindowManagerPolicy.WindowState {
final Matrix tmpMatrix = mTmpMatrix;
// Compute the desired transformation.
- tmpMatrix.setTranslate(0, 0);
+ if (screenAnimation) {
+ // If we are doing a screen animation, the global rotation
+ // applied to windows can result in windows that are carefully
+ // aligned with each other to slightly separate, allowing you
+ // to see what is behind them. An unsightly mess. This...
+ // thing... magically makes it call good: scale each window
+ // slightly (two pixels larger in each dimension, from the
+ // window's center).
+ final float w = frame.width();
+ final float h = frame.height();
+ tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2);
+ } else {
+ tmpMatrix.reset();
+ }
tmpMatrix.postScale(mGlobalScale, mGlobalScale);
if (selfTransformation) {
tmpMatrix.postConcat(mTransformation.getMatrix());
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 1361fd6e169e..41d7a90978ad 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -112,6 +112,11 @@ void Layer::onRemoved()
mSurfaceTexture->abandon();
}
+void Layer::setName(const String8& name) {
+ LayerBase::setName(name);
+ mSurfaceTexture->setName(name);
+}
+
sp<ISurface> Layer::createSurface()
{
class BSurface : public BnSurface, public LayerCleaner {
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index ff389aecef70..82e35218d279 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -74,6 +74,7 @@ public:
virtual bool isProtected() const;
virtual void onRemoved();
virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); }
+ virtual void setName(const String8& name);
// LayerBaseClient interface
virtual wp<IBinder> getSurfaceTextureBinder() const;
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index 268ba2daacae..7f6214510d33 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -81,7 +81,7 @@ public:
Region transparentRegion;
};
- void setName(const String8& name);
+ virtual void setName(const String8& name);
String8 getName() const;
// modify current state
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 2be6d1889ddf..3f154ce3292d 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -566,7 +566,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
const int dpy = 0;
const int orientation = mCurrentState.orientation;
- const uint32_t type = mCurrentState.orientationType;
+ // Currently unused: const uint32_t flags = mCurrentState.orientationFlags;
GraphicPlane& plane(graphicPlane(dpy));
plane.setOrientation(orientation);
@@ -1300,7 +1300,7 @@ int SurfaceFlinger::setOrientation(DisplayID dpy,
Mutex::Autolock _l(mStateLock);
if (mCurrentState.orientation != orientation) {
if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
- mCurrentState.orientationType = flags;
+ mCurrentState.orientationFlags = flags;
mCurrentState.orientation = orientation;
setTransactionFlags(eTransactionNeeded);
mTransactionCV.wait(mStateLock);
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index d7f005f7cefe..43191b7e8a54 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -245,7 +245,7 @@ private:
}
LayerVector layersSortedByZ;
uint8_t orientation;
- uint8_t orientationType;
+ uint8_t orientationFlags;
uint8_t freezeDisplay;
};
diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
index 2a258661cfc9..ab1597c6745d 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
@@ -21,7 +21,6 @@ import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
-import static com.android.server.NetworkManagementSocketTagger.tagToKernel;
import android.content.res.Resources;
import android.net.NetworkStats;
@@ -144,12 +143,6 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
}
public void testKernelTags() throws Exception {
- assertEquals("0", tagToKernel(0x0));
- assertEquals("214748364800", tagToKernel(0x32));
- assertEquals("9223372032559808512", tagToKernel(Integer.MAX_VALUE));
- assertEquals("0", tagToKernel(Integer.MIN_VALUE));
- assertEquals("9223369837831520256", tagToKernel(Integer.MIN_VALUE - 512));
-
assertEquals(0, kernelToTag("0x0000000000000000"));
assertEquals(0x32, kernelToTag("0x0000003200000000"));
assertEquals(2147483647, kernelToTag("0x7fffffff00000000"));
diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
index 99ae027f4b16..2ead254af18c 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
@@ -776,6 +776,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
private void expectNetworkStatsPoll() throws Exception {
mNetManager.setGlobalAlert(anyLong());
expectLastCall().anyTimes();
+ expect(mConnManager.getTetheredIfacePairs()).andReturn(null).anyTimes();
}
private void assertStatsFilesExist(boolean exist) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java
new file mode 100644
index 000000000000..ebd363386fa3
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import android.content.pm.PackageManager;
+import com.android.server.pm.PackageVerificationState;
+
+import android.test.AndroidTestCase;
+
+public class PackageVerificationStateTest extends AndroidTestCase {
+ private static final int REQUIRED_UID = 1948;
+
+ private static final int SUFFICIENT_UID_1 = 1005;
+
+ private static final int SUFFICIENT_UID_2 = 8938;
+
+ public void testPackageVerificationState_OnlyRequiredVerifier_AllowedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_OnlyRequiredVerifier_DeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndOneSufficient_RequiredDeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndOneSufficient_SufficientDeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_OneSufficientIsEnough() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_SecondSufficientIsEnough() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_2, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_RequiredOverrides() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID,
+ PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
+
+ assertTrue("Verification should be marked as complete immediately",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should still be marked as completed",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed still",
+ state.isInstallAllowed());
+
+ state.setVerifierResponse(SUFFICIENT_UID_2, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should still be complete",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed still",
+ state.isInstallAllowed());
+ }
+}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index e898aac4ff90..34f88489ed6a 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -24,6 +24,7 @@ import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
+import android.location.CountryDetector;
import android.net.Uri;
import android.os.SystemProperties;
import android.provider.Contacts;
@@ -1408,6 +1409,11 @@ public class PhoneNumberUtils
* @hide
*/
public static String formatNumber(String phoneNumber, String defaultCountryIso) {
+ // Do not attempt to format numbers that start with a hash or star symbol.
+ if (phoneNumber.startsWith("#") || phoneNumber.startsWith("*")) {
+ return phoneNumber;
+ }
+
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
String result = null;
try {
@@ -1566,6 +1572,14 @@ public class PhoneNumberUtils
// that has been collected.
if (util.isValidNumber(pn)) {
return false;
+ } else if ("BR".equalsIgnoreCase(defaultCountryIso) && number.length() >= 8) {
+ // This is to prevent Brazilian local numbers which start with 911 being incorrectly
+ // classified as emergency numbers. 911 is not an emergency number in Brazil; it is also
+ // not possible to append additional digits to an emergency number to dial the number in
+ // Brazil - it won't connect.
+ // TODO: Clean this up once a list of country-specific known emergency numbers is
+ // collected.
+ return false;
}
} catch (NumberParseException e) {
}
@@ -1573,6 +1587,32 @@ public class PhoneNumberUtils
}
/**
+ * Checks if a given number is an emergency number for the country that the user is in. The
+ * current country is determined using the CountryDetector.
+ *
+ * @param number the number to look up.
+ * @param context the specific context which the number should be checked against
+ * @return if a phone number is an emergency number for a local country, based on the
+ * CountryDetector.
+ * @see android.location.CountryDetector
+ * @hide
+ */
+ public static boolean isLocalEmergencyNumber(String number, Context context) {
+ String countryIso;
+ CountryDetector detector = (CountryDetector) context.getSystemService(
+ Context.COUNTRY_DETECTOR);
+ if (detector != null) {
+ countryIso = detector.detectCountry().getCountryIso();
+ } else {
+ Locale locale = context.getResources().getConfiguration().locale;
+ countryIso = locale.getCountry();
+ Log.w(LOG_TAG, "No CountryDetector; falling back to countryIso based on locale: "
+ + countryIso);
+ }
+ return isEmergencyNumber(number, countryIso);
+ }
+
+ /**
* isVoiceMailNumber: checks a given number against the voicemail
* number provided by the RIL and SIM card. The caller must have
* the READ_PHONE_STATE credential.
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index 7c37a65380a4..6324550cc1df 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -254,9 +254,7 @@ public class CallerInfo {
// Change the callerInfo number ONLY if it is an emergency number
// or if it is the voicemail number. If it is either, take a
// shortcut and skip the query.
- Locale locale = context.getResources().getConfiguration().locale;
- String countryIso = getCurrentCountryIso(context, locale);
- if (PhoneNumberUtils.isEmergencyNumber(number, countryIso)) {
+ if (PhoneNumberUtils.isLocalEmergencyNumber(number, context)) {
return new CallerInfo().markAsEmergency(context);
} else if (PhoneNumberUtils.isVoiceMailNumber(number)) {
return new CallerInfo().markAsVoiceMail();
diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
index 17734cac72c2..4912749b568c 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
@@ -403,9 +403,7 @@ public class CallerInfoAsyncQuery {
cw.number = number;
// check to see if these are recognized numbers, and use shortcuts if we can.
- CountryDetector detector = (CountryDetector) context.getSystemService(
- Context.COUNTRY_DETECTOR);
- if (PhoneNumberUtils.isEmergencyNumber(number, detector.detectCountry().getCountryIso())) {
+ if (PhoneNumberUtils.isLocalEmergencyNumber(number, context)) {
cw.event = EVENT_EMERGENCY_NUMBER;
} else if (PhoneNumberUtils.isVoiceMailNumber(number)) {
cw.event = EVENT_VOICEMAIL_NUMBER;
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index db19321673bb..83efc518b19d 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -190,7 +190,8 @@ public final class CdmaCallTracker extends CallTracker {
String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
boolean isPhoneInEcmMode = inEcm.equals("true");
- boolean isEmergencyCall = PhoneNumberUtils.isEmergencyNumber(dialString);
+ boolean isEmergencyCall =
+ PhoneNumberUtils.isLocalEmergencyNumber(dialString, phone.getContext());
// Cancel Ecm timer if a second emergency call is originating in Ecm mode
if (isPhoneInEcmMode && isEmergencyCall) {
@@ -1059,7 +1060,7 @@ public final class CdmaCallTracker extends CallTracker {
* Disable data call when emergency call is connected
*/
private void disableDataCallInEmergencyCall(String dialString) {
- if (PhoneNumberUtils.isEmergencyNumber(dialString)) {
+ if (PhoneNumberUtils.isLocalEmergencyNumber(dialString, phone.getContext())) {
if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall");
mIsInEmergencyCall = true;
phone.mDataConnectionTracker.setInternalDataEnabled(false);
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index c62ccc68ce26..78ba7ddd0ba9 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -2087,18 +2087,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
}
/**
- * Check current radio access technology is LTE or EHRPD.
- *
- * @param integer value of radio access technology
- * @return true when current radio access technology is LTE or EHRPD
- * @ false when current radio access technology is not LTE or EHRPD
- */
- private boolean needToCheckApnBearer(int radioTech) {
- return (radioTech == ServiceState.RADIO_TECHNOLOGY_LTE ||
- radioTech == ServiceState.RADIO_TECHNOLOGY_EHRPD);
- }
-
- /**
* Build a list of APNs to be used to create PDP's.
*
* @param requestedApnType
@@ -2119,7 +2107,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
String operator = mPhone.mIccRecords.getOperatorNumeric();
int radioTech = mPhone.getServiceState().getRadioTechnology();
- boolean needToCheckApnBearer = needToCheckApnBearer(radioTech);
if (requestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
if (canSetPreferApn && mPreferredApn != null) {
@@ -2128,7 +2115,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
+ mPreferredApn.numeric + ":" + mPreferredApn);
}
if (mPreferredApn.numeric.equals(operator)) {
- if (!needToCheckApnBearer || mPreferredApn.bearer == radioTech) {
+ if (mPreferredApn.bearer == 0 || mPreferredApn.bearer == radioTech) {
apnList.add(mPreferredApn);
if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList);
return apnList;
@@ -2147,7 +2134,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (mAllApns != null) {
for (ApnSetting apn : mAllApns) {
if (apn.canHandleType(requestedApnType)) {
- if (!needToCheckApnBearer || apn.bearer == radioTech) {
+ if (apn.bearer == 0 || apn.bearer == radioTech) {
if (DBG) log("apn info : " +apn.toString());
apnList.add(apn);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
index 680b3cdd13a9..37998949219f 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
@@ -496,7 +496,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
return false;
}
- if (PhoneNumberUtils.isEmergencyNumber(dialString)) {
+ if (PhoneNumberUtils.isLocalEmergencyNumber(dialString, phone.getContext())) {
return false;
} else {
return isShortCodeUSSD(dialString, phone);
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
index d3e4b78fde9d..e2349afbf85e 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
@@ -513,7 +513,19 @@ public class PhoneNumberUtilsTest extends AndroidTestCase {
assertEquals("(650) 291-0000", PhoneNumberUtils.formatNumber("650 2910000", "US"));
assertEquals("123-4567", PhoneNumberUtils.formatNumber("1234567", "US"));
assertEquals("(800) 466-4114", PhoneNumberUtils.formatNumber("800-GOOG-114", "US"));
+ }
+ @SmallTest
+ public void testFormatNumber_LeadingStarAndHash() {
+ // Numbers with a leading '*' or '#' should be left unchanged.
+ assertEquals("*650 2910000", PhoneNumberUtils.formatNumber("*650 2910000", "US"));
+ assertEquals("#650 2910000", PhoneNumberUtils.formatNumber("#650 2910000", "US"));
+ assertEquals("*#650 2910000", PhoneNumberUtils.formatNumber("*#650 2910000", "US"));
+ assertEquals("#*650 2910000", PhoneNumberUtils.formatNumber("#*650 2910000", "US"));
+ assertEquals("#650*2910000", PhoneNumberUtils.formatNumber("#650*2910000", "US"));
+ assertEquals("#650*2910000", PhoneNumberUtils.formatNumber("#650*2910000", "US"));
+ assertEquals("##650 2910000", PhoneNumberUtils.formatNumber("##650 2910000", "US"));
+ assertEquals("**650 2910000", PhoneNumberUtils.formatNumber("**650 2910000", "US"));
}
@SmallTest
@@ -551,5 +563,8 @@ public class PhoneNumberUtilsTest extends AndroidTestCase {
// A valid fixed-line phone number from Brazil shouldn't be classified as an emergency number
// in Brazil, as 112 is not an emergency number there.
assertFalse(PhoneNumberUtils.isEmergencyNumber("1121234567", "BR"));
+ // A valid local phone number from Brazil shouldn't be classified as an emergency number in
+ // Brazil.
+ assertFalse(PhoneNumberUtils.isEmergencyNumber("91112345", "BR"));
}
}
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index c3d09ffb3308..70cf89e5f817 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -279,6 +279,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
private static final String LOG_TAG = "InstrumentationTestRunner";
private final Bundle mResults = new Bundle();
+ private Bundle mArguments;
private AndroidTestRunner mTestRunner;
private boolean mDebug;
private boolean mJustCount;
@@ -292,6 +293,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
@Override
public void onCreate(Bundle arguments) {
super.onCreate(arguments);
+ mArguments = arguments;
// Apk paths used to search for test classes when using TestSuiteBuilders.
String[] apkPaths =
@@ -379,6 +381,16 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
start();
}
+ /**
+ * Get the Bundle object that contains the arguments
+ *
+ * @return the Bundle object
+ * @hide
+ */
+ public Bundle getBundle(){
+ return mArguments;
+ }
+
List<Predicate<TestMethod>> getBuilderRequirements() {
return new ArrayList<Predicate<TestMethod>>();
}
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index 3525abe4f863..58680ea5dd49 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -36,9 +36,11 @@ import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.VerifierDeviceIdentity;
+import android.content.pm.VerifierInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
diff --git a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
index 54adc249a2da..a13c0c978282 100644
--- a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
+++ b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
@@ -72,6 +72,7 @@ public class DataIdleTest extends InstrumentationTestCase {
*/
private void fetchStats(NetworkTemplate template) {
try {
+ mStatsService.forceUpdate();
NetworkStats stats = mStatsService.getSummaryForAllUid(template, Long.MIN_VALUE,
Long.MAX_VALUE, false);
reportStats(stats);
@@ -88,18 +89,27 @@ public class DataIdleTest extends InstrumentationTestCase {
Bundle result = new Bundle();
long rxBytes = 0;
long txBytes = 0;
+ long rxPackets = 0;
+ long txPackets = 0;
for (int i = 0; i < stats.size(); ++i) {
// Label will be iface_uid_tag_set
Entry statsEntry = stats.getValues(i, null);
+ // Debugging use.
+ /*
String labelTemplate = String.format("%s_%d_%d_%d", statsEntry.iface, statsEntry.uid,
statsEntry.tag, statsEntry.set) + "_%s";
result.putLong(String.format(labelTemplate, "rxBytes"), statsEntry.rxBytes);
result.putLong(String.format(labelTemplate, "txBytes"), statsEntry.txBytes);
+ */
+ rxPackets += statsEntry.rxPackets;
rxBytes += statsEntry.rxBytes;
+ txPackets += statsEntry.txPackets;
txBytes += statsEntry.txBytes;
}
- result.putLong("Total rxBytes", rxBytes);
- result.putLong("Total txBytes", txBytes);
+ result.putLong("Total rx Bytes", rxBytes);
+ result.putLong("Total tx Bytes", txBytes);
+ result.putLong("Total rx Packets", rxPackets);
+ result.putLong("Total tx Packets", txPackets);
getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index f8c32dd81921..c0ba8cf53254 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -904,6 +904,9 @@ public class TestShellActivity extends Activity implements LayoutTestController
settings.setWorkersEnabled(false);
settings.setXSSAuditorEnabled(false);
settings.setPageCacheCapacity(0);
+ // this enables cpu upload path (as opposed to gpu upload path)
+ // and it's only meant to be a temporary workaround!
+ settings.setProperty("enable_cpu_upload_path", "true");
}
private WebView mWebView;
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index d74d80d0d98a..929b103bc5be 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -31,6 +31,15 @@
android:hardwareAccelerated="true">
<activity
+ android:name="DisplayListLayersActivity"
+ android:label="__DisplayListLayers">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="TextFadeActivity"
android:label="_TextFade">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java
new file mode 100644
index 000000000000..ec91c35dce0f
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2011 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.test.hwui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import static android.view.View.LAYER_TYPE_HARDWARE;
+import static android.view.View.LAYER_TYPE_SOFTWARE;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class DisplayListLayersActivity extends Activity {
+ private static final int VERTICAL_MARGIN = 12;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ LinearLayout root = createContainer();
+ addChild(root, new LayerView(this, 0xffff0000, LAYER_TYPE_HARDWARE, "hardware"),
+ WRAP_CONTENT, WRAP_CONTENT);
+ addChild(root, new LayerView(this, 0xff0000ff, LAYER_TYPE_SOFTWARE, "software"),
+ WRAP_CONTENT, WRAP_CONTENT);
+ addChild(root, createButton(root), WRAP_CONTENT, WRAP_CONTENT);
+
+ setContentView(root);
+ }
+
+ private Button createButton(final LinearLayout root) {
+ Button button = new Button(this);
+ button.setText("Invalidate");
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ for (int i = 0; i < root.getChildCount(); i++) {
+ View child = root.getChildAt(i);
+ if (child != v) {
+ child.invalidate();
+ }
+ }
+ }
+ });
+
+ return button;
+ }
+
+ private void addChild(LinearLayout root, View child, int width, int height) {
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, height);
+ params.gravity = Gravity.CENTER_HORIZONTAL;
+ params.setMargins(0, dipToPx(VERTICAL_MARGIN), 0, 0);
+ root.addView(child, params);
+ }
+
+ private int dipToPx(int size) {
+ return (int) (getResources().getDisplayMetrics().density * size + 0.5f);
+ }
+
+ private LinearLayout createContainer() {
+ LinearLayout layout = new LinearLayout(this);
+ layout.setOrientation(LinearLayout.VERTICAL);
+ return layout;
+ }
+
+ private class LayerView extends View {
+ private static final String LOG_TAG = "LayerView";
+ private final Paint mPaint = new Paint();
+
+ private final String mTag;
+
+ LayerView(Context context, int color, int layerType, String tag) {
+ super(context);
+
+ mTag = tag;
+
+ mPaint.setColor(color);
+ setLayerType(layerType, null);
+ }
+
+ private void log(String tag) {
+ Log.d(LOG_TAG, mTag + ": " + tag);
+ }
+
+ @Override
+ public void invalidate() {
+ log("invalidate");
+ super.invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ log("draw");
+ canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec) / 3,
+ MeasureSpec.getSize(heightMeasureSpec) / 3);
+ }
+ }
+}
diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
index f015378e2610..5df018e68eaf 100644
--- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
+++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
@@ -412,9 +412,31 @@ public class WindowManagerPermissionTests extends TestCase {
@SmallTest
public void testSET_ORIENTATION() {
try {
- mWm.setRotation(0, true, 0);
+ mWm.updateRotation(true);
mWm.getSwitchState(0);
- fail("IWindowManager.setRotation did not throw SecurityException as"
+ fail("IWindowManager.updateRotation did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.freezeRotation();
+ mWm.getSwitchState(0);
+ fail("IWindowManager.freezeRotation did not throw SecurityException as"
+ + " expected");
+ } catch (SecurityException e) {
+ // expected
+ } catch (RemoteException e) {
+ fail("Unexpected remote exception");
+ }
+
+ try {
+ mWm.thawRotation();
+ mWm.getSwitchState(0);
+ fail("IWindowManager.thawRotation did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
// expected
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 178e7fdcffd3..413a2dcf3768 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -368,6 +368,7 @@ enum {
REQUIRES_SMALLEST_WIDTH_DP_ATTR = 0x01010364,
COMPATIBLE_WIDTH_LIMIT_DP_ATTR = 0x01010365,
LARGEST_WIDTH_LIMIT_DP_ATTR = 0x01010366,
+ PUBLIC_KEY_ATTR = 0x010103a6,
};
const char *getComponentName(String8 &pkgName, String8 &componentName) {
@@ -1021,6 +1022,15 @@ int doDump(Bundle* bundle)
} else if (tag == "compatible-screens") {
printCompatibleScreens(tree);
depth--;
+ } else if (tag == "package-verifier") {
+ String8 name = getAttribute(tree, NAME_ATTR, &error);
+ if (name != "" && error == "") {
+ String8 publicKey = getAttribute(tree, PUBLIC_KEY_ATTR, &error);
+ if (publicKey != "" && error == "") {
+ printf("package-verifier: name='%s' publicKey='%s'\n",
+ name.string(), publicKey.string());
+ }
+ }
}
} else if (depth == 3 && withinApplication) {
withinActivity = false;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
index 3d1fa7aed622..5b57266b4daa 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
@@ -396,7 +396,7 @@ public class BridgeWindowManager implements IWindowManager {
}
- public void setRotation(int arg0, boolean arg1, int arg2) throws RemoteException {
+ public void updateRotation(boolean arg0) throws RemoteException {
// TODO Auto-generated method stub
}
@@ -464,4 +464,7 @@ public class BridgeWindowManager implements IWindowManager {
public int getPreferredOptionsPanelGravity() throws RemoteException {
return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
}
+
+ public void dismissKeyguard() {
+ }
}
diff --git a/tools/orientationplot/orientationplot.py b/tools/orientationplot/orientationplot.py
index 07449d4d2bc9..3a44cb2cbfd8 100755
--- a/tools/orientationplot/orientationplot.py
+++ b/tools/orientationplot/orientationplot.py
@@ -131,42 +131,28 @@ class Plotter:
self.orientation_angle_axes, 'orientation', 'black')
self._add_timeseries_legend(self.orientation_angle_axes)
- self.actual_orientation = self._make_timeseries()
- self.proposed_orientation = self._make_timeseries()
+ self.current_rotation = self._make_timeseries()
+ self.proposed_rotation = self._make_timeseries()
+ self.proposal_rotation = self._make_timeseries()
self.orientation_axes = self._add_timeseries_axes(
- 5, 'Actual / Proposed Orientation and Confidence', 'rotation', [-1, 4],
+ 5, 'Current / Proposed Orientation and Confidence', 'rotation', [-1, 4],
sharex=shared_axis,
yticks=range(0, 4))
- self.actual_orientation_line = self._add_timeseries_line(
- self.orientation_axes, 'actual', 'black', linewidth=2)
- self.proposed_orientation_line = self._add_timeseries_line(
- self.orientation_axes, 'proposed', 'purple', linewidth=3)
+ self.current_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'current', 'black', linewidth=2)
+ self.proposal_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'proposal', 'purple', linewidth=3)
+ self.proposed_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'proposed', 'green', linewidth=3)
self._add_timeseries_legend(self.orientation_axes)
- self.confidence = [[self._make_timeseries(), self._make_timeseries()] for i in range(0, 4)]
- self.confidence_polys = []
-
- self.combined_confidence = self._make_timeseries()
- self.orientation_confidence = self._make_timeseries()
- self.tilt_confidence = self._make_timeseries()
- self.magnitude_confidence = self._make_timeseries()
- self.confidence_axes = self._add_timeseries_axes(
- 6, 'Proposed Orientation Confidence Factors', 'confidence', [-0.1, 1.1],
- sharex=shared_axis,
- yticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0])
- self.combined_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'combined', 'purple', linewidth=2)
- self.orientation_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'orientation', 'black')
- self.tilt_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'tilt', 'brown')
- self.magnitude_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'magnitude', 'orange')
- self._add_timeseries_legend(self.confidence_axes)
+ self.proposal_confidence = [[self._make_timeseries(), self._make_timeseries()]
+ for i in range(0, 4)]
+ self.proposal_confidence_polys = []
self.sample_latency = self._make_timeseries()
self.sample_latency_axes = self._add_timeseries_axes(
- 7, 'Accelerometer Sampling Latency', 'ms', [-10, 500],
+ 6, 'Accelerometer Sampling Latency', 'ms', [-10, 500],
sharex=shared_axis,
yticks=range(0, 500, 100))
self.sample_latency_line = self._add_timeseries_line(
@@ -186,7 +172,7 @@ class Plotter:
# Add a subplot to the figure for a time series.
def _add_timeseries_axes(self, index, title, ylabel, ylim, yticks, sharex=None):
- num_graphs = 7
+ num_graphs = 6
height = 0.9 / num_graphs
top = 0.95 - height * index
axes = self.fig.add_axes([0.1, top, 0.8, height],
@@ -234,13 +220,10 @@ class Plotter:
self.parse_magnitude = None
self.parse_tilt_angle = None
self.parse_orientation_angle = None
- self.parse_proposed_orientation = None
- self.parse_combined_confidence = None
- self.parse_orientation_confidence = None
- self.parse_tilt_confidence = None
- self.parse_magnitude_confidence = None
- self.parse_actual_orientation = None
- self.parse_confidence = None
+ self.parse_current_rotation = None
+ self.parse_proposed_rotation = None
+ self.parse_proposal_rotation = None
+ self.parse_proposal_confidence = None
self.parse_sample_latency = None
# Update samples.
@@ -284,26 +267,13 @@ class Plotter:
if line.find('orientationAngle=') != -1:
self.parse_orientation_angle = self._get_following_number(line, 'orientationAngle=')
- if line.find('Proposal:') != -1:
- self.parse_proposed_orientation = self._get_following_number(line, 'proposedOrientation=')
- self.parse_combined_confidence = self._get_following_number(line, 'combinedConfidence=')
- self.parse_orientation_confidence = self._get_following_number(line, 'orientationConfidence=')
- self.parse_tilt_confidence = self._get_following_number(line, 'tiltConfidence=')
- self.parse_magnitude_confidence = self._get_following_number(line, 'magnitudeConfidence=')
-
if line.find('Result:') != -1:
- self.parse_actual_orientation = self._get_following_number(line, 'rotation=')
- self.parse_confidence = self._get_following_array_of_numbers(line, 'confidence=')
+ self.parse_current_rotation = self._get_following_number(line, 'currentRotation=')
+ self.parse_proposed_rotation = self._get_following_number(line, 'proposedRotation=')
+ self.parse_proposal_rotation = self._get_following_number(line, 'proposalRotation=')
+ self.parse_proposal_confidence = self._get_following_number(line, 'proposalConfidence=')
self.parse_sample_latency = self._get_following_number(line, 'timeDeltaMS=')
- for i in range(0, 4):
- if self.parse_confidence is not None:
- self._append(self.confidence[i][0], timeindex, i)
- self._append(self.confidence[i][1], timeindex, i + self.parse_confidence[i])
- else:
- self._append(self.confidence[i][0], timeindex, None)
- self._append(self.confidence[i][1], timeindex, None)
-
self._append(self.raw_acceleration_x, timeindex, self.parse_raw_acceleration_x)
self._append(self.raw_acceleration_y, timeindex, self.parse_raw_acceleration_y)
self._append(self.raw_acceleration_z, timeindex, self.parse_raw_acceleration_z)
@@ -313,12 +283,22 @@ class Plotter:
self._append(self.magnitude, timeindex, self.parse_magnitude)
self._append(self.tilt_angle, timeindex, self.parse_tilt_angle)
self._append(self.orientation_angle, timeindex, self.parse_orientation_angle)
- self._append(self.actual_orientation, timeindex, self.parse_actual_orientation)
- self._append(self.proposed_orientation, timeindex, self.parse_proposed_orientation)
- self._append(self.combined_confidence, timeindex, self.parse_combined_confidence)
- self._append(self.orientation_confidence, timeindex, self.parse_orientation_confidence)
- self._append(self.tilt_confidence, timeindex, self.parse_tilt_confidence)
- self._append(self.magnitude_confidence, timeindex, self.parse_magnitude_confidence)
+ self._append(self.current_rotation, timeindex, self.parse_current_rotation)
+ if self.parse_proposed_rotation >= 0:
+ self._append(self.proposed_rotation, timeindex, self.parse_proposed_rotation)
+ else:
+ self._append(self.proposed_rotation, timeindex, None)
+ if self.parse_proposal_rotation >= 0:
+ self._append(self.proposal_rotation, timeindex, self.parse_proposal_rotation)
+ else:
+ self._append(self.proposal_rotation, timeindex, None)
+ for i in range(0, 4):
+ self._append(self.proposal_confidence[i][0], timeindex, i)
+ if i == self.parse_proposal_rotation:
+ self._append(self.proposal_confidence[i][1], timeindex,
+ i + self.parse_proposal_confidence)
+ else:
+ self._append(self.proposal_confidence[i][1], timeindex, i)
self._append(self.sample_latency, timeindex, self.parse_sample_latency)
self._reset_parse_state()
@@ -335,16 +315,13 @@ class Plotter:
self._scroll(self.magnitude, bottom)
self._scroll(self.tilt_angle, bottom)
self._scroll(self.orientation_angle, bottom)
- self._scroll(self.actual_orientation, bottom)
- self._scroll(self.proposed_orientation, bottom)
- self._scroll(self.combined_confidence, bottom)
- self._scroll(self.orientation_confidence, bottom)
- self._scroll(self.tilt_confidence, bottom)
- self._scroll(self.magnitude_confidence, bottom)
- self._scroll(self.sample_latency, bottom)
+ self._scroll(self.current_rotation, bottom)
+ self._scroll(self.proposed_rotation, bottom)
+ self._scroll(self.proposal_rotation, bottom)
for i in range(0, 4):
- self._scroll(self.confidence[i][0], bottom)
- self._scroll(self.confidence[i][1], bottom)
+ self._scroll(self.proposal_confidence[i][0], bottom)
+ self._scroll(self.proposal_confidence[i][1], bottom)
+ self._scroll(self.sample_latency, bottom)
# Redraw the plots.
self.raw_acceleration_line_x.set_data(self.raw_acceleration_x)
@@ -356,20 +333,19 @@ class Plotter:
self.magnitude_line.set_data(self.magnitude)
self.tilt_angle_line.set_data(self.tilt_angle)
self.orientation_angle_line.set_data(self.orientation_angle)
- self.actual_orientation_line.set_data(self.actual_orientation)
- self.proposed_orientation_line.set_data(self.proposed_orientation)
- self.combined_confidence_line.set_data(self.combined_confidence)
- self.orientation_confidence_line.set_data(self.orientation_confidence)
- self.tilt_confidence_line.set_data(self.tilt_confidence)
- self.magnitude_confidence_line.set_data(self.magnitude_confidence)
+ self.current_rotation_line.set_data(self.current_rotation)
+ self.proposed_rotation_line.set_data(self.proposed_rotation)
+ self.proposal_rotation_line.set_data(self.proposal_rotation)
self.sample_latency_line.set_data(self.sample_latency)
- for poly in self.confidence_polys:
+ for poly in self.proposal_confidence_polys:
poly.remove()
- self.confidence_polys = []
+ self.proposal_confidence_polys = []
for i in range(0, 4):
- self.confidence_polys.append(self.orientation_axes.fill_between(self.confidence[i][0][0],
- self.confidence[i][0][1], self.confidence[i][1][1],
+ self.proposal_confidence_polys.append(self.orientation_axes.fill_between(
+ self.proposal_confidence[i][0][0],
+ self.proposal_confidence[i][0][1],
+ self.proposal_confidence[i][1][1],
facecolor='goldenrod', edgecolor='goldenrod'))
self.fig.canvas.draw_idle()
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index a6ea6d422fd7..6ff1bc248cf9 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -106,12 +106,6 @@ public class WifiNative {
public native static String statusCommand();
- public native static int getRssiCommand();
-
- public native static int getRssiApproxCommand();
-
- public native static int getLinkSpeedCommand();
-
public native static String getMacAddressCommand();
public native static String scanResultsCommand();
@@ -209,6 +203,16 @@ public class WifiNative {
private native static String doStringCommand(String command);
+ /** Example output:
+ * RSSI=-65
+ * LINKSPEED=48
+ * NOISE=9999
+ * FREQUENCY=0
+ */
+ public static String signalPoll() {
+ return doStringCommand("SIGNAL_POLL");
+ }
+
public static boolean wpsPbc() {
return doBooleanCommand("WPS_PBC");
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 052d332a7d0d..41fc55d5bd8a 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1362,7 +1362,28 @@ public class WifiStateMachine extends StateMachine {
* Fetch RSSI and linkspeed on current connection
*/
private void fetchRssiAndLinkSpeedNative() {
- int newRssi = WifiNative.getRssiCommand();
+ int newRssi = -1;
+ int newLinkSpeed = -1;
+
+ String signalPoll = WifiNative.signalPoll();
+
+ if (signalPoll != null) {
+ String[] lines = signalPoll.split("\n");
+ for (String line : lines) {
+ String[] prop = line.split("=");
+ if (prop.length < 2) continue;
+ try {
+ if (prop[0].equals("RSSI")) {
+ newRssi = Integer.parseInt(prop[1]);
+ } else if (prop[0].equals("LINKSPEED")) {
+ newLinkSpeed = Integer.parseInt(prop[1]);
+ }
+ } catch (NumberFormatException e) {
+ //Ignore, defaults on rssi and linkspeed are assigned
+ }
+ }
+ }
+
if (newRssi != -1 && MIN_RSSI < newRssi && newRssi < MAX_RSSI) { // screen out invalid values
/* some implementations avoid negative values by adding 256
* so we need to adjust for that here.
@@ -1390,7 +1411,7 @@ public class WifiStateMachine extends StateMachine {
} else {
mWifiInfo.setRssi(MIN_RSSI);
}
- int newLinkSpeed = WifiNative.getLinkSpeedCommand();
+
if (newLinkSpeed != -1) {
mWifiInfo.setLinkSpeed(newLinkSpeed);
}